blob: 23d9bd5ad1f2e2d4f4399414376a40dde4f39136 [file] [log] [blame]
// Copyright (c) 2021 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.
#include "base/android/jank_metric_uma_recorder.h"
#include <jni.h>
#include <cstddef>
#include <cstdint>
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/metrics/histogram.h"
#include "base/test/metrics/histogram_tester.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::ElementsAre;
namespace base {
namespace android {
namespace {
jlongArray GenerateJavaLongArray(JNIEnv* env,
const int64_t long_array[],
const size_t array_length) {
ScopedJavaLocalRef<jlongArray> java_long_array =
ToJavaLongArray(env, long_array, array_length);
return java_long_array.Release();
}
const int64_t kTimestampsNs[] = {
100'000'000, 116'000'000, 132'000'000, 148'000'000,
164'000'000, 180'000'000, 196'000'000, 212'000'000,
};
// Durations are received in nanoseconds, but are recorded to UMA in
// milliseconds.
const int64_t kDurations[] = {
1'000'000, // 1ms
2'000'000, // 2ms
30'000'000, // 30ms
10'000'000, // 10ms
60'000'000, // 60ms
1'000'000, // 1ms
1'000'000, // 1ms
20'000'000, // 20ms
};
const size_t kDurationsLen = base::size(kDurations);
static_assert(base::size(kDurations) == base::size(kTimestampsNs),
"Length of timestamps and durations should be equal.");
// Jank bursts are calculated based on durations.
const int64_t kJankBursts[] = {
100'000'000, // 100ms
20'000'000, // 20ms
};
const size_t kJankBurstsLen = base::size(kJankBursts);
} // namespace
TEST(JankMetricUMARecorder, TestUMARecording) {
HistogramTester histogram_tester;
JNIEnv* env = AttachCurrentThread();
jstring java_scenario_name =
ConvertUTF8ToJavaString(env, "PeriodicReporting").Release();
jlongArray java_timestamps =
GenerateJavaLongArray(env, kTimestampsNs, kDurationsLen);
jlongArray java_durations =
GenerateJavaLongArray(env, kDurations, kDurationsLen);
jlongArray java_jank_bursts =
GenerateJavaLongArray(env, kJankBursts, kJankBurstsLen);
RecordJankMetrics(
env,
/* java_scenario_name= */
base::android::JavaParamRef<jstring>(env, java_scenario_name),
/* java_timestamps_ns= */
base::android::JavaParamRef<jlongArray>(env, java_timestamps),
/* java_durations_ns= */
base::android::JavaParamRef<jlongArray>(env, java_durations),
/* java_jank_bursts_ns=*/
base::android::JavaParamRef<jlongArray>(env, java_jank_bursts),
/* java_missed_frames = */ 2);
EXPECT_THAT(histogram_tester.GetAllSamples(
"Android.Jank.FrameDuration.PeriodicReporting"),
ElementsAre(Bucket(1, 3), Bucket(2, 1), Bucket(10, 1),
Bucket(20, 1), Bucket(29, 1), Bucket(57, 1)));
EXPECT_THAT(histogram_tester.GetAllSamples(
"Android.Jank.JankBursts.PeriodicReporting"),
ElementsAre(Bucket(20, 1), Bucket(96, 1)));
histogram_tester.ExpectUniqueSample(
"Android.Jank.MissedFrames.PeriodicReporting", 2, 1);
}
} // namespace android
} // namespace base