|  | # 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 <gtest/gtest.h> | 
|  |  | 
|  | 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 |