android_sdk_test.dart 6.05 KB
Newer Older
1 2 3 4
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
import 'package:file/memory.dart';
6
import 'package:flutter_tools/src/android/android_sdk.dart';
7
import 'package:flutter_tools/src/base/file_system.dart';
8
import 'package:flutter_tools/src/base/io.dart' show ProcessResult;
9 10
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/config.dart';
11 12
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
13 14
import 'package:test/test.dart';

15
import '../src/common.dart';
16
import '../src/context.dart';
17
import '../src/mocks.dart';
18

19 20
class MockProcessManager extends Mock implements ProcessManager {}

21
void main() {
22
  MemoryFileSystem fs;
23
  MockProcessManager processManager;
24 25 26

  setUp(() {
    fs = new MemoryFileSystem();
27
    processManager = new MockProcessManager();
28 29
  });

30 31 32 33 34
  group('android_sdk AndroidSdk', () {
    Directory sdkDir;

    tearDown(() {
      sdkDir?.deleteSync(recursive: true);
35
      sdkDir = null;
36 37 38
    });

    testUsingContext('parse sdk', () {
39
      sdkDir = MockAndroidSdk.createSdkDirectory();
40
      Config.instance.setValue('android-sdk', sdkDir.path);
41

42
      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
43 44
      expect(sdk.latestVersion, isNotNull);
      expect(sdk.latestVersion.sdkLevel, 23);
45 46
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
47 48 49
    });

    testUsingContext('parse sdk N', () {
50
      sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
51
      Config.instance.setValue('android-sdk', sdkDir.path);
52

53
      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
54 55
      expect(sdk.latestVersion, isNotNull);
      expect(sdk.latestVersion.sdkLevel, 24);
56 57
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
58
    });
59

60
    testUsingContext('returns sdkmanager path', () {
61
      sdkDir = MockAndroidSdk.createSdkDirectory();
62 63 64 65 66 67 68 69 70
      Config.instance.setValue('android-sdk', sdkDir.path);

      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
      expect(sdk.sdkManagerPath, fs.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager'));
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
    });

    testUsingContext('returns sdkmanager version', () {
71
      sdkDir = MockAndroidSdk.createSdkDirectory();
72 73 74 75
      Config.instance.setValue('android-sdk', sdkDir.path);

      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
76
      when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], environment: argThat(isNotNull)))
77 78 79 80 81 82 83
          .thenReturn(new ProcessResult(1, 0, '26.1.1\n', ''));
      expect(sdk.sdkManagerVersion, '26.1.1');
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
      ProcessManager: () => processManager,
    });

84
    testUsingContext('does not throw on sdkmanager version check failure', () {
85
      sdkDir = MockAndroidSdk.createSdkDirectory();
86 87 88 89
      Config.instance.setValue('android-sdk', sdkDir.path);

      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
90
      when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], environment: argThat(isNotNull)))
91
          .thenReturn(new ProcessResult(1, 1, '26.1.1\n', 'Mystery error'));
92
      expect(sdk.sdkManagerVersion, isNull);
93 94 95 96 97 98
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
      ProcessManager: () => processManager,
    });

    testUsingContext('throws on sdkmanager version check if sdkmanager not found', () {
99
      sdkDir = MockAndroidSdk.createSdkDirectory(withSdkManager: false);
100 101 102 103 104 105 106 107 108 109
      Config.instance.setValue('android-sdk', sdkDir.path);

      final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(false);
      expect(() => sdk.sdkManagerVersion, throwsToolExit());
    }, overrides: <Type, Generator>{
      FileSystem: () => fs,
      ProcessManager: () => processManager,
    });

110 111 112 113 114 115
    group('ndk', () {
      const <String, String>{
        'linux': 'linux-x86_64',
        'macos': 'darwin-x86_64',
      }.forEach((String os, String osDir) {
        testUsingContext('detection on $os', () {
116
          sdkDir = MockAndroidSdk.createSdkDirectory(
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
              withAndroidN: true, withNdkDir: osDir, withNdkSysroot: true);
          Config.instance.setValue('android-sdk', sdkDir.path);

          final String realSdkDir = sdkDir.path;
          final String realNdkDir = fs.path.join(realSdkDir, 'ndk-bundle');
          final String realNdkCompiler = fs.path.join(
              realNdkDir,
              'toolchains',
              'arm-linux-androideabi-4.9',
              'prebuilt',
              osDir,
              'bin',
              'arm-linux-androideabi-gcc');
          final String realNdkSysroot =
              fs.path.join(realNdkDir, 'platforms', 'android-9', 'arch-arm');

          final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
          expect(sdk.directory, realSdkDir);
          expect(sdk.ndkDirectory, realNdkDir);
          expect(sdk.ndkCompiler, realNdkCompiler);
          expect(sdk.ndkCompilerArgs, <String>['--sysroot', realNdkSysroot]);
        }, overrides: <Type, Generator>{
          FileSystem: () => fs,
          Platform: () => new FakePlatform(operatingSystem: os),
        });
      });

      for (String os in <String>['linux', 'macos']) {
        testUsingContext('detection on $os (no ndk available)', () {
146
          sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
147 148 149 150 151 152 153 154 155 156 157 158 159 160
          Config.instance.setValue('android-sdk', sdkDir.path);

          final String realSdkDir = sdkDir.path;
          final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
          expect(sdk.directory, realSdkDir);
          expect(sdk.ndkDirectory, null);
          expect(sdk.ndkCompiler, null);
          expect(sdk.ndkCompilerArgs, null);
        }, overrides: <Type, Generator>{
          FileSystem: () => fs,
          Platform: () => new FakePlatform(operatingSystem: os),
        });
      }
    });
161 162
  });
}