From fc35508a407aef3d3715abbbdb63e02fa6bbd216 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 2 Mar 2021 10:35:44 -0800 Subject: [PATCH] [flutter_tools] remove mock from logger tests (#77064) --- .../test/general.shard/base/logger_test.dart | 112 +++++++----------- 1 file changed, 41 insertions(+), 71 deletions(-) diff --git a/packages/flutter_tools/test/general.shard/base/logger_test.dart b/packages/flutter_tools/test/general.shard/base/logger_test.dart index 4d7b3e3bff5..08315f2d538 100644 --- a/packages/flutter_tools/test/general.shard/base/logger_test.dart +++ b/packages/flutter_tools/test/general.shard/base/logger_test.dart @@ -13,8 +13,9 @@ import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/commands/daemon.dart'; import 'package:matcher/matcher.dart'; -import 'package:mockito/mockito.dart'; import 'package:fake_async/fake_async.dart'; +import 'package:meta/meta.dart'; +import 'package:test/fake.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -26,8 +27,6 @@ final String bold = RegExp.escape(AnsiTerminal.bold); final String resetBold = RegExp.escape(AnsiTerminal.resetBold); final String resetColor = RegExp.escape(AnsiTerminal.resetColor); -class MockStdout extends Mock implements Stdout {} - void main() { testWithoutContext('correct logger instance is created', () { final LoggerFactory loggerFactory = LoggerFactory( @@ -291,23 +290,9 @@ void main() { }); testWithoutContext('Logger does not throw when stdio write throws synchronously', () async { - final MockStdout stdout = MockStdout(); - final MockStdout stderr = MockStdout(); + final FakeStdout stdout = FakeStdout(syncError: true); + final FakeStdout stderr = FakeStdout(syncError: true); final Stdio stdio = Stdio.test(stdout: stdout, stderr: stderr); - bool stdoutThrew = false; - bool stderrThrew = false; - final Completer stdoutError = Completer(); - final Completer stderrError = Completer(); - when(stdout.write(any)).thenAnswer((_) { - stdoutThrew = true; - throw 'Error'; - }); - when(stderr.write(any)).thenAnswer((_) { - stderrThrew = true; - throw 'Error'; - }); - when(stdout.done).thenAnswer((_) => stdoutError.future); - when(stderr.done).thenAnswer((_) => stderrError.future); final Logger logger = StdoutLogger( terminal: AnsiTerminal( stdio: stdio, @@ -316,38 +301,15 @@ void main() { stdio: stdio, outputPreferences: OutputPreferences.test(), ); + logger.printStatus('message'); logger.printError('error message'); - expect(stdoutThrew, true); - expect(stderrThrew, true); }); testWithoutContext('Logger does not throw when stdio write throws asynchronously', () async { - final MockStdout stdout = MockStdout(); - final MockStdout stderr = MockStdout(); + final FakeStdout stdout = FakeStdout(syncError: false); + final FakeStdout stderr = FakeStdout(syncError: false); final Stdio stdio = Stdio.test(stdout: stdout, stderr: stderr); - final Completer stdoutError = Completer(); - final Completer stderrError = Completer(); - bool stdoutThrew = false; - bool stderrThrew = false; - final Completer stdoutCompleter = Completer(); - final Completer stderrCompleter = Completer(); - when(stdout.write(any)).thenAnswer((_) { - Zone.current.runUnaryGuarded((_) { - stdoutThrew = true; - stdoutCompleter.complete(); - throw 'Error'; - }, null); - }); - when(stderr.write(any)).thenAnswer((_) { - Zone.current.runUnaryGuarded((_) { - stderrThrew = true; - stderrCompleter.complete(); - throw 'Error'; - }, null); - }); - when(stdout.done).thenAnswer((_) => stdoutError.future); - when(stderr.done).thenAnswer((_) => stderrError.future); final Logger logger = StdoutLogger( terminal: AnsiTerminal( stdio: stdio, @@ -358,34 +320,15 @@ void main() { ); logger.printStatus('message'); logger.printError('error message'); - await stdoutCompleter.future; - await stderrCompleter.future; - expect(stdoutThrew, true); - expect(stderrThrew, true); + + await stdout.done; + await stderr.done; }); testWithoutContext('Logger does not throw when stdio completes done with an error', () async { - final MockStdout stdout = MockStdout(); - final MockStdout stderr = MockStdout(); + final FakeStdout stdout = FakeStdout(syncError: false, completeWithError: true); + final FakeStdout stderr = FakeStdout(syncError: false, completeWithError: true); final Stdio stdio = Stdio.test(stdout: stdout, stderr: stderr); - final Completer stdoutError = Completer(); - final Completer stderrError = Completer(); - final Completer stdoutCompleter = Completer(); - final Completer stderrCompleter = Completer(); - when(stdout.write(any)).thenAnswer((_) { - Zone.current.runUnaryGuarded((_) { - stdoutError.completeError(Exception('Some pipe error')); - stdoutCompleter.complete(); - }, null); - }); - when(stderr.write(any)).thenAnswer((_) { - Zone.current.runUnaryGuarded((_) { - stderrError.completeError(Exception('Some pipe error')); - stderrCompleter.complete(); - }, null); - }); - when(stdout.done).thenAnswer((_) => stdoutError.future); - when(stderr.done).thenAnswer((_) => stderrError.future); final Logger logger = StdoutLogger( terminal: AnsiTerminal( stdio: stdio, @@ -396,8 +339,9 @@ void main() { ); logger.printStatus('message'); logger.printError('error message'); - await stdoutCompleter.future; - await stderrCompleter.future; + + expect(() async => await stdout.done, throwsA(isA())); + expect(() async => await stderr.done, throwsA(isA())); }); group('Spinners', () { @@ -1175,3 +1119,29 @@ Matcher _matchesInvocation(Invocation expected) { /// to [FakeLogger]. Matcher _throwsInvocationFor(dynamic Function() fakeCall) => throwsA(_matchesInvocation(_invocationFor(fakeCall))); + +class FakeStdout extends Fake implements Stdout { + FakeStdout({@required this.syncError, this.completeWithError = false}); + + final bool syncError; + final bool completeWithError; + final Completer _completer = Completer(); + + @override + void write(Object object) { + if (syncError) { + throw 'Error!'; + } + Zone.current.runUnaryGuarded((_) { + if (completeWithError) { + _completer.completeError(Exception('Some pipe error')); + } else { + _completer.complete(); + throw 'Error!'; + } + }, null); + } + + @override + Future get done => _completer.future; +}