| // Copyright 2015 The Chromium 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:file/local.dart'; |
| import 'package:flutter_tools/executable.dart' as tools; |
| import 'package:flutter_tools/src/cache.dart'; |
| import 'package:flutter_tools/src/base/context.dart'; |
| import 'package:flutter_tools/src/base/io.dart' as io; |
| import 'package:flutter_tools/src/base/port_scanner.dart'; |
| import 'package:flutter_tools/src/runner/flutter_command.dart'; |
| import 'package:test/test.dart'; |
| |
| import '../src/common.dart'; |
| import '../src/context.dart'; |
| |
| /// Runs the specified [testMethod] in a minimal `AppContext` that is set up |
| /// to redirect log output to a `BufferLogger` to avoid spamming `stdout`. |
| /// |
| /// Test methods will generally want to use [expectProcessExits] in their method |
| /// bodies. |
| void testReplay( |
| String description, |
| dynamic testMethod(), { |
| Timeout timeout, |
| Map<Type, Generator> overrides: const <Type, Generator>{}, |
| bool skip, |
| }) { |
| setUp(() { |
| io.setExitFunctionForTests(); |
| }); |
| |
| tearDown(() { |
| io.restoreExitFunction(); |
| }); |
| |
| testUsingContext( |
| description, |
| testMethod, |
| timeout: timeout, |
| overrides: overrides, |
| skip: skip, |
| initializeContext: (AppContext testContext) { |
| testContext.putIfAbsent(PortScanner, () => new MockPortScanner()); |
| }, |
| ); |
| } |
| |
| /// Expects that the specified [command] to Flutter tools exits with the |
| /// specified [exitCode] (defaults to zero). It is expected that callers will |
| /// be running in a test via [testReplay]. |
| /// |
| /// [command] should be the list of arguments that are passed to the `flutter` |
| /// command-line tool. For example: |
| /// |
| /// ``` |
| /// <String>[ |
| /// 'run', |
| /// '--no-hot', |
| /// '--no-resident', |
| /// ] |
| /// ``` |
| void expectProcessExits( |
| FlutterCommand command, { |
| List<String> args: const <String>[], |
| dynamic exitCode: 0, |
| }) { |
| final Future<Null> runFuture = tools.run( |
| <String>[command.name]..addAll(args), |
| <FlutterCommand>[command], |
| reportCrashes: false, |
| flutterVersion: 'test', |
| ); |
| expect(runFuture, throwsProcessExit(exitCode)); |
| } |
| |
| /// The base path of the replay tests. |
| String get replayBase { |
| return const LocalFileSystem().path.joinAll(<String>[ |
| Cache.flutterRoot, |
| 'packages', |
| 'flutter_tools', |
| 'test', |
| 'replay', |
| ]); |
| } |