| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/protocol/connection_to_client.h" | 5 #include "base/power_monitor/power_monitor.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | |
| 8 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 9 #include "base/message_loop_proxy.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "remoting/base/constants.h" | |
| 11 #include "remoting/protocol/fake_session.h" | |
| 12 #include "remoting/protocol/protocol_mock_objects.h" | |
| 13 #include "testing/gmock/include/gmock/gmock.h" | |
| 14 | 9 |
| 15 using ::testing::_; | 10 namespace base { |
| 16 using ::testing::NotNull; | |
| 17 using ::testing::StrictMock; | |
| 18 | 11 |
| 19 namespace remoting { | 12 class PowerTest : public PowerObserver { |
| 20 namespace protocol { | |
| 21 | |
| 22 class ConnectionToClientTest : public testing::Test { | |
| 23 public: | 13 public: |
| 24 ConnectionToClientTest() { | 14 PowerTest() |
| 15 : power_state_changes_(0), |
| 16 suspends_(0), |
| 17 resumes_(0) { |
| 25 } | 18 } |
| 26 | 19 |
| 27 protected: | 20 // PowerObserver callbacks. |
| 28 virtual void SetUp() OVERRIDE { | 21 virtual void OnPowerStateChange(bool on_battery_power) OVERRIDE { |
| 29 session_ = new FakeSession(); | 22 power_state_changes_++; |
| 30 | |
| 31 // Allocate a ClientConnection object with the mock objects. | |
| 32 viewer_.reset(new ConnectionToClient(session_)); | |
| 33 viewer_->set_clipboard_stub(&clipboard_stub_); | |
| 34 viewer_->set_host_stub(&host_stub_); | |
| 35 viewer_->set_input_stub(&input_stub_); | |
| 36 viewer_->SetEventHandler(&handler_); | |
| 37 EXPECT_CALL(handler_, OnConnectionAuthenticated(viewer_.get())); | |
| 38 EXPECT_CALL(handler_, OnConnectionChannelsConnected(viewer_.get())); | |
| 39 session_->event_handler()->OnSessionStateChange(Session::CONNECTED); | |
| 40 session_->event_handler()->OnSessionStateChange(Session::AUTHENTICATED); | |
| 41 message_loop_.RunAllPending(); | |
| 42 } | 23 } |
| 43 | 24 |
| 44 virtual void TearDown() OVERRIDE { | 25 virtual void OnSuspend() OVERRIDE { |
| 45 viewer_.reset(); | 26 suspends_++; |
| 46 message_loop_.RunAllPending(); | |
| 47 } | 27 } |
| 48 | 28 |
| 49 MessageLoop message_loop_; | 29 virtual void OnResume() OVERRIDE { |
| 50 MockConnectionToClientEventHandler handler_; | 30 resumes_++; |
| 51 MockClipboardStub clipboard_stub_; | 31 } |
| 52 MockHostStub host_stub_; | |
| 53 MockInputStub input_stub_; | |
| 54 scoped_ptr<ConnectionToClient> viewer_; | |
| 55 | 32 |
| 56 // Owned by |viewer_|. | 33 // Test status counts. |
| 57 FakeSession* session_; | 34 int power_state_changes() { return power_state_changes_; } |
| 35 int suspends() { return suspends_; } |
| 36 int resumes() { return resumes_; } |
| 58 | 37 |
| 59 private: | 38 private: |
| 60 DISALLOW_COPY_AND_ASSIGN(ConnectionToClientTest); | 39 int power_state_changes_; // Count of OnPowerStateChange notifications. |
| 40 int suspends_; // Count of OnSuspend notifications. |
| 41 int resumes_; // Count of OnResume notifications. |
| 61 }; | 42 }; |
| 62 | 43 |
| 63 TEST_F(ConnectionToClientTest, SendUpdateStream) { | 44 class PowerMonitorTest : public testing::Test { |
| 64 scoped_ptr<VideoPacket> packet(new VideoPacket()); | 45 protected: |
| 65 viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); | 46 PowerMonitorTest() { |
| 47 #if defined(OS_MACOSX) |
| 48 // This needs to happen before PowerMonitor's ctor. |
| 49 PowerMonitor::AllocateSystemIOPorts(); |
| 50 #endif |
| 51 } |
| 52 virtual ~PowerMonitorTest() {} |
| 66 | 53 |
| 54 MessageLoop message_loop_; |
| 55 PowerMonitor power_monitor_; |
| 56 |
| 57 DISALLOW_COPY_AND_ASSIGN(PowerMonitorTest); |
| 58 }; |
| 59 |
| 60 TEST_F(PowerMonitorTest, PowerNotifications) { |
| 61 const int kObservers = 5; |
| 62 |
| 63 PowerTest test[kObservers]; |
| 64 for (int index = 0; index < kObservers; ++index) |
| 65 power_monitor_.AddObserver(&test[index]); |
| 66 |
| 67 // Send a bunch of power changes. Since the battery power hasn't |
| 68 // actually changed, we shouldn't get notifications. |
| 69 for (int index = 0; index < 5; index++) { |
| 70 power_monitor_.ProcessPowerMessage(PowerMonitor::POWER_STATE_EVENT); |
| 71 EXPECT_EQ(test[0].power_state_changes(), 0); |
| 72 } |
| 73 |
| 74 // Sending resume when not suspended should have no effect. |
| 75 power_monitor_.ProcessPowerMessage(PowerMonitor::RESUME_EVENT); |
| 67 message_loop_.RunAllPending(); | 76 message_loop_.RunAllPending(); |
| 77 EXPECT_EQ(test[0].resumes(), 0); |
| 68 | 78 |
| 69 // Verify that something has been written. | 79 // Pretend we suspended. |
| 70 // TODO(sergeyu): Verify that the correct data has been written. | 80 power_monitor_.ProcessPowerMessage(PowerMonitor::SUSPEND_EVENT); |
| 71 ASSERT_TRUE(session_->GetStreamChannel(kVideoChannelName)); | 81 message_loop_.RunAllPending(); |
| 72 EXPECT_GT(session_->GetStreamChannel(kVideoChannelName)-> | 82 EXPECT_EQ(test[0].suspends(), 1); |
| 73 written_data().size(), 0u); | |
| 74 | 83 |
| 75 // And then close the connection to ConnectionToClient. | 84 // Send a second suspend notification. This should be suppressed. |
| 76 viewer_->Disconnect(); | 85 power_monitor_.ProcessPowerMessage(PowerMonitor::SUSPEND_EVENT); |
| 86 message_loop_.RunAllPending(); |
| 87 EXPECT_EQ(test[0].suspends(), 1); |
| 77 | 88 |
| 89 // Pretend we were awakened. |
| 90 power_monitor_.ProcessPowerMessage(PowerMonitor::RESUME_EVENT); |
| 78 message_loop_.RunAllPending(); | 91 message_loop_.RunAllPending(); |
| 92 EXPECT_EQ(test[0].resumes(), 1); |
| 93 |
| 94 // Send a duplicate resume notification. This should be suppressed. |
| 95 power_monitor_.ProcessPowerMessage(PowerMonitor::RESUME_EVENT); |
| 96 message_loop_.RunAllPending(); |
| 97 EXPECT_EQ(test[0].resumes(), 1); |
| 79 } | 98 } |
| 80 | 99 |
| 81 TEST_F(ConnectionToClientTest, NoWriteAfterDisconnect) { | 100 } // namespace base |
| 82 scoped_ptr<VideoPacket> packet(new VideoPacket()); | |
| 83 viewer_->video_stub()->ProcessVideoPacket(packet.Pass(), base::Closure()); | |
| 84 | |
| 85 // And then close the connection to ConnectionToClient. | |
| 86 viewer_->Disconnect(); | |
| 87 | |
| 88 // The test will crash if data writer tries to write data to the | |
| 89 // channel socket. | |
| 90 // TODO(sergeyu): Use MockSession to verify that no data is written? | |
| 91 message_loop_.RunAllPending(); | |
| 92 } | |
| 93 | |
| 94 TEST_F(ConnectionToClientTest, StateChange) { | |
| 95 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), OK)); | |
| 96 session_->event_handler()->OnSessionStateChange(Session::CLOSED); | |
| 97 message_loop_.RunAllPending(); | |
| 98 | |
| 99 EXPECT_CALL(handler_, OnConnectionClosed(viewer_.get(), SESSION_REJECTED)); | |
| 100 session_->set_error(SESSION_REJECTED); | |
| 101 session_->event_handler()->OnSessionStateChange(Session::FAILED); | |
| 102 message_loop_.RunAllPending(); | |
| 103 } | |
| 104 | |
| 105 } // namespace protocol | |
| 106 } // namespace remoting | |
| OLD | NEW |