// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:io'; import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/utils.dart'; import 'package:path/path.dart' as path; /// Tests that the Flutter plugin template works. Use `pod lib lint` /// to confirm the plugin module can be imported into an app. Future<void> main() async { await task(() async { final Directory tempDir = Directory.systemTemp.createTempSync('flutter_plugin_test.'); try { section('Create Objective-C plugin'); const String objcPluginName = 'test_plugin_objc'; await inDirectory(tempDir, () async { await flutter( 'create', options: <String>[ '--org', 'io.flutter.devicelab', '--template=plugin', '--ios-language=objc', objcPluginName, ], ); }); section('Lint Objective-C iOS podspec plugin as framework'); final String objcPluginPath = path.join(tempDir.path, objcPluginName); final String objcPodspecPath = path.join(objcPluginPath, 'ios', '$objcPluginName.podspec'); await inDirectory(tempDir, () async { await exec( 'pod', <String>[ 'lib', 'lint', objcPodspecPath, '--allow-warnings', ], environment: <String, String>{ 'LANG': 'en_US.UTF-8', }, ); }); section('Lint Objective-C iOS podspec plugin as library'); await inDirectory(tempDir, () async { await exec( 'pod', <String>[ 'lib', 'lint', objcPodspecPath, '--allow-warnings', '--use-libraries', ], environment: <String, String>{ 'LANG': 'en_US.UTF-8', }, ); }); section('Create Swift plugin'); const String swiftPluginName = 'test_plugin_swift'; await inDirectory(tempDir, () async { await flutter( 'create', options: <String>[ '--org', 'io.flutter.devicelab', '--template=plugin', '--ios-language=swift', swiftPluginName, ], ); }); section('Create Objective-C application'); const String objcAppName = 'test_app_objc'; await inDirectory(tempDir, () async { await flutter( 'create', options: <String>[ '--org', 'io.flutter.devicelab', '--ios-language=objc', objcAppName, ], ); }); section('Build Objective-C application with Swift and Objective-C plugins as libraries'); final String objcAppPath = path.join(tempDir.path, objcAppName); final String swiftPluginPath = path.join(tempDir.path, swiftPluginName); final File objcPubspec = File(path.join(objcAppPath, 'pubspec.yaml')); String podspecContent = objcPubspec.readAsStringSync(); podspecContent = podspecContent.replaceFirst( '\ndependencies:\n', '\ndependencies:\n $objcPluginName:\n path: $objcPluginPath\n $swiftPluginName:\n path: $swiftPluginPath\n', ); objcPubspec.writeAsStringSync(podspecContent, flush: true); await inDirectory(objcAppPath, () async { await flutter( 'build', options: <String>[ 'ios', '--no-codesign' ], // TODO(jmagman): Make Objective-C applications handle Swift libraries https://github.com/flutter/flutter/issues/16049 canFail: true ); }); final File objcPodfile = File(path.join(objcAppPath, 'ios', 'Podfile')); String objcPodfileContent = objcPodfile.readAsStringSync(); if (objcPodfileContent.contains('use_frameworks!')) { return TaskResult.failure('Expected default Objective-C Podfile to not contain use_frameworks'); } section('Build Objective-C application with Swift and Objective-C plugins as frameworks'); objcPodfileContent = 'use_frameworks!\n' + objcPodfileContent; objcPodfile.writeAsStringSync(objcPodfileContent, flush: true); await inDirectory(objcAppPath, () async { await flutter( 'build', options: <String>[ 'ios', '--no-codesign' ], ); }); section('Create Swift application'); const String swiftAppName = 'test_app_swift'; await inDirectory(tempDir, () async { await flutter( 'create', options: <String>[ '--org', 'io.flutter.devicelab', '--ios-language=swift', swiftAppName, ], ); }); section('Build Swift application with Swift and Objective-C plugins as frameworks'); final String swiftAppPath = path.join(tempDir.path, swiftAppName); final File swiftPubspec = File(path.join(swiftAppPath, 'pubspec.yaml')); swiftPubspec.writeAsStringSync(podspecContent, flush: true); await inDirectory(swiftAppPath, () async { await flutter( 'build', options: <String>[ 'ios', '--no-codesign' ], ); }); final File swiftPodfile = File(path.join(swiftAppPath, 'ios', 'Podfile')); String swiftPodfileContent = swiftPodfile.readAsStringSync(); if (!swiftPodfileContent.contains('use_frameworks!')) { return TaskResult.failure('Expected default Swift Podfile to contain use_frameworks'); } section('Build Swift application with Swift and Objective-C plugins as libraries'); swiftPodfileContent = swiftPodfileContent.replaceAll('use_frameworks!', ''); swiftPodfile.writeAsStringSync(swiftPodfileContent, flush: true); await inDirectory(swiftAppPath, () async { await flutter( 'build', options: <String>[ 'ios', '--no-codesign' ], ); }); return TaskResult.success(null); } catch (e) { return TaskResult.failure(e.toString()); } finally { rmTree(tempDir); } }); }