android_workflow_test.dart 7.17 KB
Newer Older
1 2 3 4
// Copyright 2018 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 6
import 'dart:async';

7 8 9 10 11 12 13 14 15 16 17
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:mockito/mockito.dart';
import 'package:platform/platform.dart';
import 'package:process/process.dart';

import '../src/common.dart';
import '../src/context.dart';
18
import '../src/mocks.dart' show MockAndroidSdk, MockProcess, MockProcessManager, MockStdio;
19 20 21 22 23 24 25 26

void main() {
  AndroidSdk sdk;
  MemoryFileSystem fs;
  MockProcessManager processManager;
  MockStdio stdio;

  setUp(() {
27 28
    sdk = MockAndroidSdk();
    fs = MemoryFileSystem();
29
    fs.directory('/home/me').createSync(recursive: true);
30 31
    processManager = MockProcessManager();
    stdio = MockStdio();
32 33
  });

34
  MockProcess Function(List<String>) processMetaFactory(List<String> stdout) {
35
    final Stream<List<int>> stdoutStream = Stream<List<int>>.fromIterable(
36
        stdout.map<List<int>>((String s) => s.codeUnits));
37
    return (List<String> command) => MockProcess(stdout: stdoutStream);
38 39
  }

40 41 42
  testUsingContext('licensesAccepted throws if cannot run sdkmanager', () async {
    processManager.succeed = false;
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
43 44
    final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator();
    expect(licenseValidator.licensesAccepted, throwsToolExit());
45 46 47
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
48
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
49 50 51 52
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

53 54
  testUsingContext('licensesAccepted handles garbage/no output', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
55 56
    final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator();
    final LicensesAccepted result = await licenseValidator.licensesAccepted;
57 58 59 60 61 62
    expect(result, equals(LicensesAccepted.unknown));
    expect(processManager.commands.first, equals('/foo/bar/sdkmanager'));
    expect(processManager.commands.last, equals('--licenses'));
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
63
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
64 65 66 67 68 69 70 71 72 73 74
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('licensesAccepted works for all licenses accepted', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    processManager.processFactory = processMetaFactory(<String>[
       '[=======================================] 100% Computing updates...             ',
       'All SDK package licenses accepted.'
    ]);

75 76
    final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator();
    final LicensesAccepted result = await licenseValidator.licensesAccepted;
77 78 79 80
    expect(result, equals(LicensesAccepted.all));
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
81
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
82 83 84 85 86 87 88 89 90 91 92 93
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('licensesAccepted works for some licenses accepted', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    processManager.processFactory = processMetaFactory(<String>[
      '[=======================================] 100% Computing updates...             ',
      '2 of 5 SDK package licenses not accepted.',
      'Review licenses that have not been accepted (y/N)?',
    ]);

94 95
    final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator();
    final LicensesAccepted result = await licenseValidator.licensesAccepted;
96 97 98 99
    expect(result, equals(LicensesAccepted.some));
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
100
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
101 102 103 104 105 106 107 108 109 110 111 112
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('licensesAccepted works for no licenses accepted', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    processManager.processFactory = processMetaFactory(<String>[
      '[=======================================] 100% Computing updates...             ',
      '5 of 5 SDK package licenses not accepted.',
      'Review licenses that have not been accepted (y/N)?',
    ]);

113 114
    final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator();
    final LicensesAccepted result = await licenseValidator.licensesAccepted;
115 116 117 118
    expect(result, equals(LicensesAccepted.none));
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
119
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
120 121 122 123
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

124 125 126 127
  testUsingContext('runLicenseManager succeeds for version >= 26', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    when(sdk.sdkManagerVersion).thenReturn('26.0.0');

128
    expect(await AndroidLicenseValidator.runLicenseManager(), isTrue);
129 130 131
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
132
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
133 134 135 136 137 138 139 140
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('runLicenseManager errors for version < 26', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    when(sdk.sdkManagerVersion).thenReturn('25.0.0');

141
    expect(AndroidLicenseValidator.runLicenseManager(), throwsToolExit(message: 'To update, run'));
142 143 144
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
145
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
146 147 148 149 150 151 152 153
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('runLicenseManager errors correctly for null version', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    when(sdk.sdkManagerVersion).thenReturn(null);

154
    expect(AndroidLicenseValidator.runLicenseManager(), throwsToolExit(message: 'To update, run'));
155 156 157
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
158
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
159 160 161 162 163 164 165 166
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });

  testUsingContext('runLicenseManager errors when sdkmanager is not found', () async {
    when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
    processManager.succeed = false;

167
    expect(AndroidLicenseValidator.runLicenseManager(), throwsToolExit());
168 169 170
  }, overrides: <Type, Generator>{
    AndroidSdk: () => sdk,
    FileSystem: () => fs,
171
    Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
172 173 174 175
    ProcessManager: () => processManager,
    Stdio: () => stdio,
  });
}