| # Autotest for Chromium OS developers |
| |
| [TOC] |
| |
| ## Useful documents |
| |
| [Autotest documentation on GitHub](https://github.com/autotest/autotest/wiki/AutotestApi): |
| This would be a good read if you want to familiarize yourself with the basic |
| Autotest concepts. |
| |
| [Gentoo Portage ebuild/eclass Information](http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml?part=2): |
| Getting to know the package build system we use. |
| |
| [ChromiumOS specific Portage FAQ](http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/portage-build-faq): |
| Learning something about the way we use portage. |
| |
| ## Autotest and ebuild workflow |
| |
| To familiarize with autotest concepts, you should start with the upstream |
| Autotest documentation at: https://github.com/autotest/autotest/wiki/AutotestApi |
| |
| The rest of this document is going to use some terms and only explain them |
| vaguely. |
| |
| ### Overview |
| |
| At a high level, tests are organized in test cases, each test case being either |
| server or client, with one main .py file named the same as the test case, and |
| one or more control files. In order to be able to perform all tasks on a given |
| test, autotest expects tests to be placed in a monolithic file structure |
| of: |
| |
| - `/client/tests/` |
| - `/client/site_tests/` |
| - `/server/tests/` |
| - `/server/site_tests/` |
| |
| Each test directory has to have at least a control file, but typically also has |
| a main job module (named the same as the test case). Furthermore, if it needs |
| any additional files checked in, they are typically placed in a `files/` |
| directory, and separate projects that can be built with a Makefile inside the |
| `src/` directory. |
| |
| Due to structural limitations in Chromium OS, it is not possible to store all |
| test cases in this structure in a single large source repository as upstream |
| autotest source would (placed at `third_party/autotest/files/` in Chromium OS). |
| In particular, the following has been required in the past: |
| |
| - Having confidential (publicly inaccessible) tests or generally per-test ACLs |
| for sharing only with a particular partner only. |
| - Storing test cases along with the project they wrap around, because the test |
| requires binaries built as a by-product of the project’s own build system. |
| (e.g. chrome or tpm tests) |
| |
| Furthermore, it has been desired to generally build everything that is not |
| strongly ordered in parallel, significantly decreasing build times. That, |
| however, requires proper dependency tree declaration and being able to specify |
| which test cases require what dependencies, in addition to being able to |
| process different "independent" parts of a single source repository in |
| parallel. |
| |
| This leads to the ebuild workflow, which generally allows compositing any |
| number of sources in any format into a single monolithic tree, whose contents |
| depend on build parameters. |
| |
| ![ebuild workflow](./assets/atest-diagram.png) |
| |
| This allows using standard autotest workflow without any change, however, |
| unlike what upstream does, the tests aren’t run directly from the source |
| repository, rather from a staging read-only install location. This leads to |
| certain differences in workflow: |
| |
| - Source may live in an arbitrary location or can be generated on the fly. |
| Anything that can be created as an ebuild (shell script) can be a test source. |
| (cros-workon may be utilised, introducing a fairly standard Chromium OS |
| project workflow) |
| - The staging location (`/build/${board}/usr/local/autotest/`) may not be |
| modified; if one wants to modify it, they have to find the source to it |
| (using other tools, see FAQ). |
| - Propagating source changes requires an emerge step. |
| |
| ### Ebuild setup, autotest eclass |
| |
| **NOTE**: This assumes some basic knowledge of how ebuilds in Chromium OS work. |
| Further documentation is available at http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/portage-build-faq |
| |
| An **autotest ebuild** is an ebuild that produces test cases and installs them into |
| the staging area. It has three general tasks: |
| |
| - Obtain the source - This is generally (but not necessarily) provided by |
| ‘cros-workon’ eclass. It could also work with the more standard tarball |
| SRC_URI pathway or generally any shell code executed in `src_unpack()`. |
| - Prepare test cases - This includes, but is not limited to preprocessing any |
| source, copying source files or intermediate binaries into the expected |
| locations, where they will be taken over by autotest code, specifically the |
| `setup()` function of the appropriate test. Typically, this is not needed. |
| - Call autotest to "build" all sources and subsequently install them - This |
| should be done exclusively by inheriting the **autotest eclass**, which |
| bundles up all the necessary code to install into the intermediate location. |
| |
| **Autotest eclass** is inherited by all autotest ebuilds, only requires a |
| number of variables specified and works by itself otherwise. Most variables |
| describe the locations and listings of work that needs to be done: |
| |
| - Location variables define the paths to directories containing the test |
| files: |
| |
| - `AUTOTEST_{CLIENT,SERVER}_{TESTS,SITE_TESTS}` |
| - `AUTOTEST_{DEPS,PROFILERS,CONFIG}` |
| |
| These typically only need to be specified if they differ from the defaults |
| (which follow the upstream directory structure) |
| |
| - List variables (`AUTOTEST_*_LIST`) define the list of deps, profilers, |
| configs that should be handled by this ebuild. |
| - IUSE test list specification TESTS=, is a USE_EXPANDed specification of |
| tests managed by the given ebuild. By virtue of being an IUSE variable, all |
| of the options are visible as USE flag toggles while building the ebuild, |
| unlike with list variables which are a given and the ebuild has to be |
| modified for those to change. |
| |
| Each ebuild usually operates on a single source repository. That does not |
| always have to hold true, however, and in case of autotest, many ebuilds check |
| out the sources of the same source repository (*autotest.git*). Invariably, this |
| means that they have to be careful to not install the same files and split the |
| sources between themselves to avoid file install collisions. |
| If more than one autotest ebuild operates on the same source repository, they |
| **have to** use the above variables to define mutually exclusive slices in order |
| to not collide during installation. Generally, if we have a source repository |
| with client site_tests A and B, you can have either: |
| |
| - one ebuild with IUSE_TESTS="+tests_A +tests_B" |
| - two different ebuilds, one with IUSE_TESTS="+tests_A", the other with |
| IUSE_TESTS="+tests_B" |
| |
| As soon as an overlap between ebuilds happens, either an outside mechanism has |
| to ensure the overlapping tests are never enabled at the same time, or file |
| collisions happen. |
| |
| |
| ## Building tests |
| |
| Fundamentally, a test has two main phases: |
| |
| - `run_*()` - This is is the main part that performs all testing and is |
| invoked by the control files, once or repeatedly. |
| - `setup()` - This function, present in the test case’s main .py file is |
| supposed to prepare the test for running. This includes building any |
| binaries, initializing data, etc. |
| |
| During building using emerge, autotest will call a `setup()` function of all |
| test cases/deps involved. This is supposed to prepare everything. Typically, |
| this will invoke make on a Makefile present in the test’s src/ directory, but |
| can involve any other transformation of sources (also be empty if there’s |
| nothing to build). |
| **Note**, however, that `setup()` is implicitly called many times as test |
| initialization even during `run_*()` step, so it should be a noop on reentry |
| that merely verifies everything is in order. |
| |
| Unlike `run_*()` functions, `setup()` gets called both during the prepare phase |
| which happens on the **host and target alike**. This creates a problem with |
| code that is being depended on or directly executed during `setup()`. Python |
| modules that are imported in any pathway leading to `setup()` are needed both |
| in the host chroot and on the target board to properly support the test. Any |
| binaries would need to be compiled using the host compiler and either ensured |
| that they will be skipped on the target (incremental `setup()` runs) or |
| cross-compiled again and dynamically chosen while running on target. |
| |
| **More importantly**, in Chromium OS scenario, doing any write operations |
| inside the `setup()` function will lead to **access denied failures**, because |
| tests are being run from the intermediate read-only location. |
| |
| Given the above, building is as easy as **emerge**-ing the autotest ebuild that |
| contains our test. |
| ``` |
| $ emerge-${board} ${test_ebuild} |
| ``` |
| |
| *Currently, tests are organized within these notable ebuilds*: (see |
| [FAQ](#Q1_What-autotest-ebuilds-are-out-there_) full list): |
| |
| - chromeos-base/autotest-tests - The main ebuild handling most of autotest.git |
| repository and its client and server tests. |
| - chromeos-base/autotest-tests-* - Various ebuilds that build other parts of |
| autotest.git |
| - chromeos-base/chromeos-chrome - chrome tests; the tests that are part of |
| chrome |
| |
| ### Building tests selectively |
| |
| Test cases built by ebuilds generally come in large bundles. Sometimes, only a |
| subset, or generally a different set of the tests provided by a given ebuild is |
| desired. That is achieved using a |
| [USE_EXPANDed](http://devmanual.gentoo.org/general-concepts/use-flags/index.html) |
| flag called TESTS. |
| |
| All USE flags (and therefore tests) have a default state, either enabled (+) or |
| disabled (-), specified directly in the ebuild, that can be manually overridden |
| from the commandline. There are two ways to do that. |
| |
| - Non-Incremental - Simply override the default selection by an entirely new |
| selection, ignoring the defaults. This is useful if you develop a single |
| test and don’t want to waste time building the others. |
| |
| $ TESTS="test1 test2" emerge-${board} ${ebuild} |
| |
| - Incremental - All USE_EXPAND flags are also accessible as USE flags, with |
| the appropriate prefix, and can be used incrementally to selectively |
| enable/disable tests in addition to the defaults. This can be useful if you |
| aim to enable a test that is disabled by default and want to test locally. |
| |
| $ USE="test_to_be_enabled -test_to_be_disabled" emerge-${board} \ |
| ${ebuild} |
| |
| For operations across all tests, following incremental USE wildcard is |
| supported by portage: "tests_*" to select all tests at once (or - to |
| de-select). |
| |
| **NOTE**: Both Incremental and Non-Incremental methods can be set/overriden by |
| (in this order): the ebuild (default values), make.profile, make.conf, |
| /etc/portage, commandline (see above). That means that any settings provided on |
| the emerge commandline override everything else. |
| |
| ## Running tests |
| |
| **NOTE**: In order to run tests on your device, it needs to have a |
| [test-enabled image](#W4_Create-and-run-a-test-enabled-image-on-your-device). |
| |
| When running tests, fundamentally, you want to either: |
| |
| - Run sets of tests manually - Use case: Developing test cases |
| |
| Take your local test sources, modify them, and then attempt to run them on a |
| target machine using autotest. You are generally responsible for making sure |
| that the machine is imaged to a test image, and the image contains all the |
| dependencies needed to support your tests. |
| |
| - Verify a given image - Use case: Developing the projects subject to testing |
| |
| Take an image, re-image the target device and run a test suite on it. This |
| requires either use of build-time autotest artifacts or their reproduction |
| by not modifying or resyncing your sources after an image has been built. |
| |
| ### Running tests on a machine |
| |
| Autotests are run with a tool called |
| [test_that](https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/docs/test-that.md). |
| |
| ### Running tests in a VM - cros_run_test |
| |
| VM tests are conveniently wrapped into a script `cros_run_test` that sets up |
| the VM using a given image and then calls `test_that`. This is run by builders |
| to test using the Smoke suite. |
| |
| If you want to run your tests in a VM (see |
| [here](https://chromium.googlesource.com/chromiumos/docs/+/master/cros_vm.md#Run-an-autotest-in-the-VM) |
| |
| - `cros_run_test` starts up a VM and runs autotests using the port |
| - specified (defaults to 9222). As an example: |
| |
| $ cros_run_test --autotest=suite:smoke \ |
| --image-path=<my_image_to_start or don't set to use most recent build> \ |
| --board=amd64-generic |
| |
| - The emulator command line redirects localhost port 9222 to the emulated |
| machine's port 22 to allow you to ssh into the emulator. For Chromium OS to |
| actually listen on this port you must append the `--test_image` parameter |
| when you run the `./image_to_vm.sh` script, or perhaps run the |
| `mod_image_for_test.sh` script instead. |
| - You can then run tests on the correct ssh port with something like |
| |
| $ test_that --board=x86-generic localhost:9222 'f:.*platform_BootPerf/control' |
| |
| - To set the sudo password run set_shared_user_password. Then within the |
| emulator you can press Ctrl-Alt-T to get a terminal, and sudo using this |
| password. This will also allow you to ssh into the unit with, e.g. |
| |
| $ ssh -p 9222 root@localhost |
| |
| - Warning: After |
| [crbug/710629](https://bugs.chromium.org/p/chromium/issues/detail?id=710629), |
| 'betty' is the only board regularly run through pre-CQ and CQ VMTest and so |
| is the most likely to work at ToT. 'betty' is based on 'amd64-generic', |
| so 'amd64-generic' is likely to also work for most (non-ARC) tests. |
| |
| |
| ## Result log layout structure |
| |
| For information regarding the layout structure please refer to the following: |
| [autotest-results-logs](https://www.chromium.org/chromium-os/testing/test-code-labs/autotest-client-tests/autotest-results-logs) |
| |
| ### Interpreting test results |
| |
| Running autotest will result in a lot of information going by which is probably |
| not too informative if you have not used autotest before. At the end of the |
| `test_that` run, you will see a summary of pass/failure status, along with |
| performance results: |
| |
| ``` |
| 22:44:30 INFO | Using installation dir /home/autotest |
| 22:44:30 ERROR| Could not install autotest from repos |
| 22:44:32 INFO | Installation of autotest completed |
| 22:44:32 INFO | GOOD ---- Autotest.install timestamp=1263509072 localtime=Jan 14 22:44:32 |
| 22:44:33 INFO | Executing /home/autotest/bin/autotest /home/autotest/control phase 0 |
| 22:44:36 INFO | START ---- ---- timestamp=1263509075 localtime=Jan 14 14:44:35 |
| 22:44:36 INFO | START sleeptest sleeptest timestamp=1263509076 localtime=Jan 14 14:44:36 |
| 22:44:36 INFO | Bundling /usr/local/autotest/client/tests/sleeptest into test-sleeptest.tar.bz2 |
| 22:44:40 INFO | GOOD sleeptest sleeptest timestamp=1263509079 localtime=Jan 14 14:44:39 completed successfully |
| 22:44:40 INFO | END GOOD sleeptest sleeptest timestamp=1263509079 localtime=Jan 14 14:44:39 |
| 22:44:42 INFO | END GOOD ---- ---- timestamp=1263509082 localtime=Jan 14 14:44:42 |
| 22:44:44 INFO | Client complete |
| 22:44:45 INFO | Finished processing control file |
| ``` |
| |
| `test_that` will leave around a temp directory populated with diagnostic information: |
| |
| ``` |
| Finished running tests. Results can be found in /tmp/test_that_results_j8GoWH or /tmp/test_that_latest |
| ``` |
| |
| This directory will contain a directory per test run. Each directory contains |
| the logs pertaining to that test run. |
| |
| In that directory some interesting files are: |
| |
| ${TEST}/debug/client.DEBUG - the most detailed output from running the |
| client-side test |
| |
| ### Running tests automatically, Suites |
| |
| Suites provide a mechanism to group tests together in test groups. They also |
| serve as hooks for automated runs of tests verifying various builds. Most |
| importantly, that is the BVT (board verification tests) and Smoke (a subset of |
| BVT that can run in a VM). |
| |
| Please refer to the [suites documentation](https://www.chromium.org/chromium-os/testing/test-suites). |
| |
| ## Writing and developing tests |
| |
| ### Writing a test |
| |
| For understanding and writing the actual python code for autotest, please refer |
| to the [Developer FAQ](http://www.chromium.org/chromium-os/testing/autotest-developer-faq#TOC-Writing-Autotests) |
| |
| Currently, all code should be placed in a standard layout inside the |
| autotest.git repository, unless otherwise is necessary for technical reasons. |
| Regardless, the following text assumes that code is placed in generally any |
| repository. |
| |
| For a test to be fully functional in Chromium OS, it has to be associated with |
| an ebuild. It is generally possible to run tests without an ebuild using |
| `test_that` but discouraged, as the same will not function with other parts of |
| the system. |
| |
| ### Making a new test work with ebuilds |
| |
| The choice of ebuild depends on the location of its sources. Structuring tests |
| into more smaller ebuilds (as opposed to one ebuild per source repository) |
| serves two purposes: |
| |
| - Categorisation - Grouping similar tests together, possibly with deps they |
| use exclusively. |
| - Parallelisation - Multiple independent ebuilds can build entirely in |
| parallel. |
| - Dependency tracking - Larger bundles of tests depend on more system |
| packages without proper resolution which dependency belongs to which test. |
| This also increases paralellism. |
| |
| Current ebuild structure is largely a result of breaking off the biggest |
| blockers for parallelism, ie. tests depending on chrome or similar packages, |
| and as such, using any of the current ebuilds should be sufficient. (see FAQ |
| for listing of ebuilds) |
| |
| After choosing the proper ebuild to add your test into, the test (in the form |
| “+tests_<testname>”) needs to be added to IUSE_TESTS list that all autotest |
| ebuilds have. Failing to do so will simply make ebuilds ignore your tests |
| entirely. As with all USE flags, prepending it with + means the test will be |
| enabled by default, and should be the default, unless you want to keep the test |
| experimental for your own use, or turn the USE flag on explicitly by other |
| means, eg. in a config for a particular board only. |
| |
| Should a **new ebuild** be started, it should be added to |
| **chromeos-base/autotest-all** package, which is a meta-ebuild depending on all |
| autotest ebuild packages that can be built. autotest-all is used by the build |
| system to automatically build all tests that we have and therefore keep them |
| from randomly breaking. |
| |
| ### Deps |
| |
| Autotest uses deps to provide a de-facto dependencies into the ecosystem. A dep |
| is a directory in ‘**client/deps**’ with a structure similar to a test case |
| without a control file. A test case that depends on a dep will invoke the dep’s |
| `setup()` function in its own `setup()` function and will be able to access the |
| files provided by the dep. Note that autotest deps have nothing to do with |
| system dependencies. |
| |
| As the calls to a dep are internal autotest code, it is not possible to |
| automatically detect these and make them an inter-package dependencies on the |
| ebuild level. For that reason, deps should either be |
| [provided](#Ebuild-setup_autotest-eclass) by the same ebuild that builds test |
| that consume them, or ebuild dependencies need to be declared manually between |
| the dep ebuild and the test ebuild that uses it. An **autotest-deponly** |
| eclass exists to provide solution for ebuilds that build only deps and no |
| tests. A number of deponly ebuilds already exist. |
| |
| Common deps are: |
| |
| - chrome_test - Intending to use any of the test binaries produced by chrome. |
| - pyauto_dep - Using pyauto for your code. |
| |
| ### Test naming conventions |
| |
| Generally, the naming convention runs like this: |
| |
| \<component>\_\<TestName\> |
| |
| That convention names the directory containing the test code. It also names |
| the .py file containing the test code, and the class of the Autotest test. |
| |
| If there's only one control file, it's named control. The test's NAME in the |
| control file is \<component\>_\<TestName\>, like the directory and .py |
| file. |
| |
| If there are multiple control files for a test, they are named |
| control.\<testcase\>. These tests' NAMEs are then |
| \<component\>_\<TestName\>.\<testcase\>. |
| |
| ## Common workflows |
| |
| ### W1. Develop and iterate on a test |
| |
| 1. Set up the environment. |
| |
| $ cd ~/trunk/src/third_party/autotest/files/ |
| $ export TESTS=”<the test cases to iterate on>” |
| $ EBUILD=<the ebuild that contains TEST> |
| $ board=<the board on which to develop> |
| |
| 2. Ensure cros_workon is started |
| |
| $ cros_workon --board=${board} start ${EBUILD} |
| $ repo sync # Necessary only if you use minilayout. |
| |
| 3. Make modifications (on first run, you may want to just do 3,4 to verify |
| everything works before you touch it \& break it) |
| |
| $ ... |
| |
| 4. Build test (TESTS= is not necessary if you exported it before) |
| |
| $ emerge-$board $EBUILD |
| |
| 5. Run test to make sure it works before you touch it |
| |
| $ test_that <machine IP> ${TESTS} |
| |
| 6. Go to 2) to iterate |
| 7. Clean up environment |
| |
| $ cros_workon --board=${board} stop ${EBUILD} |
| $ unset TESTS |
| |
| ### W2. Creating a test - steps and checklist |
| |
| When creating a test, the following steps should be done/verified. |
| |
| 1. Create the actual test directory, main test files/sources, at least one |
| control file |
| 2. Find the appropriate ebuild package and start working on it: |
| |
| $ cros_workon --board=${board} start <package> |
| |
| 3. Add the new test into the IUSE_TESTS list of 9999 ebuild |
| 4. Try building: (make sure it’s the 9999 version being built) |
| |
| $ TESTS=<test> emerge-$board <package> |
| |
| 5. Try running: |
| |
| $ test_that <IP> <test> |
| |
| 6. Iterate on 4,5 and modify source until happy with the initial version. |
| 7. Commit test source first, when it is safely in, commit the 9999 ebuild |
| version change. |
| 8. Cleanup |
| |
| $ cros_workon --board=${board} stop <package> |
| |
| ### W3. Splitting autotest ebuild into two |
| |
| Removing a test from one ebuild and adding to another in the same revision |
| causes portage file collisions unless counter-measures are taken. Generally, |
| some things routinely go wrong in this process, so this checklist should serve |
| to help that. |
| |
| 1. We have ebuild **foo-0.0.1-r100** with **test** and would like to split |
| that test off into ebuild **bar-0.0.1-r1**. |
| Assume that: |
| - both ebuilds are using cros-workon (because it’s likely the case). |
| - foo is used globally (eg. autotest-all depends on it), rather than just |
| some personal ebuild |
| 2. Remove **test** from foo-{0.0.1-r100,9999}; uprev foo-0.0.1-r100 (to -r101) |
| 3. Create bar-9999 (making a copy of foo and replacing IUSE_TESTS may be a good |
| start), with IUSE_TESTS containing just the entry for **test** |
| 4. Verify package dependencies of test. Make bar-9999 only depend on what is |
| needed for test, remove the dependencies from foo-9999, unless they are |
| needed by tests that remained. |
| 5. Add a blocker. Since bar installs files owned by foo-0.0.1-r100 and earlier, |
| the blocker’s format will be: |
| |
| RDEPEND="!<=foo-0.0.1-r100" |
| |
| 6. Add a dependency to the new version of bar into |
| chromeos-base/autotest-all-0.0.1 |
| |
| RDEPEND="bar" |
| |
| 7. Change the dependency of foo in chromeos-base/autotest-all-0.0.1 to be |
| version locked to the new rev: |
| |
| RDEPEND=">foo-0.0.1-r100" |
| |
| 8. Uprev (move) autotest-all-0.0.1-rX symlink by one. |
| 9. Publish all as the same change list, have it reviewed, push. |
| |
| ### W4. Create and run a test-enabled image on your device |
| |
| 1. Choose which board you want to build for (we'll refer to this as ${BOARD}, |
| which is for example "x86-generic"). |
| 2. Set up a proper portage build chroot setup. Go through the normal process |
| of setup_board if you haven't already. |
| |
| $ ./build_packages --board=${BOARD} |
| |
| 3. Build test image. |
| |
| $ ./build_image --board=${BOARD} test |
| |
| 4. Install the Chromium OS testing image to your target machine. This is |
| through the standard mechanisms: either USB, or by reimaging a device |
| currently running a previously built Chromium OS image modded for test, or |
| by entering the shell on the machine and forcing an auto update to your |
| machine when it's running a dev server. For clarity we'll walk through two |
| common ways below, but if you already know about this, just do what you |
| normally do. |
| |
| - If you choose to use a USB boot, you first put the image on USB and run |
| this from outside the chroot. |
| |
| $ ./image_to_usb.sh --to /dev/sdX --board=${BOARD} \ |
| --image_name=chromiumos_test_image.bin |
| |
| - Alternatively, if you happen to already have a machine running an image |
| modified for test and you know its IP address (${REMOTE_IP}), you can |
| avoid using a USB key and reimage it with a freshly built image by |
| running this from outside the chroot: |
| |
| $ ./image_to_live.sh --remote=${REMOTE_IP} \ |
| --image=`./get_latest_image.sh \ |
| --board=${BOARD}`/chromiumos_test_image.bin |
| |
| This will automatically start dev server, ssh to your machine, cause it to |
| update to from that dev server using memento_updater, reboot, wait for reboot, |
| print out the new version updated to, and shut down your dev server. |
| |
| ## Troubleshooting/FAQ |
| |
| ### Q1: What autotest ebuilds are out there? |
| |
| Note that the list of ebuilds may differ per board, as each board has |
| potentially different list of overlays. To find all autotest ebuilds for board |
| foo, you can run: |
| ``` |
| $ board=foo |
| $ for dir in $(portageq-${board} envvar PORTDIR_OVERLAY); do |
| find . -name '*.ebuild' | xargs grep "inherit.*autotest" | grep "9999" | \ |
| cut -f1 -d: | \ |
| sed -e 's/.*\/\([^/]*\)\/\([^/]*\)\/.*\.ebuild/\1\/\2/' |
| done |
| ``` |
| (Getting: "WARNING: 'portageq envvar PORTDIR_OVERLAY' is deprecated. Use |
| 'portageq repositories_configuration' instead." Please fix documentation.) |
| |
| ### Q2: I see a test of the name ‘greattests_TestsEverything’ in build output/logs/whatever! How do I find which ebuild builds it? |
| |
| All ebuilds have lists of tests exported as **USE_EXPANDed** lists called |
| **TESTS**. An |
| expanded use can be searched for in the same way as other use flags, but with |
| the appropriate prefix, in this case, you would search for |
| **tests_greattests_TestsEverything**’: |
| ``` |
| $ use_search=tests_greattests_TestsEverything |
| $ equery-$board hasuse $use_search |
| * Searching for USE flag tests_greattests_TestsEverything ... |
| * [I-O] [ ] some_ebuild_package_name:0 |
| ``` |
| |
| This will however only work on ebuilds which are **already installed**, ie. |
| their potentially outdated versions. |
| **Alternatively**, you can run a pretended emerge (emerge -p) of all autotest |
| ebuilds and scan the output. |
| ``` |
| $ emerge -p ${all_ebuilds_from_Q1} |grep -C 10 “${use_search}” |
| ``` |
| |
| ### Q3: I have an ebuild ‘foo’, where are its sources? |
| |
| Generally speaking, one has to look at the ebuild source to figure that |
| question out (and it shouldn’t be hard). However, all present autotest ebuilds |
| (at the time of this writing) are also ‘cros-workon’, and for those, this |
| should always work: |
| ``` |
| $ ebuild_search=foo |
| $ ebuild $(equery-$board which $ebuild_search) info |
| CROS_WORKON_SRCDIR=”/home/you/trunk/src/third_party/foo” |
| CROS_WORKON_PROJECT=”chromiumos/third_party/foo” |
| ``` |
| |
| ### Q4: I have an ebuild, what tests does it build? |
| |
| You can run a pretended emerge on the ebuild and observe the ‘TESTS=’ |
| statement: |
| ``` |
| $ ebuild_name=foo |
| $ emerge-$board -pv ${ebuild_name} |
| These are the packages that would be merged, in order: |
| |
| Calculating dependencies... done! |
| [ebuild R ] foo-foo_version to /build/$board/ USE="autox hardened tpmtools |
| xset -buildcheck -opengles" TESTS="enabled_test1 enabled_test2 ... enabled_testN |
| -disabled_test1 ...disabled_testN" 0 kB [1] |
| ``` |
| |
| Alternately, you can use equery, which will list tests with the USE_EXPAND |
| prefix: |
| ``` |
| $ equery-$board uses ${ebuild_name} |
| [ Legend : U - final flag setting for installation] |
| [ : I - package is installed with flag ] |
| [ Colors : set, unset ] |
| * Found these USE flags for chromeos-base/autotest-tests-9999: |
| U I |
| + + autotest : <unknown> |
| + + autotest : <unknown> |
| + + autox : <unknown> |
| + + buildcheck : <unknown> |
| + + hardened : activate default security enhancements for toolchain (gcc, glibc, binutils) |
| - - opengles : <unknown> |
| + + tests_enabled_test : <unknown> |
| - - tests_disabled_test : <unknown> |
| ``` |
| |
| ### Q5: I’m working on some test sources, how do I know which ebuilds to cros_workon start in order to properly propagate? |
| |
| You should ‘workon’ and always cros_workon start all ebuilds that have files |
| that you touched. If you’re interested in a particular file/directory, that |
| is installed in `/build/$board/usr/local/autotest/` and would like know which |
| package has provided that file, you can use equery: |
| |
| ``` |
| $ equery-$board belongs /build/${board}/usr/local/autotest/client/site_tests/foo_bar/foo_bar.py |
| * Searching for <filename> ... |
| chromeos-base/autotest-tests-9999 (<filename>) |
| ``` |
| |
| DON’T forget to do equery-$board. Just equery will also work, only never |
| return anything useful. |
| |
| As a rule of thumb, if you work on anything from the core autotest framework or |
| shared libraries (anything besides |
| {server,client}/{test,site_tests,deps,profilers,config}), it belongs to |
| chromeos-base/autotest. Individual test case will each belong to a particular |
| ebuild, see Q2. |
| |
| It is important to cros_workon start every ebuild involved. |
| |
| ### Q6: I created a test, added it into ebuild, emerged it, and I’m getting access denied failures. What did I do wrong? |
| |
| Your test’s `setup()` function (which runs on the host before being uploaded) is |
| probably trying to write into the read-only intermediate location. See |
| [explanation](#Building-tests). |
| |