public void testFileStatsCalculation()

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();
  }