diff --git a/.cirrus.yml b/.cirrus.yml index 5bfa12b64d..3542241e09 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -178,8 +178,6 @@ task: # with the actual time - this should help to verify print_date_script: - date - install_cocoapods_script: - - sudo gem install cocoapods git_fetch_script: - git clean -xfd - git fetch origin diff --git a/dev/integration_tests/android_views/ios/Podfile b/dev/integration_tests/android_views/ios/Podfile index 64ba7492ea..f1f71941d4 100644 --- a/dev/integration_tests/android_views/ios/Podfile +++ b/dev/integration_tests/android_views/ios/Podfile @@ -60,9 +60,6 @@ target 'Runner' do } end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/dev/integration_tests/codegen/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/dev/integration_tests/codegen/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/dev/integration_tests/codegen/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/dev/integration_tests/flavors/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/dev/integration_tests/flavors/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/dev/integration_tests/flavors/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/dev/integration_tests/ios_add2app/Podfile b/dev/integration_tests/ios_add2app/Podfile index 72e1973f10..3904962da2 100644 --- a/dev/integration_tests/ios_add2app/Podfile +++ b/dev/integration_tests/ios_add2app/Podfile @@ -1,8 +1,5 @@ platform :ios, '12.0' -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - flutter_application_path = 'flutterapp/' framework_dir = File.join(flutter_application_path, '.ios', 'Flutter') diff --git a/dev/integration_tests/ios_add2app/ios_add2app.xcodeproj/project.pbxproj b/dev/integration_tests/ios_add2app/ios_add2app.xcodeproj/project.pbxproj index 1859736254..8ac6d94d7d 100644 --- a/dev/integration_tests/ios_add2app/ios_add2app.xcodeproj/project.pbxproj +++ b/dev/integration_tests/ios_add2app/ios_add2app.xcodeproj/project.pbxproj @@ -328,11 +328,14 @@ inputFileListPaths = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-ios_add2app/Pods-ios_add2app-frameworks.sh", + "${PODS_ROOT}/../flutterapp/.ios/Flutter/engine/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( ); outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/dev/integration_tests/ios_host_app/Host.xcodeproj/project.pbxproj b/dev/integration_tests/ios_host_app/Host.xcodeproj/project.pbxproj index b7edca54cc..5fbcfe441b 100644 --- a/dev/integration_tests/ios_host_app/Host.xcodeproj/project.pbxproj +++ b/dev/integration_tests/ios_host_app/Host.xcodeproj/project.pbxproj @@ -206,9 +206,12 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Host/Pods-Host-frameworks.sh", + "${PODS_ROOT}/../../hello/.ios/Flutter/engine/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/dev/integration_tests/ios_host_app/Podfile b/dev/integration_tests/ios_host_app/Podfile index 2b94908a24..ec1b8b9120 100644 --- a/dev/integration_tests/ios_host_app/Podfile +++ b/dev/integration_tests/ios_host_app/Podfile @@ -1,8 +1,5 @@ platform :ios, '9.0' -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - target 'Host' do flutter_application_path = '../hello' eval(File.read("#{flutter_application_path}/.ios/Flutter/podhelper.rb")) diff --git a/examples/catalog/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/catalog/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/examples/catalog/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/examples/flutter_gallery/ios/Podfile b/examples/flutter_gallery/ios/Podfile index e8ba04f2f4..49fd574d25 100644 --- a/examples/flutter_gallery/ios/Podfile +++ b/examples/flutter_gallery/ios/Podfile @@ -37,9 +37,6 @@ target 'Runner' do } end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj index c8c1492bf3..739e234d1c 100644 --- a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj @@ -267,9 +267,12 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../../../../bin/cache/artifacts/engine/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/examples/flutter_gallery/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter_gallery/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/examples/flutter_gallery/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/examples/flutter_view/ios/Podfile b/examples/flutter_view/ios/Podfile index f29633fb28..3b095c3a6e 100644 --- a/examples/flutter_view/ios/Podfile +++ b/examples/flutter_view/ios/Podfile @@ -1,9 +1,6 @@ # Uncomment this line to define a global platform for your project # platform :ios, '9.0' -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - target 'Runner' do # Uncomment this line if you're using Swift or would like to use dynamic frameworks use_frameworks! diff --git a/examples/hello_world/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/hello_world/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/examples/hello_world/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/examples/platform_channel/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/platform_channel/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/examples/platform_channel/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/examples/platform_view/ios/Podfile b/examples/platform_view/ios/Podfile index 0938dafd63..dcc6b981d4 100644 --- a/examples/platform_view/ios/Podfile +++ b/examples/platform_view/ios/Podfile @@ -56,9 +56,6 @@ target 'Runner' do pod 'MaterialControls' end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj b/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj index 6aadd67de1..d9d41b76d0 100644 --- a/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/platform_view/ios/Runner.xcodeproj/project.pbxproj @@ -230,9 +230,12 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/examples/stocks/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/stocks/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..949b678982 --- /dev/null +++ b/examples/stocks/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index 31cc055f39..8d7a0ebac8 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -93,6 +93,7 @@ Future runInContext( Logger: () => platform.isWindows ? WindowsStdoutLogger() : StdoutLogger(), MacOSWorkflow: () => const MacOSWorkflow(), OperatingSystemUtils: () => OperatingSystemUtils(), + PlistBuddy: () => const PlistBuddy(), SimControl: () => SimControl(), Stdio: () => const Stdio(), SystemClock: () => const SystemClock(), diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index e29da673b9..59a0153b9c 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -28,6 +28,55 @@ import 'code_signing.dart'; import 'xcodeproj.dart'; IMobileDevice get iMobileDevice => context.get(); +PlistBuddy get plistBuddy => context.get(); + +class PlistBuddy { + const PlistBuddy(); + + static const String path = '/usr/libexec/PlistBuddy'; + + Future run(List args) => processManager.run([path]..addAll(args)); +} + +/// A property list is a key-value representation commonly used for +/// configuration on macOS/iOS systems. +class PropertyList { + const PropertyList(this.plistPath); + + final String plistPath; + + /// Prints the specified key, or returns null if not present. + Future read(String key) async { + final ProcessResult result = await _runCommand('Print $key'); + if (result.exitCode == 0) + return result.stdout.trim(); + return null; + } + + /// Adds [key]. Has no effect if the key already exists. + Future addString(String key, String value) async { + await _runCommand('Add $key string $value'); + } + + /// Updates [key] with the new [value]. Has no effect if the key does not exist. + Future update(String key, String value) async { + await _runCommand('Set $key $value'); + } + + /// Deletes [key]. + Future delete(String key) async { + await _runCommand('Delete $key'); + } + + /// Deletes the content of the property list and creates a new root of the specified type. + Future clearToDict() async { + await _runCommand('Clear dict'); + } + + Future _runCommand(String command) async { + return await plistBuddy.run(['-c', command, plistPath]); + } +} /// Specialized exception for expected situations where the ideviceinfo /// tool responds with exit code 255 / 'No device found' message @@ -100,6 +149,47 @@ class IMobileDevice { } } +/// Sets the Xcode system. +/// +/// Xcode 10 added a new (default) build system with better performance and +/// stricter checks. Flutter apps without plugins build fine under the new +/// system, but it causes build breakages in projects with CocoaPods enabled. +/// This affects Flutter apps with plugins. +/// +/// Once Flutter has been updated to be fully compliant with the new build +/// system, this can be removed. +// +// TODO(cbracken): remove when https://github.com/flutter/flutter/issues/20685 is fixed. +Future setXcodeWorkspaceBuildSystem({ + @required Directory workspaceDirectory, + @required File workspaceSettings, + @required bool modern, +}) async { + // If this isn't a workspace, we're not using CocoaPods and can use the new + // build system. + if (!workspaceDirectory.existsSync()) + return; + + final PropertyList plist = PropertyList(workspaceSettings.path); + if (!workspaceSettings.existsSync()) { + workspaceSettings.parent.createSync(recursive: true); + await plist.clearToDict(); + } + + const String kBuildSystemType = 'BuildSystemType'; + if (modern) { + printTrace('Using new Xcode build system.'); + await plist.delete(kBuildSystemType); + } else { + printTrace('Using legacy Xcode build system.'); + if (await plist.read(kBuildSystemType) == null) { + await plist.addString(kBuildSystemType, 'Original'); + } else { + await plist.update(kBuildSystemType, 'Original'); + } + } +} + Future buildXcodeProject({ BuildableIOSApp app, BuildInfo buildInfo, @@ -115,6 +205,12 @@ Future buildXcodeProject({ if (!_checkXcodeVersion()) return XcodeBuildResult(success: false); + // TODO(cbracken): remove when https://github.com/flutter/flutter/issues/20685 is fixed. + await setXcodeWorkspaceBuildSystem( + workspaceDirectory: app.project.xcodeWorkspace, + workspaceSettings: app.project.xcodeWorkspaceSharedSettings, + modern: false, + ); final XcodeProjectInfo projectInfo = await xcodeProjectInterpreter.getInfo(app.project.hostAppRoot.path); if (!projectInfo.targets.contains('Runner')) { diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart index 9462395b72..868b0e98c4 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart @@ -57,8 +57,8 @@ enum CocoaPodsStatus { class CocoaPods { Future _versionText; - String get cocoaPodsMinimumVersion => '1.6.0'; - String get cocoaPodsRecommendedVersion => '1.6.0'; + String get cocoaPodsMinimumVersion => '1.0.0'; + String get cocoaPodsRecommendedVersion => '1.5.0'; Future get cocoaPodsVersionText { _versionText ??= runAsync(['pod', '--version']).then((RunResult result) { diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-ios-objc b/packages/flutter_tools/templates/cocoapods/Podfile-ios-objc index 64ba7492ea..f1f71941d4 100644 --- a/packages/flutter_tools/templates/cocoapods/Podfile-ios-objc +++ b/packages/flutter_tools/templates/cocoapods/Podfile-ios-objc @@ -60,9 +60,6 @@ target 'Runner' do } end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-ios-swift b/packages/flutter_tools/templates/cocoapods/Podfile-ios-swift index e9286cbac1..3f49388a9a 100644 --- a/packages/flutter_tools/templates/cocoapods/Podfile-ios-swift +++ b/packages/flutter_tools/templates/cocoapods/Podfile-ios-swift @@ -62,9 +62,6 @@ target 'Runner' do } end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-macos b/packages/flutter_tools/templates/cocoapods/Podfile-macos index 0ef5e94f53..ec3967f31c 100644 --- a/packages/flutter_tools/templates/cocoapods/Podfile-macos +++ b/packages/flutter_tools/templates/cocoapods/Podfile-macos @@ -77,6 +77,3 @@ target 'Runner' do end } end - -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true diff --git a/packages/flutter_tools/test/commands/create_test.dart b/packages/flutter_tools/test/commands/create_test.dart index 9ef03072f8..3b5eee55f6 100644 --- a/packages/flutter_tools/test/commands/create_test.dart +++ b/packages/flutter_tools/test/commands/create_test.dart @@ -473,8 +473,8 @@ void main() { await runner.run(['create', '--template=module', '--no-pub', '--org', 'com.foo.bar', projectDir.path]); - void expectExists(String relPath, [bool expectation = true]) { - expect(fs.isFileSync('${projectDir.path}/$relPath'), expectation); + void expectExists(String relPath) { + expect(fs.isFileSync('${projectDir.path}/$relPath'), true); } expectExists('lib/main.dart'); @@ -515,9 +515,6 @@ void main() { final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath)); final String xcodeProject = xcodeProjectFile.readAsStringSync(); expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject')); - // Xcode build system - final String xcodeWorkspaceSettingsPath = fs.path.join('.ios', 'Runner.xcworkspace', 'xcshareddata', 'WorkspaceSettings.xcsettings'); - expectExists(xcodeWorkspaceSettingsPath, false); final String versionPath = fs.path.join('.metadata'); expectExists(versionPath); diff --git a/packages/flutter_tools/test/ios/mac_test.dart b/packages/flutter_tools/test/ios/mac_test.dart index 8124ed8e21..ba50d7ef4e 100644 --- a/packages/flutter_tools/test/ios/mac_test.dart +++ b/packages/flutter_tools/test/ios/mac_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:file/file.dart'; +import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' show ProcessException, ProcessResult; import 'package:flutter_tools/src/ios/mac.dart'; @@ -28,6 +29,73 @@ class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterprete class MockIosProject extends Mock implements IosProject {} void main() { + group('PropertyList', () { + MockProcessManager mockProcessManager; + MemoryFileSystem fs; + Directory workspaceDirectory; + File workspaceSettingsFile; + + setUp(() { + mockProcessManager = MockProcessManager(); + fs = MemoryFileSystem(); + workspaceDirectory = fs.directory('Runner.xcworkspace'); + workspaceSettingsFile = workspaceDirectory.childDirectory('xcshareddata').childFile('WorkspaceSettings.xcsettings'); + }); + + testUsingContext('does nothing if workspace directory does not exist', () async { + await setXcodeWorkspaceBuildSystem(workspaceDirectory: workspaceDirectory, workspaceSettings: workspaceSettingsFile, modern: false); + verifyNever(mockProcessManager.run([PlistBuddy.path, '-c', 'Print BuildSystemType', workspaceSettingsFile.path])); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => mockProcessManager, + }); + + testUsingContext('creates dict-based plist if settings file does not exist', () async { + workspaceSettingsFile.parent.createSync(recursive: true); + when(mockProcessManager.run([PlistBuddy.path, '-c', 'Print BuildSystemType', workspaceSettingsFile.path])) + .thenAnswer((_) => Future.value(ProcessResult(1, 1, '', ''))); + await setXcodeWorkspaceBuildSystem(workspaceDirectory: workspaceDirectory, workspaceSettings: workspaceSettingsFile, modern: false); + verify(mockProcessManager.run([PlistBuddy.path, '-c', 'Clear dict', workspaceSettingsFile.path])); + verify(mockProcessManager.run([PlistBuddy.path, '-c', 'Add BuildSystemType string Original', workspaceSettingsFile.path])); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => mockProcessManager, + }); + + testUsingContext('writes legacy build mode settings if requested and not present', () async { + workspaceSettingsFile.createSync(recursive: true); + when(mockProcessManager.run([PlistBuddy.path, '-c', 'Print BuildSystemType', workspaceSettingsFile.path])) + .thenAnswer((_) => Future.value(ProcessResult(1, 1, '', ''))); + await setXcodeWorkspaceBuildSystem(workspaceDirectory: workspaceDirectory, workspaceSettings: workspaceSettingsFile, modern: false); + verify(mockProcessManager.run([PlistBuddy.path, '-c', 'Add BuildSystemType string Original', workspaceSettingsFile.path])); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => mockProcessManager, + }); + + testUsingContext('updates legacy build mode setting if requested and existing setting is present', () async { + workspaceSettingsFile.createSync(recursive: true); + when(mockProcessManager.run([PlistBuddy.path, '-c', 'Print BuildSystemType', workspaceSettingsFile.path])) + .thenAnswer((_) => Future.value(ProcessResult(1, 0, 'FancyNewOne', ''))); + await setXcodeWorkspaceBuildSystem(workspaceDirectory: workspaceDirectory, workspaceSettings: workspaceSettingsFile, modern: false); + verify(mockProcessManager.run([PlistBuddy.path, '-c', 'Set BuildSystemType Original', workspaceSettingsFile.path])); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => mockProcessManager, + }); + + testUsingContext('deletes legacy build mode setting if modern build mode requested', () async { + workspaceSettingsFile.createSync(recursive: true); + when(mockProcessManager.run([PlistBuddy.path, '-c', 'Print BuildSystemType', workspaceSettingsFile.path])) + .thenAnswer((_) => Future.value(ProcessResult(1, 0, 'Original', ''))); + await setXcodeWorkspaceBuildSystem(workspaceDirectory: workspaceDirectory, workspaceSettings: workspaceSettingsFile, modern: true); + verify(mockProcessManager.run([PlistBuddy.path, '-c', 'Delete BuildSystemType', workspaceSettingsFile.path])); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => mockProcessManager, + }); + }); + group('IMobileDevice', () { final FakePlatform osx = FakePlatform.fromPlatform(const LocalPlatform()) ..operatingSystem = 'macos'; diff --git a/packages/flutter_tools/test/macos/cocoapods_test.dart b/packages/flutter_tools/test/macos/cocoapods_test.dart index bc2afa6f43..82b8aa9a9e 100644 --- a/packages/flutter_tools/test/macos/cocoapods_test.dart +++ b/packages/flutter_tools/test/macos/cocoapods_test.dart @@ -60,7 +60,7 @@ void main() { projectUnderTest = FlutterProject.fromDirectory(fs.directory('project')); projectUnderTest.ios.xcodeProject.createSync(recursive: true); cocoaPodsUnderTest = CocoaPods(); - pretendPodVersionIs('1.6.0'); + pretendPodVersionIs('1.5.0'); fs.file(fs.path.join( Cache.flutterRoot, 'packages', 'flutter_tools', 'templates', 'cocoapods', 'Podfile-ios-objc', )) @@ -123,21 +123,28 @@ void main() { }); testUsingContext('detects below minimum version', () async { - pretendPodVersionIs('1.5.0'); + pretendPodVersionIs('0.39.8'); expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.belowMinimumVersion); }, overrides: { ProcessManager: () => mockProcessManager, }); + testUsingContext('detects below recommended version', () async { + pretendPodVersionIs('1.4.99'); + expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.belowRecommendedVersion); + }, overrides: { + ProcessManager: () => mockProcessManager, + }); + testUsingContext('detects at recommended version', () async { - pretendPodVersionIs('1.6.0'); + pretendPodVersionIs('1.5.0'); expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.recommended); }, overrides: { ProcessManager: () => mockProcessManager, }); testUsingContext('detects above recommended version', () async { - pretendPodVersionIs('1.6.1'); + pretendPodVersionIs('1.5.1'); expect(await cocoaPodsUnderTest.evaluateCocoaPodsInstallation, CocoaPodsStatus.recommended); }, overrides: { ProcessManager: () => mockProcessManager,