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