blob: 84ec14fc025df08f04b4142ab59dc02e2c000379 [file] [log] [blame] [view]
# FIDL API compatibility testing
Note: Compatibility testing documents are being overhauled in Q2
2024. Some information in this document is out of date. See
https://fxbug.dev/339893257 for details.
We use API compatibility tests to ensure that SDK Users targeting supported platform
API levels aren't broken by changes to FIDL APIs at tip of tree. All FIDL APIs published in
the [partner Fuchsia SDKs][SDK Categories] should be automatically tested for backward API
compatibility. This document describes what API compatibility tests are and how to use
them.
## Concepts
### FIDL versioning
The reader should be familiar with [FIDL versioning].
### API levels
To understand API compatibility tests, it's important to have a basic understanding of
[Fuchsia API levels]. An API level denotes the set of APIs available when building an
application. They are unsigned 64-bit integers which are assigned to the Fuchsia platform
in increasing order.
There are two API levels that are useful to keep in mind:
1. An in-development API level - This is what Fuchsia developers make additive changes to.
2. A stable API level - This level is stable and its surface area will not change.
The current implementation of platform versioning does not yet reflect this:
In the Fuchsia source tree, we record API and ABI version history, as well as level
status ("in-development" and "supported" aka stable) at
[//sdk/version_history.json](/sdk/version_history.json).
### API level evolution
An API level goes through several phases, illustrated by the following diagram:
```
+----------------+ freeze +--------+ drop +-------------+
START -> | in-development | -----> | stable | -----> | unsupported |
+----------------+ +--------+ +-------------+
```
__In-development__
In this phase the API level is in active evolution, as new API elements
may be introduced, deprecations may be introduced, etc.
Breaking changes to APIs introduced at this level are not allowed and contributors
should make sure there are no partners still relying on APIs removed at this level.
__Stable__
The API level can no longer receive changes. Contributors should start introducing
APIs to partners at the next in-development API level. When we "freeze" an API
level, the level may no longer receive changes. This usually happens immediately
before a branch cut. It will remain supported for at least 6 weeks or until
the Fuchsia platform
drops support for it. APIs can be deprecated at this level but not deleted.
__Unsupported__
When we drop support for a level, Fuchsia contributors are free to delete or
modify any APIs at this level, and we
stop running compatibility tests for this level. There's no longer any guarantee
that end users can successfully
target this API level.
## Resolving compatibility issues
Usually compatibility issues can be fixed by adding `@available` annotations on FIDL
declarations.
Below are some good guidelines to follow when changing FIDL APIs.
1. Annotate new, not-yet-stable APIs with `@available(added=HEAD)`.
1. Annotate newly stable APIs that are ready to go to partners and will not change
with `@available(added=NEXT)`.
1. When removing an API, first make sure no partners are still using the API, then
annotate the old API with `@available(..., removed=NEXT)`.
For more examples, see the [API evolution guide] and the [FIDL compatibility guide].
[FIDL versioning]: /docs/reference/fidl/language/versioning.md
[Fuchsia API levels]: /docs/contribute/governance/rfcs/0002_platform_versioning.md
[SDK Categories]: /docs/contribute/governance/rfcs/0165_sdk_categories.md
[FIDL compatibility guide]: /docs/development/languages/fidl/guides/compatibility/README.md
[API evolution guide]: /docs/development/api/evolution.md