From 754bc4a594d3a949106fe9dae90c6e70d9707df2 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 25 Jan 2021 19:23:53 -0800 Subject: [PATCH] Move android_plugin_example_app_build_test from devicelab to tool integration tests (#74685) --- ...android_plugin_example_app_build_test.dart | 157 ------------------ dev/prod_builders.json | 6 - ...android_plugin_example_app_build_test.dart | 110 ++++++++++++ .../integration.shard/daemon_mode_test.dart | 25 ++- .../debugger_stepping_test.dart | 13 +- 5 files changed, 136 insertions(+), 175 deletions(-) delete mode 100644 dev/devicelab/bin/tasks/android_plugin_example_app_build_test.dart create mode 100644 packages/flutter_tools/test/integration.shard/android_plugin_example_app_build_test.dart diff --git a/dev/devicelab/bin/tasks/android_plugin_example_app_build_test.dart b/dev/devicelab/bin/tasks/android_plugin_example_app_build_test.dart deleted file mode 100644 index e15f02eb8d..0000000000 --- a/dev/devicelab/bin/tasks/android_plugin_example_app_build_test.dart +++ /dev/null @@ -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 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: ['--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: [ - '--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: [ - '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: [ - '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); - } - }); -} diff --git a/dev/prod_builders.json b/dev/prod_builders.json index 457086dca3..84020cdf7f 100644 --- a/dev/prod_builders.json +++ b/dev/prod_builders.json @@ -444,12 +444,6 @@ "task_name": "mac_build_aar_module_test", "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", "repo": "flutter", diff --git a/packages/flutter_tools/test/integration.shard/android_plugin_example_app_build_test.dart b/packages/flutter_tools/test/integration.shard/android_plugin_example_app_build_test.dart new file mode 100644 index 0000000000..bc151a70c4 --- /dev/null +++ b/packages/flutter_tools/test/integration.shard/android_plugin_example_app_build_test.dart @@ -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([ + 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([ + 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([ + 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([ + flutterBin, + ...getLocalEngineArguments(), + 'build', + 'apk', + '--target-platform=android-arm', + ], workingDirectory: exampleAppDir.path); + expect(exampleApk, exists); + }); +} diff --git a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart index c8c015477e..f18735af57 100644 --- a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart +++ b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart @@ -17,22 +17,32 @@ import 'test_driver.dart'; import 'test_utils.dart'; void main() { - testWithoutContext('device.getDevices', () async { - final Directory tempDir = createResolvedTempDirectorySync('daemon_mode_test.'); + Directory tempDir; + Process daemonProcess; + setUp(() async { + tempDir = createResolvedTempDirectorySync('daemon_mode_test.'); + }); + + tearDown(() async { + tryToDelete(tempDir); + daemonProcess?.kill(); + }); + + testWithoutContext('device.getDevices', () async { final BasicProject _project = BasicProject(); await _project.setUpIn(tempDir); final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter'); const ProcessManager processManager = LocalProcessManager(); - final Process process = await processManager.start( + daemonProcess = await processManager.start( [flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'], workingDirectory: tempDir.path, ); final StreamController stdout = StreamController.broadcast(); - transformToLines(process.stdout).listen((String line) => stdout.add(line)); + transformToLines(daemonProcess.stdout).listen((String line) => stdout.add(line)); final Stream> stream = stdout .stream .map>(parseFlutterResponse) @@ -42,7 +52,7 @@ void main() { expect(response['event'], 'daemon.connected'); // start listening for devices - process.stdin.writeln('[${jsonEncode({ + daemonProcess.stdin.writeln('[${jsonEncode({ 'id': 1, 'method': 'device.enable', })}]'); @@ -56,7 +66,7 @@ void main() { expect(response['event'], 'device.added'); // get the list of all devices - process.stdin.writeln('[${jsonEncode({ + daemonProcess.stdin.writeln('[${jsonEncode({ 'id': 2, 'method': 'device.getDevices', })}]'); @@ -68,8 +78,5 @@ void main() { final dynamic result = response['result']; expect(result, isList); expect(result, isNotEmpty); - - tryToDelete(tempDir); - process.kill(); }); } diff --git a/packages/flutter_tools/test/integration.shard/debugger_stepping_test.dart b/packages/flutter_tools/test/integration.shard/debugger_stepping_test.dart index 9b52de2114..6564ec4860 100644 --- a/packages/flutter_tools/test/integration.shard/debugger_stepping_test.dart +++ b/packages/flutter_tools/test/integration.shard/debugger_stepping_test.dart @@ -12,9 +12,17 @@ import 'test_driver.dart'; import 'test_utils.dart'; void main() { - testWithoutContext('can step over statements', () async { - final Directory tempDir = createResolvedTempDirectorySync('debugger_stepping_test.'); + Directory tempDir; + setUp(() async { + tempDir = createResolvedTempDirectorySync('debugger_stepping_test.'); + }); + + tearDown(() async { + tryToDelete(tempDir); + }); + + testWithoutContext('can step over statements', () async { final SteppingProject _project = SteppingProject(); await _project.setUpIn(tempDir); @@ -43,6 +51,5 @@ void main() { } await _flutter.stop(); - tryToDelete(tempDir); }); }