| // 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 'dart:io'; |
| |
| import 'package:flutter_devicelab/framework/adb.dart'; |
| import 'package:flutter_devicelab/framework/framework.dart'; |
| import 'package:flutter_devicelab/framework/utils.dart'; |
| |
| import 'service_extensions_test.dart'; |
| |
| Future<void> main() async { |
| deviceOperatingSystem = DeviceOperatingSystem.ios; |
| await task(() async { |
| final Device device = await devices.workingDevice; |
| await device.unlock(); |
| final String deviceId = device.deviceId; |
| |
| final Directory testDirectory = |
| dir('${flutterDirectory.path}/dev/integration_tests/ui'); |
| await inDirectory<void>(testDirectory, () async { |
| await flutter('packages', options: <String>['get']); |
| |
| await checkNoWarningHostLaunch(deviceId); |
| await checkNoWarningXcodeLaunch(deviceId); |
| await checkWarningHomeScreenLaunch(deviceId); |
| }); |
| return TaskResult.success(<String, dynamic>{}); |
| }); |
| } |
| |
| const String expectedWarning = |
| 'Launching a debug-mode app from the home screen may cause problems.'; |
| |
| // When a debug-mode app is launched from the host there should be no warnings. |
| Future<void> checkNoWarningHostLaunch(String deviceId) async { |
| final String output = await evalFlutter('drive', options: <String>[ |
| '--debug', |
| '--verbose', |
| '--verbose-system-logs', |
| '-d', |
| deviceId, |
| 'lib/empty.dart', |
| ]); |
| |
| expect(!output.contains(expectedWarning)); |
| } |
| |
| // When a debug-mode app is launched from Xcode there should be no warnings. The |
| // Xcode launch is simulated by keeping LLDB attached throughout the lifetime of |
| // the app. |
| Future<void> checkNoWarningXcodeLaunch(String deviceId) async { |
| await flutter('build', |
| options: <String>['ios', '--debug', '--verbose', 'lib/exit.dart']); |
| |
| final String output = await eval( |
| '${flutterDirectory.path}/bin/cache/artifacts/ios-deploy/ios-deploy', |
| <String>[ |
| '--bundle', |
| 'build/ios/iphoneos/Runner.app', |
| '-d', // Actually start the app in LLDB, don't just install it. |
| '--noninteractive', |
| '--args', |
| '--verbose-logging', |
| ]); |
| |
| expect(output.contains('success') && !output.contains(expectedWarning)); |
| } |
| |
| // When a debug-mode app is launched from the home screen there should be a |
| // warning every ~100 launches. We lower the threshold from to 1 via |
| // "--verbose-system-logs" and simulate a home-screen-launch by setting an |
| // environment variable. The environment variable forces "flutter drive" to not |
| // pass a flag which it normally passes to debug-mode apps, imitating launchd, |
| // which doesn't pass any command-line flags. |
| Future<void> checkWarningHomeScreenLaunch(String deviceId) async { |
| final String output = await evalFlutter('drive', options: <String>[ |
| '--debug', |
| '--verbose', |
| '--verbose-system-logs', |
| '-d', |
| deviceId, |
| 'lib/empty.dart', |
| ], environment: <String, String>{ |
| 'FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE': 'true', |
| }); |
| expect(output.contains(expectedWarning)); |
| } |