| // 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:test/test.dart' hide TypeMatcher, isInstanceOf; |
| |
| import 'package:macrobenchmarks/common.dart'; |
| |
| void macroPerfTest( |
| String testName, |
| String routeName, |
| { Duration pageDelay, |
| Duration duration = const Duration(seconds: 3), |
| Duration timeout = const Duration(seconds: 30), |
| Future<void> driverOps(FlutterDriver driver), |
| Future<void> setupOps(FlutterDriver driver), |
| }) { |
| test(testName, () async { |
| final FlutterDriver driver = await FlutterDriver.connect(); |
| |
| // The slight initial delay avoids starting the timing during a |
| // period of increased load on the device. Without this delay, the |
| // benchmark has greater noise. |
| // See: https://github.com/flutter/flutter/issues/19434 |
| await Future<void>.delayed(const Duration(milliseconds: 250)); |
| |
| await driver.forceGC(); |
| |
| final SerializableFinder scrollable = find.byValueKey(kScrollableName); |
| expect(scrollable, isNotNull); |
| final SerializableFinder button = find.byValueKey(routeName); |
| expect(button, isNotNull); |
| await driver.scrollUntilVisible(scrollable, button, dyScroll: -50.0); |
| await driver.tap(button); |
| |
| if (pageDelay != null) { |
| // Wait for the page to load |
| await Future<void>.delayed(pageDelay); |
| } |
| |
| if (setupOps != null) { |
| await setupOps(driver); |
| } |
| |
| final Timeline timeline = await driver.traceAction(() async { |
| final Future<void> durationFuture = Future<void>.delayed(duration); |
| if (driverOps != null) { |
| await driverOps(driver); |
| } |
| await durationFuture; |
| }); |
| |
| driver.close(); |
| |
| final TimelineSummary summary = TimelineSummary.summarize(timeline); |
| await summary.writeSummaryToFile(testName, pretty: true); |
| await summary.writeTimelineToFile(testName, pretty: true); |
| }, timeout: Timeout(timeout)); |
| } |