blob: 67c56dad76a148a4a9e6dc71d0a0ee814391bbff [file] [log] [blame] [view]
# Deploying and running gtests on Fuchsia
[TOC]
Fuchsia gtest binaries are deployed and executed via scripts that are
automatically generated by the `test()` GN target. For each test, three wrapper
scripts are created:
1. deploy_<test_target_name>, for deploying the Fuchsia package onto a device
2. run_<test_target_name>, for running the Fuchsia package on the device
These executables are found in `${OUTPUT_DIR}/bin`.
The aforementioned devices can be either emulators started by the scripts
themselves, an existing emulator instance, or a physical device. To build a
gtest binary, check this [documentation](build_instructions.md).
For the sake of this example, we will be using `base_unittests` as the package
we wish to install and/or execute.
## Hermetic emulation
The test script brings up an emulator, runs the tests on it, and
shuts the emulator down when finished.
```bash
$ out/fuchsia/bin/run_base_unittests
```
The flag `--custom-image` can be used to specify the Fuchsia boot image used
by the emulator. For instance, setting
`--custom-image=workstation.qemu-x64-release` would run the test on a
workstation image.
## Run on a persistent emulated device from the Chromium three
You can start a persistent emulator from the Chromium tree by running this command:
```bash
$ ./build/fuchsia/start_emulator.py
```
Part of the output should be:
```
2022-05-31 22:55:13,011:INFO:root:Emulator successfully started.\
You can now run Chrome Fuchsia tests with\
"-d --node-name fuchsia-5254-0063-5e7a" to target this emulator.
```
Once the emulator is running, you can run tests on this emulator instance by
adding the command line arguments indicated above:
```bash
$ out/fuchsia/bin/run_base_unittests -d --node-name fuchsia-5254-0063-5e7a
```
## Run on an physical device
Note the `-d` flag, which is an alias for `--device`.
```bash
$ out/fuchsia/bin/run_base_unittests -d
```
## Run on a device paved with Fuchsia built from source
Make sure that the CPU architecture of your Chromium output directory matches
the architecture of the Fuchsia output directory (x64==x64, arm64==arm64, etc.).
```bash
$ out/fuchsia/bin/run_base_unittests -d
--fuchsia-out-dir=/path/to/fuchsia/outdir
```
If you are frequently deploying to Fuchsia built from source, you might want to
add the following entry to your `args.gn`:
```
default_fuchsia_build_dir_for_installation = "/path/to/fuchsia/outdir"
```
With this flag in place, the `--fuchsia-out-dir` flag will automatically be
used whenever you use the wrapper scripts to run or deploy Fuchsia packages,
making your command lines much shorter:
```bash
$ out/fuchsia/bin/run_base_unittests -d
```
## Install on a device running Fuchsia built from source
```bash
$ out/fuchsia/bin/deploy_base_unittests
--fuchsia-out-dir=/path/to/fuchsia/outdir
```
You will need to run the package manually on your device. In this case, run the
following from your Fuchsia directory:
```
$ fx shell run fuchsia-pkg://fuchsia.com/base_unittests#meta/base_unittests.cmx
```
## Run on a device the host is connected to remotely via ssh
Note the `--ssh-config` flag, which should point to the config file used to set
up the connection between the host and the remote device.
```bash
$ out/fuchsia/bin/run_base_unittests -d \
--host=::1 --port=8022 --ssh-config=/path/to/ssh/config
```
## Troubleshooting a test
To troubleshoot a specific test, consider a combination of the following
arguments to the test runner script:
* `--gtest_filter="[TestSuite.TestName]"` to only run a specific test, or a
comma-separated list to run a set of tests. Wildcards can also be used to run
a set of tests or an entire test suite, e.g. `--gtest_filter="[TestSuite.*]"`.
* `--test-launcher-jobs=1` to only have one batch of tests running at a time.
This bypasses the test launcher buffering of test log output, making it
possible to access the log output from successful test runs.
* `--single-process-tests` to run all the tests in the same process. Unlike the
above option, this will run the tests directly in the test launcher process,
making it easier to attach a debugger.
* "--logs-dir=[/path/to/log/directory]` to specify the directory to write logs
to. By default, Chromium logs are written to the "system_log" file in that
directory.
* `--gtest_repeat=[number] --gtest_break_on_failure` to run a test or test suite
a certain number of times until it fails. This is useful to investigate flaky
tests.