Index: components/scheduler/base/queueing_time_estimator_unittest.cc |
diff --git a/components/scheduler/base/queueing_time_estimator_unittest.cc b/components/scheduler/base/queueing_time_estimator_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9df20b29103a3e7b23c880f060b7a63ea279c28 |
--- /dev/null |
+++ b/components/scheduler/base/queueing_time_estimator_unittest.cc |
@@ -0,0 +1,94 @@ |
+// Copyright 2016 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 "components/scheduler/base/queueing_time_estimator.h" |
+#include "components/scheduler/base/test_time_source.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace scheduler { |
+ |
+using QueueingTimeEstimatorTest = testing::Test; |
+ |
+class TestQueueingTimeEstimatorClient |
+ : public QueueingTimeEstimator::Client { |
+ public: |
+ void OnQueueingTimeForWindowEstimated( |
+ base::TimeDelta queueing_time) override { |
+ expected_queueing_times_.push_back(queueing_time); |
+ } |
+ const std::vector<base::TimeDelta>& expected_queueing_times() { |
+ return expected_queueing_times_; |
+ } |
+ |
+ private: |
+ std::vector<base::TimeDelta> expected_queueing_times_; |
+}; |
+ |
+class QueueingTimeEstimatorForTest : public QueueingTimeEstimator { |
+ public: |
+ QueueingTimeEstimatorForTest(TestQueueingTimeEstimatorClient* client, |
+ base::TimeDelta window_duration) |
+ : QueueingTimeEstimator(client, window_duration) {} |
+}; |
+ |
+// Three tasks of one second each, all within a 5 second window. Expected |
+// queueing time is the probability of falling into one of these tasks (3/5), |
+// multiplied by the expected queueing time within a task (0.5 seconds). Thus we |
+// expect a queueing time of 0.3 seconds. |
+TEST_F(QueueingTimeEstimatorTest, AllTasksWithinWindow) { |
+ base::TimeTicks time; |
+ TestQueueingTimeEstimatorClient client; |
+ QueueingTimeEstimatorForTest estimator(&client, |
+ base::TimeDelta::FromSeconds(5)); |
+ for (int i = 0; i < 3; ++i) { |
+ estimator.OnToplevelTaskCompleted( |
+ time, time + base::TimeDelta::FromMilliseconds(1000)); |
+ time += base::TimeDelta::FromMilliseconds(1500); |
+ } |
+ |
+ // Flush the data by adding a task in the next window. |
+ time += base::TimeDelta::FromMilliseconds(5000); |
+ estimator.OnToplevelTaskCompleted( |
+ time, time + base::TimeDelta::FromMilliseconds(500)); |
+ |
+ EXPECT_THAT(client.expected_queueing_times(), |
+ testing::ElementsAre(base::TimeDelta::FromMilliseconds(300))); |
+} |
+ |
+// One 20 second long task, starting 3 seconds into the first window. |
+// Window 1: Probability of being within task = 2/5. Expected delay within task: |
+// avg(20, 18). Total expected queueing time = 7.6s. |
+// Window 2: Probability of being within task = 1. Expected delay within task: |
+// avg(18, 13). Total expected queueing time = 15.5s. |
+// Window 5: Probability of being within task = 3/5. Expected delay within task: |
+// avg(3, 0). Total expected queueing time = 0.9s. |
+TEST_F(QueueingTimeEstimatorTest, MultiWindowTask) { |
+ TestQueueingTimeEstimatorClient client; |
+ QueueingTimeEstimatorForTest estimator(&client, |
+ base::TimeDelta::FromSeconds(5)); |
+ base::TimeTicks time; |
+ time += base::TimeDelta::FromMilliseconds(5000); |
+ estimator.OnToplevelTaskCompleted(time, time); |
+ |
+ time += base::TimeDelta::FromMilliseconds(3000); |
+ |
+ estimator.OnToplevelTaskCompleted( |
+ time, time + base::TimeDelta::FromMilliseconds(20000)); |
+ |
+ // Flush the data by adding a task in the next window. |
+ time += base::TimeDelta::FromMilliseconds(25000); |
+ |
+ estimator.OnToplevelTaskCompleted( |
+ time, time + base::TimeDelta::FromMilliseconds(500)); |
+ |
+ EXPECT_THAT(client.expected_queueing_times(), |
+ testing::ElementsAre(base::TimeDelta::FromMilliseconds(7600), |
+ base::TimeDelta::FromMilliseconds(15500), |
+ base::TimeDelta::FromMilliseconds(10500), |
+ base::TimeDelta::FromMilliseconds(5500), |
+ base::TimeDelta::FromMilliseconds(900))); |
+} |
+ |
+} // namespace scheduler |