// Copyright 2017 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:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/globals.dart'; import 'package:mockito/mockito.dart'; import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; import '../src/mocks.dart'; void main() { ProcessManager mockProcessManager; MockProcess mockFrontendServer; MockStdIn mockFrontendServerStdIn; MockStream mockFrontendServerStdErr; setUp(() { mockProcessManager = MockProcessManager(); mockFrontendServer = MockProcess(); mockFrontendServerStdIn = MockStdIn(); mockFrontendServerStdErr = MockStream(); when(mockFrontendServer.stderr) .thenAnswer((Invocation invocation) => mockFrontendServerStdErr); final StreamController stdErrStreamController = StreamController(); when(mockFrontendServerStdErr.transform(any)).thenAnswer((_) => stdErrStreamController.stream); when(mockFrontendServer.stdin).thenReturn(mockFrontendServerStdIn); when(mockProcessManager.canRun(any)).thenReturn(true); when(mockProcessManager.start(any)).thenAnswer( (Invocation invocation) => Future.value(mockFrontendServer)); when(mockFrontendServer.exitCode).thenAnswer((_) async => 0); }); testUsingContext('batch compile single dart successful compilation', () async { final BufferLogger bufferLogger = logger; when(mockFrontendServer.stdout) .thenAnswer((Invocation invocation) => Stream>.fromFuture( Future>.value(utf8.encode( 'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0' )) )); final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null); final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', mainPath: '/path/to/main.dart', enableAsserts: true, trackWidgetCreation: false, ); expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect(bufferLogger.errorText, equals('\nCompiler message:\nline1\nline2\n')); expect(output.outputFilename, equals('/path/to/main.dart.dill')); }, overrides: { ProcessManager: () => mockProcessManager, OutputPreferences: () => OutputPreferences(showColor: false), Platform: kNoColorTerminalPlatform, }); testUsingContext('batch compile single dart failed compilation', () async { final BufferLogger bufferLogger = logger; when(mockFrontendServer.stdout) .thenAnswer((Invocation invocation) => Stream>.fromFuture( Future>.value(utf8.encode( 'result abc\nline1\nline2\nabc\nabc' )) )); final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null); final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot', mainPath: '/path/to/main.dart', enableAsserts: true, trackWidgetCreation: false, ); expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect(bufferLogger.errorText, equals('\nCompiler message:\nline1\nline2\n')); expect(output, equals(null)); }, overrides: { ProcessManager: () => mockProcessManager, OutputPreferences: () => OutputPreferences(showColor: false), Platform: kNoColorTerminalPlatform, }); testUsingContext('batch compile single dart abnormal compiler termination', () async { when(mockFrontendServer.exitCode).thenAnswer((_) async => 255); final BufferLogger bufferLogger = logger; when(mockFrontendServer.stdout) .thenAnswer((Invocation invocation) => Stream>.fromFuture( Future>.value(utf8.encode( 'result abc\nline1\nline2\nabc\nabc' )) )); final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null); final CompilerOutput output = await kernelCompiler.compile( sdkRoot: '/path/to/sdkroot', mainPath: '/path/to/main.dart', enableAsserts: true, trackWidgetCreation: false, ); expect(mockFrontendServerStdIn.getAndClear(), isEmpty); expect(bufferLogger.errorText, equals('\nCompiler message:\nline1\nline2\n')); expect(output, equals(null)); }, overrides: { ProcessManager: () => mockProcessManager, OutputPreferences: () => OutputPreferences(showColor: false), Platform: kNoColorTerminalPlatform, }); } class MockProcess extends Mock implements Process {} class MockProcessManager extends Mock implements ProcessManager {}