Index: remoting/host/capture_scheduler_unittest.cc |
diff --git a/remoting/host/capture_scheduler_unittest.cc b/remoting/host/capture_scheduler_unittest.cc |
index b07fc6daed5e48a7de6a2967aa472f9f380a0caa..95ddf6b27b7e995e8b8cf57d57494b0e6dceefdb 100644 |
--- a/remoting/host/capture_scheduler_unittest.cc |
+++ b/remoting/host/capture_scheduler_unittest.cc |
@@ -7,6 +7,7 @@ |
#include "base/message_loop/message_loop.h" |
#include "base/test/simple_test_tick_clock.h" |
#include "base/timer/mock_timer.h" |
+#include "remoting/proto/video.pb.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace remoting { |
@@ -47,9 +48,17 @@ class CaptureSchedulerTest : public testing::Test { |
CheckCaptureCalled(); |
tick_clock_->Advance(capture_delay); |
scheduler_->OnCaptureCompleted(); |
- scheduler_->OnFrameEncoded(encode_delay); |
+ |
+ VideoPacket packet; |
+ packet.set_encode_time_ms(encode_delay.InMilliseconds()); |
+ scheduler_->OnFrameEncoded(&packet); |
+ |
scheduler_->OnFrameSent(); |
+ scoped_ptr<VideoAck> ack(new VideoAck()); |
+ ack->set_frame_id(packet.frame_id()); |
+ scheduler_->ProcessVideoAck(ack.Pass()); |
+ |
EXPECT_TRUE(capture_timer_->IsRunning()); |
EXPECT_EQ(std::max(base::TimeDelta(), |
expected_delay_between_frames - capture_delay), |
@@ -132,10 +141,16 @@ TEST_F(CaptureSchedulerTest, RollingAverageDifferentTimes) { |
} |
} |
-// Verify that we never have more than 2 pending frames. |
-TEST_F(CaptureSchedulerTest, MaximumPendingFrames) { |
+// Verify that we never have more than 2 encoding frames. |
+TEST_F(CaptureSchedulerTest, MaximumEncodingFrames) { |
InitScheduler(); |
+ // Process the first frame to let the scheduler know that receiver supports |
+ // ACKs. |
+ SimulateSingleFrameCapture( |
+ base::TimeDelta(), base::TimeDelta(), |
+ base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
+ |
capture_timer_->Fire(); |
CheckCaptureCalled(); |
scheduler_->OnCaptureCompleted(); |
@@ -145,11 +160,55 @@ TEST_F(CaptureSchedulerTest, MaximumPendingFrames) { |
scheduler_->OnCaptureCompleted(); |
EXPECT_FALSE(capture_timer_->IsRunning()); |
+ VideoPacket packet; |
+ scheduler_->OnFrameEncoded(&packet); |
+ EXPECT_TRUE(capture_timer_->IsRunning()); |
+} |
- scheduler_->OnFrameEncoded(base::TimeDelta()); |
- scheduler_->OnFrameSent(); |
+// Verify that the scheduler doesn't exceed maximum number of pending frames. |
+TEST_F(CaptureSchedulerTest, MaximumPendingFrames) { |
+ InitScheduler(); |
+ // Process the first frame to let the scheduler know that receiver supports |
+ // ACKs. |
+ SimulateSingleFrameCapture( |
+ base::TimeDelta(), base::TimeDelta(), |
+ base::TimeDelta::FromMilliseconds(kMinumumFrameIntervalMs)); |
+ |
+ // Queue some frames until the sender is blocked. |
+ while (capture_timer_->IsRunning()) { |
+ capture_timer_->Fire(); |
+ CheckCaptureCalled(); |
+ scheduler_->OnCaptureCompleted(); |
+ VideoPacket packet; |
+ scheduler_->OnFrameEncoded(&packet); |
+ scheduler_->OnFrameSent(); |
+ } |
+ |
+ // Next frame should be scheduled, once one of the queued frames is |
+ // acknowledged. |
+ EXPECT_FALSE(capture_timer_->IsRunning()); |
+ scheduler_->ProcessVideoAck(make_scoped_ptr(new VideoAck())); |
EXPECT_TRUE(capture_timer_->IsRunning()); |
} |
+// Verify that the scheduler doesn't exceed maximum number of pending frames |
+// when acks are not supported. |
+TEST_F(CaptureSchedulerTest, MaximumPendingFramesNoAcks) { |
+ InitScheduler(); |
+ |
+ // Queue some frames until the sender is blocked. |
+ while (capture_timer_->IsRunning()) { |
+ capture_timer_->Fire(); |
+ CheckCaptureCalled(); |
+ scheduler_->OnCaptureCompleted(); |
+ VideoPacket packet; |
+ scheduler_->OnFrameEncoded(&packet); |
+ } |
+ |
+ // Next frame should be scheduled, once one of the queued frames is sent. |
+ EXPECT_FALSE(capture_timer_->IsRunning()); |
+ scheduler_->OnFrameSent(); |
+ EXPECT_TRUE(capture_timer_->IsRunning()); |
+} |
} // namespace remoting |