// Copyright 2017 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:async'; import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; final RegExp calibrationRegExp = new RegExp('Flutter frame rate is (.*)fps'); final RegExp statsRegExp = new RegExp('Produced: (.*)fps\nConsumed: (.*)fps\nWidget builds: (.*)'); const Duration samplingTime = const Duration(seconds: 8); Future<Null> main() async { group('texture suite', () { FlutterDriver driver; setUpAll(() async { driver = await FlutterDriver.connect(); }); // This test verifies that we can consume texture frames at a rate // close to the minimum of the rate at which they are produced // and Flutter's frame rate. It also verifies that we do not rebuild the // Widget tree during texture consumption. The test starts by measuring // Flutter's frame rate. test('texture rendering', () async { final SerializableFinder fab = find.byValueKey('fab'); final SerializableFinder summary = find.byValueKey('summary'); // Wait for calibration to complete and fab to appear. await driver.waitFor(fab, timeout: const Duration(seconds: 40)); final String calibrationResult = await driver.getText(summary); final Match matchCalibration = calibrationRegExp.matchAsPrefix(calibrationResult); expect(matchCalibration, isNotNull); final double flutterFrameRate = double.parse(matchCalibration.group(1)); // Texture frame stats at 0.5x Flutter frame rate await driver.tap(fab); await new Future<Null>.delayed(samplingTime); await driver.tap(fab); final String statsSlow = await driver.getText(summary); final Match matchSlow = statsRegExp.matchAsPrefix(statsSlow); expect(matchSlow, isNotNull); expect(double.parse(matchSlow.group(1)), closeTo(flutterFrameRate / 2.0, 5.0)); expect(double.parse(matchSlow.group(2)), closeTo(flutterFrameRate / 2.0, 5.0)); expect(int.parse(matchSlow.group(3)), 1); // Texture frame stats at 2.0x Flutter frame rate await driver.tap(fab); await new Future<Null>.delayed(samplingTime); await driver.tap(fab); final String statsFast = await driver.getText(summary); final Match matchFast = statsRegExp.matchAsPrefix(statsFast); expect(matchFast, isNotNull); expect(double.parse(matchFast.group(1)), closeTo(flutterFrameRate * 2.0, 5.0)); expect(double.parse(matchFast.group(2)), closeTo(flutterFrameRate, 10.0)); expect(int.parse(matchFast.group(3)), 1); }, timeout: const Timeout(const Duration(minutes: 1))); tearDownAll(() async { driver?.close(); }); }); }