diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index 1301d687de..96bc9b55c4 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart @@ -387,10 +387,11 @@ class PrebuiltIOSApp extends IOSApp { } class ApplicationPackageStore { - ApplicationPackageStore({ this.android, this.iOS }); + ApplicationPackageStore({ this.android, this.iOS, this.fuchsia }); AndroidApk android; IOSApp iOS; + FuchsiaApp fuchsia; Future getPackageForPlatform(TargetPlatform platform) async { switch (platform) { @@ -403,10 +404,12 @@ class ApplicationPackageStore { case TargetPlatform.ios: iOS ??= IOSApp.fromIosProject(FlutterProject.current().ios); return iOS; + case TargetPlatform.fuchsia: + fuchsia ??= FuchsiaApp.fromFuchsiaProject(FlutterProject.current().fuchsia); + return fuchsia; case TargetPlatform.darwin_x64: case TargetPlatform.linux_x64: case TargetPlatform.windows_x64: - case TargetPlatform.fuchsia: case TargetPlatform.tester: case TargetPlatform.web: return null; diff --git a/packages/flutter_tools/lib/src/fuchsia/application_package.dart b/packages/flutter_tools/lib/src/fuchsia/application_package.dart index 7ddd330e84..1bdd0deede 100644 --- a/packages/flutter_tools/lib/src/fuchsia/application_package.dart +++ b/packages/flutter_tools/lib/src/fuchsia/application_package.dart @@ -7,6 +7,7 @@ import 'package:meta/meta.dart'; import '../application_package.dart'; import '../base/file_system.dart'; import '../build_info.dart'; +import '../globals.dart'; import '../project.dart'; abstract class FuchsiaApp extends ApplicationPackage { @@ -14,6 +15,11 @@ abstract class FuchsiaApp extends ApplicationPackage { /// Creates a new [FuchsiaApp] from a fuchsia sub project. factory FuchsiaApp.fromFuchsiaProject(FuchsiaProject project) { + if (!project.existsSync()) { + // If the project doesn't exist at all the current hint to run flutter + // create is accurate. + return null; + } return BuildableFuchsiaApp( project: project, ); @@ -23,6 +29,11 @@ abstract class FuchsiaApp extends ApplicationPackage { /// /// [applicationBinary] is the path to the .far archive. factory FuchsiaApp.fromPrebuiltApp(FileSystemEntity applicationBinary) { + final FileSystemEntityType entityType = fs.typeSync(applicationBinary.path); + if (entityType != FileSystemEntityType.file) { + printError('File "${applicationBinary.path}" does not exist or is not a .far file. Use far archive.'); + return null; + } return PrebuiltFuchsiaApp( farArchive: applicationBinary.path, ); diff --git a/packages/flutter_tools/test/application_package_test.dart b/packages/flutter_tools/test/application_package_test.dart index df63fd46d2..4cefdea809 100644 --- a/packages/flutter_tools/test/application_package_test.dart +++ b/packages/flutter_tools/test/application_package_test.dart @@ -10,6 +10,7 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/fuchsia/application_package.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; @@ -305,6 +306,52 @@ void main() { expect(iosApp, null); }, overrides: overrides); }); + + group('FuchsiaApp', () { + final Map overrides = { + FileSystem: () => MemoryFileSystem(), + Platform: _kNoColorTerminalPlatform, + OperatingSystemUtils: () => MockOperatingSystemUtils(), + }; + testUsingContext('Error on non-existing file', () { + final PrebuiltFuchsiaApp fuchsiaApp = + FuchsiaApp.fromPrebuiltApp(fs.file('not_existing.far')); + expect(fuchsiaApp, isNull); + final BufferLogger logger = context.get(); + expect( + logger.errorText, + 'File "not_existing.far" does not exist or is not a .far file. Use far archive.\n', + ); + }, overrides: overrides); + + testUsingContext('Error on non-far file', () { + fs.directory('regular_folder').createSync(); + final PrebuiltFuchsiaApp fuchsiaApp = + FuchsiaApp.fromPrebuiltApp(fs.file('regular_folder')); + expect(fuchsiaApp, isNull); + final BufferLogger logger = context.get(); + expect( + logger.errorText, + 'File "regular_folder" does not exist or is not a .far file. Use far archive.\n', + ); + }, overrides: overrides); + + testUsingContext('Success with far file', () { + fs.file('bundle.far').createSync(); + final PrebuiltFuchsiaApp fuchsiaApp = FuchsiaApp.fromPrebuiltApp(fs.file('bundle.far')); + final BufferLogger logger = context.get(); + expect(logger.errorText, isEmpty); + expect(fuchsiaApp.id, 'bundle.far'); + }, overrides: overrides); + + testUsingContext('returns null when there is no fuchsia', () async { + fs.file('pubspec.yaml').createSync(); + fs.file('.packages').createSync(); + final BuildableFuchsiaApp fuchsiaApp = FuchsiaApp.fromFuchsiaProject(FlutterProject.fromDirectory(fs.currentDirectory).fuchsia); + + expect(fuchsiaApp, null); + }, overrides: overrides); + }); } const String _aaptDataWithExplicitEnabledAndMainLauncherActivity =