Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2016 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 <algorithm> | |
| 12 #include <list> | |
| 13 #include <memory> | |
| 14 #include <utility> | |
| 15 #include <vector> | |
| 16 | |
| 17 #include "webrtc/base/gunit.h" | |
| 18 #include "webrtc/base/thread.h" | |
| 19 #include "webrtc/base/asyncpacketsocket.h" | |
| 20 #include "webrtc/base/socketserver.h" | |
| 21 #include "webrtc/p2p/base/packettransportinterface.h" | |
| 22 #include "webrtc/p2p/base/udptransportchannel.h" | |
| 23 | |
| 24 namespace cricket { | |
| 25 | |
| 26 class UdpTransPortChannelTest : public testing::Test, | |
|
Taylor Brandstetter
2016/11/04 00:17:41
nit: remove capital 'P'
johan
2016/11/04 17:39:30
Done.
| |
| 27 public sigslot::has_slots<> { | |
| 28 public: | |
| 29 void SetUp() { | |
| 30 // TODO(johan) investigate whether an AutoThread should be instantiated. | |
| 31 network_thread_ = rtc::Thread::Current(); | |
| 32 ASSERT_NE(nullptr, network_thread_); | |
| 33 network_thread_->set_socketserver( | |
| 34 rtc::SocketServer::CreateDefault().release()); | |
|
Taylor Brandstetter
2016/11/04 00:17:42
Can you use the VirtualSocketServer (+ SocketServe
johan
2016/11/04 17:39:30
Done. Tricky to figure out how VirtualSocketServer
| |
| 35 ep1_.Init("name1", 1); | |
| 36 ep2_.Init("name2", 2); | |
| 37 } | |
| 38 | |
| 39 void TearDown() { | |
| 40 ep1_.Reset(); | |
| 41 ep2_.Reset(); | |
| 42 network_thread_ = nullptr; | |
|
Taylor Brandstetter
2016/11/04 00:17:41
This isn't necessary; can just let the destructor
johan
2016/11/04 17:39:30
Acknowledged.
| |
| 43 } | |
| 44 | |
| 45 struct Endpoint : public sigslot::has_slots<> { | |
| 46 void Init(std::string tch_name, int component) { | |
| 47 ch_.reset(new UdpTransportChannel(std::move(tch_name), component)); | |
| 48 ch_->SignalReadPacket.connect(this, &Endpoint::OnReadPacket); | |
| 49 ch_->SignalSentPacket.connect(this, &Endpoint::OnSentPacket); | |
| 50 ch_->SignalReadyToSend.connect(this, &Endpoint::OnReadyToSend); | |
| 51 ch_->SignalWritableState.connect(this, &Endpoint::OnWritableState); | |
| 52 ResetStats(); | |
| 53 } | |
| 54 | |
| 55 void Reset() { ch_.reset(); } | |
| 56 | |
| 57 bool CheckData(const char* data, int len) { | |
| 58 bool ret = false; | |
| 59 if (!ch_packets_.empty()) { | |
| 60 std::string packet = ch_packets_.front(); | |
| 61 ret = (packet == std::string(data, len)); | |
| 62 ch_packets_.pop_front(); | |
| 63 } | |
| 64 return ret; | |
| 65 } | |
| 66 | |
| 67 void ResetStats() { | |
| 68 num_received_packets_ = 0; | |
| 69 num_sig_sent_packets_ = 0; | |
| 70 num_sig_writable_ = 0; | |
| 71 num_sig_ready_to_send_ = 0; | |
| 72 } | |
| 73 | |
| 74 void OnWritableState(rtc::PacketTransportInterface* transport) { | |
| 75 num_sig_writable_++; | |
| 76 } | |
| 77 | |
| 78 void OnReadyToSend(rtc::PacketTransportInterface* transport) { | |
| 79 num_sig_ready_to_send_++; | |
| 80 } | |
| 81 | |
| 82 void OnReadPacket(rtc::PacketTransportInterface* transport, | |
| 83 const char* data, | |
| 84 size_t len, | |
| 85 const rtc::PacketTime& packet_time, | |
| 86 int flags) { | |
| 87 num_received_packets_++; | |
| 88 LOG(LS_VERBOSE) << "OnReadPacket (unittest)"; | |
| 89 ch_packets_.push_front(std::string(data, len)); | |
| 90 } | |
| 91 | |
| 92 void OnSentPacket(rtc::PacketTransportInterface* transport, | |
| 93 const rtc::SentPacket&) { | |
| 94 num_sig_sent_packets_++; | |
| 95 } | |
| 96 | |
| 97 int SendData(const char* data, size_t len) { | |
| 98 rtc::PacketOptions options; | |
| 99 return ch_->SendPacket(data, len, options, 0); | |
| 100 } | |
| 101 | |
| 102 void GetLocalPort(uint16_t* local_port) { | |
| 103 const rtc::SocketAddress& addr = ch_->local_parameters(); | |
| 104 *local_port = addr.port(); | |
| 105 } | |
| 106 | |
| 107 std::list<std::string> ch_packets_; | |
| 108 std::unique_ptr<UdpTransportChannel> ch_; | |
| 109 uint32_t num_received_packets_ = 0; // Increases on SignalReadPacket. | |
| 110 uint32_t num_sig_sent_packets_ = 0; // Increases on SignalSentPacket. | |
| 111 uint32_t num_sig_writable_ = 0; // Increases on SignalWritable. | |
| 112 uint32_t num_sig_ready_to_send_ = 0; // Increases on SignalReadyToSend. | |
| 113 }; | |
| 114 | |
| 115 Endpoint ep1_; | |
| 116 Endpoint ep2_; | |
| 117 rtc::Thread* network_thread_; | |
| 118 | |
| 119 void TestSendRecv() { | |
| 120 for (uint32_t i = 0; i < 5; ++i) { | |
| 121 static const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; | |
| 122 int len = static_cast<int>(strlen(data)); | |
| 123 // local_channel1 <==> remote_chanel1 | |
|
Taylor Brandstetter
2016/11/04 00:17:42
nit: chanel->channel
johan
2016/11/04 17:39:30
Done.
| |
| 124 EXPECT_EQ_WAIT(len, ep1_.SendData(data, len), 1000); | |
|
Taylor Brandstetter
2016/11/04 00:17:41
Could you use a default timeout of something like
johan
2016/11/04 17:39:30
Done.
| |
| 125 // rtc::Thread::Current()->ProcessMessages(1000); | |
|
Taylor Brandstetter
2016/11/04 00:17:41
nit: Can these commented-out lines be removed?
johan
2016/11/04 17:39:30
Done.
| |
| 126 EXPECT_TRUE_WAIT(ep2_.CheckData(data, len), 1000); | |
| 127 EXPECT_EQ_WAIT(i + 1u, ep2_.num_received_packets_, 100); | |
| 128 EXPECT_EQ_WAIT(len, ep2_.SendData(data, len), 1000); | |
| 129 // rtc::Thread::Current()->ProcessMessages(1000); | |
| 130 EXPECT_TRUE_WAIT(ep1_.CheckData(data, len), 1000); | |
| 131 EXPECT_EQ_WAIT(i + 1u, ep1_.num_received_packets_, 100); | |
| 132 } | |
| 133 } | |
| 134 }; | |
| 135 | |
| 136 TEST_F(UdpTransPortChannelTest, SendRecvBasic) { | |
| 137 ep1_.ch_->CreateSocket(); | |
| 138 ep2_.ch_->CreateSocket(); | |
| 139 uint16_t port; | |
| 140 ep2_.GetLocalPort(&port); | |
| 141 rtc::SocketAddress addr2 = rtc::SocketAddress("127.0.0.1", port); | |
| 142 ep1_.ch_->SetRemoteParameters(addr2); | |
| 143 ep1_.GetLocalPort(&port); | |
| 144 rtc::SocketAddress addr1 = rtc::SocketAddress("127.0.0.1", port); | |
| 145 ep2_.ch_->SetRemoteParameters(addr1); | |
| 146 TestSendRecv(); | |
| 147 } | |
| 148 | |
| 149 TEST_F(UdpTransPortChannelTest, DefaultLocal) { | |
|
Taylor Brandstetter
2016/11/04 00:17:42
nit: Rename to DefaultLocalParameters
johan
2016/11/04 17:39:30
Done.
| |
| 150 EXPECT_TRUE(ep1_.ch_->local_parameters().IsNil()); | |
| 151 } | |
| 152 | |
| 153 TEST_F(UdpTransPortChannelTest, CreateSocketTwice) { | |
| 154 ep1_.ch_->CreateSocket(); | |
| 155 EXPECT_EQ(UDPTRANSPORT_STATE_CONNECTING, ep1_.ch_->GetState()); | |
| 156 ep1_.ch_->CreateSocket(); | |
| 157 EXPECT_EQ(UDPTRANSPORT_STATE_CONNECTING, ep1_.ch_->GetState()); | |
| 158 } | |
| 159 | |
| 160 TEST_F(UdpTransPortChannelTest, StatusAndSignals) { | |
| 161 EXPECT_EQ(UDPTRANSPORT_STATE_INIT, ep1_.ch_->GetState()); | |
| 162 ep1_.ch_->CreateSocket(); | |
| 163 EXPECT_EQ(UDPTRANSPORT_STATE_CONNECTING, ep1_.ch_->GetState()); | |
| 164 EXPECT_EQ(0u, ep1_.num_sig_writable_); | |
| 165 EXPECT_EQ(0u, ep1_.num_sig_ready_to_send_); | |
| 166 // Loopback | |
| 167 EXPECT_TRUE(!ep1_.ch_->writable()); | |
| 168 rtc::SocketAddress addr = ep1_.ch_->local_parameters(); | |
| 169 // keep port, but explicit set IP. | |
|
Taylor Brandstetter
2016/11/04 00:17:41
nit: Capitalize "keep", "explicit"->"explicitly"
johan
2016/11/04 17:39:30
Done.
| |
| 170 addr.SetIP("127.0.0.1"); | |
| 171 ep1_.ch_->SetRemoteParameters(addr); | |
| 172 EXPECT_TRUE(ep1_.ch_->writable()); | |
| 173 EXPECT_EQ(1u, ep1_.num_sig_writable_); | |
| 174 EXPECT_EQ(1u, ep1_.num_sig_ready_to_send_); | |
| 175 const char data[] = "abc"; | |
| 176 ep1_.SendData(data, sizeof(data)); | |
| 177 EXPECT_EQ_WAIT(1u, ep1_.ch_packets_.size(), 100); | |
| 178 EXPECT_EQ_WAIT(1u, ep1_.num_sig_sent_packets_, 200); | |
| 179 } | |
| 180 } // namespace cricket | |
| OLD | NEW |