From d8034538bd0049320f72ba3439dbd722593d8a3b Mon Sep 17 00:00:00 2001 From: Core Date: Fri, 12 Nov 2021 00:23:02 +0700 Subject: [PATCH] feat: enable flavor option on test command (#89045) --- dev/devicelab/bin/tasks/flavors_test.dart | 8 +++++- dev/devicelab/bin/tasks/flavors_test_ios.dart | 8 +++++- dev/devicelab/bin/tasks/flavors_test_win.dart | 8 +++++- .../lib/tasks/integration_tests.dart | 17 +++++++++++- .../integration_test/integration_test.dart | 21 +++++++++++++++ dev/integration_tests/flavors/lib/main.dart | 4 +++ .../flutter_tools/lib/src/commands/test.dart | 1 + .../commands.shard/hermetic/test_test.dart | 26 +++++++++++++++++++ 8 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 dev/integration_tests/flavors/integration_test/integration_test.dart diff --git a/dev/devicelab/bin/tasks/flavors_test.dart b/dev/devicelab/bin/tasks/flavors_test.dart index b8fbade661..7e50969cd3 100644 --- a/dev/devicelab/bin/tasks/flavors_test.dart +++ b/dev/devicelab/bin/tasks/flavors_test.dart @@ -4,9 +4,15 @@ import 'package:flutter_devicelab/framework/devices.dart'; import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/tasks/integration_tests.dart'; Future main() async { deviceOperatingSystem = DeviceOperatingSystem.android; - await task(createFlavorsTest()); + await task(() async { + await createFlavorsTest().call(); + await createIntegrationTestFlavorsTest().call(); + + return TaskResult.success(null); + }); } diff --git a/dev/devicelab/bin/tasks/flavors_test_ios.dart b/dev/devicelab/bin/tasks/flavors_test_ios.dart index 3fa97b2cf7..c508c7fa88 100644 --- a/dev/devicelab/bin/tasks/flavors_test_ios.dart +++ b/dev/devicelab/bin/tasks/flavors_test_ios.dart @@ -4,9 +4,15 @@ import 'package:flutter_devicelab/framework/devices.dart'; import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/tasks/integration_tests.dart'; Future main() async { deviceOperatingSystem = DeviceOperatingSystem.ios; - await task(createFlavorsTest()); + await task(() async { + await createFlavorsTest().call(); + await createIntegrationTestFlavorsTest().call(); + + return TaskResult.success(null); + }); } diff --git a/dev/devicelab/bin/tasks/flavors_test_win.dart b/dev/devicelab/bin/tasks/flavors_test_win.dart index b8fbade661..7e50969cd3 100644 --- a/dev/devicelab/bin/tasks/flavors_test_win.dart +++ b/dev/devicelab/bin/tasks/flavors_test_win.dart @@ -4,9 +4,15 @@ import 'package:flutter_devicelab/framework/devices.dart'; import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/framework/task_result.dart'; import 'package:flutter_devicelab/tasks/integration_tests.dart'; Future main() async { deviceOperatingSystem = DeviceOperatingSystem.android; - await task(createFlavorsTest()); + await task(() async { + await createFlavorsTest().call(); + await createIntegrationTestFlavorsTest().call(); + + return TaskResult.success(null); + }); } diff --git a/dev/devicelab/lib/tasks/integration_tests.dart b/dev/devicelab/lib/tasks/integration_tests.dart index 570f6f5e15..af4dc5573b 100644 --- a/dev/devicelab/lib/tasks/integration_tests.dart +++ b/dev/devicelab/lib/tasks/integration_tests.dart @@ -29,6 +29,14 @@ TaskFunction createFlavorsTest() { ); } +TaskFunction createIntegrationTestFlavorsTest() { + return IntegrationTest( + '${flutterDirectory.path}/dev/integration_tests/flavors', + 'integration_test/integration_test.dart', + extraOptions: ['--flavor', 'paid'], + ); +} + TaskFunction createExternalUiIntegrationTest() { return DriverTest( '${flutterDirectory.path}/dev/integration_tests/external_ui', @@ -166,10 +174,16 @@ class DriverTest { } class IntegrationTest { - IntegrationTest(this.testDirectory, this.testTarget); + IntegrationTest( + this.testDirectory, + this.testTarget, { + this.extraOptions = const [], + } + ); final String testDirectory; final String testTarget; + final List extraOptions; Future call() { return inDirectory(testDirectory, () async { @@ -183,6 +197,7 @@ class IntegrationTest { '-d', deviceId, testTarget, + ...extraOptions, ]; await flutter('test', options: options); diff --git a/dev/integration_tests/flavors/integration_test/integration_test.dart b/dev/integration_tests/flavors/integration_test/integration_test.dart new file mode 100644 index 0000000000..d2cdd10dd4 --- /dev/null +++ b/dev/integration_tests/flavors/integration_test/integration_test.dart @@ -0,0 +1,21 @@ +// 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:flavors/main.dart' as app; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('Flavor Test', () { + testWidgets('check flavor', (WidgetTester tester) async { + app.runMainApp(); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + + expect(find.text('paid'), findsOneWidget); + }); + }); +} diff --git a/dev/integration_tests/flavors/lib/main.dart b/dev/integration_tests/flavors/lib/main.dart index 3522447614..a618efcdfd 100644 --- a/dev/integration_tests/flavors/lib/main.dart +++ b/dev/integration_tests/flavors/lib/main.dart @@ -8,6 +8,10 @@ import 'package:flutter_driver/driver_extension.dart'; void main() { enableFlutterDriverExtension(); + runMainApp(); +} + +void runMainApp() { runApp(const Center(child: Flavor())); } diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 8d3b8eb0f9..793afd8e64 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -73,6 +73,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { usesDartDefineOption(); usesWebRendererOption(); usesDeviceUserOption(); + usesFlavorOption(); argParser ..addMultiOption('name', diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index 8320d0b015..0bd710c7b1 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -605,6 +605,32 @@ dev_dependencies: ]), }); + testUsingContext('Integration tests given flavor', () async { + final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(0); + + final TestCommand testCommand = TestCommand(testRunner: testRunner); + final CommandRunner commandRunner = createTestCommandRunner(testCommand); + + await commandRunner.run(const [ + 'test', + '--no-pub', + '--flavor', + 'dev', + 'integration_test', + ]); + + expect( + testRunner.lastDebuggingOptionsValue.buildInfo.flavor, + contains('dev'), + ); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + DeviceManager: () => _FakeDeviceManager([ + FakeDevice('ephemeral', 'ephemeral', type: PlatformType.android), + ]), + }); + testUsingContext('Builds the asset manifest by default', () async { final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(0);