thread_metrics_unittest.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2018 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 "components/scheduling_metrics/thread_metrics.h"
  5. #include "base/task/sequence_manager/test/fake_task.h"
  6. #include "base/test/metrics/histogram_tester.h"
  7. #include "base/time/time_override.h"
  8. #include "testing/gmock/include/gmock/gmock.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. using base::sequence_manager::TaskQueue;
  11. namespace scheduling_metrics {
  12. namespace {
  13. using base::sequence_manager::FakeTask;
  14. using base::sequence_manager::FakeTaskTiming;
  15. base::TimeTicks Seconds(int seconds) {
  16. return base::TimeTicks() + base::Seconds(seconds);
  17. }
  18. base::ThreadTicks ThreadSeconds(int seconds) {
  19. return base::ThreadTicks() + base::Seconds(seconds);
  20. }
  21. } // namespace
  22. TEST(MetricsHelperTest, TaskDurationPerThreadType) {
  23. base::HistogramTester histogram_tester;
  24. ThreadMetrics main_thread_metrics(ThreadType::kRendererMainThread,
  25. false /* has_cpu_timing_for_each_task */);
  26. ThreadMetrics compositor_metrics(ThreadType::kRendererCompositorThread,
  27. false /* has_cpu_timing_for_each_task */);
  28. ThreadMetrics worker_metrics(ThreadType::kRendererOtherBlinkThread,
  29. false /* has_cpu_timing_for_each_task */);
  30. main_thread_metrics.RecordTaskMetrics(
  31. FakeTask(), FakeTaskTiming(Seconds(10), Seconds(50), ThreadSeconds(0),
  32. ThreadSeconds(15)));
  33. compositor_metrics.RecordTaskMetrics(
  34. FakeTask(), FakeTaskTiming(Seconds(10), Seconds(80), ThreadSeconds(0),
  35. ThreadSeconds(5)));
  36. compositor_metrics.RecordTaskMetrics(
  37. FakeTask(), FakeTaskTiming(Seconds(100), Seconds(200)));
  38. worker_metrics.RecordTaskMetrics(
  39. FakeTask(), FakeTaskTiming(Seconds(10), Seconds(125), ThreadSeconds(0),
  40. ThreadSeconds(25)));
  41. EXPECT_THAT(
  42. histogram_tester.GetAllSamples(
  43. "Scheduler.Experimental.WallTimePerThread"),
  44. testing::UnorderedElementsAre(
  45. base::Bucket(static_cast<int>(ThreadType::kRendererMainThread), 40),
  46. base::Bucket(static_cast<int>(ThreadType::kRendererCompositorThread),
  47. 170),
  48. base::Bucket(static_cast<int>(ThreadType::kRendererOtherBlinkThread),
  49. 115)));
  50. EXPECT_THAT(
  51. histogram_tester.GetAllSamples("Scheduler.Experimental.CPUTimePerThread"),
  52. testing::UnorderedElementsAre(
  53. base::Bucket(static_cast<int>(ThreadType::kRendererMainThread), 15),
  54. base::Bucket(static_cast<int>(ThreadType::kRendererCompositorThread),
  55. 5),
  56. base::Bucket(static_cast<int>(ThreadType::kRendererOtherBlinkThread),
  57. 25)));
  58. }
  59. TEST(MetricsHelperTest, TrackedCPUTimeMetrics) {
  60. base::HistogramTester histogram_tester;
  61. base::subtle::ScopedTimeClockOverrides time_override(
  62. []() { return base::Time(); }, []() { return Seconds(1); },
  63. []() { return ThreadSeconds(1); });
  64. ThreadMetrics main_thread_metrics(ThreadType::kRendererMainThread,
  65. true /* has_cpu_timing_for_each_task */);
  66. main_thread_metrics.RecordTaskMetrics(
  67. FakeTask(), FakeTaskTiming(Seconds(10), Seconds(50), ThreadSeconds(5),
  68. ThreadSeconds(15)));
  69. main_thread_metrics.RecordTaskMetrics(
  70. FakeTask(), FakeTaskTiming(Seconds(10), Seconds(50), ThreadSeconds(20),
  71. ThreadSeconds(25)));
  72. EXPECT_THAT(histogram_tester.GetAllSamples(
  73. "Scheduler.Experimental.CPUTimePerThread.Tracked"),
  74. testing::UnorderedElementsAre(base::Bucket(
  75. static_cast<int>(ThreadType::kRendererMainThread), 15)));
  76. // 9 = 4 seconds before task 1 and 5 seconds between tasks 1 and 2.
  77. EXPECT_THAT(histogram_tester.GetAllSamples(
  78. "Scheduler.Experimental.CPUTimePerThread.Untracked"),
  79. testing::UnorderedElementsAre(base::Bucket(
  80. static_cast<int>(ThreadType::kRendererMainThread), 9)));
  81. }
  82. } // namespace scheduling_metrics