Skip to content

Commit

Permalink
flutter test --wasm support (flutter#145347)
Browse files Browse the repository at this point in the history
* Adds support for `flutter test --wasm`.
  * The test compilation flow is a bit different now, so that it supports compilers other than DDC. Specifically, when we run a set of unit tests, we generate a "switchboard" main function that imports each unit test and runs the main function for a specific one based off of a value set by the JS bootstrapping code. This way, there is one compile step and the same compile output is invoked for each unit test file.
* Also, removes all references to `dart:html` from flutter/flutter.
* Adds CI steps for running the framework unit tests with dart2wasm+skwasm
  * These steps are marked as `bringup: true`, so we don't know what kind of failures they will result in. Any failures they have will not block the tree at all yet while we're still in `bringup: true`. Once this PR is merged, I plan on looking at any failures and either fixing them or disabling them so we can get these CI steps running on presubmit.

This fixes flutter#126692
  • Loading branch information
eyebrowsoffire committed Mar 21, 2024
1 parent 98d10b6 commit 31209d0
Show file tree
Hide file tree
Showing 62 changed files with 950 additions and 362 deletions.
184 changes: 184 additions & 0 deletions .ci.yaml
Expand Up @@ -1725,6 +1725,190 @@ targets:
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_0
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "0"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_1
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "1"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_2
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "2"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_3
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "3"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_4
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "4"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_5
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "5"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_6
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "6"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_skwasm_tests_7_last
bringup: true
recipe: flutter/flutter_drone
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:34v3"},
{"dependency": "chrome_and_driver", "version": "version:119.0.6045.9"},
{"dependency": "goldctl", "version": "git_revision:720a542f6fe4f92922c3b8f0fdcc4d2ac6bb83cd"}
]
shard: web_skwasm_tests
subshard: "7_last"
tags: >
["framework", "hostonly", "shard", "linux"]
# Retry for flakes caused by https://github.com/flutter/flutter/issues/132654
presubmit_max_attempts: "2"
runIf:
- dev/**
- packages/**
- bin/**
- .ci.yaml

- name: Linux web_tool_tests
recipe: flutter/flutter_drone
timeout: 60
Expand Down
5 changes: 3 additions & 2 deletions TESTOWNERS
Expand Up @@ -286,7 +286,7 @@
/dev/devicelab/bin/tasks/technical_debt__cost.dart @HansMuller @flutter/framework
/dev/devicelab/bin/tasks/web_benchmarks_canvaskit.dart @yjbanov @flutter/web
/dev/devicelab/bin/tasks/web_benchmarks_html.dart @yjbanov @flutter/web
/dev/devicelab/bin/tasks/web_benchmarks_skwasm.dart @jacksongardner @flutter/web
/dev/devicelab/bin/tasks/web_benchmarks_skwasm.dart @eyebrowsoffire @flutter/web
/dev/devicelab/bin/tasks/windows_home_scroll_perf__timeline_summary.dart @jonahwilliams @flutter/engine
/dev/devicelab/bin/tasks/windows_startup_test.dart @loic-sharma @flutter/desktop

Expand Down Expand Up @@ -325,7 +325,7 @@
# flutter_plugins @stuartmorgan @flutter/plugin
# framework_tests @HansMuller @flutter/framework
# fuchsia_precache @christopherfujino @flutter/tool
# realm_checker @jacksongardner @flutter/tool
# realm_checker @eyebrowsoffire @flutter/tool
# skp_generator @Hixie
# test_ownership @keyonghan
# tool_host_cross_arch_tests @andrewkolos @flutter/tool
Expand All @@ -336,4 +336,5 @@
# web_integration_tests @yjbanov @flutter/web
# web_long_running_tests @yjbanov @flutter/web
# web_tests @yjbanov @flutter/web
# web_skwasm_tests @eyebrowsoffire @flutter/web
# web_tool_tests @eliasyishak @flutter/tool
32 changes: 28 additions & 4 deletions dev/bots/test.dart
Expand Up @@ -242,6 +242,8 @@ Future<void> main(List<String> args) async {
'web_tests': _runWebHtmlUnitTests,
// All the unit/widget tests run using `flutter test --platform=chrome --web-renderer=canvaskit`
'web_canvaskit_tests': _runWebCanvasKitUnitTests,
// All the unit/widget tests run using `flutter test --platform=chrome --wasm --web-renderer=skwasm`
'web_skwasm_tests': _runWebSkwasmUnitTests,
// All web integration tests
'web_long_running_tests': _runWebLongRunningTests,
'flutter_plugins': _runFlutterPackagesTests,
Expand Down Expand Up @@ -1117,14 +1119,18 @@ Future<void> _runFrameworkCoverage() async {
}

Future<void> _runWebHtmlUnitTests() {
return _runWebUnitTests('html');
return _runWebUnitTests('html', false);
}

Future<void> _runWebCanvasKitUnitTests() {
return _runWebUnitTests('canvaskit');
return _runWebUnitTests('canvaskit', false);
}

Future<void> _runWebUnitTests(String webRenderer) async {
Future<void> _runWebSkwasmUnitTests() {
return _runWebUnitTests('skwasm', true);
}

Future<void> _runWebUnitTests(String webRenderer, bool useWasm) async {
final Map<String, ShardRunner> subshards = <String, ShardRunner>{};

final Directory flutterPackageDirectory = Directory(path.join(flutterRoot, 'packages', 'flutter'));
Expand Down Expand Up @@ -1160,6 +1166,7 @@ Future<void> _runWebUnitTests(String webRenderer) async {
index * testsPerShard,
(index + 1) * testsPerShard,
),
useWasm,
);
}

Expand All @@ -1175,16 +1182,19 @@ Future<void> _runWebUnitTests(String webRenderer) async {
(webShardCount - 1) * testsPerShard,
allTests.length,
),
useWasm,
);
await _runFlutterWebTest(
webRenderer,
path.join(flutterRoot, 'packages', 'flutter_web_plugins'),
<String>['test'],
useWasm,
);
await _runFlutterWebTest(
webRenderer,
path.join(flutterRoot, 'packages', 'flutter_driver'),
<String>[path.join('test', 'src', 'web_tests', 'web_extension_test.dart')],
useWasm,
);
};

Expand Down Expand Up @@ -1333,11 +1343,19 @@ Future<void> _runWebLongRunningTests() async {
'html',
path.join(flutterRoot, 'packages', 'integration_test'),
<String>['test/web_extension_test.dart'],
false,
),
() => _runFlutterWebTest(
'canvaskit',
path.join(flutterRoot, 'packages', 'integration_test'),
<String>['test/web_extension_test.dart'],
false,
),
() => _runFlutterWebTest(
'skwasm',
path.join(flutterRoot, 'packages', 'integration_test'),
<String>['test/web_extension_test.dart'],
true,
),
];

Expand Down Expand Up @@ -2302,13 +2320,19 @@ Future<void> _runWebDebugTest(String target, {
}
}

Future<void> _runFlutterWebTest(String webRenderer, String workingDirectory, List<String> tests) async {
Future<void> _runFlutterWebTest(
String webRenderer,
String workingDirectory,
List<String> tests,
bool useWasm,
) async {
await runCommand(
flutter,
<String>[
'test',
'-v',
'--platform=chrome',
if (useWasm) '--wasm',
'--web-renderer=$webRenderer',
'--dart-define=DART_HHH_BOT=$_runningInDartHHHBot',
...flutterTestArgs,
Expand Down
13 changes: 8 additions & 5 deletions dev/integration_tests/web/lib/framework_stack_trace.dart
Expand Up @@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:html' as html;
import 'dart:js_interop';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:meta/dart2js.dart';
import 'package:web/web.dart' as web;

// Tests that the framework prints stack traces in all build modes.
//
Expand Down Expand Up @@ -35,10 +36,12 @@ Future<void> main() async {
}

print(output);
html.HttpRequest.request(
'/test-result',
method: 'POST',
sendData: '$output',
web.window.fetch(
'/test-result'.toJS,
web.RequestInit(
method: 'POST',
body: '$output'.toJS,
)
);
}

Expand Down
13 changes: 8 additions & 5 deletions dev/integration_tests/web/lib/service_worker_test.dart
Expand Up @@ -2,10 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:html' as html;
import 'dart:js_interop';

import 'package:web/web.dart' as web;

Future<void> main() async {
await html.window.navigator.serviceWorker?.ready;
const String response = 'CLOSE?version=1';
await html.HttpRequest.getString(response);
html.document.body?.appendHtml(response);
await web.window.navigator.serviceWorker.ready.toDart;
final JSString response = 'CLOSE?version=1'.toJS;
await web.window.fetch(response).toDart;
web.document.body?.append(response);
}
Expand Up @@ -2,9 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:html' as html;
import 'dart:js_interop';

import 'package:web/web.dart' as web;

Future<void> main() async {
const String response = 'CLOSE?version=1';
await html.HttpRequest.getString(response);
html.document.body?.appendHtml(response);
final JSString response = 'CLOSE?version=1'.toJS;
await web.window.fetch(response).toDart;
web.document.body?.append(response);
}

0 comments on commit 31209d0

Please sign in to comment.