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