| Index: content/renderer/p2p/p2p_transport_impl_unittest.cc
|
| diff --git a/content/renderer/p2p/p2p_transport_impl_unittest.cc b/content/renderer/p2p/p2p_transport_impl_unittest.cc
|
| deleted file mode 100644
|
| index 0022ecea7668f514fe6f30927a339035cb8a2107..0000000000000000000000000000000000000000
|
| --- a/content/renderer/p2p/p2p_transport_impl_unittest.cc
|
| +++ /dev/null
|
| @@ -1,530 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/renderer/p2p/p2p_transport_impl.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/test/test_timeouts.h"
|
| -#include "jingle/glue/fake_network_manager.h"
|
| -#include "jingle/glue/fake_socket_factory.h"
|
| -#include "jingle/glue/thread_wrapper.h"
|
| -#include "net/base/completion_callback.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/socket/socket.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using testing::_;
|
| -using testing::AtMost;
|
| -using testing::Exactly;
|
| -using testing::InvokeWithoutArgs;
|
| -
|
| -using webkit_glue::P2PTransport;
|
| -
|
| -namespace {
|
| -const char kTestAddress1[] = "192.168.15.12";
|
| -const char kTestAddress2[] = "192.168.15.33";
|
| -
|
| -const char kTransportName1[] = "tr1";
|
| -const char kTransportName2[] = "tr2";
|
| -
|
| -// Send 10 packets 10 bytes each. Packets are sent with 10ms delay
|
| -// between packets (about 100 ms for 10 messages).
|
| -const int kMessageSize = 10;
|
| -const int kMessages = 10;
|
| -const int kUdpWriteDelayMs = 10;
|
| -const int kTcpDataSize = 10 * 1024;
|
| -const int kTcpWriteDelayMs = 1;
|
| -
|
| -class UdpChannelTester : public base::RefCountedThreadSafe<UdpChannelTester> {
|
| - public:
|
| - UdpChannelTester(MessageLoop* message_loop,
|
| - net::Socket* write_socket,
|
| - net::Socket* read_socket)
|
| - : message_loop_(message_loop),
|
| - write_socket_(write_socket),
|
| - read_socket_(read_socket),
|
| - done_(false),
|
| - write_errors_(0),
|
| - read_errors_(0),
|
| - packets_sent_(0),
|
| - packets_received_(0),
|
| - broken_packets_(0) {
|
| - }
|
| -
|
| - void Start() {
|
| - message_loop_->PostTask(
|
| - FROM_HERE, base::Bind(&UdpChannelTester::DoStart, this));
|
| - }
|
| -
|
| - void CheckResults() {
|
| - EXPECT_EQ(0, write_errors_);
|
| - EXPECT_EQ(0, read_errors_);
|
| -
|
| - EXPECT_EQ(0, broken_packets_);
|
| -
|
| - // Verify that we've received at least one packet.
|
| - EXPECT_GT(packets_received_, 0);
|
| - LOG(INFO) << "Received " << packets_received_ << " packets out of "
|
| - << kMessages;
|
| - }
|
| -
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<UdpChannelTester>;
|
| - virtual ~UdpChannelTester() {}
|
| -
|
| - void Done() {
|
| - done_ = true;
|
| - message_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - void DoStart() {
|
| - DoRead();
|
| - DoWrite();
|
| - }
|
| -
|
| - void DoWrite() {
|
| - if (packets_sent_ >= kMessages) {
|
| - Done();
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::IOBuffer> packet(new net::IOBuffer(kMessageSize));
|
| - memset(packet->data(), 123, kMessageSize);
|
| - sent_packets_[packets_sent_] = packet;
|
| - // Put index of this packet in the beginning of the packet body.
|
| - memcpy(packet->data(), &packets_sent_, sizeof(packets_sent_));
|
| -
|
| - int result = write_socket_->Write(packet, kMessageSize,
|
| - base::Bind(&UdpChannelTester::OnWritten,
|
| - base::Unretained(this)));
|
| - HandleWriteResult(result);
|
| - }
|
| -
|
| - void OnWritten(int result) {
|
| - HandleWriteResult(result);
|
| - }
|
| -
|
| - void HandleWriteResult(int result) {
|
| - if (result <= 0 && result != net::ERR_IO_PENDING) {
|
| - LOG(ERROR) << "Received error " << result << " when trying to write";
|
| - write_errors_++;
|
| - Done();
|
| - } else if (result > 0) {
|
| - EXPECT_EQ(kMessageSize, result);
|
| - packets_sent_++;
|
| - message_loop_->PostDelayedTask(
|
| - FROM_HERE, base::Bind(&UdpChannelTester::DoWrite, this),
|
| - base::TimeDelta::FromMilliseconds(kUdpWriteDelayMs));
|
| - }
|
| - }
|
| -
|
| - void DoRead() {
|
| - int result = 1;
|
| - while (result > 0) {
|
| - int kReadSize = kMessageSize * 2;
|
| - read_buffer_ = new net::IOBuffer(kReadSize);
|
| -
|
| - result = read_socket_->Read(read_buffer_, kReadSize,
|
| - base::Bind(&UdpChannelTester::OnRead,
|
| - base::Unretained(this)));
|
| - HandleReadResult(result);
|
| - };
|
| - }
|
| -
|
| - void OnRead(int result) {
|
| - HandleReadResult(result);
|
| - DoRead();
|
| - }
|
| -
|
| - void HandleReadResult(int result) {
|
| - if (result <= 0 && result != net::ERR_IO_PENDING) {
|
| - // Error will be received after the socket is closed.
|
| - if (!done_) {
|
| - LOG(ERROR) << "Received error " << result << " when trying to read";
|
| - read_errors_++;
|
| - Done();
|
| - }
|
| - } else if (result > 0) {
|
| - packets_received_++;
|
| - if (kMessageSize != result) {
|
| - // Invalid packet size;
|
| - broken_packets_++;
|
| - } else {
|
| - // Validate packet body.
|
| - int packet_id;
|
| - memcpy(&packet_id, read_buffer_->data(), sizeof(packet_id));
|
| - if (packet_id < 0 || packet_id >= kMessages) {
|
| - broken_packets_++;
|
| - } else {
|
| - if (memcmp(read_buffer_->data(), sent_packets_[packet_id]->data(),
|
| - kMessageSize) != 0)
|
| - broken_packets_++;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - private:
|
| - MessageLoop* message_loop_;
|
| - net::Socket* write_socket_;
|
| - net::Socket* read_socket_;
|
| - bool done_;
|
| -
|
| - scoped_refptr<net::IOBuffer> sent_packets_[kMessages];
|
| - scoped_refptr<net::IOBuffer> read_buffer_;
|
| -
|
| - int write_errors_;
|
| - int read_errors_;
|
| - int packets_sent_;
|
| - int packets_received_;
|
| - int broken_packets_;
|
| -};
|
| -
|
| -class TcpChannelTester : public base::RefCountedThreadSafe<TcpChannelTester> {
|
| - public:
|
| - TcpChannelTester(MessageLoop* message_loop,
|
| - net::Socket* write_socket,
|
| - net::Socket* read_socket)
|
| - : message_loop_(message_loop),
|
| - write_socket_(write_socket),
|
| - read_socket_(read_socket),
|
| - done_(false),
|
| - write_errors_(0),
|
| - read_errors_(0) {
|
| - }
|
| -
|
| - void Init() {
|
| - // Initialize |send_buffer_|.
|
| - send_buffer_ = new net::DrainableIOBuffer(new net::IOBuffer(kTcpDataSize),
|
| - kTcpDataSize);
|
| - for (int i = 0; i < kTcpDataSize; ++i) {
|
| - send_buffer_->data()[i] = rand() % 256;
|
| - }
|
| - }
|
| -
|
| - void StartRead() {
|
| - message_loop_->PostTask(
|
| - FROM_HERE, base::Bind(&TcpChannelTester::DoRead, this));
|
| - }
|
| -
|
| - void StartWrite() {
|
| - message_loop_->PostTask(
|
| - FROM_HERE, base::Bind(&TcpChannelTester::DoWrite, this));
|
| - }
|
| -
|
| - void CheckResults() {
|
| - EXPECT_EQ(0, write_errors_);
|
| - EXPECT_EQ(0, read_errors_);
|
| -
|
| - EXPECT_EQ(0, send_buffer_->BytesRemaining());
|
| -
|
| - send_buffer_->SetOffset(0);
|
| - EXPECT_EQ(kTcpDataSize, static_cast<int>(received_data_.size()));
|
| - EXPECT_EQ(0, memcmp(send_buffer_->data(),
|
| - &received_data_[0], received_data_.size()));
|
| - }
|
| -
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<TcpChannelTester>;
|
| - virtual ~TcpChannelTester() {}
|
| -
|
| - void Done() {
|
| - done_ = true;
|
| - message_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure());
|
| - }
|
| -
|
| - void DoWrite() {
|
| - if (send_buffer_->BytesRemaining() == 0) {
|
| - return;
|
| - }
|
| -
|
| - int result = write_socket_->Write(
|
| - send_buffer_, send_buffer_->BytesRemaining(),
|
| - base::Bind(&TcpChannelTester::OnWritten, base::Unretained(this)));
|
| - HandleWriteResult(result);
|
| - }
|
| -
|
| - void OnWritten(int result) {
|
| - HandleWriteResult(result);
|
| - }
|
| -
|
| - void HandleWriteResult(int result) {
|
| - if (result <= 0 && result != net::ERR_IO_PENDING) {
|
| - LOG(ERROR) << "Received error " << result << " when trying to write";
|
| - write_errors_++;
|
| - Done();
|
| - } else if (result > 0) {
|
| - send_buffer_->DidConsume(result);
|
| - message_loop_->PostDelayedTask(
|
| - FROM_HERE, base::Bind(&TcpChannelTester::DoWrite, this),
|
| - base::TimeDelta::FromMilliseconds(kTcpWriteDelayMs));
|
| - }
|
| - }
|
| -
|
| - void DoRead() {
|
| - int result = 1;
|
| - while (result > 0) {
|
| - int kReadSize = kMessageSize * 2;
|
| - read_buffer_ = new net::IOBuffer(kReadSize);
|
| -
|
| - result = read_socket_->Read(
|
| - read_buffer_, kReadSize,
|
| - base::Bind(&TcpChannelTester::OnRead, base::Unretained(this)));
|
| - HandleReadResult(result);
|
| - };
|
| - }
|
| -
|
| - void OnRead(int result) {
|
| - HandleReadResult(result);
|
| - DoRead();
|
| - }
|
| -
|
| - void HandleReadResult(int result) {
|
| - if (result <= 0 && result != net::ERR_IO_PENDING) {
|
| - // Error will be received after the socket is closed.
|
| - if (!done_) {
|
| - LOG(ERROR) << "Received error " << result << " when trying to read";
|
| - read_errors_++;
|
| - Done();
|
| - }
|
| - } else if (result > 0) {
|
| - received_data_.insert(received_data_.end(), read_buffer_->data(),
|
| - read_buffer_->data() + result);
|
| - if (static_cast<int>(received_data_.size()) == kTcpDataSize)
|
| - Done();
|
| - }
|
| - }
|
| -
|
| - private:
|
| - MessageLoop* message_loop_;
|
| - net::Socket* write_socket_;
|
| - net::Socket* read_socket_;
|
| - bool done_;
|
| -
|
| - scoped_refptr<net::DrainableIOBuffer> send_buffer_;
|
| - scoped_refptr<net::IOBuffer> read_buffer_;
|
| -
|
| - std::vector<char> sent_data_;
|
| - std::vector<char> received_data_;
|
| -
|
| - int write_errors_;
|
| - int read_errors_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace content {
|
| -
|
| -class MockP2PEventHandler : public P2PTransport::EventHandler {
|
| - public:
|
| - MOCK_METHOD1(OnCandidateReady, void(const std::string& address));
|
| - MOCK_METHOD1(OnStateChange, void(P2PTransport::State state));
|
| - MOCK_METHOD1(OnError, void(int error));
|
| -};
|
| -
|
| -class P2PTransportImplTest : public testing::Test {
|
| - public:
|
| - void DestroyTransport() {
|
| - transport1_.reset();
|
| - transport2_.reset();
|
| - }
|
| -
|
| - protected:
|
| - virtual void SetUp() OVERRIDE {
|
| - socket_manager_ = new jingle_glue::FakeSocketManager();
|
| -
|
| - net::IPAddressNumber ip;
|
| - ASSERT_TRUE(net::ParseIPLiteralToNumber(kTestAddress1, &ip));
|
| - transport1_.reset(new P2PTransportImpl(
|
| - new jingle_glue::FakeNetworkManager(ip),
|
| - new jingle_glue::FakeSocketFactory(socket_manager_, ip)));
|
| -
|
| - ASSERT_TRUE(net::ParseIPLiteralToNumber(kTestAddress2, &ip));
|
| - transport2_.reset(new P2PTransportImpl(
|
| - new jingle_glue::FakeNetworkManager(ip),
|
| - new jingle_glue::FakeSocketFactory(socket_manager_, ip)));
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - DestroyTransport();
|
| - message_loop_.RunAllPending();
|
| - }
|
| -
|
| - void Init(P2PTransport::Protocol protocol) {
|
| - P2PTransport::Config config;
|
| - ASSERT_TRUE(transport1_->Init(
|
| - NULL, kTransportName1, protocol, config, &event_handler1_));
|
| - ASSERT_TRUE(transport2_->Init(
|
| - NULL, kTransportName2, protocol, config, &event_handler2_));
|
| - }
|
| -
|
| - MessageLoop message_loop_;
|
| -
|
| - scoped_refptr<jingle_glue::FakeSocketManager> socket_manager_;
|
| - scoped_ptr<P2PTransportImpl> transport1_;
|
| - MockP2PEventHandler event_handler1_;
|
| - scoped_ptr<P2PTransportImpl> transport2_;
|
| - MockP2PEventHandler event_handler2_;
|
| -};
|
| -
|
| -TEST_F(P2PTransportImplTest, Create) {
|
| - Init(P2PTransport::PROTOCOL_UDP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_));
|
| -
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -ACTION_P(AddRemoteCandidate, transport) {
|
| - EXPECT_TRUE(transport->AddRemoteCandidate(arg0));
|
| -}
|
| -
|
| -TEST_F(P2PTransportImplTest, ConnectUdp) {
|
| - Init(P2PTransport::PROTOCOL_UDP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport2_.get()));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport1_.get()));
|
| -
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(P2PTransportImplTest, ConnectTcp) {
|
| - Init(P2PTransport::PROTOCOL_TCP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport2_.get()));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport1_.get()));
|
| -
|
| - message_loop_.RunAllPending();
|
| -}
|
| -
|
| -TEST_F(P2PTransportImplTest, SendDataUdp) {
|
| - Init(P2PTransport::PROTOCOL_UDP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport2_.get()));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport1_.get()));
|
| -
|
| - // Transport may first become ether readable or writable, but
|
| - // eventually it must be readable and writable.
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(Exactly(1));
|
| -
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(Exactly(1));
|
| -
|
| - scoped_refptr<UdpChannelTester> channel_tester = new UdpChannelTester(
|
| - &message_loop_, transport1_->GetChannel(), transport2_->GetChannel());
|
| -
|
| - message_loop_.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
|
| - TestTimeouts::action_max_timeout());
|
| -
|
| - channel_tester->Start();
|
| - message_loop_.Run();
|
| - channel_tester->CheckResults();
|
| -}
|
| -
|
| -TEST_F(P2PTransportImplTest, SendDataTcp) {
|
| - Init(P2PTransport::PROTOCOL_TCP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport2_.get()));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport1_.get()));
|
| -
|
| - scoped_refptr<TcpChannelTester> channel_tester = new TcpChannelTester(
|
| - &message_loop_, transport1_->GetChannel(), transport2_->GetChannel());
|
| -
|
| - // Transport may first become ether readable or writable, but
|
| - // eventually it must be readable and writable.
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(Exactly(1))
|
| - .WillOnce(InvokeWithoutArgs(channel_tester.get(),
|
| - &TcpChannelTester::StartWrite))
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(Exactly(1))
|
| - .WillOnce(InvokeWithoutArgs(channel_tester.get(),
|
| - &TcpChannelTester::StartRead))
|
| - .RetiresOnSaturation();
|
| -
|
| - message_loop_.PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(),
|
| - TestTimeouts::action_max_timeout());
|
| -
|
| - channel_tester->Init();
|
| - message_loop_.Run();
|
| - channel_tester->CheckResults();
|
| -}
|
| -
|
| -TEST_F(P2PTransportImplTest, DeleteFromCallback) {
|
| - Init(P2PTransport::PROTOCOL_TCP);
|
| -
|
| - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport2_.get()));
|
| - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly(
|
| - AddRemoteCandidate(transport1_.get()));
|
| -
|
| - // Transport may first become ether readable or writable, but
|
| - // eventually it must be readable and writable.
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler1_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(AtMost(1));
|
| -
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_READABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_WRITABLE))
|
| - .Times(AtMost(1));
|
| - EXPECT_CALL(event_handler2_, OnStateChange(
|
| - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE |
|
| - P2PTransport::STATE_WRITABLE)))
|
| - .Times(Exactly(1))
|
| - .WillOnce(DoAll(
|
| - InvokeWithoutArgs(this, &P2PTransportImplTest::DestroyTransport),
|
| - InvokeWithoutArgs(&message_loop_, &MessageLoop::Quit)));
|
| -
|
| - message_loop_.Run();
|
| -}
|
| -
|
| -} // namespace content
|
|
|