blob: 4a025786bbc43387b10397da7491a1ee5a5cc2f4 [file] [log] [blame] [view]
# Tast Test Dependencies (go/tast-deps)
A test may specify software or hardware features that must be supported on the DUT
in order for the test to run successfully. If one or more features aren't
supported by the DUT, the test will usually be skipped. See the `tast` command's
`-checktestdeps` flag to control this behavior.
Tests specify dependencies through the `SoftwareDeps` and `HardwareDeps` fields in [testing.Test].
[testing.Test]: https://godoc.org/chromium.googlesource.com/chromiumos/platform/tast.git/src/go.chromium.org/tast/core/testing#Test
## Software dependencies
### Existing features
The following software features are defined:
* `amd64` - The [amd64] processor architecture.
* `amd_cpu` - Boards that contain an AMD application processor.
* `android_container` - The ability to [run Android apps] in a container instead
of a VM. Prefer this over `android_container_r` if possible.
* `android_vm` - The ability to [run Android apps] in VM instead of container.
Any version of Android T+ can be used. Prefer this over `android_vm_t` if possible.
* `android_p` - The ability to [run Android apps] that require Android P. (Android P always runs in container.)
* `android_container_r` - The ability to [run Android apps] that require Android R. (Android R always runs in container.)
* `android_vm_t` - The ability to [run Android apps] that require Android T. (Android T always runs in VM.)
* `arc` - The ability to [run Android apps] in any way, in VM or container,
with any Android version. This is intended to be used to run non-ARC tests
only when ARC is supported on the board.
* `arc32` - Runs 32-bit Android primary ABI.
* `arc64` - Runs 64-bit Android primary ABI, may or may not have 32-bit support.
* `arc_camera3` - Using [Camera HAL3] interface in Chrome and Android.
* `arc_launched_32bit` - This platform originally launched with 32-bit Android.
* `arc_launched_64bit` - This platform originally launched with 64-bit Android.
* `arc_print_stable` Boards that can run Android printing tests without flakes.
* `arcvm_data_migration` - Boards with ARCVM /data migration enabled.
* `arm` - The [arm] 32 and 64 bit processor architecture.
* `aslr` - Address space layout randomization, which mitigates buffer-overflow
attacks, is functional (this is not true for builds with [AddressSanitizer]
instrumentation built in).
* `auto_update_stable` - No suffix like -kernelnext and -arc-r in the board name.
Auto update to a stable version is possible.
* `autotest-capability:foo` - An [Autotest capability] named `foo`. See below.
* `biometrics_daemon` - The ability to process fingerprint authentication.
This implies the presence of the `biod` package.
* `boot_perf_info` - Reven (ChromeOS Flex) doesn't support boot performance metrics.
* `bpf` - Whether the platform (kernel) has the bpf syscall enabled.
* `breakpad` - Whether the platform supports the breakpad crash handler
for Chrome.
* `camera_720p` - The ability to capture video with frame size 1280x720.
* `camera_app` - The ability to run the builtin camera app.
* `camera_feature_auto_framing` - Whether Auto Framing is enabled on this platform.
* `camera_feature_effects` - Whether camera effects are enabled on this platform.
* `camera_feature_hdrnet` - Whether HDRnet is enabled on this platform.
* `camera_feature_portrait_mode` - Whether Portrait Mode is enabled on this platform.
* `camera_feature_super_res` - Whether single frame super resolution is enabled on this platform.
* `cert_provision` - The ability to use an additional cert_provision library
that supports an interface for provisioning machine-wide certificates and
using them for signing data on top of cryptohome dbus interface.
* `chrome` - Support for performing user login via Chrome (i.e. using
`session_manager` and `cryptohome`). This also implies that the
[chromeos-chrome] Portage package is installed (which also installs Chrome
binary tests), and that the `ui` Upstart job is present.
* `chromeless` - Explicit *lack* of support for login via Chrome.
* `chromeos_firmware` - Boards that use ChromeOS firmware.
* `chromeos_kernelci` - Whether the image built for https://chromeos.kernelci.org/ or not.
* `chrome_internal` - Functionality that is only available in internal builds
of Chrome (e.g. official branding). Any test that specifies this dependency
should also explicitly specify a `chrome` dependency.
* `coresched` - Whether device supports core scheduling feature for secure HT.
* `cpuidle_teo` - Availability of the TEO cpuidle governor.
* `cpu_heterogeneous` - Whether device has heterogeneous CPU topology.
* `cpu_vuln_sysfs` - Whether the platform has /sys/devices/system/cpu/vulnerabilities sysfs files
* `cras` - Whether the platform supports the ChromeOS Audio Server.
* `crashpad` - Whether the platform supports the crashpad crash handler for
Chrome.
* `cros_internal` - Functionality that is only available in internal builds of
ChromeOS (i.e. ones built using `chromeos-overlay`).
* `crossystem` - ChromeOS firmware/system interface utility.
* `crostini_stable` - Boards that can run Crostini tests reliably.
* `crostini_unstable` - Boards that cannot run Crostini tests reliably.
* `crosvm_gpu` - Boards that use hardware GPU acceleration in the guest VM environment.
* `crosvm_no_gpu` - Boards that use software GPU emulation in the guest VM environment.
* `crosvm_swap` - Boards that have crosvm's vmm-swap feature enabled.
* `csme_update` - Intel boards with updateable CSME firmware (volteer/dedede
onwards)
* `cups` - CUPS daemon.
* `device_crash` - Boards that can recover gracefully after a hard crash (e.g.
kernel crash)
* `diagnostics` - Boards that contain generic cross-platform
[Diagnostic utilities].
* `dlc` - Support of [Downloadable Content] (DLC).
* `dmverity_stable` - Kernels with which dm-verity runs stably. See [b/172227689](https://b.corp.google.com/issues/172227689).
* `dmverity_unstable` - Kernels having known issue of dm-verity causing random crashes. See [b/172227689](https://b.corp.google.com/issues/172227689).
* `dptf` - Support of [Intel Dynamic Platform and Thermal Framework] (DPTF).
* `drivefs` - Google Drive support enabled.
* `drm_atomic` - The [DRM/KMS] kernel subsystem supports atomic commits.
* `drm_trace` - The [DRM/KMS] kernel subsystem supports tracing using tracefs.
* `ec_crash` - Boards that have EC firmware, implement the `crash` EC command,
and produce a panicinfo file after a crash.
* `endorsement` - Whether the system have a valid endorsement certificate.
* `faceauth` - Whether the system has faceauth functionality enabled, go/cros-faceauth.
* `factory_flow`- Device is subject to the [go/chromeos-factory-flow](http://go/chromeos-factory-flow) (e.g. most devices).
* `fake_hps` - Whether the HPS daemon (go/cros-hps) uses a fake software
device for testing purposes.
* `fbpreprocessord`- Firmware dump processor daemon.
* `firewall` - Standard ChromeOS network firewall rules.
* `flashrom` - Userspace utility to update firmware.
* `flex_device` - Whether the device is a ChromeOS Flex device
* `flex_id` - Enable using [flex_id](http://go/chromeos-flex-id) for enrollment.
* `flex_internal` - Enable using flex_internal to pull in data (URLs, API keys, etc.) only needed by official Flex releases.
* `flex_hwis` - Enable using flex_hwis for hardware data sending.
* `gaia` - Support for performing user login via Chrome through Google account service
* `ghostscript` - Ghostscript and dependent packages are available for printing.
* `google_virtual_keyboard` - The proprietary Google onscreen virtual keyboard
(as opposed to the builtin open-source virtual keyboard).
* `gpu_sandboxing` - Chrome's GPU process is [sandboxed].
* `gsc` - Whether the platform has an onboard Google security chip.
* `has_recovery_mrc_cache` - Boards that have the RECOVERY_MRC_CACHE section.
* `houdini` - Availability of 32-bit Houdini library for ARC.
* `houdini64` - Availability of 64-bit Houdini library for ARC.
* `hostap_hwsim` - Whether system has the hostap project's test dependencies
(scripts, daemons) installed and configured appropriately.
* `hps` - Whether the system has the hps daemon and tools, go/cros-hps.
* `igt` - Boards that can run igt-gpu-tools tests
* `iioservice` - Whether the device has CrOS IIO Service running.
* `inference_accuracy_eval` - Whether the device has inference accuracy evaluation tools installed.
* `intel_psr` - Whether Intel PSR (platform service record) is supported or not.
* `ikev2` - The ability to run an IKEv2 VPN.
* `io_uring` - Whether the platform (kernel) has the io_uring syscalls enabled.
* `iwlwifi_rescan` - Ability to remove/rescan WiFi PCI device when the
hardware becomes non-responsive.
* `kfence_enabled` - Whether the kernel has kfence (CONFIG_KFENCE) enabled.
* `known_fixed_ssd` - Set when the fixed SSD location globs are defined. They are not for board:reven (the hardware is not fixed) and VMs, since the path
is either not defined (if taken directly from xxx-generic overlay) or already defined to real hardware location.
Only for betty we do defined a "hardware" path since that board is only used for VM.
* `kstack_random` - Whether the kernel has randomized kernel stack offsets (CONFIG_RANDOMIZE_KSTACK_OFFSET) enabled.
* `lacros` - Whether the system supports running [lacros].
* `lacros_stable` - Whether the system supports running [lacros] and is stable enough for CQ. [TODO: Remove this.](crbug.com/1412276)
* `lacros_unstable` - Whether the system supports running [lacros] and is not stable enough for CQ. [TODO: Remove this.](crbug.com/1412276)
* `landlock_enabled` - Whether the system supports the Landlock Linux Security Module.
* `lldb` - The presence of the local `lldb` binary, separate from `lldb-server`.
* `mbo` - WiFi MBO support.
* `memfd_create` - memfd_create function implemented in the kernel.
* `microcode` - Platforms that have CPU microcode.
* `ml_benchmark_drivers` - [ML benchmarking suite](http://go/roadrollerda)
* `ml_service` - ML Service daemon.
* `ml_tiered_support` - Platforms enabled for tiered benchmarking.
* `mosys` - Ability to run mosys command.
* `nacl` - Availability of the Native Client sandboxing technology.
* `ndk_translation` - Availability of 32-bit NDK translation library for ARC.
* `ndk_translation64` - Availability of 64-bit NDK translation library for
ARC.
* `nnapi` - Has the nnapi (libneuralnetworks.so) installed. Run minimal VTS tests.
* `nnapi_vendor_driver` - Run the full VTS / CTS test suite. Ignores VM's.
* `no_android` - The inability to run Android apps. This is the opposite of
the `android` feature; DUTs will have exactly one of these two features.
* `no_arm` - The absence of [arm] 32 bit userspace.
* `no_asan` - Build was not built with Address Sanitizer. Similar to `aslr`.
* `no_camera_feature_super_res` - Whether single frame super resolution is disabled on this platform.
* `no_chrome_dcheck` - Chrome/Chromium was not built with dcheck enabld.
* `no_downloads_bind_mount` - Disable Downloads bind mount and migrate files from ~/Downloads to ~/MyFiles/Downloads.
* `no_eth_loss_on_reboot` - Board does not lose ethernet on reboot. Context: b/178529170
* `no_fbpreprocessord` - Build was not built with `fbpreprocessord`, the firmware dump processor daemon.
* `no_iioservice` - Build was not built with CrOS IIO Service.
* `no_msan` - Build was not built with Memory Sanitizer.
* `no_ondevice_handwriting` - Doesn't have on-device handwriting recognition support. Either ml_service is not enabled, or if ml_service doesn't support `ondevice_handwriting`.
* `no_arc_userdebug` - Skip boards that ship ARC userdebug build.
* `no_arc_x86` - Skip on x86 architecture.
* `no_qemu` - For tests not for ChromeOS QEMU images.
* `no_symlink_mount` - Symlink mounting is disabled via the
`CONFIG_SECURITY_CHROMIUMOS_NO_SYMLINK_MOUNT` kernel option.
* `no_tablet_form_factor` - The device's primary form factor is not tablet
* `no_tpm2_simulator` - Built was not built with the simulator of Trusted Platform Module supporting TPMv2.
* `no_tpm_dynamic` - Build was not built with dynamic TPM.
* `no_ubsan` - Build was not built with Undefined Behavior Sanitizer.
* `no_vulkan` - Build was not built with [Vulkan] enabled.
* `no_arcvm_virtio_blk_data` - Build was not built with ARCVM virtio-blk /data enabled.
* `no_gsc` - Build was not built with onboard Google security chip support.
* `nmi_backtrace` - The Linux kernel has support for NMI backtraces.
* `npu` - Availability of NPU and its related software components to run AI models.
* `nvme` - Ability to run NVMe software utilities.
* `oci` - The ability to use the `run_oci` program to execute code within
[OCI] containers.
* `ocr` - [Optical Character Recognition Service] daemon.
* `ondevice_document_scanner` - On-device document scanner support in `ml_service` which installed document scanner library in rootfs.
This implies `ml_service`.
* `ondevice_document_scanner_rootfs_or_dlc` - On-device document scanner support in `ml_service`.
This implies `ml_service`.
* `ondevice_grammar` - On-device grammar check support in `ml_service`.
* `ondevice_handwriting` - On-device handwriting recognition support in `ml_service`.
* `ondevice_image_content_annotation` - On-device image content annotation support in `ml_service`.
* `ondevice_speech` - On-device speech recognition support in `ml_service`.
* `ondevice_text_suggestions` - On-device txt suggestions support in `ml_service`.
* `pinweaver` - Pinweaver support, either by GSC or Intel CSME.
This implies `ml_service`.
* `pidfd_open` - pidfd_open function implemented in the kernel.
* `play_store` - Boards where Google Play Store is supported.
* `plugin_vm` - The ability to run Plugin VMs.
* `print_brother_ql800_subset` - A subset of boards to test the Brother QL800 printer.
* `proprietary_codecs` - Indicates if Chrome supports proprietary video
codecs (e.g. H.264). This is supported by Chrome official builds and Chromium
builds with the |propietary_codecs| build flag set.
* `protected_content` - Platform has HW backed OEMCrypto implementation for Widevine
L1 HW DRM.
* `qemu` - For tests exclusive to ChromeOS QEMU images.
* `racc` - Whether [Runtime AVL Compliance Check] is available.
* `reboot` - The ability to reboot reliably during a remote test.
* `screenshot` - The [screenshot command] can save screenshots.
* `selinux` - An SELinux-enabled board. All Android boards are
SELinux-enabled.
* `selinux_current` - All SELinux-enabled boards except experimental boards.
This implies `selinux`.
* `selinux_experimental` - An experimental SELinux board. An experimental
board has `SELINUX=permissive` in `/etc/selinux/config`, thus no policy
will be enforced. This implies `selinux`.
* `shipping_kernel` - Debug-related kernel configs are not enabled.
* `smartdim` - Use smart dim to defer the imminent screen dimming.
* `smartctl` - Ability to run smartctl software utility.
* `stack_sampled_metrics` - Ability to run the stack profiler and gather
stack-sampled metrics.
* `storage_wearout_detect` - The ability to measure storage device health.
* `tablet_form_factor` - The device's primary form factor is tablet
* `tast_vm` - The test is running in a VM [managed by chromite](https://chromium.googlesource.com/chromiumos/chromite/+/HEAD/lib/cros_test.py#489).
* `tflite_opencl` - Skips boards which have issues with the OpenCL TFLite
delegate (b/233851820).
* `tflite_intel_openvino` - The availability of TFLite OpenVINO Delegate for NPU.
* `tflite_mtk_neuron` - The availability of TFLite Neuron Delegate for APU.
* `thread_safe_libva_backend` - Boards where the LIBVA backend is threadsafe.
* `tpm` - A [Trusted Platform Module] chip.
* `tpm_clear_allowed` - The device's TPM can be cleared.
* `tpm1` - Indicate a Trusted Platform Module supporting TPMv1.2 is available. Note that TPMv2 is not backward compatible.
* `tpm2` - Indicate a Trusted Platform Module supporting TPMv2 is available.
* `tpm2_simulator` - Indicate the simulator of Trusted Platform Module supporting TPMv2 is available.
* `tpm_dynamic` - Indicate the dynamic TPM is available.
* `transparent_hugepage` - [Transparent Hugepage] support in the Linux kernel.
* `unibuild` - The ChromeOS build is a unified build.
* `untrusted_vm` - The ability to run an untrusted VM.
* `usbguard` - The ability to allow or block USB devices based on policy.
* `usb_hid_wake` - The platform will register HID wake events to a usb device.
* `use_fscrypt_v1` - The board is set to use v1 fscrypt policy for user vault.
* `use_fscrypt_v2` - The board is set to use v2 fscrypt policy for user vault.
* `uvc_compliant` - The board has a UVC driver that is V4L2 compliant.
* `v4l2_codec` - Whether or not v4l2 video acceleration API is supported by this DUT.
* `vaapi` - Whether or not VA-API is supported by this DUT.
* `video_cards_ihd` - Boards that use the Intel Media Driver (also known as iHD) for VA-API.
* `video_decoder_direct` - The platform uses the VideoDecoder (VD) by default.
* `video_decoder_legacy` - The platform used the VideoDecodeAccelerator (VDA) by default.
* `video_decoder_legacy_supported` - Is the VDA is supported on this platform.
* `video_overlays` - The kernel [DRM/KMS] version atomic commits and the underlying hardware display controller support the NV12 DRM Plane format needed to promote videos to [hardware overlays].
* `virtual_multidisplay` - The platform supports virtual multi display testing (at the time of writing, only 6.1+ betty boards). This should be depended on for all multidisplay presubmit tests to run on betty.
* `virtual_susupend_time_injection` - The platform supports KVM virtual suspend time injection.
* `vm_host` - The ability to [run virtual machines].
* `vm_pmem` - The ability to enable [virtio-pmem] device on crosvm.
* `vpd` - The DUT has a VPD chip.
* `vulkan` - Whether [Vulkan] libraries are installed on the system image.
* `vulkan_composite` - Boards that support composition with [Vulkan].
* `watchdog` - watchdog daemon
* `wifi` - If this DUT has WiFi device.
* `wpa3_sae` - The ability to use WPA3-SAE authentication for WiFi.
* `wilco` - If this DUT is a [wilco] device. These features include
the DTC (Diagnostic and Telemetry Controller) VM, a special EC interface,
and a dock firmware updater.
* `wireguard` - The ability to run a WireGuard VPN.
* `no_kernel_upstream` - Skip boards with continuously-rebased kernel.
[amd64]: https://en.wikipedia.org/wiki/X86-64
[arm]: https://en.wikipedia.org/wiki/ARM_architecture
[run Android apps]: https://developer.android.com/topic/arc/
[Camera HAL3]: https://source.android.com/devices/camera/camera3
[Camera HAL1]: https://source.android.com/devices/camera#architecture-legacy
[Linux Video Capture]: https://chromium.googlesource.com/chromium/src/+/HEAD/media/capture/video/linux/
[AddressSanitizer]: https://github.com/google/sanitizers/wiki/AddressSanitizer
[Autotest capability]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/main/chromeos-base/autotest-capability-default/
[chromeos-chrome]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/main/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild
[media::VideoDecoder]: https://cs.chromium.org/chromium/src/media/base/video_decoder.h
[Diagnostic utilities]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/diagnostics/README.md
[Downloadable Content]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/dlcservice
[DRM/KMS]: https://www.kernel.org/doc/Documentation/gpu/drm-kms.rst
[hardware overlays]: https://en.wikipedia.org/wiki/Hardware_overlay
[Intel Dynamic Platform and Thermal Framework]: https://01.org/intel%C2%AE-dynamic-platform-and-thermal-framework-dptf-chromium-os
[lacros]: https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/lacros.md
[sandboxed]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux/sandboxing.md
[OCI]: https://www.opencontainers.org/
[Optical Character Recognition Service]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ocr/README.md
[Runtime AVL Compliance Check]: https://chromium.googlesource.com/chromiumos/platform2/+/refs/heads/main/runtime_probe/README.md
[screenshot command]: https://chromium.googlesource.com/chromiumos/platform2/+/main/screen-capture-utils/
[Trusted Platform Module]: https://en.wikipedia.org/wiki/Trusted_Platform_Module
[Transparent Hugepage]: https://www.kernel.org/doc/Documentation/vm/transhuge.txt
[run virtual machines]: https://www.chromium.org/chromium-os/developer-library/guides/containers/containers-and-vms/
[Vulkan]: https://www.khronos.org/vulkan/
[virtio-pmem]: https://crosvm.dev/book/devices/pmem/index.html
[virtual-usb-printer-readme]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/third_party/virtual-usb-printer/virtual_usb_printer/README.md
[wilco]: https://sites.google.com/corp/google.com/wilco/home
### New features
Features should be descriptive and precise. Consider a hypothetical test that
exercises authentication using a biometrics daemon that isn't present in system
images built to run on virtual machines. Instead of adding a `real_hardware` or
`non_vm` feature that is overly broad and will likely be interpreted as carrying
additional meaning beyond the original intent, add a `biometrics_daemon` feature
that precisely communicates the test's actual requirement.
Features are composed from USE flags and board names, which are statically
defined when the system image is built. As an example, the USE flags for Brya
devices are defined in [make.defaults]. [software_defs.go] lists boolean
expressions that are used to generate features; for example, an imaginary
feature named `hd_audio` with the expression
```go
cras && (audio_chipset_a || audio_chipset_b) && !broken_headphone_jack
```
will be reported as available on systems where the `cras` USE flag is set,
either `audio_chipset_a` or `audio_chipset_b` is set, and
`broken_headphone_jack` is explicitly *not* set.
A feature can depend on board names, too. Another imaginary feature
named `vm_graphics` with the expression
```go
"board:betty-pi-arc"
```
will be reported as available on `betty-pi-arc` board only.
Before a new `USE` flag can be used in an expression, it must be added to `IUSE`
in the [tast-use-flags] package. Local changes to the `tast-use-flags` ebuild
have to be pushed to the DUT manually to take effect:
```
cros workon --board=${BOARD} start chromeos-base/tast-use-flags
emerge-${BOARD} chromeos-base/tast-use-flags
cros deploy ${HOST} chromeos-base/tast-use-flags
```
When submitting changes to add new `USE` flags to the [tast-use-flags] package,
please use [Cq-Depend] in your commit messages to ensure that changes land in
the correct order.
If you're having trouble finding a way to specify your test's dependencies,
please ask for help on the [tast-users mailing list].
[make.defaults]: https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/main/overlay-brya/profiles/base/make.defaults
[software_defs.go]: https://chromium.googlesource.com/chromiumos/platform/tast/+/main/src/go.chromium.org/tast/core/internal/crosbundle/software_defs.go
[tast-use-flags]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/main/chromeos-base/tast-use-flags/
[Cq-Depend]: https://www.chromium.org/chromium-os/developer-library/guides/development/contributing/#cl-dependencies
[tast-users mailing list]: https://groups.google.com/a/chromium.org/g/tast-users
#### Example changes
See the following changes for an example of adding a new `containers` software
feature based on the `containers` USE flag and making a test depend on it:
* `chromiumos-overlay` repository: <https://crrev.com/c/1382877>
* `tast` repository: <https://crrev.com/c/1382621>
* `tast-tests` repository: <https://crrev.com/c/1382878>
(Note that the `containers` feature has since been renamed to `oci`.)
### autotest-capability
There are also `autotest-capability:`-prefixed features, which are added by the
[autocaps package] as specified by YAML files in
`/usr/local/etc/autotest-capability`. This exists in order to support porting
existing Autotest-based video tests to Tast. Do not depend on capabilities from
outside of video tests.
[autocaps package]: https://godoc.org/chromium.googlesource.com/chromiumos/platform/tast.git/src/go.chromium.org/tast/core/autocaps/
## Hardware dependencies
Tast provides a way to run/skip tests based on the device characteristics.
Note that "device characteristics" here only consists of information that can
be determined solely based on the DUT, without depending on the other
surrounding environment, such as some config files on DUT.
The examples of the device characteristics are as follows:
* Whether the device has a touch screen.
* Whether the device has fingerprint.
* Whether the device has an internal display.
For example, in order to run tests on DUT where touchscreen is available,
the dependency can be declared in the `HardwareDeps` field of `testing.Test`.
```go
func init() {
testing.AddTest(&testing.Test{
...
HardwareDeps: hwdep.D(hwdep.Touchscreen()),
...
})
}
```
You can provide multiple `Condition`s to `hwdep.D`. In the case,
the test will run only on DUTs where all the conditions are satisfied.
You can find the full list of supported conditions in the [hwdep package].
Note that there are special kinds of hardware dependencies, named `Model` and
`SkipOnModel`.
With these dependencies, tests will be controlled based on the device type names,
rather than the device characteristics.
In general, it is recommended *not* to use these conditions. If you feel you need
these conditions, it is recommended to reconsider whether there is an alternative
(and more appropriate) condition.
Examples of their expected use cases are:
* There are known issues in a driver of a specific device, which cannot be
fixed immediately. The test is stable on other models, and we would like
to promoted it to critical.
* There is a test running as informational. Flakiness failures are found
only on a few models, but the test is stable on other models.
With depending models, we can promote the test to critical on
most of models, except ones where the test results flakiness.
In this case, it is expected that a dedicated engineer is assigned to
investigate the cause and its fix.
[hwdep package]: https://chromium.googlesource.com/chromiumos/platform/tast/+/main/src/go.chromium.org/tast/core/testing/hwdep/
### Adding new hardware conditions
In order to guarantee forward compatibility in ChromeOS infra,
each `Condition` should be based on the
`chromiumos.config.api.HardwareFeatures` protobuf schema.
For example, the `hwdep.Touchscreen()` can check
whether `Screen.TouchSupport` is set to `HardwareFeatures_PRESENT`.
Note that currently a `chromiumos.config.api.HardwareFeatures` instance is
generated internally by Tast at runtime, so only limited fields are filled.
In the future, ChromeOS Infra test scheduler will be responsible for checking
hardware dependencies before running Tast tests.
Here is an example end-to-end workflow:
Let’s assume that a developer wants to add a new Tast test which requires a new
hardware feature to be used in the test hardware constraints (e.g. “wifi chip
vendor name is X”).
1. The developer makes a change for that hardware feature.
* The developer files a CL for a change to the schema
[(config/api/topology.proto)][1] to add a new field for the feature.
* A domain expert approves the change in the .proto file
[(config/api/topology.proto)][1]. [(Example CL)][2]
1. To test locally, run these commands to regenerate the go proto bindings.
```
~/chromiumos/src/config/generate.sh
cros workon --host start cros-config-api
sudo emerge cros-config-api
```
1. The developer waits until the CL in #1 is landed, then implements
some functions in the Tast framework supporting the new feature(s) using the
new message type.
* The Tast team reviews and approves such a change to Tast.
[Here is an example CL][3] which puts some data into the protobuf in Tast.
1. The developer writes test(s) with hwdeps in its test metadata using the
above function in Tast.
[1]: https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/go.chromium.org/chromiumos/config/proto/chromiumos/config/api/topology.proto
[2]: https://chromium-review.googlesource.com/c/chromiumos/config/+/2249691/4/proto/chromiumos/config/api/topology.proto
[3]: https://chromium-review.googlesource.com/c/chromiumos/platform/tast/+/2335615