// Copyright 2016 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:convert' show JSON; import 'package:test/test.dart'; import 'package:flutter_driver/src/common.dart'; import 'package:flutter_driver/flutter_driver.dart'; void main() { group('TimelineSummary', () { TimelineSummary summarize(List<Map<String, dynamic>> testEvents) { return new TimelineSummary.summarize(new Timeline.fromJson(<String, dynamic>{ 'traceEvents': testEvents, })); } Map<String, dynamic> begin(int timeStamp) => <String, dynamic>{ 'name': 'Engine::BeginFrame', 'ph': 'B', 'ts': timeStamp }; Map<String, dynamic> end(int timeStamp) => <String, dynamic>{ 'name': 'Engine::BeginFrame', 'ph': 'E', 'ts': timeStamp }; group('frame_count', () { test('counts frames', () { expect( summarize([ begin(1000), end(2000), begin(3000), end(5000), ]).countFrames(), 2 ); }); }); group('average_frame_build_time_millis', () { test('returns null when there is no data', () { expect(summarize([]).computeAverageFrameBuildTimeMillis(), isNull); }); test('computes average frame build time in milliseconds', () { expect( summarize([ begin(1000), end(2000), begin(3000), end(5000), ]).computeAverageFrameBuildTimeMillis(), 1.5 ); }); test('skips leading "end" events', () { expect( summarize([ end(1000), begin(2000), end(4000), ]).computeAverageFrameBuildTimeMillis(), 2 ); }); test('skips trailing "begin" events', () { expect( summarize([ begin(2000), end(4000), begin(5000), ]).computeAverageFrameBuildTimeMillis(), 2 ); }); }); group('computeMissedFrameBuildBudgetCount', () { test('computes the number of missed build budgets', () { TimelineSummary summary = summarize([ begin(1000), end(10000), begin(11000), end(12000), begin(13000), end(23000), ]); expect(summary.countFrames(), 3); expect(summary.computeMissedFrameBuildBudgetCount(), 2); }); }); group('summaryJson', () { test('computes and returns summary as JSON', () { expect( summarize([ begin(1000), end(10000), begin(11000), end(12000), begin(13000), end(24000), ]).summaryJson, { 'average_frame_build_time_millis': 7.0, 'missed_frame_build_budget_count': 2, 'frame_count': 3, 'frame_build_times': <int>[9000, 1000, 11000], } ); }); }); group('writeTimelineToFile', () { setUp(() { useMemoryFileSystemForTesting(); }); tearDown(() { restoreFileSystem(); }); test('writes timeline to JSON file', () async { await summarize([{'foo': 'bar'}]) .writeTimelineToFile('test', destinationDirectory: '/temp'); String written = await fs.file('/temp/test.timeline.json').readAsString(); expect(written, '{"traceEvents":[{"foo":"bar"}]}'); }); test('writes summary to JSON file', () async { await summarize([ begin(1000), end(10000), begin(11000), end(12000), begin(13000), end(24000), ]).writeSummaryToFile('test', destinationDirectory: '/temp'); String written = await fs.file('/temp/test.timeline_summary.json').readAsString(); expect(JSON.decode(written), { 'average_frame_build_time_millis': 7.0, 'missed_frame_build_budget_count': 2, 'frame_count': 3, 'frame_build_times': <int>[9000, 1000, 11000], }); }); }); }); }