Unverified Commit e18533e7 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove globals from android_workflow (#69548)

parent ef288c17
...@@ -16,7 +16,7 @@ import '../device.dart'; ...@@ -16,7 +16,7 @@ import '../device.dart';
import 'adb.dart'; import 'adb.dart';
import 'android_device.dart'; import 'android_device.dart';
import 'android_sdk.dart'; import 'android_sdk.dart';
import 'android_workflow.dart' hide androidWorkflow; import 'android_workflow.dart';
/// Device discovery for Android physical devices and emulators. /// Device discovery for Android physical devices and emulators.
/// ///
......
...@@ -382,7 +382,7 @@ class AndroidSdk { ...@@ -382,7 +382,7 @@ class AndroidSdk {
return fileSystem.path.join(javaHome, 'bin', 'java'); return fileSystem.path.join(javaHome, 'bin', 'java');
} }
} }
} on Exception catch (_) { /* ignore */ } } on Exception { /* ignore */ }
} }
// Fallback to PATH based lookup. // Fallback to PATH based lookup.
......
...@@ -12,12 +12,11 @@ import '../base/io.dart'; ...@@ -12,12 +12,11 @@ import '../base/io.dart';
import '../base/logger.dart'; import '../base/logger.dart';
import '../base/os.dart'; import '../base/os.dart';
import '../base/platform.dart'; import '../base/platform.dart';
import '../base/user_messages.dart'; import '../base/user_messages.dart' hide userMessages;
import '../base/version.dart'; import '../base/version.dart';
import '../convert.dart'; import '../convert.dart';
import '../doctor.dart'; import '../doctor.dart';
import '../features.dart'; import '../features.dart';
import '../globals.dart' as globals;
import 'android_sdk.dart'; import 'android_sdk.dart';
import 'android_studio.dart'; import 'android_studio.dart';
...@@ -252,7 +251,36 @@ class AndroidValidator extends DoctorValidator { ...@@ -252,7 +251,36 @@ class AndroidValidator extends DoctorValidator {
/// A subvalidator that checks if the licenses within the detected Android /// A subvalidator that checks if the licenses within the detected Android
/// SDK have been accepted. /// SDK have been accepted.
class AndroidLicenseValidator extends DoctorValidator { class AndroidLicenseValidator extends DoctorValidator {
AndroidLicenseValidator() : super('Android license subvalidator',); AndroidLicenseValidator({
@required AndroidSdk androidSdk,
@required Platform platform,
@required OperatingSystemUtils operatingSystemUtils,
@required FileSystem fileSystem,
@required ProcessManager processManager,
@required Logger logger,
@required AndroidStudio androidStudio,
@required Stdio stdio,
@required UserMessages userMessages,
}) : _androidSdk = androidSdk,
_platform = platform,
_operatingSystemUtils = operatingSystemUtils,
_fileSystem = fileSystem,
_processManager = processManager,
_logger = logger,
_androidStudio = androidStudio,
_stdio = stdio,
_userMessages = userMessages,
super('Android license subvalidator');
final AndroidSdk _androidSdk;
final AndroidStudio _androidStudio;
final Stdio _stdio;
final OperatingSystemUtils _operatingSystemUtils;
final Platform _platform;
final FileSystem _fileSystem;
final ProcessManager _processManager;
final Logger _logger;
final UserMessages _userMessages;
@override @override
String get slowWarning => 'Checking Android licenses is taking an unexpectedly long time...'; String get slowWarning => 'Checking Android licenses is taking an unexpectedly long time...';
...@@ -262,27 +290,27 @@ class AndroidLicenseValidator extends DoctorValidator { ...@@ -262,27 +290,27 @@ class AndroidLicenseValidator extends DoctorValidator {
final List<ValidationMessage> messages = <ValidationMessage>[]; final List<ValidationMessage> messages = <ValidationMessage>[];
// Match pre-existing early termination behavior // Match pre-existing early termination behavior
if (globals.androidSdk == null || globals.androidSdk.latestVersion == null || if (_androidSdk == null || _androidSdk.latestVersion == null ||
globals.androidSdk.validateSdkWellFormed().isNotEmpty || _androidSdk.validateSdkWellFormed().isNotEmpty ||
! await _checkJavaVersionNoOutput()) { ! await _checkJavaVersionNoOutput()) {
return ValidationResult(ValidationType.missing, messages); return ValidationResult(ValidationType.missing, messages);
} }
final String sdkVersionText = userMessages.androidStatusInfo(globals.androidSdk.latestVersion.buildToolsVersionName); final String sdkVersionText = _userMessages.androidStatusInfo(_androidSdk.latestVersion.buildToolsVersionName);
// Check for licenses. // Check for licenses.
switch (await licensesAccepted) { switch (await licensesAccepted) {
case LicensesAccepted.all: case LicensesAccepted.all:
messages.add(ValidationMessage(userMessages.androidLicensesAll)); messages.add(ValidationMessage(_userMessages.androidLicensesAll));
break; break;
case LicensesAccepted.some: case LicensesAccepted.some:
messages.add(ValidationMessage.hint(userMessages.androidLicensesSome)); messages.add(ValidationMessage.hint(_userMessages.androidLicensesSome));
return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText); return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText);
case LicensesAccepted.none: case LicensesAccepted.none:
messages.add(ValidationMessage.error(userMessages.androidLicensesNone)); messages.add(ValidationMessage.error(_userMessages.androidLicensesNone));
return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText); return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText);
case LicensesAccepted.unknown: case LicensesAccepted.unknown:
messages.add(ValidationMessage.error(userMessages.androidLicensesUnknown(globals.platform))); messages.add(ValidationMessage.error(_userMessages.androidLicensesUnknown(_platform)));
return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText); return ValidationResult(ValidationType.partial, messages, statusInfo: sdkVersionText);
} }
return ValidationResult(ValidationType.installed, messages, statusInfo: sdkVersionText); return ValidationResult(ValidationType.installed, messages, statusInfo: sdkVersionText);
...@@ -290,26 +318,26 @@ class AndroidLicenseValidator extends DoctorValidator { ...@@ -290,26 +318,26 @@ class AndroidLicenseValidator extends DoctorValidator {
Future<bool> _checkJavaVersionNoOutput() async { Future<bool> _checkJavaVersionNoOutput() async {
final String javaBinary = AndroidSdk.findJavaBinary( final String javaBinary = AndroidSdk.findJavaBinary(
androidStudio: globals.androidStudio, androidStudio: _androidStudio,
fileSystem: globals.fs, fileSystem: _fileSystem,
operatingSystemUtils: globals.os, operatingSystemUtils: _operatingSystemUtils,
platform: globals.platform, platform: _platform,
); );
if (javaBinary == null) { if (javaBinary == null) {
return false; return false;
} }
if (!globals.processManager.canRun(javaBinary)) { if (!_processManager.canRun(javaBinary)) {
return false; return false;
} }
String javaVersion; String javaVersion;
try { try {
final ProcessResult result = await globals.processManager.run(<String>[javaBinary, '-version']); final ProcessResult result = await _processManager.run(<String>[javaBinary, '-version']);
if (result.exitCode == 0) { if (result.exitCode == 0) {
final List<String> versionLines = (result.stderr as String).split('\n'); final List<String> versionLines = (result.stderr as String).split('\n');
javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0]; javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
} }
} on Exception catch (error) { } on Exception catch (error) {
globals.printTrace(error.toString()); _logger.printTrace(error.toString());
} }
if (javaVersion == null) { if (javaVersion == null) {
// Could not determine the java version. // Could not determine the java version.
...@@ -344,9 +372,9 @@ class AndroidLicenseValidator extends DoctorValidator { ...@@ -344,9 +372,9 @@ class AndroidLicenseValidator extends DoctorValidator {
} }
try { try {
final Process process = await globals.processUtils.start( final Process process = await _processManager.start(
<String>[globals.androidSdk.sdkManagerPath, '--licenses'], <String>[_androidSdk.sdkManagerPath, '--licenses'],
environment: globals.androidSdk.sdkManagerEnv, environment: _androidSdk.sdkManagerEnv,
); );
process.stdin.write('n\n'); process.stdin.write('n\n');
// We expect logcat streams to occasionally contain invalid utf-8, // We expect logcat streams to occasionally contain invalid utf-8,
...@@ -364,36 +392,36 @@ class AndroidLicenseValidator extends DoctorValidator { ...@@ -364,36 +392,36 @@ class AndroidLicenseValidator extends DoctorValidator {
await Future.wait<void>(<Future<void>>[output, errors]); await Future.wait<void>(<Future<void>>[output, errors]);
return status ?? LicensesAccepted.unknown; return status ?? LicensesAccepted.unknown;
} on ProcessException catch (e) { } on ProcessException catch (e) {
globals.printTrace('Failed to run Android sdk manager: $e'); _logger.printTrace('Failed to run Android sdk manager: $e');
return LicensesAccepted.unknown; return LicensesAccepted.unknown;
} }
} }
/// Run the Android SDK manager tool in order to accept SDK licenses. /// Run the Android SDK manager tool in order to accept SDK licenses.
static Future<bool> runLicenseManager() async { Future<bool> runLicenseManager() async {
if (globals.androidSdk == null) { if (_androidSdk == null) {
globals.printStatus(userMessages.androidSdkShort); _logger.printStatus(_userMessages.androidSdkShort);
return false; return false;
} }
if (!_canRunSdkManager()) { if (!_canRunSdkManager()) {
throwToolExit(userMessages.androidMissingSdkManager(globals.androidSdk.sdkManagerPath, globals.platform)); throwToolExit(_userMessages.androidMissingSdkManager(_androidSdk.sdkManagerPath, _platform));
} }
try { try {
final Process process = await globals.processUtils.start( final Process process = await _processManager.start(
<String>[globals.androidSdk.sdkManagerPath, '--licenses'], <String>[_androidSdk.sdkManagerPath, '--licenses'],
environment: globals.androidSdk.sdkManagerEnv, environment: _androidSdk.sdkManagerEnv,
); );
// The real stdin will never finish streaming. Pipe until the child process // The real stdin will never finish streaming. Pipe until the child process
// finishes. // finishes.
unawaited(process.stdin.addStream(globals.stdio.stdin) unawaited(process.stdin.addStream(_stdio.stdin)
// If the process exits unexpectedly with an error, that will be // If the process exits unexpectedly with an error, that will be
// handled by the caller. // handled by the caller.
.catchError((dynamic err, StackTrace stack) { .catchError((dynamic err, StackTrace stack) {
globals.printTrace('Echoing stdin to the licenses subprocess failed:'); _logger.printTrace('Echoing stdin to the licenses subprocess failed:');
globals.printTrace('$err\n$stack'); _logger.printTrace('$err\n$stack');
} }
)); ));
...@@ -401,29 +429,28 @@ class AndroidLicenseValidator extends DoctorValidator { ...@@ -401,29 +429,28 @@ class AndroidLicenseValidator extends DoctorValidator {
// may complete first. // may complete first.
try { try {
await Future.wait<void>(<Future<void>>[ await Future.wait<void>(<Future<void>>[
globals.stdio.addStdoutStream(process.stdout), _stdio.addStdoutStream(process.stdout),
globals.stdio.addStderrStream(process.stderr), _stdio.addStderrStream(process.stderr),
]); ]);
} on Exception catch (err, stack) { } on Exception catch (err, stack) {
globals.printTrace('Echoing stdout or stderr from the license subprocess failed:'); _logger.printTrace('Echoing stdout or stderr from the license subprocess failed:');
globals.printTrace('$err\n$stack'); _logger.printTrace('$err\n$stack');
} }
final int exitCode = await process.exitCode; final int exitCode = await process.exitCode;
return exitCode == 0; return exitCode == 0;
} on ProcessException catch (e) { } on ProcessException catch (e) {
throwToolExit(userMessages.androidCannotRunSdkManager( throwToolExit(_userMessages.androidCannotRunSdkManager(
globals.androidSdk.sdkManagerPath, _androidSdk.sdkManagerPath,
e.toString(), e.toString(),
globals.platform, _platform,
)); ));
return false; return false;
} }
} }
static bool _canRunSdkManager() { bool _canRunSdkManager() {
assert(globals.androidSdk != null); final String sdkManagerPath = _androidSdk.sdkManagerPath;
final String sdkManagerPath = globals.androidSdk.sdkManagerPath; return _processManager.canRun(sdkManagerPath);
return globals.processManager.canRun(sdkManagerPath);
} }
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import '../android/android_workflow.dart';
import '../base/common.dart'; import '../base/common.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
import '../runner/flutter_command.dart'; import '../runner/flutter_command.dart';
...@@ -44,7 +45,11 @@ class DoctorCommand extends FlutterCommand { ...@@ -44,7 +45,11 @@ class DoctorCommand extends FlutterCommand {
'git hash.'); 'git hash.');
} }
} }
final bool success = await globals.doctor.diagnose(androidLicenses: boolArg('android-licenses'), verbose: verbose); final bool success = await globals.doctor.diagnose(
androidLicenses: boolArg('android-licenses'),
verbose: verbose,
androidLicenseValidator: androidLicenseValidator,
);
return FlutterCommandResult(success ? ExitStatus.success : ExitStatus.warning); return FlutterCommandResult(success ? ExitStatus.success : ExitStatus.warning);
} }
} }
...@@ -72,7 +72,17 @@ Future<T> runInContext<T>( ...@@ -72,7 +72,17 @@ Future<T> runInContext<T>(
body: runnerWrapper, body: runnerWrapper,
overrides: overrides, overrides: overrides,
fallbacks: <Type, Generator>{ fallbacks: <Type, Generator>{
AndroidLicenseValidator: () => AndroidLicenseValidator(), AndroidLicenseValidator: () => AndroidLicenseValidator(
operatingSystemUtils: globals.os,
platform: globals.platform,
userMessages: globals.userMessages,
processManager: globals.processManager,
androidStudio: globals.androidStudio,
androidSdk: globals.androidSdk,
logger: globals.logger,
fileSystem: globals.fs,
stdio: globals.stdio,
),
AndroidSdk: AndroidSdk.locateAndroidSdk, AndroidSdk: AndroidSdk.locateAndroidSdk,
AndroidStudio: AndroidStudio.latestValid, AndroidStudio: AndroidStudio.latestValid,
AndroidValidator: () => AndroidValidator( AndroidValidator: () => AndroidValidator(
......
...@@ -288,9 +288,14 @@ class Doctor { ...@@ -288,9 +288,14 @@ class Doctor {
} }
/// Print information about the state of installed tooling. /// Print information about the state of installed tooling.
Future<bool> diagnose({ bool androidLicenses = false, bool verbose = true, bool showColor = true }) async { Future<bool> diagnose({
if (androidLicenses) { bool androidLicenses = false,
return AndroidLicenseValidator.runLicenseManager(); bool verbose = true,
bool showColor = true,
AndroidLicenseValidator androidLicenseValidator,
}) async {
if (androidLicenses && androidLicenseValidator != null) {
return androidLicenseValidator.runLicenseManager();
} }
if (!verbose) { if (!verbose) {
......
...@@ -7,6 +7,7 @@ import 'dart:async'; ...@@ -7,6 +7,7 @@ import 'dart:async';
import 'package:args/command_runner.dart'; import 'package:args/command_runner.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/android/android_studio_validator.dart'; import 'package:flutter_tools/src/android/android_studio_validator.dart';
import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
...@@ -704,7 +705,12 @@ class NoOpDoctor implements Doctor { ...@@ -704,7 +705,12 @@ class NoOpDoctor implements Doctor {
Future<bool> checkRemoteArtifacts(String engineRevision) async => true; Future<bool> checkRemoteArtifacts(String engineRevision) async => true;
@override @override
Future<bool> diagnose({ bool androidLicenses = false, bool verbose = true, bool showColor = true }) async => true; Future<bool> diagnose({
bool androidLicenses = false,
bool verbose = true,
bool showColor = true,
AndroidLicenseValidator androidLicenseValidator,
}) async => true;
@override @override
List<ValidatorTask> startValidatorTasks() => <ValidatorTask>[]; List<ValidatorTask> startValidatorTasks() => <ValidatorTask>[];
......
...@@ -173,6 +173,7 @@ void main() { ...@@ -173,6 +173,7 @@ void main() {
when(mockDoctor.diagnose( when(mockDoctor.diagnose(
androidLicenses: false, androidLicenses: false,
verbose: false, verbose: false,
androidLicenseValidator: anyNamed('androidLicenseValidator')
)).thenAnswer((_) async => true); )).thenAnswer((_) async => true);
final DoctorCommand command = DoctorCommand(); final DoctorCommand command = DoctorCommand();
final CommandRunner<void> runner = createTestCommandRunner(command); final CommandRunner<void> runner = createTestCommandRunner(command);
...@@ -197,7 +198,8 @@ void main() { ...@@ -197,7 +198,8 @@ void main() {
testUsingContext('doctor fail sends warning', () async { testUsingContext('doctor fail sends warning', () async {
mockTimes = <int>[1000, 2000]; mockTimes = <int>[1000, 2000];
when(mockDoctor.diagnose(androidLicenses: false, verbose: false)).thenAnswer((_) async => false); when(mockDoctor.diagnose(androidLicenses: false, verbose: false, androidLicenseValidator: anyNamed('androidLicenseValidator')))
.thenAnswer((_) async => false);
final DoctorCommand command = DoctorCommand(); final DoctorCommand command = DoctorCommand();
final CommandRunner<void> runner = createTestCommandRunner(command); final CommandRunner<void> runner = createTestCommandRunner(command);
await runner.run(<String>['doctor']); await runner.run(<String>['doctor']);
......
...@@ -5,17 +5,14 @@ ...@@ -5,17 +5,14 @@
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/android/android_workflow.dart'; import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/terminal.dart' show AnsiTerminal, OutputPreferences;
import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/base/version.dart'; import 'package:flutter_tools/src/base/version.dart';
import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/doctor.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
...@@ -28,25 +25,17 @@ class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {} ...@@ -28,25 +25,17 @@ class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {}
void main() { void main() {
AndroidSdk sdk; AndroidSdk sdk;
Logger logger; Logger logger;
MemoryFileSystem fs; MemoryFileSystem fileSystem;
MockProcessManager processManager; MockProcessManager processManager;
MockStdio stdio; MockStdio stdio;
UserMessages userMessages;
setUp(() { setUp(() {
sdk = MockAndroidSdk(); sdk = MockAndroidSdk();
fs = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
fs.directory('/home/me').createSync(recursive: true); fileSystem.directory('/home/me').createSync(recursive: true);
logger = BufferLogger( logger = BufferLogger.test();
terminal: AnsiTerminal(
stdio: null,
platform: const LocalPlatform(),
),
outputPreferences: OutputPreferences.test(),
);
processManager = MockProcessManager(); processManager = MockProcessManager();
stdio = MockStdio(); stdio = MockStdio();
userMessages = UserMessages();
}); });
MockProcess Function(List<String>) processMetaFactory(List<String> stdout) { MockProcess Function(List<String>) processMetaFactory(List<String> stdout) {
...@@ -80,68 +69,88 @@ void main() { ...@@ -80,68 +69,88 @@ void main() {
}); });
testUsingContext('licensesAccepted returns LicensesAccepted.unknown if cannot find sdkmanager', () async { testWithoutContext('licensesAccepted returns LicensesAccepted.unknown if cannot find sdkmanager', () async {
processManager.canRunSucceeds = false; processManager.canRunSucceeds = false;
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted licenseStatus = await licenseValidator.licensesAccepted; final LicensesAccepted licenseStatus = await licenseValidator.licensesAccepted;
expect(licenseStatus, LicensesAccepted.unknown); expect(licenseStatus, LicensesAccepted.unknown);
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('licensesAccepted returns LicensesAccepted.unknown if cannot run sdkmanager', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('licensesAccepted returns LicensesAccepted.unknown if cannot run sdkmanager', () async {
processManager.runSucceeds = false; processManager.runSucceeds = false;
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted licenseStatus = await licenseValidator.licensesAccepted; final LicensesAccepted licenseStatus = await licenseValidator.licensesAccepted;
expect(licenseStatus, LicensesAccepted.unknown); expect(licenseStatus, LicensesAccepted.unknown);
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('licensesAccepted handles garbage/no output', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('licensesAccepted handles garbage/no output', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted result = await licenseValidator.licensesAccepted; final LicensesAccepted result = await licenseValidator.licensesAccepted;
expect(result, equals(LicensesAccepted.unknown)); expect(result, equals(LicensesAccepted.unknown));
expect(processManager.commands.first, equals('/foo/bar/sdkmanager')); expect(processManager.commands.first, equals('/foo/bar/sdkmanager'));
expect(processManager.commands.last, equals('--licenses')); expect(processManager.commands.last, equals('--licenses'));
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('licensesAccepted works for all licenses accepted', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('licensesAccepted works for all licenses accepted', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
processManager.processFactory = processMetaFactory(<String>[ processManager.processFactory = processMetaFactory(<String>[
'[=======================================] 100% Computing updates... ', '[=======================================] 100% Computing updates... ',
'All SDK package licenses accepted.', 'All SDK package licenses accepted.',
]); ]);
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted result = await licenseValidator.licensesAccepted; final LicensesAccepted result = await licenseValidator.licensesAccepted;
expect(result, equals(LicensesAccepted.all)); expect(result, equals(LicensesAccepted.all));
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('licensesAccepted works for some licenses accepted', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('licensesAccepted works for some licenses accepted', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
processManager.processFactory = processMetaFactory(<String>[ processManager.processFactory = processMetaFactory(<String>[
'[=======================================] 100% Computing updates... ', '[=======================================] 100% Computing updates... ',
...@@ -149,18 +158,23 @@ void main() { ...@@ -149,18 +158,23 @@ void main() {
'Review licenses that have not been accepted (y/N)?', 'Review licenses that have not been accepted (y/N)?',
]); ]);
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted result = await licenseValidator.licensesAccepted; final LicensesAccepted result = await licenseValidator.licensesAccepted;
expect(result, equals(LicensesAccepted.some)); expect(result, equals(LicensesAccepted.some));
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('licensesAccepted works for no licenses accepted', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('licensesAccepted works for no licenses accepted', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
processManager.processFactory = processMetaFactory(<String>[ processManager.processFactory = processMetaFactory(<String>[
'[=======================================] 100% Computing updates... ', '[=======================================] 100% Computing updates... ',
...@@ -168,55 +182,78 @@ void main() { ...@@ -168,55 +182,78 @@ void main() {
'Review licenses that have not been accepted (y/N)?', 'Review licenses that have not been accepted (y/N)?',
]); ]);
final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
androidSdk: sdk,
fileSystem: fileSystem,
processManager: processManager,
platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
stdio: stdio,
logger: BufferLogger.test(),
userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
final LicensesAccepted result = await licenseValidator.licensesAccepted; final LicensesAccepted result = await licenseValidator.licensesAccepted;
expect(result, equals(LicensesAccepted.none)); expect(result, equals(LicensesAccepted.none));
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ });
AndroidSdk: () => sdk,
FileSystem: () => fs, testWithoutContext('runLicenseManager succeeds for version >= 26', () async {
ProcessManager: () => processManager,
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
Stdio: () => stdio,
}));
testUsingContext('runLicenseManager succeeds for version >= 26', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
when(sdk.sdkManagerVersion).thenReturn('26.0.0'); when(sdk.sdkManagerVersion).thenReturn('26.0.0');
expect(await AndroidLicenseValidator.runLicenseManager(), isTrue); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ androidSdk: sdk,
AndroidSdk: () => sdk, fileSystem: fileSystem,
FileSystem: () => fs, processManager: processManager,
ProcessManager: () => processManager, platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'}, stdio: stdio,
Stdio: () => stdio, logger: BufferLogger.test(),
})); userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
testUsingContext('runLicenseManager errors when sdkmanager is not found', () async { expect(await licenseValidator.runLicenseManager(), isTrue);
});
testWithoutContext('runLicenseManager errors when sdkmanager is not found', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
processManager.canRunSucceeds = false; processManager.canRunSucceeds = false;
expect(AndroidLicenseValidator.runLicenseManager(), throwsToolExit()); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ androidSdk: sdk,
AndroidSdk: () => sdk, fileSystem: fileSystem,
FileSystem: () => fs, processManager: processManager,
ProcessManager: () => processManager, platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'}, stdio: stdio,
Stdio: () => stdio, logger: BufferLogger.test(),
})); userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
expect(licenseValidator.runLicenseManager(), throwsToolExit());
});
testUsingContext('runLicenseManager errors when sdkmanager fails to run', () async { testWithoutContext('runLicenseManager errors when sdkmanager fails to run', () async {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
processManager.runSucceeds = false; processManager.runSucceeds = false;
expect(AndroidLicenseValidator.runLicenseManager(), throwsToolExit()); final AndroidLicenseValidator licenseValidator = AndroidLicenseValidator(
}, overrides: Map<Type, Generator>.unmodifiable(<Type, Generator>{ androidSdk: sdk,
AndroidSdk: () => sdk, fileSystem: fileSystem,
FileSystem: () => fs, processManager: processManager,
ProcessManager: () => processManager, platform: FakePlatform(environment: <String, String>{'HOME': '/home/me'}),
Platform: () => FakePlatform()..environment = <String, String>{'HOME': '/home/me'}, stdio: stdio,
Stdio: () => stdio, logger: BufferLogger.test(),
})); userMessages: UserMessages(),
androidStudio: null,
operatingSystemUtils: FakeOperatingSystemUtils(),
);
expect(licenseValidator.runLicenseManager(), throwsToolExit());
});
testWithoutContext('detects license-only SDK installation', () async { testWithoutContext('detects license-only SDK installation', () async {
when(sdk.licensesAvailable).thenReturn(true); when(sdk.licensesAvailable).thenReturn(true);
...@@ -224,16 +261,16 @@ void main() { ...@@ -224,16 +261,16 @@ void main() {
final ValidationResult validationResult = await AndroidValidator( final ValidationResult validationResult = await AndroidValidator(
androidStudio: null, androidStudio: null,
androidSdk: sdk, androidSdk: sdk,
fileSystem: fs, fileSystem: fileSystem,
logger: logger, logger: logger,
processManager: processManager, processManager: processManager,
platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me'}, platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
userMessages: userMessages, userMessages: UserMessages(),
).validate(); ).validate();
expect(validationResult.type, ValidationType.partial); expect(validationResult.type, ValidationType.partial);
expect( expect(
validationResult.messages.last.message, validationResult.messages.last.message,
userMessages.androidSdkLicenseOnly(kAndroidHome), UserMessages().androidSdkLicenseOnly(kAndroidHome),
); );
}); });
...@@ -249,7 +286,7 @@ void main() { ...@@ -249,7 +286,7 @@ void main() {
when(sdk.latestVersion).thenReturn(mockSdkVersion); when(sdk.latestVersion).thenReturn(mockSdkVersion);
when(sdk.validateSdkWellFormed()).thenReturn(<String>[]); when(sdk.validateSdkWellFormed()).thenReturn(<String>[]);
when(processManager.runSync(<String>['which', 'java'])).thenReturn(ProcessResult(123, 1, '', '')); when(processManager.runSync(<String>['which', 'java'])).thenReturn(ProcessResult(123, 1, '', ''));
final String errorMessage = userMessages.androidSdkBuildToolsOutdated( final String errorMessage = UserMessages().androidSdkBuildToolsOutdated(
sdk.sdkManagerPath, sdk.sdkManagerPath,
kAndroidSdkMinVersion, kAndroidSdkMinVersion,
kAndroidSdkBuildToolsMinVersion.toString(), kAndroidSdkBuildToolsMinVersion.toString(),
...@@ -259,11 +296,11 @@ void main() { ...@@ -259,11 +296,11 @@ void main() {
final AndroidValidator androidValidator = AndroidValidator( final AndroidValidator androidValidator = AndroidValidator(
androidStudio: null, androidStudio: null,
androidSdk: sdk, androidSdk: sdk,
fileSystem: fs, fileSystem: fileSystem,
logger: logger, logger: logger,
processManager: processManager, processManager: processManager,
platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me'}, platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me'},
userMessages: userMessages, userMessages: UserMessages(),
); );
ValidationResult validationResult = await androidValidator.validate(); ValidationResult validationResult = await androidValidator.validate();
...@@ -313,16 +350,16 @@ void main() { ...@@ -313,16 +350,16 @@ void main() {
const String javaVersionText = 'openjdk version "1.7.0_212"'; const String javaVersionText = 'openjdk version "1.7.0_212"';
when(processManager.run(argThat(contains('-version')))).thenAnswer((_) => when(processManager.run(argThat(contains('-version')))).thenAnswer((_) =>
Future<ProcessResult>.value(ProcessResult(0, 0, null, javaVersionText))); Future<ProcessResult>.value(ProcessResult(0, 0, null, javaVersionText)));
final String errorMessage = userMessages.androidJavaMinimumVersion(javaVersionText); final String errorMessage = UserMessages().androidJavaMinimumVersion(javaVersionText);
final ValidationResult validationResult = await AndroidValidator( final ValidationResult validationResult = await AndroidValidator(
androidSdk: sdk, androidSdk: sdk,
androidStudio: null, androidStudio: null,
fileSystem: fs, fileSystem: fileSystem,
logger: logger, logger: logger,
platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me', 'JAVA_HOME': 'home/java'}, platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me', 'JAVA_HOME': 'home/java'},
processManager: processManager, processManager: processManager,
userMessages: userMessages, userMessages: UserMessages(),
).validate(); ).validate();
expect(validationResult.type, ValidationType.partial); expect(validationResult.type, ValidationType.partial);
expect( expect(
...@@ -341,12 +378,13 @@ void main() { ...@@ -341,12 +378,13 @@ void main() {
final ValidationResult validationResult = await AndroidValidator( final ValidationResult validationResult = await AndroidValidator(
androidSdk: null, androidSdk: null,
androidStudio: null, androidStudio: null,
fileSystem: fs, fileSystem: fileSystem,
logger: logger, logger: logger,
platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me', 'JAVA_HOME': 'home/java'}, platform: FakePlatform()..environment = <String, String>{'HOME': '/home/me', 'JAVA_HOME': 'home/java'},
processManager: processManager, processManager: processManager,
userMessages: userMessages, userMessages: UserMessages(),
).validate(); ).validate();
expect( expect(
validationResult.messages.any( validationResult.messages.any(
(ValidationMessage message) => message.message.contains('flutter config --android-sdk') (ValidationMessage message) => message.message.contains('flutter config --android-sdk')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment