| Index: mojo/services/network/udp_socket_unittest.cc
|
| diff --git a/mojo/services/network/udp_socket_unittest.cc b/mojo/services/network/udp_socket_unittest.cc
|
| deleted file mode 100644
|
| index 9aaf1f2042791bd8aee22991d8d3a72742e3e47b..0000000000000000000000000000000000000000
|
| --- a/mojo/services/network/udp_socket_unittest.cc
|
| +++ /dev/null
|
| @@ -1,652 +0,0 @@
|
| -// Copyright 2014 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 <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/run_loop.h"
|
| -#include "mojo/public/cpp/bindings/callback.h"
|
| -#include "mojo/services/network/public/cpp/udp_socket_wrapper.h"
|
| -#include "mojo/services/network/public/interfaces/network_service.mojom.h"
|
| -#include "mojo/services/network/public/interfaces/udp_socket.mojom.h"
|
| -#include "mojo/shell/public/cpp/shell_test.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace mojo {
|
| -namespace service {
|
| -namespace {
|
| -
|
| -NetAddressPtr GetLocalHostWithAnyPort() {
|
| - NetAddressPtr addr(NetAddress::New());
|
| - addr->family = NetAddressFamily::IPV4;
|
| - addr->ipv4 = NetAddressIPv4::New();
|
| - addr->ipv4->port = 0;
|
| - addr->ipv4->addr.resize(4);
|
| - addr->ipv4->addr[0] = 127;
|
| - addr->ipv4->addr[1] = 0;
|
| - addr->ipv4->addr[2] = 0;
|
| - addr->ipv4->addr[3] = 1;
|
| -
|
| - return addr;
|
| -}
|
| -
|
| -Array<uint8_t> CreateTestMessage(uint8_t initial, size_t size) {
|
| - Array<uint8_t> array(size);
|
| - for (size_t i = 0; i < size; ++i)
|
| - array[i] = static_cast<uint8_t>((i + initial) % 256);
|
| - return array;
|
| -}
|
| -
|
| -template <typename CallbackType>
|
| -class TestCallbackBase {
|
| - public:
|
| - TestCallbackBase() : state_(nullptr), run_loop_(nullptr), ran_(false) {}
|
| -
|
| - ~TestCallbackBase() {
|
| - state_->set_test_callback(nullptr);
|
| - }
|
| -
|
| - CallbackType callback() const { return callback_; }
|
| -
|
| - void WaitForResult() {
|
| - if (ran_)
|
| - return;
|
| -
|
| - base::RunLoop run_loop;
|
| - run_loop_ = &run_loop;
|
| - run_loop.Run();
|
| - run_loop_ = nullptr;
|
| - }
|
| -
|
| - protected:
|
| - struct StateBase : public CallbackType::Runnable {
|
| - StateBase() : test_callback_(nullptr) {}
|
| - ~StateBase() override {}
|
| -
|
| - void set_test_callback(TestCallbackBase* test_callback) {
|
| - test_callback_ = test_callback;
|
| - }
|
| -
|
| - protected:
|
| - void NotifyRun() const {
|
| - if (test_callback_) {
|
| - test_callback_->ran_ = true;
|
| - if (test_callback_->run_loop_)
|
| - test_callback_->run_loop_->Quit();
|
| - }
|
| - }
|
| -
|
| - TestCallbackBase* test_callback_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(StateBase);
|
| - };
|
| -
|
| - // Takes ownership of |state|, and guarantees that it lives at least as long
|
| - // as this object.
|
| - void Initialize(StateBase* state) {
|
| - state_ = state;
|
| - state_->set_test_callback(this);
|
| - callback_ = CallbackType(
|
| - static_cast<typename CallbackType::Runnable*>(state_));
|
| - }
|
| -
|
| - private:
|
| - // The lifespan is managed by |callback_| (and its copies).
|
| - StateBase* state_;
|
| - CallbackType callback_;
|
| - base::RunLoop* run_loop_;
|
| - bool ran_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestCallbackBase);
|
| -};
|
| -
|
| -class TestCallback : public TestCallbackBase<Callback<void(NetworkErrorPtr)>> {
|
| - public:
|
| - TestCallback() {
|
| - Initialize(new State());
|
| - }
|
| - ~TestCallback() {}
|
| -
|
| - const NetworkErrorPtr& result() const { return result_; }
|
| -
|
| - private:
|
| - struct State: public StateBase {
|
| - ~State() override {}
|
| -
|
| - void Run(NetworkErrorPtr result) const override {
|
| - if (test_callback_) {
|
| - TestCallback* callback = static_cast<TestCallback*>(test_callback_);
|
| - callback->result_ = std::move(result);
|
| - }
|
| - NotifyRun();
|
| - }
|
| - };
|
| -
|
| - NetworkErrorPtr result_;
|
| -};
|
| -
|
| -class TestCallbackWithAddressAndReceiver
|
| - : public TestCallbackBase<
|
| - Callback<void(NetworkErrorPtr,
|
| - NetAddressPtr,
|
| - InterfaceRequest<UDPSocketReceiver>)>> {
|
| - public:
|
| - TestCallbackWithAddressAndReceiver() { Initialize(new State()); }
|
| - ~TestCallbackWithAddressAndReceiver() {}
|
| -
|
| - const NetworkErrorPtr& result() const { return result_; }
|
| - const NetAddressPtr& net_address() const { return net_address_; }
|
| - InterfaceRequest<UDPSocketReceiver>& receiver() { return receiver_; }
|
| -
|
| - private:
|
| - struct State : public StateBase {
|
| - ~State() override {}
|
| -
|
| - void Run(NetworkErrorPtr result,
|
| - NetAddressPtr net_address,
|
| - InterfaceRequest<UDPSocketReceiver> receiver) const override {
|
| - if (test_callback_) {
|
| - TestCallbackWithAddressAndReceiver* callback =
|
| - static_cast<TestCallbackWithAddressAndReceiver*>(test_callback_);
|
| - callback->result_ = std::move(result);
|
| - callback->net_address_ = std::move(net_address);
|
| - callback->receiver_ = std::move(receiver);
|
| - }
|
| - NotifyRun();
|
| - }
|
| - };
|
| -
|
| - NetworkErrorPtr result_;
|
| - NetAddressPtr net_address_;
|
| - InterfaceRequest<UDPSocketReceiver> receiver_;
|
| -};
|
| -
|
| -class TestCallbackWithAddress
|
| - : public TestCallbackBase<Callback<void(NetworkErrorPtr, NetAddressPtr)>> {
|
| - public:
|
| - TestCallbackWithAddress() {
|
| - Initialize(new State());
|
| - }
|
| - ~TestCallbackWithAddress() {}
|
| -
|
| - const NetworkErrorPtr& result() const { return result_; }
|
| - const NetAddressPtr& net_address() const { return net_address_; }
|
| -
|
| - private:
|
| - struct State : public StateBase {
|
| - ~State() override {}
|
| -
|
| - void Run(NetworkErrorPtr result, NetAddressPtr net_address) const override {
|
| - if (test_callback_) {
|
| - TestCallbackWithAddress* callback =
|
| - static_cast<TestCallbackWithAddress*>(test_callback_);
|
| - callback->result_ = std::move(result);
|
| - callback->net_address_ = std::move(net_address);
|
| - }
|
| - NotifyRun();
|
| - }
|
| - };
|
| -
|
| - NetworkErrorPtr result_;
|
| - NetAddressPtr net_address_;
|
| -};
|
| -
|
| -class TestCallbackWithUint32
|
| - : public TestCallbackBase<Callback<void(uint32_t)>> {
|
| - public:
|
| - TestCallbackWithUint32() : result_(0) {
|
| - Initialize(new State());
|
| - }
|
| - ~TestCallbackWithUint32() {}
|
| -
|
| - uint32_t result() const { return result_; }
|
| -
|
| - private:
|
| - struct State : public StateBase {
|
| - ~State() override {}
|
| -
|
| - void Run(uint32_t result) const override {
|
| - if (test_callback_) {
|
| - TestCallbackWithUint32* callback =
|
| - static_cast<TestCallbackWithUint32*>(test_callback_);
|
| - callback->result_ = result;
|
| - }
|
| - NotifyRun();
|
| - }
|
| - };
|
| -
|
| - uint32_t result_;
|
| -};
|
| -
|
| -class TestReceiveCallback
|
| - : public TestCallbackBase<
|
| - Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>> {
|
| - public:
|
| - TestReceiveCallback() {
|
| - Initialize(new State());
|
| - }
|
| - ~TestReceiveCallback() {}
|
| -
|
| - const NetworkErrorPtr& result() const { return result_; }
|
| - const NetAddressPtr& src_addr() const { return src_addr_; }
|
| - const Array<uint8_t>& data() const { return data_; }
|
| -
|
| - private:
|
| - struct State : public StateBase {
|
| - ~State() override {}
|
| -
|
| - void Run(NetworkErrorPtr result,
|
| - NetAddressPtr src_addr,
|
| - Array<uint8_t> data) const override {
|
| - if (test_callback_) {
|
| - TestReceiveCallback* callback =
|
| - static_cast<TestReceiveCallback*>(test_callback_);
|
| - callback->result_ = std::move(result);
|
| - callback->src_addr_ = std::move(src_addr);
|
| - callback->data_ = std::move(data);
|
| - }
|
| - NotifyRun();
|
| - }
|
| - };
|
| -
|
| - NetworkErrorPtr result_;
|
| - NetAddressPtr src_addr_;
|
| - Array<uint8_t> data_;
|
| -};
|
| -
|
| -struct ReceiveResult {
|
| - NetworkErrorPtr result;
|
| - NetAddressPtr addr;
|
| - Array<uint8_t> data;
|
| -};
|
| -
|
| -class UDPSocketReceiverImpl : public UDPSocketReceiver {
|
| - public:
|
| - UDPSocketReceiverImpl() : run_loop_(nullptr), expected_receive_count_(0) {}
|
| -
|
| - ~UDPSocketReceiverImpl() override {
|
| - while (!results_.empty()) {
|
| - delete results_.front();
|
| - results_.pop();
|
| - }
|
| - }
|
| -
|
| - std::queue<ReceiveResult*>* results() {
|
| - return &results_;
|
| - }
|
| -
|
| - void WaitForReceiveResults(size_t count) {
|
| - if (results_.size() == count)
|
| - return;
|
| -
|
| - expected_receive_count_ = count;
|
| - base::RunLoop run_loop;
|
| - run_loop_ = &run_loop;
|
| - run_loop.Run();
|
| - run_loop_ = nullptr;
|
| - }
|
| -
|
| - private:
|
| - void OnReceived(NetworkErrorPtr result,
|
| - NetAddressPtr src_addr,
|
| - Array<uint8_t> data) override {
|
| - ReceiveResult* entry = new ReceiveResult();
|
| - entry->result = std::move(result);
|
| - entry->addr = std::move(src_addr);
|
| - entry->data = std::move(data);
|
| -
|
| - results_.push(entry);
|
| -
|
| - if (results_.size() == expected_receive_count_ && run_loop_) {
|
| - expected_receive_count_ = 0;
|
| - run_loop_->Quit();
|
| - }
|
| - }
|
| -
|
| - base::RunLoop* run_loop_;
|
| - std::queue<ReceiveResult*> results_;
|
| - size_t expected_receive_count_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(UDPSocketReceiverImpl);
|
| -};
|
| -
|
| -class UDPSocketTest : public test::ShellTest {
|
| - public:
|
| - UDPSocketTest() : ShellTest("exe:network_service_unittests"),
|
| - receiver_binding_(&receiver_) {}
|
| - ~UDPSocketTest() override {}
|
| -
|
| - void SetUp() override {
|
| - ShellTest::SetUp();
|
| - connector()->ConnectToInterface("mojo:network_service", &network_service_);
|
| - network_service_->CreateUDPSocket(GetProxy(&socket_));
|
| - }
|
| -
|
| - protected:
|
| - NetworkServicePtr network_service_;
|
| - UDPSocketPtr socket_;
|
| - UDPSocketReceiverImpl receiver_;
|
| - Binding<UDPSocketReceiver> receiver_binding_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(UDPSocketTest);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST_F(UDPSocketTest, Settings) {
|
| - TestCallback callback1;
|
| - socket_->AllowAddressReuse(callback1.callback());
|
| - callback1.WaitForResult();
|
| - EXPECT_EQ(net::OK, callback1.result()->code);
|
| -
|
| - // Should fail because the socket hasn't been bound.
|
| - TestCallback callback2;
|
| - socket_->SetSendBufferSize(1024, callback2.callback());
|
| - callback2.WaitForResult();
|
| - EXPECT_NE(net::OK, callback2.result()->code);
|
| -
|
| - // Should fail because the socket hasn't been bound.
|
| - TestCallback callback3;
|
| - socket_->SetReceiveBufferSize(2048, callback3.callback());
|
| - callback3.WaitForResult();
|
| - EXPECT_NE(net::OK, callback3.result()->code);
|
| -
|
| - TestCallbackWithAddressAndReceiver callback4;
|
| - socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback());
|
| - callback4.WaitForResult();
|
| - EXPECT_EQ(net::OK, callback4.result()->code);
|
| - EXPECT_NE(0u, callback4.net_address()->ipv4->port);
|
| -
|
| - // Should fail because the socket has been bound.
|
| - TestCallback callback5;
|
| - socket_->AllowAddressReuse(callback5.callback());
|
| - callback5.WaitForResult();
|
| - EXPECT_NE(net::OK, callback5.result()->code);
|
| -
|
| - TestCallback callback6;
|
| - socket_->SetSendBufferSize(1024, callback6.callback());
|
| - callback6.WaitForResult();
|
| - EXPECT_EQ(net::OK, callback6.result()->code);
|
| -
|
| - TestCallback callback7;
|
| - socket_->SetReceiveBufferSize(2048, callback7.callback());
|
| - callback7.WaitForResult();
|
| - EXPECT_EQ(net::OK, callback7.result()->code);
|
| -
|
| - TestCallbackWithUint32 callback8;
|
| - socket_->NegotiateMaxPendingSendRequests(0, callback8.callback());
|
| - callback8.WaitForResult();
|
| - EXPECT_GT(callback8.result(), 0u);
|
| -
|
| - TestCallbackWithUint32 callback9;
|
| - socket_->NegotiateMaxPendingSendRequests(16, callback9.callback());
|
| - callback9.WaitForResult();
|
| - EXPECT_GT(callback9.result(), 0u);
|
| -}
|
| -
|
| -TEST_F(UDPSocketTest, TestReadWrite) {
|
| - TestCallbackWithAddressAndReceiver callback1;
|
| - socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback());
|
| - callback1.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback1.result()->code);
|
| - ASSERT_NE(0u, callback1.net_address()->ipv4->port);
|
| -
|
| - receiver_binding_.Bind(std::move(callback1.receiver()));
|
| -
|
| - NetAddressPtr server_addr = callback1.net_address().Clone();
|
| -
|
| - UDPSocketPtr client_socket;
|
| - network_service_->CreateUDPSocket(GetProxy(&client_socket));
|
| -
|
| - TestCallbackWithAddressAndReceiver callback2;
|
| - client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback());
|
| - callback2.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback2.result()->code);
|
| - ASSERT_NE(0u, callback2.net_address()->ipv4->port);
|
| -
|
| - NetAddressPtr client_addr = callback2.net_address().Clone();
|
| -
|
| - const size_t kDatagramCount = 6;
|
| - const size_t kDatagramSize = 255;
|
| - socket_->ReceiveMore(kDatagramCount);
|
| -
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - TestCallback callback;
|
| - client_socket->SendTo(
|
| - server_addr.Clone(),
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
|
| - callback.callback());
|
| - callback.WaitForResult();
|
| - EXPECT_EQ(255, callback.result()->code);
|
| - }
|
| -
|
| - receiver_.WaitForReceiveResults(kDatagramCount);
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - scoped_ptr<ReceiveResult> result(receiver_.results()->front());
|
| - receiver_.results()->pop();
|
| -
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
|
| - EXPECT_TRUE(result->addr.Equals(client_addr));
|
| - EXPECT_TRUE(result->data.Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(UDPSocketTest, TestConnectedReadWrite) {
|
| - TestCallbackWithAddressAndReceiver callback1;
|
| - socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback());
|
| - callback1.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback1.result()->code);
|
| - ASSERT_NE(0u, callback1.net_address()->ipv4->port);
|
| -
|
| - receiver_binding_.Bind(std::move(callback1.receiver()));
|
| -
|
| - NetAddressPtr server_addr = callback1.net_address().Clone();
|
| -
|
| - UDPSocketPtr client_socket;
|
| - network_service_->CreateUDPSocket(GetProxy(&client_socket));
|
| -
|
| - TestCallbackWithAddressAndReceiver callback2;
|
| - client_socket->Connect(server_addr.Clone(), callback2.callback());
|
| - callback2.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback2.result()->code);
|
| - ASSERT_NE(0u, callback2.net_address()->ipv4->port);
|
| -
|
| - UDPSocketReceiverImpl client_socket_receiver;
|
| - Binding<UDPSocketReceiver> client_receiver_binding(
|
| - &client_socket_receiver, std::move(callback2.receiver()));
|
| -
|
| - NetAddressPtr client_addr = callback2.net_address().Clone();
|
| -
|
| - const size_t kDatagramCount = 6;
|
| - const size_t kDatagramSize = 255;
|
| -
|
| - // Test send using a connected socket.
|
| - socket_->ReceiveMore(kDatagramCount);
|
| -
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - TestCallback callback;
|
| - client_socket->SendTo(
|
| - nullptr,
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
|
| - callback.callback());
|
| - callback.WaitForResult();
|
| - EXPECT_EQ(255, callback.result()->code);
|
| - }
|
| -
|
| - receiver_.WaitForReceiveResults(kDatagramCount);
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - scoped_ptr<ReceiveResult> result(receiver_.results()->front());
|
| - receiver_.results()->pop();
|
| -
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
|
| - EXPECT_TRUE(result->addr.Equals(client_addr));
|
| - EXPECT_TRUE(result->data.Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
|
| - }
|
| -
|
| - // Test receive using a connected socket.
|
| - client_socket->ReceiveMore(kDatagramCount);
|
| -
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - TestCallback callback;
|
| - socket_->SendTo(
|
| - client_addr.Clone(),
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
|
| - callback.callback());
|
| - callback.WaitForResult();
|
| - EXPECT_EQ(255, callback.result()->code);
|
| - }
|
| -
|
| - client_socket_receiver.WaitForReceiveResults(kDatagramCount);
|
| - for (size_t i = 0; i < kDatagramCount; ++i) {
|
| - scoped_ptr<ReceiveResult> result(client_socket_receiver.results()->front());
|
| - client_socket_receiver.results()->pop();
|
| -
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
|
| - EXPECT_FALSE(result->addr);
|
| - EXPECT_TRUE(result->data.Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(UDPSocketTest, TestWrapperReadWrite) {
|
| - UDPSocketWrapper socket(std::move(socket_), 4, 4);
|
| -
|
| - TestCallbackWithAddress callback1;
|
| - socket.Bind(GetLocalHostWithAnyPort(), callback1.callback());
|
| - callback1.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback1.result()->code);
|
| - ASSERT_NE(0u, callback1.net_address()->ipv4->port);
|
| -
|
| - NetAddressPtr server_addr = callback1.net_address().Clone();
|
| -
|
| - UDPSocketPtr raw_client_socket;
|
| - network_service_->CreateUDPSocket(GetProxy(&raw_client_socket));
|
| - UDPSocketWrapper client_socket(std::move(raw_client_socket), 4, 4);
|
| -
|
| - TestCallbackWithAddress callback2;
|
| - client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback());
|
| - callback2.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback2.result()->code);
|
| - ASSERT_NE(0u, callback2.net_address()->ipv4->port);
|
| -
|
| - NetAddressPtr client_addr = callback2.net_address().Clone();
|
| -
|
| - const size_t kDatagramCount = 16;
|
| - const size_t kDatagramSize = 255;
|
| -
|
| - for (size_t i = 1; i < kDatagramCount; ++i) {
|
| - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
|
| - scoped_ptr<TestReceiveCallback[]> receive_callbacks(
|
| - new TestReceiveCallback[i]);
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - client_socket.SendTo(
|
| - server_addr.Clone(),
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
|
| - send_callbacks[j].callback());
|
| -
|
| - socket.ReceiveFrom(receive_callbacks[j].callback());
|
| - }
|
| -
|
| - receive_callbacks[i - 1].WaitForResult();
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize),
|
| - receive_callbacks[j].result()->code);
|
| - EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr));
|
| - EXPECT_TRUE(receive_callbacks[j].data().Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_F(UDPSocketTest, TestWrapperConnectedReadWrite) {
|
| - UDPSocketWrapper socket(std::move(socket_), 4, 4);
|
| -
|
| - TestCallbackWithAddress callback1;
|
| - socket.Bind(GetLocalHostWithAnyPort(), callback1.callback());
|
| - callback1.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback1.result()->code);
|
| - ASSERT_NE(0u, callback1.net_address()->ipv4->port);
|
| -
|
| - NetAddressPtr server_addr = callback1.net_address().Clone();
|
| -
|
| - UDPSocketPtr raw_client_socket;
|
| - network_service_->CreateUDPSocket(GetProxy(&raw_client_socket));
|
| - UDPSocketWrapper client_socket(std::move(raw_client_socket), 4, 4);
|
| -
|
| - TestCallbackWithAddress callback2;
|
| - client_socket.Connect(std::move(server_addr), callback2.callback());
|
| - callback2.WaitForResult();
|
| - ASSERT_EQ(net::OK, callback2.result()->code);
|
| - ASSERT_NE(0u, callback2.net_address()->ipv4->port);
|
| -
|
| - NetAddressPtr client_addr = callback2.net_address().Clone();
|
| -
|
| - const size_t kDatagramCount = 16;
|
| - const size_t kDatagramSize = 255;
|
| -
|
| - // Test send using a connected socket.
|
| - for (size_t i = 1; i < kDatagramCount; ++i) {
|
| - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
|
| - scoped_ptr<TestReceiveCallback[]> receive_callbacks(
|
| - new TestReceiveCallback[i]);
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - client_socket.SendTo(
|
| - nullptr,
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
|
| - send_callbacks[j].callback());
|
| -
|
| - socket.ReceiveFrom(receive_callbacks[j].callback());
|
| - }
|
| -
|
| - receive_callbacks[i - 1].WaitForResult();
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize),
|
| - receive_callbacks[j].result()->code);
|
| - EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr));
|
| - EXPECT_TRUE(receive_callbacks[j].data().Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
|
| - }
|
| - }
|
| -
|
| - // Test receive using a connected socket.
|
| - for (size_t i = 1; i < kDatagramCount; ++i) {
|
| - scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
|
| - scoped_ptr<TestReceiveCallback[]> receive_callbacks(
|
| - new TestReceiveCallback[i]);
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - socket.SendTo(
|
| - client_addr.Clone(),
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
|
| - send_callbacks[j].callback());
|
| -
|
| - client_socket.ReceiveFrom(receive_callbacks[j].callback());
|
| - }
|
| -
|
| - receive_callbacks[i - 1].WaitForResult();
|
| -
|
| - for (size_t j = 0; j < i; ++j) {
|
| - EXPECT_EQ(static_cast<int>(kDatagramSize),
|
| - receive_callbacks[j].result()->code);
|
| - EXPECT_FALSE(receive_callbacks[j].src_addr());
|
| - EXPECT_TRUE(receive_callbacks[j].data().Equals(
|
| - CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace service
|
| -} // namespace mojo
|
|
|