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.

Running the tests

Further documentation on building and running tests can be found in Configure and build Fuchsia and Run Fuchsia Tests 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 //zircon/system/ulib/c/scudo/BUILD.gn. For this particular target it is depended on by //zircon/system/ulib/c:tests.

First run fx set core.x64 --with //zircon/system/ulib/c:tests, see the build 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 //zircon/system/ulib/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.

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" gitsubmoduleof="fuchsia" 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