diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 10548c47bf..662a37028e 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -297,12 +297,19 @@ https://flutter.dev/docs/testing/integration-tests#testing-on-firebase-test-lab /// /// The `streams` and `retainPriorEvents` parameters are passed as-is to /// [traceTimeline]. + /// + /// The `reportKey` must not be `'screenshots'`, which is reserved for + /// screenshots created by + /// [IntegrationTestWidgetsFlutterBinding.takeScreenshot]. Future traceAction( Future Function() action, { List streams = const ['all'], bool retainPriorEvents = false, String reportKey = 'timeline', }) async { + if (reportKey == 'screenshots') { + throw ArgumentError('The "screenshots" reportKey is reserved.'); + } final vm.Timeline timeline = await traceTimeline( action, streams: streams, diff --git a/packages/integration_test/lib/integration_test_driver.dart b/packages/integration_test/lib/integration_test_driver.dart index 149eec4314..3ecaa6eaed 100644 --- a/packages/integration_test/lib/integration_test_driver.dart +++ b/packages/integration_test/lib/integration_test_driver.dart @@ -24,7 +24,8 @@ String testOutputsDirectory = typedef ResponseDataCallback = FutureOr Function(Map?); /// Writes a json-serializable data to -/// [testOutputsDirectory]/`testOutputFilename.json`. +/// [testOutputsDirectory]/`testOutputFilename_.json`, where key is the +/// name provided as the report key for the response data. /// /// This is the default `responseDataCallback` in [integrationDriver]. Future writeResponseData( @@ -32,15 +33,20 @@ Future writeResponseData( String testOutputFilename = 'integration_response_data', String? destinationDirectory, }) async { + if (data == null) { + return; + } assert(testOutputFilename != null); destinationDirectory ??= testOutputsDirectory; await fs.directory(destinationDirectory).create(recursive: true); - final File file = fs.file(path.join( - destinationDirectory, - '$testOutputFilename.json', - )); - final String resultString = _encodeJson(data, true); - await file.writeAsString(resultString); + for (final String key in data.keys.where((String key) => key != 'screenshots')) { + final File file = fs.file(path.join( + destinationDirectory, + '${testOutputFilename}_$key.json', + )); + final String resultString = _encodeJson(data[key], true); + await file.writeAsString(resultString); + } } /// Adaptor to run an integration test using `flutter drive`. @@ -95,6 +101,6 @@ Future integrationDriver({ const JsonEncoder _prettyEncoder = JsonEncoder.withIndent(' '); -String _encodeJson(Map? jsonObject, bool pretty) { +String _encodeJson(Object? jsonObject, bool pretty) { return pretty ? _prettyEncoder.convert(jsonObject) : json.encode(jsonObject); } diff --git a/packages/integration_test/test/multi_timeline_test.dart b/packages/integration_test/test/multi_timeline_test.dart new file mode 100644 index 0000000000..b640733aab --- /dev/null +++ b/packages/integration_test/test/multi_timeline_test.dart @@ -0,0 +1,27 @@ +// 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:flutter_driver/flutter_driver.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test_driver.dart'; +import 'package:path/path.dart' as path; + +void main() { + useMemoryFileSystemForTesting(); + + test('Writes multiple files for each timeline', () async { + final String outDir = fs.systemTempDirectory.path; + await writeResponseData( + { + 'timeline_a': {}, + 'timeline_b': {}, + 'screenshots': {}, + }, + destinationDirectory: outDir, + ); + expect(fs.file(path.join(outDir, 'integration_response_data_timeline_a.json')).existsSync(), true); + expect(fs.file(path.join(outDir, 'integration_response_data_timeline_b.json')).existsSync(), true); + expect(fs.file(path.join(outDir, 'integration_response_data_screenshots.json')).existsSync(), false); + }); +}