Unverified Commit 555721de authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove mock process manager from gradle tests (#76252)

parent 00630d09
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:process/process.dart';
import 'package:xml/xml.dart'; import 'package:xml/xml.dart';
import '../artifacts.dart'; import '../artifacts.dart';
...@@ -21,7 +22,7 @@ import '../build_info.dart'; ...@@ -21,7 +22,7 @@ import '../build_info.dart';
import '../cache.dart'; import '../cache.dart';
import '../convert.dart'; import '../convert.dart';
import '../flutter_manifest.dart'; import '../flutter_manifest.dart';
import '../globals.dart' as globals hide logger, printStatus, printTrace, printError; import '../globals.dart' as globals hide logger, printStatus, printTrace, printError, processManager, processUtils, fs;
import '../project.dart'; import '../project.dart';
import '../reporting/reporting.dart'; import '../reporting/reporting.dart';
import 'android_builder.dart'; import 'android_builder.dart';
...@@ -108,13 +109,14 @@ Iterable<String> _apkFilesFor(AndroidBuildInfo androidBuildInfo) { ...@@ -108,13 +109,14 @@ Iterable<String> _apkFilesFor(AndroidBuildInfo androidBuildInfo) {
/// Returns true if the current version of the Gradle plugin is supported. /// Returns true if the current version of the Gradle plugin is supported.
bool _isSupportedVersion(AndroidProject project) { bool _isSupportedVersion(AndroidProject project) {
final FileSystem fileSystem = project.hostAppGradleRoot.fileSystem;
final File plugin = project.hostAppGradleRoot.childFile( final File plugin = project.hostAppGradleRoot.childFile(
globals.fs.path.join('buildSrc', 'src', 'main', 'groovy', 'FlutterPlugin.groovy')); fileSystem.path.join('buildSrc', 'src', 'main', 'groovy', 'FlutterPlugin.groovy'));
if (plugin.existsSync()) { if (plugin.existsSync()) {
return false; return false;
} }
final File appGradle = project.hostAppGradleRoot.childFile( final File appGradle = project.hostAppGradleRoot.childFile(
globals.fs.path.join('app', 'build.gradle')); fileSystem.path.join('app', 'build.gradle'));
if (!appGradle.existsSync()) { if (!appGradle.existsSync()) {
return false; return false;
} }
...@@ -137,12 +139,12 @@ Future<File> getGradleAppOut(AndroidProject androidProject) async { ...@@ -137,12 +139,12 @@ Future<File> getGradleAppOut(AndroidProject androidProject) async {
/// Runs `gradlew dependencies`, ensuring that dependencies are resolved and /// Runs `gradlew dependencies`, ensuring that dependencies are resolved and
/// potentially downloaded. /// potentially downloaded.
Future<void> checkGradleDependencies(Logger logger) async { Future<void> checkGradleDependencies(Logger logger, ProcessUtils processUtils) async {
final Status progress = logger.startProgress( final Status progress = logger.startProgress(
'Ensuring gradle dependencies are up to date...', 'Ensuring gradle dependencies are up to date...',
); );
final FlutterProject flutterProject = FlutterProject.current(); final FlutterProject flutterProject = FlutterProject.current();
await globals.processUtils.run(<String>[ await processUtils.run(<String>[
globals.gradleUtils.getExecutable(flutterProject), globals.gradleUtils.getExecutable(flutterProject),
'dependencies', 'dependencies',
], ],
...@@ -162,6 +164,7 @@ Future<void> checkGradleDependencies(Logger logger) async { ...@@ -162,6 +164,7 @@ Future<void> checkGradleDependencies(Logger logger) async {
/// `settings.gradle` file has local edits. /// `settings.gradle` file has local edits.
@visibleForTesting @visibleForTesting
void createSettingsAarGradle(Directory androidDirectory, Logger logger) { void createSettingsAarGradle(Directory androidDirectory, Logger logger) {
final FileSystem fileSystem = androidDirectory.fileSystem;
final File newSettingsFile = androidDirectory.childFile('settings_aar.gradle'); final File newSettingsFile = androidDirectory.childFile('settings_aar.gradle');
if (newSettingsFile.existsSync()) { if (newSettingsFile.existsSync()) {
return; return;
...@@ -172,14 +175,14 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) { ...@@ -172,14 +175,14 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) {
} }
final String currentFileContent = currentSettingsFile.readAsStringSync(); final String currentFileContent = currentSettingsFile.readAsStringSync();
final String newSettingsRelativeFile = globals.fs.path.relative(newSettingsFile.path); final String newSettingsRelativeFile = fileSystem.path.relative(newSettingsFile.path);
final Status status = logger.startProgress('✏️ Creating `$newSettingsRelativeFile`...'); final Status status = logger.startProgress('✏️ Creating `$newSettingsRelativeFile`...');
final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot); final String flutterRoot = fileSystem.path.absolute(Cache.flutterRoot);
final File legacySettingsDotGradleFiles = globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools', final File legacySettingsDotGradleFiles = fileSystem.file(fileSystem.path.join(flutterRoot, 'packages','flutter_tools',
'gradle', 'settings.gradle.legacy_versions')); 'gradle', 'settings.gradle.legacy_versions'));
assert(legacySettingsDotGradleFiles.existsSync()); assert(legacySettingsDotGradleFiles.existsSync());
final String settingsAarContent = globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools', final String settingsAarContent = fileSystem.file(fileSystem.path.join(flutterRoot, 'packages','flutter_tools',
'gradle', 'settings_aar.gradle.tmpl')).readAsStringSync(); 'gradle', 'settings_aar.gradle.tmpl')).readAsStringSync();
// Get the `settings.gradle` content variants that should be patched. // Get the `settings.gradle` content variants that should be patched.
...@@ -197,7 +200,7 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) { ...@@ -197,7 +200,7 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) {
status.cancel(); status.cancel();
logger.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.'); logger.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.');
// Print how to manually update the file. // Print how to manually update the file.
logger.printStatus(globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools', logger.printStatus(fileSystem.file(fileSystem.path.join(flutterRoot, 'packages','flutter_tools',
'gradle', 'manual_migration_settings.gradle.md')).readAsStringSync()); 'gradle', 'manual_migration_settings.gradle.md')).readAsStringSync());
throwToolExit('Please create the file and run this command again.'); throwToolExit('Please create the file and run this command again.');
} }
...@@ -211,9 +214,15 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) { ...@@ -211,9 +214,15 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) {
class AndroidGradleBuilder implements AndroidBuilder { class AndroidGradleBuilder implements AndroidBuilder {
AndroidGradleBuilder({ AndroidGradleBuilder({
@required Logger logger, @required Logger logger,
}) : _logger = logger; @required ProcessManager processManager,
@required FileSystem fileSystem,
}) : _logger = logger,
_fileSystem = fileSystem,
_processUtils = ProcessUtils(logger: logger, processManager: processManager);
final Logger _logger; final Logger _logger;
final ProcessUtils _processUtils;
final FileSystem _fileSystem;
/// Builds the AAR and POM files for the current Flutter module or plugin. /// Builds the AAR and POM files for the current Flutter module or plugin.
@override @override
...@@ -226,7 +235,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -226,7 +235,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
}) async { }) async {
try { try {
Directory outputDirectory = Directory outputDirectory =
globals.fs.directory(outputDirectoryPath ?? project.android.buildDirectory); _fileSystem.directory(outputDirectoryPath ?? project.android.buildDirectory);
if (project.isModule) { if (project.isModule) {
// Module projects artifacts are located in `build/host`. // Module projects artifacts are located in `build/host`.
outputDirectory = outputDirectory.childDirectory('host'); outputDirectory = outputDirectory.childDirectory('host');
...@@ -249,7 +258,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -249,7 +258,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
repoDirectory: getRepoDirectory(outputDirectory), repoDirectory: getRepoDirectory(outputDirectory),
buildNumber: buildNumber, buildNumber: buildNumber,
logger: _logger, logger: _logger,
fileSystem: globals.fs, fileSystem: _fileSystem,
); );
} finally { } finally {
globals.androidSdk?.reinitialize(); globals.androidSdk?.reinitialize();
...@@ -383,6 +392,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -383,6 +392,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
final Directory localEngineRepo = _getLocalEngineRepo( final Directory localEngineRepo = _getLocalEngineRepo(
engineOutPath: localEngineArtifacts.engineOutPath, engineOutPath: localEngineArtifacts.engineOutPath,
androidBuildInfo: androidBuildInfo, androidBuildInfo: androidBuildInfo,
fileSystem: _fileSystem,
); );
_logger.printTrace( _logger.printTrace(
'Using local engine: ${localEngineArtifacts.engineOutPath}\n' 'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
...@@ -454,7 +464,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -454,7 +464,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
..start(); ..start();
int exitCode = 1; int exitCode = 1;
try { try {
exitCode = await globals.processUtils.stream( exitCode = await _processUtils.stream(
command, command,
workingDirectory: project.android.hostAppGradleRoot.path, workingDirectory: project.android.hostAppGradleRoot.path,
allowReentrantFlutter: true, allowReentrantFlutter: true,
...@@ -542,7 +552,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -542,7 +552,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
} }
_logger.printStatus( _logger.printStatus(
'$successMark Built ${globals.fs.path.relative(bundleFile.path)}$appSize.', '$successMark Built ${_fileSystem.path.relative(bundleFile.path)}$appSize.',
color: TerminalColor.green, color: TerminalColor.green,
); );
return; return;
...@@ -575,7 +585,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -575,7 +585,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
? '' // Don't display the size when building a debug variant. ? '' // Don't display the size when building a debug variant.
: ' (${getSizeAsMB(apkFile.lengthSync())})'; : ' (${getSizeAsMB(apkFile.lengthSync())})';
_logger.printStatus( _logger.printStatus(
'$successMark Built ${globals.fs.path.relative(apkFile.path)}$appSize.', '$successMark Built ${_fileSystem.path.relative(apkFile.path)}$appSize.',
color: TerminalColor.green, color: TerminalColor.green,
); );
...@@ -588,15 +598,15 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -588,15 +598,15 @@ class AndroidGradleBuilder implements AndroidBuilder {
File zipFile, File zipFile,
AndroidBuildInfo androidBuildInfo,) async { AndroidBuildInfo androidBuildInfo,) async {
final SizeAnalyzer sizeAnalyzer = SizeAnalyzer( final SizeAnalyzer sizeAnalyzer = SizeAnalyzer(
fileSystem: globals.fs, fileSystem: _fileSystem,
logger: _logger, logger: _logger,
flutterUsage: globals.flutterUsage, flutterUsage: globals.flutterUsage,
); );
final String archName = getNameForAndroidArch(androidBuildInfo.targetArchs.single); final String archName = getNameForAndroidArch(androidBuildInfo.targetArchs.single);
final BuildInfo buildInfo = androidBuildInfo.buildInfo; final BuildInfo buildInfo = androidBuildInfo.buildInfo;
final File aotSnapshot = globals.fs.directory(buildInfo.codeSizeDirectory) final File aotSnapshot = _fileSystem.directory(buildInfo.codeSizeDirectory)
.childFile('snapshot.$archName.json'); .childFile('snapshot.$archName.json');
final File precompilerTrace = globals.fs.directory(buildInfo.codeSizeDirectory) final File precompilerTrace = _fileSystem.directory(buildInfo.codeSizeDirectory)
.childFile('trace.$archName.json'); .childFile('trace.$archName.json');
final Map<String, Object> output = await sizeAnalyzer.analyzeZipSizeAndAotSnapshot( final Map<String, Object> output = await sizeAnalyzer.analyzeZipSizeAndAotSnapshot(
zipFile: zipFile, zipFile: zipFile,
...@@ -605,7 +615,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -605,7 +615,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
kind: kind, kind: kind,
); );
final File outputFile = globals.fsUtils.getUniqueFile( final File outputFile = globals.fsUtils.getUniqueFile(
globals.fs _fileSystem
.directory(globals.fsUtils.homeDirPath) .directory(globals.fsUtils.homeDirPath)
.childDirectory('.flutter-devtools'), '$kind-code-size-analysis', 'json', .childDirectory('.flutter-devtools'), '$kind-code-size-analysis', 'json',
) )
...@@ -658,8 +668,8 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -658,8 +668,8 @@ class AndroidGradleBuilder implements AndroidBuilder {
multilineOutput: true, multilineOutput: true,
); );
final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot); final String flutterRoot = _fileSystem.path.absolute(Cache.flutterRoot);
final String initScript = globals.fs.path.join( final String initScript = _fileSystem.path.join(
flutterRoot, flutterRoot,
'packages', 'packages',
'flutter_tools', 'flutter_tools',
...@@ -699,6 +709,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -699,6 +709,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
final Directory localEngineRepo = _getLocalEngineRepo( final Directory localEngineRepo = _getLocalEngineRepo(
engineOutPath: localEngineArtifacts.engineOutPath, engineOutPath: localEngineArtifacts.engineOutPath,
androidBuildInfo: androidBuildInfo, androidBuildInfo: androidBuildInfo,
fileSystem: _fileSystem,
); );
_logger.printTrace( _logger.printTrace(
'Using local engine: ${localEngineArtifacts.engineOutPath}\n' 'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
...@@ -734,7 +745,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -734,7 +745,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
..start(); ..start();
RunResult result; RunResult result;
try { try {
result = await globals.processUtils.run( result = await _processUtils.run(
command, command,
workingDirectory: project.android.hostAppGradleRoot.path, workingDirectory: project.android.hostAppGradleRoot.path,
allowReentrantFlutter: true, allowReentrantFlutter: true,
...@@ -766,7 +777,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -766,7 +777,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
); );
} }
_logger.printStatus( _logger.printStatus(
'$successMark Built ${globals.fs.path.relative(repoDirectory.path)}.', '$successMark Built ${_fileSystem.path.relative(repoDirectory.path)}.',
color: TerminalColor.green, color: TerminalColor.green,
); );
} }
...@@ -788,7 +799,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -788,7 +799,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
if (pluginParts.length != 2) { if (pluginParts.length != 2) {
continue; continue;
} }
final Directory pluginDirectory = globals.fs.directory(pluginParts.last); final Directory pluginDirectory = _fileSystem.directory(pluginParts.last);
assert(pluginDirectory.existsSync()); assert(pluginDirectory.existsSync());
final String pluginName = pluginParts.first; final String pluginName = pluginParts.first;
...@@ -1067,12 +1078,12 @@ void _exitWithExpectedFileNotFound({ ...@@ -1067,12 +1078,12 @@ void _exitWithExpectedFileNotFound({
); );
} }
void _createSymlink(String targetPath, String linkPath) { void _createSymlink(String targetPath, String linkPath, FileSystem fileSystem) {
final File targetFile = globals.fs.file(targetPath); final File targetFile = fileSystem.file(targetPath);
if (!targetFile.existsSync()) { if (!targetFile.existsSync()) {
throwToolExit("The file $targetPath wasn't found in the local engine out directory."); throwToolExit("The file $targetPath wasn't found in the local engine out directory.");
} }
final File linkFile = globals.fs.file(linkPath); final File linkFile = fileSystem.file(linkPath);
final Link symlink = linkFile.parent.childLink(linkFile.basename); final Link symlink = linkFile.parent.childLink(linkFile.basename);
try { try {
symlink.createSync(targetPath, recursive: true); symlink.createSync(targetPath, recursive: true);
...@@ -1083,8 +1094,8 @@ void _createSymlink(String targetPath, String linkPath) { ...@@ -1083,8 +1094,8 @@ void _createSymlink(String targetPath, String linkPath) {
} }
} }
String _getLocalArtifactVersion(String pomPath) { String _getLocalArtifactVersion(String pomPath, FileSystem fileSystem) {
final File pomFile = globals.fs.file(pomPath); final File pomFile = fileSystem.file(pomPath);
if (!pomFile.existsSync()) { if (!pomFile.existsSync()) {
throwToolExit("The file $pomPath wasn't found in the local engine out directory."); throwToolExit("The file $pomPath wasn't found in the local engine out directory.");
} }
...@@ -1118,12 +1129,13 @@ String _getLocalArtifactVersion(String pomPath) { ...@@ -1118,12 +1129,13 @@ String _getLocalArtifactVersion(String pomPath) {
Directory _getLocalEngineRepo({ Directory _getLocalEngineRepo({
@required String engineOutPath, @required String engineOutPath,
@required AndroidBuildInfo androidBuildInfo, @required AndroidBuildInfo androidBuildInfo,
@required FileSystem fileSystem,
}) { }) {
assert(engineOutPath != null); assert(engineOutPath != null);
assert(androidBuildInfo != null); assert(androidBuildInfo != null);
final String abi = _getAbiByLocalEnginePath(engineOutPath); final String abi = _getAbiByLocalEnginePath(engineOutPath);
final Directory localEngineRepo = globals.fs.systemTempDirectory final Directory localEngineRepo = fileSystem.systemTempDirectory
.createTempSync('flutter_tool_local_engine_repo.'); .createTempSync('flutter_tool_local_engine_repo.');
// Remove the local engine repo before the tool exits. // Remove the local engine repo before the tool exits.
...@@ -1137,19 +1149,20 @@ Directory _getLocalEngineRepo({ ...@@ -1137,19 +1149,20 @@ Directory _getLocalEngineRepo({
final String buildMode = androidBuildInfo.buildInfo.modeName; final String buildMode = androidBuildInfo.buildInfo.modeName;
final String artifactVersion = _getLocalArtifactVersion( final String artifactVersion = _getLocalArtifactVersion(
globals.fs.path.join( fileSystem.path.join(
engineOutPath, engineOutPath,
'flutter_embedding_$buildMode.pom', 'flutter_embedding_$buildMode.pom',
) ),
fileSystem,
); );
for (final String artifact in const <String>['pom', 'jar']) { for (final String artifact in const <String>['pom', 'jar']) {
// The Android embedding artifacts. // The Android embedding artifacts.
_createSymlink( _createSymlink(
globals.fs.path.join( fileSystem.path.join(
engineOutPath, engineOutPath,
'flutter_embedding_$buildMode.$artifact', 'flutter_embedding_$buildMode.$artifact',
), ),
globals.fs.path.join( fileSystem.path.join(
localEngineRepo.path, localEngineRepo.path,
'io', 'io',
'flutter', 'flutter',
...@@ -1157,14 +1170,15 @@ Directory _getLocalEngineRepo({ ...@@ -1157,14 +1170,15 @@ Directory _getLocalEngineRepo({
artifactVersion, artifactVersion,
'flutter_embedding_$buildMode-$artifactVersion.$artifact', 'flutter_embedding_$buildMode-$artifactVersion.$artifact',
), ),
fileSystem,
); );
// The engine artifacts (libflutter.so). // The engine artifacts (libflutter.so).
_createSymlink( _createSymlink(
globals.fs.path.join( fileSystem.path.join(
engineOutPath, engineOutPath,
'${abi}_$buildMode.$artifact', '${abi}_$buildMode.$artifact',
), ),
globals.fs.path.join( fileSystem.path.join(
localEngineRepo.path, localEngineRepo.path,
'io', 'io',
'flutter', 'flutter',
...@@ -1172,21 +1186,23 @@ Directory _getLocalEngineRepo({ ...@@ -1172,21 +1186,23 @@ Directory _getLocalEngineRepo({
artifactVersion, artifactVersion,
'${abi}_$buildMode-$artifactVersion.$artifact', '${abi}_$buildMode-$artifactVersion.$artifact',
), ),
fileSystem,
); );
} }
for (final String artifact in <String>['flutter_embedding_$buildMode', '${abi}_$buildMode']) { for (final String artifact in <String>['flutter_embedding_$buildMode', '${abi}_$buildMode']) {
_createSymlink( _createSymlink(
globals.fs.path.join( fileSystem.path.join(
engineOutPath, engineOutPath,
'$artifact.maven-metadata.xml', '$artifact.maven-metadata.xml',
), ),
globals.fs.path.join( fileSystem.path.join(
localEngineRepo.path, localEngineRepo.path,
'io', 'io',
'flutter', 'flutter',
artifact, artifact,
'maven-metadata.xml', 'maven-metadata.xml',
), ),
fileSystem,
); );
} }
return localEngineRepo; return localEngineRepo;
......
...@@ -65,7 +65,7 @@ class ApplicationPackageFactory { ...@@ -65,7 +65,7 @@ class ApplicationPackageFactory {
case TargetPlatform.android_x64: case TargetPlatform.android_x64:
case TargetPlatform.android_x86: case TargetPlatform.android_x86:
if (_androidSdk?.licensesAvailable == true && _androidSdk?.latestVersion == null) { if (_androidSdk?.licensesAvailable == true && _androidSdk?.latestVersion == null) {
await checkGradleDependencies(_logger); await checkGradleDependencies(_logger, _processUtils);
} }
if (applicationBinary == null) { if (applicationBinary == null) {
return await AndroidApk.fromAndroidProject( return await AndroidApk.fromAndroidProject(
......
...@@ -81,6 +81,8 @@ Future<T> runInContext<T>( ...@@ -81,6 +81,8 @@ Future<T> runInContext<T>(
fallbacks: <Type, Generator>{ fallbacks: <Type, Generator>{
AndroidBuilder: () => AndroidGradleBuilder( AndroidBuilder: () => AndroidGradleBuilder(
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager,
fileSystem: globals.fs,
), ),
AndroidLicenseValidator: () => AndroidLicenseValidator( AndroidLicenseValidator: () => AndroidLicenseValidator(
operatingSystemUtils: globals.os, operatingSystemUtils: globals.os,
......
...@@ -19,7 +19,6 @@ import 'package:flutter_tools/src/base/logger.dart'; ...@@ -19,7 +19,6 @@ import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
...@@ -27,7 +26,6 @@ import 'package:process/process.dart'; ...@@ -27,7 +26,6 @@ import 'package:process/process.dart';
import '../../src/common.dart'; import '../../src/common.dart';
import '../../src/context.dart'; import '../../src/context.dart';
import '../../src/mocks.dart';
void main() { void main() {
group('gradle build', () { group('gradle build', () {
...@@ -36,23 +34,25 @@ void main() { ...@@ -36,23 +34,25 @@ void main() {
MockAndroidSdk mockAndroidSdk; MockAndroidSdk mockAndroidSdk;
MockAndroidStudio mockAndroidStudio; MockAndroidStudio mockAndroidStudio;
MockLocalEngineArtifacts mockArtifacts; MockLocalEngineArtifacts mockArtifacts;
MockProcessManager mockProcessManager;
FakePlatform android; FakePlatform android;
FileSystem fileSystem; FileSystem fileSystem;
Cache cache; Cache cache;
AndroidGradleBuilder builder; AndroidGradleBuilder builder;
FakeProcessManager processManager;
setUp(() { setUp(() {
processManager = FakeProcessManager.list(<FakeCommand>[]);
logger = BufferLogger.test(); logger = BufferLogger.test();
testUsage = TestUsage(); testUsage = TestUsage();
fileSystem = MemoryFileSystem.test(); fileSystem = MemoryFileSystem.test();
mockAndroidSdk = MockAndroidSdk(); mockAndroidSdk = MockAndroidSdk();
mockAndroidStudio = MockAndroidStudio(); mockAndroidStudio = MockAndroidStudio();
mockArtifacts = MockLocalEngineArtifacts(); mockArtifacts = MockLocalEngineArtifacts();
mockProcessManager = MockProcessManager();
android = fakePlatform('android'); android = fakePlatform('android');
builder = AndroidGradleBuilder( builder = AndroidGradleBuilder(
logger: logger, logger: logger,
processManager: processManager,
fileSystem: fileSystem,
); );
when(mockAndroidSdk.directory).thenReturn(fileSystem.directory('irrelevant')); when(mockAndroidSdk.directory).thenReturn(fileSystem.directory('irrelevant'));
...@@ -62,6 +62,7 @@ void main() { ...@@ -62,6 +62,7 @@ void main() {
rootOverride: rootDirectory, rootOverride: rootDirectory,
fileSystem: fileSystem, fileSystem: fileSystem,
); );
Cache.flutterRoot = '';
final Directory gradleWrapperDirectory = rootDirectory final Directory gradleWrapperDirectory = rootDirectory
.childDirectory('bin') .childDirectory('bin')
...@@ -83,15 +84,21 @@ void main() { ...@@ -83,15 +84,21 @@ void main() {
.writeAsStringSync('irrelevant'); .writeAsStringSync('irrelevant');
}); });
testUsingContext('recognizes common errors - tool exit', () async { testUsingContext('Can immediately tool exit on recognized exit code/stderr', () async {
final Process process = createMockProcess( processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease'
],
exitCode: 1, exitCode: 1,
stdout: 'irrelevant\nSome gradle message\nirrelevant', stderr: '\nSome gradle message\n',
); ));
when(mockProcessManager.start(any,
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment')))
.thenAnswer((_) => Future<Process>.value(process));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -157,22 +164,40 @@ void main() { ...@@ -157,22 +164,40 @@ void main() {
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('recognizes common errors - retry build', () async { testUsingContext('Can retry build on recognized exit code/stderr', () async {
when(mockProcessManager.start(any, processManager.addCommand(const FakeCommand(
workingDirectory: anyNamed('workingDirectory'), command: <String>[
environment: anyNamed('environment'))) '/android/gradlew',
.thenAnswer((_) { '-q',
final Process process = createMockProcess( '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1, exitCode: 1,
stdout: 'irrelevant\nSome gradle message\nirrelevant', stderr: '\nSome gradle message\n'
); ));
return Future<Process>.value(process); processManager.addCommand(const FakeCommand(
}); command: <String>[
'/android/gradlew',
'-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1,
stderr: '\nSome gradle message\n'
));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -239,16 +264,26 @@ void main() { ...@@ -239,16 +264,26 @@ void main() {
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('recognizes process exceptions - tool exit', () async { testUsingContext('Converts recognized ProcessExceptions into tools exits', () async {
when(mockProcessManager.start(any, processManager.addCommand(const FakeCommand(
workingDirectory: anyNamed('workingDirectory'), command: <String>[
environment: anyNamed('environment'))) '/android/gradlew',
.thenThrow(const ProcessException('', <String>[], 'Some gradle message')); '-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1,
stderr: '\nSome gradle message\n',
));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -314,16 +349,28 @@ void main() { ...@@ -314,16 +349,28 @@ void main() {
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('rethrows unrecognized ProcessException', () async { testUsingContext('rethrows unrecognized ProcessException', () async {
when(mockProcessManager.start(any, processManager.addCommand(FakeCommand(
workingDirectory: anyNamed('workingDirectory'), command: const <String>[
environment: anyNamed('environment'))) '/android/gradlew',
.thenThrow(const ProcessException('', <String>[], 'Unrecognized')); '-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1,
onRun: () {
throw const ProcessException('', <String>[], 'Unrecognized');
}
));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -355,36 +402,43 @@ void main() { ...@@ -355,36 +402,43 @@ void main() {
); );
}, },
throwsA(isA<ProcessException>())); throwsA(isA<ProcessException>()));
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext('logs success event after a successful retry', () async { testUsingContext('logs success event after a successful retry', () async {
int testFnCalled = 0; processManager.addCommand(const FakeCommand(
when(mockProcessManager.start(any, command: <String>[
workingDirectory: anyNamed('workingDirectory'), '/android/gradlew',
environment: anyNamed('environment'))) '-q',
.thenAnswer((_) { '-Ptarget-platform=android-arm,android-arm64,android-x64',
Process process; '-Ptarget=lib/main.dart',
if (testFnCalled == 0) { '-Pdart-obfuscation=false',
process = createMockProcess( '-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1, exitCode: 1,
stdout: 'irrelevant\nSome gradle message\nirrelevant', stderr: '\nnSome gradle message\n',
); ));
} else { processManager.addCommand(const FakeCommand(
process = createMockProcess( command: <String>[
'/android/gradlew',
'-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 0, exitCode: 0,
stdout: 'irrelevant', ));
);
}
testFnCalled++;
return Future<Process>.value(process);
});
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -435,7 +489,6 @@ void main() { ...@@ -435,7 +489,6 @@ void main() {
), ),
], ],
); );
expect(testUsage.events, contains( expect(testUsage.events, contains(
const TestUsageEvent( const TestUsageEvent(
'build', 'build',
...@@ -444,25 +497,31 @@ void main() { ...@@ -444,25 +497,31 @@ void main() {
parameters: <String, String>{}, parameters: <String, String>{},
), ),
)); ));
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
FileSystem: () => fileSystem,
Platform: () => android, Platform: () => android,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('performs code size analysis and sends analytics', () async { testUsingContext('performs code size analysis and sends analytics', () async {
when(mockProcessManager.start(any, processManager.addCommand(const FakeCommand(
workingDirectory: anyNamed('workingDirectory'), command: <String>[
environment: anyNamed('environment'))) '/android/gradlew',
.thenAnswer((_) { '-q',
return Future<Process>.value(createMockProcess( '-Ptarget-platform=android-arm64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Pcode-size-directory=foo',
'assembleRelease',
],
exitCode: 0, exitCode: 0,
stdout: 'irrelevant',
)); ));
});
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -533,23 +592,43 @@ void main() { ...@@ -533,23 +592,43 @@ void main() {
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
FileSystem: () => fileSystem,
Platform: () => android, Platform: () => android,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('recognizes common errors - retry build with AAR plugins', () async { testUsingContext('Can retry gradle build with plugins built as AARs', () async {
when(mockProcessManager.start(any, processManager.addCommand(const FakeCommand(
workingDirectory: anyNamed('workingDirectory'), command: <String>[
environment: anyNamed('environment'))) '/android/gradlew',
.thenAnswer((_) { '-q',
final Process process = createMockProcess( '-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 1, exitCode: 1,
stdout: 'irrelevant\nSome gradle message\nirrelevant', stderr: '\nSome gradle message\n',
); ));
return Future<Process>.value(process); processManager.addCommand(const FakeCommand(
}); command: <String>[
'/android/gradlew',
'-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Dbuild-plugins-as-aars=true',
'--settings-file=settings_aar.gradle',
'assembleRelease'
],
exitCode: 1,
stderr: '\nSome gradle message\n',
));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
...@@ -618,16 +697,29 @@ void main() { ...@@ -618,16 +697,29 @@ void main() {
parameters: <String, String>{}, parameters: <String, String>{},
), ),
)); ));
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager,
Usage: () => testUsage, Usage: () => testUsage,
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext('indicates that an APK has been built successfully', () async { testUsingContext('indicates that an APK has been built successfully', () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease'
],
));
fileSystem.directory('android') fileSystem.directory('android')
.childFile('build.gradle') .childFile('build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
...@@ -667,16 +759,34 @@ void main() { ...@@ -667,16 +759,34 @@ void main() {
logger.statusText, logger.statusText,
contains('Built build/app/outputs/flutter-apk/app-release.apk (0.0MB)'), contains('Built build/app/outputs/flutter-apk/app-release.apk (0.0MB)'),
); );
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
Cache: () => cache, Cache: () => cache,
FileSystem: () => fileSystem,
Platform: () => android, Platform: () => android,
ProcessManager: () => FakeProcessManager.any(), FileSystem: () => fileSystem,
ProcessManager: () => processManager,
}); });
testUsingContext("doesn't indicate how to consume an AAR when printHowToConsumeAaar is false", () async { testUsingContext("doesn't indicate how to consume an AAR when printHowToConsumeAar is false", () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=1.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleAarRelease',
],
exitCode: 0,
));
final File manifestFile = fileSystem.file('pubspec.yaml'); final File manifestFile = fileSystem.file('pubspec.yaml');
manifestFile.createSync(recursive: true); manifestFile.createSync(recursive: true);
manifestFile.writeAsStringSync(''' manifestFile.writeAsStringSync('''
...@@ -694,13 +804,6 @@ void main() { ...@@ -694,13 +804,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await builder.buildGradleAar( await builder.buildGradleAar(
...@@ -719,17 +822,36 @@ void main() { ...@@ -719,17 +822,36 @@ void main() {
logger.statusText.contains('Consuming the Module'), logger.statusText.contains('Consuming the Module'),
isFalse, isFalse,
); );
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext('gradle exit code is properly passed on', () async { testUsingContext('gradle exit code and stderr is forwarded to tool exit', () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=1.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Ptarget-platform=android-arm,android-arm64,android-x64',
'assembleAarRelease'
],
exitCode: 108,
stderr: 'Gradle task assembleAarRelease failed with exit code 108.',
));
final File manifestFile = fileSystem.file('pubspec.yaml'); final File manifestFile = fileSystem.file('pubspec.yaml');
manifestFile.createSync(recursive: true); manifestFile.createSync(recursive: true);
manifestFile.writeAsStringSync(''' manifestFile.writeAsStringSync('''
...@@ -747,13 +869,6 @@ void main() { ...@@ -747,13 +869,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 108, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await expectLater(() async => await expectLater(() async =>
...@@ -763,19 +878,35 @@ void main() { ...@@ -763,19 +878,35 @@ void main() {
outputDirectory: fileSystem.directory('build/'), outputDirectory: fileSystem.directory('build/'),
target: '', target: '',
buildNumber: '1.0', buildNumber: '1.0',
) ), throwsToolExit(exitCode: 108, message: 'Gradle task assembleAarRelease failed with exit code 108.'));
, throwsToolExit(exitCode: 108, message: 'Gradle task assembleAarRelease failed with exit code 108.')); expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext('build apk uses selected local engine,the engine abi is arm', () async { testUsingContext('build apk uses selected local engine with arm32 ABI', () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_arm',
'-Ptarget-platform=android-arm',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: TargetPlatform.android_arm, platform: TargetPlatform.android_arm,
...@@ -816,24 +947,6 @@ void main() { ...@@ -816,24 +947,6 @@ void main() {
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('apply from: irrelevant/flutter.gradle'); ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
when(mockProcessManager.start(any,
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment')))
.thenAnswer((_) {
return Future<Process>.value(
createMockProcess(
exitCode: 1,
)
);
});
await expectLater(() async { await expectLater(() async {
await builder.buildGradleApp( await builder.buildGradleApp(
project: FlutterProject.current(), project: FlutterProject.current(),
...@@ -850,18 +963,11 @@ void main() { ...@@ -850,18 +963,11 @@ void main() {
); );
}, throwsToolExit()); }, throwsToolExit());
final List<String> actualGradlewCall = verify(
mockProcessManager.start(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/android/gradlew')); // expect(actualGradlewCall, contains('/android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm')); // expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0')); // expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release')); // expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
...@@ -870,11 +976,27 @@ void main() { ...@@ -870,11 +976,27 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext( testUsingContext('build apk uses selected local engine with arm64 ABI', () async {
'build apk uses selected local engine,the engine abi is arm64', () async { processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_arm64',
'-Ptarget-platform=android-arm64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -915,24 +1037,6 @@ void main() { ...@@ -915,24 +1037,6 @@ void main() {
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('apply from: irrelevant/flutter.gradle'); ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
when(mockProcessManager.start(any,
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment')))
.thenAnswer((_) {
return Future<Process>.value(
createMockProcess(
exitCode: 1,
)
);
});
await expectLater(() async { await expectLater(() async {
await builder.buildGradleApp( await builder.buildGradleApp(
project: FlutterProject.current(), project: FlutterProject.current(),
...@@ -948,20 +1052,7 @@ void main() { ...@@ -948,20 +1052,7 @@ void main() {
localGradleErrors: const <GradleHandledError>[], localGradleErrors: const <GradleHandledError>[],
); );
}, throwsToolExit()); }, throwsToolExit());
expect(processManager.hasRemainingExpectations, false);
final List<String> actualGradlewCall = verify(
mockProcessManager.start(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm64'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -969,11 +1060,27 @@ void main() { ...@@ -969,11 +1060,27 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext( testUsingContext('build apk uses selected local engine with x86 ABI', () async {
'build apk uses selected local engine,the engine abi is x86', () async { processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_x86',
'-Ptarget-platform=android-x86',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease',
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -1014,24 +1121,6 @@ void main() { ...@@ -1014,24 +1121,6 @@ void main() {
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('apply from: irrelevant/flutter.gradle'); ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
when(mockProcessManager.start(any,
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment')))
.thenAnswer((_) {
return Future<Process>.value(
createMockProcess(
exitCode: 1,
)
);
});
await expectLater(() async { await expectLater(() async {
await builder.buildGradleApp( await builder.buildGradleApp(
project: FlutterProject.current(), project: FlutterProject.current(),
...@@ -1047,20 +1136,7 @@ void main() { ...@@ -1047,20 +1136,7 @@ void main() {
localGradleErrors: const <GradleHandledError>[], localGradleErrors: const <GradleHandledError>[],
); );
}, throwsToolExit()); }, throwsToolExit());
expect(processManager.hasRemainingExpectations, false);
final List<String> actualGradlewCall = verify(
mockProcessManager.start(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x86'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1068,11 +1144,27 @@ void main() { ...@@ -1068,11 +1144,27 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext( testUsingContext('build apk uses selected local engine with x64 ABI', () async {
'build apk uses selected local engine,the engine abi is x64', () async { processManager.addCommand(const FakeCommand(
command: <String>[
'/android/gradlew',
'-q',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_x64',
'-Ptarget-platform=android-x64',
'-Ptarget=lib/main.dart',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'assembleRelease'
],
exitCode: 1,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -1113,24 +1205,6 @@ void main() { ...@@ -1113,24 +1205,6 @@ void main() {
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('apply from: irrelevant/flutter.gradle'); ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
when(mockProcessManager.start(any,
workingDirectory: anyNamed('workingDirectory'),
environment: anyNamed('environment')))
.thenAnswer((_) {
return Future<Process>.value(
createMockProcess(
exitCode: 1,
)
);
});
await expectLater(() async { await expectLater(() async {
await builder.buildGradleApp( await builder.buildGradleApp(
project: FlutterProject.current(), project: FlutterProject.current(),
...@@ -1146,20 +1220,7 @@ void main() { ...@@ -1146,20 +1220,7 @@ void main() {
localGradleErrors: const <GradleHandledError>[], localGradleErrors: const <GradleHandledError>[],
); );
}, throwsToolExit()); }, throwsToolExit());
expect(processManager.hasRemainingExpectations, false);
final List<String> actualGradlewCall = verify(
mockProcessManager.start(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory')
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x64'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1167,11 +1228,11 @@ void main() { ...@@ -1167,11 +1228,11 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext('honors --no-android-gradle-daemon setting', () async { testUsingContext('honors --no-android-gradle-daemon setting', () async {
(globals.processManager as FakeProcessManager).addCommand( processManager.addCommand(
const FakeCommand(command: <String>[ const FakeCommand(command: <String>[
'/android/gradlew', '/android/gradlew',
'-q', '-q',
...@@ -1215,6 +1276,7 @@ void main() { ...@@ -1215,6 +1276,7 @@ void main() {
localGradleErrors: const <GradleHandledError>[], localGradleErrors: const <GradleHandledError>[],
); );
}, throwsToolExit()); }, throwsToolExit());
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1222,10 +1284,31 @@ void main() { ...@@ -1222,10 +1284,31 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[]), ProcessManager: () => processManager,
}); });
testUsingContext('build aar uses selected local engine,the engine abi is arm', () async { testUsingContext('build aar uses selected local engine with arm32 ABI', () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=2.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_arm',
'-Ptarget-platform=android-arm',
'assembleAarRelease'
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: TargetPlatform.android_arm, platform: TargetPlatform.android_arm,
...@@ -1274,13 +1357,6 @@ void main() { ...@@ -1274,13 +1357,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await builder.buildGradleAar( await builder.buildGradleAar(
...@@ -1291,25 +1367,12 @@ void main() { ...@@ -1291,25 +1367,12 @@ void main() {
buildNumber: '2.0', buildNumber: '2.0',
); );
final List<String> actualGradlewCall = verify(
mockProcessManager.run(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/.android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
expect(actualGradlewCall, contains('-PbuildNumber=2.0'));
expect(fileSystem.link( expect(fileSystem.link(
'build/outputs/repo/io/flutter/flutter_embedding_release/' 'build/outputs/repo/io/flutter/flutter_embedding_release/'
'1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/' '1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/'
'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom' 'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom'
), exists); ), exists);
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1317,11 +1380,31 @@ void main() { ...@@ -1317,11 +1380,31 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext( testUsingContext('build aar uses selected local engine with x64 ABI', () async {
'build aar uses selected local engine,the engine abi is arm64', () async { processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=2.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_arm64',
'-Ptarget-platform=android-arm64',
'assembleAarRelease'
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -1370,13 +1453,6 @@ void main() { ...@@ -1370,13 +1453,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await builder.buildGradleAar( await builder.buildGradleAar(
...@@ -1388,25 +1464,12 @@ void main() { ...@@ -1388,25 +1464,12 @@ void main() {
buildNumber: '2.0', buildNumber: '2.0',
); );
final List<String> actualGradlewCall = verify(
mockProcessManager.run(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/.android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_arm64'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
expect(actualGradlewCall, contains('-PbuildNumber=2.0'));
expect(fileSystem.link( expect(fileSystem.link(
'build/outputs/repo/io/flutter/flutter_embedding_release/' 'build/outputs/repo/io/flutter/flutter_embedding_release/'
'1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/' '1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/'
'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom' 'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom'
), exists); ), exists);
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1414,11 +1477,31 @@ void main() { ...@@ -1414,11 +1477,31 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext( testUsingContext('build aar uses selected local engine with x86 ABI', () async {
'build aar uses selected local engine,the engine abi is x86', () async { processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=2.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_x86',
'-Ptarget-platform=android-x86',
'assembleAarRelease'
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -1467,13 +1550,6 @@ void main() { ...@@ -1467,13 +1550,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await builder.buildGradleAar( await builder.buildGradleAar(
...@@ -1485,25 +1561,12 @@ void main() { ...@@ -1485,25 +1561,12 @@ void main() {
buildNumber: '2.0', buildNumber: '2.0',
); );
final List<String> actualGradlewCall = verify(
mockProcessManager.run(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/.android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x86'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
expect(actualGradlewCall, contains('-PbuildNumber=2.0'));
expect(fileSystem.link( expect(fileSystem.link(
'build/outputs/repo/io/flutter/flutter_embedding_release/' 'build/outputs/repo/io/flutter/flutter_embedding_release/'
'1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/' '1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/'
'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom' 'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom'
), exists); ), exists);
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1511,10 +1574,31 @@ void main() { ...@@ -1511,10 +1574,31 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
testUsingContext('build aar uses selected local engine,the engine abi is x64', () async { testUsingContext('build aar uses selected local engine on x64 ABI', () async {
processManager.addCommand(const FakeCommand(
command: <String>[
'/.android/gradlew',
'-I=/packages/flutter_tools/gradle/aar_init_script.gradle',
'-Pflutter-root=/',
'-Poutput-dir=build/',
'-Pis-plugin=false',
'-PbuildNumber=2.0',
'-q',
'-Pdart-obfuscation=false',
'-Ptrack-widget-creation=false',
'-Ptree-shake-icons=false',
'-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0',
'-Plocal-engine-build-mode=release',
'-Plocal-engine-out=out/android_x64',
'-Ptarget-platform=android-x64',
'assembleAarRelease'
],
exitCode: 0,
));
when(mockArtifacts.getArtifactPath( when(mockArtifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: anyNamed('platform'), platform: anyNamed('platform'),
...@@ -1563,13 +1647,6 @@ void main() { ...@@ -1563,13 +1647,6 @@ void main() {
fileSystem.file('.android/build.gradle') fileSystem.file('.android/build.gradle')
.createSync(recursive: true); .createSync(recursive: true);
// Let any process start. Assert after.
when(mockProcessManager.run(
any,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
)).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
fileSystem.directory('build/outputs/repo').createSync(recursive: true); fileSystem.directory('build/outputs/repo').createSync(recursive: true);
await builder.buildGradleAar( await builder.buildGradleAar(
...@@ -1581,25 +1658,12 @@ void main() { ...@@ -1581,25 +1658,12 @@ void main() {
buildNumber: '2.0', buildNumber: '2.0',
); );
final List<String> actualGradlewCall = verify(
mockProcessManager.run(
captureAny,
environment: anyNamed('environment'),
workingDirectory: anyNamed('workingDirectory'),
),
).captured.last as List<String>;
expect(actualGradlewCall, contains('/.android/gradlew'));
expect(actualGradlewCall, contains('-Plocal-engine-out=out/android_x64'));
expect(actualGradlewCall, contains('-Plocal-engine-repo=/.tmp_rand0/flutter_tool_local_engine_repo.rand0'));
expect(actualGradlewCall, contains('-Plocal-engine-build-mode=release'));
expect(actualGradlewCall, contains('-PbuildNumber=2.0'));
expect(fileSystem.link( expect(fileSystem.link(
'build/outputs/repo/io/flutter/flutter_embedding_release/' 'build/outputs/repo/io/flutter/flutter_embedding_release/'
'1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/' '1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b/'
'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom' 'flutter_embedding_release-1.0.0-73fd6b049a80bcea2db1f26c7cee434907cd188b.pom'
), exists); ), exists);
expect(processManager.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => mockAndroidSdk, AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio, AndroidStudio: () => mockAndroidStudio,
...@@ -1607,7 +1671,7 @@ void main() { ...@@ -1607,7 +1671,7 @@ void main() {
Cache: () => cache, Cache: () => cache,
Platform: () => android, Platform: () => android,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => mockProcessManager, ProcessManager: () => processManager,
}); });
}); });
} }
...@@ -1620,7 +1684,6 @@ FakePlatform fakePlatform(String name) { ...@@ -1620,7 +1684,6 @@ FakePlatform fakePlatform(String name) {
); );
} }
class MockProcessManager extends Mock implements ProcessManager {}
class MockAndroidSdk extends Mock implements AndroidSdk {} class MockAndroidSdk extends Mock implements AndroidSdk {}
class MockAndroidStudio extends Mock implements AndroidStudio {} class MockAndroidStudio extends Mock implements AndroidStudio {}
class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {} class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {}
...@@ -436,9 +436,11 @@ void main() { ...@@ -436,9 +436,11 @@ void main() {
group('Config files', () { group('Config files', () {
Directory tempDir; Directory tempDir;
FileSystem fileSystem;
setUp(() { setUp(() {
tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_settings_aar_test.'); fileSystem = MemoryFileSystem.test();
tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_settings_aar_test.');
}); });
testUsingContext('create settings_aar.gradle when current settings.gradle loads plugins', () { testUsingContext('create settings_aar.gradle when current settings.gradle loads plugins', () {
...@@ -468,25 +470,24 @@ include ':app' ...@@ -468,25 +470,24 @@ include ':app'
tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle); tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle);
final String toolGradlePath = globals.fs.path.join( final String toolGradlePath = fileSystem.path.join(
globals.fs.path.absolute(Cache.flutterRoot), fileSystem.path.absolute(Cache.flutterRoot),
'packages', 'packages',
'flutter_tools', 'flutter_tools',
'gradle'); 'gradle');
globals.fs.directory(toolGradlePath).createSync(recursive: true); fileSystem.directory(toolGradlePath).createSync(recursive: true);
globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings.gradle.legacy_versions')) fileSystem.file(fileSystem.path.join(toolGradlePath, 'settings.gradle.legacy_versions'))
.writeAsStringSync(currentSettingsGradle); .writeAsStringSync(currentSettingsGradle);
globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl')) fileSystem.file(fileSystem.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
.writeAsStringSync(settingsAarFile); .writeAsStringSync(settingsAarFile);
createSettingsAarGradle(tempDir, testLogger); createSettingsAarGradle(tempDir, testLogger);
expect(testLogger.statusText, contains('created successfully')); expect(testLogger.statusText, contains('created successfully'));
expect(tempDir.childFile('settings_aar.gradle').existsSync(), isTrue); expect(tempDir.childFile('settings_aar.gradle').existsSync(), isTrue);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem.test(), FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}); });
...@@ -501,25 +502,24 @@ include ':app' ...@@ -501,25 +502,24 @@ include ':app'
tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle); tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle);
final String toolGradlePath = globals.fs.path.join( final String toolGradlePath = fileSystem.path.join(
globals.fs.path.absolute(Cache.flutterRoot), fileSystem.path.absolute(Cache.flutterRoot),
'packages', 'packages',
'flutter_tools', 'flutter_tools',
'gradle'); 'gradle');
globals.fs.directory(toolGradlePath).createSync(recursive: true); fileSystem.directory(toolGradlePath).createSync(recursive: true);
globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings.gradle.legacy_versions')) fileSystem.file(fileSystem.path.join(toolGradlePath, 'settings.gradle.legacy_versions'))
.writeAsStringSync(currentSettingsGradle); .writeAsStringSync(currentSettingsGradle);
globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl')) fileSystem.file(fileSystem.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
.writeAsStringSync(settingsAarFile); .writeAsStringSync(settingsAarFile);
createSettingsAarGradle(tempDir, testLogger); createSettingsAarGradle(tempDir, testLogger);
expect(testLogger.statusText, contains('created successfully')); expect(testLogger.statusText, contains('created successfully'));
expect(tempDir.childFile('settings_aar.gradle').existsSync(), isTrue); expect(tempDir.childFile('settings_aar.gradle').existsSync(), isTrue);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => MemoryFileSystem.test(), FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.any(), ProcessManager: () => FakeProcessManager.any(),
}); });
}); });
...@@ -860,7 +860,7 @@ flutter: ...@@ -860,7 +860,7 @@ flutter:
fakeProcessManager = FakeProcessManager.list(<FakeCommand>[]); fakeProcessManager = FakeProcessManager.list(<FakeCommand>[]);
mockAndroidSdk = MockAndroidSdk(); mockAndroidSdk = MockAndroidSdk();
when(mockAndroidSdk.directory).thenReturn(fs.directory('irrelevant')); when(mockAndroidSdk.directory).thenReturn(fs.directory('irrelevant'));
builder = AndroidGradleBuilder(logger: logger); builder = AndroidGradleBuilder(logger: logger, processManager: fakeProcessManager, fileSystem: fs);
}); });
testUsingContext('calls gradle', () async { testUsingContext('calls gradle', () async {
......
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