diff --git a/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart b/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart index 1aaa6a8336f..b0d0e28615d 100644 --- a/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart +++ b/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart @@ -692,4 +692,114 @@ void main() { ); } }, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos. + + test('Migrated app builds after Swift Package Manager is turned off', () async { + final Directory workingDirectory = fileSystem.systemTempDirectory + .createTempSync('swift_package_manager_turned_off.'); + final String workingDirectoryPath = workingDirectory.path; + try { + await SwiftPackageManagerUtils.enableSwiftPackageManager( + flutterBin, + workingDirectoryPath, + ); + + // Create an app with a plugin and Swift Package Manager integration. + final String appDirectoryPath = await SwiftPackageManagerUtils.createApp( + flutterBin, + workingDirectoryPath, + iosLanguage: 'swift', + platform: 'ios', + usesSwiftPackageManager: true, + options: ['--platforms=ios'], + ); + + final SwiftPackageManagerPlugin integrationTestPlugin = + SwiftPackageManagerUtils.integrationTestPlugin('ios'); + + SwiftPackageManagerUtils.addDependency( + appDirectoryPath: appDirectoryPath, + plugin: integrationTestPlugin, + ); + + // Build the app. + await SwiftPackageManagerUtils.buildApp( + flutterBin, + appDirectoryPath, + options: ['ios', '--config-only', '-v'], + ); + + // The app should have SwiftPM integration. + final File xcodeProjectFile = fileSystem + .directory(appDirectoryPath) + .childDirectory('ios') + .childDirectory('Runner.xcodeproj') + .childFile('project.pbxproj'); + final File generatedManifestFile = fileSystem + .directory(appDirectoryPath) + .childDirectory('ios') + .childDirectory('Flutter') + .childDirectory('ephemeral') + .childDirectory('Packages') + .childDirectory('FlutterGeneratedPluginSwiftPackage') + .childFile('Package.swift'); + final Directory cocoaPodsPluginFramework = fileSystem + .directory(appDirectoryPath) + .childDirectory('build') + .childDirectory('ios') + .childDirectory('iphoneos') + .childDirectory('Runner.app') + .childDirectory('Frameworks') + .childDirectory('${integrationTestPlugin.pluginName}.framework'); + + expect(xcodeProjectFile.existsSync(), isTrue); + expect(generatedManifestFile.existsSync(), isTrue); + expect(cocoaPodsPluginFramework.existsSync(), isFalse); + + String xcodeProject = xcodeProjectFile.readAsStringSync(); + String generatedManifest = generatedManifestFile.readAsStringSync(); + final String generatedSwiftDependency = ''' + dependencies: [ + .package(name: "integration_test", path: "${integrationTestPlugin.swiftPackagePlatformPath}") + ], +'''; + + expect(xcodeProject.contains('FlutterGeneratedPluginSwiftPackage'), isTrue); + expect(generatedManifest.contains(generatedSwiftDependency), isTrue); + + // Disable Swift Package Manager and do a clean re-build of the app. + // The build should succeed. + await SwiftPackageManagerUtils.disableSwiftPackageManager( + flutterBin, + workingDirectoryPath, + ); + + await SwiftPackageManagerUtils.cleanApp(flutterBin, appDirectoryPath); + + await SwiftPackageManagerUtils.buildApp( + flutterBin, + appDirectoryPath, + options: ['ios', '-v'], + ); + + // The app should still have SwiftPM integration, + // but the plugin should be added using CocoaPods. + expect(xcodeProjectFile.existsSync(), isTrue); + expect(generatedManifestFile.existsSync(), isTrue); + + xcodeProject = xcodeProjectFile.readAsStringSync(); + generatedManifest = generatedManifestFile.readAsStringSync(); + const String emptyDependencies = 'dependencies: [\n \n ],\n'; + + expect(xcodeProject.contains('FlutterGeneratedPluginSwiftPackage'), isTrue); + expect(generatedManifest.contains('integration_test'), isFalse); + expect(generatedManifest.contains(emptyDependencies), isTrue); + expect(cocoaPodsPluginFramework.existsSync(), isTrue); + } finally { + await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath); + ErrorHandlingFileSystem.deleteIfExists( + workingDirectory, + recursive: true, + ); + } + }, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos. }