From 642a78e4e7fbc81111b9796ccf864e7fddb7e992 Mon Sep 17 00:00:00 2001 From: charles Date: Sat, 2 May 2026 23:01:06 -0700 Subject: [PATCH] Add some tests --- dumper.sh | 2 + request.bin | Bin 0 -> 156932 bytes src/bin/generator.rs | 2 +- src/bin/protoc-gen-roto.rs | 103 +++++++++++++++++++++++-------------- 4 files changed, 68 insertions(+), 39 deletions(-) create mode 100755 dumper.sh create mode 100644 request.bin diff --git a/dumper.sh b/dumper.sh new file mode 100755 index 0000000..f0597ac --- /dev/null +++ b/dumper.sh @@ -0,0 +1,2 @@ +#!/bin/sh +cat > request.bin diff --git a/request.bin b/request.bin new file mode 100644 index 0000000000000000000000000000000000000000..7afcaaa3296fea27b242d2cb0edeb483ccd085ad GIT binary patch literal 156932 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

Fl2DJQLwB5W^J2S?VKF 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 std::result::Result<(), Box> { let request = CodeGeneratorRequest::new(&stdin_buf)?; + // 2. Process request and get response bytes + let response_bytes = handle_request(&request)?; + + // 3. Write response to stdout + io::stdout().write_all(&response_bytes)?; + + info!("Successfully wrote CodeGeneratorResponse to stdout"); + Ok(()) +} + +/// Core logic that transforms a CodeGeneratorRequest into a serialized CodeGeneratorResponse. +fn handle_request(request: &CodeGeneratorRequest) -> std::result::Result, Box> { // 2. Construct a FileDescriptorSet from the request's proto_files - // Since generate_rust_code expects a FileDescriptorSet, we wrap the proto_files in one. - // A FileDescriptorSet is a message with a repeated field 'file' at tag 1. - let mut set_buf = vec![0u8; 1024 * 1024]; // Allocate 1MB for descriptors - { - let mut builder = ProtoBuilder::new(&mut set_buf); - for file_res in request.proto_file() { - let (file_data, _) = file_res.map_err(|e| { - error!("Failed to iterate proto_file: {:?}", e); - e - })?; - builder.write_bytes(1, file_data).map_err(|e| { - error!("Failed to write proto_file to set: {:?}", e); - e - })?; - } - // We don't need to call finish() here as we just need the buffer to be populated. + let mut set_buf = Vec::new(); + for file_res in request.proto_file() { + let (file_data, _) = file_res.map_err(|e| { + error!("Failed to iterate proto_file: {:?}", e); + e + })?; + + // Tag 1, Length-delimited: (1 << 3) | 2 = 10 + set_buf.push(10); + + // Write length as varint + let len = file_data.len() as u64; + let mut len_buf = [0u8; 10]; + let len_size = roto::write_varint(len, &mut len_buf).map_err(|e| { + error!("Failed to write varint length: {:?}", e); + e + })?; + set_buf.extend_from_slice(&len_buf[..len_size]); + + // Write data + set_buf.extend_from_slice(file_data); } - // Trim set_buf to the actual size written by ProtoBuilder - // We need to find the actual length. ProtoBuilder doesn't expose pos publicly in the provided snippet, - // but we can wrap the result of the generation. - // Actually, since FileDescriptorSet::new just wraps the buffer, it will read until the end. - // We should be careful about trailing zeros. - // Let's just use a slice of the buffer that was actually used. - // Since ProtoBuilder's pos is private, we might need a different approach or just hope the - // ProtoAccessor handles trailing zeros (which it should if it's a valid proto message). - // However, the most robust way is to use the length. - - // Let's try to use the buffer as is. If ProtoAccessor is correctly implemented, - // it will stop at the end of the message. let set = FileDescriptorSet::new(&set_buf)?; - // 3. Generate the Rust code + // Generate the Rust code info!("Generating Rust code from descriptor set..."); let generated_code = generate_rust_code(&set); - // 4. Construct CodeGeneratorResponse - // We'll put all generated code into a single file for now. - // If file_to_generate is provided, we'll use the first one as a base for the name. + // Determine the output filename let mut output_filename = "roto_generated.rs".to_string(); if let Some(first_file) = request.file_to_generate().next() { if let Ok((name_bytes, _)) = first_file { @@ -78,6 +81,7 @@ fn run() -> std::result::Result<(), Box> { } } + // Construct the response let mut response_buf = vec![0u8; 1024 * 1024 * 2]; // Allocate 2MB for response let mut resp_builder = CodeGeneratorResponse::builder(&mut response_buf); @@ -91,7 +95,7 @@ fn run() -> std::result::Result<(), Box> { e })?; - let final_response = resp_builder + let final_response_slice = resp_builder .add_file(final_file)? .finish() .map_err(|e| { @@ -99,9 +103,32 @@ fn run() -> std::result::Result<(), Box> { e })?; - // 5. Write response to stdout - io::stdout().write_all(final_response)?; - - info!("Successfully wrote CodeGeneratorResponse to stdout"); - Ok(()) + // The finish() method returns a reference to the buffer. + // We convert it to a Vec to return it from this function. + Ok(final_response_slice.to_vec()) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + + #[test] + fn test_handle_request_with_bin() { + // Note: this test assumes request.bin exists in the current working directory + // which is usually the project root during 'cargo test'. + let request_path = "request.bin"; + if !std::path::Path::new(request_path).exists() { + return; // Skip if file is not available in the environment + } + + let data = fs::read(request_path).expect("Failed to read request.bin"); + let request = CodeGeneratorRequest::new(&data).expect("Failed to parse CodeGeneratorRequest"); + + let result = handle_request(&request); + + assert!(result.is_ok(), "handle_request should succeed with request.bin"); + let response = result.unwrap(); + assert!(!response.is_empty(), "The generated response should not be empty"); + } }