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

Ensure we stop the status when browser connection is complete (#42698)

parent 3bc3b323
......@@ -164,11 +164,13 @@ class ResidentWebRunner extends ResidentRunner {
final String modeName = debuggingOptions.buildInfo.friendlyModeName;
printStatus('Launching ${getDisplayPath(target)} on ${device.name} in $modeName mode...');
Status buildStatus;
bool statusActive = false;
try {
// dwds does not handle uncaught exceptions from its servers. To work
// around this, we need to catch all uncaught exceptions and determine if
// they are fatal or not.
buildStatus = logger.startProgress('Building application for the web...', timeout: null);
statusActive = true;
final int result = await asyncGuard(() async {
_webFs = await webFsFactory(
target: target,
......@@ -199,6 +201,8 @@ class ResidentWebRunner extends ResidentRunner {
_connectionResult = await _webFs.connect(debuggingOptions);
unawaited(_connectionResult.debugConnection.onDone.whenComplete(() => exit(0)));
}
buildStatus.stop();
statusActive = false;
appStartedCompleter?.complete();
return attach(
connectionInfoCompleter: connectionInfoCompleter,
......@@ -220,7 +224,9 @@ class ResidentWebRunner extends ResidentRunner {
}
rethrow;
} finally {
buildStatus.stop();
if (statusActive) {
buildStatus.stop();
}
}
return 1;
}
......
......@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/globals.dart';
......@@ -130,7 +131,10 @@ void main() {
test('Can successfully run and connect to vmservice', () => testbed.run(() async {
_setupMocks();
final BufferLogger bufferLogger = logger;
final DelegateLogger delegateLogger = logger;
final BufferLogger bufferLogger = delegateLogger.delegate;
final MockStatus status = MockStatus();
delegateLogger.status = status;
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter,
......@@ -139,8 +143,12 @@ void main() {
verify(mockAppConnection.runMain()).called(1);
verify(mockVmService.registerService('reloadSources', 'FlutterTools')).called(1);
verify(status.stop()).called(2);
expect(bufferLogger.statusText, contains('Debug service listening on ws://127.0.0.1/abcd/'));
expect(debugConnectionInfo.wsUri.toString(), 'ws://127.0.0.1/abcd/');
}, overrides: <Type, Generator>{
Logger: () => DelegateLogger(BufferLogger()),
}));
test('Listens to stdout streams before running main', () => testbed.run(() async {
......@@ -523,6 +531,9 @@ void main() {
test('Rethrows unknown exception type from web tooling', () => testbed.run(() async {
_setupMocks();
final DelegateLogger delegateLogger = logger;
final MockStatus mockStatus = MockStatus();
delegateLogger.status = mockStatus;
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
final Completer<void> unhandledErrorCompleter = Completer<void>();
when(mockWebFs.connect(any)).thenAnswer((Invocation _) async {
......@@ -538,6 +549,9 @@ void main() {
unhandledErrorCompleter.complete();
await expectation;
verify(mockStatus.stop()).called(2);
}, overrides: <Type, Generator>{
Logger: () => DelegateLogger(BufferLogger())
}));
}
......@@ -548,3 +562,64 @@ class MockFlutterWebFs extends Mock implements WebFs {}
class MockDebugConnection extends Mock implements DebugConnection {}
class MockAppConnection extends Mock implements AppConnection {}
class MockVmService extends Mock implements VmService {}
class MockStatus extends Mock implements Status {}
class DelegateLogger implements Logger {
DelegateLogger(this.delegate);
final Logger delegate;
Status status;
@override
bool get quiet => delegate.quiet;
@override
set quiet(bool value) => delegate.quiet;
@override
bool get hasTerminal => delegate.hasTerminal;
@override
bool get isVerbose => delegate.isVerbose;
@override
void printError(String message, {StackTrace stackTrace, bool emphasis, TerminalColor color, int indent, int hangingIndent, bool wrap}) {
delegate.printError(
message,
stackTrace: stackTrace,
emphasis: emphasis,
color: color,
indent: indent,
hangingIndent: hangingIndent,
wrap: wrap,
);
}
@override
void printStatus(String message, {bool emphasis, TerminalColor color, bool newline, int indent, int hangingIndent, bool wrap}) {
delegate.printStatus(message,
emphasis: emphasis,
color: color,
indent: indent,
hangingIndent: hangingIndent,
wrap: wrap,
);
}
@override
void printTrace(String message) {
delegate.printTrace(message);
}
@override
void sendNotification(String message, {String progressId}) {
delegate.sendNotification(message, progressId: progressId);
}
@override
Status startProgress(String message, {Duration timeout, String progressId, bool multilineOutput = false, int progressIndicatorPadding = kDefaultStatusPadding}) {
return status;
}
@override
bool get supportsColor => delegate.supportsColor;
}
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