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

Side by Side Diff: remoting/host/security_key/gnubby_extension_session_unittest.cc

Issue 2085353004: Update GnubbyAuthHandler to use the current session ID (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@host_extension
Patch Set: Fixing a non-windows build break and some additional cleanup Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/host/security_key/gnubby_extension_session.h" 5 #include "remoting/host/security_key/gnubby_extension_session.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/message_loop/message_loop.h" 14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
17 #include "base/threading/thread_task_runner_handle.h" 17 #include "base/threading/thread_task_runner_handle.h"
18 #include "base/timer/mock_timer.h" 18 #include "base/timer/mock_timer.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "net/base/io_buffer.h" 20 #include "net/base/io_buffer.h"
21 #include "net/base/net_errors.h" 21 #include "net/base/net_errors.h"
22 #include "net/base/test_completion_callback.h" 22 #include "net/base/test_completion_callback.h"
23 #include "net/socket/unix_domain_client_socket_posix.h" 23 #include "net/socket/unix_domain_client_socket_posix.h"
24 #include "remoting/host/client_session_details.h"
24 #include "remoting/host/host_mock_objects.h" 25 #include "remoting/host/host_mock_objects.h"
25 #include "remoting/host/security_key/gnubby_auth_handler.h" 26 #include "remoting/host/security_key/gnubby_auth_handler.h"
26 #include "remoting/proto/internal.pb.h" 27 #include "remoting/proto/internal.pb.h"
27 #include "remoting/protocol/client_stub.h" 28 #include "remoting/protocol/client_stub.h"
28 #include "testing/gmock/include/gmock/gmock.h" 29 #include "testing/gmock/include/gmock/gmock.h"
29 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
30 31
31 namespace remoting { 32 namespace remoting {
32 33
33 namespace { 34 namespace {
(...skipping 12 matching lines...) Expand all
46 0xe6, 0x84, 0x8f, 0xa3, 0x9d, 0x65, 0x4e, 0x2f, 0x57, 0xe3, 0xf6, 0xe6, 47 0xe6, 0x84, 0x8f, 0xa3, 0x9d, 0x65, 0x4e, 0x2f, 0x57, 0xe3, 0xf6, 0xe6,
47 0x20, 0x3c, 0x00, 0xc6, 0xe1, 0x73, 0x34, 0xe2, 0x23, 0x99, 0xc4, 0xfa, 48 0x20, 0x3c, 0x00, 0xc6, 0xe1, 0x73, 0x34, 0xe2, 0x23, 0x99, 0xc4, 0xfa,
48 0x91, 0xc2, 0xd5, 0x97, 0xc1, 0x8b, 0xd0, 0x3c, 0x13, 0xba, 0xf0, 0xd7, 49 0x91, 0xc2, 0xd5, 0x97, 0xc1, 0x8b, 0xd0, 0x3c, 0x13, 0xba, 0xf0, 0xd7,
49 0x5e, 0xa3, 0xbc, 0x02, 0x5b, 0xec, 0xe4, 0x4b, 0xae, 0x0e, 0xf2, 0xbd, 50 0x5e, 0xa3, 0xbc, 0x02, 0x5b, 0xec, 0xe4, 0x4b, 0xae, 0x0e, 0xf2, 0xbd,
50 0xc8, 0xaa}; 51 0xc8, 0xaa};
51 52
52 } // namespace 53 } // namespace
53 54
54 class TestClientStub : public protocol::ClientStub { 55 class TestClientStub : public protocol::ClientStub {
55 public: 56 public:
56 TestClientStub() : run_loop_(new base::RunLoop) {} 57 TestClientStub();
57 ~TestClientStub() override {} 58 ~TestClientStub() override;
58 59
59 // protocol::ClientStub implementation. 60 // protocol::ClientStub implementation.
60 void SetCapabilities(const protocol::Capabilities& capabilities) override {} 61 void SetCapabilities(const protocol::Capabilities& capabilities) override;
61
62 void SetPairingResponse( 62 void SetPairingResponse(
63 const protocol::PairingResponse& pairing_response) override {} 63 const protocol::PairingResponse& pairing_response) override;
64 64 void DeliverHostMessage(const protocol::ExtensionMessage& message) override;
65 void DeliverHostMessage(const protocol::ExtensionMessage& message) override { 65 void SetVideoLayout(const protocol::VideoLayout& layout) override;
66 message_ = message;
67 run_loop_->Quit();
68 }
69
70 void SetVideoLayout(const protocol::VideoLayout& layout) override {}
71 66
72 // protocol::ClipboardStub implementation. 67 // protocol::ClipboardStub implementation.
73 void InjectClipboardEvent(const protocol::ClipboardEvent& event) override {} 68 void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
74 69
75 // protocol::CursorShapeStub implementation. 70 // protocol::CursorShapeStub implementation.
76 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override {} 71 void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
77 72
78 void WaitForDeliverHostMessage(base::TimeDelta max_timeout) { 73 void WaitForDeliverHostMessage(base::TimeDelta max_timeout);
79 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
80 FROM_HERE, run_loop_->QuitClosure(), max_timeout);
81 run_loop_->Run();
82 run_loop_.reset(new base::RunLoop);
83 }
84 74
85 void CheckHostDataMessage(int id, const std::string& data) { 75 void CheckHostDataMessage(int id, const std::string& data);
86 std::string connection_id = base::StringPrintf("\"connectionId\":%d", id);
87 std::string data_message = base::StringPrintf("\"data\":%s", data.c_str());
88
89 ASSERT_TRUE(message_.type() == "gnubby-auth" ||
90 message_.type() == "auth-v1");
91 ASSERT_NE(message_.data().find("\"type\":\"data\""), std::string::npos);
92 ASSERT_NE(message_.data().find(connection_id), std::string::npos);
93 ASSERT_NE(message_.data().find(data_message), std::string::npos);
94 }
95 76
96 private: 77 private:
97 protocol::ExtensionMessage message_; 78 protocol::ExtensionMessage message_;
98 std::unique_ptr<base::RunLoop> run_loop_; 79 std::unique_ptr<base::RunLoop> run_loop_;
99 80
100 DISALLOW_COPY_AND_ASSIGN(TestClientStub); 81 DISALLOW_COPY_AND_ASSIGN(TestClientStub);
101 }; 82 };
102 83
84 TestClientStub::TestClientStub() : run_loop_(new base::RunLoop) {}
85
86 TestClientStub::~TestClientStub() {}
87
88 void TestClientStub::SetCapabilities(
89 const protocol::Capabilities& capabilities) {}
90
91 void TestClientStub::SetPairingResponse(
92 const protocol::PairingResponse& pairing_response) {}
93
94 void TestClientStub::DeliverHostMessage(
95 const protocol::ExtensionMessage& message) {
96 message_ = message;
97 run_loop_->Quit();
98 }
99
100 void TestClientStub::SetVideoLayout(const protocol::VideoLayout& layout) {}
101
102 void TestClientStub::InjectClipboardEvent(
103 const protocol::ClipboardEvent& event) {}
104
105 void TestClientStub::SetCursorShape(
106 const protocol::CursorShapeInfo& cursor_shape) {}
107
108 void TestClientStub::WaitForDeliverHostMessage(base::TimeDelta max_timeout) {
109 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
110 FROM_HERE, run_loop_->QuitClosure(), max_timeout);
111 run_loop_->Run();
112 run_loop_.reset(new base::RunLoop);
113 }
114
115 void TestClientStub::CheckHostDataMessage(int id, const std::string& data) {
116 std::string connection_id = base::StringPrintf("\"connectionId\":%d", id);
117 std::string data_message = base::StringPrintf("\"data\":%s", data.c_str());
118
119 ASSERT_TRUE(message_.type() == "gnubby-auth" || message_.type() == "auth-v1");
120 ASSERT_NE(message_.data().find("\"type\":\"data\""), std::string::npos);
121 ASSERT_NE(message_.data().find(connection_id), std::string::npos);
122 ASSERT_NE(message_.data().find(data_message), std::string::npos);
123 }
124
125 class TestClientSessionDetails : public ClientSessionDetails {
126 public:
127 TestClientSessionDetails();
128 ~TestClientSessionDetails() override;
129
130 // ClientSessionDetails interface.
131 uint32_t desktop_session_id() const override { return desktop_session_id_; }
132 ClientSessionControl* session_control() override { return nullptr; }
133
134 void set_desktop_session_id(uint32_t new_id) { desktop_session_id_ = new_id; }
135
136 private:
137 uint32_t desktop_session_id_ = UINT32_MAX;
138
139 DISALLOW_COPY_AND_ASSIGN(TestClientSessionDetails);
140 };
141
142 TestClientSessionDetails::TestClientSessionDetails() {}
143
144 TestClientSessionDetails::~TestClientSessionDetails() {}
145
103 class GnubbyExtensionSessionTest : public testing::Test { 146 class GnubbyExtensionSessionTest : public testing::Test {
104 public: 147 public:
105 GnubbyExtensionSessionTest() 148 GnubbyExtensionSessionTest();
106 : gnubby_extension_session_(new GnubbyExtensionSession(&client_stub_)) { 149 ~GnubbyExtensionSessionTest() override;
107 // We want to retain ownership of mock object so we can use it to inject
108 // events into the extension session. The mock object should not be used
109 // once |gnubby_extension_session_| is destroyed.
110 mock_gnubby_auth_handler_ = new MockGnubbyAuthHandler();
111 gnubby_extension_session_->SetGnubbyAuthHandlerForTesting(
112 base::WrapUnique(mock_gnubby_auth_handler_));
113 }
114 150
115 void WaitForAndVerifyHostMessage() { 151 void WaitForAndVerifyHostMessage();
116 client_stub_.WaitForDeliverHostMessage(
117 base::TimeDelta::FromMilliseconds(500));
118 base::ListValue expected_data;
119 152
120 // Skip first four bytes. 153 void CreateGnubbyConnection();
121 for (size_t i = 4; i < sizeof(kRequestData); ++i) {
122 expected_data.AppendInteger(kRequestData[i]);
123 }
124
125 std::string expected_data_json;
126 base::JSONWriter::Write(expected_data, &expected_data_json);
127 client_stub_.CheckHostDataMessage(1, expected_data_json);
128 }
129
130 void CreateGnubbyConnection() {
131 EXPECT_CALL(*mock_gnubby_auth_handler_, CreateGnubbyConnection()).Times(1);
132
133 protocol::ExtensionMessage message;
134 message.set_type("gnubby-auth");
135 message.set_data("{\"type\":\"control\",\"option\":\"auth-v1\"}");
136
137 ASSERT_TRUE(gnubby_extension_session_->OnExtensionMessage(nullptr, nullptr,
138 message));
139 }
140 154
141 protected: 155 protected:
142 base::MessageLoopForIO message_loop_; 156 base::MessageLoopForIO message_loop_;
143 157
144 // Object under test. 158 // Object under test.
145 std::unique_ptr<GnubbyExtensionSession> gnubby_extension_session_; 159 std::unique_ptr<GnubbyExtensionSession> gnubby_extension_session_;
146 160
147 MockGnubbyAuthHandler* mock_gnubby_auth_handler_ = nullptr; 161 MockGnubbyAuthHandler* mock_gnubby_auth_handler_ = nullptr;
148 162
149 TestClientStub client_stub_; 163 TestClientStub client_stub_;
164 TestClientSessionDetails client_details_;
150 165
151 private: 166 private:
152 DISALLOW_COPY_AND_ASSIGN(GnubbyExtensionSessionTest); 167 DISALLOW_COPY_AND_ASSIGN(GnubbyExtensionSessionTest);
153 }; 168 };
154 169
170 GnubbyExtensionSessionTest::GnubbyExtensionSessionTest()
171 : gnubby_extension_session_(
172 new GnubbyExtensionSession(&client_details_, &client_stub_)) {
173 // We want to retain ownership of mock object so we can use it to inject
174 // events into the extension session. The mock object should not be used
175 // once |gnubby_extension_session_| is destroyed.
176 mock_gnubby_auth_handler_ = new MockGnubbyAuthHandler();
177 EXPECT_CALL(*mock_gnubby_auth_handler_, SetSessionIdCallback(testing::_))
178 .Times(1);
179 gnubby_extension_session_->SetGnubbyAuthHandlerForTesting(
180 base::WrapUnique(mock_gnubby_auth_handler_));
181 }
182
183 GnubbyExtensionSessionTest::~GnubbyExtensionSessionTest() {}
184
185 void GnubbyExtensionSessionTest::WaitForAndVerifyHostMessage() {
186 client_stub_.WaitForDeliverHostMessage(
187 base::TimeDelta::FromMilliseconds(500));
188 base::ListValue expected_data;
189
190 // Skip first four bytes.
191 for (size_t i = 4; i < sizeof(kRequestData); ++i) {
192 expected_data.AppendInteger(kRequestData[i]);
193 }
194
195 std::string expected_data_json;
196 base::JSONWriter::Write(expected_data, &expected_data_json);
197 client_stub_.CheckHostDataMessage(1, expected_data_json);
198 }
199
200 void GnubbyExtensionSessionTest::CreateGnubbyConnection() {
201 EXPECT_CALL(*mock_gnubby_auth_handler_, CreateGnubbyConnection()).Times(1);
202
203 protocol::ExtensionMessage message;
204 message.set_type("gnubby-auth");
205 message.set_data("{\"type\":\"control\",\"option\":\"auth-v1\"}");
206
207 ASSERT_TRUE(
208 gnubby_extension_session_->OnExtensionMessage(nullptr, nullptr, message));
209 }
210
155 TEST_F(GnubbyExtensionSessionTest, GnubbyConnectionCreated_ValidMessage) { 211 TEST_F(GnubbyExtensionSessionTest, GnubbyConnectionCreated_ValidMessage) {
156 CreateGnubbyConnection(); 212 CreateGnubbyConnection();
157 } 213 }
158 214
159 TEST_F(GnubbyExtensionSessionTest, NoGnubbyConnectionCreated_WrongMessageType) { 215 TEST_F(GnubbyExtensionSessionTest, NoGnubbyConnectionCreated_WrongMessageType) {
160 EXPECT_CALL(*mock_gnubby_auth_handler_, CreateGnubbyConnection()).Times(0); 216 EXPECT_CALL(*mock_gnubby_auth_handler_, CreateGnubbyConnection()).Times(0);
161 217
162 protocol::ExtensionMessage message; 218 protocol::ExtensionMessage message;
163 message.set_type("unsupported-gnubby-auth"); 219 message.set_type("unsupported-gnubby-auth");
164 message.set_data("{\"type\":\"control\",\"option\":\"auth-v1\"}"); 220 message.set_data("{\"type\":\"control\",\"option\":\"auth-v1\"}");
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 mock_gnubby_auth_handler_->GetSendMessageCallback().Run(42, "test_msg"); 428 mock_gnubby_auth_handler_->GetSendMessageCallback().Run(42, "test_msg");
373 429
374 client_stub_.WaitForDeliverHostMessage( 430 client_stub_.WaitForDeliverHostMessage(
375 base::TimeDelta::FromMilliseconds(500)); 431 base::TimeDelta::FromMilliseconds(500));
376 432
377 // Expects a JSON array of the ASCII character codes for "test_msg". 433 // Expects a JSON array of the ASCII character codes for "test_msg".
378 client_stub_.CheckHostDataMessage(42, "[116,101,115,116,95,109,115,103]"); 434 client_stub_.CheckHostDataMessage(42, "[116,101,115,116,95,109,115,103]");
379 } 435 }
380 436
381 } // namespace remoting 437 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698