2017-04-08 04:08:53 +00:00
|
|
|
// Copyright 2016 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/file.dart';
|
|
|
|
import 'package:file/memory.dart';
|
2019-07-18 22:29:06 +00:00
|
|
|
import 'package:file_testing/file_testing.dart';
|
2019-10-28 17:54:03 +00:00
|
|
|
import 'package:flutter_tools/src/base/platform.dart';
|
2019-07-18 22:29:06 +00:00
|
|
|
import 'package:meta/meta.dart';
|
2017-04-08 04:08:53 +00:00
|
|
|
import 'package:mockito/mockito.dart';
|
|
|
|
import 'package:platform/platform.dart';
|
2019-09-17 15:19:33 +00:00
|
|
|
import 'package:process/process.dart';
|
2017-04-08 04:08:53 +00:00
|
|
|
|
2019-09-17 15:19:33 +00:00
|
|
|
import 'package:flutter_tools/src/android/gradle.dart';
|
2019-07-30 19:16:32 +00:00
|
|
|
import 'package:flutter_tools/src/base/common.dart';
|
2019-09-17 15:19:33 +00:00
|
|
|
import 'package:flutter_tools/src/base/io.dart';
|
2017-04-08 04:08:53 +00:00
|
|
|
import 'package:flutter_tools/src/cache.dart';
|
2019-07-18 22:29:06 +00:00
|
|
|
import 'package:flutter_tools/src/base/file_system.dart';
|
2018-04-07 01:44:05 +00:00
|
|
|
import 'package:flutter_tools/src/base/io.dart' show InternetAddress, SocketException;
|
2019-07-18 22:29:06 +00:00
|
|
|
import 'package:flutter_tools/src/base/net.dart';
|
|
|
|
import 'package:flutter_tools/src/base/os.dart';
|
2017-04-08 04:08:53 +00:00
|
|
|
|
2019-07-13 18:51:44 +00:00
|
|
|
import '../src/common.dart';
|
|
|
|
import '../src/context.dart';
|
2019-07-18 22:29:06 +00:00
|
|
|
import '../src/testbed.dart';
|
2017-04-08 04:08:53 +00:00
|
|
|
|
|
|
|
void main() {
|
|
|
|
group('$Cache.checkLockAcquired', () {
|
2019-07-30 19:16:32 +00:00
|
|
|
MockFileSystem mockFileSystem;
|
|
|
|
MemoryFileSystem memoryFileSystem;
|
|
|
|
MockFile mockFile;
|
|
|
|
MockRandomAccessFile mockRandomAccessFile;
|
|
|
|
|
2017-04-08 04:08:53 +00:00
|
|
|
setUp(() {
|
2019-07-30 19:16:32 +00:00
|
|
|
mockFileSystem = MockFileSystem();
|
|
|
|
memoryFileSystem = MemoryFileSystem();
|
|
|
|
mockFile = MockFile();
|
|
|
|
mockRandomAccessFile = MockRandomAccessFile();
|
|
|
|
when(mockFileSystem.path).thenReturn(memoryFileSystem.path);
|
|
|
|
|
2017-04-08 04:08:53 +00:00
|
|
|
Cache.enableLocking();
|
|
|
|
});
|
|
|
|
|
|
|
|
tearDown(() {
|
|
|
|
// Restore locking to prevent potential side-effects in
|
|
|
|
// tests outside this group (this option is globally shared).
|
|
|
|
Cache.enableLocking();
|
2019-07-30 19:16:32 +00:00
|
|
|
Cache.releaseLockEarly();
|
2017-04-08 04:08:53 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
test('should throw when locking is not acquired', () {
|
|
|
|
expect(() => Cache.checkLockAcquired(), throwsStateError);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should not throw when locking is disabled', () {
|
|
|
|
Cache.disableLocking();
|
|
|
|
Cache.checkLockAcquired();
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('should not throw when lock is acquired', () async {
|
2019-07-30 19:16:32 +00:00
|
|
|
when(mockFileSystem.file(argThat(endsWith('lockfile')))).thenReturn(mockFile);
|
|
|
|
when(mockFile.openSync(mode: anyNamed('mode'))).thenReturn(mockRandomAccessFile);
|
2017-04-08 04:08:53 +00:00
|
|
|
await Cache.lock();
|
|
|
|
Cache.checkLockAcquired();
|
2019-07-30 19:16:32 +00:00
|
|
|
Cache.releaseLockEarly();
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
FileSystem: () => mockFileSystem,
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2019-07-30 19:16:32 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('throws tool exit when lockfile open fails', () async {
|
|
|
|
when(mockFileSystem.file(argThat(endsWith('lockfile')))).thenReturn(mockFile);
|
|
|
|
when(mockFile.openSync(mode: anyNamed('mode'))).thenThrow(const FileSystemException());
|
|
|
|
expect(() async => await Cache.lock(), throwsA(isA<ToolExit>()));
|
2017-04-08 04:08:53 +00:00
|
|
|
}, overrides: <Type, Generator>{
|
2019-07-30 19:16:32 +00:00
|
|
|
FileSystem: () => mockFileSystem,
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2017-04-08 04:08:53 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('should not throw when FLUTTER_ALREADY_LOCKED is set', () async {
|
|
|
|
Cache.checkLockAcquired();
|
|
|
|
}, overrides: <Type, Generator>{
|
2018-09-12 06:29:29 +00:00
|
|
|
Platform: () => FakePlatform()..environment = <String, String>{'FLUTTER_ALREADY_LOCKED': 'true'},
|
2017-04-08 04:08:53 +00:00
|
|
|
});
|
|
|
|
});
|
2017-09-29 00:37:34 +00:00
|
|
|
|
2017-06-26 10:47:43 +00:00
|
|
|
group('Cache', () {
|
2019-07-18 22:29:06 +00:00
|
|
|
MockCache mockCache;
|
|
|
|
MemoryFileSystem memoryFileSystem;
|
|
|
|
|
|
|
|
setUp(() {
|
|
|
|
mockCache = MockCache();
|
|
|
|
memoryFileSystem = MemoryFileSystem();
|
|
|
|
});
|
2019-01-09 02:34:58 +00:00
|
|
|
|
|
|
|
testUsingContext('Gradle wrapper should not be up to date, if some cached artifact is not available', () {
|
|
|
|
final GradleWrapper gradleWrapper = GradleWrapper(mockCache);
|
|
|
|
final Directory directory = fs.directory('/Applications/flutter/bin/cache');
|
|
|
|
directory.createSync(recursive: true);
|
|
|
|
fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
|
|
|
|
when(mockCache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(fs.directory(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
|
2019-03-08 21:31:51 +00:00
|
|
|
expect(gradleWrapper.isUpToDateInner(), false);
|
2019-01-09 02:34:58 +00:00
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: ()=> mockCache,
|
2019-07-18 22:29:06 +00:00
|
|
|
FileSystem: () => memoryFileSystem,
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2019-01-09 02:34:58 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('Gradle wrapper should be up to date, only if all cached artifact are available', () {
|
|
|
|
final GradleWrapper gradleWrapper = GradleWrapper(mockCache);
|
|
|
|
final Directory directory = fs.directory('/Applications/flutter/bin/cache');
|
|
|
|
directory.createSync(recursive: true);
|
|
|
|
fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
|
|
|
|
fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew')).createSync(recursive: true);
|
|
|
|
fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew.bat')).createSync(recursive: true);
|
|
|
|
|
|
|
|
when(mockCache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(fs.directory(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
|
2019-03-08 21:31:51 +00:00
|
|
|
expect(gradleWrapper.isUpToDateInner(), true);
|
2019-01-09 02:34:58 +00:00
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: ()=> mockCache,
|
2019-07-18 22:29:06 +00:00
|
|
|
FileSystem: () => memoryFileSystem,
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2019-01-09 02:34:58 +00:00
|
|
|
});
|
|
|
|
|
2017-06-26 10:47:43 +00:00
|
|
|
test('should not be up to date, if some cached artifact is not', () {
|
2018-09-12 06:29:29 +00:00
|
|
|
final CachedArtifact artifact1 = MockCachedArtifact();
|
|
|
|
final CachedArtifact artifact2 = MockCachedArtifact();
|
2019-03-26 17:01:22 +00:00
|
|
|
when(artifact1.isUpToDate()).thenReturn(true);
|
|
|
|
when(artifact2.isUpToDate()).thenReturn(false);
|
2018-09-12 06:29:29 +00:00
|
|
|
final Cache cache = Cache(artifacts: <CachedArtifact>[artifact1, artifact2]);
|
2019-03-26 17:01:22 +00:00
|
|
|
expect(cache.isUpToDate(), isFalse);
|
2017-06-26 10:47:43 +00:00
|
|
|
});
|
|
|
|
test('should be up to date, if all cached artifacts are', () {
|
2018-09-12 06:29:29 +00:00
|
|
|
final CachedArtifact artifact1 = MockCachedArtifact();
|
|
|
|
final CachedArtifact artifact2 = MockCachedArtifact();
|
2019-03-26 17:01:22 +00:00
|
|
|
when(artifact1.isUpToDate()).thenReturn(true);
|
|
|
|
when(artifact2.isUpToDate()).thenReturn(true);
|
2018-09-12 06:29:29 +00:00
|
|
|
final Cache cache = Cache(artifacts: <CachedArtifact>[artifact1, artifact2]);
|
2019-03-26 17:01:22 +00:00
|
|
|
expect(cache.isUpToDate(), isTrue);
|
2017-06-26 10:47:43 +00:00
|
|
|
});
|
|
|
|
test('should update cached artifacts which are not up to date', () async {
|
2018-09-12 06:29:29 +00:00
|
|
|
final CachedArtifact artifact1 = MockCachedArtifact();
|
|
|
|
final CachedArtifact artifact2 = MockCachedArtifact();
|
2019-03-26 17:01:22 +00:00
|
|
|
when(artifact1.isUpToDate()).thenReturn(true);
|
|
|
|
when(artifact2.isUpToDate()).thenReturn(false);
|
2018-09-12 06:29:29 +00:00
|
|
|
final Cache cache = Cache(artifacts: <CachedArtifact>[artifact1, artifact2]);
|
2019-09-17 15:19:33 +00:00
|
|
|
await cache.updateAll(<DevelopmentArtifact>{
|
|
|
|
null,
|
|
|
|
});
|
|
|
|
verifyNever(artifact1.update());
|
|
|
|
verify(artifact2.update());
|
2017-06-26 10:47:43 +00:00
|
|
|
});
|
2019-07-15 16:22:29 +00:00
|
|
|
testUsingContext('getter dyLdLibEntry concatenates the output of each artifact\'s dyLdLibEntry getter', () async {
|
2019-09-17 15:19:33 +00:00
|
|
|
final IosUsbArtifacts artifact1 = MockIosUsbArtifacts();
|
|
|
|
final IosUsbArtifacts artifact2 = MockIosUsbArtifacts();
|
|
|
|
final IosUsbArtifacts artifact3 = MockIosUsbArtifacts();
|
|
|
|
when(artifact1.environment)
|
|
|
|
.thenReturn(<String, String>{
|
|
|
|
'DYLD_LIBRARY_PATH': '/path/to/alpha:/path/to/beta',
|
|
|
|
});
|
|
|
|
when(artifact2.environment)
|
|
|
|
.thenReturn(<String, String>{
|
|
|
|
'DYLD_LIBRARY_PATH': '/path/to/gamma:/path/to/delta:/path/to/epsilon',
|
|
|
|
});
|
|
|
|
when(artifact3.environment)
|
|
|
|
.thenReturn(<String, String>{
|
|
|
|
'DYLD_LIBRARY_PATH': '',
|
|
|
|
});
|
2019-07-15 16:22:29 +00:00
|
|
|
final Cache cache = Cache(artifacts: <CachedArtifact>[artifact1, artifact2, artifact3]);
|
2019-09-17 15:19:33 +00:00
|
|
|
|
2019-07-15 16:22:29 +00:00
|
|
|
expect(cache.dyLdLibEntry.key, 'DYLD_LIBRARY_PATH');
|
|
|
|
expect(
|
|
|
|
cache.dyLdLibEntry.value,
|
|
|
|
'/path/to/alpha:/path/to/beta:/path/to/gamma:/path/to/delta:/path/to/epsilon',
|
|
|
|
);
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: ()=> mockCache,
|
|
|
|
});
|
2018-04-07 01:44:05 +00:00
|
|
|
testUsingContext('failed storage.googleapis.com download shows China warning', () async {
|
2018-09-12 06:29:29 +00:00
|
|
|
final CachedArtifact artifact1 = MockCachedArtifact();
|
|
|
|
final CachedArtifact artifact2 = MockCachedArtifact();
|
2019-03-26 17:01:22 +00:00
|
|
|
when(artifact1.isUpToDate()).thenReturn(false);
|
|
|
|
when(artifact2.isUpToDate()).thenReturn(false);
|
2018-09-12 06:29:29 +00:00
|
|
|
final MockInternetAddress address = MockInternetAddress();
|
2018-04-07 01:44:05 +00:00
|
|
|
when(address.host).thenReturn('storage.googleapis.com');
|
2019-09-17 15:19:33 +00:00
|
|
|
when(artifact1.update()).thenThrow(SocketException(
|
2018-04-07 01:44:05 +00:00
|
|
|
'Connection reset by peer',
|
|
|
|
address: address,
|
|
|
|
));
|
2018-09-12 06:29:29 +00:00
|
|
|
final Cache cache = Cache(artifacts: <CachedArtifact>[artifact1, artifact2]);
|
2018-04-07 01:44:05 +00:00
|
|
|
try {
|
2019-09-17 15:19:33 +00:00
|
|
|
await cache.updateAll(<DevelopmentArtifact>{
|
|
|
|
null,
|
|
|
|
});
|
2018-04-07 01:44:05 +00:00
|
|
|
fail('Mock thrown exception expected');
|
|
|
|
} catch (e) {
|
2019-09-17 15:19:33 +00:00
|
|
|
verify(artifact1.update());
|
2018-04-07 01:44:05 +00:00
|
|
|
// Don't continue when retrieval fails.
|
2019-09-17 15:19:33 +00:00
|
|
|
verifyNever(artifact2.update());
|
2018-04-07 01:44:05 +00:00
|
|
|
expect(
|
|
|
|
testLogger.errorText,
|
2019-04-05 18:39:30 +00:00
|
|
|
contains('https://flutter.dev/community/china'),
|
2018-04-07 01:44:05 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
2019-10-28 17:54:03 +00:00
|
|
|
|
|
|
|
testUsingContext('Invalid URI for FLUTTER_STORAGE_BASE_URL throws ToolExit', () async {
|
|
|
|
when(platform.environment).thenReturn(const <String, String>{
|
|
|
|
'FLUTTER_STORAGE_BASE_URL': ' http://foo',
|
|
|
|
});
|
|
|
|
final Cache cache = Cache();
|
|
|
|
final CachedArtifact artifact = MaterialFonts(cache);
|
|
|
|
|
|
|
|
expect(() => artifact.storageBaseUrl, throwsA(isInstanceOf<ToolExit>()));
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Platform: () => MockPlatform(),
|
|
|
|
});
|
2017-06-26 10:47:43 +00:00
|
|
|
});
|
2018-01-18 00:08:19 +00:00
|
|
|
|
|
|
|
testUsingContext('flattenNameSubdirs', () {
|
2019-04-05 18:39:30 +00:00
|
|
|
expect(flattenNameSubdirs(Uri.parse('http://flutter.dev/foo/bar')), 'flutter.dev/foo/bar');
|
2018-01-18 00:08:19 +00:00
|
|
|
expect(flattenNameSubdirs(Uri.parse('http://docs.flutter.io/foo/bar')), 'docs.flutter.io/foo/bar');
|
2019-04-05 18:39:30 +00:00
|
|
|
expect(flattenNameSubdirs(Uri.parse('https://www.flutter.dev')), 'www.flutter.dev');
|
2018-02-02 22:27:29 +00:00
|
|
|
}, overrides: <Type, Generator>{
|
2019-07-30 19:16:32 +00:00
|
|
|
FileSystem: () => MemoryFileSystem(),
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2018-01-18 00:08:19 +00:00
|
|
|
});
|
2019-07-18 22:29:06 +00:00
|
|
|
|
2019-07-29 23:13:47 +00:00
|
|
|
test('Unstable artifacts', () {
|
2019-10-09 23:27:39 +00:00
|
|
|
expect(DevelopmentArtifact.web.unstable, false);
|
2019-07-29 23:13:47 +00:00
|
|
|
expect(DevelopmentArtifact.linux.unstable, true);
|
|
|
|
expect(DevelopmentArtifact.macOS.unstable, true);
|
|
|
|
expect(DevelopmentArtifact.windows.unstable, true);
|
|
|
|
expect(DevelopmentArtifact.fuchsia.unstable, true);
|
|
|
|
expect(DevelopmentArtifact.flutterRunner.unstable, true);
|
|
|
|
});
|
|
|
|
|
2019-07-18 22:29:06 +00:00
|
|
|
group('EngineCachedArtifact', () {
|
|
|
|
FakeHttpClient fakeHttpClient;
|
|
|
|
FakePlatform fakePlatform;
|
|
|
|
MemoryFileSystem memoryFileSystem;
|
|
|
|
MockCache mockCache;
|
|
|
|
MockOperatingSystemUtils mockOperatingSystemUtils;
|
|
|
|
|
|
|
|
setUp(() {
|
|
|
|
fakeHttpClient = FakeHttpClient();
|
|
|
|
fakePlatform = FakePlatform()..environment = const <String, String>{};
|
|
|
|
memoryFileSystem = MemoryFileSystem();
|
|
|
|
mockCache = MockCache();
|
|
|
|
mockOperatingSystemUtils = MockOperatingSystemUtils();
|
|
|
|
when(mockOperatingSystemUtils.verifyZip(any)).thenReturn(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('makes binary dirs readable and executable by all', () async {
|
2019-10-07 23:43:04 +00:00
|
|
|
final Directory artifactDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_artifact.');
|
|
|
|
final Directory downloadDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_download.');
|
2019-07-18 22:29:06 +00:00
|
|
|
when(mockCache.getArtifactDirectory(any)).thenReturn(artifactDir);
|
|
|
|
when(mockCache.getDownloadDir()).thenReturn(downloadDir);
|
|
|
|
final FakeCachedArtifact artifact = FakeCachedArtifact(
|
|
|
|
cache: mockCache,
|
|
|
|
binaryDirs: <List<String>>[
|
|
|
|
<String>['bin_dir', 'unused_url_path'],
|
|
|
|
],
|
2019-09-17 15:19:33 +00:00
|
|
|
requiredArtifacts: DevelopmentArtifact.universal,
|
2019-07-18 22:29:06 +00:00
|
|
|
);
|
|
|
|
await artifact.updateInner();
|
|
|
|
final Directory dir = memoryFileSystem.systemTempDirectory
|
|
|
|
.listSync(recursive: true)
|
|
|
|
.whereType<Directory>()
|
|
|
|
.singleWhere((Directory directory) => directory.basename == 'bin_dir', orElse: () => null);
|
|
|
|
expect(dir, isNotNull);
|
|
|
|
expect(dir.path, artifactDir.childDirectory('bin_dir').path);
|
|
|
|
verify(mockOperatingSystemUtils.chmod(argThat(hasPath(dir.path)), 'a+r,a+x'));
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: ()=> mockCache,
|
|
|
|
FileSystem: () => memoryFileSystem,
|
2019-10-23 05:05:00 +00:00
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
2019-07-18 22:29:06 +00:00
|
|
|
HttpClientFactory: () => () => fakeHttpClient,
|
|
|
|
OperatingSystemUtils: () => mockOperatingSystemUtils,
|
|
|
|
Platform: () => fakePlatform,
|
|
|
|
});
|
|
|
|
});
|
2019-08-09 23:21:32 +00:00
|
|
|
|
2019-09-17 15:19:33 +00:00
|
|
|
group('AndroidMavenArtifacts', () {
|
|
|
|
MemoryFileSystem memoryFileSystem;
|
|
|
|
MockProcessManager processManager;
|
|
|
|
MockCache mockCache;
|
|
|
|
|
|
|
|
setUp(() {
|
|
|
|
memoryFileSystem = MemoryFileSystem();
|
|
|
|
processManager = MockProcessManager();
|
|
|
|
mockCache = MockCache();
|
|
|
|
});
|
|
|
|
|
|
|
|
test('development artifact', () async {
|
|
|
|
final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts();
|
|
|
|
expect(mavenArtifacts.developmentArtifact, DevelopmentArtifact.androidMaven);
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('update', () async {
|
|
|
|
final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts();
|
|
|
|
expect(mavenArtifacts.isUpToDate(), isFalse);
|
|
|
|
|
2019-10-07 23:43:04 +00:00
|
|
|
final Directory gradleWrapperDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_gradle_wrapper.');
|
2019-09-17 15:19:33 +00:00
|
|
|
when(mockCache.getArtifactDirectory('gradle_wrapper')).thenReturn(gradleWrapperDir);
|
|
|
|
|
|
|
|
fs.directory(gradleWrapperDir.childDirectory('gradle').childDirectory('wrapper'))
|
|
|
|
.createSync(recursive: true);
|
|
|
|
fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew')).writeAsStringSync('irrelevant');
|
|
|
|
fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew.bat')).writeAsStringSync('irrelevant');
|
|
|
|
|
|
|
|
when(processManager.run(any, environment: captureAnyNamed('environment')))
|
|
|
|
.thenAnswer((Invocation invocation) {
|
|
|
|
final List<String> args = invocation.positionalArguments[0];
|
|
|
|
expect(args.length, 6);
|
|
|
|
expect(args[1], '-b');
|
|
|
|
expect(args[2].endsWith('resolve_dependencies.gradle'), isTrue);
|
|
|
|
expect(args[5], 'resolveDependencies');
|
|
|
|
expect(invocation.namedArguments[#environment], gradleEnv);
|
|
|
|
return Future<ProcessResult>.value(ProcessResult(0, 0, '', ''));
|
|
|
|
});
|
|
|
|
|
|
|
|
await mavenArtifacts.update();
|
|
|
|
|
|
|
|
expect(mavenArtifacts.isUpToDate(), isFalse);
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: ()=> mockCache,
|
|
|
|
FileSystem: () => memoryFileSystem,
|
|
|
|
ProcessManager: () => processManager,
|
|
|
|
});
|
2019-08-09 23:21:32 +00:00
|
|
|
});
|
2019-10-10 05:24:15 +00:00
|
|
|
|
2019-10-30 04:35:51 +00:00
|
|
|
group('macOS artifacts', () {
|
2019-10-10 05:24:15 +00:00
|
|
|
MockCache mockCache;
|
|
|
|
|
|
|
|
setUp(() {
|
|
|
|
mockCache = MockCache();
|
|
|
|
});
|
|
|
|
|
2019-10-30 04:35:51 +00:00
|
|
|
testUsingContext('verifies executables for libimobiledevice in isUpToDateInner', () async {
|
|
|
|
final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('libimobiledevice', mockCache);
|
|
|
|
when(mockCache.getArtifactDirectory(any)).thenReturn(fs.currentDirectory);
|
|
|
|
iosUsbArtifacts.location.createSync();
|
|
|
|
final File ideviceIdFile = iosUsbArtifacts.location.childFile('idevice_id')
|
|
|
|
..createSync();
|
|
|
|
iosUsbArtifacts.location.childFile('ideviceinfo')
|
|
|
|
..createSync();
|
|
|
|
|
|
|
|
expect(iosUsbArtifacts.isUpToDateInner(), true);
|
|
|
|
|
|
|
|
ideviceIdFile.deleteSync();
|
|
|
|
|
|
|
|
expect(iosUsbArtifacts.isUpToDateInner(), false);
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: () => mockCache,
|
|
|
|
FileSystem: () => MemoryFileSystem(),
|
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('Does not verify executables for openssl in isUpToDateInner', () async {
|
|
|
|
final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('openssl', mockCache);
|
|
|
|
when(mockCache.getArtifactDirectory(any)).thenReturn(fs.currentDirectory);
|
|
|
|
iosUsbArtifacts.location.createSync();
|
|
|
|
|
|
|
|
expect(iosUsbArtifacts.isUpToDateInner(), true);
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: () => mockCache,
|
|
|
|
FileSystem: () => MemoryFileSystem(),
|
|
|
|
ProcessManager: () => FakeProcessManager.any(),
|
|
|
|
});
|
|
|
|
|
2019-10-10 05:24:15 +00:00
|
|
|
testUsingContext('use unsigned when specified', () async {
|
|
|
|
when(mockCache.useUnsignedMacBinaries).thenReturn(true);
|
|
|
|
|
|
|
|
final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('name', mockCache);
|
|
|
|
expect(iosUsbArtifacts.archiveUri.toString(), contains('/unsigned/'));
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: () => mockCache,
|
|
|
|
});
|
|
|
|
|
|
|
|
testUsingContext('not use unsigned when not specified', () async {
|
|
|
|
when(mockCache.useUnsignedMacBinaries).thenReturn(false);
|
|
|
|
|
|
|
|
final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('name', mockCache);
|
|
|
|
expect(iosUsbArtifacts.archiveUri.toString(), isNot(contains('/unsigned/')));
|
|
|
|
}, overrides: <Type, Generator>{
|
|
|
|
Cache: () => mockCache,
|
|
|
|
});
|
|
|
|
});
|
2019-07-18 22:29:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class FakeCachedArtifact extends EngineCachedArtifact {
|
|
|
|
FakeCachedArtifact({
|
|
|
|
String stampName = 'STAMP',
|
|
|
|
@required Cache cache,
|
2019-09-17 15:19:33 +00:00
|
|
|
DevelopmentArtifact requiredArtifacts,
|
2019-07-18 22:29:06 +00:00
|
|
|
this.binaryDirs = const <List<String>>[],
|
|
|
|
this.licenseDirs = const <String>[],
|
|
|
|
this.packageDirs = const <String>[],
|
|
|
|
}) : super(stampName, cache, requiredArtifacts);
|
|
|
|
|
|
|
|
final List<List<String>> binaryDirs;
|
|
|
|
final List<String> licenseDirs;
|
|
|
|
final List<String> packageDirs;
|
|
|
|
|
|
|
|
@override
|
|
|
|
List<List<String>> getBinaryDirs() => binaryDirs;
|
|
|
|
|
|
|
|
@override
|
|
|
|
List<String> getLicenseDirs() => licenseDirs;
|
|
|
|
|
|
|
|
@override
|
|
|
|
List<String> getPackageDirs() => packageDirs;
|
2017-04-08 04:08:53 +00:00
|
|
|
}
|
|
|
|
|
2019-09-17 15:19:33 +00:00
|
|
|
class MockProcessManager extends Mock implements ProcessManager {}
|
2019-07-30 19:16:32 +00:00
|
|
|
class MockFileSystem extends Mock implements FileSystem {}
|
|
|
|
class MockFile extends Mock implements File {}
|
2019-08-09 23:21:32 +00:00
|
|
|
class MockDirectory extends Mock implements Directory {}
|
2017-04-08 04:08:53 +00:00
|
|
|
|
|
|
|
class MockRandomAccessFile extends Mock implements RandomAccessFile {}
|
2017-06-26 10:47:43 +00:00
|
|
|
class MockCachedArtifact extends Mock implements CachedArtifact {}
|
2019-09-17 15:19:33 +00:00
|
|
|
class MockIosUsbArtifacts extends Mock implements IosUsbArtifacts {}
|
2018-04-07 01:44:05 +00:00
|
|
|
class MockInternetAddress extends Mock implements InternetAddress {}
|
2019-03-06 08:37:32 +00:00
|
|
|
class MockCache extends Mock implements Cache {}
|
2019-07-18 22:29:06 +00:00
|
|
|
class MockOperatingSystemUtils extends Mock implements OperatingSystemUtils {}
|
2019-10-28 17:54:03 +00:00
|
|
|
class MockPlatform extends Mock implements Platform {}
|