Chromium Code Reviews| 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..818e426af41b9595e6d932c4768f5742110d9932 100644 |
| --- a/remoting/host/capture_scheduler_unittest.cc |
| +++ b/remoting/host/capture_scheduler_unittest.cc |
| @@ -3,14 +3,66 @@ |
| // 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 { |
| 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)))); |
| + 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) { |
|
Wez
2015/02/05 02:40:25
I don't see a test for the expected delay?
Sergey Ulanov
2015/02/05 19:13:27
Removed it by mistake somehow
|
| + capture_timer_->Fire(); |
| + CheckCaptureCalled(); |
| + tick_clock_->Advance(capture_delay); |
| + scheduler_->OnCaptureCompleted(); |
| + scheduler_->OnFrameEncoded(encode_delay); |
| + scheduler_->OnFrameSent(); |
| + |
| + EXPECT_TRUE(capture_timer_->IsRunning()); |
| + } |
| + |
| + 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 +72,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 +93,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 +114,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 |