Files
sdk/pkg/dynamic_modules/test/data
Alexander Markov d95e527aab [dyn_modules] Improve support for extendable mixins with private members
When mixin is applied, its instance members are cloned and copies
of the members would override original members.

This change fixes bugs and improved usability of extendable mixins with
private members:

- All instance members of extendable mixins and mixin classes are
  marked as can-be-overridden to allow overriding by cloned members
  when mixin is applied.

- TFA no longer takes privacy into account, as private members of
  mixins can be overridden by their clones in other libraries.

- Dynamic module validator always unwraps cloned members to originals
  before verifying if overriding is allowed. This eliminates overriding
  errors between clone(s) and original members of mixins.

TEST=pkg/dynamic_modules/test/data/mixin_private_member1,
     pkg/dynamic_modules/test/data/mixin_private_member2

Fixes b/470461203
Fixes b/469094721

Change-Id: If369c42c58e5ea4d707be83b1e7078ee9a8cc3ce
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/470803
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2026-01-07 08:26:38 -08:00
..

Tests for Dart dynamic modules

This folder contains tests for an experiment of implementing dynamic modules in Dart. All tests are written in the style of the language end-to-end tests.

Folder structure

Each folder consists of a single test scenario. You'll find 4 kinds of files:

  • main.dart: the host application that will later load dynamic modules. This will be the core driver of the test.

  • shared/: folder containing multiple libraries with code that can be used by both the host application and dynamic modules.

  • modules/: folder containing code private to dynamic modules. It includes libraries with common code as well as an entrypoint file per dynamic module. Entrypoint files are named entryN.dart and must define an exported dynamic module entrypoint. Note: semantics limit that two dynamic modules can't share code unless they are compiled in a chained fashion, currently the test harness focuses on compiling modules in isolation and ensuring conflicts don't arise.

  • dynamic_interface.yaml: a contract specifying what parts of the host application and libraries in shared/ are visible to dynamic modules.

Execution

We've build a test framework that frontloads compilation, so that execution of the test can be streamlined. This means that:

  • The host app will be compiled first, using dynamic_interface.yaml as a specification for AOT compilers.

  • Each and every dynamic module entrypoint in modules/ will be compiled to create a dynamic module artifact.

  • Finally an execution environment will be launched that will in turn load each dynamic module as prompted by the test logic.

Commands to drive the loading and execution of each dynamic module are controlled by a helper library in ../common/testing.dart, which uses the Dart SDK API and abstracts away differences between platforms.

Example

Refer to update_top_level. This is one of the simplest tests that illustrates the utilities and concepts in this framework.