77 lines
3.3 KiB
Rust
77 lines
3.3 KiB
Rust
use roto_codegen::google::protobuf::descriptor::FileDescriptorSet;
|
|
use std::fs;
|
|
use std::process::Command;
|
|
|
|
#[test]
|
|
fn test_helloworld_generated_code_builds() {
|
|
// 1. Load FileDescriptorSet from helloworld.desc
|
|
let desc_path = "helloworld.desc";
|
|
// Note: This assumes helloworld.desc is in the working directory of the test.
|
|
// We might need to provide the full path or copy it to the test data directory.
|
|
let data = fs::read(desc_path).expect("Failed to read helloworld.desc");
|
|
let set = FileDescriptorSet::new(&data)
|
|
.expect("Failed to create FileDescriptorSet from helloworld.desc");
|
|
|
|
let generated_files = roto_codegen::generator::generate_rust_code(&set, None, false);
|
|
assert!(
|
|
!generated_files.is_empty(),
|
|
"Generated code should not be empty"
|
|
);
|
|
|
|
for (path, content) in &generated_files {
|
|
println!("--- File: {} ---\n{}", path, content);
|
|
}
|
|
|
|
// 2. Setup a temporary Cargo project to verify the code builds
|
|
let codegen_root = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
let project_root = codegen_root.parent().expect("Failed to get project root");
|
|
let temp_project_dir = std::path::PathBuf::from("/tmp/roto_helloworld_gen_project");
|
|
|
|
// Clean up previous runs
|
|
if temp_project_dir.exists() {
|
|
fs::remove_dir_all(&temp_project_dir).expect("Failed to clean up temp project directory");
|
|
}
|
|
|
|
// Create new library project
|
|
let status = Command::new("cargo")
|
|
.args(["new", "--lib", temp_project_dir.to_str().expect("Invalid path")])
|
|
.status()
|
|
.expect("Failed to run cargo new");
|
|
assert!(status.success(), "cargo new failed");
|
|
|
|
// 3. Configure the project to depend on the current roto crate
|
|
let cargo_toml_path = temp_project_dir.join("Cargo.toml");
|
|
let cargo_toml_content =
|
|
fs::read_to_string(&cargo_toml_path).expect("Failed to read Cargo.toml");
|
|
let updated_cargo_toml = format!(
|
|
"{}\n\nroto-codegen = {{ path = \"{}\" }}\nroto-runtime = {{ path = \"{}\" }}\nroto-tonic = {{ path = \"{}\" }}\nbytes = \"1.7\"\ntonic = \"0.12\"\ntokio-stream = \"0.1\"\ntower = \"0.4\"\nfutures-util = \"0.3\"\nhttp-body-util = \"0.1\"\nhttp-body = \"1.0\"\n\nhttp = \"1.0\"\n\n[workspace]\n",
|
|
cargo_toml_content,
|
|
codegen_root.to_string_lossy(),
|
|
project_root.join("runtime").to_string_lossy(),
|
|
project_root.join("roto-tonic").to_string_lossy()
|
|
);
|
|
fs::write(cargo_toml_path, updated_cargo_toml).expect("Failed to write Cargo.toml");
|
|
|
|
// 4. Write the generated code to src/lib.rs
|
|
let mut all_code = String::new();
|
|
for (_, content) in generated_files {
|
|
all_code.push_str(&content);
|
|
all_code.push_str("\n");
|
|
}
|
|
let final_code = all_code.replace("use crate::", "use roto::");
|
|
let lib_path = temp_project_dir.join("src/lib.rs");
|
|
fs::write(lib_path, final_code).expect("Failed to write generated code to src/lib.rs");
|
|
|
|
// 5. Attempt to build the project
|
|
let build_status = Command::new("cargo")
|
|
.args(["build"])
|
|
.current_dir(&temp_project_dir)
|
|
.status()
|
|
.expect("Failed to run cargo build");
|
|
|
|
assert!(
|
|
build_status.success(),
|
|
"The generated Rust code for helloworld.proto failed to build in a standalone project!"
|
|
);
|
|
}
|