socket_host_tcp_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send STUN message and that they are formatted
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendStunNoAuth) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet1;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&packet1);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet1);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet2;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunResponse(&packet2);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet2);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet3;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunError(&packet3);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet3);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_data;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet1.size()));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet1.begin(), packet1.end());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet2.size()));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet2.begin(), packet2.end());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet3.size()));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet3.begin(), packet3.end());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can receive STUN messages from the socket, and that
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the messages are parsed properly.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, ReceiveStun) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet1;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&packet1);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet1);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet2;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunResponse(&packet2);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet2);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet3;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunError(&packet3);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet3);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string received_data;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet1.size()));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet1.begin(), packet1.end());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet2.size()));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet2.begin(), packet2.end());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(packet3.size()));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(packet3.begin(), packet3.end());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet1)))
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet2)))
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(packet3)))
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t pos = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t step_sizes[] = {3, 2, 1};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t step = 0;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (pos < received_data.size()) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t step_size = std::min(step_sizes[step], received_data.size() - pos);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_->AppendInputData(&received_data[pos], step_size);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pos += step_size;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (++step >= arraysize(step_sizes))
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      step = 0;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can't send data before we've received STUN response
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendDataNoAuth) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID))))
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRandomPacket(&packet);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sent_data_.size());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send data after we've received STUN response
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostTcpTest, SendAfterStunRequest) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Receive packet from |dest_|.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> request_packet;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateStunRequest(&request_packet);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string received_data;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(IntToSize(request_packet.size()));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_data.append(request_packet.begin(), request_packet.end());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet)))
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_->AppendInputData(&received_data[0], received_data.size());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should be able to send any data to |dest_|.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> packet;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRandomPacket(&packet);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_host_->Send(dest_, packet);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_data;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(IntToSize(packet.size()));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_data.append(packet.begin(), packet.end());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_data, sent_data_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
172