blob: 85a9e48d7353be4ccd65fa042063d17f1dac3b29 [file] [log] [blame] [view] [edit]
# Contributing to the Flutter engine
_See also: [Flutter's code of conduct][code_of_conduct]_
## Welcome
For an introduction to contributing to Flutter, see [our contributor
guide][contrib_guide].
For specific instructions regarding building Flutter's engine, see [Setting up
the Engine development environment][engine_dev_setup] on our wiki. Those
instructions are part of the broader onboarding instructions described in the
contributing guide.
## Style
The Flutter engine follows Google style for the languages it uses:
- [C++](https://google.github.io/styleguide/cppguide.html)
- **Note**: The Linux embedding generally follows idiomatic GObject-based C
style. Use of C++ is discouraged in that embedding to avoid creating hybrid
code that feels unfamiliar to either developers used to working with
`GObject` or C++ developers. For example, do not use STL collections or
`std::string`. Exceptions:
- C-style casts are forbidden; use C++ casts.
- Use `nullptr` rather than `NULL`.
- Avoid `#define`; for internal constants use `static constexpr` instead.
- [Objective-C][objc_style] (including [Objective-C++][objcc_style])
- [Java][java_style]
C/C++ and Objective-C/C++ files are formatted with `clang-format`, and GN files
with `gn format`.
[code_of_conduct]: https://github.com/flutter/flutter/blob/master/CODE_OF_CONDUCT.md
[contrib_guide]: https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md
[engine_dev_setup]: https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment
[objc_style]: https://google.github.io/styleguide/objcguide.html
[objcc_style]: https://google.github.io/styleguide/objcguide.html#objective-c
[java_style]: https://google.github.io/styleguide/javaguide.html
## Testing
The testing policy for contributing to the flutter engine can be found at the
[Tree Hygiene Wiki][tree_hygiene_wiki]. The summary is that all PR's to the
engine should be tested or have an explicit test exemption.
Because the engine targets multiple platforms the testing infrastructure is
fairly complicated. Here are some more resources to help guide writing tests:
- [Testing the engine wiki][testing_the_engine_wiki] - A guide on writing tests
for the engine including an overview of the different tests and the different
technologies the engine uses.
- [`//testing`](./testing) - This is where the `run_tests.py` script is located.
All tests will have the ability to be executed with `run_tests.py`.
- [`//ci/builders`](./ci/builders) - The JSON files that determine how tests are
executed on CI.
Tests will be executed on CI, but some tests will be executed before PR's can be
merged (presubmit) and others after they have been merged (postsubmit). Ideally
everything would be presubmit but tests that take up more resources are executed
in postsubmit.
### Skia Gold
The Flutter engine uses [Skia Gold][skia_gold] for image comparison tests which fail if:
- The image is different from an accepted baseline.
- An image is not uploaded but is expected to be (see
[`dir_contents_diff`][dir_contents_diff]).
[skia_gold]: https://flutter-engine-gold.skia.org/
[dir_contents_diff]: ./tools/dir_contents_diff/
Any untriaged failures will block presubmit and postsubmit tests.
### Example run_tests.py invocation
```sh
# Configure host build for macOS arm64 debug.
$ flutter/tools/gn --runtime-mode=debug --unoptimized --no-lto --mac-cpu=arm64
# Compile default targets (should cover all applicable run_tests.py requirements).
$ ninja -j100 -C out/host_debug_unopt_arm64
# Run all cross-platform C++ tests for the debug build arm64 variant.
$ cd flutter/testing
$ ./run_tests.py --variant=host_debug_unopt_arm64 --type=engine
```
### Directory
| Name | run_tests.py type | Description |
| ---------------------------------------- | ------------------- | --------------------------------------------------------------- |
| accessibility_unittests | engine | |
| client_wrapper_glfw_unittests | engine | |
| client_wrapper_unittests | engine | |
| common_cpp_core_unittests | engine | |
| common_cpp_unittests | engine | |
| dart_plugin_registrant_unittests | engine | |
| display_list_rendertests | engine | |
| display_list_unittests | engine | |
| embedder_a11y_unittests | engine | |
| embedder_proctable_unittests | engine | |
| embedder_unittests | engine | |
| felt | n/a | The test runner for flutter web. See //lib/web_ui |
| flow_unittests | engine | |
| flutter_tester | dart | Launcher for engine dart tests. |
| fml_arc_unittests | engine | |
| fml_unittests | engine | Unit tests for //fml |
| framework_common_unittests | engine(mac) | |
| gpu_surface_metal_unittests | engine(mac) | |
| impeller_dart_unittests | engine | |
| impeller_golden_tests | engine(mac) | Generates golden images for impeller (vulkan, metal, opengles). |
| impeller_unittests | engine | impeller unit tests and interactive tests |
| ios_test_flutter | objc | dynamic library of objc tests to be run with XCTest |
| jni_unittests | engine(not windows) | |
| no_dart_plugin_registrant_unittests | engine | |
| platform_view_android_delegate_unittests | engine(not windows) | |
| runtime_unittests | engine | |
| shell_unittests | engine(not windows) | |
| scenario_app | android | Integration and golden tests for Android, iOS |
| testing_unittests | engine | |
| tonic_unittests | engine | Unit tests for //third_party/tonic |
| txt_unittests | engine(linux) | |
| ui_unittests | engine | |
[tree_hygiene_wiki]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
[testing_the_engine_wiki]: https://github.com/flutter/flutter/wiki/Testing-the-engine
## Fuchsia Contributions from Googlers
Googlers contributing to Fuchsia should follow the additional steps at:
go/flutter-fuchsia-pr-policy.