[flutter_tools] ensure track-widget-creation can be disabled on Android/macOS (#56203)
Ensure --no-track-widget-creation is piped through android/macOS. Adds integration testing for iOS/android/macOS
This commit is contained in:
parent
22239f4183
commit
6dc1e83f12
15
dev/devicelab/bin/tasks/android_enable_twc.dart
Normal file
15
dev/devicelab/bin/tasks/android_enable_twc.dart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter_devicelab/framework/adb.dart';
|
||||||
|
import 'package:flutter_devicelab/framework/framework.dart';
|
||||||
|
import 'package:flutter_devicelab/tasks/track_widget_creation_enabled_task.dart';
|
||||||
|
|
||||||
|
/// Verify that twc can be enabled/disabled on Android
|
||||||
|
Future<void> main() async {
|
||||||
|
deviceOperatingSystem = DeviceOperatingSystem.android;
|
||||||
|
await task(TrackWidgetCreationEnabledTask().task);
|
||||||
|
}
|
15
dev/devicelab/bin/tasks/ios_enable_twc.dart
Normal file
15
dev/devicelab/bin/tasks/ios_enable_twc.dart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter_devicelab/framework/adb.dart';
|
||||||
|
import 'package:flutter_devicelab/framework/framework.dart';
|
||||||
|
import 'package:flutter_devicelab/tasks/track_widget_creation_enabled_task.dart';
|
||||||
|
|
||||||
|
/// Verify that twc can be enabled/disabled on iOS
|
||||||
|
Future<void> main() async {
|
||||||
|
deviceOperatingSystem = DeviceOperatingSystem.ios;
|
||||||
|
await task(TrackWidgetCreationEnabledTask().task);
|
||||||
|
}
|
13
dev/devicelab/bin/tasks/mac_enable_twc.dart
Normal file
13
dev/devicelab/bin/tasks/mac_enable_twc.dart
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter_devicelab/framework/framework.dart';
|
||||||
|
import 'package:flutter_devicelab/tasks/track_widget_creation_enabled_task.dart';
|
||||||
|
|
||||||
|
/// Verify that twc can be enabled/disabled on macOS
|
||||||
|
Future<void> main() async {
|
||||||
|
await task(TrackWidgetCreationEnabledTask('macos').task);
|
||||||
|
}
|
13
dev/devicelab/bin/tasks/web_enable_twc.dart
Normal file
13
dev/devicelab/bin/tasks/web_enable_twc.dart
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter_devicelab/framework/framework.dart';
|
||||||
|
import 'package:flutter_devicelab/tasks/track_widget_creation_enabled_task.dart';
|
||||||
|
|
||||||
|
/// Verify that twc can be enabled/disabled on the web.
|
||||||
|
Future<void> main() async {
|
||||||
|
await task(TrackWidgetCreationEnabledTask('chrome').task);
|
||||||
|
}
|
130
dev/devicelab/lib/tasks/track_widget_creation_enabled_task.dart
Normal file
130
dev/devicelab/lib/tasks/track_widget_creation_enabled_task.dart
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:vm_service/vm_service.dart';
|
||||||
|
import 'package:vm_service/vm_service_io.dart';
|
||||||
|
import 'package:flutter_devicelab/framework/adb.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
import 'package:flutter_devicelab/framework/framework.dart';
|
||||||
|
import 'package:flutter_devicelab/framework/utils.dart';
|
||||||
|
|
||||||
|
final Directory integrationTestDir = Directory(
|
||||||
|
path.join(flutterDirectory.path, 'dev/integration_tests/ui'),
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Verifies that track-widget-creation can be enabled and disabled.
|
||||||
|
class TrackWidgetCreationEnabledTask {
|
||||||
|
TrackWidgetCreationEnabledTask([this.deviceIdOverride]);
|
||||||
|
|
||||||
|
String deviceIdOverride;
|
||||||
|
|
||||||
|
Future<TaskResult> task() async {
|
||||||
|
final File file = File(path.join(integrationTestDir.path, 'info'));
|
||||||
|
if (file.existsSync()) {
|
||||||
|
file.deleteSync();
|
||||||
|
}
|
||||||
|
bool failed = false;
|
||||||
|
String message = '';
|
||||||
|
if (deviceIdOverride == null) {
|
||||||
|
final Device device = await devices.workingDevice;
|
||||||
|
await device.unlock();
|
||||||
|
deviceIdOverride = device.deviceId;
|
||||||
|
}
|
||||||
|
await inDirectory<void>(integrationTestDir, () async {
|
||||||
|
section('Running with track-widget-creation enabled');
|
||||||
|
final Process runProcess = await startProcess(
|
||||||
|
path.join(flutterDirectory.path, 'bin', 'flutter'),
|
||||||
|
flutterCommandArgs('run', <String>[
|
||||||
|
'--vmservice-out-file=info',
|
||||||
|
'--track-widget-creation',
|
||||||
|
'-v',
|
||||||
|
'-d',
|
||||||
|
deviceIdOverride,
|
||||||
|
path.join('lib/track_widget_creation.dart'),
|
||||||
|
]),
|
||||||
|
environment: <String, String>{
|
||||||
|
'FLUTTER_WEB': 'true',
|
||||||
|
'FLUTTER_MACOS': 'true'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
runProcess.stdout
|
||||||
|
.transform(utf8.decoder)
|
||||||
|
.transform(const LineSplitter())
|
||||||
|
.listen(print);
|
||||||
|
final File file = await waitForFile(path.join(integrationTestDir.path, 'info'));
|
||||||
|
final VmService vmService = await vmServiceConnectUri(file.readAsStringSync());
|
||||||
|
final VM vm = await vmService.getVM();
|
||||||
|
final Response result = await vmService.callMethod(
|
||||||
|
'ext.devicelab.test',
|
||||||
|
isolateId: vm.isolates.single.id,
|
||||||
|
);
|
||||||
|
if (result.json['result'] != 2) {
|
||||||
|
message += result.json.toString();
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
runProcess.stdin.write('q');
|
||||||
|
vmService.dispose();
|
||||||
|
file.deleteSync();
|
||||||
|
await runProcess.exitCode;
|
||||||
|
});
|
||||||
|
|
||||||
|
await inDirectory<void>(integrationTestDir, () async {
|
||||||
|
section('Running with track-widget-creation disabled');
|
||||||
|
final Process runProcess = await startProcess(
|
||||||
|
path.join(flutterDirectory.path, 'bin', 'flutter'),
|
||||||
|
flutterCommandArgs('run', <String>[
|
||||||
|
'--vmservice-out-file=info',
|
||||||
|
'--no-track-widget-creation',
|
||||||
|
'-v',
|
||||||
|
'-d',
|
||||||
|
deviceIdOverride,
|
||||||
|
path.join('lib/track_widget_creation.dart'),
|
||||||
|
]),
|
||||||
|
environment: <String, String>{
|
||||||
|
'FLUTTER_WEB': 'true',
|
||||||
|
'FLUTTER_MACOS': 'true'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
runProcess.stdout
|
||||||
|
.transform(utf8.decoder)
|
||||||
|
.transform(const LineSplitter())
|
||||||
|
.listen(print);
|
||||||
|
final File file = await waitForFile(path.join(integrationTestDir.path, 'info'));
|
||||||
|
final VmService vmService = await vmServiceConnectUri(file.readAsStringSync());
|
||||||
|
final VM vm = await vmService.getVM();
|
||||||
|
final Response result = await vmService.callMethod(
|
||||||
|
'ext.devicelab.test',
|
||||||
|
isolateId: vm.isolates.single.id,
|
||||||
|
);
|
||||||
|
if (result.json['result'] != 1) {
|
||||||
|
message += result.json.toString();
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
runProcess.stdin.write('q');
|
||||||
|
vmService.dispose();
|
||||||
|
file.deleteSync();
|
||||||
|
await runProcess.exitCode;
|
||||||
|
});
|
||||||
|
|
||||||
|
return failed
|
||||||
|
? TaskResult.failure(message)
|
||||||
|
: TaskResult.success(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wait for up to 400 seconds for the file to appear.
|
||||||
|
Future<File> waitForFile(String path) async {
|
||||||
|
for (int i = 0; i < 20; i += 1) {
|
||||||
|
final File file = File(path);
|
||||||
|
print('looking for ${file.path}');
|
||||||
|
if (file.existsSync()) {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
await Future<void>.delayed(const Duration(seconds: 20));
|
||||||
|
}
|
||||||
|
throw StateError('Did not find vmservice out file after 400 seconds');
|
||||||
|
}
|
@ -346,6 +346,13 @@ tasks:
|
|||||||
stage: devicelab
|
stage: devicelab
|
||||||
required_agent_capabilities: ["mac/android"]
|
required_agent_capabilities: ["mac/android"]
|
||||||
|
|
||||||
|
android_enable_twc:
|
||||||
|
description: >
|
||||||
|
Verifies that track-widget-creation can be enabled and disabled.
|
||||||
|
stage: devicelab
|
||||||
|
required_agent_capabilities: ["mac/android"]
|
||||||
|
flaky: true
|
||||||
|
|
||||||
android_defines_test:
|
android_defines_test:
|
||||||
description: >
|
description: >
|
||||||
Builds an APK with a --dart-define and verifies it can be used as a constant
|
Builds an APK with a --dart-define and verifies it can be used as a constant
|
||||||
@ -591,6 +598,20 @@ tasks:
|
|||||||
stage: devicelab_ios
|
stage: devicelab_ios
|
||||||
required_agent_capabilities: ["mac/ios"]
|
required_agent_capabilities: ["mac/ios"]
|
||||||
|
|
||||||
|
ios_enable_twc:
|
||||||
|
description: >
|
||||||
|
Verifies that track-widget-creation can be enabled and disabled.
|
||||||
|
stage: devicelab_ios
|
||||||
|
required_agent_capabilities: ["mac/ios"]
|
||||||
|
flaky: true
|
||||||
|
|
||||||
|
mac_enable_twc:
|
||||||
|
description: >
|
||||||
|
Verifies that track-widget-creation can be enabled and disabled.
|
||||||
|
stage: devicelab_ios
|
||||||
|
required_agent_capabilities: ["mac/ios"]
|
||||||
|
flaky: true
|
||||||
|
|
||||||
# TODO(fujino): does not pass on iOS13 https://github.com/flutter/flutter/issues/43029
|
# TODO(fujino): does not pass on iOS13 https://github.com/flutter/flutter/issues/43029
|
||||||
# system_debug_ios:
|
# system_debug_ios:
|
||||||
# description: >
|
# description: >
|
||||||
@ -797,6 +818,15 @@ tasks:
|
|||||||
stage: devicelab
|
stage: devicelab
|
||||||
required_agent_capabilities: ["linux-vm"]
|
required_agent_capabilities: ["linux-vm"]
|
||||||
|
|
||||||
|
# TODO(jonahwilliams): This should stay off until
|
||||||
|
# https://github.com/flutter/flutter/issues/56212 is fixed.
|
||||||
|
# web_enable_twc:
|
||||||
|
# description: >
|
||||||
|
# Verifies that track-widget-creation can be enabled and disabled.
|
||||||
|
# stage: devicelab
|
||||||
|
# required_agent_capabilities: ["linux-vm"]
|
||||||
|
# flaky: true
|
||||||
|
|
||||||
# run_without_leak_linux:
|
# run_without_leak_linux:
|
||||||
# description: >
|
# description: >
|
||||||
# Checks that `flutter run` does not leak dart on Linux.
|
# Checks that `flutter run` does not leak dart on Linux.
|
||||||
|
18
dev/integration_tests/ui/lib/track_widget_creation.dart
Normal file
18
dev/integration_tests/ui/lib/track_widget_creation.dart
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:developer';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
final Set<Widget> widgets = <Widget>{};
|
||||||
|
widgets.add(const Text('same'));
|
||||||
|
widgets.add(const Text('same'));
|
||||||
|
|
||||||
|
// If track-widget-creation is enabled, the set will have 2 members.
|
||||||
|
// Otherwise is will only have one.
|
||||||
|
registerExtension('ext.devicelab.test', (String method, Map<String, Object> params) async {
|
||||||
|
return ServiceExtensionResponse.result('{"result":${widgets.length}}');
|
||||||
|
});
|
||||||
|
}
|
@ -3,7 +3,7 @@ description: Flutter non-plugin UI integration tests.
|
|||||||
|
|
||||||
environment:
|
environment:
|
||||||
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
|
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
|
||||||
sdk: ">=2.0.0-dev.68.0 <3.0.0"
|
sdk: ">=2.8.0 <3.0.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
image: 2.1.12
|
image: 2.1.12
|
||||||
|
13
dev/integration_tests/ui/web/index.html
Normal file
13
dev/integration_tests/ui/web/index.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<!-- Copyright 2014 The Flutter Authors. All rights reserved.
|
||||||
|
Use of this source code is governed by a BSD-style license that can be
|
||||||
|
found in the LICENSE file. -->
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>web_integration</title>
|
||||||
|
<script defer src="main.dart.js" type="application/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -79,6 +79,7 @@ RunCommand "${FLUTTER_ROOT}/bin/flutter" \
|
|||||||
-dTreeShakeIcons="${TREE_SHAKE_ICONS}" \
|
-dTreeShakeIcons="${TREE_SHAKE_ICONS}" \
|
||||||
-dDartObfuscation="${DART_OBFUSCATION}" \
|
-dDartObfuscation="${DART_OBFUSCATION}" \
|
||||||
-dSplitDebugInfo="${SPLIT_DEBUG_INFO}" \
|
-dSplitDebugInfo="${SPLIT_DEBUG_INFO}" \
|
||||||
|
-dTrackWidgetCreation="${TRACK_WIDGET_CREATION}" \
|
||||||
--DartDefines="${DART_DEFINES}" \
|
--DartDefines="${DART_DEFINES}" \
|
||||||
--ExtraGenSnapshotOptions="${EXTRA_GEN_SNAPSHOT_OPTIONS}" \
|
--ExtraGenSnapshotOptions="${EXTRA_GEN_SNAPSHOT_OPTIONS}" \
|
||||||
-dExtraFrontEndOptions="${EXTRA_FRONT_END_OPTIONS}" \
|
-dExtraFrontEndOptions="${EXTRA_FRONT_END_OPTIONS}" \
|
||||||
|
@ -922,6 +922,9 @@ abstract class BaseFlutterTask extends DefaultTask {
|
|||||||
if (extraFrontEndOptions != null) {
|
if (extraFrontEndOptions != null) {
|
||||||
args "-dExtraFrontEndOptions=${extraFrontEndOptions}"
|
args "-dExtraFrontEndOptions=${extraFrontEndOptions}"
|
||||||
}
|
}
|
||||||
|
if (trackWidgetCreation != null) {
|
||||||
|
args "-dTrackWidgetCreation=${trackWidgetCreation}"
|
||||||
|
}
|
||||||
if (splitDebugInfo != null) {
|
if (splitDebugInfo != null) {
|
||||||
args "-dSplitDebugInfo=${splitDebugInfo}"
|
args "-dSplitDebugInfo=${splitDebugInfo}"
|
||||||
}
|
}
|
||||||
|
@ -713,6 +713,11 @@ class _ResidentWebRunner extends ResidentWebRunner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (websocketUri != null) {
|
if (websocketUri != null) {
|
||||||
|
if (debuggingOptions.vmserviceOutFile != null) {
|
||||||
|
globals.fs.file(debuggingOptions.vmserviceOutFile)
|
||||||
|
..createSync(recursive: true)
|
||||||
|
..writeAsStringSync(websocketUri.toString());
|
||||||
|
}
|
||||||
globals.printStatus('Debug service listening on $websocketUri');
|
globals.printStatus('Debug service listening on $websocketUri');
|
||||||
}
|
}
|
||||||
appStartedCompleter?.complete();
|
appStartedCompleter?.complete();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user