blob: d11624671523d4f45b0e3c8bed6db2a9a7dad4b1 [file] [log] [blame]
// Copyright 2019 The Chromium 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<String> printedMessages = <String>[];
CommandRunner<FirebaseTestLabCommand> runner;
RecordingProcessRunner processRunner;
setUp(() {
initializeFakePackages();
processRunner = RecordingProcessRunner();
final FirebaseTestLabCommand command = FirebaseTestLabCommand(
mockPackagesDir, mockFileSystem,
processRunner: processRunner,
print: (Object message) => printedMessages.add(message.toString()));
runner = CommandRunner<Null>(
'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: <List<String>>[
<String>['lib/test/should_not_run_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e_test.dart'],
<String>['example', 'android', 'gradlew'],
<String>['example', 'should_not_run_e2e.dart'],
<String>[
'example',
'android',
'app',
'src',
'androidTest',
'MainActivityTest.java'
],
]);
await expectLater(
() => runCapturingPrint(runner, <String>['firebase-test-lab']),
throwsA(const TypeMatcher<ToolExit>()));
expect(
printedMessages,
contains(
"\nWarning: gcloud config set returned a non-zero exit code. Continuing anyway."));
});
test('runs e2e tests', () async {
createFakePlugin('plugin', withExtraFiles: <List<String>>[
<String>['test', 'plugin_test.dart'],
<String>['test', 'plugin_e2e.dart'],
<String>['should_not_run_e2e.dart'],
<String>['lib/test/should_not_run_e2e.dart'],
<String>['example', 'test', 'plugin_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e_test.dart'],
<String>['example', 'integration_test', 'foo_test.dart'],
<String>['example', 'integration_test', 'should_not_run.dart'],
<String>['example', 'android', 'gradlew'],
<String>['example', 'should_not_run_e2e.dart'],
<String>[
'example',
'android',
'app',
'src',
'androidTest',
'MainActivityTest.java'
],
]);
final List<String> output = await runCapturingPrint(runner, <String>[
'firebase-test-lab',
'--device',
'model=flame,version=29',
'--device',
'model=seoul,version=26',
'--test-run-id',
'testRunId',
]);
expect(
printedMessages,
orderedEquals(<String>[
'\nRUNNING FIREBASE TEST LAB TESTS for plugin',
'\nFirebase project configured.',
'\n\n',
'All Firebase Test Lab tests successful!',
]),
);
expect(
processRunner.recordedCalls,
orderedEquals(<ProcessCall>[
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: <List<String>>[
<String>['test', 'plugin_test.dart'],
<String>['test', 'plugin_e2e.dart'],
<String>['should_not_run_e2e.dart'],
<String>['lib/test/should_not_run_e2e.dart'],
<String>['example', 'test', 'plugin_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e.dart'],
<String>['example', 'test_driver', 'plugin_e2e_test.dart'],
<String>['example', 'integration_test', 'foo_test.dart'],
<String>['example', 'integration_test', 'should_not_run.dart'],
<String>['example', 'android', 'gradlew'],
<String>['example', 'should_not_run_e2e.dart'],
<String>[
'example',
'android',
'app',
'src',
'androidTest',
'MainActivityTest.java'
],
]);
await runCapturingPrint(runner, <String>[
'firebase-test-lab',
'--device',
'model=flame,version=29',
'--test-run-id',
'testRunId',
'--enable-experiment=exp1',
]);
expect(
processRunner.recordedCalls,
orderedEquals(<ProcessCall>[
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();
});
});
}