// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:file/memory.dart'; import 'package:flutter_tools/src/android/gradle_utils.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; void main() { group('injectGradleWrapperIfNeeded', () { MemoryFileSystem memoryFileSystem; Directory tempDir; Directory gradleWrapperDirectory; setUp(() { memoryFileSystem = MemoryFileSystem(); tempDir = memoryFileSystem.systemTempDirectory.createTempSync('flutter_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-5.6.2-all.zip\n'); }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, ProcessManager: () => FakeProcessManager.any(), }); 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-5.6.2-all.zip\n'); }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, ProcessManager: () => FakeProcessManager.any(), }); 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: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, ProcessManager: () => FakeProcessManager.any(), OperatingSystemUtils: () => OperatingSystemUtils(), }); }); }