# Testing the CHRE Framework [TOC] The CHRE framework can be tested at various levels to ensure that components/modules components are working correctly and API contracts are being met. Below are some examples of what the team currently does to verify new changes. ## Unit tests ### Tests run on a host machine Currently, unit tests exist for various core components and utilities capable of running on a Linux host machine. Since platform-specific components likely aren’t compilable/available on a host machine, only components that are OS independent can be tested via this path. In order to write new tests, add a test source file under the test directory in the appropriate subdirectory. e.g. `util/tests`. Then, add the file to the `GOOGLETEST_SRCS` variable in the appropriate .mk file for that subdir, `util/util.mk` for example. Unit tests can be built and executed using `run_tests.sh`. ### On-device unit tests #### Background The framework aims to provide an environment to test CHRE (and its users) code on-device, using [Pigweed's][PW_URL] Unit Test [Framework][PW_UT_URL]. Test instantiations are syntactically identical to [Googletest][GT_URL], so modifications to on-host unit tests to run on-device are easier. CHRE recommends running the same host-side gtests on-device using this framework, to catch subtle bugs. For example, the target CPU may raise an exception on unaligned access, when the same code would run without any problems on a local x86-based machine. #### Use Cases Example use cases of the framework include: * In continuous integration frameworks with device farms * As a superior alternative to logging and/or flag based debugging to quickly test a feature * As a modular set of tests to test feature or peripheral functioning (eg: a system timer implementation) during device bringup. ###### Note One key difference is to run the tests via a call to `chre::runAllTests` in _chre/test/common/unit_test.h_, which basically wraps the gtest `RUN_ALL_TESTS` macro, and implements CHRE specific event handlers for Pigweed's UT Framework. #### Running Tests Under the current incarnation of the CHRE Unit Test Framework, the following steps need to be taken to run the on-device tests: * Set to true and export an environment variable called `CHRE_ON_DEVICE_TESTS_ENABLED` from your Makefile invocation before CHRE is built. * Ensure that this flag is not always set to avoid codesize bloat. * Append your test source file to `COMMON_SRCS` either in _test/test.mk_ or in your own Makefile. * Call `chre::runAllTests` from somewhere in your code. ##### Sample code In _math_test.cc_ ```cpp #include TEST(MyMath, Add) { int x = 1, y = 2; int result = myAdd(x, y); EXPECT_EQ(result, 3); } ``` In _some_source.cc_ ```cpp #include "chre/test/common/unit_test.h" void utEntryFunc() { chre::runAllTests(); } ``` #### Caveats Some advanced features of gtest (SCOPED_TRACE, etc.) are unsupported by Pigweed. #### Compatibility The framework has been tested with Pigweed's git revision ee460238b8a7ec0a6b4f61fe7e67a12231db6d3e. ## PAL implementation tests PAL implementation tests verify implementations of PAL interfaces adhere to the requirements of that interface, and are intended primarily to support development of PAL implementations, typically done by a chip vendor partner. Additional setup may be required to integrate with the PAL under test and supply necessary dependencies. The source code is in the files under `pal/tests/src` and follows the naming scheme `*_pal_impl_test.cc`. In order to run PAL tests, run: `run_pal_impl_tests.sh`. Note that there are also PAL unit tests in the same directory. The unit tests are added to the `GOOGLETEST_SRCS` target while PAL tests are added to the `GOOGLETEST_PAL_IMPL_SRCS` target. ## FeatureWorld nanoapps Located under the `apps/` directory, FeatureWorld nanoapps interact with the set of CHRE APIs that they are named after, and can be useful during framework development for manual verification of a feature area. For example, SensorWorld attempts to samples from sensors and outputs to the log. It also offers a break-it mode that randomly changes which sensors are being sampled in an attempt to point out stress points in the framework or platform implementation. These apps are usually built into the CHRE framework binary as static nanoapps to facilitate easy development. See the Deploying Nanoapps section for more information on static nanoapps. ## CHQTS The Context Hub Qualification Test Suite (CHQTS) tests perform end-to-end validation of a CHRE implementation, by using the Java APIs in Android to load and interact with test nanoapps which then exercise the CHRE API. While this code is nominally integrated in another test suite, the source code is available under `java/test/chqts/` for the Java side code and `apps/test/chqts/` for the CHQTS-only nanoapp code and `apps/test/common/` for the nanoapp code shared by CHQTS and other test suites. [PW_URL]: https://pigweed.dev [PW_UT_URL]: https://pigweed.googlesource.com/pigweed/pigweed/+/refs/heads/master/pw_unit_test [GT_URL]: https://github.com/google/googletest