in flutter-idea/testSrc/unit/io/flutter/perf/FlutterWidgetPerfTest.java [342:480]
public void testFileStatsCalculation() throws InterruptedException, ExecutionException {
final MockWidgetPerfProvider widgetPerfProvider = new MockWidgetPerfProvider();
final Map<String, MockEditorPerfModel> perfModels = new HashMap<>();
final FlutterWidgetPerf flutterWidgetPerf = new FlutterWidgetPerf(
true,
widgetPerfProvider,
(TextEditor textEditor) -> {
final MockEditorPerfModel model = new MockEditorPerfModel(textEditor);
perfModels.put(textEditor.getName(), model);
return model;
},
FakeFileLocationMapper::new
);
widgetPerfProvider.simulateWidgetPerfEvent(
PerfReportKind.rebuild,
"{\"startTime\":1000,\"events\":[1,1,2,1,3,1,4,1,6,1,10,4,11,4,12,4,13,1,14,1,95,1,96,1,97,6,100,6,102,6,104,6,105,1,106,1],\"newLocations\":{\"/sample/project/main.dart\":[1,11,14,2,18,16,3,23,17,4,40,16,6,46,16,10,69,9,11,70,9,12,71,18,13,41,19,14,42,20,95,51,58],\"/sample/project/clock.dart\":[96,33,12,97,52,12,100,53,16,102,54,14,104,55,17,105,34,15,106,35,16]}}"
);
// Simulate 60fps for 2 seconds.
for (int frame = 1; frame <= 120; frame++) {
final long startTime = 1000 + frame * 1000 * 1000 / 60;
widgetPerfProvider.simulateWidgetPerfEvent(
PerfReportKind.rebuild, "{\"startTime\":" +
startTime +
",\"events\":[95,1,96,1,97,6,100,6,102,6,104,6,105,1,106,1]}");
}
final Set<TextEditor> textEditors = new HashSet<>();
final TextEditor clockTextEditor = new MockTextEditor("/sample/project/clock.dart");
textEditors.add(clockTextEditor);
flutterWidgetPerf.showFor(textEditors);
assertEquals(perfModels.size(), 1);
MockEditorPerfModel clockModel = perfModels.get("/sample/project/clock.dart");
assertEquals(clockModel.getTextEditor(), clockTextEditor);
FilePerfInfo stats = clockModel.getStatsFuture().get();
// Stats for the first response are rebuilds only
assertEquals(1620, stats.getTotalValue(PerfMetric.pastSecond));
List<TextRange> locations = Lists.newArrayList(stats.getLocations());
assertEquals(7, locations.size());
final TextRange textRange = getTextRange("/sample/project/clock.dart", 52, 12);
List<SummaryStats> rangeStats = Lists.newArrayList(stats.getRangeStats(textRange));
assertEquals(1, rangeStats.size());
assertEquals(PerfReportKind.rebuild, rangeStats.get(0).getKind());
assertEquals(360, rangeStats.get(0).getValue(PerfMetric.pastSecond));
assertEquals(726, rangeStats.get(0).getValue(PerfMetric.total));
assertEquals("Widget:52:12", rangeStats.get(0).getDescription());
rangeStats = Lists.newArrayList(stats.getRangeStats(getTextRange("/sample/project/clock.dart", 34, 15)));
assertEquals(1, rangeStats.size());
assertEquals(PerfReportKind.rebuild, rangeStats.get(0).getKind());
assertEquals(60, rangeStats.get(0).getValue(PerfMetric.pastSecond));
assertEquals(121, rangeStats.get(0).getValue(PerfMetric.total));
assertEquals("Widget:34:15", rangeStats.get(0).getDescription());
clockModel.markAppIdle();
assertEquals(0, stats.getTotalValue(PerfMetric.pastSecond));
rangeStats = Lists.newArrayList(stats.getRangeStats(locations.get(4)));
assertEquals(0, rangeStats.get(0).getValue(PerfMetric.pastSecond));
// Total is not impacted.
assertEquals(121, rangeStats.get(0).getValue(PerfMetric.total));
rangeStats = Lists.newArrayList(stats.getRangeStats(textRange));
assertEquals(1, rangeStats.size());
assertEquals(PerfReportKind.rebuild, rangeStats.get(0).getKind());
assertEquals(0, rangeStats.get(0).getValue(PerfMetric.pastSecond));
assertEquals(726, rangeStats.get(0).getValue(PerfMetric.total));
assertEquals("Widget:52:12", rangeStats.get(0).getDescription());
final TextEditor mainTextEditor = new MockTextEditor("/sample/project/main.dart");
textEditors.add(mainTextEditor);
flutterWidgetPerf.clearModels();
// Add events with both rebuilds and repaints.
widgetPerfProvider.simulateWidgetPerfEvent(PerfReportKind.rebuild,
"{\"startTime\":19687239,\"events\":[95,1,96,1,97,6,100,6,102,6,104,6,105,1,106,1]}");
widgetPerfProvider.simulateWidgetPerfEvent(PerfReportKind.repaint,
"{\"startTime\":19687239,\"events\":[95,1,96,1,97,6,100,6,102,6,104,6,105,1,106,1]}");
flutterWidgetPerf.showFor(textEditors);
assertEquals(2, perfModels.size());
clockModel = perfModels.get("/sample/project/clock.dart");
final MockEditorPerfModel mainModel = perfModels.get("/sample/project/main.dart");
assert mainModel != null;
final FilePerfInfo mainStats = mainModel.getStatsFuture().get();
assert clockModel != null;
stats = clockModel.getStatsFuture().get();
// We have new fake data for the files so the count in the past second is
// back up from zero
assertEquals(2, mainStats.getTotalValue(PerfMetric.pastSecond));
assertEquals(142, mainStats.getTotalValue(PerfMetric.total));
assertEquals(3321, stats.getTotalValue(PerfMetric.total));
locations = Lists.newArrayList(stats.getLocations());
assertEquals(7, locations.size());
rangeStats = Lists.newArrayList(stats.getRangeStats(getTextRange("/sample/project/clock.dart", 52, 12)));
assertEquals(2, rangeStats.size());
assertEquals(PerfReportKind.repaint, rangeStats.get(0).getKind());
assertEquals(6, rangeStats.get(0).getValue(PerfMetric.pastSecond));
assertEquals(6, rangeStats.get(0).getValue(PerfMetric.total));
assertEquals("Widget:52:12", rangeStats.get(0).getDescription());
assertEquals(PerfReportKind.rebuild, rangeStats.get(1).getKind());
assertEquals(6, rangeStats.get(1).getValue(PerfMetric.pastSecond));
assertEquals(732, rangeStats.get(1).getValue(PerfMetric.total));
assertEquals("Widget:52:12", rangeStats.get(1).getDescription());
rangeStats = Lists.newArrayList(stats.getRangeStats(getTextRange("/sample/project/clock.dart", 33, 12)));
assertEquals(2, rangeStats.size());
assertEquals(PerfReportKind.repaint, rangeStats.get(0).getKind());
assertEquals(1, rangeStats.get(0).getValue(PerfMetric.pastSecond));
assertEquals(1, rangeStats.get(0).getValue(PerfMetric.total));
assertEquals("Widget:33:12", rangeStats.get(0).getDescription());
assertEquals(PerfReportKind.rebuild, rangeStats.get(1).getKind());
assertEquals(1, rangeStats.get(1).getValue(PerfMetric.pastSecond));
assertEquals(122, rangeStats.get(1).getValue(PerfMetric.total));
assertEquals("Widget:33:12", rangeStats.get(1).getDescription());
assertFalse(clockModel.isDisposed);
assertFalse(mainModel.isDisposed);
flutterWidgetPerf.showFor(new HashSet<>());
assertTrue(clockModel.isDisposed);
assertTrue(mainModel.isDisposed);
flutterWidgetPerf.dispose();
}