Add missing files in the Gradle wrapper directory (#39145)
diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
index b33bbc0..313055f 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
@@ -13,6 +13,7 @@
import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/base/os.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart';
@@ -848,6 +849,125 @@
});
});
+ group('injectGradleWrapperIfNeeded', () {
+ MemoryFileSystem memoryFileSystem;
+ Directory tempDir;
+ Directory gradleWrapperDirectory;
+
+ setUp(() {
+ memoryFileSystem = MemoryFileSystem();
+ tempDir = memoryFileSystem.systemTempDirectory.createTempSync('artifacts_test.');
+ gradleWrapperDirectory = memoryFileSystem.directory(
+ memoryFileSystem.path.join(tempDir.path, 'bin', 'cache', 'artifacts', 'gradle_wrapper'));
+ gradleWrapperDirectory.createSync(recursive: true);
+ gradleWrapperDirectory
+ .childFile('gradlew')
+ .writeAsStringSync('irrelevant');
+ gradleWrapperDirectory
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .createSync(recursive: true);
+ gradleWrapperDirectory
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.jar')
+ .writeAsStringSync('irrelevant');
+ });
+
+ testUsingContext('Inject the wrapper when all files are missing', () {
+ final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+ sampleAppAndroid.createSync(recursive: true);
+
+ injectGradleWrapperIfNeeded(sampleAppAndroid);
+
+ expect(sampleAppAndroid.childFile('gradlew').existsSync(), isTrue);
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.jar')
+ .existsSync(), isTrue);
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.properties')
+ .existsSync(), isTrue);
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.properties')
+ .readAsStringSync(),
+ 'distributionBase=GRADLE_USER_HOME\n'
+ 'distributionPath=wrapper/dists\n'
+ 'zipStoreBase=GRADLE_USER_HOME\n'
+ 'zipStorePath=wrapper/dists\n'
+ 'distributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.2-all.zip\n');
+ }, overrides: <Type, Generator>{
+ Cache: () => Cache(rootOverride: tempDir),
+ FileSystem: () => memoryFileSystem,
+ });
+
+ testUsingContext('Inject the wrapper when some files are missing', () {
+ final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+ sampleAppAndroid.createSync(recursive: true);
+
+ // There's an existing gradlew
+ sampleAppAndroid.childFile('gradlew').writeAsStringSync('existing gradlew');
+
+ injectGradleWrapperIfNeeded(sampleAppAndroid);
+
+ expect(sampleAppAndroid.childFile('gradlew').existsSync(), isTrue);
+ expect(sampleAppAndroid.childFile('gradlew').readAsStringSync(),
+ equals('existing gradlew'));
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.jar')
+ .existsSync(), isTrue);
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.properties')
+ .existsSync(), isTrue);
+
+ expect(sampleAppAndroid
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.properties')
+ .readAsStringSync(),
+ 'distributionBase=GRADLE_USER_HOME\n'
+ 'distributionPath=wrapper/dists\n'
+ 'zipStoreBase=GRADLE_USER_HOME\n'
+ 'zipStorePath=wrapper/dists\n'
+ 'distributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.2-all.zip\n');
+ }, overrides: <Type, Generator>{
+ Cache: () => Cache(rootOverride: tempDir),
+ FileSystem: () => memoryFileSystem,
+ });
+
+ testUsingContext('Gives executable permission to gradle', () {
+ final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+ sampleAppAndroid.createSync(recursive: true);
+
+ // Make gradlew in the wrapper executable.
+ os.makeExecutable(gradleWrapperDirectory.childFile('gradlew'));
+
+ injectGradleWrapperIfNeeded(sampleAppAndroid);
+
+ final File gradlew = sampleAppAndroid.childFile('gradlew');
+ expect(gradlew.existsSync(), isTrue);
+ expect(gradlew.statSync().modeString().contains('x'), isTrue);
+ }, overrides: <Type, Generator>{
+ Cache: () => Cache(rootOverride: tempDir),
+ FileSystem: () => memoryFileSystem,
+ OperatingSystemUtils: () => OperatingSystemUtils(),
+ });
+ });
+
group('gradle build', () {
MockAndroidSdk mockAndroidSdk;
MockAndroidStudio mockAndroidStudio;
@@ -855,6 +975,7 @@
MockProcessManager mockProcessManager;
FakePlatform android;
FileSystem fs;
+ Cache cache;
setUp(() {
fs = MemoryFileSystem();
@@ -863,6 +984,28 @@
mockArtifacts = MockLocalEngineArtifacts();
mockProcessManager = MockProcessManager();
android = fakePlatform('android');
+
+ final Directory tempDir = fs.systemTempDirectory.createTempSync('artifacts_test.');
+ cache = Cache(rootOverride: tempDir);
+
+ final Directory gradleWrapperDirectory = tempDir
+ .childDirectory('bin')
+ .childDirectory('cache')
+ .childDirectory('artifacts')
+ .childDirectory('gradle_wrapper');
+ gradleWrapperDirectory.createSync(recursive: true);
+ gradleWrapperDirectory
+ .childFile('gradlew')
+ .writeAsStringSync('irrelevant');
+ gradleWrapperDirectory
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .createSync(recursive: true);
+ gradleWrapperDirectory
+ .childDirectory('gradle')
+ .childDirectory('wrapper')
+ .childFile('gradle-wrapper.jar')
+ .writeAsStringSync('irrelevant');
});
testUsingContext('build aar uses selected local engine', () async {
@@ -928,6 +1071,7 @@
AndroidSdk: () => mockAndroidSdk,
AndroidStudio: () => mockAndroidStudio,
Artifacts: () => mockArtifacts,
+ Cache: () => cache,
ProcessManager: () => mockProcessManager,
Platform: () => android,
FileSystem: () => fs,