| # TRF Codegen Tool: Internal Codewalk |
| |
| 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. |
| |
| ## Codewalk (TLDR) |
| |
| This module provides three main macros: `#[trf::test]`, `#[trf::mock]`, and `#[trf::control]`, and an accompanying GN template (`trf_test.gni`). |
| |
| 1. **`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: |
| - Invokes the `trf_codegen` tool on the source file to parse the macros and generate CML + FIDL components. |
| - Generates the Injectable Universe (IU) and Test Driver (TD) components dynamically. |
| - Packages them into a `fuchsia_test_package` containing the Test Driver and the RealmBuilder server, with the CUT passed natively as a subpackage. |
| |
| 2. **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. |
| - Component manifests for both the test driver (`test_driver.cml`) and injectable universe (`injectable_universe.cml`). |
| - Rust setup code for RealmBuilder (`realm_builder_generated.rs`). |
| - A stub injected `injectable_universe.rs` containing the Realm Builder local setup code to connect the user's `trf::mock` handlers. |
| |
| 3. **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. |
| |
| ### Usage Example |
| |
| See `//examples/components/reverser/trf_test` for a concrete usage of these tools. |