blob: d668c55b0bfbb732ced49deeebdaa826d4641dd2 [file] [log] [blame]
mikescarlett9bc517f2016-04-29 18:30:55 -07001/*
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 "webrtc/api/quicdatatransport.h"
12
kwibergbfefb032016-05-01 14:53:46 -070013#include <memory>
mikescarlett9bc517f2016-04-29 18:30:55 -070014#include <set>
15#include <string>
16#include <unordered_map>
17#include <vector>
18
19#include "webrtc/api/quicdatachannel.h"
20#include "webrtc/base/bytebuffer.h"
21#include "webrtc/base/gunit.h"
22#include "webrtc/p2p/base/faketransportcontroller.h"
23#include "webrtc/p2p/quic/quictransportchannel.h"
24#include "webrtc/p2p/quic/reliablequicstream.h"
25
26using webrtc::DataBuffer;
27using webrtc::DataChannelInit;
28using webrtc::DataChannelInterface;
29using webrtc::DataChannelObserver;
30using webrtc::QuicDataChannel;
31using webrtc::QuicDataTransport;
32using cricket::FakeTransportChannel;
33using cricket::QuicTransportChannel;
34using cricket::ReliableQuicStream;
35
36namespace {
37
38// Timeout for asynchronous operations.
39static const int kTimeoutMs = 1000; // milliseconds
40
41// FakeObserver receives messages from the data channel.
42class FakeObserver : public DataChannelObserver {
43 public:
44 FakeObserver() {}
45
46 void OnStateChange() override {}
47
48 void OnBufferedAmountChange(uint64_t previous_amount) override {}
49
50 void OnMessage(const webrtc::DataBuffer& buffer) override {
51 messages_.push_back(std::string(buffer.data.data<char>(), buffer.size()));
52 }
53
54 const std::vector<std::string>& messages() const { return messages_; }
55
56 size_t messages_received() const { return messages_.size(); }
57
58 private:
59 std::vector<std::string> messages_;
60};
61
62// A peer who uses a QUIC transport channel and fake ICE transport channel to
63// send or receive data.
64class QuicDataTransportPeer {
65 public:
66 QuicDataTransportPeer()
deadbeefa2cd6362016-07-13 13:57:32 -070067 : quic_data_transport_(rtc::Thread::Current(), rtc::Thread::Current()),
mikescarletta97611a2016-04-29 22:09:27 -070068 ice_transport_channel_(new FakeTransportChannel("data", 0)),
69 quic_transport_channel_(ice_transport_channel_) {
70 ice_transport_channel_->SetAsync(true);
mikescarlett9bc517f2016-04-29 18:30:55 -070071 }
72
73 void GenerateCertificateAndFingerprint() {
74 rtc::scoped_refptr<rtc::RTCCertificate> local_cert =
kwibergbfefb032016-05-01 14:53:46 -070075 rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
mikescarlett9bc517f2016-04-29 18:30:55 -070076 rtc::SSLIdentity::Generate("cert_name", rtc::KT_DEFAULT)));
77 quic_transport_channel_.SetLocalCertificate(local_cert);
78 local_fingerprint_.reset(CreateFingerprint(local_cert.get()));
79 }
80
81 // Connects |ice_transport_channel_| to that of the other peer.
82 void Connect(QuicDataTransportPeer* other_peer) {
deadbeefa2cd6362016-07-13 13:57:32 -070083 ice_transport_channel_->Connect();
84 other_peer->ice_transport_channel_->Connect();
mikescarletta97611a2016-04-29 22:09:27 -070085 ice_transport_channel_->SetDestination(other_peer->ice_transport_channel_);
mikescarlett9bc517f2016-04-29 18:30:55 -070086 }
87
kwibergbfefb032016-05-01 14:53:46 -070088 std::unique_ptr<rtc::SSLFingerprint>& local_fingerprint() {
mikescarlett9bc517f2016-04-29 18:30:55 -070089 return local_fingerprint_;
90 }
91
92 QuicTransportChannel* quic_transport_channel() {
93 return &quic_transport_channel_;
94 }
95
96 // Write a messge directly to the ReliableQuicStream.
97 void WriteMessage(int data_channel_id,
98 uint64_t message_id,
99 const std::string& message) {
100 ReliableQuicStream* stream = quic_transport_channel_.CreateQuicStream();
101 rtc::CopyOnWriteBuffer payload;
102 webrtc::WriteQuicDataChannelMessageHeader(data_channel_id, message_id,
103 &payload);
104 stream->Write(payload.data<char>(), payload.size(), false);
105 stream->Write(message.data(), message.size(), true);
106 }
107
108 rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
109 const DataChannelInit* config) {
110 return quic_data_transport_.CreateDataChannel("testing", config);
111 }
112
113 QuicDataTransport* quic_data_transport() { return &quic_data_transport_; }
114
115 private:
116 // Creates a fingerprint from a certificate.
117 rtc::SSLFingerprint* CreateFingerprint(rtc::RTCCertificate* cert) {
118 std::string digest_algorithm;
119 cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm);
kwibergbfefb032016-05-01 14:53:46 -0700120 std::unique_ptr<rtc::SSLFingerprint> fingerprint(
mikescarlett9bc517f2016-04-29 18:30:55 -0700121 rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
122 return fingerprint.release();
123 }
124
125 QuicDataTransport quic_data_transport_;
mikescarletta97611a2016-04-29 22:09:27 -0700126 FakeTransportChannel* ice_transport_channel_;
mikescarlett9bc517f2016-04-29 18:30:55 -0700127 QuicTransportChannel quic_transport_channel_;
kwibergbfefb032016-05-01 14:53:46 -0700128 std::unique_ptr<rtc::SSLFingerprint> local_fingerprint_;
mikescarlett9bc517f2016-04-29 18:30:55 -0700129};
130
131class QuicDataTransportTest : public testing::Test {
132 public:
133 QuicDataTransportTest() {}
134
135 void ConnectTransportChannels() {
136 SetCryptoParameters();
137 peer1_.Connect(&peer2_);
138 ASSERT_TRUE_WAIT(peer1_.quic_transport_channel()->writable() &&
139 peer2_.quic_transport_channel()->writable(),
140 kTimeoutMs);
141 }
142
143 void SetTransportChannels() {
144 ASSERT_TRUE(peer1_.quic_data_transport()->SetTransportChannel(
145 peer1_.quic_transport_channel()));
146 ASSERT_TRUE(peer2_.quic_data_transport()->SetTransportChannel(
147 peer2_.quic_transport_channel()));
148 }
149
150 // Sets crypto parameters required for the QUIC handshake.
151 void SetCryptoParameters() {
152 peer1_.GenerateCertificateAndFingerprint();
153 peer2_.GenerateCertificateAndFingerprint();
154
155 peer1_.quic_transport_channel()->SetSslRole(rtc::SSL_CLIENT);
156 peer2_.quic_transport_channel()->SetSslRole(rtc::SSL_SERVER);
157
kwibergbfefb032016-05-01 14:53:46 -0700158 std::unique_ptr<rtc::SSLFingerprint>& peer1_fingerprint =
mikescarlett9bc517f2016-04-29 18:30:55 -0700159 peer1_.local_fingerprint();
kwibergbfefb032016-05-01 14:53:46 -0700160 std::unique_ptr<rtc::SSLFingerprint>& peer2_fingerprint =
mikescarlett9bc517f2016-04-29 18:30:55 -0700161 peer2_.local_fingerprint();
162
163 peer1_.quic_transport_channel()->SetRemoteFingerprint(
164 peer2_fingerprint->algorithm,
165 reinterpret_cast<const uint8_t*>(peer2_fingerprint->digest.data()),
166 peer2_fingerprint->digest.size());
167 peer2_.quic_transport_channel()->SetRemoteFingerprint(
168 peer1_fingerprint->algorithm,
169 reinterpret_cast<const uint8_t*>(peer1_fingerprint->digest.data()),
170 peer1_fingerprint->digest.size());
171 }
172
173 protected:
174 QuicDataTransportPeer peer1_;
175 QuicDataTransportPeer peer2_;
176};
177
178// Tests creation and destruction of data channels.
179TEST_F(QuicDataTransportTest, CreateAndDestroyDataChannels) {
180 QuicDataTransport* quic_data_transport = peer2_.quic_data_transport();
181 EXPECT_FALSE(quic_data_transport->HasDataChannels());
182 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
183 EXPECT_FALSE(quic_data_transport->HasDataChannel(data_channel_id));
184 webrtc::DataChannelInit config;
185 config.id = data_channel_id;
186 rtc::scoped_refptr<DataChannelInterface> data_channel =
187 peer2_.CreateDataChannel(&config);
188 EXPECT_NE(nullptr, data_channel);
189 EXPECT_EQ(data_channel_id, data_channel->id());
190 EXPECT_TRUE(quic_data_transport->HasDataChannel(data_channel_id));
191 }
192 EXPECT_TRUE(quic_data_transport->HasDataChannels());
193 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
194 quic_data_transport->DestroyDataChannel(data_channel_id);
195 EXPECT_FALSE(quic_data_transport->HasDataChannel(data_channel_id));
196 }
197 EXPECT_FALSE(quic_data_transport->HasDataChannels());
198}
199
200// Tests that the QuicDataTransport does not allow creating multiple
201// QuicDataChannels with the same id.
202TEST_F(QuicDataTransportTest, CannotCreateDataChannelsWithSameId) {
203 webrtc::DataChannelInit config;
204 config.id = 2;
205 EXPECT_NE(nullptr, peer2_.CreateDataChannel(&config));
206 EXPECT_EQ(nullptr, peer2_.CreateDataChannel(&config));
207}
208
209// Tests that any data channels created by the QuicDataTransport are in state
210// kConnecting before the QuicTransportChannel is set, then transiton to state
211// kOpen when the transport channel becomes writable.
212TEST_F(QuicDataTransportTest, DataChannelsOpenWhenTransportChannelWritable) {
213 webrtc::DataChannelInit config1;
214 config1.id = 7;
215 rtc::scoped_refptr<DataChannelInterface> data_channel1 =
216 peer2_.CreateDataChannel(&config1);
217 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel1->state());
218 SetTransportChannels();
219 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel1->state());
220 webrtc::DataChannelInit config2;
221 config2.id = 14;
222 rtc::scoped_refptr<DataChannelInterface> data_channel2 =
223 peer2_.CreateDataChannel(&config2);
224 EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel2->state());
225 // Existing data channels should open once the transport channel is writable.
226 ConnectTransportChannels();
227 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel1->state(),
228 kTimeoutMs);
229 EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel2->state(),
230 kTimeoutMs);
231 // Any data channels created afterwards should start in state kOpen.
232 webrtc::DataChannelInit config3;
233 config3.id = 21;
234 rtc::scoped_refptr<DataChannelInterface> data_channel3 =
235 peer2_.CreateDataChannel(&config3);
236 EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel3->state());
237}
238
239// Tests that the QuicTransport dispatches messages for one QuicDataChannel.
240TEST_F(QuicDataTransportTest, ReceiveMessagesForSingleDataChannel) {
241 ConnectTransportChannels();
242 SetTransportChannels();
243
244 int data_channel_id = 1337;
245 webrtc::DataChannelInit config;
246 config.id = data_channel_id;
247 rtc::scoped_refptr<DataChannelInterface> peer2_data_channel =
248 peer2_.CreateDataChannel(&config);
249 FakeObserver observer;
250 peer2_data_channel->RegisterObserver(&observer);
251
252 uint64_t message1_id = 26u;
253 peer1_.WriteMessage(data_channel_id, message1_id, "Testing");
254 ASSERT_EQ_WAIT(1, observer.messages_received(), kTimeoutMs);
255 EXPECT_EQ("Testing", observer.messages()[0]);
256
257 uint64_t message2_id = 402u;
258 peer1_.WriteMessage(data_channel_id, message2_id, "Hello, World!");
259 ASSERT_EQ_WAIT(2, observer.messages_received(), kTimeoutMs);
260 EXPECT_EQ("Hello, World!", observer.messages()[1]);
261
262 uint64_t message3_id = 100260415u;
263 peer1_.WriteMessage(data_channel_id, message3_id, "Third message");
264 ASSERT_EQ_WAIT(3, observer.messages_received(), kTimeoutMs);
265 EXPECT_EQ("Third message", observer.messages()[2]);
266}
267
268// Tests that the QuicTransport dispatches messages to the correct data channel
269// when multiple are in use.
270TEST_F(QuicDataTransportTest, ReceiveMessagesForMultipleDataChannels) {
271 ConnectTransportChannels();
272 SetTransportChannels();
273
274 std::vector<rtc::scoped_refptr<DataChannelInterface>> data_channels;
275 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
276 webrtc::DataChannelInit config;
277 config.id = data_channel_id;
278 data_channels.push_back(peer2_.CreateDataChannel(&config));
279 }
280
281 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
282 uint64_t message1_id = 48023u;
283 FakeObserver observer;
284 DataChannelInterface* peer2_data_channel =
285 data_channels[data_channel_id].get();
286 peer2_data_channel->RegisterObserver(&observer);
287 peer1_.WriteMessage(data_channel_id, message1_id, "Testing");
288 ASSERT_EQ_WAIT(1, observer.messages_received(), kTimeoutMs);
289 EXPECT_EQ("Testing", observer.messages()[0]);
290
291 uint64_t message2_id = 1372643095u;
292 peer1_.WriteMessage(data_channel_id, message2_id, "Hello, World!");
293 ASSERT_EQ_WAIT(2, observer.messages_received(), kTimeoutMs);
294 EXPECT_EQ("Hello, World!", observer.messages()[1]);
295 }
296}
297
298// Tests end-to-end that both peers can use multiple QuicDataChannels to
299// send/receive messages using a QuicDataTransport.
300TEST_F(QuicDataTransportTest, EndToEndSendReceiveMessages) {
301 ConnectTransportChannels();
302 SetTransportChannels();
303
304 std::vector<rtc::scoped_refptr<DataChannelInterface>> peer1_data_channels;
305 std::vector<rtc::scoped_refptr<DataChannelInterface>> peer2_data_channels;
306
307 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
308 webrtc::DataChannelInit config;
309 config.id = data_channel_id;
310 peer1_data_channels.push_back(peer1_.CreateDataChannel(&config));
311 peer2_data_channels.push_back(peer2_.CreateDataChannel(&config));
312 }
313
314 for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
315 DataChannelInterface* peer1_data_channel =
316 peer1_data_channels[data_channel_id].get();
317 FakeObserver observer1;
318 peer1_data_channel->RegisterObserver(&observer1);
319 DataChannelInterface* peer2_data_channel =
320 peer2_data_channels[data_channel_id].get();
321 FakeObserver observer2;
322 peer2_data_channel->RegisterObserver(&observer2);
323
324 peer1_data_channel->Send(webrtc::DataBuffer("Peer 1 message 1"));
325 ASSERT_EQ_WAIT(1, observer2.messages_received(), kTimeoutMs);
326 EXPECT_EQ("Peer 1 message 1", observer2.messages()[0]);
327
328 peer1_data_channel->Send(webrtc::DataBuffer("Peer 1 message 2"));
329 ASSERT_EQ_WAIT(2, observer2.messages_received(), kTimeoutMs);
330 EXPECT_EQ("Peer 1 message 2", observer2.messages()[1]);
331
332 peer2_data_channel->Send(webrtc::DataBuffer("Peer 2 message 1"));
333 ASSERT_EQ_WAIT(1, observer1.messages_received(), kTimeoutMs);
334 EXPECT_EQ("Peer 2 message 1", observer1.messages()[0]);
335
336 peer2_data_channel->Send(webrtc::DataBuffer("Peer 2 message 2"));
337 ASSERT_EQ_WAIT(2, observer1.messages_received(), kTimeoutMs);
338 EXPECT_EQ("Peer 2 message 2", observer1.messages()[1]);
339 }
340}
341
342// Tests that SetTransportChannel returns false when setting a NULL transport
343// channel or a transport channel that is not equivalent to the one already set.
344TEST_F(QuicDataTransportTest, SetTransportChannelReturnValue) {
345 QuicDataTransport* quic_data_transport = peer1_.quic_data_transport();
346 EXPECT_FALSE(quic_data_transport->SetTransportChannel(nullptr));
347 QuicTransportChannel* transport_channel = peer1_.quic_transport_channel();
348 EXPECT_TRUE(quic_data_transport->SetTransportChannel(transport_channel));
349 EXPECT_TRUE(quic_data_transport->SetTransportChannel(transport_channel));
350 QuicTransportChannel* other_transport_channel =
351 peer2_.quic_transport_channel();
352 EXPECT_FALSE(
353 quic_data_transport->SetTransportChannel(other_transport_channel));
354}
355
356} // namespace