1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "remoting/protocol/monitored_video_stub.h" 6 7 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop_proxy.h" 9 #include "base/run_loop.h" 10 #include "base/test/test_timeouts.h" 11 #include "remoting/protocol/protocol_mock_objects.h" 12 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 using ::testing::_; 16 using ::testing::AnyNumber; 17 using ::testing::AtMost; 18 using ::testing::InvokeWithoutArgs; 19 20 namespace remoting { 21 namespace protocol { 22 23 static const int64 kTestOverrideDelayMilliseconds = 1; 24 25 class MonitoredVideoStubTest : public testing::Test { 26 protected: 27 virtual void SetUp() OVERRIDE { 28 packet_.reset(new VideoPacket()); 29 monitor_.reset(new MonitoredVideoStub( 30 &video_stub_, 31 base::TimeDelta::FromMilliseconds(kTestOverrideDelayMilliseconds), 32 base::Bind( 33 &MonitoredVideoStubTest::OnVideoChannelStatus, 34 base::Unretained(this)))); 35 EXPECT_CALL(video_stub_, ProcessVideoPacketPtr(_, _)).Times(AnyNumber()); 36 } 37 38 MOCK_METHOD1(OnVideoChannelStatus, void(bool connected)); 39 40 base::MessageLoop message_loop_; 41 MockVideoStub video_stub_; 42 43 scoped_ptr<MonitoredVideoStub> monitor_; 44 scoped_ptr<VideoPacket> packet_; 45 base::OneShotTimer<MonitoredVideoStubTest> timer_end_test_; 46 }; 47 48 TEST_F(MonitoredVideoStubTest, OnChannelConnected) { 49 EXPECT_CALL(*this, OnVideoChannelStatus(true)); 50 // On slow machines, the connectivity check timer may fire before the test 51 // finishes, so we expect to see at most one transition to not ready. 52 EXPECT_CALL(*this, OnVideoChannelStatus(false)).Times(AtMost(1)); 53 54 monitor_->ProcessVideoPacket(packet_.Pass(), base::Closure()); 55 base::RunLoop().RunUntilIdle(); 56 } 57 58 TEST_F(MonitoredVideoStubTest, OnChannelDisconnected) { 59 EXPECT_CALL(*this, OnVideoChannelStatus(true)); 60 monitor_->ProcessVideoPacket(packet_.Pass(), base::Closure()); 61 62 EXPECT_CALL(*this, OnVideoChannelStatus(false)).WillOnce( 63 InvokeWithoutArgs( 64 &message_loop_, 65 &base::MessageLoop::Quit)); 66 message_loop_.Run(); 67 } 68 69 TEST_F(MonitoredVideoStubTest, OnChannelStayConnected) { 70 // Verify no extra connected events are fired when packets are received 71 // frequently 72 EXPECT_CALL(*this, OnVideoChannelStatus(true)); 73 // On slow machines, the connectivity check timer may fire before the test 74 // finishes, so we expect to see at most one transition to not ready. 75 EXPECT_CALL(*this, OnVideoChannelStatus(false)).Times(AtMost(1)); 76 77 monitor_->ProcessVideoPacket(packet_.Pass(), base::Closure()); 78 monitor_->ProcessVideoPacket(packet_.Pass(), base::Closure()); 79 base::RunLoop().RunUntilIdle(); 80 } 81 82 TEST_F(MonitoredVideoStubTest, OnChannelStayDisconnected) { 83 // Verify no extra disconnected events are fired. 84 EXPECT_CALL(*this, OnVideoChannelStatus(true)).Times(1); 85 EXPECT_CALL(*this, OnVideoChannelStatus(false)).Times(1); 86 87 monitor_->ProcessVideoPacket(packet_.Pass(), base::Closure()); 88 89 message_loop_.PostDelayedTask( 90 FROM_HERE, 91 base::MessageLoop::QuitClosure(), 92 // The delay should be much greater than |kTestOverrideDelayMilliseconds|. 93 TestTimeouts::tiny_timeout()); 94 message_loop_.Run(); 95 } 96 97 } // namespace protocol 98 } // namespace remoting 99