From e25f649df0df6454789c23d26fda18131b8c6f03 Mon Sep 17 00:00:00 2001 From: CareF Date: Mon, 5 Oct 2020 22:47:28 -0400 Subject: [PATCH 1/6] add watchPerformance --- .../lib/integration_test.dart | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 4176c1c2c5e1..fc56ddf80602 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'dart:developer' as developer; +import 'dart:ui'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -81,6 +82,10 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding Size _surfaceSize; + // This flag is used to print warning messages when tracking performance + // under debug mode. + static bool _firstRun = false; + /// Artificially changes the surface size to `size` on the Widget binding, /// then flushes microtasks. /// @@ -282,4 +287,30 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding reportData ??= {}; reportData[reportKey] = timeline.toJson(); } + + /// Watches the [FrameTiming] during `action` and report it to the binding + /// with key `reportKey`. + /// + /// This can be used to implement performance tests previously using + /// [traceAction] and [TimelineSummary] from [flutter_driver] + Future watchPerformance( + Future action(), { + String reportKey = 'performance', + }) async { + assert(() { + if (_firstRun) { + debugPrint(kDebugWarning); + _firstRun = false; + } + return true; + }()); + final List frameTimings = []; + final TimingsCallback watcher = frameTimings.addAll; + addTimingsCallback(watcher); + await action(); + removeTimingsCallback(watcher); + final FrameTimingSummarizer frameTimes = FrameTimingSummarizer(frameTimings); + reportData ??= {}; + reportData[reportKey] = frameTimes.summary; + } } From ed6a77082dd9aa1194499709a8e5f4b5d349af20 Mon Sep 17 00:00:00 2001 From: CareF Date: Mon, 5 Oct 2020 22:48:43 -0400 Subject: [PATCH 2/6] update version --- packages/integration_test/CHANGELOG.md | 4 ++++ packages/integration_test/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/integration_test/CHANGELOG.md b/packages/integration_test/CHANGELOG.md index d6ef143666e6..409af072d0e1 100644 --- a/packages/integration_test/CHANGELOG.md +++ b/packages/integration_test/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.2 + +* Add `watchPerformance` for performance test. + ## 0.9.1 * Keep handling deprecated Android v1 classes for backward compatibility. diff --git a/packages/integration_test/pubspec.yaml b/packages/integration_test/pubspec.yaml index 39a48d1675da..d9a27eb74424 100644 --- a/packages/integration_test/pubspec.yaml +++ b/packages/integration_test/pubspec.yaml @@ -1,6 +1,6 @@ name: integration_test description: Runs tests that use the flutter_test API as integration tests. -version: 0.9.1 +version: 0.9.2 homepage: https://github.com/flutter/plugins/tree/master/packages/integration_test environment: From 854f68516a24b9b5de8737921cc60725e6591c0f Mon Sep 17 00:00:00 2001 From: CareF Date: Wed, 7 Oct 2020 16:20:59 -0400 Subject: [PATCH 3/6] formatting --- packages/integration_test/lib/integration_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index fc56ddf80602..4dcf71086cac 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -309,7 +309,8 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding addTimingsCallback(watcher); await action(); removeTimingsCallback(watcher); - final FrameTimingSummarizer frameTimes = FrameTimingSummarizer(frameTimings); + final FrameTimingSummarizer frameTimes = + FrameTimingSummarizer(frameTimings); reportData ??= {}; reportData[reportKey] = frameTimes.summary; } From 25eeeb93fbbf2364e68db4388bcfc69bb47869c1 Mon Sep 17 00:00:00 2001 From: CareF Date: Wed, 7 Oct 2020 17:39:04 -0400 Subject: [PATCH 4/6] add delayForFrameTimings --- packages/integration_test/lib/integration_test.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 4dcf71086cac..2f49dd14abe8 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -304,10 +304,19 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding } return true; }()); + + // The engine could batch FrameTimings and send them only once per second. + // Delay for a sufficient time so either old FrameTimings are flushed and not + // interfering our measurements here, or new FrameTimings are all reported. + Future delayForFrameTimings() => + Future.delayed(const Duration(seconds: 2)); + + await delayForFrameTimings(); // flush old FrameTimings final List frameTimings = []; final TimingsCallback watcher = frameTimings.addAll; addTimingsCallback(watcher); await action(); + await delayForFrameTimings(); // make sure all FrameTimings are reported removeTimingsCallback(watcher); final FrameTimingSummarizer frameTimes = FrameTimingSummarizer(frameTimings); From 46d0108df385ec3d9e1b5d7744ab515457ce5259 Mon Sep 17 00:00:00 2001 From: CareF Date: Wed, 7 Oct 2020 21:27:50 -0400 Subject: [PATCH 5/6] add todo --- packages/integration_test/lib/integration_test.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 2f49dd14abe8..cdd09b70b891 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -308,6 +308,9 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // The engine could batch FrameTimings and send them only once per second. // Delay for a sufficient time so either old FrameTimings are flushed and not // interfering our measurements here, or new FrameTimings are all reported. + // TODO(CareF): remove this when flush FrameTiming is readly in engine. + // See https://github.com/flutter/flutter/issues/64808 + // and https://github.com/flutter/flutter/issues/67593 Future delayForFrameTimings() => Future.delayed(const Duration(seconds: 2)); From 93d7088f3c71af73cb9c9998454de8c77e5ef664 Mon Sep 17 00:00:00 2001 From: CareF Date: Wed, 7 Oct 2020 21:48:32 -0400 Subject: [PATCH 6/6] formatting --- packages/integration_test/lib/integration_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index cdd09b70b891..5a37e88a3c6e 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -312,7 +312,7 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // See https://github.com/flutter/flutter/issues/64808 // and https://github.com/flutter/flutter/issues/67593 Future delayForFrameTimings() => - Future.delayed(const Duration(seconds: 2)); + Future.delayed(const Duration(seconds: 2)); await delayForFrameTimings(); // flush old FrameTimings final List frameTimings = [];