blob: 9e67c5f54fc6788a15bee6f3b5854d807b40104e [file] [log] [blame] [view]
<!--
(C) Copyright 2023 The Fuchsia Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
# Testing Third Party Changes
## Preface
This doc is mostly focused on testing changes to Scudo, GWP-ASan and LLVM-libc,
as such the doc uses these as examples but the concepts will transfer to any
third_party/ project. It is intended both for Fuchsia developers and for
developers of upstream projects who may not have a Fuchsia checkout or be
familiar with the build.
### Getting the checkout
For those who don't already have a Fuchsia checkout, you can follow the steps
[here](/docs/get-started/get_fuchsia_source.md).
## Running the tests
Further documentation on building and running tests can be found in
[Configure and build Fuchsia](/docs/get-started/build_fuchsia.md) and
[Run Fuchsia Tests](/docs/development/testing/run_fuchsia_tests.md) respectively.
For a quick summary see below.
All methods will refer back to how the tests are actually run. All third_party/
tests will be run differently, if they are run at all. A good place to start
is to grep around `*.gn{,i}` files to see where in the build these projects are
being referred to. In the case of Scudo, it is part of libc's build and most
of the build logic concerning it and its tests can be found in
[//sdk/lib/c/scudo/BUILD.gn](/sdk/lib/c/scudo/BUILD.gn).
For this particular target it is depended on by `//sdk/lib/c:tests`.
First run `fx set core.x64 --with //sdk/lib/c:tests`, see the
[build](/docs/get-started/build_fuchsia.md) docs on more details, but this
configuration is a good default. This only needs to be run once.
Then run `ffx emu start --headless`. This starts the emulator and will build
anything it needs. Also run `fx serve` either in the background or foreground
but create a new terminal session in the case of latter. Both of these need
only be run once, but need to be run again if they die or your machine is
restarted. Note: if you `jiri update` it is good practice to rebuild and
restsart the emulator and package serve.
To run the tests you can look to see which test target ends up depending on
the test you are interested in. Scudo tests are rolled into libc tests which
are `libc-unittests-pkg`, some GWP-ASan tests are there as well as
`gwp-asan-test-pkg`. Run `fx test -v libc-unittests-pkg gwp-asan-test-pkg` to run just those tests.
When in doubt, `fx test -v` can be run without arguments to run all tests, which
if you only included `//sdk/lib/c:tests` won't take too long.
## Testing a change locally
To test a change locally, simply apply the patch to the respective //third_party
directory. Usually this will be //third_party/${proj}/src, though in the case
of GWP-ASan it is in //third_party/scudo/gwp-asan. After the diff has been
applied run the tests as normal and targets will rebuild against your new
changes. This is a great way to do rapid iteration on a change you are
submitting upstream or testing someone elses change before they submit.
Tip: For testing out LLVM reviews, you can use
`curl -L 'https://reviews.llvm.org/DXXXXXX?download=1' | git apply -p${num}`
to easily apply a patch. DXXXXXX should be replaced with the patch you are
testing. ${num} should be replaced given the difference in directory hierarchy
between where the project lives in llvm and in third_party. In the case of
Scudo, use `-p5`.
Tip: If you are submitting a change to an upstream repo and have that change
locally
## Testing a failed roll
All of scudo, gwp-asan and llvm-libc, are rolled in by auto-rollers which will
fail if they break the build or if tests stop passing, either theirs or other
in tree tests. To test this locally, apply the diff created by the auto-roller
to `//integration`, this will be just a one line change bumping up the revision
on that project. To modify the commit hash manually to test at another
revision, either change the file by hand or run
`jiri edit -project=${proj}=${hash} ${manifest}`, where manifest will likely be
//integration/fuchsia/third_party/flower. Then run `jiri update -local-manifest`
this will pull in the new changes specified in your `//integration` directory.
Here, `jiri` will likely give an error that there are uncommitted changes in
`//integration`, this won't actually stop `jiri` from correctly updating the
third party project. If this bothers you, create a new branch in `//integration`
and commit your changes, this will make `jiri` simply warn that `//integration`
is not on `JIRI_HEAD`. To ensure your project was correctly updated, run
`cat ${path_to_proj}/src/.git/HEAD`. Run tests as normal.
## \[Googlers Only\] Leveraging bots
Only Google employees can make push changes to `//integration` and view tqr/
Some failures will only happen on certain devices and without having access to
them locally, it is impossible to reproduce locally. These cases should be
exceedingly rare, and as such the workflow is not particularly well refined.
First, find the project you want to test, in the case of Scudo it looks like:
```
<project name="scudo"
path="third_party/scudo/src"
remote="https://llvm.googlesource.com/scudo"
revision="b0c7c7b80b6dfa2cd0b5dae98cb1ea33d31d2497"/>
```
Make a git clone of the remote, here that is
`https://llvm.googlesource.com/scudo`, and push to an accessible git
host. See go/gob/users/user-repository, go/gob/users/team-repository and go/gob/users/new-host. Change the project's remote to point to your
host repos address. Make changes to your clone and change the revision to the
revision you want to test at.
After that, push your change, go to the review and add the specific bots you wish to test.
Example: tqr/634497