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