| // 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:convert'; |
| import 'dart:io'; |
| |
| import 'package:flutter_devicelab/framework/adb.dart'; |
| import 'package:flutter_devicelab/framework/framework.dart'; |
| import 'package:flutter_devicelab/framework/task_result.dart'; |
| import 'package:flutter_devicelab/framework/utils.dart'; |
| import 'package:path/path.dart' as path; |
| |
| final Directory flutterGalleryDir = dir(path.join(flutterDirectory.path, 'examples/hello_world')); |
| final File runTestSource = File(path.join( |
| flutterDirectory.path, 'dev', 'automated_tests', 'flutter_run_test', 'flutter_run_test.dart', |
| )); |
| const Pattern passedMessageMatch = '+0: example passed'; |
| const Pattern failedMessageMatch = '+1: example failed [E]'; |
| const Pattern skippedMessageMatch = '+1 -1: example skipped'; |
| const Pattern finishedMessageMatch = '+1 ~1 -1: Some tests failed.'; |
| const Pattern printMessageMatch = 'This is print'; |
| const Pattern writelnMessageMatch = 'This is writeln'; |
| |
| Future<void> main() async { |
| await task(createFlutterRunTask); |
| } |
| |
| // verifies that the messages above are printed as a test script is executed. |
| Future<TaskResult> createFlutterRunTask() async { |
| bool passedTest = false; |
| bool failedTest = false; |
| bool skippedTest = false; |
| bool finishedMessage = false; |
| bool printMessage = false; |
| bool writelnMessage = false; |
| final Device device = await devices.workingDevice; |
| await device.unlock(); |
| final List<String> options = <String>[ |
| '-t', runTestSource.absolute.path, '-d', device.deviceId, '-v', '--no-publish-port', |
| ]; |
| await inDirectory<void>(flutterGalleryDir, () async { |
| final Process run = await startProcess( |
| path.join(flutterDirectory.path, 'bin', 'flutter'), |
| flutterCommandArgs('run', options), |
| environment: null, |
| ); |
| |
| final Completer<void> finished = Completer<void>(); |
| final StreamSubscription<void> subscription = run.stdout |
| .transform<String>(utf8.decoder) |
| .transform<String>(const LineSplitter()) |
| .listen((String line) { |
| print('stdout: $line'); |
| // tests execute in order. |
| if (line.contains(passedMessageMatch)) { |
| passedTest = true; |
| } else if (line.contains(failedMessageMatch)) { |
| failedTest = true; |
| } else if (line.contains(skippedMessageMatch)) { |
| skippedTest = true; |
| } else if (line.contains(printMessageMatch)) { |
| printMessage = true; |
| } else if (line.contains(writelnMessageMatch)) { |
| writelnMessage = true; |
| } else if (line.contains(finishedMessageMatch)) { |
| finishedMessage = true; |
| finished.complete(); |
| } |
| }); |
| await finished.future.timeout(const Duration(minutes: 1)); |
| subscription.cancel(); |
| run.kill(); |
| }); |
| return passedTest && failedTest && skippedTest && finishedMessage && printMessage && writelnMessage |
| ? TaskResult.success(<String, dynamic>{}) |
| : TaskResult.failure('Test did not execute as expected.'); |
| } |