| Index: webrtc/test/channel_transport/udp_transport_unittest.cc
|
| diff --git a/webrtc/test/channel_transport/udp_transport_unittest.cc b/webrtc/test/channel_transport/udp_transport_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..975f52b7562b83c0a2b361d20c9e5a4c4be41e6b
|
| --- /dev/null
|
| +++ b/webrtc/test/channel_transport/udp_transport_unittest.cc
|
| @@ -0,0 +1,143 @@
|
| +/*
|
| + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include <vector>
|
| +
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "webrtc/test/channel_transport/udp_transport.h"
|
| +// We include the implementation header file to get at the dependency-injecting
|
| +// constructor.
|
| +#include "webrtc/test/channel_transport/udp_transport_impl.h"
|
| +// We must mock the socket manager, for which we need its definition.
|
| +#include "webrtc/test/channel_transport/udp_socket_manager_wrapper.h"
|
| +
|
| +using ::testing::_;
|
| +using ::testing::Return;
|
| +
|
| +namespace webrtc {
|
| +namespace test {
|
| +
|
| +class MockUdpSocketWrapper : public UdpSocketWrapper {
|
| + public:
|
| + // The following methods have to be mocked because they are pure.
|
| + MOCK_METHOD2(SetCallback, bool(CallbackObj, IncomingSocketCallback));
|
| + MOCK_METHOD1(Bind, bool(const SocketAddress&));
|
| + MOCK_METHOD0(ValidHandle, bool());
|
| + MOCK_METHOD4(SetSockopt, bool(int32_t, int32_t,
|
| + const int8_t*,
|
| + int32_t));
|
| + MOCK_METHOD1(SetTOS, int32_t(int32_t));
|
| + MOCK_METHOD3(SendTo, int32_t(const int8_t*, size_t, const SocketAddress&));
|
| + MOCK_METHOD8(SetQos, bool(int32_t, int32_t,
|
| + int32_t, int32_t,
|
| + int32_t, int32_t,
|
| + const SocketAddress &,
|
| + int32_t));
|
| +};
|
| +
|
| +class MockUdpSocketManager : public UdpSocketManager {
|
| + public:
|
| + // Access to protected destructor.
|
| + void Destroy() {
|
| + delete this;
|
| + }
|
| + MOCK_METHOD2(Init, bool(int32_t, uint8_t&));
|
| + MOCK_METHOD0(Start, bool());
|
| + MOCK_METHOD0(Stop, bool());
|
| + MOCK_METHOD1(AddSocket, bool(UdpSocketWrapper*));
|
| + MOCK_METHOD1(RemoveSocket, bool(UdpSocketWrapper*));
|
| +};
|
| +
|
| +class MockSocketFactory :
|
| + public UdpTransportImpl::SocketFactoryInterface {
|
| + public:
|
| + MockSocketFactory(std::vector<MockUdpSocketWrapper*>* socket_counter)
|
| + : socket_counter_(socket_counter) {
|
| + }
|
| + UdpSocketWrapper* CreateSocket(const int32_t id,
|
| + UdpSocketManager* mgr,
|
| + CallbackObj obj,
|
| + IncomingSocketCallback cb,
|
| + bool ipV6Enable,
|
| + bool disableGQOS) {
|
| + MockUdpSocketWrapper* socket = new MockUdpSocketWrapper();
|
| + // We instrument the socket with calls that are expected, but do
|
| + // not matter for any specific test, in order to avoid warning messages.
|
| + EXPECT_CALL(*socket, ValidHandle()).WillRepeatedly(Return(true));
|
| + EXPECT_CALL(*socket, Bind(_)).WillOnce(Return(true));
|
| + socket_counter_->push_back(socket);
|
| + return socket;
|
| + }
|
| + std::vector<MockUdpSocketWrapper*>* socket_counter_;
|
| +};
|
| +
|
| +class UDPTransportTest : public ::testing::Test {
|
| + public:
|
| + UDPTransportTest()
|
| + : sockets_created_(0) {
|
| + }
|
| +
|
| + ~UDPTransportTest() {
|
| + // In production, sockets register themselves at creation time with
|
| + // an UdpSocketManager, and the UdpSocketManager is responsible for
|
| + // deleting them. In this test, we just delete them after the test.
|
| + while (!sockets_created_.empty()) {
|
| + delete sockets_created_.back();
|
| + sockets_created_.pop_back();
|
| + }
|
| + }
|
| +
|
| + int NumSocketsCreated() {
|
| + return sockets_created_.size();
|
| + }
|
| +
|
| + std::vector<MockUdpSocketWrapper*>* sockets_created() {
|
| + return &sockets_created_;
|
| + }
|
| +private:
|
| + std::vector<MockUdpSocketWrapper*> sockets_created_;
|
| +};
|
| +
|
| +TEST_F(UDPTransportTest, CreateTransport) {
|
| + int32_t id = 0;
|
| + uint8_t threads = 1;
|
| + UdpTransport* transport = UdpTransport::Create(id, threads);
|
| + UdpTransport::Destroy(transport);
|
| +}
|
| +
|
| +// This test verifies that the mock_socket is not called from the constructor.
|
| +TEST_F(UDPTransportTest, ConstructorDoesNotCreateSocket) {
|
| + int32_t id = 0;
|
| + UdpTransportImpl::SocketFactoryInterface* null_maker = NULL;
|
| + UdpSocketManager* null_manager = NULL;
|
| + UdpTransport* transport = new UdpTransportImpl(id,
|
| + null_maker,
|
| + null_manager);
|
| + delete transport;
|
| +}
|
| +
|
| +TEST_F(UDPTransportTest, InitializeSourcePorts) {
|
| + int32_t id = 0;
|
| + UdpTransportImpl::SocketFactoryInterface* mock_maker
|
| + = new MockSocketFactory(sockets_created());
|
| + MockUdpSocketManager* mock_manager = new MockUdpSocketManager();
|
| + UdpTransport* transport = new UdpTransportImpl(id,
|
| + mock_maker,
|
| + mock_manager);
|
| + EXPECT_EQ(0, transport->InitializeSourcePorts(4711, 4712));
|
| + EXPECT_EQ(2, NumSocketsCreated());
|
| +
|
| + delete transport;
|
| + mock_manager->Destroy();
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace webrtc
|
|
|