Move android_plugin_example_app_build_test from devicelab to tool integration tests (#74685)
This commit is contained in:
parent
47f8e956d3
commit
754bc4a594
@ -1,157 +0,0 @@
|
|||||||
// Copyright 2014 The Flutter 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 'dart:io';
|
|
||||||
|
|
||||||
import 'package:flutter_devicelab/framework/framework.dart';
|
|
||||||
import 'package:flutter_devicelab/framework/task_result.dart';
|
|
||||||
import 'package:flutter_devicelab/framework/utils.dart';
|
|
||||||
import 'package:path/path.dart' as path;
|
|
||||||
|
|
||||||
final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
|
|
||||||
final String gradlewExecutable = Platform.isWindows ? '.\\$gradlew' : './$gradlew';
|
|
||||||
|
|
||||||
/// Tests that a plugin example app can be built using the current Flutter Gradle plugin.
|
|
||||||
Future<void> main() async {
|
|
||||||
await task(() async {
|
|
||||||
section('Find Java');
|
|
||||||
|
|
||||||
final String javaHome = await findJavaHome();
|
|
||||||
if (javaHome == null) {
|
|
||||||
return TaskResult.failure('Could not find Java');
|
|
||||||
}
|
|
||||||
|
|
||||||
print('\nUsing JAVA_HOME=$javaHome');
|
|
||||||
|
|
||||||
section('Create Flutter plugin project');
|
|
||||||
|
|
||||||
await flutter(
|
|
||||||
'precache',
|
|
||||||
options: <String>['--android', '--no-ios'],
|
|
||||||
);
|
|
||||||
|
|
||||||
final Directory tempDir =
|
|
||||||
Directory.systemTemp.createTempSync('flutter_plugin_test.');
|
|
||||||
final Directory projectDir =
|
|
||||||
Directory(path.join(tempDir.path, 'plugin_test'));
|
|
||||||
try {
|
|
||||||
await inDirectory(tempDir, () async {
|
|
||||||
await flutter(
|
|
||||||
'create',
|
|
||||||
options: <String>[
|
|
||||||
'--template=plugin',
|
|
||||||
'--platforms=android',
|
|
||||||
'plugin_test',
|
|
||||||
],
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
final Directory exampleAppDir =
|
|
||||||
Directory(path.join(projectDir.path, 'example'));
|
|
||||||
if (!exists(exampleAppDir)) {
|
|
||||||
return TaskResult.failure('Example app directory doesn\'t exist');
|
|
||||||
}
|
|
||||||
|
|
||||||
final File buildGradleFile =
|
|
||||||
File(path.join(exampleAppDir.path, 'android', 'build.gradle'));
|
|
||||||
|
|
||||||
if (!exists(buildGradleFile)) {
|
|
||||||
return TaskResult.failure('$buildGradleFile doesn\'t exist');
|
|
||||||
}
|
|
||||||
|
|
||||||
final String buildGradle = buildGradleFile.readAsStringSync();
|
|
||||||
final RegExp androidPluginRegExp =
|
|
||||||
RegExp(r'com\.android\.tools\.build:gradle:(\d+\.\d+\.\d+)');
|
|
||||||
|
|
||||||
section('Use AGP 4.1.0');
|
|
||||||
|
|
||||||
String newBuildGradle = buildGradle.replaceAll(
|
|
||||||
androidPluginRegExp, 'com.android.tools.build:gradle:4.1.0');
|
|
||||||
print(newBuildGradle);
|
|
||||||
buildGradleFile.writeAsString(newBuildGradle);
|
|
||||||
|
|
||||||
section('Run flutter build apk using AGP 4.1.0');
|
|
||||||
|
|
||||||
await inDirectory(exampleAppDir, () async {
|
|
||||||
await flutter(
|
|
||||||
'build',
|
|
||||||
options: <String>[
|
|
||||||
'apk',
|
|
||||||
'--target-platform=android-arm',
|
|
||||||
],
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
final String exampleApk = path.join(
|
|
||||||
exampleAppDir.path,
|
|
||||||
'build',
|
|
||||||
'app',
|
|
||||||
'outputs',
|
|
||||||
'flutter-apk',
|
|
||||||
'app-release.apk',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!exists(File(exampleApk))) {
|
|
||||||
return TaskResult.failure('Failed to build app-release.apk');
|
|
||||||
}
|
|
||||||
|
|
||||||
section('Clean');
|
|
||||||
|
|
||||||
await inDirectory(exampleAppDir, () async {
|
|
||||||
await flutter('clean');
|
|
||||||
});
|
|
||||||
|
|
||||||
section('Remove Gradle wrapper');
|
|
||||||
|
|
||||||
Directory(path.join(exampleAppDir.path, 'android', 'gradle', 'wrapper'))
|
|
||||||
.deleteSync(recursive: true);
|
|
||||||
|
|
||||||
section('Use AGP 3.3.0');
|
|
||||||
|
|
||||||
newBuildGradle = buildGradle.replaceAll(
|
|
||||||
androidPluginRegExp, 'com.android.tools.build:gradle:3.3.0');
|
|
||||||
print(newBuildGradle);
|
|
||||||
buildGradleFile.writeAsString(newBuildGradle);
|
|
||||||
|
|
||||||
section('Enable R8 in gradle.properties');
|
|
||||||
|
|
||||||
final File gradleProperties =
|
|
||||||
File(path.join(exampleAppDir.path, 'android', 'gradle.properties'));
|
|
||||||
|
|
||||||
if (!exists(gradleProperties)) {
|
|
||||||
return TaskResult.failure('$gradleProperties doesn\'t exist');
|
|
||||||
}
|
|
||||||
|
|
||||||
gradleProperties.writeAsString('''
|
|
||||||
org.gradle.jvmargs=-Xmx1536M
|
|
||||||
android.useAndroidX=true
|
|
||||||
android.enableJetifier=true
|
|
||||||
android.enableR8=true''');
|
|
||||||
|
|
||||||
section('Run flutter build apk using AGP 3.3.0');
|
|
||||||
|
|
||||||
await inDirectory(exampleAppDir, () async {
|
|
||||||
await flutter(
|
|
||||||
'build',
|
|
||||||
options: <String>[
|
|
||||||
'apk',
|
|
||||||
'--target-platform=android-arm',
|
|
||||||
],
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!exists(File(exampleApk))) {
|
|
||||||
return TaskResult.failure('Failed to build app-release.apk');
|
|
||||||
}
|
|
||||||
|
|
||||||
return TaskResult.success(null);
|
|
||||||
} on TaskResult catch (taskResult) {
|
|
||||||
return taskResult;
|
|
||||||
} catch (e) {
|
|
||||||
return TaskResult.failure(e.toString());
|
|
||||||
} finally {
|
|
||||||
rmTree(tempDir);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
@ -444,12 +444,6 @@
|
|||||||
"task_name": "mac_build_aar_module_test",
|
"task_name": "mac_build_aar_module_test",
|
||||||
"flaky": false
|
"flaky": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Mac_android android_plugin_example_app_build_test",
|
|
||||||
"repo": "flutter",
|
|
||||||
"task_name": "mac_android_android_plugin_example_app_build_test",
|
|
||||||
"flaky": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Mac_android android_semantics_integration_test",
|
"name": "Mac_android android_semantics_integration_test",
|
||||||
"repo": "flutter",
|
"repo": "flutter",
|
||||||
|
@ -0,0 +1,110 @@
|
|||||||
|
// Copyright 2014 The Flutter 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_testing/file_testing.dart';
|
||||||
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
|
||||||
|
import '../src/common.dart';
|
||||||
|
import 'test_utils.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
Directory tempDir;
|
||||||
|
|
||||||
|
setUp(() async {
|
||||||
|
tempDir = createResolvedTempDirectorySync('flutter_plugin_test.');
|
||||||
|
});
|
||||||
|
|
||||||
|
tearDown(() async {
|
||||||
|
tryToDelete(tempDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('plugin example can be built using current Flutter Gradle plugin', () async {
|
||||||
|
final String flutterBin = fileSystem.path.join(
|
||||||
|
getFlutterRoot(),
|
||||||
|
'bin',
|
||||||
|
'flutter',
|
||||||
|
);
|
||||||
|
|
||||||
|
processManager.runSync(<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'create',
|
||||||
|
'--template=plugin',
|
||||||
|
'--platforms=android',
|
||||||
|
'plugin_test',
|
||||||
|
], workingDirectory: tempDir.path);
|
||||||
|
|
||||||
|
final Directory exampleAppDir = tempDir.childDirectory('plugin_test').childDirectory('example');
|
||||||
|
|
||||||
|
final File buildGradleFile = exampleAppDir.childDirectory('android').childFile('build.gradle');
|
||||||
|
expect(buildGradleFile, exists);
|
||||||
|
|
||||||
|
final String buildGradle = buildGradleFile.readAsStringSync();
|
||||||
|
final RegExp androidPluginRegExp =
|
||||||
|
RegExp(r'com\.android\.tools\.build:gradle:(\d+\.\d+\.\d+)');
|
||||||
|
|
||||||
|
// Use AGP 4.1.0
|
||||||
|
String newBuildGradle = buildGradle.replaceAll(
|
||||||
|
androidPluginRegExp, 'com.android.tools.build:gradle:4.1.0');
|
||||||
|
buildGradleFile.writeAsStringSync(newBuildGradle);
|
||||||
|
|
||||||
|
// Run flutter build apk using AGP 4.1.0
|
||||||
|
processManager.runSync(<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'build',
|
||||||
|
'apk',
|
||||||
|
'--target-platform=android-arm',
|
||||||
|
], workingDirectory: exampleAppDir.path);
|
||||||
|
|
||||||
|
final File exampleApk = fileSystem.file(fileSystem.path.join(
|
||||||
|
exampleAppDir.path,
|
||||||
|
'build',
|
||||||
|
'app',
|
||||||
|
'outputs',
|
||||||
|
'flutter-apk',
|
||||||
|
'app-release.apk',
|
||||||
|
));
|
||||||
|
expect(exampleApk, exists);
|
||||||
|
|
||||||
|
// Clean
|
||||||
|
processManager.runSync(<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'clean',
|
||||||
|
], workingDirectory: exampleAppDir.path);
|
||||||
|
|
||||||
|
// Remove Gradle wrapper
|
||||||
|
fileSystem
|
||||||
|
.directory(fileSystem.path
|
||||||
|
.join(exampleAppDir.path, 'android', 'gradle', 'wrapper'))
|
||||||
|
.deleteSync(recursive: true);
|
||||||
|
|
||||||
|
// Use AGP 3.3.0
|
||||||
|
newBuildGradle = buildGradle.replaceAll(
|
||||||
|
androidPluginRegExp, 'com.android.tools.build:gradle:3.3.0');
|
||||||
|
buildGradleFile.writeAsStringSync(newBuildGradle);
|
||||||
|
|
||||||
|
// Enable R8 in gradle.properties
|
||||||
|
final File gradleProperties =
|
||||||
|
exampleAppDir.childDirectory('android').childFile('gradle.properties');
|
||||||
|
expect(gradleProperties, exists);
|
||||||
|
|
||||||
|
gradleProperties.writeAsStringSync('''
|
||||||
|
org.gradle.jvmargs=-Xmx1536M
|
||||||
|
android.useAndroidX=true
|
||||||
|
android.enableJetifier=true
|
||||||
|
android.enableR8=true''');
|
||||||
|
|
||||||
|
// Run flutter build apk using AGP 3.3.0
|
||||||
|
processManager.runSync(<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'build',
|
||||||
|
'apk',
|
||||||
|
'--target-platform=android-arm',
|
||||||
|
], workingDirectory: exampleAppDir.path);
|
||||||
|
expect(exampleApk, exists);
|
||||||
|
});
|
||||||
|
}
|
@ -17,22 +17,32 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWithoutContext('device.getDevices', () async {
|
Directory tempDir;
|
||||||
final Directory tempDir = createResolvedTempDirectorySync('daemon_mode_test.');
|
Process daemonProcess;
|
||||||
|
|
||||||
|
setUp(() async {
|
||||||
|
tempDir = createResolvedTempDirectorySync('daemon_mode_test.');
|
||||||
|
});
|
||||||
|
|
||||||
|
tearDown(() async {
|
||||||
|
tryToDelete(tempDir);
|
||||||
|
daemonProcess?.kill();
|
||||||
|
});
|
||||||
|
|
||||||
|
testWithoutContext('device.getDevices', () async {
|
||||||
final BasicProject _project = BasicProject();
|
final BasicProject _project = BasicProject();
|
||||||
await _project.setUpIn(tempDir);
|
await _project.setUpIn(tempDir);
|
||||||
|
|
||||||
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
|
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
|
||||||
|
|
||||||
const ProcessManager processManager = LocalProcessManager();
|
const ProcessManager processManager = LocalProcessManager();
|
||||||
final Process process = await processManager.start(
|
daemonProcess = await processManager.start(
|
||||||
<String>[flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'],
|
<String>[flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'],
|
||||||
workingDirectory: tempDir.path,
|
workingDirectory: tempDir.path,
|
||||||
);
|
);
|
||||||
|
|
||||||
final StreamController<String> stdout = StreamController<String>.broadcast();
|
final StreamController<String> stdout = StreamController<String>.broadcast();
|
||||||
transformToLines(process.stdout).listen((String line) => stdout.add(line));
|
transformToLines(daemonProcess.stdout).listen((String line) => stdout.add(line));
|
||||||
final Stream<Map<String, dynamic>> stream = stdout
|
final Stream<Map<String, dynamic>> stream = stdout
|
||||||
.stream
|
.stream
|
||||||
.map<Map<String, dynamic>>(parseFlutterResponse)
|
.map<Map<String, dynamic>>(parseFlutterResponse)
|
||||||
@ -42,7 +52,7 @@ void main() {
|
|||||||
expect(response['event'], 'daemon.connected');
|
expect(response['event'], 'daemon.connected');
|
||||||
|
|
||||||
// start listening for devices
|
// start listening for devices
|
||||||
process.stdin.writeln('[${jsonEncode(<String, dynamic>{
|
daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{
|
||||||
'id': 1,
|
'id': 1,
|
||||||
'method': 'device.enable',
|
'method': 'device.enable',
|
||||||
})}]');
|
})}]');
|
||||||
@ -56,7 +66,7 @@ void main() {
|
|||||||
expect(response['event'], 'device.added');
|
expect(response['event'], 'device.added');
|
||||||
|
|
||||||
// get the list of all devices
|
// get the list of all devices
|
||||||
process.stdin.writeln('[${jsonEncode(<String, dynamic>{
|
daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{
|
||||||
'id': 2,
|
'id': 2,
|
||||||
'method': 'device.getDevices',
|
'method': 'device.getDevices',
|
||||||
})}]');
|
})}]');
|
||||||
@ -68,8 +78,5 @@ void main() {
|
|||||||
final dynamic result = response['result'];
|
final dynamic result = response['result'];
|
||||||
expect(result, isList);
|
expect(result, isList);
|
||||||
expect(result, isNotEmpty);
|
expect(result, isNotEmpty);
|
||||||
|
|
||||||
tryToDelete(tempDir);
|
|
||||||
process.kill();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,17 @@ import 'test_driver.dart';
|
|||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWithoutContext('can step over statements', () async {
|
Directory tempDir;
|
||||||
final Directory tempDir = createResolvedTempDirectorySync('debugger_stepping_test.');
|
|
||||||
|
|
||||||
|
setUp(() async {
|
||||||
|
tempDir = createResolvedTempDirectorySync('debugger_stepping_test.');
|
||||||
|
});
|
||||||
|
|
||||||
|
tearDown(() async {
|
||||||
|
tryToDelete(tempDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWithoutContext('can step over statements', () async {
|
||||||
final SteppingProject _project = SteppingProject();
|
final SteppingProject _project = SteppingProject();
|
||||||
await _project.setUpIn(tempDir);
|
await _project.setUpIn(tempDir);
|
||||||
|
|
||||||
@ -43,6 +51,5 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await _flutter.stop();
|
await _flutter.stop();
|
||||||
tryToDelete(tempDir);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user