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