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

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

Issue 2202733004: Renaming Linux security key auth handler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <stddef.h>
6
7 #include <memory>
8 #include <string>
9
10 #include "base/bind.h"
11 #include "base/files/file_path.h"
12 #include "base/files/scoped_temp_dir.h"
13 #include "base/macros.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/threading/thread.h"
17 #include "net/base/io_buffer.h"
18 #include "net/base/net_errors.h"
19 #include "net/base/test_completion_callback.h"
20 #include "net/socket/unix_domain_client_socket_posix.h"
21 #include "remoting/host/security_key/security_key_auth_handler.h"
22 #include "remoting/host/security_key/security_key_socket.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace remoting {
26
27 namespace {
28
29 const char kSocketFilename[] = "socket_for_testing";
30
31 // Test security key request data.
32 const unsigned char kRequestData[] = {
33 0x00, 0x00, 0x00, 0x9a, 0x65, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
34 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x90,
35 0x24, 0x71, 0xf8, 0xf2, 0xe5, 0xdf, 0x7f, 0x81, 0xc7, 0x49, 0xc4, 0xa3,
36 0x58, 0x5c, 0xf6, 0xcc, 0x40, 0x14, 0x28, 0x0c, 0xa0, 0xfa, 0x03, 0x18,
37 0x38, 0xd8, 0x7d, 0x77, 0x2b, 0x3a, 0x00, 0x00, 0x00, 0x20, 0x64, 0x46,
38 0x47, 0x2f, 0xdf, 0x6e, 0xed, 0x7b, 0xf3, 0xc3, 0x37, 0x20, 0xf2, 0x36,
39 0x67, 0x6c, 0x36, 0xe1, 0xb4, 0x5e, 0xbe, 0x04, 0x85, 0xdb, 0x89, 0xa3,
40 0xcd, 0xfd, 0xd2, 0x4b, 0xd6, 0x9f, 0x00, 0x00, 0x00, 0x40, 0x38, 0x35,
41 0x05, 0x75, 0x1d, 0x13, 0x6e, 0xb3, 0x6b, 0x1d, 0x29, 0xae, 0xd3, 0x43,
42 0xe6, 0x84, 0x8f, 0xa3, 0x9d, 0x65, 0x4e, 0x2f, 0x57, 0xe3, 0xf6, 0xe6,
43 0x20, 0x3c, 0x00, 0xc6, 0xe1, 0x73, 0x34, 0xe2, 0x23, 0x99, 0xc4, 0xfa,
44 0x91, 0xc2, 0xd5, 0x97, 0xc1, 0x8b, 0xd0, 0x3c, 0x13, 0xba, 0xf0, 0xd7,
45 0x5e, 0xa3, 0xbc, 0x02, 0x5b, 0xec, 0xe4, 0x4b, 0xae, 0x0e, 0xf2, 0xbd,
46 0xc8, 0xaa};
47
48 void RunUntilIdle() {
49 base::RunLoop run_loop;
50 run_loop.RunUntilIdle();
51 }
52
53 } // namespace
54
55 class SecurityKeyAuthHandlerLinuxTest : public testing::Test {
56 public:
57 SecurityKeyAuthHandlerLinuxTest()
58 : run_loop_(new base::RunLoop()),
59 file_thread_("SecurityKeyAuthHandlerLinuxTest_FileThread") {
60 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
61 socket_path_ = temp_dir_.path().Append(kSocketFilename);
62 remoting::SecurityKeyAuthHandler::SetSecurityKeySocketName(socket_path_);
63
64 EXPECT_TRUE(file_thread_.StartWithOptions(
65 base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
66
67 send_message_callback_ =
68 base::Bind(&SecurityKeyAuthHandlerLinuxTest::SendMessageToClient,
69 base::Unretained(this));
70
71 auth_handler_ = remoting::SecurityKeyAuthHandler::Create(
72 /*client_session_details=*/nullptr, send_message_callback_,
73 file_thread_.task_runner());
74 EXPECT_NE(auth_handler_.get(), nullptr);
75 }
76
77 void CreateSocketAndWait() {
78 ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
79 auth_handler_->CreateSecurityKeyConnection();
80
81 ASSERT_TRUE(file_thread_.task_runner()->PostTaskAndReply(
82 FROM_HERE, base::Bind(&RunUntilIdle), run_loop_->QuitClosure()));
83 run_loop_->Run();
84 run_loop_.reset(new base::RunLoop);
85
86 ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
87 }
88
89 void SendMessageToClient(int connection_id, const std::string& data) {
90 last_connection_id_received_ = connection_id;
91 last_message_received_ = data;
92 run_loop_->Quit();
93 }
94
95 void WaitForSendMessageToClient() {
96 run_loop_->Run();
97 run_loop_.reset(new base::RunLoop);
98 }
99
100 void CheckHostDataMessage(int id, const std::string& expected_data) {
101 ASSERT_EQ(id, last_connection_id_received_);
102 ASSERT_EQ(expected_data.length(), last_message_received_.length());
103 ASSERT_EQ(expected_data, last_message_received_);
104 }
105
106 void WriteRequestData(net::UnixDomainClientSocket* client_socket) {
107 int request_len = sizeof(kRequestData);
108 scoped_refptr<net::DrainableIOBuffer> request_buffer(
109 new net::DrainableIOBuffer(
110 new net::WrappedIOBuffer(
111 reinterpret_cast<const char*>(kRequestData)),
112 request_len));
113 net::TestCompletionCallback write_callback;
114 int bytes_written = 0;
115 while (bytes_written < request_len) {
116 int write_result = client_socket->Write(request_buffer.get(),
117 request_buffer->BytesRemaining(),
118 write_callback.callback());
119 write_result = write_callback.GetResult(write_result);
120 ASSERT_GT(write_result, 0);
121 bytes_written += write_result;
122 ASSERT_LE(bytes_written, request_len);
123 request_buffer->DidConsume(write_result);
124 }
125 ASSERT_EQ(request_len, bytes_written);
126 }
127
128 void WaitForAndVerifyHostMessage(int connection_id) {
129 WaitForSendMessageToClient();
130 std::string expected_data;
131 expected_data.reserve(sizeof(kRequestData) - 4);
132
133 // Skip first four bytes and build up the response string.
134 for (size_t i = 4; i < sizeof(kRequestData); ++i) {
135 expected_data.append(1, static_cast<unsigned char>(kRequestData[i]));
136 }
137
138 CheckHostDataMessage(connection_id, expected_data);
139 }
140
141 protected:
142 base::MessageLoopForIO message_loop_;
143 std::unique_ptr<base::RunLoop> run_loop_;
144
145 base::Thread file_thread_;
146
147 // Object under test.
148 std::unique_ptr<SecurityKeyAuthHandler> auth_handler_;
149
150 SecurityKeyAuthHandler::SendMessageCallback send_message_callback_;
151
152 int last_connection_id_received_ = -1;
153 std::string last_message_received_;
154
155 base::ScopedTempDir temp_dir_;
156 base::FilePath socket_path_;
157 base::Closure accept_callback_;
158
159 private:
160 DISALLOW_COPY_AND_ASSIGN(SecurityKeyAuthHandlerLinuxTest);
161 };
162
163 TEST_F(SecurityKeyAuthHandlerLinuxTest, NotClosedAfterRequest) {
164 CreateSocketAndWait();
165
166 net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
167 net::TestCompletionCallback connect_callback;
168
169 int rv = client_socket.Connect(connect_callback.callback());
170 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
171
172 // Write the request and verify the response.
173 WriteRequestData(&client_socket);
174 WaitForAndVerifyHostMessage(1);
175
176 // Verify the connection is now valid.
177 ASSERT_TRUE(auth_handler_->IsValidConnectionId(1));
178
179 // Verify that completing a request/response cycle didn't close the socket.
180 ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest());
181 }
182
183 TEST_F(SecurityKeyAuthHandlerLinuxTest, HandleTwoRequests) {
184 CreateSocketAndWait();
185
186 net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
187 net::TestCompletionCallback connect_callback;
188
189 int rv = client_socket.Connect(connect_callback.callback());
190 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
191
192 // Write the request and verify the response.
193 WriteRequestData(&client_socket);
194 WaitForAndVerifyHostMessage(1);
195
196 // Verify the connection is now valid.
197 ASSERT_TRUE(auth_handler_->IsValidConnectionId(1));
198
199 // Repeat the request/response cycle.
200 WriteRequestData(&client_socket);
201 WaitForAndVerifyHostMessage(1);
202
203 // Verify the connection is still valid.
204 ASSERT_TRUE(auth_handler_->IsValidConnectionId(1));
205
206 // Verify that completing two request/response cycles didn't close the
207 // socket.
208 ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest());
209 }
210
211 TEST_F(SecurityKeyAuthHandlerLinuxTest, HandleTwoIndependentRequests) {
212 CreateSocketAndWait();
213
214 net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
215 net::TestCompletionCallback connect_callback;
216
217 int rv = client_socket.Connect(connect_callback.callback());
218 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
219
220 // Write the request and verify the response.
221 WriteRequestData(&client_socket);
222 WaitForAndVerifyHostMessage(1);
223
224 // Verify the first connection is now valid.
225 ASSERT_TRUE(auth_handler_->IsValidConnectionId(1));
226
227 // Disconnect and establish a new connection.
228 client_socket.Disconnect();
229 rv = client_socket.Connect(connect_callback.callback());
230 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
231
232 // Repeat the request/response cycle.
233 WriteRequestData(&client_socket);
234 WaitForAndVerifyHostMessage(2);
235
236 // Verify the second connection is valid and the first is not.
237 ASSERT_TRUE(auth_handler_->IsValidConnectionId(2));
238 ASSERT_FALSE(auth_handler_->IsValidConnectionId(1));
239
240 // Verify that the initial socket was released properly.
241 ASSERT_EQ(1u, auth_handler_->GetActiveConnectionCountForTest());
242 }
243
244 TEST_F(SecurityKeyAuthHandlerLinuxTest, DidReadTimeout) {
245 CreateSocketAndWait();
246
247 net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
248 net::TestCompletionCallback connect_callback;
249 int rv = client_socket.Connect(connect_callback.callback());
250 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
251 auth_handler_->SetRequestTimeoutForTest(base::TimeDelta());
252 ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
253 }
254
255 TEST_F(SecurityKeyAuthHandlerLinuxTest, ClientErrorMessageDelivered) {
256 CreateSocketAndWait();
257
258 net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
259 net::TestCompletionCallback connect_callback;
260 int rv = client_socket.Connect(connect_callback.callback());
261 ASSERT_EQ(net::OK, connect_callback.GetResult(rv));
262
263 auth_handler_->SendErrorAndCloseConnection(1);
264 ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
265 }
266
267 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698