Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(784)

Side by Side Diff: webrtc/p2p/base/udptransportchannel_unittest.cc

Issue 2377883003: First step in providing a UdpTransportChannel. (Closed)
Patch Set: Revert "Remove component_ and debug_name_, just use transport_name_." Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/udptransportchannel.cc ('k') | webrtc/p2p/p2p.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « webrtc/p2p/base/udptransportchannel.cc ('k') | webrtc/p2p/p2p.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698