#include "cc/metrics/scroll_jank_v4_histogram_emitter.h"
#include <memory>
#include <utility>
#include "base/test/metrics/histogram_tester.h"
#include "cc/metrics/scroll_jank_v4_result.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cc {
namespace {
constexpr JankReasonArray<int> MakeMissedVsyncCounts(
std::initializer_list<std::pair<JankReason, int>> values) {
JankReasonArray<int> result = {};
for (const auto& [reason, missed_vsyncs] : values) {
result[static_cast<int>(reason)] += missed_vsyncs;
}
return result;
}
constexpr JankReasonArray<int> kNonJankyFrame = {};
void ExpectNoScrollJankHistograms(
const base::HistogramTester& histogram_tester) {
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
}
class ScrollJankV4HistogramEmitterTest : public testing::Test {
public:
void SetUp() override {
histogram_emitter_ = std::make_unique<ScrollJankV4HistogramEmitter>();
}
void TearDown() override { histogram_emitter_ = nullptr; }
protected:
std::unique_ptr<ScrollJankV4HistogramEmitter> histogram_emitter_;
};
TEST_F(ScrollJankV4HistogramEmitterTest,
EmitsFixedWindowHistogramsEvery64Frames) {
{
base::HistogramTester histogram_tester;
for (int i = 1; i <= 10; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
{JankReason::kMissedVsyncDuringFastScroll, 2},
{JankReason::kMissedVsyncAtStartOfFling, 3},
{JankReason::kMissedVsyncDuringFling, 4},
}));
for (int i = 12; i <= 20; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 21; i <= 22; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
}));
}
for (int i = 23; i <= 30; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 31; i <= 33; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFastScroll, 1},
}));
}
for (int i = 34; i <= 40; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 41; i <= 44; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncAtStartOfFling, 1},
}));
}
for (int i = 45; i <= 50; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 51; i <= 55; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFling, 1},
}));
}
for (int i = 56; i <= 64; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow",
15 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
3 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
4 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
5 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
6 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow",
4 + 1 + 2 + 3 + 4 + 5 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 4 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
{
base::HistogramTester histogram_tester;
for (int i = 1; i <= 63; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0, 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
}
TEST_F(ScrollJankV4HistogramEmitterTest,
EmitsPerScrollHistogramsAtEndOfScroll) {
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
{JankReason::kMissedVsyncDuringFastScroll, 2},
{JankReason::kMissedVsyncAtStartOfFling, 3},
{JankReason::kMissedVsyncDuringFling, 4},
}));
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
}));
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFastScroll, 1},
}));
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncAtStartOfFling, 1},
}));
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFling, 1},
}));
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 5 * 100 / 7, 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
for (int i = 1; i <= 10; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0, 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_emitter_->OnScrollStarted();
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFastScroll, 4},
{JankReason::kMissedVsyncDuringFling, 2},
}));
histogram_emitter_->OnFrameWithScrollUpdates(
kNonJankyFrame);
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
delete histogram_emitter_.release();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 1 * 100 / 3, 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
}
A combined scenario which tests that the histogram emitter emits both fixed
window and per-scroll UMA histograms. This test also verifies that the emission
of fixed window and per-scroll histograms is independent (e.g. a scroll ending
in the middle of a fixed window shouldn't affect the fixed window calculation
and vice versa).
Presented frame: :1 33:34 65:66 97:98 129:
Fixed windows: |<-------window 1------>|<-------window 2------>|
Scrolls: |<scroll 1->|<------scroll 2------->|<scroll 3->|
Delayed frames: : 1 : 2 : 4 : 8 :
*/
TEST_F(ScrollJankV4HistogramEmitterTest,
EmitsBothFixedWindowAndPerScrollHistogramsIndependently) {
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int i = 1; i <= 10; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
{JankReason::kMissedVsyncDuringFastScroll, 2},
{JankReason::kMissedVsyncAtStartOfFling, 3},
{JankReason::kMissedVsyncDuringFling, 4},
}));
for (int i = 12; i <= 33; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll",
1 * 100 / 33 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int i = 34; i <= 50; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 51; i <= 52; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 1},
}));
}
for (int i = 53; i <= 64; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow",
3 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
3 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
1 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
1 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
1 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow",
4 + 2 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 4 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
{
base::HistogramTester histogram_tester;
for (int i = 66; i <= 80; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 81; i <= 84; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncDuringFastScroll, 17},
}));
}
for (int i = 85; i <= 97; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll",
6 * 100 / 64 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int i = 98; i <= 110; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
for (int i = 111; i <= 118; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts({
{JankReason::kMissedVsyncAtStartOfFling, 19},
}));
}
for (int i = 119; i <= 128; i++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow",
12 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
4 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
8 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0, 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow",
4 * 17 + 8 * 19 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow",
19 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll",
8 * 100 / 32 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
}
TEST_F(ScrollJankV4HistogramEmitterTest,
FramesWhichDoNotCountTowardsHistogramFrameCount) {
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int frame = 1; frame <= 10; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
kNonJankyFrame, false);
for (int frame = 11; frame <= 20; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
kNonJankyFrame, false);
histogram_emitter_->OnFrameWithScrollUpdates(MakeMissedVsyncCounts(
{{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 2}}));
for (int frame = 22; frame <= 30; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts({{JankReason::kMissedVsyncDuringFastScroll, 3}}),
false);
for (int frame = 31; frame <= 40; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts({{JankReason::kMissedVsyncAtStartOfFling, 5}}),
false);
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts({{JankReason::kMissedVsyncDuringFling, 4}}));
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll",
3 * 100 / 41 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int frame = 42; frame <= 50; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts(
{{JankReason::kMissedVsyncDuringFastScroll, 1000}}),
false);
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollEnded();
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0, 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow", 0);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 0);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnScrollStarted();
for (int frame = 51; frame <= 60; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts(
{{JankReason::kMissedVsyncDueToDeceleratingInputFrameDelivery, 8}}),
false);
histogram_emitter_->OnFrameWithScrollUpdates(
kNonJankyFrame,
false);
histogram_emitter_->OnFrameWithScrollUpdates(
MakeMissedVsyncCounts({{JankReason::kMissedVsyncDuringFastScroll, 9}}),
false);
histogram_emitter_->OnFrameWithScrollUpdates(
kNonJankyFrame,
false);
for (int frame = 61; frame <= 64; frame++) {
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
}
ExpectNoScrollJankHistograms(histogram_tester);
}
{
base::HistogramTester histogram_tester;
histogram_emitter_->OnFrameWithScrollUpdates(kNonJankyFrame);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow",
4 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDueToDeceleratingInputFrameDelivery",
2 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFastScroll",
2 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncAtStartOfFling",
1 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.DelayedFramesPercentage4.FixedWindow."
"MissedVsyncDuringFling",
1 * 100 / 64 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsSum4.FixedWindow",
2 + 3 + 4 + 5 + 8 + 9 , 1);
histogram_tester.ExpectUniqueSample(
"Event.ScrollJank.MissedVsyncsMax4.FixedWindow", 9 , 1);
histogram_tester.ExpectTotalCount(
"Event.ScrollJank.DelayedFramesPercentage4.PerScroll", 0);
}
}
}