// 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:io'; import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/ios.dart'; import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/framework/utils.dart'; import 'package:path/path.dart' as path; Future<void> main() async { await task(() async { section('Copy test Flutter App with watchOS Companion'); final Directory tempDir = Directory.systemTemp .createTempSync('flutter_ios_app_with_extensions_test.'); final Directory projectDir = Directory(path.join(tempDir.path, 'app_with_extensions')); try { mkdir(projectDir); recursiveCopy( Directory(path.join(flutterDirectory.path, 'dev', 'integration_tests', 'ios_app_with_extensions')), projectDir, ); section('Create release build'); // This only builds the iOS app, not the companion watchOS app. The watchOS app // has been removed as a build dependency and is not embedded in the app to avoid // requiring the watchOS being available in CI. // Instead, validate the tool detects that there is a watch companion, and omits // the "-sdk iphoneos" option, which fails to build the watchOS app. // See https://github.com/flutter/flutter/pull/94190. await inDirectory(projectDir, () async { final String buildOutput = await evalFlutter( 'build', options: <String>['ios', '--no-codesign', '--release', '--verbose'], ); if (!buildOutput.contains('Watch companion app found')) { throw TaskResult.failure('Did not detect watch companion'); } if (buildOutput.contains('-sdk iphoneos -destination')) { throw TaskResult.failure('-sdk must be omitted for app with watch companion'); } }); final String appBundle = Directory(path.join( projectDir.path, 'build', 'ios', 'iphoneos', 'Runner.app', )).path; final String appFrameworkPath = path.join( appBundle, 'Frameworks', 'App.framework', 'App', ); final String flutterFrameworkPath = path.join( appBundle, 'Frameworks', 'Flutter.framework', 'Flutter', ); checkDirectoryExists(appBundle); await _checkFlutterFrameworkArchs(appFrameworkPath); await _checkFlutterFrameworkArchs(flutterFrameworkPath); section('Clean build'); await inDirectory(projectDir, () async { await flutter('clean'); }); return TaskResult.success(null); } catch (e) { return TaskResult.failure(e.toString()); } finally { rmTree(tempDir); } }); } Future<void> _checkFlutterFrameworkArchs(String frameworkPath) async { checkFileExists(frameworkPath); final String archs = await fileType(frameworkPath); if (!archs.contains('arm64')) { throw TaskResult.failure('$frameworkPath arm64 architecture missing'); } if (archs.contains('x86_64')) { throw TaskResult.failure('$frameworkPath x86_64 architecture unexpectedly present'); } }