Unverified Commit 74478d18 authored by Chris Bracken's avatar Chris Bracken Committed by GitHub

Extract MockAndroidSdk and static utility method (#14258)

AndroidSdk and AndroidStudio depends relatively heavily on filesystem
access to locate installed tools. Testing code that relies on either of
these classes benefits from a utility method to generate a
legitimate-looking Android SDK directory layout for testing.
parent 1058cff3
......@@ -14,6 +14,7 @@ import 'package:test/test.dart';
import '../src/common.dart';
import '../src/context.dart';
import '../src/mocks.dart';
class MockProcessManager extends Mock implements ProcessManager {}
......@@ -35,7 +36,7 @@ void main() {
});
testUsingContext('parse sdk', () {
sdkDir = _createSdkDirectory();
sdkDir = MockAndroidSdk.createSdkDirectory();
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -46,7 +47,7 @@ void main() {
});
testUsingContext('parse sdk N', () {
sdkDir = _createSdkDirectory(withAndroidN: true);
sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -57,7 +58,7 @@ void main() {
});
testUsingContext('returns sdkmanager path', () {
sdkDir = _createSdkDirectory();
sdkDir = MockAndroidSdk.createSdkDirectory();
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -67,7 +68,7 @@ void main() {
});
testUsingContext('returns sdkmanager version', () {
sdkDir = _createSdkDirectory();
sdkDir = MockAndroidSdk.createSdkDirectory();
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -81,7 +82,7 @@ void main() {
});
testUsingContext('throws on sdkmanager version check failure', () {
sdkDir = _createSdkDirectory();
sdkDir = MockAndroidSdk.createSdkDirectory();
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -95,7 +96,7 @@ void main() {
});
testUsingContext('throws on sdkmanager version check if sdkmanager not found', () {
sdkDir = _createSdkDirectory(withSdkManager: false);
sdkDir = MockAndroidSdk.createSdkDirectory(withSdkManager: false);
Config.instance.setValue('android-sdk', sdkDir.path);
final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
......@@ -112,7 +113,7 @@ void main() {
'macos': 'darwin-x86_64',
}.forEach((String os, String osDir) {
testUsingContext('detection on $os', () {
sdkDir = _createSdkDirectory(
sdkDir = MockAndroidSdk.createSdkDirectory(
withAndroidN: true, withNdkDir: osDir, withNdkSysroot: true);
Config.instance.setValue('android-sdk', sdkDir.path);
......@@ -142,7 +143,7 @@ void main() {
for (String os in <String>['linux', 'macos']) {
testUsingContext('detection on $os (no ndk available)', () {
sdkDir = _createSdkDirectory(withAndroidN: true);
sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
Config.instance.setValue('android-sdk', sdkDir.path);
final String realSdkDir = sdkDir.path;
......@@ -159,68 +160,3 @@ void main() {
});
});
}
Directory _createSdkDirectory({
bool withAndroidN: false,
String withNdkDir,
bool withNdkSysroot: false,
bool withSdkManager: true,
}) {
final Directory dir = fs.systemTempDirectory.createTempSync('android-sdk');
_createSdkFile(dir, 'platform-tools/adb');
_createSdkFile(dir, 'build-tools/19.1.0/aapt');
_createSdkFile(dir, 'build-tools/22.0.1/aapt');
_createSdkFile(dir, 'build-tools/23.0.2/aapt');
if (withAndroidN)
_createSdkFile(dir, 'build-tools/24.0.0-preview/aapt');
_createSdkFile(dir, 'platforms/android-22/android.jar');
_createSdkFile(dir, 'platforms/android-23/android.jar');
if (withAndroidN) {
_createSdkFile(dir, 'platforms/android-N/android.jar');
_createSdkFile(dir, 'platforms/android-N/build.prop', contents: _buildProp);
}
if (withSdkManager)
_createSdkFile(dir, 'tools/bin/sdkmanager');
if (withNdkDir != null) {
final String ndkCompiler = fs.path.join(
'ndk-bundle',
'toolchains',
'arm-linux-androideabi-4.9',
'prebuilt',
withNdkDir,
'bin',
'arm-linux-androideabi-gcc');
_createSdkFile(dir, ndkCompiler);
}
if (withNdkSysroot) {
final String armPlatform =
fs.path.join('ndk-bundle', 'platforms', 'android-9', 'arch-arm');
_createDir(dir, armPlatform);
}
return dir;
}
void _createSdkFile(Directory dir, String filePath, { String contents }) {
final File file = dir.childFile(filePath);
file.createSync(recursive: true);
if (contents != null) {
file.writeAsStringSync(contents, flush: true);
}
}
void _createDir(Directory dir, String path) {
final Directory directory = fs.directory(fs.path.join(dir.path, path));
directory.createSync(recursive: true);
}
const String _buildProp = r'''
ro.build.version.incremental=1624448
ro.build.version.sdk=24
ro.build.version.codename=REL
''';
......@@ -7,7 +7,9 @@ import 'dart:convert';
import 'dart:io' as io show IOSink;
import 'package:flutter_tools/src/android/android_device.dart';
import 'package:flutter_tools/src/android/android_sdk.dart' show AndroidSdk;
import 'package:flutter_tools/src/application_package.dart';
import 'package:flutter_tools/src/base/file_system.dart' hide IOSink;
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/devfs.dart';
......@@ -33,6 +35,74 @@ class MockApplicationPackageStore extends ApplicationPackageStore {
);
}
/// An SDK installation with several SDK levels (19, 22, 23).
class MockAndroidSdk extends Mock implements AndroidSdk {
static Directory createSdkDirectory({
bool withAndroidN: false,
String withNdkDir,
bool withNdkSysroot: false,
bool withSdkManager: true,
}) {
final Directory dir = fs.systemTempDirectory.createTempSync('android-sdk');
_createSdkFile(dir, 'platform-tools/adb');
_createSdkFile(dir, 'build-tools/19.1.0/aapt');
_createSdkFile(dir, 'build-tools/22.0.1/aapt');
_createSdkFile(dir, 'build-tools/23.0.2/aapt');
if (withAndroidN)
_createSdkFile(dir, 'build-tools/24.0.0-preview/aapt');
_createSdkFile(dir, 'platforms/android-22/android.jar');
_createSdkFile(dir, 'platforms/android-23/android.jar');
if (withAndroidN) {
_createSdkFile(dir, 'platforms/android-N/android.jar');
_createSdkFile(dir, 'platforms/android-N/build.prop', contents: _buildProp);
}
if (withSdkManager)
_createSdkFile(dir, 'tools/bin/sdkmanager');
if (withNdkDir != null) {
final String ndkCompiler = fs.path.join(
'ndk-bundle',
'toolchains',
'arm-linux-androideabi-4.9',
'prebuilt',
withNdkDir,
'bin',
'arm-linux-androideabi-gcc');
_createSdkFile(dir, ndkCompiler);
}
if (withNdkSysroot) {
final String armPlatform =
fs.path.join('ndk-bundle', 'platforms', 'android-9', 'arch-arm');
_createDir(dir, armPlatform);
}
return dir;
}
static void _createSdkFile(Directory dir, String filePath, { String contents }) {
final File file = dir.childFile(filePath);
file.createSync(recursive: true);
if (contents != null) {
file.writeAsStringSync(contents, flush: true);
}
}
static void _createDir(Directory dir, String path) {
final Directory directory = fs.directory(fs.path.join(dir.path, path));
directory.createSync(recursive: true);
}
static const String _buildProp = r'''
ro.build.version.incremental=1624448
ro.build.version.sdk=24
ro.build.version.codename=REL
''';
}
/// A strategy for creating Process objects from a list of commands.
typedef Process ProcessFactory(List<String> command);
......
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