diff --git a/packages/flutter_tools/test/android/android_studio_test.dart b/packages/flutter_tools/test/android/android_studio_test.dart index 20ba39cb09f..39b99d8adff 100644 --- a/packages/flutter_tools/test/android/android_studio_test.dart +++ b/packages/flutter_tools/test/android/android_studio_test.dart @@ -6,36 +6,89 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/android/android_studio.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/ios/ios_workflow.dart'; +import 'package:mockito/mockito.dart'; import '../src/common.dart'; import '../src/context.dart'; -const String home = '/home/me'; +const String homeLinux = '/home/me'; +const String homeMac = '/Users/me'; + +const String macStudioInfoPlistValue = +''' + + + + + CFBundleGetInfoString + Android Studio 3.3, build AI-182.5107.16.33.5199772. Copyright JetBrains s.r.o., (c) 2000-2018 + CFBundleShortVersionString + 3.3 + CFBundleVersion + AI-182.5107.16.33.5199772 + JVMOptions + + Properties + + idea.platform.prefix + AndroidStudio + idea.paths.selector + AndroidStudio3.3 + + + + + '''; +const String macStudioInfoPlistDefaultsResult = +''' +{ + CFBundleGetInfoString = "Android Studio 3.3, build AI-182.5107.16.33.5199772. Copyright JetBrains s.r.o., (c) 2000-2018"; + CFBundleShortVersionString = "3.3"; + CFBundleVersion = "AI-182.5107.16.33.5199772"; + JVMOptions = { + Properties = { + "idea.paths.selector" = "AndroidStudio3.3"; + "idea.platform.prefix" = AndroidStudio; + }; + }; +} +'''; + +class MockIOSWorkflow extends Mock implements IOSWorkflow {} Platform linuxPlatform() { return FakePlatform.fromPlatform(const LocalPlatform()) ..operatingSystem = 'linux' - ..environment = {'HOME': home}; + ..environment = {'HOME': homeLinux}; +} + +Platform macPlatform() { + return FakePlatform.fromPlatform(const LocalPlatform()) + ..operatingSystem = 'macos' + ..environment = {'HOME': homeMac}; } void main() { - const String installPath = '/opt/android-studio-with-cheese-5.0'; - const String studioHome = '$home/.AndroidStudioWithCheese5.0'; - const String homeFile = '$studioHome/system/.home'; - MemoryFileSystem fs; + MockIOSWorkflow iosWorkflow; setUp(() { fs = MemoryFileSystem(); - fs.directory(installPath).createSync(recursive: true); - fs.file(homeFile).createSync(recursive: true); - fs.file(homeFile).writeAsStringSync(installPath); + iosWorkflow = MockIOSWorkflow(); }); - group('pluginsPath', () { + group('pluginsPath on Linux', () { testUsingContext('extracts custom paths from home dir', () { + const String installPath = '/opt/android-studio-with-cheese-5.0'; + const String studioHome = '$homeLinux/.AndroidStudioWithCheese5.0'; + const String homeFile = '$studioHome/system/.home'; + fs.directory(installPath).createSync(recursive: true); + fs.file(homeFile).createSync(recursive: true); + fs.file(homeFile).writeAsStringSync(installPath); + final AndroidStudio studio = - AndroidStudio.fromHomeDot(fs.directory(studioHome)); + AndroidStudio.fromHomeDot(fs.directory(studioHome)); expect(studio, isNotNull); expect(studio.pluginsPath, equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins')); @@ -46,4 +99,77 @@ void main() { Platform: () => linuxPlatform(), }); }); + + group('pluginsPath on Mac', () { + testUsingContext('extracts custom paths for directly downloaded Android Studio on Mac', () { + final String studioInApplicationPlistFolder = fs.path.join('/', 'Application', 'Android Studio.app', 'Contents'); + fs.directory(studioInApplicationPlistFolder).createSync(recursive: true); + + final String plistFilePath = fs.path.join(studioInApplicationPlistFolder, 'Info.plist'); + fs.file(plistFilePath).writeAsStringSync(macStudioInfoPlistValue); + when(iosWorkflow.getPlistValueFromFile(plistFilePath, null)).thenReturn(macStudioInfoPlistDefaultsResult); + final AndroidStudio studio = AndroidStudio.fromMacOSBundle(fs.directory(studioInApplicationPlistFolder)?.parent?.path); + expect(studio, isNotNull); + expect(studio.pluginsPath, + equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3'))); + }, overrides: { + FileSystem: () => fs, + // Custom home paths are not supported on macOS nor Windows yet, + // so we force the platform to fake Linux here. + Platform: () => macPlatform(), + IOSWorkflow: () => iosWorkflow, + }); + + testUsingContext('extracts custom paths for Android Studio downloaded by JetBrainsToolbox on Mac', () { + final String jetbrainsStudioInApplicationPlistFolder = fs.path.join(homeMac, 'Application', 'JetBrains Toolbox', 'Android Studio.app', 'Contents'); + fs.directory(jetbrainsStudioInApplicationPlistFolder).createSync(recursive: true); + const String jetbrainsInfoPlistValue = + ''' + + + + + CFBundleVersion + 3.3 + CFBundleLongVersionString + 3.3 + CFBundleShortVersionString + 3.3 + JetBrainsToolboxApp + $homeMac/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/183.5256920/Android Studio 3.3 + + + '''; + const String jetbrainsInfoPlistDefaultsResult = + ''' +{ + CFBundleLongVersionString = "3.3"; + CFBundleShortVersionString = "3.3"; + CFBundleVersion = "3.3"; + JetBrainsToolboxApp = "$homeMac/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/183.5256920/Android Studio 3.3.app"; +} +'''; + final String jetbrainsPlistFilePath = fs.path.join(jetbrainsStudioInApplicationPlistFolder, 'Info.plist'); + fs.file(jetbrainsPlistFilePath).writeAsStringSync(jetbrainsInfoPlistValue); + when(iosWorkflow.getPlistValueFromFile(jetbrainsPlistFilePath, null)).thenReturn(jetbrainsInfoPlistDefaultsResult); + + final String studioInApplicationPlistFolder = fs.path.join(fs.path.join(homeMac, 'Library', 'Application Support'), 'JetBrains', 'Toolbox', 'apps', 'AndroidStudio', 'ch-0', '183.5256920', fs.path.join('Android Studio 3.3.app', 'Contents')); + fs.directory(studioInApplicationPlistFolder).createSync(recursive: true); + final String studioPlistFilePath = fs.path.join(studioInApplicationPlistFolder, 'Info.plist'); + fs.file(studioPlistFilePath).writeAsStringSync(macStudioInfoPlistValue); + when(iosWorkflow.getPlistValueFromFile(studioPlistFilePath, null)).thenReturn(macStudioInfoPlistDefaultsResult); + + final AndroidStudio studio = AndroidStudio.fromMacOSBundle(fs.directory(jetbrainsStudioInApplicationPlistFolder)?.parent?.path); + expect(studio, isNotNull); + expect(studio.pluginsPath, + equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3'))); + }, overrides: { + FileSystem: () => fs, + // Custom home paths are not supported on macOS nor Windows yet, + // so we force the platform to fake Linux here. + Platform: () => macPlatform(), + IOSWorkflow: () => iosWorkflow, + }); + + }); }