Unverified Commit 3489da93 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] no more MockLogger in tests (#51684)

parent f90fcba4
...@@ -175,7 +175,7 @@ class CommandHelpOption { ...@@ -175,7 +175,7 @@ class CommandHelpOption {
this.description, { this.description, {
this.inParenthesis = '', this.inParenthesis = '',
@required Logger logger, @required Logger logger,
@required AnsiTerminal terminal, @required Terminal terminal,
@required Platform platform, @required Platform platform,
@required OutputPreferences outputPreferences, @required OutputPreferences outputPreferences,
}) : _logger = logger, }) : _logger = logger,
...@@ -185,7 +185,7 @@ class CommandHelpOption { ...@@ -185,7 +185,7 @@ class CommandHelpOption {
final Logger _logger; final Logger _logger;
final AnsiTerminal _terminal; final Terminal _terminal;
final Platform _platform; final Platform _platform;
......
...@@ -7,9 +7,10 @@ import 'dart:async'; ...@@ -7,9 +7,10 @@ import 'dart:async';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import '../base/context.dart'; import '../base/context.dart';
import '../convert.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
import 'io.dart'; import 'io.dart';
import 'terminal.dart' show AnsiTerminal, TerminalColor, OutputPreferences; import 'terminal.dart' show AnsiTerminal, Terminal, TerminalColor, OutputPreferences;
import 'utils.dart'; import 'utils.dart';
const int kDefaultStatusPadding = 59; const int kDefaultStatusPadding = 59;
...@@ -57,7 +58,7 @@ abstract class Logger { ...@@ -57,7 +58,7 @@ abstract class Logger {
bool get hasTerminal; bool get hasTerminal;
AnsiTerminal get _terminal; Terminal get _terminal;
OutputPreferences get _outputPreferences; OutputPreferences get _outputPreferences;
...@@ -380,11 +381,21 @@ class BufferLogger extends Logger { ...@@ -380,11 +381,21 @@ class BufferLogger extends Logger {
_timeoutConfiguration = timeoutConfiguration, _timeoutConfiguration = timeoutConfiguration,
_stopwatchFactory = stopwatchFactory; _stopwatchFactory = stopwatchFactory;
@visibleForTesting
BufferLogger.test({
Terminal terminal,
OutputPreferences outputPreferences,
}) : _terminal = terminal ?? Terminal.test(),
_outputPreferences = outputPreferences ?? OutputPreferences.test(),
_timeoutConfiguration = const TimeoutConfiguration(),
_stopwatchFactory = const StopwatchFactory();
@override @override
final OutputPreferences _outputPreferences; final OutputPreferences _outputPreferences;
@override @override
final AnsiTerminal _terminal; final Terminal _terminal;
@override @override
final TimeoutConfiguration _timeoutConfiguration; final TimeoutConfiguration _timeoutConfiguration;
...@@ -400,10 +411,12 @@ class BufferLogger extends Logger { ...@@ -400,10 +411,12 @@ class BufferLogger extends Logger {
final StringBuffer _error = StringBuffer(); final StringBuffer _error = StringBuffer();
final StringBuffer _status = StringBuffer(); final StringBuffer _status = StringBuffer();
final StringBuffer _trace = StringBuffer(); final StringBuffer _trace = StringBuffer();
final StringBuffer _events = StringBuffer();
String get errorText => _error.toString(); String get errorText => _error.toString();
String get statusText => _status.toString(); String get statusText => _status.toString();
String get traceText => _trace.toString(); String get traceText => _trace.toString();
String get eventText => _events.toString();
@override @override
bool get hasTerminal => false; bool get hasTerminal => false;
...@@ -481,10 +494,16 @@ class BufferLogger extends Logger { ...@@ -481,10 +494,16 @@ class BufferLogger extends Logger {
_error.clear(); _error.clear();
_status.clear(); _status.clear();
_trace.clear(); _trace.clear();
_events.clear();
} }
@override @override
void sendEvent(String name, [Map<String, dynamic> args]) { } void sendEvent(String name, [Map<String, dynamic> args]) {
_events.write(json.encode(<String, Object>{
'name': name,
'args': args
}));
}
} }
class VerboseLogger extends Logger { class VerboseLogger extends Logger {
...@@ -500,7 +519,7 @@ class VerboseLogger extends Logger { ...@@ -500,7 +519,7 @@ class VerboseLogger extends Logger {
final Stopwatch _stopwatch; final Stopwatch _stopwatch;
@override @override
AnsiTerminal get _terminal => parent._terminal; Terminal get _terminal => parent._terminal;
@override @override
OutputPreferences get _outputPreferences => parent._outputPreferences; OutputPreferences get _outputPreferences => parent._outputPreferences;
......
...@@ -85,7 +85,58 @@ class OutputPreferences { ...@@ -85,7 +85,58 @@ class OutputPreferences {
} }
} }
class AnsiTerminal { /// The command line terminal, if available.
abstract class Terminal {
factory Terminal.test() = _TestTerminal;
/// Whether the current terminal supports color escape codes.
bool get supportsColor;
/// Whether the current terminal can display emoji.
bool get supportsEmoji;
/// Whether we are interacting with the flutter tool via the terminal.
///
/// If not set, defaults to false.
bool get usesTerminalUi;
set usesTerminalUi(bool value);
String bolden(String message);
String color(String message, TerminalColor color);
String clearScreen();
set singleCharMode(bool value);
/// Return keystrokes from the console.
///
/// Useful when the console is in [singleCharMode].
Stream<String> get keystrokes;
/// Prompts the user to input a character within a given list. Re-prompts if
/// entered character is not in the list.
///
/// The `prompt`, if non-null, is the text displayed prior to waiting for user
/// input each time. If `prompt` is non-null and `displayAcceptedCharacters`
/// is true, the accepted keys are printed next to the `prompt`.
///
/// The returned value is the user's input; if `defaultChoiceIndex` is not
/// null, and the user presses enter without any other input, the return value
/// will be the character in `acceptedCharacters` at the index given by
/// `defaultChoiceIndex`.
///
/// If [usesTerminalUi] is false, throws a [StateError].
Future<String> promptForCharInput(
List<String> acceptedCharacters, {
@required Logger logger,
String prompt,
int defaultChoiceIndex,
bool displayAcceptedCharacters = true,
});
}
class AnsiTerminal implements Terminal {
AnsiTerminal({ AnsiTerminal({
@required io.Stdio stdio, @required io.Stdio stdio,
@required Platform platform, @required Platform platform,
...@@ -122,12 +173,14 @@ class AnsiTerminal { ...@@ -122,12 +173,14 @@ class AnsiTerminal {
static String colorCode(TerminalColor color) => _colorMap[color]; static String colorCode(TerminalColor color) => _colorMap[color];
@override
bool get supportsColor => _platform.stdoutSupportsAnsi ?? false; bool get supportsColor => _platform.stdoutSupportsAnsi ?? false;
// Assume unicode emojis are supported when not on Windows. // Assume unicode emojis are supported when not on Windows.
// If we are on Windows, unicode emojis are supported in Windows Terminal, // If we are on Windows, unicode emojis are supported in Windows Terminal,
// which sets the WT_SESSION environment variable. See: // which sets the WT_SESSION environment variable. See:
// https://github.com/microsoft/terminal/blob/master/doc/user-docs/index.md#tips-and-tricks // https://github.com/microsoft/terminal/blob/master/doc/user-docs/index.md#tips-and-tricks
@override
bool get supportsEmoji => !_platform.isWindows bool get supportsEmoji => !_platform.isWindows
|| _platform.environment.containsKey('WT_SESSION'); || _platform.environment.containsKey('WT_SESSION');
...@@ -135,11 +188,10 @@ class AnsiTerminal { ...@@ -135,11 +188,10 @@ class AnsiTerminal {
'(${RegExp.escape(resetBold)}|${RegExp.escape(bold)})', '(${RegExp.escape(resetBold)}|${RegExp.escape(bold)})',
); );
/// Whether we are interacting with the flutter tool via the terminal. @override
///
/// If not set, defaults to false.
bool usesTerminalUi = false; bool usesTerminalUi = false;
@override
String bolden(String message) { String bolden(String message) {
assert(message != null); assert(message != null);
if (!supportsColor || message.isEmpty) { if (!supportsColor || message.isEmpty) {
...@@ -160,6 +212,7 @@ class AnsiTerminal { ...@@ -160,6 +212,7 @@ class AnsiTerminal {
: result; : result;
} }
@override
String color(String message, TerminalColor color) { String color(String message, TerminalColor color) {
assert(message != null); assert(message != null);
if (!supportsColor || color == null || message.isEmpty) { if (!supportsColor || color == null || message.isEmpty) {
...@@ -181,8 +234,10 @@ class AnsiTerminal { ...@@ -181,8 +234,10 @@ class AnsiTerminal {
: result; : result;
} }
@override
String clearScreen() => supportsColor ? clear : '\n\n'; String clearScreen() => supportsColor ? clear : '\n\n';
@override
set singleCharMode(bool value) { set singleCharMode(bool value) {
if (!_stdio.stdinHasTerminal) { if (!_stdio.stdinHasTerminal) {
return; return;
...@@ -200,27 +255,13 @@ class AnsiTerminal { ...@@ -200,27 +255,13 @@ class AnsiTerminal {
Stream<String> _broadcastStdInString; Stream<String> _broadcastStdInString;
/// Return keystrokes from the console. @override
///
/// Useful when the console is in [singleCharMode].
Stream<String> get keystrokes { Stream<String> get keystrokes {
_broadcastStdInString ??= _stdio.stdin.transform<String>(const AsciiDecoder(allowInvalid: true)).asBroadcastStream(); _broadcastStdInString ??= _stdio.stdin.transform<String>(const AsciiDecoder(allowInvalid: true)).asBroadcastStream();
return _broadcastStdInString; return _broadcastStdInString;
} }
/// Prompts the user to input a character within a given list. Re-prompts if @override
/// entered character is not in the list.
///
/// The `prompt`, if non-null, is the text displayed prior to waiting for user
/// input each time. If `prompt` is non-null and `displayAcceptedCharacters`
/// is true, the accepted keys are printed next to the `prompt`.
///
/// The returned value is the user's input; if `defaultChoiceIndex` is not
/// null, and the user presses enter without any other input, the return value
/// will be the character in `acceptedCharacters` at the index given by
/// `defaultChoiceIndex`.
///
/// If [usesTerminalUi] is false, throws a [StateError].
Future<String> promptForCharInput( Future<String> promptForCharInput(
List<String> acceptedCharacters, { List<String> acceptedCharacters, {
@required Logger logger, @required Logger logger,
...@@ -262,3 +303,39 @@ class AnsiTerminal { ...@@ -262,3 +303,39 @@ class AnsiTerminal {
return choice; return choice;
} }
} }
class _TestTerminal implements Terminal {
@override
bool usesTerminalUi;
@override
String bolden(String message) => message;
@override
String clearScreen() => '\n\n';
@override
String color(String message, TerminalColor color) => message;
@override
Stream<String> get keystrokes => const Stream<String>.empty();
@override
Future<String> promptForCharInput(List<String> acceptedCharacters, {
@required Logger logger,
String prompt,
int defaultChoiceIndex,
bool displayAcceptedCharacters = true,
}) {
throw UnsupportedError('promptForCharInput not supported in the test terminal.');
}
@override
set singleCharMode(bool value) { }
@override
bool get supportsColor => false;
@override
bool get supportsEmoji => false;
}
...@@ -39,7 +39,7 @@ void main() { ...@@ -39,7 +39,7 @@ void main() {
processManager = FakeProcessManager.any(); processManager = FakeProcessManager.any();
terminal = MockTerminal(); terminal = MockTerminal();
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
bufferLogger = BufferLogger(terminal: terminal, outputPreferences: OutputPreferences.test()); bufferLogger = BufferLogger.test(terminal: terminal);
}); });
testUsingContext('Downgrade exits on unknown channel', () async { testUsingContext('Downgrade exits on unknown channel', () async {
......
...@@ -32,7 +32,7 @@ void main() { ...@@ -32,7 +32,7 @@ void main() {
rootOverride: cacheRoot, rootOverride: cacheRoot,
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
logger: MockLogger(), logger: BufferLogger.test(),
osUtils: MockOperatingSystemUtils(), osUtils: MockOperatingSystemUtils(),
); );
artifacts = CachedArtifacts( artifacts = CachedArtifacts(
...@@ -84,7 +84,7 @@ void main() { ...@@ -84,7 +84,7 @@ void main() {
rootOverride: cacheRoot, rootOverride: cacheRoot,
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
logger: MockLogger(), logger: BufferLogger.test(),
osUtils: MockOperatingSystemUtils(), osUtils: MockOperatingSystemUtils(),
); );
artifacts = LocalEngineArtifacts(fileSystem.currentDirectory.path, artifacts = LocalEngineArtifacts(fileSystem.currentDirectory.path,
...@@ -146,5 +146,4 @@ void main() { ...@@ -146,5 +146,4 @@ void main() {
}); });
} }
class MockLogger extends Mock implements Logger {}
class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {} class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {}
...@@ -6,27 +6,25 @@ import 'package:flutter_tools/src/base/command_help.dart'; ...@@ -6,27 +6,25 @@ import 'package:flutter_tools/src/base/command_help.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/terminal.dart' show AnsiTerminal, OutputPreferences; import 'package:flutter_tools/src/base/terminal.dart' show AnsiTerminal, OutputPreferences;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:mockito/mockito.dart';
import 'package:platform/platform.dart'; import 'package:platform/platform.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/mocks.dart' show MockStdio; import '../../src/mocks.dart' show MockStdio;
class MockLogger extends Mock implements Logger {}
CommandHelp _createCommandHelp({ CommandHelp _createCommandHelp({
@required bool ansi, @required bool ansi,
@required int wrapColumn, @required int wrapColumn,
}) { }) {
final MockPlatform mockPlatform = MockPlatform(); final Platform platform = FakePlatform(
when(mockPlatform.stdoutSupportsAnsi).thenReturn(ansi); stdoutSupportsAnsi: ansi,
);
return CommandHelp( return CommandHelp(
logger: MockLogger(), logger: BufferLogger.test(),
terminal: AnsiTerminal( terminal: AnsiTerminal(
stdio: MockStdio(), stdio: MockStdio(),
platform: mockPlatform, platform: platform,
), ),
platform: mockPlatform, platform: platform,
outputPreferences: OutputPreferences.test( outputPreferences: OutputPreferences.test(
showColor: ansi, showColor: ansi,
wrapColumn: wrapColumn, wrapColumn: wrapColumn,
...@@ -202,10 +200,3 @@ void main() { ...@@ -202,10 +200,3 @@ void main() {
}); });
}); });
} }
class MockPlatform extends Mock implements Platform {
@override
Map<String, String> environment = <String, String>{
'FLUTTER_ROOT': '/',
};
}
...@@ -32,11 +32,7 @@ void main() { ...@@ -32,11 +32,7 @@ void main() {
}); });
testWithoutContext('error', () async { testWithoutContext('error', () async {
final BufferLogger mockLogger = BufferLogger( final BufferLogger mockLogger = BufferLogger.test(
terminal: AnsiTerminal(
stdio: mocks.MockStdio(),
platform: _kNoAnsiPlatform,
),
outputPreferences: OutputPreferences.test(showColor: false), outputPreferences: OutputPreferences.test(showColor: false),
); );
final VerboseLogger verboseLogger = VerboseLogger( final VerboseLogger verboseLogger = VerboseLogger(
......
...@@ -19,8 +19,6 @@ const String kExecutable = 'foo'; ...@@ -19,8 +19,6 @@ const String kExecutable = 'foo';
const String kPath1 = '/bar/bin/$kExecutable'; const String kPath1 = '/bar/bin/$kExecutable';
const String kPath2 = '/another/bin/$kExecutable'; const String kPath2 = '/another/bin/$kExecutable';
class MockLogger extends Mock implements Logger {}
void main() { void main() {
MockProcessManager mockProcessManager; MockProcessManager mockProcessManager;
...@@ -31,7 +29,7 @@ void main() { ...@@ -31,7 +29,7 @@ void main() {
OperatingSystemUtils createOSUtils(Platform platform) { OperatingSystemUtils createOSUtils(Platform platform) {
return OperatingSystemUtils( return OperatingSystemUtils(
fileSystem: MemoryFileSystem(), fileSystem: MemoryFileSystem(),
logger: MockLogger(), logger: BufferLogger.test(),
platform: platform, platform: platform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
......
...@@ -19,8 +19,6 @@ import '../../src/mocks.dart' show MockProcess, ...@@ -19,8 +19,6 @@ import '../../src/mocks.dart' show MockProcess,
MockStdio, MockStdio,
flakyProcessFactory; flakyProcessFactory;
class MockLogger extends Mock implements Logger {}
void main() { void main() {
group('process exceptions', () { group('process exceptions', () {
ProcessManager mockProcessManager; ProcessManager mockProcessManager;
...@@ -30,7 +28,7 @@ void main() { ...@@ -30,7 +28,7 @@ void main() {
mockProcessManager = PlainMockProcessManager(); mockProcessManager = PlainMockProcessManager();
processUtils = ProcessUtils( processUtils = ProcessUtils(
processManager: mockProcessManager, processManager: mockProcessManager,
logger: MockLogger(), logger: BufferLogger.test(),
); );
}); });
...@@ -50,7 +48,7 @@ void main() { ...@@ -50,7 +48,7 @@ void main() {
int postProcessRecording; int postProcessRecording;
int cleanup; int cleanup;
final ShutdownHooks shutdownHooks = ShutdownHooks(logger: MockLogger()); final ShutdownHooks shutdownHooks = ShutdownHooks(logger: BufferLogger.test());
shutdownHooks.addShutdownHook(() async { shutdownHooks.addShutdownHook(() async {
serializeRecording1 = i++; serializeRecording1 = i++;
...@@ -132,11 +130,11 @@ void main() { ...@@ -132,11 +130,11 @@ void main() {
mockProcessManager = MockProcessManager(); mockProcessManager = MockProcessManager();
processUtils = ProcessUtils( processUtils = ProcessUtils(
processManager: mockProcessManager, processManager: mockProcessManager,
logger: MockLogger(), logger: BufferLogger.test(),
); );
flakyProcessUtils = ProcessUtils( flakyProcessUtils = ProcessUtils(
processManager: flakyProcessManager, processManager: flakyProcessManager,
logger: MockLogger(), logger: BufferLogger.test(),
); );
}); });
...@@ -345,7 +343,7 @@ void main() { ...@@ -345,7 +343,7 @@ void main() {
mockProcessManager = MockProcessManager(); mockProcessManager = MockProcessManager();
processUtils = ProcessUtils( processUtils = ProcessUtils(
processManager: mockProcessManager, processManager: mockProcessManager,
logger: MockLogger(), logger: BufferLogger.test(),
); );
}); });
...@@ -372,7 +370,7 @@ void main() { ...@@ -372,7 +370,7 @@ void main() {
mockProcessManager = MockProcessManager(); mockProcessManager = MockProcessManager();
processUtils = ProcessUtils( processUtils = ProcessUtils(
processManager: mockProcessManager, processManager: mockProcessManager,
logger: MockLogger(), logger: BufferLogger.test(),
); );
}); });
......
...@@ -6,7 +6,6 @@ import 'package:file/memory.dart'; ...@@ -6,7 +6,6 @@ import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/build_system/depfile.dart'; import 'package:flutter_tools/src/build_system/depfile.dart';
import 'package:mockito/mockito.dart';
import 'package:platform/platform.dart'; import 'package:platform/platform.dart';
import '../../src/common.dart'; import '../../src/common.dart';
...@@ -18,7 +17,7 @@ void main() { ...@@ -18,7 +17,7 @@ void main() {
setUp(() { setUp(() {
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
depfileService = DepfileService( depfileService = DepfileService(
logger: MockLogger(), logger: BufferLogger.test(),
fileSystem: fileSystem, fileSystem: fileSystem,
platform: FakePlatform(operatingSystem: 'linux'), platform: FakePlatform(operatingSystem: 'linux'),
); );
...@@ -64,7 +63,7 @@ a.txt c.txt d.txt: b.txt ...@@ -64,7 +63,7 @@ a.txt c.txt d.txt: b.txt
testWithoutContext('Can parse depfile with windows file paths', () { testWithoutContext('Can parse depfile with windows file paths', () {
fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
depfileService = DepfileService( depfileService = DepfileService(
logger: MockLogger(), logger: BufferLogger.test(),
fileSystem: fileSystem, fileSystem: fileSystem,
platform: FakePlatform(operatingSystem: 'windows'), platform: FakePlatform(operatingSystem: 'windows'),
); );
...@@ -80,7 +79,7 @@ C:\\a.txt: C:\\b.txt ...@@ -80,7 +79,7 @@ C:\\a.txt: C:\\b.txt
testWithoutContext('Can escape depfile with windows file paths and spaces in directory names', () { testWithoutContext('Can escape depfile with windows file paths and spaces in directory names', () {
fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
depfileService = DepfileService( depfileService = DepfileService(
logger: MockLogger(), logger: BufferLogger.test(),
fileSystem: fileSystem, fileSystem: fileSystem,
platform: FakePlatform(operatingSystem: 'windows'), platform: FakePlatform(operatingSystem: 'windows'),
); );
...@@ -176,5 +175,3 @@ file:///Users/foo/canonicalized_map.dart ...@@ -176,5 +175,3 @@ file:///Users/foo/canonicalized_map.dart
expect(depfile.outputs.single.path, 'foo.dart.js'); expect(depfile.outputs.single.path, 'foo.dart.js');
}); });
} }
class MockLogger extends Mock implements Logger {}
\ No newline at end of file
...@@ -7,13 +7,10 @@ import 'package:flutter_tools/src/base/config.dart'; ...@@ -7,13 +7,10 @@ import 'package:flutter_tools/src/base/config.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/terminal.dart';
import 'package:mockito/mockito.dart';
import 'package:platform/platform.dart'; import 'package:platform/platform.dart';
import '../src/common.dart'; import '../src/common.dart';
class MockLogger extends Mock implements Logger {}
void main() { void main() {
Config config; Config config;
MemoryFileSystem memoryFileSystem; MemoryFileSystem memoryFileSystem;
...@@ -30,7 +27,7 @@ void main() { ...@@ -30,7 +27,7 @@ void main() {
config = Config( config = Config(
'example', 'example',
fileSystem: memoryFileSystem, fileSystem: memoryFileSystem,
logger: MockLogger(), logger: BufferLogger.test(),
platform: fakePlatform, platform: fakePlatform,
); );
}); });
......
...@@ -38,28 +38,6 @@ import '../../src/common.dart'; ...@@ -38,28 +38,6 @@ import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/mocks.dart'; import '../../src/mocks.dart';
class MockIOSApp extends Mock implements IOSApp {}
class MockApplicationPackage extends Mock implements ApplicationPackage {}
class MockArtifacts extends Mock implements Artifacts {}
class MockCache extends Mock implements Cache {}
class MockDevicePortForwarder extends Mock implements DevicePortForwarder {}
class MockDirectory extends Mock implements Directory {}
class MockFile extends Mock implements File {}
class MockFileSystem extends Mock implements FileSystem {}
class MockForwardedPort extends Mock implements ForwardedPort {}
class MockIMobileDevice extends Mock implements IMobileDevice {}
class MockIOSDeploy extends Mock implements IOSDeploy {}
class MockLogger extends Mock implements Logger {}
class MockMDnsObservatoryDiscovery extends Mock implements MDnsObservatoryDiscovery {}
class MockMDnsObservatoryDiscoveryResult extends Mock implements MDnsObservatoryDiscoveryResult {}
class MockPlatform extends Mock implements Platform {}
class MockPortForwarder extends Mock implements DevicePortForwarder {}
// src/mocks.dart imports `MockProcessManager` which implements some methods, this is a full mock
class FullMockProcessManager extends Mock implements ProcessManager {}
class MockUsage extends Mock implements Usage {}
class MockXcdevice extends Mock implements XCDevice {}
class MockXcode extends Mock implements Xcode {}
void main() { void main() {
final FakePlatform macPlatform = FakePlatform.fromPlatform(const LocalPlatform()); final FakePlatform macPlatform = FakePlatform.fromPlatform(const LocalPlatform());
macPlatform.operatingSystem = 'macos'; macPlatform.operatingSystem = 'macos';
...@@ -72,7 +50,7 @@ void main() { ...@@ -72,7 +50,7 @@ void main() {
final List<Platform> unsupportedPlatforms = <Platform>[linuxPlatform, windowsPlatform]; final List<Platform> unsupportedPlatforms = <Platform>[linuxPlatform, windowsPlatform];
Artifacts mockArtifacts; Artifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockLogger mockLogger; Logger logger;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
FileSystem mockFileSystem; FileSystem mockFileSystem;
...@@ -82,11 +60,11 @@ void main() { ...@@ -82,11 +60,11 @@ void main() {
const MapEntry<String, String> dyLdLibEntry = MapEntry<String, String>('DYLD_LIBRARY_PATH', '/path/to/libs'); const MapEntry<String, String> dyLdLibEntry = MapEntry<String, String>('DYLD_LIBRARY_PATH', '/path/to/libs');
when(mockCache.dyLdLibEntry).thenReturn(dyLdLibEntry); when(mockCache.dyLdLibEntry).thenReturn(dyLdLibEntry);
mockFileSystem = MockFileSystem(); mockFileSystem = MockFileSystem();
mockLogger = MockLogger(); logger = BufferLogger.test();
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
); );
...@@ -189,7 +167,7 @@ void main() { ...@@ -189,7 +167,7 @@ void main() {
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
...@@ -264,7 +242,7 @@ void main() { ...@@ -264,7 +242,7 @@ void main() {
ForwardedPort forwardedPort; ForwardedPort forwardedPort;
Artifacts mockArtifacts; Artifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockLogger mockLogger; Logger logger;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
FileSystem mockFileSystem; FileSystem mockFileSystem;
...@@ -300,7 +278,7 @@ void main() { ...@@ -300,7 +278,7 @@ void main() {
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
); );
...@@ -979,7 +957,7 @@ void main() { ...@@ -979,7 +957,7 @@ void main() {
MockArtifacts mockArtifacts; MockArtifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockFileSystem mockFileSystem; MockFileSystem mockFileSystem;
MockLogger mockLogger; Logger logger;
MockPlatform mockPlatform; MockPlatform mockPlatform;
FullMockProcessManager mockProcessManager; FullMockProcessManager mockProcessManager;
const String iosDeployPath = '/path/to/ios-deploy'; const String iosDeployPath = '/path/to/ios-deploy';
...@@ -1003,7 +981,7 @@ void main() { ...@@ -1003,7 +981,7 @@ void main() {
mockArtifacts = MockArtifacts(); mockArtifacts = MockArtifacts();
mockCache = MockCache(); mockCache = MockCache();
mockLogger = MockLogger(); logger = BufferLogger.test();
mockPlatform = MockPlatform(); mockPlatform = MockPlatform();
when(mockPlatform.environment).thenReturn(<String, String>{}); when(mockPlatform.environment).thenReturn(<String, String>{});
when(mockPlatform.isMacOS).thenReturn(true); when(mockPlatform.isMacOS).thenReturn(true);
...@@ -1017,7 +995,7 @@ void main() { ...@@ -1017,7 +995,7 @@ void main() {
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: mockPlatform, platform: mockPlatform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
...@@ -1102,7 +1080,7 @@ void main() { ...@@ -1102,7 +1080,7 @@ void main() {
MockArtifacts mockArtifacts; MockArtifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockFileSystem mockFileSystem; MockFileSystem mockFileSystem;
MockLogger mockLogger; Logger logger;
FullMockProcessManager mockProcessManager; FullMockProcessManager mockProcessManager;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
...@@ -1110,13 +1088,13 @@ void main() { ...@@ -1110,13 +1088,13 @@ void main() {
mockXcdevice = MockXcdevice(); mockXcdevice = MockXcdevice();
mockArtifacts = MockArtifacts(); mockArtifacts = MockArtifacts();
mockCache = MockCache(); mockCache = MockCache();
mockLogger = MockLogger(); logger = BufferLogger.test();
mockFileSystem = MockFileSystem(); mockFileSystem = MockFileSystem();
mockProcessManager = FullMockProcessManager(); mockProcessManager = FullMockProcessManager();
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
...@@ -1201,7 +1179,7 @@ void main() { ...@@ -1201,7 +1179,7 @@ void main() {
MockArtifacts mockArtifacts; MockArtifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockFileSystem mockFileSystem; MockFileSystem mockFileSystem;
MockLogger mockLogger; Logger logger;
FullMockProcessManager mockProcessManager; FullMockProcessManager mockProcessManager;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
...@@ -1210,13 +1188,13 @@ void main() { ...@@ -1210,13 +1188,13 @@ void main() {
mockIosProject = MockIosProject(); mockIosProject = MockIosProject();
mockArtifacts = MockArtifacts(); mockArtifacts = MockArtifacts();
mockCache = MockCache(); mockCache = MockCache();
mockLogger = MockLogger(); logger = BufferLogger.test();
mockFileSystem = MockFileSystem(); mockFileSystem = MockFileSystem();
mockProcessManager = FullMockProcessManager(); mockProcessManager = FullMockProcessManager();
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
...@@ -1302,7 +1280,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt ...@@ -1302,7 +1280,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
group('isSupportedForProject', () { group('isSupportedForProject', () {
Artifacts mockArtifacts; Artifacts mockArtifacts;
MockCache mockCache; MockCache mockCache;
MockLogger mockLogger; Logger logger;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
setUp(() { setUp(() {
...@@ -1311,7 +1289,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt ...@@ -1311,7 +1289,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: macPlatform, platform: macPlatform,
processManager: FakeProcessManager.any(), processManager: FakeProcessManager.any(),
); );
...@@ -1424,3 +1402,24 @@ class FakeIosDoctorProvider implements DoctorValidatorsProvider { ...@@ -1424,3 +1402,24 @@ class FakeIosDoctorProvider implements DoctorValidatorsProvider {
return _workflows; return _workflows;
} }
} }
class MockIOSApp extends Mock implements IOSApp {}
class MockApplicationPackage extends Mock implements ApplicationPackage {}
class MockArtifacts extends Mock implements Artifacts {}
class MockCache extends Mock implements Cache {}
class MockDevicePortForwarder extends Mock implements DevicePortForwarder {}
class MockDirectory extends Mock implements Directory {}
class MockFile extends Mock implements File {}
class MockFileSystem extends Mock implements FileSystem {}
class MockForwardedPort extends Mock implements ForwardedPort {}
class MockIMobileDevice extends Mock implements IMobileDevice {}
class MockIOSDeploy extends Mock implements IOSDeploy {}
class MockMDnsObservatoryDiscovery extends Mock implements MDnsObservatoryDiscovery {}
class MockMDnsObservatoryDiscoveryResult extends Mock implements MDnsObservatoryDiscoveryResult {}
class MockPlatform extends Mock implements Platform {}
class MockPortForwarder extends Mock implements DevicePortForwarder {}
// src/mocks.dart imports `MockProcessManager` which implements some methods, this is a full mock
class FullMockProcessManager extends Mock implements ProcessManager {}
class MockUsage extends Mock implements Usage {}
class MockXcdevice extends Mock implements XCDevice {}
class MockXcode extends Mock implements Xcode {}
...@@ -18,7 +18,6 @@ import '../../src/mocks.dart'; ...@@ -18,7 +18,6 @@ import '../../src/mocks.dart';
class MockArtifacts extends Mock implements Artifacts {} class MockArtifacts extends Mock implements Artifacts {}
class MockCache extends Mock implements Cache {} class MockCache extends Mock implements Cache {}
class MockLogger extends Mock implements Logger {}
class MockPlatform extends Mock implements Platform {} class MockPlatform extends Mock implements Platform {}
class MockProcess extends Mock implements Process {} class MockProcess extends Mock implements Process {}
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
...@@ -28,7 +27,7 @@ void main () { ...@@ -28,7 +27,7 @@ void main () {
Artifacts mockArtifacts; Artifacts mockArtifacts;
Cache mockCache; Cache mockCache;
IOSDeploy iosDeploy; IOSDeploy iosDeploy;
Logger mockLogger; Logger logger;
Platform mockPlatform; Platform mockPlatform;
ProcessManager mockProcessManager; ProcessManager mockProcessManager;
const String iosDeployPath = '/path/to/ios-deploy'; const String iosDeployPath = '/path/to/ios-deploy';
...@@ -42,7 +41,7 @@ void main () { ...@@ -42,7 +41,7 @@ void main () {
mockCache = MockCache(); mockCache = MockCache();
const MapEntry<String, String> mapEntry = MapEntry<String, String>('DYLD_LIBRARY_PATH', '/path/to/libs'); const MapEntry<String, String> mapEntry = MapEntry<String, String>('DYLD_LIBRARY_PATH', '/path/to/libs');
when(mockCache.dyLdLibEntry).thenReturn(mapEntry); when(mockCache.dyLdLibEntry).thenReturn(mapEntry);
mockLogger = MockLogger(); logger = BufferLogger.test();
mockPlatform = MockPlatform(); mockPlatform = MockPlatform();
when(mockPlatform.environment).thenReturn(<String, String>{ when(mockPlatform.environment).thenReturn(<String, String>{
'PATH': '/usr/local/bin:/usr/bin', 'PATH': '/usr/local/bin:/usr/bin',
...@@ -51,7 +50,7 @@ void main () { ...@@ -51,7 +50,7 @@ void main () {
iosDeploy = IOSDeploy( iosDeploy = IOSDeploy(
artifacts: mockArtifacts, artifacts: mockArtifacts,
cache: mockCache, cache: mockCache,
logger: mockLogger, logger: logger,
platform: mockPlatform, platform: mockPlatform,
processManager: mockProcessManager, processManager: mockProcessManager,
); );
......
...@@ -39,8 +39,7 @@ void main() { ...@@ -39,8 +39,7 @@ void main() {
fileSystem = MemoryFileSystem(); fileSystem = MemoryFileSystem();
fileSystem.file(xcodebuild).createSync(recursive: true); fileSystem.file(xcodebuild).createSync(recursive: true);
terminal = MockAnsiTerminal(); terminal = MockAnsiTerminal();
logger = BufferLogger( logger = BufferLogger.test(
outputPreferences: OutputPreferences.test(),
terminal: terminal terminal: terminal
); );
xcodeProjectInterpreter = XcodeProjectInterpreter( xcodeProjectInterpreter = XcodeProjectInterpreter(
...@@ -755,7 +754,6 @@ FakePlatform fakePlatform(String name) { ...@@ -755,7 +754,6 @@ FakePlatform fakePlatform(String name) {
class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {} class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {}
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {} class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
class MockLogger extends Mock implements Logger {}
class MockAnsiTerminal extends Mock implements AnsiTerminal { class MockAnsiTerminal extends Mock implements AnsiTerminal {
@override @override
bool get supportsColor => false; bool get supportsColor => false;
......
...@@ -17,16 +17,12 @@ import 'package:platform/platform.dart'; ...@@ -17,16 +17,12 @@ import 'package:platform/platform.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
class MockProcessManager extends Mock implements ProcessManager {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
class MockPlatform extends Mock implements Platform {}
void main() { void main() {
ProcessManager processManager; ProcessManager processManager;
Logger logger; Logger logger;
setUp(() { setUp(() {
logger = MockLogger(); logger = BufferLogger.test();
processManager = MockProcessManager(); processManager = MockProcessManager();
}); });
...@@ -570,5 +566,7 @@ void main() { ...@@ -570,5 +566,7 @@ void main() {
}); });
} }
class MockLogger extends Mock implements Logger {}
class MockXcode extends Mock implements Xcode {} class MockXcode extends Mock implements Xcode {}
class MockProcessManager extends Mock implements ProcessManager {}
class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
class MockPlatform extends Mock implements Platform {}
...@@ -7,12 +7,9 @@ import 'package:flutter_tools/src/base/file_system.dart'; ...@@ -7,12 +7,9 @@ import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/persistent_tool_state.dart'; import 'package:flutter_tools/src/persistent_tool_state.dart';
import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/version.dart';
import 'package:mockito/mockito.dart';
import '../src/common.dart'; import '../src/common.dart';
class MockLogger extends Mock implements Logger {}
void main() { void main() {
testWithoutContext('state can be set and persists', () { testWithoutContext('state can be set and persists', () {
final MemoryFileSystem fileSystem = MemoryFileSystem(); final MemoryFileSystem fileSystem = MemoryFileSystem();
...@@ -21,7 +18,7 @@ void main() { ...@@ -21,7 +18,7 @@ void main() {
final File stateFile = directory.childFile('.flutter_tool_state'); final File stateFile = directory.childFile('.flutter_tool_state');
final PersistentToolState state1 = PersistentToolState.test( final PersistentToolState state1 = PersistentToolState.test(
directory: directory, directory: directory,
logger: MockLogger(), logger: BufferLogger.test(),
); );
expect(state1.redisplayWelcomeMessage, null); expect(state1.redisplayWelcomeMessage, null);
state1.redisplayWelcomeMessage = true; state1.redisplayWelcomeMessage = true;
...@@ -32,7 +29,7 @@ void main() { ...@@ -32,7 +29,7 @@ void main() {
final PersistentToolState state2 = PersistentToolState.test( final PersistentToolState state2 = PersistentToolState.test(
directory: directory, directory: directory,
logger: MockLogger(), logger: BufferLogger.test(),
); );
expect(state2.redisplayWelcomeMessage, false); expect(state2.redisplayWelcomeMessage, false);
}); });
...@@ -42,7 +39,7 @@ void main() { ...@@ -42,7 +39,7 @@ void main() {
final Directory directory = fileSystem.directory('state_dir')..createSync(); final Directory directory = fileSystem.directory('state_dir')..createSync();
final PersistentToolState state1 = PersistentToolState.test( final PersistentToolState state1 = PersistentToolState.test(
directory: directory, directory: directory,
logger: MockLogger(), logger: BufferLogger.test(),
); );
state1.updateLastActiveVersion('abc', Channel.master); state1.updateLastActiveVersion('abc', Channel.master);
...@@ -52,7 +49,7 @@ void main() { ...@@ -52,7 +49,7 @@ void main() {
final PersistentToolState state2 = PersistentToolState.test( final PersistentToolState state2 = PersistentToolState.test(
directory: directory, directory: directory,
logger: MockLogger(), logger: BufferLogger.test(),
); );
expect(state2.lastActiveVersion(Channel.master), 'abc'); expect(state2.lastActiveVersion(Channel.master), 'abc');
......
...@@ -790,15 +790,17 @@ void main() { ...@@ -790,15 +790,17 @@ void main() {
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
// Ensure we got the URL and that it was already launched. // Ensure we got the URL and that it was already launched.
verify(globals.logger.sendEvent( expect((delegateLogger.delegate as BufferLogger).eventText,
'app.webLaunchUrl', contains(json.encode(<String, Object>{
argThat(allOf( 'name': 'app.webLaunchUrl',
containsPair('url', 'http://localhost:8765/app/'), 'args': <String, Object>{
containsPair('launched', true), 'url': 'http://localhost:8765/app/',
)) 'launched': true,
)); },
},
)));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Logger: () => DelegateLogger(MockLogger()), Logger: () => DelegateLogger(BufferLogger.test()),
ChromeLauncher: () => MockChromeLauncher(), ChromeLauncher: () => MockChromeLauncher(),
})); }));
...@@ -829,15 +831,17 @@ void main() { ...@@ -829,15 +831,17 @@ void main() {
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
// Ensure we got the URL and that it was not already launched. // Ensure we got the URL and that it was not already launched.
verify(globals.logger.sendEvent( expect((delegateLogger.delegate as BufferLogger).eventText,
'app.webLaunchUrl', contains(json.encode(<String, Object>{
argThat(allOf( 'name': 'app.webLaunchUrl',
containsPair('url', 'http://localhost:8765/app/'), 'args': <String, Object>{
containsPair('launched', false), 'url': 'http://localhost:8765/app/',
)) 'launched': false,
)); },
},
)));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Logger: () => DelegateLogger(MockLogger()) Logger: () => DelegateLogger(BufferLogger.test())
})); }));
test('Successfully turns WebSocketException into ToolExit', () => testbed.run(() async { test('Successfully turns WebSocketException into ToolExit', () => testbed.run(() async {
...@@ -962,6 +966,5 @@ class MockChromeConnection extends Mock implements ChromeConnection {} ...@@ -962,6 +966,5 @@ class MockChromeConnection extends Mock implements ChromeConnection {}
class MockChromeTab extends Mock implements ChromeTab {} class MockChromeTab extends Mock implements ChromeTab {}
class MockWipConnection extends Mock implements WipConnection {} class MockWipConnection extends Mock implements WipConnection {}
class MockWipDebugger extends Mock implements WipDebugger {} class MockWipDebugger extends Mock implements WipDebugger {}
class MockLogger extends Mock implements Logger {}
class MockWebServerDevice extends Mock implements WebServerDevice {} class MockWebServerDevice extends Mock implements WebServerDevice {}
class MockDevice extends Mock implements Device {} class MockDevice extends Mock implements Device {}
...@@ -34,10 +34,10 @@ void main() { ...@@ -34,10 +34,10 @@ void main() {
Platform platform; Platform platform;
FakeProcessManager processManager; FakeProcessManager processManager;
OperatingSystemUtils operatingSystemUtils; OperatingSystemUtils operatingSystemUtils;
MockLogger logger; Logger logger;
setUp(() { setUp(() {
logger = MockLogger(); logger = BufferLogger.test();
operatingSystemUtils = MockOperatingSystemUtils(); operatingSystemUtils = MockOperatingSystemUtils();
when(operatingSystemUtils.findFreePort()) when(operatingSystemUtils.findFreePort())
.thenAnswer((Invocation invocation) async { .thenAnswer((Invocation invocation) async {
...@@ -163,4 +163,3 @@ void main() { ...@@ -163,4 +163,3 @@ void main() {
} }
class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {} class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {}
class MockLogger extends Mock implements Logger {}
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