Index: remoting/host/capture_scheduler_unittest.cc |
diff --git a/remoting/host/capture_scheduler_unittest.cc b/remoting/host/capture_scheduler_unittest.cc |
index a6ca0e6d9810e88d78fe512b2abab7b9c6e733b9..b07fc6daed5e48a7de6a2967aa472f9f380a0caa 100644 |
--- a/remoting/host/capture_scheduler_unittest.cc |
+++ b/remoting/host/capture_scheduler_unittest.cc |
@@ -3,6 +3,10 @@ |
// found in the LICENSE file. |
#include "remoting/host/capture_scheduler.h" |
+ |
+#include "base/message_loop/message_loop.h" |
+#include "base/test/simple_test_tick_clock.h" |
+#include "base/timer/mock_timer.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace remoting { |
@@ -10,7 +14,61 @@ namespace remoting { |
static const int kTestInputs[] = { 100, 50, 30, 20, 10, 30, 60, 80 }; |
static const int kMinumumFrameIntervalMs = 50; |
-TEST(CaptureSchedulerTest, SingleSampleSameTimes) { |
+class CaptureSchedulerTest : public testing::Test { |
+ public: |
+ CaptureSchedulerTest() : capture_called_(false) {} |
+ |
+ void InitScheduler() { |
+ scheduler_.reset(new CaptureScheduler( |
+ base::Bind(&CaptureSchedulerTest::DoCapture, base::Unretained(this)))); |
+ scheduler_->set_minimum_interval( |
+ base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
+ tick_clock_ = new base::SimpleTestTickClock(); |
+ scheduler_->SetTickClockForTest(make_scoped_ptr(tick_clock_)); |
+ capture_timer_ = new base::MockTimer(false, false); |
+ scheduler_->SetTimerForTest(make_scoped_ptr(capture_timer_)); |
+ scheduler_->Start(); |
+ } |
+ |
+ void DoCapture() { |
+ capture_called_ = true; |
+ } |
+ |
+ void CheckCaptureCalled() { |
+ EXPECT_TRUE(capture_called_); |
+ capture_called_ = false; |
+ } |
+ |
+ void SimulateSingleFrameCapture( |
+ base::TimeDelta capture_delay, |
+ base::TimeDelta encode_delay, |
+ base::TimeDelta expected_delay_between_frames) { |
+ capture_timer_->Fire(); |
+ CheckCaptureCalled(); |
+ tick_clock_->Advance(capture_delay); |
+ scheduler_->OnCaptureCompleted(); |
+ scheduler_->OnFrameEncoded(encode_delay); |
+ scheduler_->OnFrameSent(); |
+ |
+ EXPECT_TRUE(capture_timer_->IsRunning()); |
+ EXPECT_EQ(std::max(base::TimeDelta(), |
+ expected_delay_between_frames - capture_delay), |
+ capture_timer_->GetCurrentDelay()); |
+ } |
+ |
+ protected: |
+ base::MessageLoop message_loop_; |
+ |
+ scoped_ptr<CaptureScheduler> scheduler_; |
+ |
+ // Owned by |scheduler_|. |
+ base::SimpleTestTickClock* tick_clock_; |
+ base::MockTimer* capture_timer_; |
+ |
+ bool capture_called_; |
+}; |
+ |
+TEST_F(CaptureSchedulerTest, SingleSampleSameTimes) { |
const int kTestResults[][arraysize(kTestInputs)] = { |
{ 400, 200, 120, 80, 50, 120, 240, 320 }, // One core. |
{ 200, 100, 60, 50, 50, 60, 120, 160 }, // Two cores. |
@@ -20,21 +78,18 @@ TEST(CaptureSchedulerTest, SingleSampleSameTimes) { |
for (size_t i = 0; i < arraysize(kTestResults); ++i) { |
for (size_t j = 0; j < arraysize(kTestInputs); ++j) { |
- CaptureScheduler scheduler; |
- scheduler.SetNumOfProcessorsForTest(1 << i); |
- scheduler.set_minimum_interval( |
- base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
- scheduler.RecordCaptureTime( |
- base::TimeDelta::FromMilliseconds(kTestInputs[j])); |
- scheduler.RecordEncodeTime( |
- base::TimeDelta::FromMilliseconds(kTestInputs[j])); |
- EXPECT_EQ(kTestResults[i][j], |
- scheduler.NextCaptureDelay().InMilliseconds()) << i << " "<< j; |
+ InitScheduler(); |
+ scheduler_->SetNumOfProcessorsForTest(1 << i); |
+ |
+ SimulateSingleFrameCapture( |
+ base::TimeDelta::FromMilliseconds(kTestInputs[j]), |
+ base::TimeDelta::FromMilliseconds(kTestInputs[j]), |
+ base::TimeDelta::FromMilliseconds(kTestResults[i][j])); |
} |
} |
} |
-TEST(CaptureSchedulerTest, SingleSampleDifferentTimes) { |
+TEST_F(CaptureSchedulerTest, SingleSampleDifferentTimes) { |
const int kTestResults[][arraysize(kTestInputs)] = { |
{ 360, 220, 120, 60, 60, 120, 220, 360 }, // One core. |
{ 180, 110, 60, 50, 50, 60, 110, 180 }, // Two cores. |
@@ -44,22 +99,19 @@ TEST(CaptureSchedulerTest, SingleSampleDifferentTimes) { |
for (size_t i = 0; i < arraysize(kTestResults); ++i) { |
for (size_t j = 0; j < arraysize(kTestInputs); ++j) { |
- CaptureScheduler scheduler; |
- scheduler.SetNumOfProcessorsForTest(1 << i); |
- scheduler.set_minimum_interval( |
- base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
- scheduler.RecordCaptureTime( |
- base::TimeDelta::FromMilliseconds(kTestInputs[j])); |
- scheduler.RecordEncodeTime( |
+ InitScheduler(); |
+ scheduler_->SetNumOfProcessorsForTest(1 << i); |
+ |
+ SimulateSingleFrameCapture( |
+ base::TimeDelta::FromMilliseconds(kTestInputs[j]), |
base::TimeDelta::FromMilliseconds( |
- kTestInputs[arraysize(kTestInputs) - 1 - j])); |
- EXPECT_EQ(kTestResults[i][j], |
- scheduler.NextCaptureDelay().InMilliseconds()); |
+ kTestInputs[arraysize(kTestInputs) - 1 - j]), |
+ base::TimeDelta::FromMilliseconds(kTestResults[i][j])); |
} |
} |
} |
-TEST(CaptureSchedulerTest, RollingAverageDifferentTimes) { |
+TEST_F(CaptureSchedulerTest, RollingAverageDifferentTimes) { |
const int kTestResults[][arraysize(kTestInputs)] = { |
{ 360, 290, 233, 133, 80, 80, 133, 233 }, // One core. |
{ 180, 145, 116, 66, 50, 50, 66, 116 }, // Two cores. |
@@ -68,20 +120,36 @@ TEST(CaptureSchedulerTest, RollingAverageDifferentTimes) { |
}; |
for (size_t i = 0; i < arraysize(kTestResults); ++i) { |
- CaptureScheduler scheduler; |
- scheduler.SetNumOfProcessorsForTest(1 << i); |
- scheduler.set_minimum_interval( |
- base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
+ InitScheduler(); |
+ scheduler_->SetNumOfProcessorsForTest(1 << i); |
for (size_t j = 0; j < arraysize(kTestInputs); ++j) { |
- scheduler.RecordCaptureTime( |
- base::TimeDelta::FromMilliseconds(kTestInputs[j])); |
- scheduler.RecordEncodeTime( |
+ SimulateSingleFrameCapture( |
+ base::TimeDelta::FromMilliseconds(kTestInputs[j]), |
base::TimeDelta::FromMilliseconds( |
- kTestInputs[arraysize(kTestInputs) - 1 - j])); |
- EXPECT_EQ(kTestResults[i][j], |
- scheduler.NextCaptureDelay().InMilliseconds()); |
+ kTestInputs[arraysize(kTestInputs) - 1 - j]), |
+ base::TimeDelta::FromMilliseconds(kTestResults[i][j])); |
} |
} |
} |
+// Verify that we never have more than 2 pending frames. |
+TEST_F(CaptureSchedulerTest, MaximumPendingFrames) { |
+ InitScheduler(); |
+ |
+ capture_timer_->Fire(); |
+ CheckCaptureCalled(); |
+ scheduler_->OnCaptureCompleted(); |
+ |
+ capture_timer_->Fire(); |
+ CheckCaptureCalled(); |
+ scheduler_->OnCaptureCompleted(); |
+ |
+ EXPECT_FALSE(capture_timer_->IsRunning()); |
+ |
+ scheduler_->OnFrameEncoded(base::TimeDelta()); |
+ scheduler_->OnFrameSent(); |
+ |
+ EXPECT_TRUE(capture_timer_->IsRunning()); |
+} |
+ |
} // namespace remoting |