diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index d35d59a218a..4c3d6ff9068 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -423,11 +423,18 @@ class FuchsiaDevice extends Device { TargetPlatform _targetPlatform; Future _queryTargetPlatform() async { + const TargetPlatform defaultTargetPlatform = TargetPlatform.fuchsia_arm64; + if (!globals.fuchsiaArtifacts.hasSshConfig) { + globals.printTrace('Could not determine Fuchsia target platform because ' + 'Fuchsia ssh configuration is missing.\n' + 'Defaulting to arm64.'); + return defaultTargetPlatform; + } final RunResult result = await shell('uname -m'); if (result.exitCode != 0) { globals.printError('Could not determine Fuchsia target platform type:\n$result\n' 'Defaulting to arm64.'); - return TargetPlatform.fuchsia_arm64; + return defaultTargetPlatform; } final String machine = result.stdout.trim(); switch (machine) { @@ -438,7 +445,7 @@ class FuchsiaDevice extends Device { default: globals.printError('Unknown Fuchsia target platform "$machine". ' 'Defaulting to arm64.'); - return TargetPlatform.fuchsia_arm64; + return defaultTargetPlatform; } } @@ -480,16 +487,22 @@ class FuchsiaDevice extends Device { @override Future get sdkNameAndVersion async { + const String defaultName = 'Fuchsia'; + if (!globals.fuchsiaArtifacts.hasSshConfig) { + globals.printTrace('Could not determine Fuchsia sdk name or version ' + 'because Fuchsia ssh configuration is missing.'); + return defaultName; + } const String versionPath = '/pkgfs/packages/build-info/0/data/version'; final RunResult catResult = await shell('cat $versionPath'); if (catResult.exitCode != 0) { globals.printTrace('Failed to cat $versionPath: ${catResult.stderr}'); - return 'Fuchsia'; + return defaultName; } final String version = catResult.stdout.trim(); if (version.isEmpty) { globals.printTrace('$versionPath was empty'); - return 'Fuchsia'; + return defaultName; } return 'Fuchsia $version'; } diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart index 1e58567c146..f86bbd05c31 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart @@ -156,4 +156,7 @@ class FuchsiaArtifacts { /// The pm tool. final File pm; + + /// Returns true if the [sshConfig] file is not null and exists. + bool get hasSshConfig => sshConfig != null && sshConfig.existsSync(); } diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index 87ccbca8742..213e2927017 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart @@ -43,6 +43,7 @@ void main() { setUp(() { memoryFileSystem = MemoryFileSystem(); sshConfig = MockFile(); + when(sshConfig.existsSync()).thenReturn(true); when(sshConfig.absolute).thenReturn(sshConfig); }); @@ -115,6 +116,15 @@ void main() { ProcessManager: () => FakeProcessManager.any(), }); + testUsingContext('targetPlatform does not throw when sshConfig is missing', () async { + final FuchsiaDevice device = FuchsiaDevice('123'); + expect(await device.targetPlatform, TargetPlatform.fuchsia_arm64); + }, overrides: { + FuchsiaArtifacts: () => FuchsiaArtifacts(sshConfig: null), + FuchsiaSdk: () => MockFuchsiaSdk(), + ProcessManager: () => MockProcessManager(), + }); + testUsingContext('targetPlatform arm64 works', () async { when(globals.processManager.run(any)).thenAnswer((Invocation _) async { return ProcessResult(1, 0, 'aarch64', ''); @@ -888,6 +898,7 @@ void main() { setUp(() { sshConfig = MockFile(); + when(sshConfig.existsSync()).thenReturn(true); when(sshConfig.absolute).thenReturn(sshConfig); mockSuccessProcessManager = MockProcessManager(); @@ -915,6 +926,15 @@ void main() { when(emptyStdoutProcessResult.stderr as String).thenReturn(''); }); + testUsingContext('does not throw on non-existant ssh config', () async { + final FuchsiaDevice device = FuchsiaDevice('123'); + expect(await device.sdkNameAndVersion, equals('Fuchsia')); + }, overrides: { + ProcessManager: () => mockSuccessProcessManager, + FuchsiaArtifacts: () => FuchsiaArtifacts(sshConfig: null), + FuchsiaSdk: () => MockFuchsiaSdk(), + }); + testUsingContext('returns what we get from the device on success', () async { final FuchsiaDevice device = FuchsiaDevice('123'); expect(await device.sdkNameAndVersion, equals('Fuchsia version'));