Unverified Commit 2e33d08d authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

communicate fuchsia error states to developers (#24191)

parent cc6e5b2b
...@@ -203,6 +203,9 @@ class FuchsiaDevice extends Device { ...@@ -203,6 +203,9 @@ class FuchsiaDevice extends Device {
final RunResult result = await runAsync(<String>[ final RunResult result = await runAsync(<String>[
'ssh', '-F', fuchsiaArtifacts.sshConfig.absolute.path, id, command]); 'ssh', '-F', fuchsiaArtifacts.sshConfig.absolute.path, id, command]);
if (result.exitCode != 0) { if (result.exitCode != 0) {
if (result.stderr.contains('/tmp/dart.services: No such file or directory')) {
throwToolExit('No Dart Observatories found. Are you running a debug build?');
}
throwToolExit('Command failed: $command\nstdout: ${result.stdout}\nstderr: ${result.stderr}'); throwToolExit('Command failed: $command\nstdout: ${result.stdout}\nstderr: ${result.stderr}');
return null; return null;
} }
......
...@@ -105,6 +105,10 @@ class FuchsiaArtifacts { ...@@ -105,6 +105,10 @@ class FuchsiaArtifacts {
File get sshConfig { File get sshConfig {
if (_sshConfig == null) { if (_sshConfig == null) {
final String buildDirectory = platform.environment['BUILD_DIR']; final String buildDirectory = platform.environment['BUILD_DIR'];
if (buildDirectory == null) {
throwToolExit('BUILD_DIR must be supplied to locate SSH keys. For example:\n'
' export BUILD_DIR=path/to/fuchsia/out/x64\n');
}
_sshConfig = fs.file('$buildDirectory/ssh-keys/ssh_config'); _sshConfig = fs.file('$buildDirectory/ssh-keys/ssh_config');
} }
return _sshConfig; return _sshConfig;
......
...@@ -5,13 +5,16 @@ ...@@ -5,13 +5,16 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
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/io.dart';
import 'package:flutter_tools/src/base/time.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_device.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_device.dart';
import 'package:flutter_tools/src/base/time.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
...@@ -43,6 +46,51 @@ d 2 0 . ...@@ -43,6 +46,51 @@ d 2 0 .
expect(ports.length, 1); expect(ports.length, 1);
expect(ports.single, 36780); expect(ports.single, 36780);
}); });
});
group('displays friendly error when', () {
final MockProcessManager mockProcessManager = MockProcessManager();
final MockProcessResult mockProcessResult = MockProcessResult();
final MockFuchsiaArtifacts mockFuchsiaArtifacts = MockFuchsiaArtifacts();
final MockFile mockFile = MockFile();
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((Invocation invocation) => Future<ProcessResult>.value(mockProcessResult));
when(mockProcessResult.exitCode).thenReturn(1);
when<String>(mockProcessResult.stdout).thenReturn('');
when<String>(mockProcessResult.stderr).thenReturn('ls: lstat /tmp/dart.services: No such file or directory');
when(mockFuchsiaArtifacts.sshConfig).thenReturn(mockFile);
when(mockFile.absolute).thenReturn(mockFile);
when(mockFile.path).thenReturn('');
testUsingContext('No BUILD_DIR set', () async {
final FuchsiaDevice device = FuchsiaDevice('id');
ToolExit toolExit;
try {
await device.servicePorts();
} on ToolExit catch (err) {
toolExit = err;
}
expect(toolExit.message, contains('BUILD_DIR must be supplied to locate SSH keys'));
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
});
testUsingContext('with BUILD_DIR set', () async {
final FuchsiaDevice device = FuchsiaDevice('id');
ToolExit toolExit;
try {
await device.servicePorts();
} on ToolExit catch (err) {
toolExit = err;
}
expect(toolExit.message, 'No Dart Observatories found. Are you running a debug build?');
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
FuchsiaArtifacts: () => mockFuchsiaArtifacts,
});
group('device logs', () { group('device logs', () {
const String exampleUtcLogs = ''' const String exampleUtcLogs = '''
...@@ -53,7 +101,7 @@ d 2 0 . ...@@ -53,7 +101,7 @@ d 2 0 .
[2018-11-09 01:30:02][41175][41187][bar] INFO: Invoking a bar [2018-11-09 01:30:02][41175][41187][bar] INFO: Invoking a bar
[2018-11-09 01:30:12][52580][52983][log] INFO: example_app(flutter): Did thing this time [2018-11-09 01:30:12][52580][52983][log] INFO: example_app(flutter): Did thing this time
'''; ''';
final MockProcessManager mockProcessManager = MockProcessManager(); final MockProcessManager mockProcessManager = MockProcessManager();
final MockProcess mockProcess = MockProcess(); final MockProcess mockProcess = MockProcess();
Completer<int> exitCode; Completer<int> exitCode;
...@@ -139,6 +187,12 @@ d 2 0 . ...@@ -139,6 +187,12 @@ d 2 0 .
}); });
} }
class MockFuchsiaArtifacts extends Mock implements FuchsiaArtifacts {}
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
class MockProcessResult extends Mock implements ProcessResult {}
class MockFile extends Mock implements File {}
class MockProcess extends Mock implements Process {} class MockProcess extends Mock implements Process {}
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