// Copyright 2013 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:args/command_runner.dart'; import 'package:flutter_plugin_tools/src/common.dart'; import 'package:flutter_plugin_tools/src/firebase_test_lab_command.dart'; import 'package:test/test.dart'; import 'mocks.dart'; import 'util.dart'; void main() { group('$FirebaseTestLabCommand', () { final List printedMessages = []; CommandRunner runner; RecordingProcessRunner processRunner; setUp(() { initializeFakePackages(); processRunner = RecordingProcessRunner(); final FirebaseTestLabCommand command = FirebaseTestLabCommand( mockPackagesDir, mockFileSystem, processRunner: processRunner, print: (Object message) => printedMessages.add(message.toString())); runner = CommandRunner( 'firebase_test_lab_command', 'Test for $FirebaseTestLabCommand'); runner.addCommand(command); }); tearDown(() { printedMessages.clear(); }); test('retries gcloud set', () async { final MockProcess mockProcess = MockProcess(); mockProcess.exitCodeCompleter.complete(1); processRunner.processToReturn = mockProcess; createFakePlugin('plugin', withExtraFiles: >[ ['lib/test/should_not_run_e2e.dart'], ['example', 'test_driver', 'plugin_e2e.dart'], ['example', 'test_driver', 'plugin_e2e_test.dart'], ['example', 'android', 'gradlew'], ['example', 'should_not_run_e2e.dart'], [ 'example', 'android', 'app', 'src', 'androidTest', 'MainActivityTest.java' ], ]); await expectLater( () => runCapturingPrint(runner, ['firebase-test-lab']), throwsA(const TypeMatcher())); expect( printedMessages, contains( '\nWarning: gcloud config set returned a non-zero exit code. Continuing anyway.')); }); test('runs e2e tests', () async { createFakePlugin('plugin', withExtraFiles: >[ ['test', 'plugin_test.dart'], ['test', 'plugin_e2e.dart'], ['should_not_run_e2e.dart'], ['lib/test/should_not_run_e2e.dart'], ['example', 'test', 'plugin_e2e.dart'], ['example', 'test_driver', 'plugin_e2e.dart'], ['example', 'test_driver', 'plugin_e2e_test.dart'], ['example', 'integration_test', 'foo_test.dart'], ['example', 'integration_test', 'should_not_run.dart'], ['example', 'android', 'gradlew'], ['example', 'should_not_run_e2e.dart'], [ 'example', 'android', 'app', 'src', 'androidTest', 'MainActivityTest.java' ], ]); await runCapturingPrint(runner, [ 'firebase-test-lab', '--device', 'model=flame,version=29', '--device', 'model=seoul,version=26', '--test-run-id', 'testRunId', ]); expect( printedMessages, orderedEquals([ '\nRUNNING FIREBASE TEST LAB TESTS for plugin', '\nFirebase project configured.', '\n\n', 'All Firebase Test Lab tests successful!', ]), ); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( 'gcloud', 'auth activate-service-account --key-file=${Platform.environment['HOME']}/gcloud-service-key.json' .split(' '), null), ProcessCall( 'gcloud', 'config set project flutter-infra'.split(' '), null), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleAndroidTest -Pverbose=true'.split(' '), '/packages/plugin/example/android'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/test/plugin_e2e.dart' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/0/ --device model=flame,version=29 --device model=seoul,version=26' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/test_driver/plugin_e2e.dart' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/1/ --device model=flame,version=29 --device model=seoul,version=26' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/test/plugin_e2e.dart' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/2/ --device model=flame,version=29 --device model=seoul,version=26' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/integration_test/foo_test.dart' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/3/ --device model=flame,version=29 --device model=seoul,version=26' .split(' '), '/packages/plugin/example'), ]), ); }); test('experimental flag', () async { createFakePlugin('plugin', withExtraFiles: >[ ['test', 'plugin_test.dart'], ['test', 'plugin_e2e.dart'], ['should_not_run_e2e.dart'], ['lib/test/should_not_run_e2e.dart'], ['example', 'test', 'plugin_e2e.dart'], ['example', 'test_driver', 'plugin_e2e.dart'], ['example', 'test_driver', 'plugin_e2e_test.dart'], ['example', 'integration_test', 'foo_test.dart'], ['example', 'integration_test', 'should_not_run.dart'], ['example', 'android', 'gradlew'], ['example', 'should_not_run_e2e.dart'], [ 'example', 'android', 'app', 'src', 'androidTest', 'MainActivityTest.java' ], ]); await runCapturingPrint(runner, [ 'firebase-test-lab', '--device', 'model=flame,version=29', '--test-run-id', 'testRunId', '--enable-experiment=exp1', ]); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( 'gcloud', 'auth activate-service-account --key-file=${Platform.environment['HOME']}/gcloud-service-key.json' .split(' '), null), ProcessCall( 'gcloud', 'config set project flutter-infra'.split(' '), null), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleAndroidTest -Pverbose=true -Pextra-front-end-options=--enable-experiment%3Dexp1 -Pextra-gen-snapshot-options=--enable-experiment%3Dexp1' .split(' '), '/packages/plugin/example/android'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/test/plugin_e2e.dart -Pextra-front-end-options=--enable-experiment%3Dexp1 -Pextra-gen-snapshot-options=--enable-experiment%3Dexp1' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/0/ --device model=flame,version=29' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/test_driver/plugin_e2e.dart -Pextra-front-end-options=--enable-experiment%3Dexp1 -Pextra-gen-snapshot-options=--enable-experiment%3Dexp1' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/1/ --device model=flame,version=29' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/test/plugin_e2e.dart -Pextra-front-end-options=--enable-experiment%3Dexp1 -Pextra-gen-snapshot-options=--enable-experiment%3Dexp1' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/2/ --device model=flame,version=29' .split(' '), '/packages/plugin/example'), ProcessCall( '/packages/plugin/example/android/gradlew', 'app:assembleDebug -Pverbose=true -Ptarget=/packages/plugin/example/integration_test/foo_test.dart -Pextra-front-end-options=--enable-experiment%3Dexp1 -Pextra-gen-snapshot-options=--enable-experiment%3Dexp1' .split(' '), '/packages/plugin/example/android'), ProcessCall( 'gcloud', 'firebase test android run --type instrumentation --app build/app/outputs/apk/debug/app-debug.apk --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk --timeout 5m --results-bucket=gs://flutter_firebase_testlab --results-dir=plugins_android_test/plugin/null/testRunId/3/ --device model=flame,version=29' .split(' '), '/packages/plugin/example'), ]), ); cleanupPackages(); }); }); }