socket_host_tcp_unittest.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_byteorder.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DeleteArg;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class P2PSocketHostTcpTest : public testing::Test {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(sender_, Send(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MatchMessage(static_cast<uint32>(P2PMsg_OnSocketCreated::ID))))
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_host_.reset(new P2PSocketHostTcp(&sender_, 0));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_ = new FakeSocket(&sent_data_);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_host_->socket_.reset(socket_);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dest_ = ParseAddress(kTestIpAddress1, kTestPort1);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_host_->remote_address_ = dest_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_host_->state_ = P2PSocketHost::STATE_CONNECTING;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_host_->OnConnected(net::OK);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string IntToSize(int size) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 size16 = base::HostToNet16(size);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.resize(sizeof(size16));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&result[0], &size16, sizeof(size16));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sent_data_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeSocket* socket_; // Owned by |socket_host_|.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<P2PSocketHostTcp> socket_host_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockIPCSender sender_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::IPEndPoint local_address_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::IPEndPoint dest_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::IPEndPoint dest2_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class P2PSocketHostStunTcpTest : public testing::Test {
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
64b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_CALL(sender_, Send(
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        MatchMessage(static_cast<uint32>(P2PMsg_OnSocketCreated::ID))))
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_host_.reset(new P2PSocketHostStunTcp(&sender_, 0));
70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_ = new FakeSocket(&sent_data_);
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1));
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_host_->socket_.reset(socket_);
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    dest_ = ParseAddress(kTestIpAddress1, kTestPort1);
75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_host_->remote_address_ = dest_;
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_host_->state_ = P2PSocketHost::STATE_CONNECTING;
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_host_->OnConnected(net::OK);
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string IntToSize(int size) {
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    std::string result;
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    uint16 size16 = base::HostToNet16(size);
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    result.resize(sizeof(size16));
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    memcpy(&result[0], &size16, sizeof(size16));
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return result;
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string sent_data_;
92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FakeSocket* socket_; // Owned by |socket_host_|.
93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<P2PSocketHostStunTcp> socket_host_;
94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MockIPCSender sender_;
95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  net::IPEndPoint local_address_;
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
98b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  net::IPEndPoint dest_;
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  net::IPEndPoint dest2_;
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send STUN message and that they are formatted
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendStunNoAuth) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(3)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet1;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&packet1);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet1);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet2;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunResponse(&packet2);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet2);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet3;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunError(&packet3);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet3);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_data;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet1.size()));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet1.begin(), packet1.end());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet2.size()));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet2.begin(), packet2.end());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet3.size()));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet3.begin(), packet3.end());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can receive STUN messages from the socket, and that
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the messages are parsed properly.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, ReceiveStun) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(3)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet1;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&packet1);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet1);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet2;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunResponse(&packet2);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet2);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet3;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunError(&packet3);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet3);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string received_data;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet1.size()));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet1.begin(), packet1.end());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet2.size()));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet2.begin(), packet2.end());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet3.size()));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet3.begin(), packet3.end());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet1)))
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet2)))
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet3)))
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t pos = 0;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t step_sizes[] = {3, 2, 1};
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t step = 0;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (pos < received_data.size()) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t step_size = std::min(step_sizes[step], received_data.size() - pos);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_->AppendInputData(&received_data[pos], step_size);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pos += step_size;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (++step >= arraysize(step_sizes))
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      step = 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can't send data before we've received STUN response
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendDataNoAuth) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID))))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRandomPacket(&packet);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sent_data_.size());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send data after we've received STUN response
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendAfterStunRequest) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Receive packet from |dest_|.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> request_packet;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&request_packet);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string received_data;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(request_packet.size()));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(request_packet.begin(), request_packet.end());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet)))
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_->AppendInputData(&received_data[0], received_data.size());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should be able to send any data to |dest_|.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRandomPacket(&packet);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_data;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet.size()));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet.begin(), packet.end());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that asynchronous writes are handled correctly.
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(P2PSocketHostTcpTest, AsyncWrites) {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_->set_async_write(true);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .Times(2)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<char> packet1;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateStunRequest(&packet1);
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_host_->Send(dest_, packet1);
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<char> packet2;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateStunResponse(&packet2);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  socket_host_->Send(dest_, packet2);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop.RunUntilIdle();
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string expected_data;
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_data.append(IntToSize(packet1.size()));
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_data.append(packet1.begin(), packet1.end());
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_data.append(IntToSize(packet2.size()));
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_data.append(packet2.begin(), packet2.end());
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Verify that we can send STUN message and that they are formatted
255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// properly.
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(P2PSocketHostStunTcpTest, SendStunNoAuth) {
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .Times(3)
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet1;
263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunRequest(&packet1);
264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet1);
265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet2;
267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunResponse(&packet2);
268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet2);
269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet3;
271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunError(&packet3);
272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet3);
273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string expected_data;
275b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  expected_data.append(packet1.begin(), packet1.end());
276b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  expected_data.append(packet2.begin(), packet2.end());
277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  expected_data.append(packet3.begin(), packet3.end());
278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Verify that we can receive STUN messages from the socket, and that
283b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// the messages are parsed properly.
284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(P2PSocketHostStunTcpTest, ReceiveStun) {
285b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .Times(3)
288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
290b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet1;
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunRequest(&packet1);
292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet1);
293b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
294b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet2;
295b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunResponse(&packet2);
296b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet2);
297b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
298b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet3;
299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunError(&packet3);
300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet3);
301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string received_data;
303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  received_data.append(packet1.begin(), packet1.end());
304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  received_data.append(packet2.begin(), packet2.end());
305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  received_data.append(packet3.begin(), packet3.end());
306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet1)))
308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet2)))
310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet3)))
312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  size_t pos = 0;
315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  size_t step_sizes[] = {3, 2, 1};
316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  size_t step = 0;
317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  while (pos < received_data.size()) {
318b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    size_t step_size = std::min(step_sizes[step], received_data.size() - pos);
319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    socket_->AppendInputData(&received_data[pos], step_size);
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    pos += step_size;
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (++step >= arraysize(step_sizes))
322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      step = 0;
323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
326b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Verify that we can't send data before we've received STUN response
327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// from the other side.
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(P2PSocketHostStunTcpTest, SendDataNoAuth) {
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID))))
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet;
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateRandomPacket(&packet);
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet);
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0U, sent_data_.size());
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Verify that asynchronous writes are handled correctly.
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(P2PSocketHostStunTcpTest, AsyncWrites) {
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MessageLoop message_loop;
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_->set_async_write(true);
345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(sender_, Send(
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .Times(2)
349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
350b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet1;
352b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunRequest(&packet1);
353b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet1);
354b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<char> packet2;
356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CreateStunResponse(&packet2);
357b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  socket_host_->Send(dest_, packet2);
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
359b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  message_loop.RunUntilIdle();
360b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string expected_data;
362b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  expected_data.append(packet1.begin(), packet1.end());
363b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  expected_data.append(packet2.begin(), packet2.end());
364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
365b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
369