| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license | |
| 5 * that can be found in the LICENSE file in the root of the source | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include <vector> | |
| 12 | |
| 13 #include "testing/gmock/include/gmock/gmock.h" | |
| 14 #include "testing/gtest/include/gtest/gtest.h" | |
| 15 #include "webrtc/test/channel_transport/udp_transport.h" | |
| 16 // We include the implementation header file to get at the dependency-injecting | |
| 17 // constructor. | |
| 18 #include "webrtc/test/channel_transport/udp_transport_impl.h" | |
| 19 // We must mock the socket manager, for which we need its definition. | |
| 20 #include "webrtc/test/channel_transport/udp_socket_manager_wrapper.h" | |
| 21 | |
| 22 using ::testing::_; | |
| 23 using ::testing::Return; | |
| 24 | |
| 25 namespace webrtc { | |
| 26 namespace test { | |
| 27 | |
| 28 class MockUdpSocketWrapper : public UdpSocketWrapper { | |
| 29 public: | |
| 30 // The following methods have to be mocked because they are pure. | |
| 31 MOCK_METHOD2(SetCallback, bool(CallbackObj, IncomingSocketCallback)); | |
| 32 MOCK_METHOD1(Bind, bool(const SocketAddress&)); | |
| 33 MOCK_METHOD0(ValidHandle, bool()); | |
| 34 MOCK_METHOD4(SetSockopt, bool(int32_t, int32_t, | |
| 35 const int8_t*, | |
| 36 int32_t)); | |
| 37 MOCK_METHOD1(SetTOS, int32_t(int32_t)); | |
| 38 MOCK_METHOD3(SendTo, int32_t(const int8_t*, size_t, const SocketAddress&)); | |
| 39 MOCK_METHOD8(SetQos, bool(int32_t, int32_t, | |
| 40 int32_t, int32_t, | |
| 41 int32_t, int32_t, | |
| 42 const SocketAddress &, | |
| 43 int32_t)); | |
| 44 }; | |
| 45 | |
| 46 class MockUdpSocketManager : public UdpSocketManager { | |
| 47 public: | |
| 48 // Access to protected destructor. | |
| 49 void Destroy() { | |
| 50 delete this; | |
| 51 } | |
| 52 MOCK_METHOD2(Init, bool(int32_t, uint8_t&)); | |
| 53 MOCK_METHOD0(Start, bool()); | |
| 54 MOCK_METHOD0(Stop, bool()); | |
| 55 MOCK_METHOD1(AddSocket, bool(UdpSocketWrapper*)); | |
| 56 MOCK_METHOD1(RemoveSocket, bool(UdpSocketWrapper*)); | |
| 57 }; | |
| 58 | |
| 59 class MockSocketFactory : | |
| 60 public UdpTransportImpl::SocketFactoryInterface { | |
| 61 public: | |
| 62 MockSocketFactory(std::vector<MockUdpSocketWrapper*>* socket_counter) | |
| 63 : socket_counter_(socket_counter) { | |
| 64 } | |
| 65 UdpSocketWrapper* CreateSocket(const int32_t id, | |
| 66 UdpSocketManager* mgr, | |
| 67 CallbackObj obj, | |
| 68 IncomingSocketCallback cb, | |
| 69 bool ipV6Enable, | |
| 70 bool disableGQOS) { | |
| 71 MockUdpSocketWrapper* socket = new MockUdpSocketWrapper(); | |
| 72 // We instrument the socket with calls that are expected, but do | |
| 73 // not matter for any specific test, in order to avoid warning messages. | |
| 74 EXPECT_CALL(*socket, ValidHandle()).WillRepeatedly(Return(true)); | |
| 75 EXPECT_CALL(*socket, Bind(_)).WillOnce(Return(true)); | |
| 76 socket_counter_->push_back(socket); | |
| 77 return socket; | |
| 78 } | |
| 79 std::vector<MockUdpSocketWrapper*>* socket_counter_; | |
| 80 }; | |
| 81 | |
| 82 class UDPTransportTest : public ::testing::Test { | |
| 83 public: | |
| 84 UDPTransportTest() | |
| 85 : sockets_created_(0) { | |
| 86 } | |
| 87 | |
| 88 ~UDPTransportTest() { | |
| 89 // In production, sockets register themselves at creation time with | |
| 90 // an UdpSocketManager, and the UdpSocketManager is responsible for | |
| 91 // deleting them. In this test, we just delete them after the test. | |
| 92 while (!sockets_created_.empty()) { | |
| 93 delete sockets_created_.back(); | |
| 94 sockets_created_.pop_back(); | |
| 95 } | |
| 96 } | |
| 97 | |
| 98 int NumSocketsCreated() { | |
| 99 return sockets_created_.size(); | |
| 100 } | |
| 101 | |
| 102 std::vector<MockUdpSocketWrapper*>* sockets_created() { | |
| 103 return &sockets_created_; | |
| 104 } | |
| 105 private: | |
| 106 std::vector<MockUdpSocketWrapper*> sockets_created_; | |
| 107 }; | |
| 108 | |
| 109 TEST_F(UDPTransportTest, CreateTransport) { | |
| 110 int32_t id = 0; | |
| 111 uint8_t threads = 1; | |
| 112 UdpTransport* transport = UdpTransport::Create(id, threads); | |
| 113 UdpTransport::Destroy(transport); | |
| 114 } | |
| 115 | |
| 116 // This test verifies that the mock_socket is not called from the constructor. | |
| 117 TEST_F(UDPTransportTest, ConstructorDoesNotCreateSocket) { | |
| 118 int32_t id = 0; | |
| 119 UdpTransportImpl::SocketFactoryInterface* null_maker = NULL; | |
| 120 UdpSocketManager* null_manager = NULL; | |
| 121 UdpTransport* transport = new UdpTransportImpl(id, | |
| 122 null_maker, | |
| 123 null_manager); | |
| 124 delete transport; | |
| 125 } | |
| 126 | |
| 127 TEST_F(UDPTransportTest, InitializeSourcePorts) { | |
| 128 int32_t id = 0; | |
| 129 UdpTransportImpl::SocketFactoryInterface* mock_maker | |
| 130 = new MockSocketFactory(sockets_created()); | |
| 131 MockUdpSocketManager* mock_manager = new MockUdpSocketManager(); | |
| 132 UdpTransport* transport = new UdpTransportImpl(id, | |
| 133 mock_maker, | |
| 134 mock_manager); | |
| 135 EXPECT_EQ(0, transport->InitializeSourcePorts(4711, 4712)); | |
| 136 EXPECT_EQ(2, NumSocketsCreated()); | |
| 137 | |
| 138 delete transport; | |
| 139 mock_manager->Destroy(); | |
| 140 } | |
| 141 | |
| 142 } // namespace test | |
| 143 } // namespace webrtc | |
| OLD | NEW |