Testing FIDL protocols
Prerequisites
This tutorial builds on the [HLCPP getting started tutorials][overview].
Overview
This tutorial walks through the process of writing a test for the
Echo.EchoString method. This tutorial shows you how to use the two utilities
available for testing FIDL protocols implemented in HLCPP:
- The
gtesttest loop fixturesys::testing::ComponentContextProvider. - The
fidl_test_base.hfile provided by the HLCPP bindings
If you want to write the code yourself, delete the following directories:
The test will be written in examples/fidl/hlcpp/testing/main.cc.
Set up dependencies
To set up dependencies:
- Include the libraries that are needed for the test:
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/testing/main.cc" region_tag="includes" %}
- Add a build rule for the test in
examples/fidl/hlcpp/testing/BUILD.gn:
Create a server implementation
To create a server implementation:
- Add an implementation for the
Echoprotocol that is tested:
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/testing/main.cc" region_tag="impl" %}
Rather than inheriting from fuchsia::examples::Echo, this implementation
inherits from the [corresponding test base class][test-base]. This means that
the implementation only needs to override the methods that are being tested
(in this case, EchoString), as well as the NotImplemented_ method, which
is called if any of the request handler methods that are not overriden get
called.
- Create a test class that wraps the logic of publishing the echo protocol:
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/testing/main.cc" region_tag="wrapper" %}
This is similar to the code that is explained in the
[server tutorial][server-tut], but the fidl::Binding is owned by the class.
This makes the binding's destructor get called when the class is destroyed.
This enables the code to publish the echo protocol on each test case given
a new instance of the test component context.
Implement the test fixture class
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/testing/main.cc" region_tag="fixture" %}
The test fixture does the following:
- Holds an instance of a
ComponentContextProvider. Each test, it uses it to create a new test context, and binds the Echo implementation to it using theEchoServerInstanceclass. - Provides a
GetProxy()method initializes a proxy to the current test component context and returns it.
Add tests
This is an example test that can you can write with the test fixture:
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/hlcpp/testing/main.cc" region_tag="test" %}
Run the test
To run the test:
- Configure your GN build to include the test:
You should see the test output indicating a success.
Summary
- The
gtest::TestLoopFixtureremoves the need for boilerplate async loop setup code. Each test case can simply callRunLoopUntilIdle()instead of manually managing anasync::Loop. - The
ComponentContextProvidermakes it easy to mock the component context during a test. This is useful to e.g. provide specific capabilities to the a component. - The HLCPP bindings test scaffolding provides a test base for each protocol class that has a placeholder implementation for each method. This allows tests to only implement the methods under test.
test-base /development/languages/fidl/tutorials/hlcpp/basics/server.md overview