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