372eab94d4
Use absolute paths for temporary project directories and dependencies to improve reliability. Update the generated Cargo.toml with additional dependencies and remove the offline flag from cargo build.
71 lines
3.0 KiB
Rust
71 lines
3.0 KiB
Rust
use roto_codegen::google::protobuf::descriptor::FileDescriptorSet;
|
|
use std::fs;
|
|
use std::process::Command;
|
|
|
|
#[test]
|
|
fn test_map_generated_code_builds() {
|
|
// 1. Load FileDescriptorSet from data/test_map.desc
|
|
let desc_path = "data/test_map.desc";
|
|
let data = fs::read(desc_path).expect("Failed to read test_map.desc");
|
|
let set = FileDescriptorSet::new(&data)
|
|
.expect("Failed to create FileDescriptorSet from test_map.desc");
|
|
|
|
let generated_files = roto_codegen::generator::generate_rust_code(&set, None, false);
|
|
assert!(
|
|
!generated_files.is_empty(),
|
|
"Generated code should not be empty"
|
|
);
|
|
|
|
// 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_test_map_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\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 test_map.proto failed to build in a standalone project!"
|
|
);
|
|
}
|