blob: 02c28951babde64a0adf000cb0303d2bc02153ef [file] [view]
# 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.