OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "base/at_exit.h" | 5 #include "base/at_exit.h" |
6 #include "base/macros.h" | 6 #include "base/macros.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "mojo/public/cpp/bindings/callback.h" | 8 #include "mojo/public/cpp/bindings/callback.h" |
| 9 #include "mojo/services/public/cpp/network/udp_socket_wrapper.h" |
9 #include "mojo/services/public/interfaces/network/network_service.mojom.h" | 10 #include "mojo/services/public/interfaces/network/network_service.mojom.h" |
10 #include "mojo/services/public/interfaces/network/udp_socket.mojom.h" | 11 #include "mojo/services/public/interfaces/network/udp_socket.mojom.h" |
11 #include "mojo/shell/shell_test_helper.h" | 12 #include "mojo/shell/shell_test_helper.h" |
12 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "url/gurl.h" | 15 #include "url/gurl.h" |
15 | 16 |
16 namespace mojo { | 17 namespace mojo { |
17 namespace service { | 18 namespace service { |
18 namespace { | 19 namespace { |
(...skipping 12 matching lines...) Expand all Loading... |
31 return addr.Pass(); | 32 return addr.Pass(); |
32 } | 33 } |
33 | 34 |
34 Array<uint8_t> CreateTestMessage(uint8_t initial, size_t size) { | 35 Array<uint8_t> CreateTestMessage(uint8_t initial, size_t size) { |
35 Array<uint8_t> array(size); | 36 Array<uint8_t> array(size); |
36 for (size_t i = 0; i < size; ++i) | 37 for (size_t i = 0; i < size; ++i) |
37 array[i] = static_cast<uint8_t>((i + initial) % 256); | 38 array[i] = static_cast<uint8_t>((i + initial) % 256); |
38 return array.Pass(); | 39 return array.Pass(); |
39 } | 40 } |
40 | 41 |
41 bool AreEqualArrays(const Array<uint8_t>& array_1, | |
42 const Array<uint8_t>& array_2) { | |
43 if (array_1.is_null() != array_2.is_null()) | |
44 return false; | |
45 else if (array_1.is_null()) | |
46 return true; | |
47 | |
48 if (array_1.size() != array_2.size()) | |
49 return false; | |
50 | |
51 for (size_t i = 0; i < array_1.size(); ++i) { | |
52 if (array_1[i] != array_2[i]) | |
53 return false; | |
54 } | |
55 | |
56 return true; | |
57 } | |
58 | |
59 template <typename CallbackType> | 42 template <typename CallbackType> |
60 class TestCallbackBase { | 43 class TestCallbackBase { |
61 public: | 44 public: |
62 TestCallbackBase() : state_(nullptr), run_loop_(nullptr), ran_(false) {} | 45 TestCallbackBase() : state_(nullptr), run_loop_(nullptr), ran_(false) {} |
63 | 46 |
64 ~TestCallbackBase() { | 47 ~TestCallbackBase() { |
65 state_->set_test_callback(nullptr); | 48 state_->set_test_callback(nullptr); |
66 } | 49 } |
67 | 50 |
68 CallbackType callback() const { return callback_; } | 51 CallbackType callback() const { return callback_; } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 static_cast<TestCallbackWithUint32*>(test_callback_); | 178 static_cast<TestCallbackWithUint32*>(test_callback_); |
196 callback->result_ = result; | 179 callback->result_ = result; |
197 } | 180 } |
198 NotifyRun(); | 181 NotifyRun(); |
199 } | 182 } |
200 }; | 183 }; |
201 | 184 |
202 uint32_t result_; | 185 uint32_t result_; |
203 }; | 186 }; |
204 | 187 |
| 188 class TestReceiveCallback |
| 189 : public TestCallbackBase< |
| 190 Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>> { |
| 191 public: |
| 192 TestReceiveCallback() { |
| 193 Initialize(new State()); |
| 194 } |
| 195 ~TestReceiveCallback() {} |
| 196 |
| 197 const NetworkErrorPtr& result() const { return result_; } |
| 198 const NetAddressPtr& src_addr() const { return src_addr_; } |
| 199 const Array<uint8_t>& data() const { return data_; } |
| 200 |
| 201 private: |
| 202 struct State : public StateBase { |
| 203 ~State() override {} |
| 204 |
| 205 void Run(NetworkErrorPtr result, |
| 206 NetAddressPtr src_addr, |
| 207 Array<uint8_t> data) const override { |
| 208 if (test_callback_) { |
| 209 TestReceiveCallback* callback = |
| 210 static_cast<TestReceiveCallback*>(test_callback_); |
| 211 callback->result_ = result.Pass(); |
| 212 callback->src_addr_ = src_addr.Pass(); |
| 213 callback->data_ = data.Pass(); |
| 214 } |
| 215 NotifyRun(); |
| 216 } |
| 217 }; |
| 218 |
| 219 NetworkErrorPtr result_; |
| 220 NetAddressPtr src_addr_; |
| 221 Array<uint8_t> data_; |
| 222 }; |
| 223 |
205 class UDPSocketTest : public testing::Test { | 224 class UDPSocketTest : public testing::Test { |
206 public: | 225 public: |
207 UDPSocketTest() {} | 226 UDPSocketTest() {} |
208 ~UDPSocketTest() override {} | 227 ~UDPSocketTest() override {} |
209 | 228 |
210 void SetUp() override { | 229 void SetUp() override { |
211 test_helper_.Init(); | 230 test_helper_.Init(); |
212 | 231 |
213 test_helper_.application_manager()->ConnectToService( | 232 test_helper_.application_manager()->ConnectToService( |
214 GURL("mojo:network_service"), &network_service_); | 233 GURL("mojo:network_service"), &network_service_); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 | 367 |
349 UDPSocketPtr client_socket; | 368 UDPSocketPtr client_socket; |
350 network_service_->CreateUDPSocket(GetProxy(&client_socket)); | 369 network_service_->CreateUDPSocket(GetProxy(&client_socket)); |
351 | 370 |
352 TestCallbackWithAddress callback2; | 371 TestCallbackWithAddress callback2; |
353 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); | 372 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); |
354 callback2.WaitForResult(); | 373 callback2.WaitForResult(); |
355 ASSERT_EQ(net::OK, callback2.result()->code); | 374 ASSERT_EQ(net::OK, callback2.result()->code); |
356 ASSERT_NE(0u, callback2.net_address()->ipv4->port); | 375 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
357 | 376 |
| 377 NetAddressPtr client_addr = callback2.net_address().Clone(); |
| 378 |
358 const size_t kDatagramCount = 6; | 379 const size_t kDatagramCount = 6; |
359 const size_t kDatagramSize = 255; | 380 const size_t kDatagramSize = 255; |
360 udp_socket_->ReceiveMore(kDatagramCount); | 381 udp_socket_->ReceiveMore(kDatagramCount); |
361 | 382 |
362 for (size_t i = 0; i < kDatagramCount; ++i) { | 383 for (size_t i = 0; i < kDatagramCount; ++i) { |
363 TestCallback callback; | 384 TestCallback callback; |
364 client_socket->SendTo( | 385 client_socket->SendTo( |
365 server_addr.Clone(), | 386 server_addr.Clone(), |
366 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), | 387 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), |
367 callback.callback()); | 388 callback.callback()); |
368 callback.WaitForResult(); | 389 callback.WaitForResult(); |
369 EXPECT_EQ(255, callback.result()->code); | 390 EXPECT_EQ(255, callback.result()->code); |
370 } | 391 } |
371 | 392 |
372 WaitForReceiveResults(kDatagramCount); | 393 WaitForReceiveResults(kDatagramCount); |
373 for (size_t i = 0; i < kDatagramCount; ++i) { | 394 for (size_t i = 0; i < kDatagramCount; ++i) { |
374 scoped_ptr<ReceiveResult> result(GetReceiveResults()->front()); | 395 scoped_ptr<ReceiveResult> result(GetReceiveResults()->front()); |
375 GetReceiveResults()->pop(); | 396 GetReceiveResults()->pop(); |
376 | 397 |
377 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); | 398 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); |
378 EXPECT_TRUE(AreEqualArrays( | 399 EXPECT_TRUE(result->addr.Equals(client_addr)); |
379 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), | 400 EXPECT_TRUE(result->data.Equals( |
380 result->data)); | 401 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); |
381 } | 402 } |
382 } | 403 } |
383 | 404 |
| 405 TEST_F(UDPSocketTest, TestUDPSocketWrapper) { |
| 406 UDPSocketWrapper udp_socket(udp_socket_.Pass(), 4, 4); |
| 407 |
| 408 TestCallbackWithAddress callback1; |
| 409 udp_socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); |
| 410 callback1.WaitForResult(); |
| 411 ASSERT_EQ(net::OK, callback1.result()->code); |
| 412 ASSERT_NE(0u, callback1.net_address()->ipv4->port); |
| 413 |
| 414 NetAddressPtr server_addr = callback1.net_address().Clone(); |
| 415 |
| 416 UDPSocketPtr raw_client_socket; |
| 417 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); |
| 418 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); |
| 419 |
| 420 TestCallbackWithAddress callback2; |
| 421 client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); |
| 422 callback2.WaitForResult(); |
| 423 ASSERT_EQ(net::OK, callback2.result()->code); |
| 424 ASSERT_NE(0u, callback2.net_address()->ipv4->port); |
| 425 |
| 426 NetAddressPtr client_addr = callback2.net_address().Clone(); |
| 427 |
| 428 const size_t kDatagramCount = 16; |
| 429 const size_t kDatagramSize = 255; |
| 430 |
| 431 for (size_t i = 1; i < kDatagramCount; ++i) { |
| 432 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); |
| 433 scoped_ptr<TestReceiveCallback[]> receive_callbacks( |
| 434 new TestReceiveCallback[i]); |
| 435 |
| 436 for (size_t j = 0; j < i; ++j) { |
| 437 client_socket.SendTo( |
| 438 server_addr.Clone(), |
| 439 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), |
| 440 send_callbacks[j].callback()); |
| 441 |
| 442 udp_socket.ReceiveFrom(receive_callbacks[j].callback()); |
| 443 } |
| 444 |
| 445 receive_callbacks[i - 1].WaitForResult(); |
| 446 |
| 447 for (size_t j = 0; j < i; ++j) { |
| 448 EXPECT_EQ(static_cast<int>(kDatagramSize), |
| 449 receive_callbacks[j].result()->code); |
| 450 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); |
| 451 EXPECT_TRUE(receive_callbacks[j].data().Equals( |
| 452 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); |
| 453 } |
| 454 } |
| 455 } |
| 456 |
384 } // namespace service | 457 } // namespace service |
385 } // namespace mojo | 458 } // namespace mojo |
OLD | NEW |