summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc358
1 files changed, 144 insertions, 214 deletions
diff --git a/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc b/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc
index c31f8cd57b9..435fd1a687d 100644
--- a/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc
+++ b/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc
@@ -6,19 +6,22 @@
#include <memory>
#include "base/macros.h"
-#include "base/test/histogram_tester.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "components/viz/test/ordered_simple_task_runner.h"
+#include "base/task/sequence_manager/test/fake_task.h"
+#include "base/task/sequence_manager/test/sequence_manager_for_test.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/page/launching_process_state.h"
-#include "third_party/blink/renderer/platform/scheduler/base/test/task_queue_manager_for_test.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h"
+#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
using base::sequence_manager::TaskQueue;
+using base::sequence_manager::FakeTask;
+using base::sequence_manager::FakeTaskTiming;
namespace blink {
namespace scheduler {
@@ -27,10 +30,9 @@ namespace {
class MainThreadSchedulerImplForTest : public MainThreadSchedulerImpl {
public:
MainThreadSchedulerImplForTest(
- std::unique_ptr<base::sequence_manager::TaskQueueManager>
- task_queue_manager,
+ std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager,
base::Optional<base::Time> initial_virtual_time)
- : MainThreadSchedulerImpl(std::move(task_queue_manager),
+ : MainThreadSchedulerImpl(std::move(sequence_manager),
initial_virtual_time){};
using MainThreadSchedulerImpl::SetCurrentUseCaseForTest;
@@ -44,17 +46,22 @@ using testing::UnorderedElementsAre;
class MainThreadMetricsHelperTest : public testing::Test {
public:
- MainThreadMetricsHelperTest() = default;
+ MainThreadMetricsHelperTest()
+ : task_environment_(
+ base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
+ base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED) {
+ // Null clock might trigger some assertions.
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ }
+
~MainThreadMetricsHelperTest() override = default;
void SetUp() override {
histogram_tester_.reset(new base::HistogramTester());
- clock_.Advance(base::TimeDelta::FromMilliseconds(1));
- mock_task_runner_ =
- base::MakeRefCounted<cc::OrderedSimpleTaskRunner>(&clock_, true);
scheduler_ = std::make_unique<MainThreadSchedulerImplForTest>(
- base::sequence_manager::TaskQueueManagerForTest::Create(
- nullptr, mock_task_runner_, &clock_),
+ base::sequence_manager::SequenceManagerForTest::Create(
+ nullptr, task_environment_.GetMainThreadTaskRunner(),
+ task_environment_.GetMockTickClock()),
base::nullopt);
metrics_helper_ = &scheduler_->main_thread_only().metrics_helper;
}
@@ -64,58 +71,62 @@ class MainThreadMetricsHelperTest : public testing::Test {
scheduler_.reset();
}
+ base::TimeTicks Now() {
+ return task_environment_.GetMockTickClock()->NowTicks();
+ }
+
+ void FastForwardTo(base::TimeTicks time) {
+ CHECK_LE(Now(), time);
+ task_environment_.FastForwardBy(time - Now());
+ }
+
void RunTask(MainThreadTaskQueue::QueueType queue_type,
base::TimeTicks start,
base::TimeDelta duration) {
- DCHECK_LE(clock_.NowTicks(), start);
- clock_.SetNowTicks(start + duration);
+ DCHECK_LE(Now(), start);
+ FastForwardTo(start + duration);
scoped_refptr<MainThreadTaskQueueForTest> queue;
if (queue_type != MainThreadTaskQueue::QueueType::kDetached) {
queue = scoped_refptr<MainThreadTaskQueueForTest>(
new MainThreadTaskQueueForTest(queue_type));
}
- // Pass an empty task for recording.
- TaskQueue::PostedTask posted_task(base::OnceClosure(), FROM_HERE);
- TaskQueue::Task task(std::move(posted_task), base::TimeTicks());
- metrics_helper_->RecordTaskMetrics(queue.get(), task, start,
- start + duration, base::nullopt);
+ metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(),
+ FakeTaskTiming(start, start + duration));
}
- void RunTask(FrameScheduler* scheduler,
+ void RunTask(FrameSchedulerImpl* scheduler,
base::TimeTicks start,
base::TimeDelta duration) {
- DCHECK_LE(clock_.NowTicks(), start);
- clock_.SetNowTicks(start + duration);
+ DCHECK_LE(Now(), start);
+ FastForwardTo(start + duration);
scoped_refptr<MainThreadTaskQueueForTest> queue(
new MainThreadTaskQueueForTest(QueueType::kDefault));
queue->SetFrameSchedulerForTest(scheduler);
- // Pass an empty task for recording.
- TaskQueue::PostedTask posted_task(base::OnceClosure(), FROM_HERE);
- TaskQueue::Task task(std::move(posted_task), base::TimeTicks());
- metrics_helper_->RecordTaskMetrics(queue.get(), task, start,
- start + duration, base::nullopt);
+ metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(),
+ FakeTaskTiming(start, start + duration));
}
void RunTask(UseCase use_case,
base::TimeTicks start,
base::TimeDelta duration) {
- DCHECK_LE(clock_.NowTicks(), start);
- clock_.SetNowTicks(start + duration);
+ DCHECK_LE(Now(), start);
+ FastForwardTo(start + duration);
scoped_refptr<MainThreadTaskQueueForTest> queue(
new MainThreadTaskQueueForTest(QueueType::kDefault));
scheduler_->SetCurrentUseCaseForTest(use_case);
- // Pass an empty task for recording.
- TaskQueue::PostedTask posted_task(base::OnceClosure(), FROM_HERE);
- TaskQueue::Task task(std::move(posted_task), base::TimeTicks());
- metrics_helper_->RecordTaskMetrics(queue.get(), task, start,
- start + duration, base::nullopt);
+ metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(),
+ FakeTaskTiming(start, start + duration));
}
base::TimeTicks Milliseconds(int milliseconds) {
return base::TimeTicks() + base::TimeDelta::FromMilliseconds(milliseconds);
}
+ base::TimeTicks Seconds(int seconds) {
+ return base::TimeTicks() + base::TimeDelta::FromSeconds(seconds);
+ }
+
void ForceUpdatePolicy() { scheduler_->ForceUpdatePolicy(); }
std::unique_ptr<FakeFrameScheduler> CreateFakeFrameSchedulerWithType(
@@ -226,8 +237,7 @@ class MainThreadMetricsHelperTest : public testing::Test {
return builder.Build();
}
- base::SimpleTestTickClock clock_;
- scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
+ base::test::ScopedTaskEnvironment task_environment_;
std::unique_ptr<MainThreadSchedulerImplForTest> scheduler_;
MainThreadMetricsHelper* metrics_helper_; // NOT OWNED
std::unique_ptr<base::HistogramTester> histogram_tester_;
@@ -248,133 +258,128 @@ TEST_F(MainThreadMetricsHelperTest, Metrics_PerQueueType) {
if (kLaunchingProcessIsBackgrounded)
scheduler_->SetRendererBackgrounded(false);
- RunTask(QueueType::kDefault, Milliseconds(1),
- base::TimeDelta::FromMicroseconds(700));
- RunTask(QueueType::kDefault, Milliseconds(2),
- base::TimeDelta::FromMicroseconds(700));
- RunTask(QueueType::kDefault, Milliseconds(3),
- base::TimeDelta::FromMicroseconds(700));
-
- RunTask(QueueType::kControl, Milliseconds(400),
- base::TimeDelta::FromMilliseconds(30));
- RunTask(QueueType::kFrameLoading, Milliseconds(800),
- base::TimeDelta::FromMilliseconds(70));
- RunTask(QueueType::kFramePausable, Milliseconds(1000),
- base::TimeDelta::FromMilliseconds(20));
- RunTask(QueueType::kCompositor, Milliseconds(1200),
- base::TimeDelta::FromMilliseconds(25));
- RunTask(QueueType::kTest, Milliseconds(1600),
- base::TimeDelta::FromMilliseconds(85));
+ RunTask(QueueType::kDefault, Seconds(1),
+ base::TimeDelta::FromMilliseconds(700));
+ RunTask(QueueType::kDefault, Seconds(2),
+ base::TimeDelta::FromMilliseconds(700));
+ RunTask(QueueType::kDefault, Seconds(3),
+ base::TimeDelta::FromMilliseconds(700));
+
+ RunTask(QueueType::kControl, Seconds(4), base::TimeDelta::FromSeconds(3));
+ RunTask(QueueType::kFrameLoading, Seconds(8),
+ base::TimeDelta::FromSeconds(6));
+ RunTask(QueueType::kFramePausable, Seconds(16),
+ base::TimeDelta::FromSeconds(2));
+ RunTask(QueueType::kCompositor, Seconds(19), base::TimeDelta::FromSeconds(2));
+ RunTask(QueueType::kTest, Seconds(22), base::TimeDelta::FromSeconds(4));
scheduler_->SetRendererBackgrounded(true);
-
- RunTask(QueueType::kControl, Milliseconds(2000),
- base::TimeDelta::FromMilliseconds(25));
- RunTask(QueueType::kFrameThrottleable, Milliseconds(2600),
- base::TimeDelta::FromMilliseconds(175));
- RunTask(QueueType::kUnthrottled, Milliseconds(2800),
- base::TimeDelta::FromMilliseconds(25));
- RunTask(QueueType::kFrameLoading, Milliseconds(3000),
- base::TimeDelta::FromMilliseconds(35));
- RunTask(QueueType::kFrameThrottleable, Milliseconds(3200),
- base::TimeDelta::FromMilliseconds(5));
- RunTask(QueueType::kCompositor, Milliseconds(3400),
- base::TimeDelta::FromMilliseconds(20));
- RunTask(QueueType::kIdle, Milliseconds(3600),
- base::TimeDelta::FromMilliseconds(50));
- RunTask(QueueType::kFrameLoadingControl, Milliseconds(4000),
- base::TimeDelta::FromMilliseconds(5));
- RunTask(QueueType::kControl, Milliseconds(4200),
- base::TimeDelta::FromMilliseconds(20));
- RunTask(QueueType::kFrameThrottleable, Milliseconds(4400),
- base::TimeDelta::FromMilliseconds(115));
- RunTask(QueueType::kFramePausable, Milliseconds(4600),
- base::TimeDelta::FromMilliseconds(175));
- RunTask(QueueType::kIdle, Milliseconds(5000),
- base::TimeDelta::FromMilliseconds(1600));
-
- RunTask(QueueType::kDetached, Milliseconds(8000),
- base::TimeDelta::FromMilliseconds(150));
+ // Wait for internally triggered tasks to run.
+ constexpr int kCoolingOfTimeSeconds = 10;
+
+ RunTask(QueueType::kControl, Seconds(26 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(2));
+ RunTask(QueueType::kFrameThrottleable, Seconds(28 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(8));
+ RunTask(QueueType::kUnthrottled, Seconds(38 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(QueueType::kFrameLoading, Seconds(45 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(10));
+ RunTask(QueueType::kFrameThrottleable, Seconds(60 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(QueueType::kCompositor, Seconds(70 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(20));
+ RunTask(QueueType::kIdle, Seconds(90 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(QueueType::kFrameLoadingControl, Seconds(100 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(QueueType::kControl, Seconds(106 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(6));
+ RunTask(QueueType::kFrameThrottleable, Seconds(114 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(6));
+ RunTask(QueueType::kFramePausable, Seconds(120 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(17));
+ RunTask(QueueType::kIdle, Seconds(140 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(15));
+
+ RunTask(QueueType::kDetached, Seconds(156 + kCoolingOfTimeSeconds),
+ base::TimeDelta::FromSeconds(2));
std::vector<base::Bucket> expected_samples = {
- {static_cast<int>(QueueType::kControl), 75},
+ {static_cast<int>(QueueType::kControl), 11},
{static_cast<int>(QueueType::kDefault), 2},
- {static_cast<int>(QueueType::kUnthrottled), 25},
- {static_cast<int>(QueueType::kFrameLoading), 105},
- {static_cast<int>(QueueType::kCompositor), 45},
- {static_cast<int>(QueueType::kIdle), 1650},
- {static_cast<int>(QueueType::kTest), 85},
+ {static_cast<int>(QueueType::kUnthrottled), 5},
+ {static_cast<int>(QueueType::kFrameLoading), 16},
+ {static_cast<int>(QueueType::kCompositor), 22},
+ {static_cast<int>(QueueType::kIdle), 20},
+ {static_cast<int>(QueueType::kTest), 4},
{static_cast<int>(QueueType::kFrameLoadingControl), 5},
- {static_cast<int>(QueueType::kFrameThrottleable), 295},
- {static_cast<int>(QueueType::kFramePausable), 195},
- {static_cast<int>(QueueType::kDetached), 150},
+ {static_cast<int>(QueueType::kFrameThrottleable), 19},
+ {static_cast<int>(QueueType::kFramePausable), 19},
+ {static_cast<int>(QueueType::kDetached), 2},
};
EXPECT_THAT(histogram_tester_->GetAllSamples(
- "RendererScheduler.TaskDurationPerQueueType2"),
+ "RendererScheduler.TaskDurationPerQueueType3"),
testing::ContainerEq(expected_samples));
EXPECT_THAT(histogram_tester_->GetAllSamples(
- "RendererScheduler.TaskDurationPerQueueType2.Foreground"),
+ "RendererScheduler.TaskDurationPerQueueType3.Foreground"),
UnorderedElementsAre(
- Bucket(static_cast<int>(QueueType::kControl), 30),
+ Bucket(static_cast<int>(QueueType::kControl), 3),
Bucket(static_cast<int>(QueueType::kDefault), 2),
- Bucket(static_cast<int>(QueueType::kFrameLoading), 70),
- Bucket(static_cast<int>(QueueType::kCompositor), 25),
- Bucket(static_cast<int>(QueueType::kTest), 85),
- Bucket(static_cast<int>(QueueType::kFramePausable), 20)));
+ Bucket(static_cast<int>(QueueType::kFrameLoading), 6),
+ Bucket(static_cast<int>(QueueType::kCompositor), 2),
+ Bucket(static_cast<int>(QueueType::kTest), 4),
+ Bucket(static_cast<int>(QueueType::kFramePausable), 2)));
EXPECT_THAT(histogram_tester_->GetAllSamples(
- "RendererScheduler.TaskDurationPerQueueType2.Background"),
+ "RendererScheduler.TaskDurationPerQueueType3.Background"),
UnorderedElementsAre(
- Bucket(static_cast<int>(QueueType::kControl), 45),
- Bucket(static_cast<int>(QueueType::kUnthrottled), 25),
- Bucket(static_cast<int>(QueueType::kFrameLoading), 35),
- Bucket(static_cast<int>(QueueType::kFrameThrottleable), 295),
- Bucket(static_cast<int>(QueueType::kFramePausable), 175),
+ Bucket(static_cast<int>(QueueType::kControl), 8),
+ Bucket(static_cast<int>(QueueType::kUnthrottled), 5),
+ Bucket(static_cast<int>(QueueType::kFrameLoading), 10),
+ Bucket(static_cast<int>(QueueType::kFrameThrottleable), 19),
+ Bucket(static_cast<int>(QueueType::kFramePausable), 17),
Bucket(static_cast<int>(QueueType::kCompositor), 20),
- Bucket(static_cast<int>(QueueType::kIdle), 1650),
+ Bucket(static_cast<int>(QueueType::kIdle), 20),
Bucket(static_cast<int>(QueueType::kFrameLoadingControl), 5),
- Bucket(static_cast<int>(QueueType::kDetached), 150)));
+ Bucket(static_cast<int>(QueueType::kDetached), 2)));
}
TEST_F(MainThreadMetricsHelperTest, Metrics_PerUseCase) {
RunTask(UseCase::kNone, Milliseconds(500),
- base::TimeDelta::FromMilliseconds(4000));
-
- RunTask(UseCase::kTouchstart, Milliseconds(7000),
- base::TimeDelta::FromMilliseconds(25));
- RunTask(UseCase::kTouchstart, Milliseconds(7050),
- base::TimeDelta::FromMilliseconds(25));
- RunTask(UseCase::kTouchstart, Milliseconds(7100),
- base::TimeDelta::FromMilliseconds(25));
-
- RunTask(UseCase::kCompositorGesture, Milliseconds(7150),
- base::TimeDelta::FromMilliseconds(5));
- RunTask(UseCase::kCompositorGesture, Milliseconds(7200),
- base::TimeDelta::FromMilliseconds(30));
-
- RunTask(UseCase::kMainThreadCustomInputHandling, Milliseconds(7300),
- base::TimeDelta::FromMilliseconds(2));
- RunTask(UseCase::kSynchronizedGesture, Milliseconds(7400),
- base::TimeDelta::FromMilliseconds(250));
- RunTask(UseCase::kMainThreadCustomInputHandling, Milliseconds(7700),
- base::TimeDelta::FromMilliseconds(150));
- RunTask(UseCase::kLoading, Milliseconds(7900),
- base::TimeDelta::FromMilliseconds(50));
- RunTask(UseCase::kMainThreadGesture, Milliseconds(8000),
- base::TimeDelta::FromMilliseconds(60));
+ base::TimeDelta::FromMilliseconds(400));
+
+ RunTask(UseCase::kTouchstart, Seconds(1), base::TimeDelta::FromSeconds(2));
+ RunTask(UseCase::kTouchstart, Seconds(3),
+ base::TimeDelta::FromMilliseconds(300));
+ RunTask(UseCase::kTouchstart, Seconds(4),
+ base::TimeDelta::FromMilliseconds(300));
+
+ RunTask(UseCase::kCompositorGesture, Seconds(5),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(UseCase::kCompositorGesture, Seconds(10),
+ base::TimeDelta::FromSeconds(3));
+
+ RunTask(UseCase::kMainThreadCustomInputHandling, Seconds(14),
+ base::TimeDelta::FromSeconds(2));
+ RunTask(UseCase::kSynchronizedGesture, Seconds(17),
+ base::TimeDelta::FromSeconds(2));
+ RunTask(UseCase::kMainThreadCustomInputHandling, Seconds(19),
+ base::TimeDelta::FromSeconds(5));
+ RunTask(UseCase::kLoading, Seconds(25), base::TimeDelta::FromSeconds(6));
+ RunTask(UseCase::kMainThreadGesture, Seconds(31),
+ base::TimeDelta::FromSeconds(6));
EXPECT_THAT(
histogram_tester_->GetAllSamples(
- "RendererScheduler.TaskDurationPerUseCase"),
+ "RendererScheduler.TaskDurationPerUseCase2"),
UnorderedElementsAre(
- Bucket(static_cast<int>(UseCase::kNone), 4000),
- Bucket(static_cast<int>(UseCase::kCompositorGesture), 35),
- Bucket(static_cast<int>(UseCase::kMainThreadCustomInputHandling),
- 152),
- Bucket(static_cast<int>(UseCase::kSynchronizedGesture), 250),
- Bucket(static_cast<int>(UseCase::kTouchstart), 75),
- Bucket(static_cast<int>(UseCase::kLoading), 50),
- Bucket(static_cast<int>(UseCase::kMainThreadGesture), 60)));
+ Bucket(static_cast<int>(UseCase::kTouchstart), 3),
+ Bucket(static_cast<int>(UseCase::kCompositorGesture), 8),
+ Bucket(static_cast<int>(UseCase::kMainThreadCustomInputHandling), 7),
+ Bucket(static_cast<int>(UseCase::kSynchronizedGesture), 2),
+ Bucket(static_cast<int>(UseCase::kLoading), 6),
+ Bucket(static_cast<int>(UseCase::kMainThreadGesture), 6)));
}
TEST_F(MainThreadMetricsHelperTest, GetFrameStatusTest) {
@@ -396,81 +401,6 @@ TEST_F(MainThreadMetricsHelperTest, GetFrameStatusTest) {
}
}
-TEST_F(MainThreadMetricsHelperTest, BackgroundedRendererTransition) {
- scheduler_->SetFreezingWhenBackgroundedEnabled(true);
- typedef BackgroundedRendererTransition Transition;
-
- int backgrounding_transitions = 0;
- int foregrounding_transitions = 0;
- if (!kLaunchingProcessIsBackgrounded) {
- scheduler_->SetRendererBackgrounded(true);
- backgrounding_transitions++;
- EXPECT_THAT(
- histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(Bucket(static_cast<int>(Transition::kBackgrounded),
- backgrounding_transitions)));
- scheduler_->SetRendererBackgrounded(false);
- foregrounding_transitions++;
- EXPECT_THAT(
- histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(Bucket(static_cast<int>(Transition::kBackgrounded),
- backgrounding_transitions),
- Bucket(static_cast<int>(Transition::kForegrounded),
- foregrounding_transitions)));
- } else {
- scheduler_->SetRendererBackgrounded(false);
- foregrounding_transitions++;
- EXPECT_THAT(
- histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(Bucket(static_cast<int>(Transition::kForegrounded),
- foregrounding_transitions)));
- }
-
- scheduler_->SetRendererBackgrounded(true);
- backgrounding_transitions++;
- EXPECT_THAT(
- histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(Bucket(static_cast<int>(Transition::kBackgrounded),
- backgrounding_transitions),
- Bucket(static_cast<int>(Transition::kForegrounded),
- foregrounding_transitions)));
-
- // Waste 5+ minutes so that the delayed stop is triggered
- RunTask(QueueType::kDefault, Milliseconds(1),
- base::TimeDelta::FromSeconds(5 * 61));
- // Firing ForceUpdatePolicy multiple times to make sure that the
- // metric is only recorded upon an actual change.
- ForceUpdatePolicy();
- ForceUpdatePolicy();
- ForceUpdatePolicy();
- EXPECT_THAT(histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(
- Bucket(static_cast<int>(Transition::kBackgrounded),
- backgrounding_transitions),
- Bucket(static_cast<int>(Transition::kForegrounded),
- foregrounding_transitions),
- Bucket(static_cast<int>(Transition::kFrozenAfterDelay), 1)));
-
- scheduler_->SetRendererBackgrounded(false);
- foregrounding_transitions++;
- ForceUpdatePolicy();
- ForceUpdatePolicy();
- EXPECT_THAT(histogram_tester_->GetAllSamples(
- "RendererScheduler.BackgroundedRendererTransition"),
- UnorderedElementsAre(
- Bucket(static_cast<int>(Transition::kBackgrounded),
- backgrounding_transitions),
- Bucket(static_cast<int>(Transition::kForegrounded),
- foregrounding_transitions),
- Bucket(static_cast<int>(Transition::kFrozenAfterDelay), 1),
- Bucket(static_cast<int>(Transition::kResumed), 1)));
-}
-
TEST_F(MainThreadMetricsHelperTest, TaskCountPerFrameStatus) {
int task_count = 0;
struct CountPerFrameStatus {