From 2e33d08dae676b3fc0da3fa2a285c0dc91dd2d61 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 12 Nov 2018 23:46:14 -0800 Subject: [PATCH] communicate fuchsia error states to developers (#24191) --- .../lib/src/fuchsia/fuchsia_device.dart | 3 + .../lib/src/fuchsia/fuchsia_sdk.dart | 4 ++ .../test/fuchsia/fuchsa_device_test.dart | 66 +++++++++++++++++-- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index c1ada88fda8..2451696b0fb 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -203,6 +203,9 @@ class FuchsiaDevice extends Device { final RunResult result = await runAsync([ 'ssh', '-F', fuchsiaArtifacts.sshConfig.absolute.path, id, command]); 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}'); return null; } diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart index 201fefe0652..63f91e136aa 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart @@ -105,6 +105,10 @@ class FuchsiaArtifacts { File get sshConfig { if (_sshConfig == null) { 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'); } return _sshConfig; diff --git a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart index 8f11a8e5ff5..2d8a811bc92 100644 --- a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart +++ b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart @@ -5,14 +5,17 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter_tools/src/base/io.dart'; -import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/fuchsia/fuchsia_device.dart'; -import 'package:flutter_tools/src/base/time.dart'; - 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/time.dart'; +import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/fuchsia/fuchsia_device.dart'; +import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart'; + import '../src/common.dart'; import '../src/context.dart'; @@ -43,6 +46,51 @@ d 2 0 . expect(ports.length, 1); 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.value(mockProcessResult)); + when(mockProcessResult.exitCode).thenReturn(1); + when(mockProcessResult.stdout).thenReturn(''); + when(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: { + 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: { + ProcessManager: () => mockProcessManager, + FuchsiaArtifacts: () => mockFuchsiaArtifacts, + }); group('device logs', () { const String exampleUtcLogs = ''' @@ -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:12][52580][52983][log] INFO: example_app(flutter): Did thing this time -'''; + '''; final MockProcessManager mockProcessManager = MockProcessManager(); final MockProcess mockProcess = MockProcess(); Completer exitCode; @@ -139,6 +187,12 @@ d 2 0 . }); } +class MockFuchsiaArtifacts extends Mock implements FuchsiaArtifacts {} + class MockProcessManager extends Mock implements ProcessManager {} +class MockProcessResult extends Mock implements ProcessResult {} + +class MockFile extends Mock implements File {} + class MockProcess extends Mock implements Process {}