| # Test Environments |
| |
| The build system is tightly coupled with how the continuous integration |
| infrastructure (from here on referred to as just "infra") discovers, aggregates, |
| and runs tests. The high-level idea is that the test authors specify how they |
| want their tests to run in GN and this information is propagated from the build |
| system to the infra. |
| |
| More specifically |
| |
| * The build produces metadata files for each test specifying the required |
| execution environments. |
| * Infra groups the tests into shards that share the same environment. |
| * For each shard, infra schedules a bot to run those tests. |
| * Results from all shards are aggregated and reported. |
| |
| ## Environments |
| |
| The specification of a test's `environments` in GN is what determines where and |
| how a test is run. It is given as list of scopes of the following form: |
| |
| ```gn |
| environments = [ |
| { |
| dimensions = { |
| <dimension key> = <value> |
| ... |
| } |
| tags = ["<environment tags...>"] |
| netboot = <boolean> |
| }, |
| ... |
| ] |
| ``` |
| |
| See |
| [guest_integration_tests](/src/virtualization/tests) |
| for an example - and below for definitions of 'dimension' and 'tags' |
| |
| ### Default Behavior |
| |
| If no environments are specified for a test, than default behavior is as |
| follows: |
| |
| 1. `__is_fuchsia__`: test only runs in a QEMU instance running Fuchsia |
| 1. `__is_linux__`: test only runs on a Linux machine |
| 1. `__is_mac__`: test only runs on a Mac machine |
| |
| (1) means that hardware is opt-in; test authors must explicitly specify hardware |
| environments in order to run tests there. The reasoning for this is that not all |
| tests need to run on hardware, test authors know best whether that is the case, |
| and that hardware is a scarce resource. |
| |
| ### Predefined environments |
| |
| One may import |
| [//build/testing/environments.gni](/build/testing/environments.gni) |
| and use the environment-related convenience variables defined within. For |
| example, `basic_envs` includes all of the environments that are available to |
| anyone without special consultation with the infra team. |
| |
| ### Dimensions |
| |
| `dimensions` here refer to |
| [Swarming](https://chromium.googlesource.com/infra/luci/luci-py/+/HEAD/appengine/swarming/doc/) |
| dimensions, where Swarming is the task distribution system used by the infra. A |
| dimension is effectively a key-value pair that describes a bot property that can |
| be targeted. |
| |
| ### Tags |
| |
| Tags are arbitrary strings that may be attached to an environment. Setting |
| it amounts to removing the corresponding test from the normal testing pipeline; |
| in order then for that test to run, infra support for a new builder (to run |
| tests for particular tags) must be added. Labels are used for special tests |
| that require different configurations. Before using tags, please consult with |
| fuchsia-infra-team@google.com" |
| |
| ### Netboot |
| |
| Netboot specifies whether to netboot instead of paving before running the tests |
| in the shard for that environment. If omitted, it will be treated as false. |
| |
| ## Validation |
| |
| The `test_plaforms` list in |
| [//build/testing/platforms.gni](/build/testing/platforms.gni) |
| is the source of truth for what platforms are available for testing and what |
| dimensions they possess to match against. Say an environment *matches* a |
| platform entry if the former's `dimensions` is a subscope of the latter; say an |
| environment is *valid* for the current architecture if it matches a |
| `test_platforms` entry that doesn't specify a `cpu` value different than |
| `current_cpu`. |
| |
| Environment validation happens at `gn gen`-time and can be summed up as |
| |
| * Each environment must be valid for some architecture. |
| |
| * Each test must have an environment that is valid for the given architecture. |
| |
| ### Example |
| |
| Suppose platforms.gni consisted of |
| |
| ```gn |
| test_platforms = [ |
| { # P1 |
| device_type = "QEMU" |
| cpu = "x64" |
| }, |
| { # P2 |
| device_type = "QEMU" |
| cpu = "arm64" |
| }, |
| { # P3 |
| device_type = "Intel NUC Kit NUC7i5DNHE" |
| cpu = "x64" |
| }, |
| ] |
| ``` |
| |
| and consider the specification of |
| |
| ```gn |
| environments = [ |
| { # E1 |
| dimensions = { |
| device_type = "Intel NUC Kit NUC7i5DNHE" |
| } |
| }, |
| { # E2 |
| dimensions = { |
| device_type = "QEMU" |
| } |
| }, |
| ] |
| ``` |
| |
| When `current_cpu` is x64, E1 and E2 are both valid and match against P1 and P3 |
| respectively: the test is scheduled to run on a NUC and in QEMU. When |
| `current_cpu` is arm64, E1 is invalid but is ignored as E2 is valid and matches |
| P2: the test is scheduled to run in QEMU alone. |