jank_metric_uma_recorder_unittest.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright (c) 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/android/jank_metric_uma_recorder.h"
  5. #include <jni.h>
  6. #include <cstddef>
  7. #include <cstdint>
  8. #include "base/android/jni_android.h"
  9. #include "base/android/jni_array.h"
  10. #include "base/android/jni_string.h"
  11. #include "base/metrics/histogram.h"
  12. #include "base/test/metrics/histogram_tester.h"
  13. #include "testing/gmock/include/gmock/gmock.h"
  14. #include "testing/gtest/include/gtest/gtest.h"
  15. using ::testing::ElementsAre;
  16. namespace base {
  17. namespace android {
  18. namespace {
  19. jlongArray GenerateJavaLongArray(JNIEnv* env,
  20. const int64_t long_array[],
  21. const size_t array_length) {
  22. ScopedJavaLocalRef<jlongArray> java_long_array =
  23. ToJavaLongArray(env, long_array, array_length);
  24. return java_long_array.Release();
  25. }
  26. const int64_t kTimestampsNs[] = {
  27. 100'000'000, 116'000'000, 132'000'000, 148'000'000,
  28. 164'000'000, 180'000'000, 196'000'000, 212'000'000,
  29. };
  30. // Durations are received in nanoseconds, but are recorded to UMA in
  31. // milliseconds.
  32. const int64_t kDurations[] = {
  33. 1'000'000, // 1ms
  34. 2'000'000, // 2ms
  35. 30'000'000, // 30ms
  36. 10'000'000, // 10ms
  37. 60'000'000, // 60ms
  38. 1'000'000, // 1ms
  39. 1'000'000, // 1ms
  40. 20'000'000, // 20ms
  41. };
  42. const size_t kDurationsLen = std::size(kDurations);
  43. static_assert(std::size(kDurations) == std::size(kTimestampsNs),
  44. "Length of timestamps and durations should be equal.");
  45. // Jank bursts are calculated based on durations.
  46. const int64_t kJankBursts[] = {
  47. 100'000'000, // 100ms
  48. 20'000'000, // 20ms
  49. };
  50. const size_t kJankBurstsLen = std::size(kJankBursts);
  51. } // namespace
  52. TEST(JankMetricUMARecorder, TestUMARecording) {
  53. HistogramTester histogram_tester;
  54. JNIEnv* env = AttachCurrentThread();
  55. jstring java_scenario_name =
  56. ConvertUTF8ToJavaString(env, "PeriodicReporting").Release();
  57. jlongArray java_timestamps =
  58. GenerateJavaLongArray(env, kTimestampsNs, kDurationsLen);
  59. jlongArray java_durations =
  60. GenerateJavaLongArray(env, kDurations, kDurationsLen);
  61. jlongArray java_jank_bursts =
  62. GenerateJavaLongArray(env, kJankBursts, kJankBurstsLen);
  63. RecordJankMetrics(
  64. env,
  65. /* java_scenario_name= */
  66. base::android::JavaParamRef<jstring>(env, java_scenario_name),
  67. /* java_timestamps_ns= */
  68. base::android::JavaParamRef<jlongArray>(env, java_timestamps),
  69. /* java_durations_ns= */
  70. base::android::JavaParamRef<jlongArray>(env, java_durations),
  71. /* java_jank_bursts_ns=*/
  72. base::android::JavaParamRef<jlongArray>(env, java_jank_bursts),
  73. /* java_missed_frames = */ 2);
  74. EXPECT_THAT(histogram_tester.GetAllSamples(
  75. "Android.Jank.FrameDuration.PeriodicReporting"),
  76. ElementsAre(Bucket(1, 3), Bucket(2, 1), Bucket(10, 1),
  77. Bucket(20, 1), Bucket(29, 1), Bucket(57, 1)));
  78. EXPECT_THAT(histogram_tester.GetAllSamples(
  79. "Android.Jank.JankBursts.PeriodicReporting"),
  80. ElementsAre(Bucket(20, 1), Bucket(96, 1)));
  81. histogram_tester.ExpectUniqueSample(
  82. "Android.Jank.MissedFrames.PeriodicReporting", 2, 1);
  83. }
  84. } // namespace android
  85. } // namespace base