TRF (Test Realm Factory) is a system for authoring integration tests in Fuchsia by combining a Test Driver (TD), an Injectable Universe (IU), and a Component Under Test (CUT). However, doing this manually requires writing a lot of boilerplate CML and Rust setup code.
trf_codegen provides macro-based tooling to automatically generate this boilerplate for a test.
This module provides three main macros: #[trf::test], #[trf::mock], and #[trf::control], and an accompanying GN template (trf_test.gni).
trf_test.gni (//src/testing/trf_codegen/trf_test.gni) This defines the build integration. Given a Rust source file and a Component Under Test (CUT), this template:
trf_codegen tool on the source file to parse the macros and generate CML + FIDL components.fuchsia_test_package containing the Test Driver and the RealmBuilder server, with the CUT passed natively as a subpackage.The Rust Codegen Tool (//src/testing/trf_codegen/bin)
parser.rs: Uses syn to parse the provided test source file, specifically extracting #[trf::test] entries, #[trf::mock] implementation blocks, and #[trf::control] methods requested on them.consistency_checker.rs: Verifies that the implementation does not contain conflicting or invalid mock declarations.generator.rs: Takes the parsed structure and generates:mock_control.fidl: A dynamic FIDL control protocol that the Test Driver uses to talk to the Injectable Universe containing the Mocks.test_driver.cml) and injectable universe (injectable_universe.cml).realm_builder_generated.rs).injectable_universe.rs containing the Realm Builder local setup code to connect the user's trf::mock handlers.User Experience (//src/testing/trf_codegen/lib/macro) The developer uses #[trf::test] to define the test entry point and overarching driver harness. They use #[trf::mock] for structs they implement as a mock FIDL protocol, and #[trf::control] on methods they want exposed for testing over the dynamic control FIDL. Inside the #[trf::test] handler, an implicit mock_control handle is available to steer and coordinate the mock logic from the test driver.
See //examples/components/reverser/trf_test for a concrete usage of these tools.