blob: 6f33e7ef738242e9fba2da3bdd9834f3a15af1a1 [file] [log] [blame] [view]
# Compatibility Test Suite
This directory contains the Fuchsia Compatibility Test Suite (CTS). The Fuchsia
CTS is a set of tests designed to provide coverage for Application Programming
Interface (API) and Application Binary Interface (ABI) elements (e.g., headers,
FIDL files) made available to developers via a Fuchsia SDK. It was originally
proposed as [RFC
0015](https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0015_cts).
To learn more, see our documentation on
[fuchsia.dev](https://fuchsia.dev/fuchsia-src/development/testing/cts/overview).
See [//sdk/ctf/examples] for some examples, or peruse the complete set
of tests under [//sdk/ctf/tests].
## //sdk/ctf Directory structure
A brief rundown of the //sdk/ctf directory layout:
* **build/**: CTS-specific build rules and scripts.
* **canary/**: Files that allow us to modify the CTS tests running in the
canary release.
* **data/**: Location of static metadata that will be packaged alongside
the tests in each CTS release.
* **examples/**: Example test cases running in the CTS.
* **plasa/**: Build rules, scripts and config files for generating the
Platform Surface Area (PlaSA) definition files.
* **release/**: Files that allow us to modify the CTS tests running in
main CTS releases. Also includes scripts for validating any given CTS release.
* **tests/**: Location of the tests in this Compatibility Test Suite.
* **util/**: Binaries and utilities needed to run individual end-to-end CTS
tests.
## Contributing tests
See the [CTS Contributing Guide].
## Running example tests
To run example tests:
```
fx set core.qemu-64 --with //sdk/ctf/examples/
fx test //sdk/ctf/examples/
```
#### Language
##### Target-side tests
Tests for particular headers must be written in a language that supports that
header. C headers currently target C11 and C++11 and above. C++ headers
currently target C++14 and above. This policy may change as we build a larger
test corpus and decide how to enforce C++14 compatibility.
All tests that target API should be written in a language that is supported for
end developers per the [Fuchsia language policy]. The CTS currently only
provides direct support for C++ for tests that target API.
Tests that are only intended to exercise ABI may be written in any language
supported for use in the Fuchsia Platform Source Tree, including Rust. This
may, for example, include tests that check startup handles or the format of the
VDSO.
For the most part, tests that exercise FIDL definitions and other APIs shipped
with SDKs are API tests that should be written in C++. However, if this places
an undue burden on test authorship (e.g., there are large frameworks needed for
the test or a substantial body of appropriate existing tests that are written in
Rust), we can make exceptions. Note the following:
* If you do not use C++, your API will not undergo build time compatibility
testing. This places a burden on anyone trying to deploy an SDK, because
changes to your API are more likely to break compilation of petal code.
* If there are large test frameworks or libraries that you need to use to write
tests for public APIs, and they are only written in a language that is not
officially supported for SDK users (see the [Fuchsia language policy] doc),
that means that there is a form of testing that you need for exercising
developer use cases that you are not providing to developers. Consider
whether those test frameworks should be provided in a language that is
supported for end-developers.
* There will be a high bar for language exceptions for teams that wish to use
other languages only because of unfamiliarity with C++. We encourage API
developers to understand how end-developers use their APIs.
For information about exceptions to the C++-only policy, file a bug in the [CTS
bug component].
##### Host-side tests
For end-to-end tests and scripts that run on the host, we support the use of
Dart (and, specifically `sl4f`).
#### Dependencies
Since tests are designed to exercise the SDK APIs and ABIs, dependencies on SDK
elements (tools, APIs) are allowed.
See the section on [build support](#Build-support) for information on including
new dependencies on first-party code.
In order to avoid relying on third party use of the SDK to test the SDK, CTS
tests that run on-device do not rely on third party frameworks that rely on the
SDK to build. This is why we use `zxtest` instead of `gtest`. If you want to
include a third party dependency, file a bug in the [CTS bug component] to reach
out to the team to discuss it.
Code that runs on the host does not have this restriction.
[CTS Contributing Guide]: /docs/development/testing/cts/contributing_tests.md
[Fuchsia language policy]: https://fuchsia.dev/fuchsia-src/contribute/governance/policy/programming_languages
[CTS bug component]: https://bugs.fuchsia.dev/p/fuchsia/templates/detail?saved=1&template=Fuchsia%20Compatibility%20Test%20Suite%20%28CTS%29&ts=1627669234
[//sdk/ctf/examples]: https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/sdk/ctf/examples/
[//sdk/ctf/tests]: https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/sdk/ctf/tests/