mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

* First step in Flutter Doctor refactor. Assigns categories to all validators.
* Revert "Roll engine e54bc4ea1832..a84b210b3d26 (6 commits) (#20453)"
This reverts commit 05c2880a17
.
* Split iOS and Android workflows into workflow and validator classes.
* Change ValidatorCategory to handle standalone validators that share a
category (e.g. IntelliJ).
Also make Android Studio and Android toolchain use separate categories.
At this stage, flutter doctor output matches what it was previously.
(The summary() method itself has not yet been changed )
* Change doctor summary code to support validator categories.
Output is still unchanged.
* Handle small formatting issues.
* Flip Flutter category's isGroup field to false until it's actually
needed.
* Revert auto-generated formatting changes to keep those lines from
muddying the pull.
* Small fixes pointed out by analyzer.
* Properly fix analyzer issues around const constructors.
* Small changes to address comments.
* Add tests to verify grouped validator behavior and validationtype
merging.
* Update doctor.dart
* Add comments for clarification.
176 lines
7.1 KiB
Dart
176 lines
7.1 KiB
Dart
// 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.
|
|
|
|
import 'dart:async';
|
|
|
|
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';
|
|
import '../src/mocks.dart' show MockAndroidSdk, MockProcess, MockProcessManager, MockStdio;
|
|
|
|
void main() {
|
|
AndroidSdk sdk;
|
|
MemoryFileSystem fs;
|
|
MockProcessManager processManager;
|
|
MockStdio stdio;
|
|
|
|
setUp(() {
|
|
sdk = new MockAndroidSdk();
|
|
fs = new MemoryFileSystem();
|
|
fs.directory('/home/me').createSync(recursive: true);
|
|
processManager = new MockProcessManager();
|
|
stdio = new MockStdio();
|
|
});
|
|
|
|
MockProcess Function(List<String>) processMetaFactory(List<String> stdout) {
|
|
final Stream<List<int>> stdoutStream = new Stream<List<int>>.fromIterable(
|
|
stdout.map((String s) => s.codeUnits));
|
|
return (List<String> command) => new MockProcess(stdout: stdoutStream);
|
|
}
|
|
|
|
testUsingContext('licensesAccepted throws if cannot run sdkmanager', () async {
|
|
processManager.succeed = false;
|
|
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
|
|
final AndroidValidator androidValidator = new AndroidValidator();
|
|
expect(androidValidator.licensesAccepted, throwsToolExit());
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
ProcessManager: () => processManager,
|
|
Stdio: () => stdio,
|
|
});
|
|
|
|
testUsingContext('licensesAccepted handles garbage/no output', () async {
|
|
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
|
|
final AndroidValidator androidValidator = new AndroidValidator();
|
|
final LicensesAccepted result = await androidValidator.licensesAccepted;
|
|
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,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
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.'
|
|
]);
|
|
|
|
final AndroidValidator androidValidator = new AndroidValidator();
|
|
final LicensesAccepted result = await androidValidator.licensesAccepted;
|
|
expect(result, equals(LicensesAccepted.all));
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
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)?',
|
|
]);
|
|
|
|
final AndroidValidator androidValidator = new AndroidValidator();
|
|
final LicensesAccepted result = await androidValidator.licensesAccepted;
|
|
expect(result, equals(LicensesAccepted.some));
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
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)?',
|
|
]);
|
|
|
|
final AndroidValidator androidValidator = new AndroidValidator();
|
|
final LicensesAccepted result = await androidValidator.licensesAccepted;
|
|
expect(result, equals(LicensesAccepted.none));
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
ProcessManager: () => processManager,
|
|
Stdio: () => stdio,
|
|
});
|
|
|
|
testUsingContext('runLicenseManager succeeds for version >= 26', () async {
|
|
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
|
|
when(sdk.sdkManagerVersion).thenReturn('26.0.0');
|
|
|
|
expect(await AndroidValidator.runLicenseManager(), isTrue);
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
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');
|
|
|
|
expect(AndroidValidator.runLicenseManager(), throwsToolExit(message: 'To update, run'));
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
ProcessManager: () => processManager,
|
|
Stdio: () => stdio,
|
|
});
|
|
|
|
testUsingContext('runLicenseManager errors correctly for null version', () async {
|
|
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
|
|
when(sdk.sdkManagerVersion).thenReturn(null);
|
|
|
|
expect(AndroidValidator.runLicenseManager(), throwsToolExit(message: 'To update, run'));
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
ProcessManager: () => processManager,
|
|
Stdio: () => stdio,
|
|
});
|
|
|
|
testUsingContext('runLicenseManager errors when sdkmanager is not found', () async {
|
|
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
|
|
processManager.succeed = false;
|
|
|
|
expect(AndroidValidator.runLicenseManager(), throwsToolExit());
|
|
}, overrides: <Type, Generator>{
|
|
AndroidSdk: () => sdk,
|
|
FileSystem: () => fs,
|
|
Platform: () => new FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
|
|
ProcessManager: () => processManager,
|
|
Stdio: () => stdio,
|
|
});
|
|
}
|