Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(560)

Unified Diff: remoting/test/test_chromoting_client_unittest.cc

Issue 976233003: Adding the base ChromotingInstance implementation and unittests. This class will be used by the ap… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing Sergey's feedback Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/test/test_chromoting_client_unittest.cc
diff --git a/remoting/test/test_chromoting_client_unittest.cc b/remoting/test/test_chromoting_client_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f1bac8fcdde4432a4d03eb3b8d66bd8fdf46d44e
--- /dev/null
+++ b/remoting/test/test_chromoting_client_unittest.cc
@@ -0,0 +1,215 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/message_loop/message_loop.h"
+#include "remoting/protocol/fake_connection_to_host.h"
+#include "remoting/test/test_chromoting_client.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+const char kTestUserName[] = "test_user@faux_address.com";
+const char kAccessToken[] = "faux_access_token";
+}
+
+namespace remoting {
+namespace test {
+
+using testing::_;
+
+// Provides base functionality for the TestChromotingClient Tests below. This
+// fixture also creates an IO MessageLoop for use by the TestChromotingClient.
+// Overrides a subset of the RemoteConnectionObserver interface to track
+// connection status changes for result verification.
+class TestChromotingClientTest : public ::testing::Test,
Sergey Ulanov 2015/03/11 00:09:52 I'm not sure how useful it is to unittest test cod
joedow 2015/03/11 19:06:39 Acknowledged.
+ public RemoteConnectionObserver {
+ public:
+ TestChromotingClientTest();
+ ~TestChromotingClientTest() override;
+
+ protected:
+ // testing::Test interface.
+ void SetUp() override;
+ void TearDown() override;
+
+ // Used for result verification.
+ bool is_connected_to_host_;
+ protocol::ConnectionToHost::State connection_state_;
+ protocol::ErrorCode error_code_;
+
+ // Used for simulating different conditions for the TestChromotingClient.
+ RemoteHostInfo remote_host_info_;
+ FakeConnectionToHost* fake_connection_to_host_;
+
+ scoped_ptr<TestChromotingClient> test_chromoting_client_;
+
+ private:
+ // RemoteConnectionObserver interface.
+ void ConnectionStateChanged(protocol::ConnectionToHost::State state,
+ protocol::ErrorCode error_code) override;
+ void ConnectionReady(bool ready) override;
+
+ base::MessageLoopForIO message_loop_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestChromotingClientTest);
+};
+
+TestChromotingClientTest::TestChromotingClientTest()
+ : is_connected_to_host_(false),
+ connection_state_(protocol::ConnectionToHost::INITIALIZING),
+ error_code_(protocol::OK),
+ fake_connection_to_host_(nullptr) {
+}
+
+TestChromotingClientTest::~TestChromotingClientTest() {
+}
+
+void TestChromotingClientTest::SetUp() {
+ test_chromoting_client_.reset(new TestChromotingClient());
+ test_chromoting_client_->AddRemoteConnectionObserver(this);
+
+ // Pass ownership of the FakeConnectionToHost to the chromoting instance but
+ // keep the ptr around so we can use it to simulate state changes. It will
+ // remain valid until |test_chromoting_client_| is destroyed.
+ fake_connection_to_host_ = new FakeConnectionToHost();
+ test_chromoting_client_->SetConnectionToHostForTests(
+ make_scoped_ptr(fake_connection_to_host_));
+
+ remote_host_info_.remote_host_status = kRemoteHostStatusReady;
+}
+
+void TestChromotingClientTest::TearDown() {
+ test_chromoting_client_->RemoveRemoteConnectionObserver(this);
+ fake_connection_to_host_ = nullptr;
+
+ // The chromoting instance must be destroyed before the message loop.
+ test_chromoting_client_.reset();
+
+ // The LibjingleTransportFactory destroys the PortAllocator via a DeleteSoon
+ // operation. If we do not allow the message loop to run here, we run the
+ // risk of the DeleteSoon task being dropped and incurring a memory leak.
+ message_loop_.RunUntilIdle();
+}
+
+void TestChromotingClientTest::ConnectionStateChanged(
+ protocol::ConnectionToHost::State state,
+ protocol::ErrorCode error_code) {
+ connection_state_ = state;
+ error_code_ = error_code;
+
+ if (state != protocol::ConnectionToHost::State::CONNECTED ||
+ error_code != protocol::ErrorCode::OK) {
+ is_connected_to_host_ = false;
+ }
+}
+
+void TestChromotingClientTest::ConnectionReady(bool ready) {
+ if (ready) {
+ is_connected_to_host_ = true;
+ }
+}
+
+TEST_F(TestChromotingClientTest, StartConnectionAndDisconnect) {
+ test_chromoting_client_->StartConnection(kTestUserName, kAccessToken,
+ remote_host_info_);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTING, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Simulate an AUTHENTICATED message being sent from the Jingle session.
+ fake_connection_to_host_->OnSessionStateChange(
+ protocol::Session::AUTHENTICATED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::AUTHENTICATED,
+ connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Simulate a CONNECTED message being sent from the Jingle session.
+ fake_connection_to_host_->OnSessionStateChange(protocol::Session::CONNECTED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // TestChromotingClient will consider its connection to the host
+ // complete once the video channel is active.
+ fake_connection_to_host_->OnVideoChannelStatus(true);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_TRUE(is_connected_to_host_);
+
+ test_chromoting_client_->EndConnection();
+ EXPECT_EQ(protocol::ConnectionToHost::State::CLOSED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+}
+
+TEST_F(TestChromotingClientTest,
+ StartConnectionThenFailWithAuthenticationError) {
+ test_chromoting_client_->StartConnection(kTestUserName, kAccessToken,
+ remote_host_info_);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTING, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ fake_connection_to_host_->set_session_state_change_error_code(
+ protocol::AUTHENTICATION_FAILED);
+ fake_connection_to_host_->OnSessionStateChange(protocol::Session::FAILED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::FAILED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::AUTHENTICATION_FAILED, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Close the connection via the TestChromotingClient and verify the error
+ // state is persisted.
+ test_chromoting_client_->EndConnection();
+ EXPECT_EQ(protocol::ConnectionToHost::State::FAILED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::AUTHENTICATION_FAILED, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+}
+
+TEST_F(TestChromotingClientTest, StartConnectionThenFailWithUnknownError) {
+ test_chromoting_client_->StartConnection(kTestUserName, kAccessToken,
+ remote_host_info_);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTING, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Simulate an AUTHENTICATED message being sent from the Jingle session.
+ fake_connection_to_host_->OnSessionStateChange(
+ protocol::Session::AUTHENTICATED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::AUTHENTICATED,
+ connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Simulate a CONNECTED message being sent from the Jingle session.
+ fake_connection_to_host_->OnSessionStateChange(protocol::Session::CONNECTED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // TestChromotingClient will consider its connection to the host complete
+ // once the video channel is active.
+ fake_connection_to_host_->OnVideoChannelStatus(true);
+ EXPECT_EQ(protocol::ConnectionToHost::State::CONNECTED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::OK, error_code_);
+ EXPECT_TRUE(is_connected_to_host_);
+
+ fake_connection_to_host_->set_session_state_change_error_code(
+ protocol::UNKNOWN_ERROR);
+ fake_connection_to_host_->OnSessionStateChange(protocol::Session::FAILED);
+ EXPECT_EQ(protocol::ConnectionToHost::State::FAILED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::UNKNOWN_ERROR, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+
+ // Close the connection via the TestChromotingClient and verify the error
+ // state is persisted.
+ test_chromoting_client_->EndConnection();
+ EXPECT_EQ(protocol::ConnectionToHost::State::FAILED, connection_state_);
+ EXPECT_EQ(protocol::ErrorCode::UNKNOWN_ERROR, error_code_);
+ EXPECT_FALSE(is_connected_to_host_);
+}
+
+} // namespace test
+} // namespace remoting

Powered by Google App Engine
This is Rietveld 408576698