Unverified Commit f7b2d6e7 authored by Ian Hickson's avatar Ian Hickson Committed by GitHub

Try to make this test less flaky. (#13254)

parent c358898a
...@@ -10,6 +10,7 @@ import 'package:flutter_driver/driver_extension.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter_driver/driver_extension.dart';
void main() { void main() {
enableFlutterDriverExtension(); enableFlutterDriverExtension();
debugPrint('Application starting...');
runApp(new MyApp()); runApp(new MyApp());
} }
...@@ -40,37 +41,42 @@ Widget builds: $_widgetBuilds'''; ...@@ -40,37 +41,42 @@ Widget builds: $_widgetBuilds''';
Future<Null> _nextState() async { Future<Null> _nextState() async {
switch (_state) { switch (_state) {
case FrameState.initial: case FrameState.initial:
_widgetBuilds = 0; debugPrint('Starting .5x speed test...');
_summary = 'Producing texture frames at .5x speed...'; _widgetBuilds = 0;
_state = FrameState.slow; _summary = 'Producing texture frames at .5x speed...';
_icon = Icons.stop; _state = FrameState.slow;
channel.invokeMethod('start', _flutterFrameRate ~/ 2); _icon = Icons.stop;
break; channel.invokeMethod('start', _flutterFrameRate ~/ 2);
case FrameState.slow: break;
await channel.invokeMethod('stop'); case FrameState.slow:
await _summarizeStats(); debugPrint('Stopping .5x speed test...');
_icon = Icons.fast_forward; await channel.invokeMethod('stop');
_state = FrameState.afterSlow; await _summarizeStats();
break; _icon = Icons.fast_forward;
case FrameState.afterSlow: _state = FrameState.afterSlow;
_widgetBuilds = 0; break;
_summary = 'Producing texture frames at 2x speed...'; case FrameState.afterSlow:
_state = FrameState.fast; debugPrint('Starting 2x speed test...');
_icon = Icons.stop; _widgetBuilds = 0;
channel.invokeMethod('start', (_flutterFrameRate * 2).toInt()); _summary = 'Producing texture frames at 2x speed...';
break; _state = FrameState.fast;
case FrameState.fast: _icon = Icons.stop;
await channel.invokeMethod('stop'); channel.invokeMethod('start', (_flutterFrameRate * 2).toInt());
await _summarizeStats(); break;
_state = FrameState.afterFast; case FrameState.fast:
_icon = Icons.replay; debugPrint('Stopping 2x speed test...');
break; await channel.invokeMethod('stop');
case FrameState.afterFast: await _summarizeStats();
_summary = 'Press play to start again'; _state = FrameState.afterFast;
_state = FrameState.initial; _icon = Icons.replay;
_icon = Icons.play_arrow; break;
break; case FrameState.afterFast:
debugPrint('Test complete.');
_summary = 'Press play to start again';
_state = FrameState.initial;
_icon = Icons.play_arrow;
break;
} }
setState(() {}); setState(() {});
} }
...@@ -81,26 +87,34 @@ Widget builds: $_widgetBuilds'''; ...@@ -81,26 +87,34 @@ Widget builds: $_widgetBuilds''';
_calibrate(); _calibrate();
} }
static const int calibrationTickCount = 600;
/// Measures Flutter's frame rate. /// Measures Flutter's frame rate.
Future<Null> _calibrate() async { Future<Null> _calibrate() async {
await new Future<Null>.delayed(const Duration(milliseconds: 200)); debugPrint('Awaiting calm (3 second pause)...');
await new Future<Null>.delayed(const Duration(milliseconds: 3000));
debugPrint('Calibrating...');
DateTime startTime; DateTime startTime;
int tickCount = 0; int tickCount = 0;
Ticker ticker; Ticker ticker;
ticker = createTicker((Duration _) { ticker = createTicker((Duration time) {
tickCount++; tickCount += 1;
if (tickCount == 120) { if (tickCount == calibrationTickCount) { // about 10 seconds
final Duration elapsed = new DateTime.now().difference(startTime); final Duration elapsed = new DateTime.now().difference(startTime);
ticker.stop(); ticker.stop();
ticker.dispose(); ticker.dispose();
setState(() { setState(() {
_flutterFrameRate = tickCount * 1000 / elapsed.inMilliseconds; _flutterFrameRate = tickCount * 1000 / elapsed.inMilliseconds;
debugPrint('Calibrated: frame rate ${_flutterFrameRate.toStringAsFixed(1)}fps.');
_summary = ''' _summary = '''
Flutter frame rate is ${_flutterFrameRate.toStringAsFixed(1)}fps. Flutter frame rate is ${_flutterFrameRate.toStringAsFixed(1)}fps.
Press play to produce texture frames.'''; Press play to produce texture frames.''';
_icon = Icons.play_arrow; _icon = Icons.play_arrow;
_state = FrameState.initial; _state = FrameState.initial;
}); });
} else {
if ((tickCount % (calibrationTickCount ~/ 20)) == 0)
debugPrint('Calibrating... ${(100.0 * tickCount / calibrationTickCount).floor()}%');
} }
}); });
ticker.start(); ticker.start();
...@@ -113,7 +127,7 @@ Press play to produce texture frames.'''; ...@@ -113,7 +127,7 @@ Press play to produce texture frames.''';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_widgetBuilds++; _widgetBuilds += 1;
return new MaterialApp( return new MaterialApp(
home: new Scaffold( home: new Scaffold(
body: new Center( body: new Center(
......
...@@ -8,7 +8,7 @@ import 'package:test/test.dart'; ...@@ -8,7 +8,7 @@ import 'package:test/test.dart';
final RegExp calibrationRegExp = new RegExp('Flutter frame rate is (.*)fps'); final RegExp calibrationRegExp = new RegExp('Flutter frame rate is (.*)fps');
final RegExp statsRegExp = new RegExp('Produced: (.*)fps\nConsumed: (.*)fps\nWidget builds: (.*)'); final RegExp statsRegExp = new RegExp('Produced: (.*)fps\nConsumed: (.*)fps\nWidget builds: (.*)');
const Duration samplingTime = const Duration(seconds: 3); const Duration samplingTime = const Duration(seconds: 8);
Future<Null> main() async { Future<Null> main() async {
group('texture suite', () { group('texture suite', () {
...@@ -28,7 +28,7 @@ Future<Null> main() async { ...@@ -28,7 +28,7 @@ Future<Null> main() async {
final SerializableFinder summary = find.byValueKey('summary'); final SerializableFinder summary = find.byValueKey('summary');
// Wait for calibration to complete and fab to appear. // Wait for calibration to complete and fab to appear.
await driver.waitFor(fab, timeout: const Duration(seconds: 10)); await driver.waitFor(fab, timeout: const Duration(seconds: 40));
final String calibrationResult = await driver.getText(summary); final String calibrationResult = await driver.getText(summary);
final Match matchCalibration = calibrationRegExp.matchAsPrefix(calibrationResult); final Match matchCalibration = calibrationRegExp.matchAsPrefix(calibrationResult);
...@@ -58,7 +58,7 @@ Future<Null> main() async { ...@@ -58,7 +58,7 @@ Future<Null> main() async {
expect(double.parse(matchFast.group(1)), closeTo(flutterFrameRate * 2.0, 5.0)); expect(double.parse(matchFast.group(1)), closeTo(flutterFrameRate * 2.0, 5.0));
expect(double.parse(matchFast.group(2)), closeTo(flutterFrameRate, 10.0)); expect(double.parse(matchFast.group(2)), closeTo(flutterFrameRate, 10.0));
expect(int.parse(matchFast.group(3)), 1); expect(int.parse(matchFast.group(3)), 1);
}); }, timeout: const Timeout(const Duration(minutes: 1)));
tearDownAll(() async { tearDownAll(() async {
driver?.close(); driver?.close();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment