Home | History | Annotate | Download | only in p2p
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/renderer_host/p2p/socket_host_tcp.h"
      6 
      7 #include <deque>
      8 
      9 #include "base/sys_byteorder.h"
     10 #include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
     11 #include "net/socket/stream_socket.h"
     12 #include "testing/gmock/include/gmock/gmock.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 using ::testing::_;
     16 using ::testing::DeleteArg;
     17 using ::testing::DoAll;
     18 using ::testing::Return;
     19 
     20 namespace content {
     21 
     22 class P2PSocketHostTcpTestBase : public testing::Test {
     23  protected:
     24   explicit P2PSocketHostTcpTestBase(P2PSocketType type)
     25       : socket_type_(type) {
     26   }
     27 
     28   virtual void SetUp() OVERRIDE {
     29     EXPECT_CALL(sender_, Send(
     30         MatchMessage(static_cast<uint32>(P2PMsg_OnSocketCreated::ID))))
     31         .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
     32 
     33     if (socket_type_ == P2P_SOCKET_TCP_CLIENT) {
     34       socket_host_.reset(
     35           new P2PSocketHostTcp(&sender_, 0, P2P_SOCKET_TCP_CLIENT, NULL));
     36     } else {
     37       socket_host_.reset(new P2PSocketHostStunTcp(
     38           &sender_, 0, P2P_SOCKET_STUN_TCP_CLIENT, NULL));
     39     }
     40 
     41     socket_ = new FakeSocket(&sent_data_);
     42     socket_->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1));
     43     socket_host_->socket_.reset(socket_);
     44 
     45     dest_.ip_address = ParseAddress(kTestIpAddress1, kTestPort1);
     46 
     47     local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
     48 
     49     socket_host_->remote_address_ = dest_;
     50     socket_host_->state_ = P2PSocketHost::STATE_CONNECTING;
     51     socket_host_->OnConnected(net::OK);
     52   }
     53 
     54   std::string IntToSize(int size) {
     55     std::string result;
     56     uint16 size16 = base::HostToNet16(size);
     57     result.resize(sizeof(size16));
     58     memcpy(&result[0], &size16, sizeof(size16));
     59     return result;
     60   }
     61 
     62   std::string sent_data_;
     63   FakeSocket* socket_;  // Owned by |socket_host_|.
     64   scoped_ptr<P2PSocketHostTcpBase> socket_host_;
     65   MockIPCSender sender_;
     66 
     67   net::IPEndPoint local_address_;
     68   P2PHostAndIPEndPoint dest_;
     69   P2PSocketType socket_type_;
     70 };
     71 
     72 class P2PSocketHostTcpTest : public P2PSocketHostTcpTestBase {
     73  protected:
     74   P2PSocketHostTcpTest() : P2PSocketHostTcpTestBase(P2P_SOCKET_TCP_CLIENT) { }
     75 };
     76 
     77 class P2PSocketHostStunTcpTest : public P2PSocketHostTcpTestBase {
     78  protected:
     79   P2PSocketHostStunTcpTest()
     80       : P2PSocketHostTcpTestBase(P2P_SOCKET_STUN_TCP_CLIENT) {
     81   }
     82 };
     83 
     84 // Verify that we can send STUN message and that they are formatted
     85 // properly.
     86 TEST_F(P2PSocketHostTcpTest, SendStunNoAuth) {
     87   EXPECT_CALL(sender_, Send(
     88       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
     89       .Times(3)
     90       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
     91 
     92   rtc::PacketOptions options;
     93   std::vector<char> packet1;
     94   CreateStunRequest(&packet1);
     95   socket_host_->Send(dest_.ip_address, packet1, options, 0);
     96 
     97   std::vector<char> packet2;
     98   CreateStunResponse(&packet2);
     99   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    100 
    101   std::vector<char> packet3;
    102   CreateStunError(&packet3);
    103   socket_host_->Send(dest_.ip_address, packet3, options, 0);
    104 
    105   std::string expected_data;
    106   expected_data.append(IntToSize(packet1.size()));
    107   expected_data.append(packet1.begin(), packet1.end());
    108   expected_data.append(IntToSize(packet2.size()));
    109   expected_data.append(packet2.begin(), packet2.end());
    110   expected_data.append(IntToSize(packet3.size()));
    111   expected_data.append(packet3.begin(), packet3.end());
    112 
    113   EXPECT_EQ(expected_data, sent_data_);
    114 }
    115 
    116 // Verify that we can receive STUN messages from the socket, and that
    117 // the messages are parsed properly.
    118 TEST_F(P2PSocketHostTcpTest, ReceiveStun) {
    119   EXPECT_CALL(sender_, Send(
    120       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    121       .Times(3)
    122       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
    123 
    124   rtc::PacketOptions options;
    125   std::vector<char> packet1;
    126   CreateStunRequest(&packet1);
    127   socket_host_->Send(dest_.ip_address, packet1, options, 0);
    128 
    129   std::vector<char> packet2;
    130   CreateStunResponse(&packet2);
    131   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    132 
    133   std::vector<char> packet3;
    134   CreateStunError(&packet3);
    135   socket_host_->Send(dest_.ip_address, packet3, options, 0);
    136 
    137   std::string received_data;
    138   received_data.append(IntToSize(packet1.size()));
    139   received_data.append(packet1.begin(), packet1.end());
    140   received_data.append(IntToSize(packet2.size()));
    141   received_data.append(packet2.begin(), packet2.end());
    142   received_data.append(IntToSize(packet3.size()));
    143   received_data.append(packet3.begin(), packet3.end());
    144 
    145   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet1)))
    146       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    147   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet2)))
    148       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    149   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet3)))
    150       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    151 
    152   size_t pos = 0;
    153   size_t step_sizes[] = {3, 2, 1};
    154   size_t step = 0;
    155   while (pos < received_data.size()) {
    156     size_t step_size = std::min(step_sizes[step], received_data.size() - pos);
    157     socket_->AppendInputData(&received_data[pos], step_size);
    158     pos += step_size;
    159     if (++step >= arraysize(step_sizes))
    160       step = 0;
    161   }
    162 }
    163 
    164 // Verify that we can't send data before we've received STUN response
    165 // from the other side.
    166 TEST_F(P2PSocketHostTcpTest, SendDataNoAuth) {
    167   EXPECT_CALL(sender_, Send(
    168       MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID))))
    169       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    170 
    171   rtc::PacketOptions options;
    172   std::vector<char> packet;
    173   CreateRandomPacket(&packet);
    174   socket_host_->Send(dest_.ip_address, packet, options, 0);
    175 
    176   EXPECT_EQ(0U, sent_data_.size());
    177 }
    178 
    179 // Verify that we can send data after we've received STUN response
    180 // from the other side.
    181 TEST_F(P2PSocketHostTcpTest, SendAfterStunRequest) {
    182   // Receive packet from |dest_|.
    183   std::vector<char> request_packet;
    184   CreateStunRequest(&request_packet);
    185 
    186   std::string received_data;
    187   received_data.append(IntToSize(request_packet.size()));
    188   received_data.append(request_packet.begin(), request_packet.end());
    189 
    190   EXPECT_CALL(sender_, Send(
    191       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    192       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    193   EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet)))
    194       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    195   socket_->AppendInputData(&received_data[0], received_data.size());
    196 
    197   rtc::PacketOptions options;
    198   // Now we should be able to send any data to |dest_|.
    199   std::vector<char> packet;
    200   CreateRandomPacket(&packet);
    201   socket_host_->Send(dest_.ip_address, packet, options, 0);
    202 
    203   std::string expected_data;
    204   expected_data.append(IntToSize(packet.size()));
    205   expected_data.append(packet.begin(), packet.end());
    206 
    207   EXPECT_EQ(expected_data, sent_data_);
    208 }
    209 
    210 // Verify that asynchronous writes are handled correctly.
    211 TEST_F(P2PSocketHostTcpTest, AsyncWrites) {
    212   base::MessageLoop message_loop;
    213 
    214   socket_->set_async_write(true);
    215 
    216   EXPECT_CALL(sender_, Send(
    217       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    218       .Times(2)
    219       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
    220 
    221   rtc::PacketOptions options;
    222   std::vector<char> packet1;
    223   CreateStunRequest(&packet1);
    224 
    225   socket_host_->Send(dest_.ip_address, packet1, options, 0);
    226 
    227   std::vector<char> packet2;
    228   CreateStunResponse(&packet2);
    229   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    230 
    231   message_loop.RunUntilIdle();
    232 
    233   std::string expected_data;
    234   expected_data.append(IntToSize(packet1.size()));
    235   expected_data.append(packet1.begin(), packet1.end());
    236   expected_data.append(IntToSize(packet2.size()));
    237   expected_data.append(packet2.begin(), packet2.end());
    238 
    239   EXPECT_EQ(expected_data, sent_data_);
    240 }
    241 
    242 TEST_F(P2PSocketHostTcpTest, SendDataWithPacketOptions) {
    243   std::vector<char> request_packet;
    244   CreateStunRequest(&request_packet);
    245 
    246   std::string received_data;
    247   received_data.append(IntToSize(request_packet.size()));
    248   received_data.append(request_packet.begin(), request_packet.end());
    249 
    250   EXPECT_CALL(sender_, Send(
    251       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    252       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    253   EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet)))
    254       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    255   socket_->AppendInputData(&received_data[0], received_data.size());
    256 
    257   rtc::PacketOptions options;
    258   options.packet_time_params.rtp_sendtime_extension_id = 3;
    259   // Now we should be able to send any data to |dest_|.
    260   std::vector<char> packet;
    261   CreateRandomPacket(&packet);
    262   // Make it a RTP packet.
    263   *reinterpret_cast<uint16*>(&*packet.begin()) = base::HostToNet16(0x8000);
    264   socket_host_->Send(dest_.ip_address, packet, options, 0);
    265 
    266   std::string expected_data;
    267   expected_data.append(IntToSize(packet.size()));
    268   expected_data.append(packet.begin(), packet.end());
    269 
    270   EXPECT_EQ(expected_data, sent_data_);
    271 }
    272 
    273 // Verify that we can send STUN message and that they are formatted
    274 // properly.
    275 TEST_F(P2PSocketHostStunTcpTest, SendStunNoAuth) {
    276   EXPECT_CALL(sender_, Send(
    277       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    278       .Times(3)
    279       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
    280 
    281   rtc::PacketOptions options;
    282   std::vector<char> packet1;
    283   CreateStunRequest(&packet1);
    284   socket_host_->Send(dest_.ip_address, packet1, options, 0);
    285 
    286   std::vector<char> packet2;
    287   CreateStunResponse(&packet2);
    288   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    289 
    290   std::vector<char> packet3;
    291   CreateStunError(&packet3);
    292   socket_host_->Send(dest_.ip_address, packet3, options, 0);
    293 
    294   std::string expected_data;
    295   expected_data.append(packet1.begin(), packet1.end());
    296   expected_data.append(packet2.begin(), packet2.end());
    297   expected_data.append(packet3.begin(), packet3.end());
    298 
    299   EXPECT_EQ(expected_data, sent_data_);
    300 }
    301 
    302 // Verify that we can receive STUN messages from the socket, and that
    303 // the messages are parsed properly.
    304 TEST_F(P2PSocketHostStunTcpTest, ReceiveStun) {
    305   EXPECT_CALL(sender_, Send(
    306       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    307       .Times(3)
    308       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
    309 
    310   rtc::PacketOptions options;
    311   std::vector<char> packet1;
    312   CreateStunRequest(&packet1);
    313   socket_host_->Send(dest_.ip_address, packet1, options, 0);
    314 
    315   std::vector<char> packet2;
    316   CreateStunResponse(&packet2);
    317   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    318 
    319   std::vector<char> packet3;
    320   CreateStunError(&packet3);
    321   socket_host_->Send(dest_.ip_address, packet3, options, 0);
    322 
    323   std::string received_data;
    324   received_data.append(packet1.begin(), packet1.end());
    325   received_data.append(packet2.begin(), packet2.end());
    326   received_data.append(packet3.begin(), packet3.end());
    327 
    328   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet1)))
    329       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    330   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet2)))
    331       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    332   EXPECT_CALL(sender_, Send(MatchPacketMessage(packet3)))
    333       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    334 
    335   size_t pos = 0;
    336   size_t step_sizes[] = {3, 2, 1};
    337   size_t step = 0;
    338   while (pos < received_data.size()) {
    339     size_t step_size = std::min(step_sizes[step], received_data.size() - pos);
    340     socket_->AppendInputData(&received_data[pos], step_size);
    341     pos += step_size;
    342     if (++step >= arraysize(step_sizes))
    343       step = 0;
    344   }
    345 }
    346 
    347 // Verify that we can't send data before we've received STUN response
    348 // from the other side.
    349 TEST_F(P2PSocketHostStunTcpTest, SendDataNoAuth) {
    350   EXPECT_CALL(sender_, Send(
    351       MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID))))
    352       .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
    353 
    354   rtc::PacketOptions options;
    355   std::vector<char> packet;
    356   CreateRandomPacket(&packet);
    357   socket_host_->Send(dest_.ip_address, packet, options, 0);
    358 
    359   EXPECT_EQ(0U, sent_data_.size());
    360 }
    361 
    362 // Verify that asynchronous writes are handled correctly.
    363 TEST_F(P2PSocketHostStunTcpTest, AsyncWrites) {
    364   base::MessageLoop message_loop;
    365 
    366   socket_->set_async_write(true);
    367 
    368   EXPECT_CALL(sender_, Send(
    369       MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID))))
    370       .Times(2)
    371       .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
    372 
    373   rtc::PacketOptions options;
    374   std::vector<char> packet1;
    375   CreateStunRequest(&packet1);
    376   socket_host_->Send(dest_.ip_address, packet1, options, 0);
    377 
    378   std::vector<char> packet2;
    379   CreateStunResponse(&packet2);
    380   socket_host_->Send(dest_.ip_address, packet2, options, 0);
    381 
    382   message_loop.RunUntilIdle();
    383 
    384   std::string expected_data;
    385   expected_data.append(packet1.begin(), packet1.end());
    386   expected_data.append(packet2.begin(), packet2.end());
    387 
    388   EXPECT_EQ(expected_data, sent_data_);
    389 }
    390 
    391 }  // namespace content
    392