10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2013, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/asyncstuntcpsocket.h" 292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/asyncsocket.h" 302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h" 312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/physicalsocketserver.h" 322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/virtualsocketserver.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kStunMessageWithZeroLength[] = { 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x00, 0x01, 0x00, 0x00, // length of 0 (last 2 bytes) 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x21, 0x12, 0xA4, 0x42, 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '0', '1', '2', '3', 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '4', '5', '6', '7', 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '8', '9', 'a', 'b', 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kTurnChannelDataMessageWithZeroLength[] = { 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x40, 0x00, 0x00, 0x00, // length of 0 (last 2 bytes) 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kTurnChannelDataMessage[] = { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x40, 0x00, 0x00, 0x10, 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x21, 0x12, 0xA4, 0x42, 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '0', '1', '2', '3', 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '4', '5', '6', '7', 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '8', '9', 'a', 'b', 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kStunMessageWithInvalidLength[] = { 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x00, 0x01, 0x00, 0x10, 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x21, 0x12, 0xA4, 0x42, 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '0', '1', '2', '3', 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '4', '5', '6', '7', 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '8', '9', 'a', 'b', 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kTurnChannelDataMessageWithInvalidLength[] = { 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x80, 0x00, 0x00, 0x20, 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x21, 0x12, 0xA4, 0x42, 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '0', '1', '2', '3', 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '4', '5', '6', '7', 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '8', '9', 'a', 'b', 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic unsigned char kTurnChannelDataMessageWithOddLength[] = { 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x40, 0x00, 0x00, 0x05, 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 0x21, 0x12, 0xA4, 0x42, 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org '0', 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgstatic const rtc::SocketAddress kClientAddr("11.11.11.11", 0); 812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgstatic const rtc::SocketAddress kServerAddr("22.22.22.22", 0); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass AsyncStunTCPSocketTest : public testing::Test, 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public sigslot::has_slots<> { 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AsyncStunTCPSocketTest() 872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : vss_(new rtc::VirtualSocketServer(NULL)), 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ss_scope_(vss_.get()) { 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateSockets(); 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateSockets() { 962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::AsyncSocket* server = vss_->CreateAsyncSocket( 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kServerAddr.family(), SOCK_STREAM); 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org server->Bind(kServerAddr); 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org recv_socket_.reset(new AsyncStunTCPSocket(server, true)); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org recv_socket_->SignalNewConnection.connect( 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &AsyncStunTCPSocketTest::OnNewConnection); 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::AsyncSocket* client = vss_->CreateAsyncSocket( 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kClientAddr.family(), SOCK_STREAM); 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org send_socket_.reset(AsyncStunTCPSocket::Create( 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org client, kClientAddr, recv_socket_->GetLocalAddress())); 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(send_socket_.get() != NULL); 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vss_->ProcessMessagesUntilIdle(); 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnReadPacket(rtc::AsyncPacketSocket* socket, const char* data, 1122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org size_t len, const rtc::SocketAddress& remote_addr, 1132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time) { 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org recv_packets_.push_back(std::string(data, len)); 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnNewConnection(rtc::AsyncPacketSocket* server, 1182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::AsyncPacketSocket* new_socket) { 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listen_socket_.reset(new_socket); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_socket->SignalReadPacket.connect( 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &AsyncStunTCPSocketTest::OnReadPacket); 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Send(const void* data, size_t len) { 1252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::PacketOptions options; 126391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org size_t ret = send_socket_->Send( 127f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org reinterpret_cast<const char*>(data), len, options); 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vss_->ProcessMessagesUntilIdle(); 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (ret == len); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool CheckData(const void* data, int len) { 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ret = false; 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (recv_packets_.size()) { 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string packet = recv_packets_.front(); 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org recv_packets_.pop_front(); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ret = (memcmp(data, packet.c_str(), len) == 0); 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return ret; 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 1432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketServerScope ss_scope_; 1442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<AsyncStunTCPSocket> send_socket_; 1452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<AsyncStunTCPSocket> recv_socket_; 1462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::AsyncPacketSocket> listen_socket_; 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::list<std::string> recv_packets_; 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Testing a stun packet sent/recv properly. 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestSingleStunPacket) { 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kStunMessageWithZeroLength, 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, recv_packets_.size()); 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CheckData(kStunMessageWithZeroLength, 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verify sending multiple packets. 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestMultipleStunPackets) { 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kStunMessageWithZeroLength, 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kStunMessageWithZeroLength, 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kStunMessageWithZeroLength, 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kStunMessageWithZeroLength, 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithZeroLength))); 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(4u, recv_packets_.size()); 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying TURN channel data message with zero length. 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataWithZeroLength) { 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kTurnChannelDataMessageWithZeroLength, 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithZeroLength))); 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, recv_packets_.size()); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithZeroLength, 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithZeroLength))); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying TURN channel data message. 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestTurnChannelData) { 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kTurnChannelDataMessage, 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessage))); 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, recv_packets_.size()); 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CheckData(kTurnChannelDataMessage, 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessage))); 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying TURN channel messages which needs padding handled properly. 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataPadding) { 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(kTurnChannelDataMessageWithOddLength, 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithOddLength))); 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, recv_packets_.size()); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithOddLength, 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithOddLength))); 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying stun message with invalid length. 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestStunInvalidLength) { 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kStunMessageWithInvalidLength, 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithInvalidLength))); 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, recv_packets_.size()); 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Modify the message length to larger value. 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kStunMessageWithInvalidLength[2] = 0xFF; 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kStunMessageWithInvalidLength[3] = 0xFF; 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kStunMessageWithInvalidLength, 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithInvalidLength))); 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Modify the message length to smaller value. 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kStunMessageWithInvalidLength[2] = 0x00; 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kStunMessageWithInvalidLength[3] = 0x01; 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kStunMessageWithInvalidLength, 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kStunMessageWithInvalidLength))); 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying TURN channel data message with invalid length. 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataWithInvalidLength) { 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength, 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithInvalidLength))); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Modify the length to larger value. 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTurnChannelDataMessageWithInvalidLength[2] = 0xFF; 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTurnChannelDataMessageWithInvalidLength[3] = 0xF0; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength, 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithInvalidLength))); 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Modify the length to smaller value. 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTurnChannelDataMessageWithInvalidLength[2] = 0x00; 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTurnChannelDataMessageWithInvalidLength[3] = 0x00; 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength, 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithInvalidLength))); 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying a small buffer handled (dropped) properly. This will be 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// a common one for both stun and turn. 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestTooSmallMessageBuffer) { 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char data[1]; 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(Send(data, sizeof(data))); 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying a legal large turn message. 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestMaximumSizeTurnPacket) { 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We have problem in getting the SignalWriteEvent from the virtual socket 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // server. So increasing the send buffer to 64k. 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(mallinath) - Remove this setting after we fix vss issue. 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vss_->set_send_buffer_capacity(64 * 1024); 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned char packet[65539]; 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[0] = 0x40; 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[1] = 0x00; 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[2] = 0xFF; 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[3] = 0xFF; 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(packet, sizeof(packet))); 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Verifying a legal large stun message. 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, TestMaximumSizeStunPacket) { 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // We have problem in getting the SignalWriteEvent from the virtual socket 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // server. So increasing the send buffer to 64k. 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(mallinath) - Remove this setting after we fix vss issue. 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vss_->set_send_buffer_capacity(64 * 1024); 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org unsigned char packet[65552]; 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[0] = 0x00; 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[1] = 0x01; 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[2] = 0xFF; 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org packet[3] = 0xFC; 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(Send(packet, sizeof(packet))); 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Investigate why WriteEvent is not signaled from VSS. 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(AsyncStunTCPSocketTest, DISABLED_TestWithSmallSendBuffer) { 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vss_->set_send_buffer_capacity(1); 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Send(kTurnChannelDataMessageWithOddLength, 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithOddLength)); 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1u, recv_packets_.size()); 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithOddLength, 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(kTurnChannelDataMessageWithOddLength))); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 281