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