Unverified Commit be8989f1 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove mock processes from batch compile_test (#77731)

parent 07e04484
...@@ -184,12 +184,14 @@ class KernelCompiler { ...@@ -184,12 +184,14 @@ class KernelCompiler {
@required Artifacts artifacts, @required Artifacts artifacts,
@required List<String> fileSystemRoots, @required List<String> fileSystemRoots,
@required String fileSystemScheme, @required String fileSystemScheme,
@visibleForTesting StdoutHandler stdoutHandler,
}) : _logger = logger, }) : _logger = logger,
_fileSystem = fileSystem, _fileSystem = fileSystem,
_artifacts = artifacts, _artifacts = artifacts,
_processManager = processManager, _processManager = processManager,
_fileSystemScheme = fileSystemScheme, _fileSystemScheme = fileSystemScheme,
_fileSystemRoots = fileSystemRoots; _fileSystemRoots = fileSystemRoots,
_stdoutHandler = stdoutHandler ?? StdoutHandler(logger: logger);
final FileSystem _fileSystem; final FileSystem _fileSystem;
final Artifacts _artifacts; final Artifacts _artifacts;
...@@ -197,6 +199,7 @@ class KernelCompiler { ...@@ -197,6 +199,7 @@ class KernelCompiler {
final Logger _logger; final Logger _logger;
final String _fileSystemScheme; final String _fileSystemScheme;
final List<String> _fileSystemRoots; final List<String> _fileSystemRoots;
final StdoutHandler _stdoutHandler;
Future<CompilerOutput> compile({ Future<CompilerOutput> compile({
String sdkRoot, String sdkRoot,
...@@ -310,7 +313,6 @@ class KernelCompiler { ...@@ -310,7 +313,6 @@ class KernelCompiler {
_logger.printTrace(command.join(' ')); _logger.printTrace(command.join(' '));
final Process server = await _processManager.start(command); final Process server = await _processManager.start(command);
final StdoutHandler _stdoutHandler = StdoutHandler(logger: _logger);
server.stderr server.stderr
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
.listen(_logger.printError); .listen(_logger.printError);
...@@ -540,11 +542,12 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -540,11 +542,12 @@ class DefaultResidentCompiler implements ResidentCompiler {
this.platformDill, this.platformDill,
List<String> dartDefines, List<String> dartDefines,
this.librariesSpec, this.librariesSpec,
@visibleForTesting StdoutHandler stdoutHandler,
}) : assert(sdkRoot != null), }) : assert(sdkRoot != null),
_logger = logger, _logger = logger,
_processManager = processManager, _processManager = processManager,
_artifacts = artifacts, _artifacts = artifacts,
_stdoutHandler = StdoutHandler(logger: logger), _stdoutHandler = stdoutHandler ?? StdoutHandler(logger: logger),
_platform = platform, _platform = platform,
dartDefines = dartDefines ?? const <String>[], dartDefines = dartDefines ?? const <String>[],
// This is a URI, not a file path, so the forward slash is correct even on Windows. // This is a URI, not a file path, so the forward slash is correct even on Windows.
......
...@@ -8,64 +8,71 @@ import 'dart:async'; ...@@ -8,64 +8,71 @@ import 'dart:async';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/compile.dart';
import 'package:flutter_tools/src/convert.dart';
import 'package:mockito/mockito.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:process/process.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/mocks.dart';
void main() { void main() {
ProcessManager mockProcessManager; testWithoutContext('StdoutHandler can parse output for successful batch compilation', () async {
MockProcess mockFrontendServer; final BufferLogger logger = BufferLogger.test();
MockStdIn mockFrontendServerStdIn; final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
MockStream mockFrontendServerStdErr;
stdoutHandler.reset();
List<String> latestCommand; 'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'.split('\n').forEach(stdoutHandler.handler);
final CompilerOutput output = await stdoutHandler.compilerOutput.future;
setUp(() {
mockProcessManager = MockProcessManager(); expect(logger.errorText, equals('line1\nline2\n'));
mockFrontendServer = MockProcess(); expect(output.outputFilename, equals('/path/to/main.dart.dill'));
mockFrontendServerStdIn = MockStdIn(); });
mockFrontendServerStdErr = MockStream();
testWithoutContext('StdoutHandler can parse output for failed batch compilation', () async {
when(mockFrontendServer.stderr) final BufferLogger logger = BufferLogger.test();
.thenAnswer((Invocation invocation) => mockFrontendServerStdErr); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
final StreamController<String> stdErrStreamController = StreamController<String>();
when(mockFrontendServerStdErr.transform<String>(any)).thenAnswer((_) => stdErrStreamController.stream); stdoutHandler.reset();
when(mockFrontendServer.stdin).thenReturn(mockFrontendServerStdIn); 'result abc\nline1\nline2\nabc\nabc'.split('\n').forEach(stdoutHandler.handler);
when(mockProcessManager.canRun(any)).thenReturn(true); final CompilerOutput output = await stdoutHandler.compilerOutput.future;
when(mockProcessManager.start(any)).thenAnswer(
(Invocation invocation) { expect(logger.errorText, equals('line1\nline2\n'));
latestCommand = invocation.positionalArguments.first as List<String>; expect(output, equals(null));
return Future<Process>.value(mockFrontendServer);
});
when(mockFrontendServer.exitCode).thenAnswer((_) async => 0);
}); });
testWithoutContext('batch compile single dart successful compilation', () async { testWithoutContext('KernelCompiler passes correct configuration to frontend server process', () async {
when(mockFrontendServer.stdout)
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
Future<List<int>>.value(utf8.encode(
'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
))
));
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
final Completer<void> completer = Completer<void>();
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: logger, logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=false',
'--enable-asserts',
'--no-link-platform',
'--packages',
'.packages',
'file:///path/to/main.dart'
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.debug, buildMode: BuildMode.debug,
trackWidgetCreation: false, trackWidgetCreation: false,
...@@ -73,158 +80,231 @@ void main() { ...@@ -73,158 +80,231 @@ void main() {
packageConfig: PackageConfig.empty, packageConfig: PackageConfig.empty,
packagesPath: '.packages', packagesPath: '.packages',
); );
stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
completer.complete();
expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect((await output).outputFilename, '');
expect(logger.errorText, equals('line1\nline2\n'));
expect(output.outputFilename, equals('/path/to/main.dart.dill'));
}); });
testWithoutContext('passes correct AOT config to kernel compiler in aot/profile mode', () async { testWithoutContext('KernelCompiler returns null if StdoutHandler returns null', () async {
when(mockFrontendServer.stdout) final BufferLogger logger = BufferLogger.test();
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture( final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
Future<List<int>>.value(utf8.encode( final Completer<void> completer = Completer<void>();
'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
))
));
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: BufferLogger.test(), logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=false',
'--enable-asserts',
'--no-link-platform',
'--packages',
'.packages',
'file:///path/to/main.dart'
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.profile, buildMode: BuildMode.debug,
trackWidgetCreation: false, trackWidgetCreation: false,
aot: true,
dartDefines: const <String>[], dartDefines: const <String>[],
packageConfig: PackageConfig.empty, packageConfig: PackageConfig.empty,
packagesPath: '.packages', packagesPath: '.packages',
); );
stdoutHandler.compilerOutput.complete(null);
completer.complete();
expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect(await output, null);
final VerificationResult argVerification = verify(mockProcessManager.start(captureAny));
expect(argVerification.captured.single, containsAll(<String>[
'--aot',
'--tfa',
'-Ddart.vm.profile=true',
'-Ddart.vm.product=false',
]));
}); });
testWithoutContext('passes correct AOT config to kernel compiler in aot/release mode', () async { testWithoutContext('KernelCompiler returns null if frontend_server process exits with non-zero code', () async {
when(mockFrontendServer.stdout) final BufferLogger logger = BufferLogger.test();
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture( final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
Future<List<int>>.value(utf8.encode( final Completer<void> completer = Completer<void>();
'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
))
));
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: BufferLogger.test(), logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=false',
'--enable-asserts',
'--no-link-platform',
'--packages',
'.packages',
'file:///path/to/main.dart'
], completer: completer, exitCode: 127),
]),
stdoutHandler: stdoutHandler,
); );
await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.release, buildMode: BuildMode.debug,
trackWidgetCreation: false, trackWidgetCreation: false,
aot: true,
dartDefines: const <String>[], dartDefines: const <String>[],
packageConfig: PackageConfig.empty, packageConfig: PackageConfig.empty,
packagesPath: '.packages', packagesPath: '.packages',
); );
stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
completer.complete();
expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect(await output, null);
final VerificationResult argVerification = verify(mockProcessManager.start(captureAny));
expect(argVerification.captured.single, containsAll(<String>[
'--aot',
'--tfa',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=true',
]));
}); });
testWithoutContext('batch compile single dart failed compilation', () async { testWithoutContext('KernelCompiler passes correct AOT config to frontend_server in aot/profile mode', () async {
when(mockFrontendServer.stdout)
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
Future<List<int>>.value(utf8.encode(
'result abc\nline1\nline2\nabc\nabc'
))
));
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
final Completer<void> completer = Completer<void>();
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: logger, logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=true',
'-Ddart.vm.product=false',
'--no-link-platform',
'--aot',
'--tfa',
'--packages',
'.packages',
'file:///path/to/main.dart'
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.debug, buildMode: BuildMode.profile,
trackWidgetCreation: false, trackWidgetCreation: false,
aot: true,
dartDefines: const <String>[], dartDefines: const <String>[],
packageConfig: PackageConfig.empty, packageConfig: PackageConfig.empty,
packagesPath: '.packages', packagesPath: '.packages',
); );
stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
completer.complete();
expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect((await output).outputFilename, '');
expect(logger.errorText, equals('line1\nline2\n'));
expect(output, equals(null));
}); });
testWithoutContext('batch compile single dart abnormal compiler termination', () async { testWithoutContext('passes correct AOT config to kernel compiler in aot/release mode', () async {
when(mockFrontendServer.exitCode).thenAnswer((_) async => 255);
when(mockFrontendServer.stdout)
.thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
Future<List<int>>.value(utf8.encode(
'result abc\nline1\nline2\nabc\nabc'
))
));
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
final Completer<void> completer = Completer<void>();
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: logger, logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=true',
'--no-link-platform',
'--aot',
'--tfa',
'--packages',
'.packages',
'file:///path/to/main.dart'
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
final CompilerOutput output = await kernelCompiler.compile( final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.debug, buildMode: BuildMode.release,
trackWidgetCreation: false, trackWidgetCreation: false,
aot: true,
dartDefines: const <String>[], dartDefines: const <String>[],
packageConfig: PackageConfig.empty, packageConfig: PackageConfig.empty,
packagesPath: '.packages', packagesPath: '.packages',
); );
expect(mockFrontendServerStdIn.getAndClear(), isEmpty); stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
expect(logger.errorText, equals('line1\nline2\n')); completer.complete();
expect(output, equals(null));
expect((await output).outputFilename, '');
}); });
testWithoutContext('passes dartDefines to the kernel compiler', () async { testWithoutContext('KernelCompiler passes dartDefines to the frontend_server', () async {
// Use unsuccessful result because it's easier to setup in test. We only care about arguments passed to the compiler. final BufferLogger logger = BufferLogger.test();
when(mockFrontendServer.exitCode).thenAnswer((_) async => 255); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
when(mockFrontendServer.stdout).thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture( final Completer<void> completer = Completer<void>();
Future<List<int>>.value(<int>[])
));
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
fileSystemRoots: <String>[], fileSystemRoots: <String>[],
fileSystemScheme: '', fileSystemScheme: '',
logger: BufferLogger.test(), logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-DFOO=bar',
'-DBAZ=qux',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=false',
'--enable-asserts',
'--no-link-platform',
'--packages',
'.packages',
'file:///path/to/main.dart',
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/path/to/main.dart', mainPath: '/path/to/main.dart',
buildMode: BuildMode.debug, buildMode: BuildMode.debug,
trackWidgetCreation: false, trackWidgetCreation: false,
...@@ -233,15 +313,17 @@ void main() { ...@@ -233,15 +313,17 @@ void main() {
packagesPath: '.packages', packagesPath: '.packages',
); );
expect(latestCommand, containsAllInOrder(<String>['-DFOO=bar', '-DBAZ=qux'])); stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
completer.complete();
expect((await output).outputFilename, '');
}); });
testWithoutContext('maps a file to a multiroot scheme if provided', () async { testWithoutContext('KernelCompiler maps a file to a multi-root scheme if provided', () async {
// Use unsuccessful result because it's easier to setup in test. We only care about arguments passed to the compiler. final BufferLogger logger = BufferLogger.test();
when(mockFrontendServer.exitCode).thenAnswer((_) async => 255); final StdoutHandler stdoutHandler = StdoutHandler(logger: logger);
when(mockFrontendServer.stdout).thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture( final Completer<void> completer = Completer<void>();
Future<List<int>>.value(<int>[])
));
final KernelCompiler kernelCompiler = KernelCompiler( final KernelCompiler kernelCompiler = KernelCompiler(
artifacts: Artifacts.test(), artifacts: Artifacts.test(),
fileSystem: MemoryFileSystem.test(), fileSystem: MemoryFileSystem.test(),
...@@ -249,10 +331,29 @@ void main() { ...@@ -249,10 +331,29 @@ void main() {
'/foo/bar/fizz', '/foo/bar/fizz',
], ],
fileSystemScheme: 'scheme', fileSystemScheme: 'scheme',
logger: BufferLogger.test(), logger: logger,
processManager: mockProcessManager processManager: FakeProcessManager.list(<FakeCommand>[
FakeCommand(command: const <String>[
'Artifact.engineDartBinary',
'--disable-dart-dev',
'Artifact.frontendServerSnapshotForEngineDartSdk',
'--sdk-root',
'/path/to/sdkroot/',
'--target=flutter',
'--no-print-incremental-dependencies',
'-Ddart.vm.profile=false',
'-Ddart.vm.product=false',
'--enable-asserts',
'--no-link-platform',
'--packages',
'.packages',
'scheme:///main.dart',
], completer: completer),
]),
stdoutHandler: stdoutHandler,
); );
await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
final Future<CompilerOutput> output = kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
mainPath: '/foo/bar/fizz/main.dart', mainPath: '/foo/bar/fizz/main.dart',
buildMode: BuildMode.debug, buildMode: BuildMode.debug,
trackWidgetCreation: false, trackWidgetCreation: false,
...@@ -261,9 +362,9 @@ void main() { ...@@ -261,9 +362,9 @@ void main() {
packagesPath: '.packages', packagesPath: '.packages',
); );
expect(latestCommand, containsAll(<String>['scheme:///main.dart'])); stdoutHandler.compilerOutput.complete(const CompilerOutput('', 0, <Uri>[]));
completer.complete();
expect((await output).outputFilename, '');
}); });
} }
class MockProcess extends Mock implements Process {}
class MockProcessManager extends Mock implements ProcessManager {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment