Skip to content

Commit bf4a548

Browse files
[flutter_tools] no-op maven artifacts if Android SDK is absent (flutter#73957)
1 parent f1718bc commit bf4a548

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

packages/flutter_tools/lib/src/cache.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,8 @@ class AndroidGenSnapshotArtifacts extends EngineCachedArtifact {
11361136
}
11371137

11381138
/// A cached artifact containing the Maven dependencies used to build Android projects.
1139+
///
1140+
/// This is a no-op if the android SDK is not available.
11391141
class AndroidMavenArtifacts extends ArtifactSet {
11401142
AndroidMavenArtifacts(this.cache, {
11411143
@required Platform platform,
@@ -1152,6 +1154,9 @@ class AndroidMavenArtifacts extends ArtifactSet {
11521154
FileSystem fileSystem,
11531155
OperatingSystemUtils operatingSystemUtils,
11541156
) async {
1157+
if (globals.androidSdk == null) {
1158+
return;
1159+
}
11551160
final Directory tempDir = cache.getRoot().createTempSync(
11561161
'flutter_gradle_wrapper.',
11571162
);

packages/flutter_tools/test/general.shard/cache_test.dart

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'package:file/file.dart';
66
import 'package:file/memory.dart';
77
import 'package:file_testing/file_testing.dart';
8-
import 'package:flutter_tools/src/android/gradle_utils.dart';
8+
import 'package:flutter_tools/src/android/android_sdk.dart';
99
import 'package:flutter_tools/src/base/file_system.dart';
1010
import 'package:flutter_tools/src/base/io.dart' show InternetAddress, SocketException;
1111
import 'package:flutter_tools/src/base/io.dart';
@@ -653,49 +653,61 @@ void main() {
653653

654654
group('AndroidMavenArtifacts', () {
655655
MemoryFileSystem memoryFileSystem;
656-
MockProcessManager processManager;
657656
Cache cache;
658657

659658
setUp(() {
660659
memoryFileSystem = MemoryFileSystem.test();
661-
processManager = MockProcessManager();
662660
cache = Cache.test(
663661
fileSystem: memoryFileSystem,
664662
processManager: FakeProcessManager.any(),
665663
);
666664
});
667665

668-
testWithoutContext('development artifact', () async {
666+
testWithoutContext('AndroidMavenArtifacts has a specified development artifact', () async {
669667
final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts(cache, platform: FakePlatform(operatingSystem: 'linux'));
670668
expect(mavenArtifacts.developmentArtifact, DevelopmentArtifact.androidMaven);
671669
});
672670

673-
testUsingContext('update', () async {
671+
testUsingContext('AndroidMavenArtifacts can invoke Gradle resolve dependencies if Android SDK is present', () async {
672+
Cache.flutterRoot = '';
674673
final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts(cache, platform: FakePlatform(operatingSystem: 'linux'));
675674
expect(await mavenArtifacts.isUpToDate(memoryFileSystem), isFalse);
676675

677676
final Directory gradleWrapperDir = cache.getArtifactDirectory('gradle_wrapper')..createSync(recursive: true);
678677
gradleWrapperDir.childFile('gradlew').writeAsStringSync('irrelevant');
679678
gradleWrapperDir.childFile('gradlew.bat').writeAsStringSync('irrelevant');
680679

681-
when(processManager.run(any, environment: captureAnyNamed('environment')))
682-
.thenAnswer((Invocation invocation) {
683-
final List<String> args = invocation.positionalArguments[0] as List<String>;
684-
expect(args.length, 6);
685-
expect(args[1], '-b');
686-
expect(args[2].endsWith('resolve_dependencies.gradle'), isTrue);
687-
expect(args[5], 'resolveDependencies');
688-
expect(invocation.namedArguments[#environment], gradleEnvironment);
689-
return Future<ProcessResult>.value(ProcessResult(0, 0, '', ''));
690-
});
680+
await mavenArtifacts.update(MockArtifactUpdater(), BufferLogger.test(), memoryFileSystem, MockOperatingSystemUtils());
681+
682+
expect(await mavenArtifacts.isUpToDate(memoryFileSystem), isFalse);
683+
}, overrides: <Type, Generator>{
684+
Cache: () => cache,
685+
FileSystem: () => memoryFileSystem,
686+
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
687+
const FakeCommand(command: <String>[
688+
'/cache/bin/cache/flutter_gradle_wrapper.rand0/gradlew',
689+
'-b',
690+
'packages/flutter_tools/gradle/resolve_dependencies.gradle',
691+
'--project-cache-dir',
692+
'cache/bin/cache/flutter_gradle_wrapper.rand0',
693+
'resolveDependencies',
694+
])
695+
]),
696+
AndroidSdk: () => FakeAndroidSdk()
697+
});
698+
699+
testUsingContext('AndroidMavenArtifacts is a no-op if the Android SDK is absent', () async {
700+
final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts(cache, platform: FakePlatform(operatingSystem: 'linux'));
701+
expect(await mavenArtifacts.isUpToDate(memoryFileSystem), isFalse);
691702

692703
await mavenArtifacts.update(MockArtifactUpdater(), BufferLogger.test(), memoryFileSystem, MockOperatingSystemUtils());
693704

694705
expect(await mavenArtifacts.isUpToDate(memoryFileSystem), isFalse);
695706
}, overrides: <Type, Generator>{
696707
Cache: () => cache,
697708
FileSystem: () => memoryFileSystem,
698-
ProcessManager: () => processManager,
709+
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[]),
710+
AndroidSdk: () => null // Android SDK was not located.
699711
});
700712
});
701713
}
@@ -782,3 +794,4 @@ class FakeCache extends Cache {
782794
return stampFile;
783795
}
784796
}
797+
class FakeAndroidSdk extends Fake implements AndroidSdk {}

0 commit comments

Comments
 (0)