Unverified Commit 90bc7c64 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] fix calling debugToggleBrightness on release mode (#66401)

ensure that the terminal handler checks if the service protocol is enabled before calling debug toggle brightness. Also removes globals from TerminalHander and test cases.

Fixes #65477
parent a6a8a14d
...@@ -197,55 +197,74 @@ abstract class ResidentWebRunner extends ResidentRunner { ...@@ -197,55 +197,74 @@ abstract class ResidentWebRunner extends ResidentRunner {
} }
@override @override
Future<void> debugDumpApp() async { Future<bool> debugDumpApp() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterDebugDumpApp( ?.flutterDebugDumpApp(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugDumpRenderTree() async { Future<bool> debugDumpRenderTree() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterDebugDumpRenderTree( ?.flutterDebugDumpRenderTree(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugDumpLayerTree() async { Future<bool> debugDumpLayerTree() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterDebugDumpLayerTree( ?.flutterDebugDumpLayerTree(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugDumpSemanticsTreeInTraversalOrder() async { Future<bool> debugDumpSemanticsTreeInTraversalOrder() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterDebugDumpSemanticsTreeInTraversalOrder( ?.flutterDebugDumpSemanticsTreeInTraversalOrder(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugTogglePlatform() async { Future<bool> debugTogglePlatform() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
final String currentPlatform = await _vmService final String currentPlatform = await _vmService
?.flutterPlatformOverride( ?.flutterPlatformOverride(
...@@ -259,12 +278,16 @@ abstract class ResidentWebRunner extends ResidentRunner { ...@@ -259,12 +278,16 @@ abstract class ResidentWebRunner extends ResidentRunner {
); );
globals.printStatus('Switched operating system to $platform'); globals.printStatus('Switched operating system to $platform');
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleBrightness() async { Future<bool> debugToggleBrightness() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
final Brightness currentBrightness = await _vmService final Brightness currentBrightness = await _vmService
?.flutterBrightnessOverride( ?.flutterBrightnessOverride(
...@@ -283,8 +306,9 @@ abstract class ResidentWebRunner extends ResidentRunner { ...@@ -283,8 +306,9 @@ abstract class ResidentWebRunner extends ResidentRunner {
); );
globals.logger.printStatus('Changed brightness to $next.'); globals.logger.printStatus('Changed brightness to $next.');
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
...@@ -294,87 +318,115 @@ abstract class ResidentWebRunner extends ResidentRunner { ...@@ -294,87 +318,115 @@ abstract class ResidentWebRunner extends ResidentRunner {
} }
@override @override
Future<void> debugDumpSemanticsTreeInInverseHitTestOrder() async { Future<bool> debugDumpSemanticsTreeInInverseHitTestOrder() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterDebugDumpSemanticsTreeInInverseHitTestOrder( ?.flutterDebugDumpSemanticsTreeInInverseHitTestOrder(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleDebugPaintSizeEnabled() async { Future<bool> debugToggleDebugPaintSizeEnabled() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterToggleDebugPaintSizeEnabled( ?.flutterToggleDebugPaintSizeEnabled(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleDebugCheckElevationsEnabled() async { Future<bool> debugToggleDebugCheckElevationsEnabled() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterToggleDebugCheckElevationsEnabled( ?.flutterToggleDebugCheckElevationsEnabled(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugTogglePerformanceOverlayOverride() async { Future<bool> debugTogglePerformanceOverlayOverride() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterTogglePerformanceOverlayOverride( ?.flutterTogglePerformanceOverlayOverride(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleWidgetInspector() async { Future<bool> debugToggleWidgetInspector() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterToggleWidgetInspector( ?.flutterToggleWidgetInspector(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleInvertOversizedImages() async { Future<bool> debugToggleInvertOversizedImages() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterToggleInvertOversizedImages( ?.flutterToggleInvertOversizedImages(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
@override @override
Future<void> debugToggleProfileWidgetBuilds() async { Future<bool> debugToggleProfileWidgetBuilds() async {
if (!supportsServiceProtocol) {
return false;
}
try { try {
await _vmService await _vmService
?.flutterToggleProfileWidgetBuilds( ?.flutterToggleProfileWidgetBuilds(
isolateId: null, isolateId: null,
); );
} on vmservice.RPCError { } on vmservice.RPCError {
return; // do nothing.
} }
return true;
} }
} }
......
...@@ -340,7 +340,12 @@ class AttachCommand extends FlutterCommand { ...@@ -340,7 +340,12 @@ class AttachCommand extends FlutterCommand {
final Completer<void> onAppStart = Completer<void>.sync(); final Completer<void> onAppStart = Completer<void>.sync();
TerminalHandler terminalHandler; TerminalHandler terminalHandler;
unawaited(onAppStart.future.whenComplete(() { unawaited(onAppStart.future.whenComplete(() {
terminalHandler = TerminalHandler(runner) terminalHandler = TerminalHandler(
runner,
logger: globals.logger,
terminal: globals.terminal,
signals: globals.signals,
)
..setupTerminal() ..setupTerminal()
..registerSignalHandlers(); ..registerSignalHandlers();
})); }));
......
...@@ -592,7 +592,12 @@ class RunCommand extends RunCommandBase { ...@@ -592,7 +592,12 @@ class RunCommand extends RunCommandBase {
(_) { (_) {
appStartedTime = globals.systemClock.now(); appStartedTime = globals.systemClock.now();
if (stayResident) { if (stayResident) {
TerminalHandler(runner) TerminalHandler(
runner,
logger: globals.logger,
terminal: globals.terminal,
signals: globals.signals,
)
..setupTerminal() ..setupTerminal()
..registerSignalHandlers(); ..registerSignalHandlers();
} }
......
...@@ -20,6 +20,7 @@ import 'base/io.dart' as io; ...@@ -20,6 +20,7 @@ import 'base/io.dart' as io;
import 'base/logger.dart'; import 'base/logger.dart';
import 'base/platform.dart'; import 'base/platform.dart';
import 'base/signals.dart'; import 'base/signals.dart';
import 'base/terminal.dart';
import 'base/utils.dart'; import 'base/utils.dart';
import 'build_info.dart'; import 'build_info.dart';
import 'build_system/build_system.dart'; import 'build_system/build_system.dart';
...@@ -978,73 +979,120 @@ abstract class ResidentRunner { ...@@ -978,73 +979,120 @@ abstract class ResidentRunner {
appFinished(); appFinished();
} }
Future<void> debugDumpApp() async { Future<bool> debugDumpApp() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugDumpApp(); await device.debugDumpApp();
} }
return true;
} }
Future<void> debugDumpRenderTree() async { Future<bool> debugDumpRenderTree() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugDumpRenderTree(); await device.debugDumpRenderTree();
} }
return true;
} }
Future<void> debugDumpLayerTree() async { Future<bool> debugDumpLayerTree() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugDumpLayerTree(); await device.debugDumpLayerTree();
} }
return true;
} }
Future<void> debugDumpSemanticsTreeInTraversalOrder() async { Future<bool> debugDumpSemanticsTreeInTraversalOrder() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugDumpSemanticsTreeInTraversalOrder(); await device.debugDumpSemanticsTreeInTraversalOrder();
} }
return true;
} }
Future<void> debugDumpSemanticsTreeInInverseHitTestOrder() async { Future<bool> debugDumpSemanticsTreeInInverseHitTestOrder() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugDumpSemanticsTreeInInverseHitTestOrder(); await device.debugDumpSemanticsTreeInInverseHitTestOrder();
} }
return true;
} }
Future<void> debugToggleDebugPaintSizeEnabled() async { Future<bool> debugToggleDebugPaintSizeEnabled() async {
if (!supportsServiceProtocol || !isRunningDebug) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.toggleDebugPaintSizeEnabled(); await device.toggleDebugPaintSizeEnabled();
} }
return true;
} }
Future<void> debugToggleDebugCheckElevationsEnabled() async { Future<bool> debugToggleDebugCheckElevationsEnabled() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.toggleDebugCheckElevationsEnabled(); await device.toggleDebugCheckElevationsEnabled();
} }
return true;
} }
Future<void> debugTogglePerformanceOverlayOverride() async { Future<bool> debugTogglePerformanceOverlayOverride() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.debugTogglePerformanceOverlayOverride(); await device.debugTogglePerformanceOverlayOverride();
} }
return true;
} }
Future<void> debugToggleWidgetInspector() async { Future<bool> debugToggleWidgetInspector() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.toggleWidgetInspector(); await device.toggleWidgetInspector();
} }
return true;
} }
Future<void> debugToggleInvertOversizedImages() async { Future<bool> debugToggleInvertOversizedImages() async {
if (!supportsServiceProtocol || !isRunningDebug) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.toggleInvertOversizedImages(); await device.toggleInvertOversizedImages();
} }
return true;
} }
Future<void> debugToggleProfileWidgetBuilds() async { Future<bool> debugToggleProfileWidgetBuilds() async {
if (!supportsServiceProtocol) {
return false;
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.toggleProfileWidgetBuilds(); await device.toggleProfileWidgetBuilds();
} }
return true;
} }
Future<void> debugToggleBrightness() async { Future<bool> debugToggleBrightness() async {
if (!supportsServiceProtocol) {
return false;
}
final Brightness brightness = await flutterDevices.first.toggleBrightness(); final Brightness brightness = await flutterDevices.first.toggleBrightness();
Brightness next; Brightness next;
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
...@@ -1053,6 +1101,7 @@ abstract class ResidentRunner { ...@@ -1053,6 +1101,7 @@ abstract class ResidentRunner {
); );
globals.logger.printStatus('Changed brightness to $next.'); globals.logger.printStatus('Changed brightness to $next.');
} }
return true;
} }
/// Take a screenshot on the provided [device]. /// Take a screenshot on the provided [device].
...@@ -1117,7 +1166,10 @@ abstract class ResidentRunner { ...@@ -1117,7 +1166,10 @@ abstract class ResidentRunner {
} }
} }
Future<void> debugTogglePlatform() async { Future<bool> debugTogglePlatform() async {
if (!supportsServiceProtocol || !isRunningDebug) {
return false;
}
final List<FlutterView> views = await flutterDevices final List<FlutterView> views = await flutterDevices
.first .first
.vmService.getFlutterViews(); .vmService.getFlutterViews();
...@@ -1131,6 +1183,7 @@ abstract class ResidentRunner { ...@@ -1131,6 +1183,7 @@ abstract class ResidentRunner {
to = await device.togglePlatform(from: from); to = await device.togglePlatform(from: from);
} }
globals.printStatus('Switched operating system to $to'); globals.printStatus('Switched operating system to $to');
return true;
} }
Future<void> stopEchoingDeviceLog() async { Future<void> stopEchoingDeviceLog() async {
...@@ -1229,10 +1282,14 @@ abstract class ResidentRunner { ...@@ -1229,10 +1282,14 @@ abstract class ResidentRunner {
} }
} }
Future<void> launchDevTools() async { Future<bool> launchDevTools() async {
if (!supportsServiceProtocol) {
return false;
}
assert(supportsServiceProtocol); assert(supportsServiceProtocol);
_devtoolsLauncher ??= DevtoolsLauncher.instance; _devtoolsLauncher ??= DevtoolsLauncher.instance;
return _devtoolsLauncher.launch(flutterDevices.first.vmService.httpAddress); await _devtoolsLauncher.launch(flutterDevices.first.vmService.httpAddress);
return true;
} }
Future<void> shutdownDevtools() async { Future<void> shutdownDevtools() async {
...@@ -1390,7 +1447,17 @@ Future<String> getMissingPackageHintForPlatform(TargetPlatform platform) async { ...@@ -1390,7 +1447,17 @@ Future<String> getMissingPackageHintForPlatform(TargetPlatform platform) async {
/// Redirects terminal commands to the correct resident runner methods. /// Redirects terminal commands to the correct resident runner methods.
class TerminalHandler { class TerminalHandler {
TerminalHandler(this.residentRunner); TerminalHandler(this.residentRunner, {
@required Logger logger,
@required Terminal terminal,
@required Signals signals,
}) : _logger = logger,
_terminal = terminal,
_signals = signals;
final Logger _logger;
final Terminal _terminal;
final Signals _signals;
final ResidentRunner residentRunner; final ResidentRunner residentRunner;
bool _processingUserRequest = false; bool _processingUserRequest = false;
...@@ -1400,19 +1467,19 @@ class TerminalHandler { ...@@ -1400,19 +1467,19 @@ class TerminalHandler {
String lastReceivedCommand; String lastReceivedCommand;
void setupTerminal() { void setupTerminal() {
if (!globals.logger.quiet) { if (!_logger.quiet) {
globals.printStatus(''); _logger.printStatus('');
residentRunner.printHelp(details: false); residentRunner.printHelp(details: false);
} }
globals.terminal.singleCharMode = true; _terminal.singleCharMode = true;
subscription = globals.terminal.keystrokes.listen(processTerminalInput); subscription = _terminal.keystrokes.listen(processTerminalInput);
} }
final Map<io.ProcessSignal, Object> _signalTokens = <io.ProcessSignal, Object>{}; final Map<io.ProcessSignal, Object> _signalTokens = <io.ProcessSignal, Object>{};
void _addSignalHandler(io.ProcessSignal signal, SignalHandler handler) { void _addSignalHandler(io.ProcessSignal signal, SignalHandler handler) {
_signalTokens[signal] = globals.signals.addHandler(signal, handler); _signalTokens[signal] = _signals.addHandler(signal, handler);
} }
void registerSignalHandlers() { void registerSignalHandlers() {
...@@ -1431,7 +1498,7 @@ class TerminalHandler { ...@@ -1431,7 +1498,7 @@ class TerminalHandler {
void stop() { void stop() {
assert(residentRunner.stayResident); assert(residentRunner.stayResident);
for (final MapEntry<io.ProcessSignal, Object> entry in _signalTokens.entries) { for (final MapEntry<io.ProcessSignal, Object> entry in _signalTokens.entries) {
globals.signals.removeHandler(entry.key, entry.value); _signals.removeHandler(entry.key, entry.value);
} }
_signalTokens.clear(); _signalTokens.clear();
subscription.cancel(); subscription.cancel();
...@@ -1439,17 +1506,12 @@ class TerminalHandler { ...@@ -1439,17 +1506,12 @@ class TerminalHandler {
/// Returns [true] if the input has been handled by this function. /// Returns [true] if the input has been handled by this function.
Future<bool> _commonTerminalInputHandler(String character) async { Future<bool> _commonTerminalInputHandler(String character) async {
globals.printStatus(''); // the key the user tapped might be on this line _logger.printStatus(''); // the key the user tapped might be on this line
switch(character) { switch (character) {
case 'a': case 'a':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugToggleProfileWidgetBuilds();
await residentRunner.debugToggleProfileWidgetBuilds();
return true;
}
return false;
case 'b': case 'b':
await residentRunner.debugToggleBrightness(); return residentRunner.debugToggleBrightness();
return true;
case 'c': case 'c':
residentRunner.clearScreen(); residentRunner.clearScreen();
return true; return true;
...@@ -1467,30 +1529,14 @@ class TerminalHandler { ...@@ -1467,30 +1529,14 @@ class TerminalHandler {
residentRunner.printHelp(details: true); residentRunner.printHelp(details: true);
return true; return true;
case 'i': case 'i':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugToggleWidgetInspector();
await residentRunner.debugToggleWidgetInspector();
return true;
}
return false;
case 'I': case 'I':
if (residentRunner.supportsServiceProtocol && residentRunner.isRunningDebug) { return residentRunner.debugToggleInvertOversizedImages();
await residentRunner.debugToggleInvertOversizedImages();
return true;
}
return false;
case 'L': case 'L':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugDumpLayerTree();
await residentRunner.debugDumpLayerTree();
return true;
}
return false;
case 'o': case 'o':
case 'O': case 'O':
if (residentRunner.supportsServiceProtocol && residentRunner.isRunningDebug) { return residentRunner.debugTogglePlatform();
await residentRunner.debugTogglePlatform();
return true;
}
return false;
case 'M': case 'M':
if (residentRunner.supportsWriteSkSL) { if (residentRunner.supportsWriteSkSL) {
await residentRunner.writeSkSL(); await residentRunner.writeSkSL();
...@@ -1498,17 +1544,9 @@ class TerminalHandler { ...@@ -1498,17 +1544,9 @@ class TerminalHandler {
} }
return false; return false;
case 'p': case 'p':
if (residentRunner.supportsServiceProtocol && residentRunner.isRunningDebug) { return residentRunner.debugToggleDebugPaintSizeEnabled();
await residentRunner.debugToggleDebugPaintSizeEnabled();
return true;
}
return false;
case 'P': case 'P':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugTogglePerformanceOverlayOverride();
await residentRunner.debugTogglePerformanceOverlayOverride();
return true;
}
return false;
case 'q': case 'q':
case 'Q': case 'Q':
// exit // exit
...@@ -1523,7 +1561,7 @@ class TerminalHandler { ...@@ -1523,7 +1561,7 @@ class TerminalHandler {
throwToolExit(result.message); throwToolExit(result.message);
} }
if (!result.isOk) { if (!result.isOk) {
globals.printStatus('Try again after fixing the above error(s).', emphasis: true); _logger.printStatus('Try again after fixing the above error(s).', emphasis: true);
} }
return true; return true;
case 'R': case 'R':
...@@ -1536,7 +1574,7 @@ class TerminalHandler { ...@@ -1536,7 +1574,7 @@ class TerminalHandler {
throwToolExit(result.message); throwToolExit(result.message);
} }
if (!result.isOk) { if (!result.isOk) {
globals.printStatus('Try again after fixing the above error(s).', emphasis: true); _logger.printStatus('Try again after fixing the above error(s).', emphasis: true);
} }
return true; return true;
case 's': case 's':
...@@ -1547,41 +1585,20 @@ class TerminalHandler { ...@@ -1547,41 +1585,20 @@ class TerminalHandler {
} }
return true; return true;
case 'S': case 'S':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugDumpSemanticsTreeInTraversalOrder();
await residentRunner.debugDumpSemanticsTreeInTraversalOrder();
return true;
}
return false;
case 't': case 't':
case 'T': case 'T':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugDumpRenderTree();
await residentRunner.debugDumpRenderTree();
return true;
}
return false;
case 'U': case 'U':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder();
await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder();
return true;
}
return false;
case 'v': case 'v':
if (residentRunner.supportsServiceProtocol) { return residentRunner.launchDevTools();
await residentRunner.launchDevTools();
return true;
}
return false;
case 'w': case 'w':
case 'W': case 'W':
if (residentRunner.supportsServiceProtocol) { return residentRunner.debugDumpApp();
await residentRunner.debugDumpApp();
return true;
}
return false;
case 'z': case 'z':
case 'Z': case 'Z':
await residentRunner.debugToggleDebugCheckElevationsEnabled(); return residentRunner.debugToggleDebugCheckElevationsEnabled();
return true;
} }
return false; return false;
} }
...@@ -1590,7 +1607,7 @@ class TerminalHandler { ...@@ -1590,7 +1607,7 @@ class TerminalHandler {
// When terminal doesn't support line mode, '\n' can sneak into the input. // When terminal doesn't support line mode, '\n' can sneak into the input.
command = command.trim(); command = command.trim();
if (_processingUserRequest) { if (_processingUserRequest) {
globals.printTrace('Ignoring terminal input: "$command" because we are busy.'); _logger.printTrace('Ignoring terminal input: "$command" because we are busy.');
return; return;
} }
_processingUserRequest = true; _processingUserRequest = true;
...@@ -1601,7 +1618,7 @@ class TerminalHandler { ...@@ -1601,7 +1618,7 @@ class TerminalHandler {
} catch (error, st) { // ignore: avoid_catches_without_on_clauses } catch (error, st) { // ignore: avoid_catches_without_on_clauses
// Don't print stack traces for known error types. // Don't print stack traces for known error types.
if (error is! ToolExit) { if (error is! ToolExit) {
globals.printError('$error\n$st'); _logger.printError('$error\n$st');
} }
await _cleanUp(null); await _cleanUp(null);
rethrow; rethrow;
...@@ -1612,7 +1629,7 @@ class TerminalHandler { ...@@ -1612,7 +1629,7 @@ class TerminalHandler {
Future<void> _handleSignal(io.ProcessSignal signal) async { Future<void> _handleSignal(io.ProcessSignal signal) async {
if (_processingUserRequest) { if (_processingUserRequest) {
globals.printTrace('Ignoring signal: "$signal" because we are busy.'); _logger.printTrace('Ignoring signal: "$signal" because we are busy.');
return; return;
} }
_processingUserRequest = true; _processingUserRequest = true;
...@@ -1627,7 +1644,7 @@ class TerminalHandler { ...@@ -1627,7 +1644,7 @@ class TerminalHandler {
} }
Future<void> _cleanUp(io.ProcessSignal signal) async { Future<void> _cleanUp(io.ProcessSignal signal) async {
globals.terminal.singleCharMode = false; _terminal.singleCharMode = false;
await subscription?.cancel(); await subscription?.cancel();
await residentRunner.cleanupAfterSignal(); await residentRunner.cleanupAfterSignal();
} }
......
...@@ -1652,53 +1652,151 @@ void main() { ...@@ -1652,53 +1652,151 @@ void main() {
testUsingContext('ResidentRunner debugDumpApp calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugDumpApp calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugDumpApp();
expect(await residentRunner.debugDumpApp(), true);
verify(mockFlutterDevice.debugDumpApp()).called(1); verify(mockFlutterDevice.debugDumpApp()).called(1);
})); }));
testUsingContext('ResidentRunner debugDumpApp does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugDumpApp(), false);
verifyNever(mockFlutterDevice.debugDumpApp());
}));
testUsingContext('ResidentRunner debugDumpRenderTree calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugDumpRenderTree calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugDumpRenderTree();
expect(await residentRunner.debugDumpRenderTree(), true);
verify(mockFlutterDevice.debugDumpRenderTree()).called(1); verify(mockFlutterDevice.debugDumpRenderTree()).called(1);
})); }));
testUsingContext('ResidentRunner debugDumpRenderTree does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugDumpRenderTree(), false);
verifyNever(mockFlutterDevice.debugDumpRenderTree());
}));
testUsingContext('ResidentRunner debugDumpLayerTree calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugDumpLayerTree calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugDumpLayerTree();
expect(await residentRunner.debugDumpLayerTree(), true);
verify(mockFlutterDevice.debugDumpLayerTree()).called(1); verify(mockFlutterDevice.debugDumpLayerTree()).called(1);
})); }));
testUsingContext('ResidentRunner debugDumpLayerTree does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugDumpLayerTree(), false);
verifyNever(mockFlutterDevice.debugDumpLayerTree());
}));
testUsingContext('ResidentRunner debugDumpSemanticsTreeInTraversalOrder calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugDumpSemanticsTreeInTraversalOrder calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugDumpSemanticsTreeInTraversalOrder();
expect(await residentRunner.debugDumpSemanticsTreeInTraversalOrder(), true);
verify(mockFlutterDevice.debugDumpSemanticsTreeInTraversalOrder()).called(1); verify(mockFlutterDevice.debugDumpSemanticsTreeInTraversalOrder()).called(1);
})); }));
testUsingContext('ResidentRunner debugDumpSemanticsTreeInTraversalOrder does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugDumpSemanticsTreeInTraversalOrder(), false);
verifyNever(mockFlutterDevice.debugDumpSemanticsTreeInTraversalOrder());
}));
testUsingContext('ResidentRunner debugDumpSemanticsTreeInInverseHitTestOrder calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugDumpSemanticsTreeInInverseHitTestOrder calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder();
expect(await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder(), true);
verify(mockFlutterDevice.debugDumpSemanticsTreeInInverseHitTestOrder()).called(1); verify(mockFlutterDevice.debugDumpSemanticsTreeInInverseHitTestOrder()).called(1);
})); }));
testUsingContext('ResidentRunner debugDumpSemanticsTreeInInverseHitTestOrder does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder(), false);
verifyNever(mockFlutterDevice.debugDumpSemanticsTreeInInverseHitTestOrder());
}));
testUsingContext('ResidentRunner debugToggleDebugPaintSizeEnabled calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleDebugPaintSizeEnabled calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleDebugPaintSizeEnabled();
expect(await residentRunner.debugToggleDebugPaintSizeEnabled(), true);
verify(mockFlutterDevice.toggleDebugPaintSizeEnabled()).called(1); verify(mockFlutterDevice.toggleDebugPaintSizeEnabled()).called(1);
})); }));
testUsingContext('ResidentRunner debugToggleDebugPaintSizeEnabled does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleDebugPaintSizeEnabled(), false);
verifyNever(mockFlutterDevice.toggleDebugPaintSizeEnabled());
}));
testUsingContext('ResidentRunner debugToggleBrightness calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleBrightness calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleBrightness();
expect(await residentRunner.debugToggleBrightness(), true);
verify(mockFlutterDevice.toggleBrightness()).called(2); verify(mockFlutterDevice.toggleBrightness()).called(2);
})); }));
testUsingContext('ResidentRunner debugToggleBrightness does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleBrightness(), false);
verifyNever(mockFlutterDevice.toggleBrightness());
}));
testUsingContext('FlutterDevice.toggleBrightness invokes correct VM service request', () => testbed.run(() async { testUsingContext('FlutterDevice.toggleBrightness invokes correct VM service request', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
...@@ -1724,11 +1822,39 @@ void main() { ...@@ -1724,11 +1822,39 @@ void main() {
testUsingContext('ResidentRunner debugToggleInvertOversizedImages calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleInvertOversizedImages calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleInvertOversizedImages();
expect(await residentRunner.debugToggleInvertOversizedImages(), true);
verify(mockFlutterDevice.toggleInvertOversizedImages()).called(1); verify(mockFlutterDevice.toggleInvertOversizedImages()).called(1);
})); }));
testUsingContext('ResidentRunner debugToggleInvertOversizedImages does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleInvertOversizedImages(), false);
verifyNever(mockFlutterDevice.toggleInvertOversizedImages());
}));
testUsingContext('ResidentRunner debugToggleInvertOversizedImages does not call flutter device if in profile mode', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
);
expect(await residentRunner.debugToggleInvertOversizedImages(), false);
verifyNever(mockFlutterDevice.toggleInvertOversizedImages());
}));
testUsingContext('FlutterDevice.toggleInvertOversizedImages invokes correct VM service request', () => testbed.run(() async { testUsingContext('FlutterDevice.toggleInvertOversizedImages invokes correct VM service request', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
...@@ -1754,25 +1880,68 @@ void main() { ...@@ -1754,25 +1880,68 @@ void main() {
testUsingContext('ResidentRunner debugToggleDebugCheckElevationsEnabled calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleDebugCheckElevationsEnabled calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleDebugCheckElevationsEnabled();
expect(await residentRunner.debugToggleDebugCheckElevationsEnabled(), true);
verify(mockFlutterDevice.toggleDebugCheckElevationsEnabled()).called(1); verify(mockFlutterDevice.toggleDebugCheckElevationsEnabled()).called(1);
})); }));
testUsingContext('ResidentRunner debugToggleDebugCheckElevationsEnabled does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleDebugCheckElevationsEnabled(), false);
verifyNever(mockFlutterDevice.toggleDebugCheckElevationsEnabled());
}));
testUsingContext('ResidentRunner debugTogglePerformanceOverlayOverride calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugTogglePerformanceOverlayOverride calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugTogglePerformanceOverlayOverride();
expect(await residentRunner.debugTogglePerformanceOverlayOverride(), true);
verify(mockFlutterDevice.debugTogglePerformanceOverlayOverride()).called(1); verify(mockFlutterDevice.debugTogglePerformanceOverlayOverride()).called(1);
})); }));
testUsingContext('ResidentRunner debugTogglePerformanceOverlayOverride does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugTogglePerformanceOverlayOverride(), false);
verifyNever(mockFlutterDevice.debugTogglePerformanceOverlayOverride());
}));
testUsingContext('ResidentRunner debugToggleWidgetInspector calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleWidgetInspector calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleWidgetInspector();
expect(await residentRunner.debugToggleWidgetInspector(), true);
verify(mockFlutterDevice.toggleWidgetInspector()).called(1); verify(mockFlutterDevice.toggleWidgetInspector()).called(1);
})); }));
testUsingContext('ResidentRunner debugToggleWidgetInspector does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleWidgetInspector(), false);
verifyNever(mockFlutterDevice.toggleWidgetInspector());
}));
testUsingContext('ResidentRunner debugToggleProfileWidgetBuilds calls flutter device', () => testbed.run(() async { testUsingContext('ResidentRunner debugToggleProfileWidgetBuilds calls flutter device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
await residentRunner.debugToggleProfileWidgetBuilds(); await residentRunner.debugToggleProfileWidgetBuilds();
...@@ -1780,6 +1949,20 @@ void main() { ...@@ -1780,6 +1949,20 @@ void main() {
verify(mockFlutterDevice.toggleProfileWidgetBuilds()).called(1); verify(mockFlutterDevice.toggleProfileWidgetBuilds()).called(1);
})); }));
testUsingContext('ResidentRunner debugToggleProfileWidgetBuilds does not call flutter device if service protocol is unsupported', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentRunner = HotRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
);
expect(await residentRunner.debugToggleProfileWidgetBuilds(), false);
verifyNever(mockFlutterDevice.toggleProfileWidgetBuilds());
}));
testUsingContext('HotRunner writes vm service file when providing debugging option', () => testbed.run(() async { testUsingContext('HotRunner writes vm service file when providing debugging option', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
......
...@@ -4,104 +4,110 @@ ...@@ -4,104 +4,110 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/signals.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/compile.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/resident_runner.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart';
void main() { void main() {
TestRunner createTestRunner() { testWithoutContext('keyboard input handling single help character', () async {
// TODO(jacobr): make these tests run with `trackWidgetCreation: true` as final TestRunner testRunner = TestRunner();
// well as the default flags. final Logger logger = BufferLogger.test();
return TestRunner( final Signals signals = Signals.test();
<FlutterDevice>[ final Terminal terminal = Terminal.test();
FlutterDevice( final TerminalHandler terminalHandler = TerminalHandler(
MockDevice(), testRunner,
buildInfo: const BuildInfo( logger: logger,
BuildMode.debug, signals: signals,
null, terminal: terminal,
trackWidgetCreation: false,
treeShakeIcons: false,
),
generator: MockResidentCompiler(),
),
],
); );
}
group('keyboard input handling', () { expect(testRunner.hasHelpBeenPrinted, false);
testUsingContext('single help character', () async { await terminalHandler.processTerminalInput('h');
final TestRunner testRunner = createTestRunner(); expect(testRunner.hasHelpBeenPrinted, true);
final TerminalHandler terminalHandler = TerminalHandler(testRunner); });
expect(testRunner.hasHelpBeenPrinted, false);
await terminalHandler.processTerminalInput('h');
expect(testRunner.hasHelpBeenPrinted, true);
});
testUsingContext('help character surrounded with newlines', () async { testWithoutContext('keyboard input handling help character surrounded with newlines', () async {
final TestRunner testRunner = createTestRunner(); final TestRunner testRunner = TestRunner();
final TerminalHandler terminalHandler = TerminalHandler(testRunner); final Logger logger = BufferLogger.test();
expect(testRunner.hasHelpBeenPrinted, false); final Signals signals = Signals.test();
await terminalHandler.processTerminalInput('\nh\n'); final Terminal terminal = Terminal.test();
expect(testRunner.hasHelpBeenPrinted, true); final TerminalHandler terminalHandler = TerminalHandler(
}); testRunner,
logger: logger,
signals: signals,
terminal: terminal,
);
expect(testRunner.hasHelpBeenPrinted, false);
await terminalHandler.processTerminalInput('\nh\n');
expect(testRunner.hasHelpBeenPrinted, true);
}); });
group('keycode verification, brought to you by the letter', () { group('keycode verification, brought to you by the letter', () {
MockResidentRunner mockResidentRunner; MockResidentRunner mockResidentRunner;
TerminalHandler terminalHandler; TerminalHandler terminalHandler;
BufferLogger testLogger;
setUp(() { setUp(() {
testLogger = BufferLogger.test();
final Signals signals = Signals.test();
final Terminal terminal = Terminal.test();
mockResidentRunner = MockResidentRunner(); mockResidentRunner = MockResidentRunner();
terminalHandler = TerminalHandler(mockResidentRunner); terminalHandler = TerminalHandler(
mockResidentRunner,
logger: testLogger,
signals: signals,
terminal: terminal,
);
when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); when(mockResidentRunner.supportsServiceProtocol).thenReturn(true);
}); });
testUsingContext('a, can handle trailing newlines', () async { testWithoutContext('a, can handle trailing newlines', () async {
await terminalHandler.processTerminalInput('a\n'); await terminalHandler.processTerminalInput('a\n');
expect(terminalHandler.lastReceivedCommand, 'a'); expect(terminalHandler.lastReceivedCommand, 'a');
}); });
testUsingContext('n, can handle trailing only newlines', () async { testWithoutContext('n, can handle trailing only newlines', () async {
await terminalHandler.processTerminalInput('\n\n'); await terminalHandler.processTerminalInput('\n\n');
expect(terminalHandler.lastReceivedCommand, ''); expect(terminalHandler.lastReceivedCommand, '');
}); });
testUsingContext('a - debugToggleProfileWidgetBuilds with service protocol', () async { testWithoutContext('a - debugToggleProfileWidgetBuilds with service protocol', () async {
await terminalHandler.processTerminalInput('a'); await terminalHandler.processTerminalInput('a');
verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1); verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1);
}); });
testUsingContext('a - debugToggleProfileWidgetBuilds without service protocol', () async { testWithoutContext('a - debugToggleProfileWidgetBuilds', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); when(mockResidentRunner.supportsServiceProtocol).thenReturn(true);
await terminalHandler.processTerminalInput('a'); await terminalHandler.processTerminalInput('a');
verifyNever(mockResidentRunner.debugToggleProfileWidgetBuilds()); verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1);
}); });
testWithoutContext('b - debugToggleBrightness', () async {
testUsingContext('a - debugToggleProfileWidgetBuilds', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); when(mockResidentRunner.supportsServiceProtocol).thenReturn(true);
await terminalHandler.processTerminalInput('a'); await terminalHandler.processTerminalInput('b');
verify(mockResidentRunner.debugToggleProfileWidgetBuilds()).called(1); verify(mockResidentRunner.debugToggleBrightness()).called(1);
}); });
testUsingContext('d,D - detach', () async { testWithoutContext('d,D - detach', () async {
await terminalHandler.processTerminalInput('d'); await terminalHandler.processTerminalInput('d');
await terminalHandler.processTerminalInput('D'); await terminalHandler.processTerminalInput('D');
verify(mockResidentRunner.detach()).called(2); verify(mockResidentRunner.detach()).called(2);
}); });
testUsingContext('h,H,? - printHelp', () async { testWithoutContext('h,H,? - printHelp', () async {
await terminalHandler.processTerminalInput('h'); await terminalHandler.processTerminalInput('h');
await terminalHandler.processTerminalInput('H'); await terminalHandler.processTerminalInput('H');
await terminalHandler.processTerminalInput('?'); await terminalHandler.processTerminalInput('?');
...@@ -109,53 +115,26 @@ void main() { ...@@ -109,53 +115,26 @@ void main() {
verify(mockResidentRunner.printHelp(details: true)).called(3); verify(mockResidentRunner.printHelp(details: true)).called(3);
}); });
testUsingContext('i - debugToggleWidgetInspector with service protocol', () async { testWithoutContext('i - debugToggleWidgetInspector with service protocol', () async {
await terminalHandler.processTerminalInput('i'); await terminalHandler.processTerminalInput('i');
verify(mockResidentRunner.debugToggleWidgetInspector()).called(1); verify(mockResidentRunner.debugToggleWidgetInspector()).called(1);
}); });
testUsingContext('i - debugToggleWidgetInspector without service protocol', () async { testWithoutContext('I - debugToggleInvertOversizedImages with service protocol/debug', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('i');
verifyNever(mockResidentRunner.debugToggleWidgetInspector());
});
testUsingContext('I - debugToggleInvertOversizedImages with service protocol/debug', () async {
when(mockResidentRunner.isRunningDebug).thenReturn(true); when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('I'); await terminalHandler.processTerminalInput('I');
verify(mockResidentRunner.debugToggleInvertOversizedImages()).called(1); verify(mockResidentRunner.debugToggleInvertOversizedImages()).called(1);
}); });
testUsingContext('I - debugToggleInvertOversizedImages with service protocol/ndebug', () async { testWithoutContext('L - debugDumpLayerTree with service protocol', () async {
when(mockResidentRunner.isRunningDebug).thenReturn(false);
await terminalHandler.processTerminalInput('I');
verifyNever(mockResidentRunner.debugToggleInvertOversizedImages());
});
testUsingContext('I - debugToggleInvertOversizedImages without service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('I');
});
testUsingContext('L - debugDumpLayerTree with service protocol', () async {
await terminalHandler.processTerminalInput('L'); await terminalHandler.processTerminalInput('L');
verify(mockResidentRunner.debugDumpLayerTree()).called(1); verify(mockResidentRunner.debugDumpLayerTree()).called(1);
}); });
testUsingContext('L - debugDumpLayerTree without service protocol', () async { testWithoutContext('o,O - debugTogglePlatform with service protocol and debug mode', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('L');
verifyNever(mockResidentRunner.debugDumpLayerTree());
});
testUsingContext('o,O - debugTogglePlatform with service protocol and debug mode', () async {
when(mockResidentRunner.isRunningDebug).thenReturn(true); when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('o'); await terminalHandler.processTerminalInput('o');
await terminalHandler.processTerminalInput('O'); await terminalHandler.processTerminalInput('O');
...@@ -163,66 +142,34 @@ void main() { ...@@ -163,66 +142,34 @@ void main() {
verify(mockResidentRunner.debugTogglePlatform()).called(2); verify(mockResidentRunner.debugTogglePlatform()).called(2);
}); });
testUsingContext('o,O - debugTogglePlatform without service protocol', () async { testWithoutContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('o');
await terminalHandler.processTerminalInput('O');
verifyNever(mockResidentRunner.debugTogglePlatform());
});
testUsingContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async {
when(mockResidentRunner.isRunningDebug).thenReturn(true); when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('p'); await terminalHandler.processTerminalInput('p');
verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1); verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1);
}); });
testUsingContext('p - debugTogglePlatform without service protocol', () async { testWithoutContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('p');
verifyNever(mockResidentRunner.debugToggleDebugPaintSizeEnabled());
});
testUsingContext('p - debugToggleDebugPaintSizeEnabled with service protocol and debug mode', () async {
when(mockResidentRunner.isRunningDebug).thenReturn(true); when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('p'); await terminalHandler.processTerminalInput('p');
verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1); verify(mockResidentRunner.debugToggleDebugPaintSizeEnabled()).called(1);
}); });
testUsingContext('p - debugTogglePlatform without service protocol', () async { testWithoutContext('P - debugTogglePerformanceOverlayOverride with service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
when(mockResidentRunner.isRunningDebug).thenReturn(true);
await terminalHandler.processTerminalInput('p');
verifyNever(mockResidentRunner.debugToggleDebugPaintSizeEnabled());
});
testUsingContext('P - debugTogglePerformanceOverlayOverride with service protocol', () async {
await terminalHandler.processTerminalInput('P'); await terminalHandler.processTerminalInput('P');
verify(mockResidentRunner.debugTogglePerformanceOverlayOverride()).called(1); verify(mockResidentRunner.debugTogglePerformanceOverlayOverride()).called(1);
}); });
testUsingContext('P - debugTogglePerformanceOverlayOverride without service protocol', () async { testWithoutContext('q,Q - exit', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('P');
verifyNever(mockResidentRunner.debugTogglePerformanceOverlayOverride());
});
testUsingContext('q,Q - exit', () async {
await terminalHandler.processTerminalInput('q'); await terminalHandler.processTerminalInput('q');
await terminalHandler.processTerminalInput('Q'); await terminalHandler.processTerminalInput('Q');
verify(mockResidentRunner.exit()).called(2); verify(mockResidentRunner.exit()).called(2);
}); });
testUsingContext('s - screenshot', () async { testWithoutContext('s - screenshot', () async {
final MockDevice mockDevice = MockDevice(); final MockDevice mockDevice = MockDevice();
final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); final MockFlutterDevice mockFlutterDevice = MockFlutterDevice();
when(mockResidentRunner.isRunningDebug).thenReturn(true); when(mockResidentRunner.isRunningDebug).thenReturn(true);
...@@ -235,7 +182,7 @@ void main() { ...@@ -235,7 +182,7 @@ void main() {
verify(mockResidentRunner.screenshot(mockFlutterDevice)).called(1); verify(mockResidentRunner.screenshot(mockFlutterDevice)).called(1);
}); });
testUsingContext('r - hotReload supported and succeeds', () async { testWithoutContext('r - hotReload supported and succeeds', () async {
when(mockResidentRunner.canHotReload).thenReturn(true); when(mockResidentRunner.canHotReload).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: false)) when(mockResidentRunner.restart(fullRestart: false))
.thenAnswer((Invocation invocation) async { .thenAnswer((Invocation invocation) async {
...@@ -246,7 +193,7 @@ void main() { ...@@ -246,7 +193,7 @@ void main() {
verify(mockResidentRunner.restart(fullRestart: false)).called(1); verify(mockResidentRunner.restart(fullRestart: false)).called(1);
}); });
testUsingContext('r - hotReload supported and fails', () async { testWithoutContext('r - hotReload supported and fails', () async {
when(mockResidentRunner.canHotReload).thenReturn(true); when(mockResidentRunner.canHotReload).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: false)) when(mockResidentRunner.restart(fullRestart: false))
.thenAnswer((Invocation invocation) async { .thenAnswer((Invocation invocation) async {
...@@ -259,7 +206,7 @@ void main() { ...@@ -259,7 +206,7 @@ void main() {
expect(testLogger.statusText, contains('Try again after fixing the above error(s).')); expect(testLogger.statusText, contains('Try again after fixing the above error(s).'));
}); });
testUsingContext('r - hotReload supported and fails fatally', () async { testWithoutContext('r - hotReload supported and fails fatally', () async {
when(mockResidentRunner.canHotReload).thenReturn(true); when(mockResidentRunner.canHotReload).thenReturn(true);
when(mockResidentRunner.hotMode).thenReturn(true); when(mockResidentRunner.hotMode).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: false)) when(mockResidentRunner.restart(fullRestart: false))
...@@ -269,14 +216,14 @@ void main() { ...@@ -269,14 +216,14 @@ void main() {
expect(terminalHandler.processTerminalInput('r'), throwsToolExit()); expect(terminalHandler.processTerminalInput('r'), throwsToolExit());
}); });
testUsingContext('r - hotReload unsupported', () async { testWithoutContext('r - hotReload unsupported', () async {
when(mockResidentRunner.canHotReload).thenReturn(false); when(mockResidentRunner.canHotReload).thenReturn(false);
await terminalHandler.processTerminalInput('r'); await terminalHandler.processTerminalInput('r');
verifyNever(mockResidentRunner.restart(fullRestart: false)); verifyNever(mockResidentRunner.restart(fullRestart: false));
}); });
testUsingContext('R - hotRestart supported and succeeds', () async { testWithoutContext('R - hotRestart supported and succeeds', () async {
when(mockResidentRunner.canHotRestart).thenReturn(true); when(mockResidentRunner.canHotRestart).thenReturn(true);
when(mockResidentRunner.hotMode).thenReturn(true); when(mockResidentRunner.hotMode).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: true)) when(mockResidentRunner.restart(fullRestart: true))
...@@ -288,7 +235,7 @@ void main() { ...@@ -288,7 +235,7 @@ void main() {
verify(mockResidentRunner.restart(fullRestart: true)).called(1); verify(mockResidentRunner.restart(fullRestart: true)).called(1);
}); });
testUsingContext('R - hotRestart supported and fails', () async { testWithoutContext('R - hotRestart supported and fails', () async {
when(mockResidentRunner.canHotRestart).thenReturn(true); when(mockResidentRunner.canHotRestart).thenReturn(true);
when(mockResidentRunner.hotMode).thenReturn(true); when(mockResidentRunner.hotMode).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: true)) when(mockResidentRunner.restart(fullRestart: true))
...@@ -302,7 +249,7 @@ void main() { ...@@ -302,7 +249,7 @@ void main() {
expect(testLogger.statusText, contains('Try again after fixing the above error(s).')); expect(testLogger.statusText, contains('Try again after fixing the above error(s).'));
}); });
testUsingContext('R - hotRestart supported and fails fatally', () async { testWithoutContext('R - hotRestart supported and fails fatally', () async {
when(mockResidentRunner.canHotRestart).thenReturn(true); when(mockResidentRunner.canHotRestart).thenReturn(true);
when(mockResidentRunner.hotMode).thenReturn(true); when(mockResidentRunner.hotMode).thenReturn(true);
when(mockResidentRunner.restart(fullRestart: true)) when(mockResidentRunner.restart(fullRestart: true))
...@@ -312,84 +259,54 @@ void main() { ...@@ -312,84 +259,54 @@ void main() {
expect(() => terminalHandler.processTerminalInput('R'), throwsToolExit()); expect(() => terminalHandler.processTerminalInput('R'), throwsToolExit());
}); });
testUsingContext('R - hot restart unsupported', () async { testWithoutContext('R - hot restart unsupported', () async {
when(mockResidentRunner.canHotRestart).thenReturn(false); when(mockResidentRunner.canHotRestart).thenReturn(false);
await terminalHandler.processTerminalInput('R'); await terminalHandler.processTerminalInput('R');
verifyNever(mockResidentRunner.restart(fullRestart: true)); verifyNever(mockResidentRunner.restart(fullRestart: true));
}); });
testUsingContext('S - debugDumpSemanticsTreeInTraversalOrder with service protocol', () async { testWithoutContext('S - debugDumpSemanticsTreeInTraversalOrder with service protocol', () async {
await terminalHandler.processTerminalInput('S'); await terminalHandler.processTerminalInput('S');
verify(mockResidentRunner.debugDumpSemanticsTreeInTraversalOrder()).called(1); verify(mockResidentRunner.debugDumpSemanticsTreeInTraversalOrder()).called(1);
}); });
testUsingContext('S - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { testWithoutContext('t,T - debugDumpRenderTree with service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('S');
verifyNever(mockResidentRunner.debugDumpSemanticsTreeInTraversalOrder());
});
testUsingContext('t,T - debugDumpRenderTree with service protocol', () async {
await terminalHandler.processTerminalInput('t'); await terminalHandler.processTerminalInput('t');
await terminalHandler.processTerminalInput('T'); await terminalHandler.processTerminalInput('T');
verify(mockResidentRunner.debugDumpRenderTree()).called(2); verify(mockResidentRunner.debugDumpRenderTree()).called(2);
}); });
testUsingContext('t,T - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { testWithoutContext('U - debugDumpRenderTree with service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('t');
await terminalHandler.processTerminalInput('T');
verifyNever(mockResidentRunner.debugDumpRenderTree());
});
testUsingContext('U - debugDumpRenderTree with service protocol', () async {
await terminalHandler.processTerminalInput('U'); await terminalHandler.processTerminalInput('U');
verify(mockResidentRunner.debugDumpSemanticsTreeInInverseHitTestOrder()).called(1); verify(mockResidentRunner.debugDumpSemanticsTreeInInverseHitTestOrder()).called(1);
}); });
testUsingContext('U - debugDumpSemanticsTreeInTraversalOrder without service protocol', () async { testWithoutContext('v - launchDevTools', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('U');
verifyNever(mockResidentRunner.debugDumpSemanticsTreeInInverseHitTestOrder());
});
testUsingContext('v - launchDevTools', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(true); when(mockResidentRunner.supportsServiceProtocol).thenReturn(true);
await terminalHandler.processTerminalInput('v'); await terminalHandler.processTerminalInput('v');
verify(mockResidentRunner.launchDevTools()).called(1); verify(mockResidentRunner.launchDevTools()).called(1);
}); });
testUsingContext('w,W - debugDumpApp with service protocol', () async { testWithoutContext('w,W - debugDumpApp with service protocol', () async {
await terminalHandler.processTerminalInput('w'); await terminalHandler.processTerminalInput('w');
await terminalHandler.processTerminalInput('W'); await terminalHandler.processTerminalInput('W');
verify(mockResidentRunner.debugDumpApp()).called(2); verify(mockResidentRunner.debugDumpApp()).called(2);
}); });
testUsingContext('w,W - debugDumpApp without service protocol', () async { testWithoutContext('z,Z - debugToggleDebugCheckElevationsEnabled with service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('w');
await terminalHandler.processTerminalInput('W');
verifyNever(mockResidentRunner.debugDumpApp());
});
testUsingContext('z,Z - debugToggleDebugCheckElevationsEnabled with service protocol', () async {
await terminalHandler.processTerminalInput('z'); await terminalHandler.processTerminalInput('z');
await terminalHandler.processTerminalInput('Z'); await terminalHandler.processTerminalInput('Z');
verify(mockResidentRunner.debugToggleDebugCheckElevationsEnabled()).called(2); verify(mockResidentRunner.debugToggleDebugCheckElevationsEnabled()).called(2);
}); });
testUsingContext('z,Z - debugToggleDebugCheckElevationsEnabled without service protocol', () async { testWithoutContext('z,Z - debugToggleDebugCheckElevationsEnabled without service protocol', () async {
when(mockResidentRunner.supportsServiceProtocol).thenReturn(false); when(mockResidentRunner.supportsServiceProtocol).thenReturn(false);
await terminalHandler.processTerminalInput('z'); await terminalHandler.processTerminalInput('z');
await terminalHandler.processTerminalInput('Z'); await terminalHandler.processTerminalInput('Z');
...@@ -410,10 +327,7 @@ class MockResidentRunner extends Mock implements ResidentRunner {} ...@@ -410,10 +327,7 @@ class MockResidentRunner extends Mock implements ResidentRunner {}
class MockFlutterDevice extends Mock implements FlutterDevice {} class MockFlutterDevice extends Mock implements FlutterDevice {}
class MockResidentCompiler extends Mock implements ResidentCompiler {} class MockResidentCompiler extends Mock implements ResidentCompiler {}
class TestRunner extends ResidentRunner { class TestRunner extends Mock implements ResidentRunner {
TestRunner(List<FlutterDevice> devices)
: super(devices, debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug));
bool hasHelpBeenPrinted = false; bool hasHelpBeenPrinted = false;
String receivedCommand; String receivedCommand;
......
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