// 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:macrobenchmarks/common.dart'; import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; typedef DriverTestCallBack = Future<void> Function(FlutterDriver driver); Future<void> runDriverTestForRoute(String routeName, DriverTestCallBack body) 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); // -320 comes from the logical pixels for a full screen scroll for the // smallest reference device, iPhone 4, whose physical screen dimensions are // 960px × 640px. const double dyScroll = -320.0; await driver.scrollUntilVisible(scrollable, button, dyScroll: dyScroll); await driver.tap(button); await body(driver); driver.close(); } void macroPerfTest( String testName, String routeName, { Duration? pageDelay, Duration duration = const Duration(seconds: 3), Future<void> Function(FlutterDriver driver)? driverOps, Future<void> Function(FlutterDriver driver)? setupOps, }) { test(testName, () async { late Timeline timeline; await runDriverTestForRoute(routeName, (FlutterDriver driver) async { if (pageDelay != null) { // Wait for the page to load await Future<void>.delayed(pageDelay); } if (setupOps != null) { await setupOps(driver); } timeline = await driver.traceAction(() async { final Future<void> durationFuture = Future<void>.delayed(duration); if (driverOps != null) { await driverOps(driver); } await durationFuture; }); }); expect(timeline, isNotNull); final TimelineSummary summary = TimelineSummary.summarize(timeline); await summary.writeTimelineToFile(testName, pretty: true); }, timeout: Timeout.none); }