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 "base/memory/ref_counted.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/channel_socket_adapter.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/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)#include "third_party/libjingle/source/talk/p2p/base/transportchannel.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::IOBuffer; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kBufferSize = 4096; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestData[] = "data"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTestDataSize = 4; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTestError = -32123; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTransportChannel : public cricket::TransportChannel { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockTransportChannel() : cricket::TransportChannel(std::string(), 0) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_writable(true); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_readable(true); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(SendPacket, int(const char* data, size_t len, int flags)); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(SetOption, int(talk_base::Socket::Option opt, int value)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(GetError, int()); 40f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch MOCK_CONST_METHOD0(GetIceRole, cricket::IceRole()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportChannelSocketAdapterTest : public testing::Test { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportChannelSocketAdapterTest() 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : callback_(base::Bind(&TransportChannelSocketAdapterTest::Callback, 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_result_(0) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_.reset(new TransportChannelSocketAdapter(&channel_)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Callback(int result) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_result_ = result; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTransportChannel channel_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TransportChannelSocketAdapter> target_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback callback_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_result_; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForIO message_loop_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Read() returns net::ERR_IO_PENDING. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TransportChannelSocketAdapterTest, Read) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> buffer(new IOBuffer(kBufferSize)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int result = target_->Read(buffer.get(), kBufferSize, callback_); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::ERR_IO_PENDING, result); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_.SignalReadPacket(&channel_, kTestData, kTestDataSize, 0); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestDataSize, callback_result_); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Read() after Close() returns error. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TransportChannelSocketAdapterTest, ReadClose) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> buffer(new IOBuffer(kBufferSize)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int result = target_->Read(buffer.get(), kBufferSize, callback_); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::ERR_IO_PENDING, result); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_->Close(kTestError); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestError, callback_result_); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All Read() calls after Close() should return the error. 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kTestError, target_->Read(buffer.get(), kBufferSize, callback_)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Write sends the packet and returns correct result. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TransportChannelSocketAdapterTest, Write) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> buffer(new IOBuffer(kTestDataSize)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(channel_, SendPacket(buffer->data(), kTestDataSize, 0)) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(kTestDataSize)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int result = target_->Write(buffer.get(), kTestDataSize, callback_); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTestDataSize, result); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the message is still sent if Write() is called while 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// socket is not open yet. The result is the packet is lost. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TransportChannelSocketAdapterTest, WritePending) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> buffer(new IOBuffer(kTestDataSize)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(channel_, SendPacket(buffer->data(), kTestDataSize, 0)) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(SOCKET_ERROR)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(channel_, GetError()) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(EWOULDBLOCK)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int result = target_->Write(buffer.get(), kTestDataSize, callback_); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, result); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace jingle_glue 120