virtualsocket_unittest.cc revision 38f8893235f3b80ae9ca89db66d62ca819b51c01
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 15238f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // Test a client can bind to the any address, and all sent packets will have 15338f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // the default route as the source address. Also, it can receive packets sent 15438f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // to the default route. 15538f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh void TestDefaultRoute(const IPAddress& default_route) { 15638f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh ss_->SetDefaultRoute(default_route); 15738f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 15838f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // Create client1 bound to the any address. 15938f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh AsyncSocket* socket = 16038f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); 16138f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh socket->Bind(EmptySocketAddressWithFamily(default_route.family())); 16238f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh SocketAddress client1_any_addr = socket->GetLocalAddress(); 16338f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_TRUE(client1_any_addr.IsAnyIP()); 16438f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 16538f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 16638f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // Create client2 bound to the default route. 16738f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh AsyncSocket* socket2 = 16838f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh ss_->CreateAsyncSocket(default_route.family(), SOCK_DGRAM); 16938f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh socket2->Bind(SocketAddress(default_route, 0)); 17038f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh SocketAddress client2_addr = socket2->GetLocalAddress(); 17138f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_FALSE(client2_addr.IsAnyIP()); 17238f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 17338f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 17438f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // Client1 sends to client2, client2 should see the default route as 17538f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // client1's address. 17638f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh SocketAddress client1_addr; 17738f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 17838f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 17938f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_EQ(client1_addr, 18038f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh SocketAddress(default_route, client1_any_addr.port())); 18138f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 18238f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh // Client2 can send back to client1's default route address. 18338f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr)); 18438f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 18538f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh } 18638f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void BasicTest(const SocketAddress& initial_addr) { 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(), 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_DGRAM); 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->Bind(initial_addr); 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress server_addr = socket->GetLocalAddress(); 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make sure VSS didn't switch families on us. 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server_addr.family(), initial_addr.family()); 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket2 = 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client2_addr; 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client1_addr; 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client1_addr, server_addr); 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (int i = 0; i < 10; i++) { 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty)); 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress next_client2_addr; 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); 216d3b453be17d6f91c4e1f9a5544b7b2d52d448f81guoweis@webrtc.org CheckPortIncrementalization(next_client2_addr, client2_addr); 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress server_addr2; 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server_addr2, server_addr); 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client2_addr = next_client2_addr; 225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // initial_addr should be made from either INADDR_ANY or in6addr_any. 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ConnectTest(const SocketAddress& initial_addr) { 230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr = 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client->GetLocalAddress().IsNil()); 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create server 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(0, server->Listen(5)); // Bind required 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); 251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No pending server connections 253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(AF_UNSPEC, accept_addr.family()); 256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Attempt connect to listening socket 258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind 261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); 262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client is connecting 264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client still connecting 271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server has pending connection 276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 277f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Socket* accepted = server->Accept(&accept_addr); 278f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL != accepted); 279f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(accept_addr, kEmptyAddr); 280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); 281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 282f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 283f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); 284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 288f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client has connected 289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); 290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 296f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ConnectToNonListenerTest(const SocketAddress& initial_addr) { 297f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 299f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress nil_addr; 300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress empty_addr = 301f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 302f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client 304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 306f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 308f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create server 309f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Attempt connect to non-listening socket 315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No pending server connections 320f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 321f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accept_addr, nil_addr); 323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connection failed 325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR)); 328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), nil_addr); 329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CloseDuringConnectTest(const SocketAddress& initial_addr) { 332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_addr; 334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress empty_addr = 335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EmptySocketAddressWithFamily(initial_addr.family()); 336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create client and server 338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(), 339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client.get()); 341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(), 342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 346f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 347f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 348f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 352f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server close before socket enters accept queue 353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Close(); 355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: connection failed 359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 362f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 363f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 364f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 365f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 366f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 367f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 372f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 373f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server close while socket is in accept queue 375f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 376f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Close(); 377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: connection failed 381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 382f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // New server 385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server.get()); 387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Initiate connect 389f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Bind(initial_addr)); 390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 392f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, server->Listen(5)); 393f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 394f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 395f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server accepts connection 398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 399f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 400f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(NULL != accepted.get()); 401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(accepted.get()); 402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client closes before connection complets 404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 405f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 406f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connected message has not been processed yet. 407f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client->Close(); 409f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Result: accepted socket closes 413f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); 414f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE)); 415f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 416f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 417f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 418f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CloseTest(const SocketAddress& initial_addr) { 419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 420f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 421f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create clients 423f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 424f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(a); 425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(), 430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM)); 431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(b.get()); 432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN)); 441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); 442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); 443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN)); 445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); 446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); 447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send("a", 1)); 449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Close(); 450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send("b", 1)); 451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char buffer[10]; 455f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ)); 456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, b->Recv(buffer, 10)); 457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE)); 459f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); 460f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); 461f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 462f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No signal for Closer 463f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE)); 464f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); 465f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); 466f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 467f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void TcpSendTest(const SocketAddress& initial_addr) { 469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 470f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 472f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connect two sockets 473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 474f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(a); 475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(b); 480f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 484f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 485f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 486f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 487f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 488f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const size_t kBufferSize = 2000; 489f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_send_buffer_capacity(kBufferSize); 490f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_recv_buffer_capacity(kBufferSize); 491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const size_t kDataSize = 5000; 493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char send_buffer[kDataSize], recv_buffer[kDataSize]; 494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t i = 0; i < kDataSize; ++i) 495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_buffer[i] = static_cast<char>(i % 256); 496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memset(recv_buffer, 0, sizeof(recv_buffer)); 497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t send_pos = 0, recv_pos = 0; 498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Can't send more than send buffer in one write 500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<int>(kBufferSize), result); 502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 505f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 506f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 507f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 508f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Receive buffer is already filled, fill send buffer again 509f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<int>(kBufferSize), result); 511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 516f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 517f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // No more room in send or receive buffer 518f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 519f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 520f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(a->IsBlocking()); 521f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Read a subset of the data 523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, 500); 524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 527f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 528f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE)); 529f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 530f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 531f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Room for more on the sending side 532f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 533f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 534f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 535f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 536f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Empty the recv buffer 537f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 538f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 540f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 541f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 542f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 543f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 544f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 545f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 546f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 547f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 548f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 549f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 550f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Continue to empty the recv buffer 551f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 552f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 553f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 554f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 555f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 556f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 557f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 558f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 559f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 560f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 561f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Send last of the data 562f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 563f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(500, result); 564f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_pos += result; 565f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 566f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 567f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 568f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 569f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Receive the last of the data 570f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org while (true) { 571f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 572f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (result < 0) { 573f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, result); 574f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(b->IsBlocking()); 575f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 576f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 577f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_pos += result; 578f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 579f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 580f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 581f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 582f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 583f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The received data matches the sent data 584f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(kDataSize, send_pos); 585f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(kDataSize, recv_pos); 586f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); 587f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 588f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 589f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { 590f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 591f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 592f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Connect two sockets 593f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), 594f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 595f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), 596f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 597f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org a->Bind(initial_addr); 598f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 599f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 600f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org b->Bind(initial_addr); 601f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 602f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 603f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 604f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 605f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 606f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 607f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // First, deliver all packets in 0 ms. 608f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char buffer[2] = { 0, 0 }; 609f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char cNumPackets = 10; 610f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 611f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org buffer[0] = '0' + i; 612f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send(buffer, 1)); 613f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 614f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 615f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 616f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 617f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 618f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 619f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); 620f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 621f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 622f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Next, deliver packets at random intervals 623f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 mean = 50; 624f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 stddev = 50; 625f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 626f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(mean); 627f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(stddev); 628f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 629f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 630f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 631f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org buffer[0] = 'A' + i; 632f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, a->Send(buffer, 1)); 633f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 634f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 635f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 636f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 637f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (char i = 0; i < cNumPackets; ++i) { 638f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 639f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); 640f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 641f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 642f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 643f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // It is important that initial_addr's port has to be 0 such that the 644f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // incremental port behavior could ensure the 2 Binds result in different 645f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // address. 646f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org void BandwidthTest(const SocketAddress& initial_addr) { 647f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* send_socket = 648f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 649f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* recv_socket = 650f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 651f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, send_socket->Bind(initial_addr)); 652f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 653f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 654f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 655f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 656f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 657f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org uint32 bandwidth = 64 * 1024; 658f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_bandwidth(bandwidth); 659f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 660f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* pthMain = Thread::Current(); 661f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Sender sender(pthMain, send_socket, 80 * 1024); 662f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Receiver receiver(pthMain, recv_socket, bandwidth); 663f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 664f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(5000); 665f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sender.done = true; 666f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(5000); 667f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 668f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); 669f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s 670f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 671f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_bandwidth(0); 672f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 673f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 674f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // It is important that initial_addr's port has to be 0 such that the 675f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // incremental port behavior could ensure the 2 Binds result in different 676f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org // address. 677f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org void DelayTest(const SocketAddress& initial_addr) { 678f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org time_t seed = ::time(NULL); 679f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "seed = " << seed; 680f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org srand(static_cast<unsigned int>(seed)); 681f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 682f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 mean = 2000; 683f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 stddev = 500; 684f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 685f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(mean); 686f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(stddev); 687f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 688f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 689f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* send_socket = 690f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 691f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* recv_socket = 692f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 693f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, send_socket->Bind(initial_addr)); 694f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 695f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 696f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 697f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 698f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 699f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread* pthMain = Thread::Current(); 700f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Avg packet size is 2K, so at 200KB/s for 10s, we should see about 701f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // 1000 packets, which is necessary to get a good distribution. 702f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Sender sender(pthMain, send_socket, 100 * 2 * 1024); 703f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Receiver receiver(pthMain, recv_socket, 0); 704f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 705f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org pthMain->ProcessMessages(10000); 706f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sender.done = receiver.done = true; 707f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 708f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 709f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double sample_mean = receiver.sum / receiver.samples; 710f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double num = 711f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; 712f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double den = receiver.samples * (receiver.samples - 1); 713f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double sample_stddev = sqrt(num / den); 714f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; 715f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 716f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_LE(500u, receiver.samples); 717f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // We initially used a 0.1 fudge factor, but on the build machine, we 718f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // have seen the value differ by as much as 0.13. 719f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(mean, sample_mean, 0.15 * mean); 720f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); 721f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 722f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_mean(0); 723f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->set_delay_stddev(0); 724f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->UpdateDelayDistribution(); 725f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 726f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 727f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Test cross-family communication between a client bound to client_addr and a 728f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // server bound to server_addr. shouldSucceed indicates if communication is 729f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // expected to work or not. 730f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CrossFamilyConnectionTest(const SocketAddress& client_addr, 731f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& server_addr, 732f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool shouldSucceed) { 733f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org testing::StreamSink sink; 734f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress accept_address; 735f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kEmptyAddr; 736f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 737f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Client gets a IPv4 address 738f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(), 739f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 740f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(client); 741f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 742f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); 743f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client->Bind(client_addr); 744f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 745f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Server gets a non-mapped non-any IPv6 address. 746f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // IPv4 sockets should not be able to connect to this. 747f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(), 748f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SOCK_STREAM); 749f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sink.Monitor(server); 750f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Bind(server_addr); 751f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server->Listen(5); 752f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 753f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (shouldSucceed) { 754f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 755f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 756f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 757f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Socket* accepted = server->Accept(&accept_address); 758f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL != accepted); 759f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NE(kEmptyAddr, accept_address); 760f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 761f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 762f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 763f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 764f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Check that the connection failed. 765f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); 766f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ss_->ProcessMessagesUntilIdle(); 767f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 768f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 769f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(NULL == server->Accept(&accept_address)); 770f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(accept_address, kEmptyAddr); 771f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 772f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 773f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); 774f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 775f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 776f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 777f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Test cross-family datagram sending between a client bound to client_addr 778f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // and a server bound to server_addr. shouldSucceed indicates if sending is 779ec499beaf53409bbdc67dcda48cfc29ade2afa32jlmiller@webrtc.org // expected to succeed or not. 780f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void CrossFamilyDatagramTest(const SocketAddress& client_addr, 781f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress& server_addr, 782f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool shouldSucceed) { 783f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM); 784f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket->Bind(server_addr); 785f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress bound_server_addr = socket->GetLocalAddress(); 786f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 787f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 788f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM); 789f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org socket2->Bind(client_addr); 790f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 791f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client2_addr; 792f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 793f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (shouldSucceed) { 794f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); 795f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 796f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress client1_addr; 797f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 798f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 799f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(client1_addr, bound_server_addr); 800f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 801f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); 802ec499beaf53409bbdc67dcda48cfc29ade2afa32jlmiller@webrtc.org EXPECT_TRUE(client1->CheckNoPacket()); 803f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 804f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 805f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 806f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 807f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void SetUp() { 808f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->set_socketserver(ss_); 809f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 810f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void TearDown() { 811f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Thread::Current()->set_socketserver(NULL); 812f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 813f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 814f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer* ss_; 815f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kIPv4AnyAddress; 816f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const SocketAddress kIPv6AnyAddress; 817f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 818f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 819c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, basic_v4) { 820f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); 821f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicTest(ipv4_test_addr); 822f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 823f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 824c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, basic_v6) { 825f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000); 826f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org BasicTest(ipv6_test_addr); 827f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 828f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 82938f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei ShiehTEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) { 83038f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh IPAddress ipv4_default_addr(0x01020304); 83138f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh TestDefaultRoute(ipv4_default_addr); 83238f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh} 83338f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 83438f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei ShiehTEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) { 83538f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh IPAddress ipv6_default_addr; 83638f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh EXPECT_TRUE( 83738f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr)); 83838f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh TestDefaultRoute(ipv6_default_addr); 83938f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh} 84038f8893235f3b80ae9ca89db66d62ca819b51c01Guo-wei Shieh 841c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_v4) { 842f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectTest(kIPv4AnyAddress); 843f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 844f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 845c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_v6) { 846f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectTest(kIPv6AnyAddress); 847f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 848f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 849c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) { 850f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectToNonListenerTest(kIPv4AnyAddress); 851f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 852f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 853c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) { 854f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ConnectToNonListenerTest(kIPv6AnyAddress); 855f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 856f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 857c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_during_connect_v4) { 858f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseDuringConnectTest(kIPv4AnyAddress); 859f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 860f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 861c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_during_connect_v6) { 862f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseDuringConnectTest(kIPv6AnyAddress); 863f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 864f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 865f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_v4) { 866f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseTest(kIPv4AnyAddress); 867f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 868f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 869f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, close_v6) { 870f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CloseTest(kIPv6AnyAddress); 871f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 872f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 873c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, tcp_send_v4) { 874f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendTest(kIPv4AnyAddress); 875f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 876f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 877c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, tcp_send_v6) { 878f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendTest(kIPv6AnyAddress); 879f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 880f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 881f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) { 882f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendsPacketsInOrderTest(kIPv4AnyAddress); 883f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 884f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 885f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) { 886f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TcpSendsPacketsInOrderTest(kIPv6AnyAddress); 887f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 888f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 889c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, bandwidth_v4) { 890f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org BandwidthTest(kIPv4AnyAddress); 891f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 892f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 893c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, bandwidth_v6) { 894f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org BandwidthTest(kIPv6AnyAddress); 895f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 896f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 897c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, delay_v4) { 898f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org DelayTest(kIPv4AnyAddress); 899f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 900f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 901f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// See: https://code.google.com/p/webrtc/issues/detail?id=2409 902f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, DISABLED_delay_v6) { 903f358aea7bff8091c608e1afd8cf395ec2702ff76guoweis@webrtc.org DelayTest(kIPv6AnyAddress); 904f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 905f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 906f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees 127.0.0.2. 907c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) { 908f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0), 909f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 910f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 911f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 912f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 913f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 914c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) { 915f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::2", 0), 916f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 917f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 918f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 919f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 920f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 921c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) { 922f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::2", 0), 923f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.1", 5000), 924f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 925f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 926f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 927f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works. receiving socket sees ::ffff:127.0.0.2. 928c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) { 929f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 930f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 931f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 932f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 933f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 934f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Fails. 935c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) { 936f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 937f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::1", 5000), 938f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 939f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 940f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 941f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works. Receiving socket sees ::ffff:127.0.0.1. 942c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) { 943f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0), 944f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.2", 5000), 945f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 946f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 947f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 948f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees a result from GetNextIP. 949c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) { 950f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("::", 0), 951f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 952f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 953f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 954f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 955f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Works, receiving socket sees whatever GetNextIP gave the client. 956c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) { 957f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0), 958f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 959f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 960f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 961f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 962c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) { 963f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0), 964f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 965f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 966f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 967f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 968c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) { 969f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0), 970f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 971f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 972f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 973f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 974c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) { 975f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::2", 0), 976f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 977f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 978f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 979f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 980c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) { 981f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::2", 0), 982f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.1", 5000), 983f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 984f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 985f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 986c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) { 987f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 988f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::", 5000), 989f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 990f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 991f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 992c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) { 993f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 994f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::1", 5000), 995f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org false); 996f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 997f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 998c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) { 999f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0), 1000f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("::ffff:127.0.0.2", 5000), 1001f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 1002f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1003f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1004c732a3e5113bd64c85eeefa7a2ed3a5076e3db87henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) { 1005f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CrossFamilyDatagramTest(SocketAddress("::", 0), 1006f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SocketAddress("0.0.0.0", 5000), 1007f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true); 1008f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1009f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1010f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { 1011f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kTestMean[] = { 10, 100, 333, 1000 }; 1012f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double kTestDev[] = { 0.25, 0.1, 0.01 }; 1013f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // TODO: The current code only works for 1000 data points or more. 1014f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kTestSamples[] = { /*10, 100,*/ 1000 }; 1015f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t midx = 0; midx < ARRAY_SIZE(kTestMean); ++midx) { 1016f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t didx = 0; didx < ARRAY_SIZE(kTestDev); ++didx) { 1017f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (size_t sidx = 0; sidx < ARRAY_SIZE(kTestSamples); ++sidx) { 1018f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_LT(0u, kTestSamples[sidx]); 1019f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const uint32 kStdDev = 1020f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static_cast<uint32>(kTestDev[didx] * kTestMean[midx]); 1021f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer::Function* f = 1022f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org VirtualSocketServer::CreateDistribution(kTestMean[midx], 1023f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kStdDev, 1024f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kTestSamples[sidx]); 1025f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(NULL != f); 1026f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(kTestSamples[sidx], f->size()); 1027f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum = 0; 1028f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (uint32 i = 0; i < f->size(); ++i) { 1029f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum += (*f)[i].second; 1030f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1031f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double mean = sum / f->size(); 1032f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double sum_sq_dev = 0; 1033f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (uint32 i = 0; i < f->size(); ++i) { 1034f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double dev = (*f)[i].second - mean; 1035f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sum_sq_dev += dev * dev; 1036f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1037f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const double stddev = sqrt(sum_sq_dev / f->size()); 1038f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) 1039f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << "M=" << kTestMean[midx] 1040f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " SD=" << kStdDev 1041f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " N=" << kTestSamples[sidx]; 1042f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) 1043f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << "M=" << kTestMean[midx] 1044f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " SD=" << kStdDev 1045f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << " N=" << kTestSamples[sidx]; 1046f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete f; 1047f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1048f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1049f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1050f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1051