gradle_non_android_plugin_test.dart 3.38 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7
// 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';
8
import 'package:flutter_devicelab/framework/task_result.dart';
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;

/// Tests that a flutter app that depends on a non-Android plugin
/// (an iOS only plugin in this case) can still build for Android.
Future<void> main() async {
  await task(() async {

    section('Find Java');

    final String javaHome = await findJavaHome();
    if (javaHome == null)
      return TaskResult.failure('Could not find Java');
    print('\nUsing JAVA_HOME=$javaHome');

    section('Create Flutter plugin project');

    final Directory tempDir = Directory.systemTemp.createTempSync('flutter_plugin_test.');
    final Directory projectDir = Directory(path.join(tempDir.path, 'ios_only'));
    try {
      await inDirectory(tempDir, () async {
        await flutter(
          'create',
          options: <String>[
            '--org', 'io.flutter.devicelab',
            '-t', 'plugin',
35
            '--platforms=ios,android',
36 37 38 39 40
            'ios_only',
          ],
        );
      });

41
      section("Delete plugin's Android folder");
42 43 44 45 46 47 48 49 50 51 52 53

      final File androidFolder = File(path.join(
        projectDir.path,
        'android',
      ));
      androidFolder.deleteSync(recursive: true);

      section('Update pubspec.yaml to iOS only plugin');
      final File pubspecFile = File(path.join(projectDir.path, 'pubspec.yaml'));
      final String pubspecString = pubspecFile.readAsStringSync();

      final StringBuffer iosOnlyPubspec = StringBuffer();
54 55
      bool inAndroidSection = false;
      const String pluginPlatformIndentation = '      ';
56
      for (final String line in pubspecString.split('\n')) {
57 58 59
        // Skip everything in the Android section of the plugin platforms list.
        if (line.startsWith('${pluginPlatformIndentation}android:')) {
          inAndroidSection = true;
60 61
          continue;
        }
62 63 64 65 66 67
        if (inAndroidSection) {
          if (line.startsWith('$pluginPlatformIndentation  ')) {
            continue;
          } else {
            inAndroidSection = false;
          }
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
        }
        iosOnlyPubspec.write('$line\n');
      }

      pubspecFile.writeAsStringSync(iosOnlyPubspec.toString());

      section('Build example APK');

      final StringBuffer stderr = StringBuffer();

      final Directory exampleDir = Directory(path.join(projectDir.path, 'example'));
      await inDirectory(exampleDir, () async {
        await evalFlutter(
          'build',
          options: <String>[
            'apk',
            '--target-platform', 'android-arm',
            '--verbose',
          ],
          canFail: true,
          stderr: stderr,
        );
      });

      section('Check that the example APK was built');

      final String exampleAppApk = path.join(
        exampleDir.path,
        'build',
        'app',
        'outputs',
        'apk',
        'release',
        'app-release.apk',
      );
      if (!exists(File(exampleAppApk))) {
        return TaskResult.failure('Failed to build example app');
      }
      return TaskResult.success(null);
    } catch (e) {
      return TaskResult.failure(e.toString());
    } finally {
      rmTree(tempDir);
    }
  });
}