virtualsocket_unittest.cc revision f358aea7bff8091c608e1afd8cf395ec2702ff76
1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2006 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <math.h> 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <time.h> 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <netinet/in.h> 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/logging.h" 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h" 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/testclient.h" 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/testutils.h" 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/thread.h" 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/timeutils.h" 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/virtualsocketserver.h" 24fded02c164ea4cc3d28d7f30ac9ce9d94d76ef7ahenrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h" 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgusing namespace rtc; 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Sends at a constant rate but with random packet sizes. 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct Sender : public MessageHandler { 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Sender(Thread* th, AsyncSocket* s, uint32 rt) 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : thread(th), socket(new AsyncUDPSocket(s)), 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org done(false), rate(rt), count(0) { 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org last_send = rtc::Time(); 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org thread->PostDelayed(NextDelay(), this, 1); 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 NextDelay() { 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 size = (rand() % 4096) + 1; 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return 1000 * size / rate; 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void OnMessage(Message* pmsg) { 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(1u, pmsg->message_id); 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (done) 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 cur_time = rtc::Time(); 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 delay = cur_time - last_send; 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 size = rate * delay / 1000; 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size = std::min<uint32>(size, 4096); 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size = std::max<uint32>(size, sizeof(uint32)); 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org count += size; 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(dummy, &cur_time, sizeof(cur_time)); 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->Send(dummy, size, options); 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org last_send = cur_time; 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org thread->PostDelayed(NextDelay(), this, 1); 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* thread; 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncUDPSocket> socket; 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::PacketOptions options; 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool done; 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 rate; // bytes per second 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 count; 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 last_send; 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char dummy[4096]; 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstruct Receiver : public MessageHandler, public sigslot::has_slots<> { 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Receiver(Thread* th, AsyncSocket* s, uint32 bw) 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : thread(th), socket(new AsyncUDPSocket(s)), bandwidth(bw), done(false), 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org count(0), sec_count(0), sum(0), sum_sq(0), samples(0) { 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org thread->PostDelayed(1000, this, 1); 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ~Receiver() { 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org thread->Clear(this); 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size, 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& remote_addr, 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const PacketTime& packet_time) { 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(socket.get(), s); 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_GE(size, 4U); 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org count += size; 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sec_count += size; 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 send_time = *reinterpret_cast<const uint32*>(data); 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 recv_time = rtc::Time(); 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 delay = recv_time - send_time; 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum += delay; 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum_sq += delay * delay; 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org samples += 1; 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void OnMessage(Message* pmsg) { 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(1u, pmsg->message_id); 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (done) 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It is always possible for us to receive more than expected because 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // packets can be further delayed in delivery. 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (bandwidth > 0) 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(sec_count <= 5 * bandwidth / 4); 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sec_count = 0; 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org thread->PostDelayed(1000, this, 1); 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* thread; 116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncUDPSocket> socket; 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 bandwidth; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool done; 119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t count; 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t sec_count; 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum; 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum_sq; 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 samples; 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass VirtualSocketServerTest : public testing::Test { 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)), 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kIPv6AnyAddress(IPAddress(in6addr_any), 0) { 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 133d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org void CheckPortIncrementalization(const SocketAddress& post, 134d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org const SocketAddress& pre) { 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(post.port(), pre.port() + 1); 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress post_ip = post.ipaddr(); 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IPAddress pre_ip = pre.ipaddr(); 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(pre_ip.family(), post_ip.family()); 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (post_ip.family() == AF_INET) { 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org in_addr pre_ipv4 = pre_ip.ipv4_address(); 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org in_addr post_ipv4 = post_ip.ipv4_address(); 142d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr); 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else if (post_ip.family() == AF_INET6) { 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org in6_addr post_ip6 = post_ip.ipv6_address(); 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org in6_addr pre_ip6 = pre_ip.ipv6_address(); 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32* post_as_ints = reinterpret_cast<uint32*>(&post_ip6.s6_addr); 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32* pre_as_ints = reinterpret_cast<uint32*>(&pre_ip6.s6_addr); 148d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org EXPECT_EQ(post_as_ints[3], pre_as_ints[3]); 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void BasicTest(const SocketAddress& initial_addr) { 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(), 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_DGRAM); 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->Bind(initial_addr); 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress server_addr = socket->GetLocalAddress(); 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make sure VSS didn't switch families on us. 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server_addr.family(), initial_addr.family()); 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket2 = 162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client2_addr; 166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client1_addr; 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client1_addr, server_addr); 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (int i = 0; i < 10; i++) { 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty)); 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress next_client2_addr; 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); 181d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org CheckPortIncrementalization(next_client2_addr, client2_addr); 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress server_addr2; 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server_addr2, server_addr); 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client2_addr = next_client2_addr; 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // initial_addr should be made from either INADDR_ANY or in6addr_any. 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ConnectTest(const SocketAddress& initial_addr) { 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr = 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client->GetLocalAddress().IsNil()); 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create server 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(0, server->Listen(5)); // Bind required 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No pending server connections 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(AF_UNSPEC, accept_addr.family()); 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Attempt connect to listening socket 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind 225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client is connecting 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client still connecting 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server has pending connection 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Socket* accepted = server->Accept(&accept_addr); 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL != accepted); 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(accept_addr, kEmptyAddr); 245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); 246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); 249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client has connected 254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); 255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ConnectToNonListenerTest(const SocketAddress& initial_addr) { 262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress nil_addr; 265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress empty_addr = 266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client 269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create server 274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Attempt connect to non-listening socket 280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No pending server connections 285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accept_addr, nil_addr); 288f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connection failed 290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR)); 293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), nil_addr); 294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CloseDuringConnectTest(const SocketAddress& initial_addr) { 297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress empty_addr = 300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client and server 303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(), 304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client.get()); 306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(), 307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server close before socket enters accept queue 318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Close(); 320f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 321f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: connection failed 324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server close while socket is in accept queue 340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Close(); 342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: connection failed 346f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 347f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 348f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // New server 350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 352f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 362f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server accepts connection 363f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 364f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 365f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(NULL != accepted.get()); 366f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(accepted.get()); 367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client closes before connection complets 369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connected message has not been processed yet. 372f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 373f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client->Close(); 374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 375f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 376f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: accepted socket closes 378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); 379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE)); 380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 382f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CloseTest(const SocketAddress& initial_addr) { 384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create clients 388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 389f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(a); 390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 392f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 393f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 394f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(), 395f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(b.get()); 397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 399f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 400f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 405f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN)); 406f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); 407f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); 408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 409f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN)); 410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); 411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); 412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 413f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send("a", 1)); 414f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Close(); 415f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send("b", 1)); 416f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 417f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 418f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char buffer[10]; 420f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ)); 421f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, b->Recv(buffer, 10)); 422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 423f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE)); 424f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); 425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); 426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No signal for Closer 428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE)); 429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); 430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); 431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void TcpSendTest(const SocketAddress& initial_addr) { 434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connect two sockets 438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(a); 440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(b); 445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const size_t kBufferSize = 2000; 454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_send_buffer_capacity(kBufferSize); 455f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_recv_buffer_capacity(kBufferSize); 456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const size_t kDataSize = 5000; 458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char send_buffer[kDataSize], recv_buffer[kDataSize]; 459f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t i = 0; i < kDataSize; ++i) 460f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_buffer[i] = static_cast<char>(i % 256); 461f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memset(recv_buffer, 0, sizeof(recv_buffer)); 462f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t send_pos = 0, recv_pos = 0; 463f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 464f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Can't send more than send buffer in one write 465f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 466f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<int>(kBufferSize), result); 467f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 470f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 472f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Receive buffer is already filled, fill send buffer again 474f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<int>(kBufferSize), result); 476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 480f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No more room in send or receive buffer 483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 484f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 485f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(a->IsBlocking()); 486f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 487f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Read a subset of the data 488f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, 500); 489f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 490f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE)); 494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Room for more on the sending side 497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Empty the recv buffer 502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 505f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 506f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 507f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 508f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 509f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Continue to empty the recv buffer 516f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 517f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 518f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 519f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 520f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 521f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Send last of the data 527f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 528f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 529f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 530f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 531f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 532f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 533f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 534f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Receive the last of the data 535f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 536f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 537f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 538f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 540f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 541f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 542f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 543f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 544f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 545f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 546f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 547f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 548f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The received data matches the sent data 549f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(kDataSize, send_pos); 550f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(kDataSize, recv_pos); 551f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); 552f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 553f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 554f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { 555f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 556f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 557f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connect two sockets 558f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), 559f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 560f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), 561f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 562f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 563f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 564f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 565f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 566f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 567f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 568f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 569f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 570f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 571f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 572f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // First, deliver all packets in 0 ms. 573f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char buffer[2] = { 0, 0 }; 574f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char cNumPackets = 10; 575f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 576f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org buffer[0] = '0' + i; 577f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send(buffer, 1)); 578f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 579f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 580f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 581f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 582f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 583f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 584f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); 585f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 586f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 587f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Next, deliver packets at random intervals 588f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 mean = 50; 589f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 stddev = 50; 590f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 591f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(mean); 592f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(stddev); 593f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 594f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 595f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 596f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org buffer[0] = 'A' + i; 597f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send(buffer, 1)); 598f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 599f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 600f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 601f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 602f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 603f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 604f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); 605f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 606f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 607f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 608f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // It is important that initial_addr's port has to be 0 such that the 609f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // incremental port behavior could ensure the 2 Binds result in different 610f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // address. 611f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org void BandwidthTest(const SocketAddress& initial_addr) { 612f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* send_socket = 613f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 614f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* recv_socket = 615f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 616f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, send_socket->Bind(initial_addr)); 617f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 618f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 619f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 620f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 621f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 622f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 bandwidth = 64 * 1024; 623f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_bandwidth(bandwidth); 624f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 625f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* pthMain = Thread::Current(); 626f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Sender sender(pthMain, send_socket, 80 * 1024); 627f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Receiver receiver(pthMain, recv_socket, bandwidth); 628f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 629f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(5000); 630f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sender.done = true; 631f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(5000); 632f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 633f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); 634f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s 635f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 636f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_bandwidth(0); 637f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 638f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 639f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // It is important that initial_addr's port has to be 0 such that the 640f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // incremental port behavior could ensure the 2 Binds result in different 641f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // address. 642f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org void DelayTest(const SocketAddress& initial_addr) { 643f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org time_t seed = ::time(NULL); 644f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "seed = " << seed; 645f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org srand(static_cast<unsigned int>(seed)); 646f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 647f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 mean = 2000; 648f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 stddev = 500; 649f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 650f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(mean); 651f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(stddev); 652f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 653f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 654f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* send_socket = 655f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 656f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* recv_socket = 657f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 658f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, send_socket->Bind(initial_addr)); 659f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 660f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 661f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 662f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 663f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 664f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* pthMain = Thread::Current(); 665f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Avg packet size is 2K, so at 200KB/s for 10s, we should see about 666f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // 1000 packets, which is necessary to get a good distribution. 667f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Sender sender(pthMain, send_socket, 100 * 2 * 1024); 668f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Receiver receiver(pthMain, recv_socket, 0); 669f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 670f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(10000); 671f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sender.done = receiver.done = true; 672f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 673f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 674f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double sample_mean = receiver.sum / receiver.samples; 675f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double num = 676f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; 677f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double den = receiver.samples * (receiver.samples - 1); 678f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double sample_stddev = sqrt(num / den); 679f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; 680f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 681f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_LE(500u, receiver.samples); 682f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // We initially used a 0.1 fudge factor, but on the build machine, we 683f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // have seen the value differ by as much as 0.13. 684f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(mean, sample_mean, 0.15 * mean); 685f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); 686f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 687f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(0); 688f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(0); 689f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 690f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 691f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 692f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Test cross-family communication between a client bound to client_addr and a 693f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // server bound to server_addr. shouldSucceed indicates if communication is 694f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // expected to work or not. 695f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CrossFamilyConnectionTest(const SocketAddress& client_addr, 696f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& server_addr, 697f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool shouldSucceed) { 698f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 699f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_address; 700f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 701f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 702f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client gets a IPv4 address 703f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(), 704f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 705f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 706f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 707f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); 708f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client->Bind(client_addr); 709f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 710f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server gets a non-mapped non-any IPv6 address. 711f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // IPv4 sockets should not be able to connect to this. 712f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(), 713f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 714f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 715f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Bind(server_addr); 716f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Listen(5); 717f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 718f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (shouldSucceed) { 719f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 720f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 721f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 722f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Socket* accepted = server->Accept(&accept_address); 723f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL != accepted); 724f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(kEmptyAddr, accept_address); 725f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 726f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 727f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 728f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 729f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check that the connection failed. 730f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); 731f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 732f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 733f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 734f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_address)); 735f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accept_address, kEmptyAddr); 736f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 737f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 738f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); 739f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 740f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 741f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 742f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Test cross-family datagram sending between a client bound to client_addr 743f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // and a server bound to server_addr. shouldSucceed indicates if sending is 744ec499beaf53409bbdc67dcda48cfc29ade2afa32jlmiller@webrtc.org // expected to succeed or not. 745f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CrossFamilyDatagramTest(const SocketAddress& client_addr, 746f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& server_addr, 747f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool shouldSucceed) { 748f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM); 749f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->Bind(server_addr); 750f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress bound_server_addr = socket->GetLocalAddress(); 751f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 752f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 753f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM); 754f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket2->Bind(client_addr); 755f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 756f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client2_addr; 757f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 758f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (shouldSucceed) { 759f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); 760f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 761f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client1_addr; 762f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 763f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 764f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client1_addr, bound_server_addr); 765f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 766f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); 767ec499beaf53409bbdc67dcda48cfc29ade2afa32jlmiller@webrtc.org EXPECT_TRUE(client1->CheckNoPacket()); 768f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 769f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 770f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 771f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 772f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void SetUp() { 773f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->set_socketserver(ss_); 774f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 775f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void TearDown() { 776f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->set_socketserver(NULL); 777f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 778f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 779f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer* ss_; 780f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kIPv4AnyAddress; 781f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kIPv6AnyAddress; 782f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 783f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 784c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, basic_v4) { 785f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); 786f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicTest(ipv4_test_addr); 787f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 788f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 789c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, basic_v6) { 790f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000); 791f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicTest(ipv6_test_addr); 792f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 793f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 794c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_v4) { 795f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectTest(kIPv4AnyAddress); 796f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 797f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 798c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_v6) { 799f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectTest(kIPv6AnyAddress); 800f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 801f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 802c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) { 803f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectToNonListenerTest(kIPv4AnyAddress); 804f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 805f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 806c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) { 807f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectToNonListenerTest(kIPv6AnyAddress); 808f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 809f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 810c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_during_connect_v4) { 811f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseDuringConnectTest(kIPv4AnyAddress); 812f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 813f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 814c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_during_connect_v6) { 815f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseDuringConnectTest(kIPv6AnyAddress); 816f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 817f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 818f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_v4) { 819f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseTest(kIPv4AnyAddress); 820f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 821f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 822f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_v6) { 823f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseTest(kIPv6AnyAddress); 824f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 825f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 826c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, tcp_send_v4) { 827f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendTest(kIPv4AnyAddress); 828f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 829f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 830c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, tcp_send_v6) { 831f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendTest(kIPv6AnyAddress); 832f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 833f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 834f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) { 835f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendsPacketsInOrderTest(kIPv4AnyAddress); 836f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 837f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 838f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) { 839f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendsPacketsInOrderTest(kIPv6AnyAddress); 840f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 841f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 842c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, bandwidth_v4) { 843f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org BandwidthTest(kIPv4AnyAddress); 844f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 845f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 846c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, bandwidth_v6) { 847f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org BandwidthTest(kIPv6AnyAddress); 848f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 849f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 850c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, delay_v4) { 851f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org DelayTest(kIPv4AnyAddress); 852f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 853f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 854f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// See: https://code.google.com/p/webrtc/issues/detail?id=2409 855f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, DISABLED_delay_v6) { 856f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org DelayTest(kIPv6AnyAddress); 857f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 858f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 859f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees 127.0.0.2. 860c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) { 861f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0), 862f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 863f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 864f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 865f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 866f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 867c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) { 868f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::2", 0), 869f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 870f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 871f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 872f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 873f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 874c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) { 875f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::2", 0), 876f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.1", 5000), 877f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 878f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 879f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 880f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works. receiving socket sees ::ffff:127.0.0.2. 881c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) { 882f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 883f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 884f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 885f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 886f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 887f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 888c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) { 889f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 890f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::1", 5000), 891f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 892f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 893f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 894f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works. Receiving socket sees ::ffff:127.0.0.1. 895c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) { 896f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0), 897f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.2", 5000), 898f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 899f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 900f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 901f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees a result from GetNextIP. 902c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) { 903f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::", 0), 904f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 905f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 906f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 907f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 908f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees whatever GetNextIP gave the client. 909c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) { 910f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0), 911f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 912f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 913f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 914f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 915c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) { 916f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0), 917f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 918f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 919f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 920f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 921c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) { 922f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0), 923f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 924f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 925f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 926f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 927c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) { 928f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::2", 0), 929f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 930f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 931f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 932f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 933c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) { 934f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::2", 0), 935f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.1", 5000), 936f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 937f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 938f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 939c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) { 940f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 941f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 942f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 943f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 944f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 945c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) { 946f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 947f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::1", 5000), 948f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 949f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 950f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 951c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) { 952f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0), 953f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.2", 5000), 954f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 955f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 956f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 957c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { 958f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::", 0), 959f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 960f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 961f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 962f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 963f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { 964f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kTestMean[] = { 10, 100, 333, 1000 }; 965f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double kTestDev[] = { 0.25, 0.1, 0.01 }; 966f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // TODO: The current code only works for 1000 data points or more. 967f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kTestSamples[] = { /*10, 100,*/ 1000 }; 968f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t midx = 0; midx < ARRAY_SIZE(kTestMean); ++midx) { 969f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t didx = 0; didx < ARRAY_SIZE(kTestDev); ++didx) { 970f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t sidx = 0; sidx < ARRAY_SIZE(kTestSamples); ++sidx) { 971f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_LT(0u, kTestSamples[sidx]); 972f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kStdDev = 973f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<uint32>(kTestDev[didx] * kTestMean[midx]); 974f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer::Function* f = 975f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer::CreateDistribution(kTestMean[midx], 976f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kStdDev, 977f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kTestSamples[sidx]); 978f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(NULL != f); 979f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(kTestSamples[sidx], f->size()); 980f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum = 0; 981f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (uint32 i = 0; i < f->size(); ++i) { 982f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum += (*f)[i].second; 983f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 984f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double mean = sum / f->size(); 985f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum_sq_dev = 0; 986f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (uint32 i = 0; i < f->size(); ++i) { 987f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double dev = (*f)[i].second - mean; 988f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum_sq_dev += dev * dev; 989f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 990f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double stddev = sqrt(sum_sq_dev / f->size()); 991f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) 992f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << "M=" << kTestMean[midx] 993f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " SD=" << kStdDev 994f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " N=" << kTestSamples[sidx]; 995f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) 996f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << "M=" << kTestMean[midx] 997f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " SD=" << kStdDev 998f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " N=" << kTestSamples[sidx]; 999f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete f; 1000f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1001f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1002f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1003f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1004