blob: 2a9b25e2774675b5e5bc5824026d917ca87fd854 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012#include <string>
13
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000014#include "webrtc/base/buffer.h"
15#include "webrtc/base/gunit.h"
16#include "webrtc/base/helpers.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000017#include "webrtc/base/ssladapter.h"
18#include "webrtc/base/timing.h"
kjellandera96e2d72016-02-04 23:52:28 -080019#include "webrtc/media/base/fakenetworkinterface.h"
kjellanderf4752772016-03-02 05:42:30 -080020#include "webrtc/media/base/mediaconstants.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/rtpdataengine.h"
22#include "webrtc/media/base/rtputils.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000024class FakeTiming : public rtc::Timing {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025 public:
26 FakeTiming() : now_(0.0) {}
27
28 virtual double TimerNow() {
29 return now_;
30 }
31
32 void set_now(double now) {
33 now_ = now;
34 }
35
36 private:
37 double now_;
38};
39
40class FakeDataReceiver : public sigslot::has_slots<> {
41 public:
42 FakeDataReceiver() : has_received_data_(false) {}
43
44 void OnDataReceived(
45 const cricket::ReceiveDataParams& params,
46 const char* data, size_t len) {
47 has_received_data_ = true;
48 last_received_data_ = std::string(data, len);
49 last_received_data_len_ = len;
50 last_received_data_params_ = params;
51 }
52
53 bool has_received_data() const { return has_received_data_; }
54 std::string last_received_data() const { return last_received_data_; }
55 size_t last_received_data_len() const { return last_received_data_len_; }
56 cricket::ReceiveDataParams last_received_data_params() const {
57 return last_received_data_params_;
58 }
59
60 private:
61 bool has_received_data_;
62 std::string last_received_data_;
63 size_t last_received_data_len_;
64 cricket::ReceiveDataParams last_received_data_params_;
65};
66
67class RtpDataMediaChannelTest : public testing::Test {
68 protected:
69 virtual void SetUp() {
70 // Seed needed for each test to satisfy expectations.
71 iface_.reset(new cricket::FakeNetworkInterface());
72 timing_ = new FakeTiming();
73 dme_.reset(CreateEngine(timing_));
74 receiver_.reset(new FakeDataReceiver());
75 }
76
77 void SetNow(double now) {
78 timing_->set_now(now);
79 }
80
81 cricket::RtpDataEngine* CreateEngine(FakeTiming* timing) {
82 cricket::RtpDataEngine* dme = new cricket::RtpDataEngine();
83 dme->SetTiming(timing);
84 return dme;
85 }
86
87 cricket::RtpDataMediaChannel* CreateChannel() {
88 return CreateChannel(dme_.get());
89 }
90
91 cricket::RtpDataMediaChannel* CreateChannel(cricket::RtpDataEngine* dme) {
92 cricket::RtpDataMediaChannel* channel =
93 static_cast<cricket::RtpDataMediaChannel*>(dme->CreateChannel(
94 cricket::DCT_RTP));
95 channel->SetInterface(iface_.get());
96 channel->SignalDataReceived.connect(
97 receiver_.get(), &FakeDataReceiver::OnDataReceived);
98 return channel;
99 }
100
101 FakeDataReceiver* receiver() {
102 return receiver_.get();
103 }
104
105 bool HasReceivedData() {
106 return receiver_->has_received_data();
107 }
108
109 std::string GetReceivedData() {
110 return receiver_->last_received_data();
111 }
112
113 size_t GetReceivedDataLen() {
114 return receiver_->last_received_data_len();
115 }
116
117 cricket::ReceiveDataParams GetReceivedDataParams() {
118 return receiver_->last_received_data_params();
119 }
120
121 bool HasSentData(int count) {
122 return (iface_->NumRtpPackets() > count);
123 }
124
125 std::string GetSentData(int index) {
126 // Assume RTP header of length 12
kwiberg686a8ef2016-02-26 03:00:35 -0800127 std::unique_ptr<const rtc::Buffer> packet(
henrike@webrtc.org9de257d2013-07-17 14:42:53 +0000128 iface_->GetRtpPacket(index));
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000129 if (packet->size() > 12) {
Karl Wiberg94784372015-04-20 14:03:07 +0200130 return std::string(packet->data<char>() + 12, packet->size() - 12);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 } else {
132 return "";
133 }
134 }
135
136 cricket::RtpHeader GetSentDataHeader(int index) {
kwiberg686a8ef2016-02-26 03:00:35 -0800137 std::unique_ptr<const rtc::Buffer> packet(
henrike@webrtc.org9de257d2013-07-17 14:42:53 +0000138 iface_->GetRtpPacket(index));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 cricket::RtpHeader header;
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +0000140 GetRtpHeader(packet->data(), packet->size(), &header);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 return header;
142 }
143
144 private:
kwiberg686a8ef2016-02-26 03:00:35 -0800145 std::unique_ptr<cricket::RtpDataEngine> dme_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 // Timing passed into dme_. Owned by dme_;
147 FakeTiming* timing_;
kwiberg686a8ef2016-02-26 03:00:35 -0800148 std::unique_ptr<cricket::FakeNetworkInterface> iface_;
149 std::unique_ptr<FakeDataReceiver> receiver_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150};
151
152TEST_F(RtpDataMediaChannelTest, SetUnknownCodecs) {
kwiberg686a8ef2016-02-26 03:00:35 -0800153 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154
155 cricket::DataCodec known_codec;
156 known_codec.id = 103;
157 known_codec.name = "google-data";
158 cricket::DataCodec unknown_codec;
159 unknown_codec.id = 104;
160 unknown_codec.name = "unknown-data";
161
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200162 cricket::DataSendParameters send_parameters_known;
163 send_parameters_known.codecs.push_back(known_codec);
164 cricket::DataRecvParameters recv_parameters_known;
165 recv_parameters_known.codecs.push_back(known_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200167 cricket::DataSendParameters send_parameters_unknown;
168 send_parameters_unknown.codecs.push_back(unknown_codec);
169 cricket::DataRecvParameters recv_parameters_unknown;
170 recv_parameters_unknown.codecs.push_back(unknown_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200172 cricket::DataSendParameters send_parameters_mixed;
173 send_parameters_mixed.codecs.push_back(known_codec);
174 send_parameters_mixed.codecs.push_back(unknown_codec);
175 cricket::DataRecvParameters recv_parameters_mixed;
176 recv_parameters_mixed.codecs.push_back(known_codec);
177 recv_parameters_mixed.codecs.push_back(unknown_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200179 EXPECT_TRUE(dmc->SetSendParameters(send_parameters_known));
180 EXPECT_FALSE(dmc->SetSendParameters(send_parameters_unknown));
181 EXPECT_TRUE(dmc->SetSendParameters(send_parameters_mixed));
182 EXPECT_TRUE(dmc->SetRecvParameters(recv_parameters_known));
183 EXPECT_FALSE(dmc->SetRecvParameters(recv_parameters_unknown));
184 EXPECT_FALSE(dmc->SetRecvParameters(recv_parameters_mixed));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185}
186
187TEST_F(RtpDataMediaChannelTest, AddRemoveSendStream) {
kwiberg686a8ef2016-02-26 03:00:35 -0800188 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189
190 cricket::StreamParams stream1;
191 stream1.add_ssrc(41);
192 EXPECT_TRUE(dmc->AddSendStream(stream1));
193 cricket::StreamParams stream2;
194 stream2.add_ssrc(42);
195 EXPECT_TRUE(dmc->AddSendStream(stream2));
196
197 EXPECT_TRUE(dmc->RemoveSendStream(41));
198 EXPECT_TRUE(dmc->RemoveSendStream(42));
199 EXPECT_FALSE(dmc->RemoveSendStream(43));
200}
201
202TEST_F(RtpDataMediaChannelTest, AddRemoveRecvStream) {
kwiberg686a8ef2016-02-26 03:00:35 -0800203 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204
205 cricket::StreamParams stream1;
206 stream1.add_ssrc(41);
207 EXPECT_TRUE(dmc->AddRecvStream(stream1));
208 cricket::StreamParams stream2;
209 stream2.add_ssrc(42);
210 EXPECT_TRUE(dmc->AddRecvStream(stream2));
211 EXPECT_FALSE(dmc->AddRecvStream(stream2));
212
213 EXPECT_TRUE(dmc->RemoveRecvStream(41));
214 EXPECT_TRUE(dmc->RemoveRecvStream(42));
215}
216
217TEST_F(RtpDataMediaChannelTest, SendData) {
kwiberg686a8ef2016-02-26 03:00:35 -0800218 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000219
220 cricket::SendDataParams params;
221 params.ssrc = 42;
222 unsigned char data[] = "food";
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000223 rtc::Buffer payload(data, 4);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000224 unsigned char padded_data[] = {
225 0x00, 0x00, 0x00, 0x00,
226 'f', 'o', 'o', 'd',
227 };
228 cricket::SendDataResult result;
229
230 // Not sending
231 EXPECT_FALSE(dmc->SendData(params, payload, &result));
232 EXPECT_EQ(cricket::SDR_ERROR, result);
233 EXPECT_FALSE(HasSentData(0));
234 ASSERT_TRUE(dmc->SetSend(true));
235
236 // Unknown stream name.
237 EXPECT_FALSE(dmc->SendData(params, payload, &result));
238 EXPECT_EQ(cricket::SDR_ERROR, result);
239 EXPECT_FALSE(HasSentData(0));
240
241 cricket::StreamParams stream;
242 stream.add_ssrc(42);
243 ASSERT_TRUE(dmc->AddSendStream(stream));
244
245 // Unknown codec;
246 EXPECT_FALSE(dmc->SendData(params, payload, &result));
247 EXPECT_EQ(cricket::SDR_ERROR, result);
248 EXPECT_FALSE(HasSentData(0));
249
250 cricket::DataCodec codec;
251 codec.id = 103;
252 codec.name = cricket::kGoogleRtpDataCodecName;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200253 cricket::DataSendParameters parameters;
254 parameters.codecs.push_back(codec);
255 ASSERT_TRUE(dmc->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256
257 // Length too large;
258 std::string x10000(10000, 'x');
259 EXPECT_FALSE(dmc->SendData(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000260 params, rtc::Buffer(x10000.data(), x10000.length()), &result));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261 EXPECT_EQ(cricket::SDR_ERROR, result);
262 EXPECT_FALSE(HasSentData(0));
263
264 // Finally works!
265 EXPECT_TRUE(dmc->SendData(params, payload, &result));
266 EXPECT_EQ(cricket::SDR_SUCCESS, result);
267 ASSERT_TRUE(HasSentData(0));
268 EXPECT_EQ(sizeof(padded_data), GetSentData(0).length());
269 EXPECT_EQ(0, memcmp(
270 padded_data, GetSentData(0).data(), sizeof(padded_data)));
271 cricket::RtpHeader header0 = GetSentDataHeader(0);
272 EXPECT_NE(0, header0.seq_num);
273 EXPECT_NE(0U, header0.timestamp);
274 EXPECT_EQ(header0.ssrc, 42U);
275 EXPECT_EQ(header0.payload_type, 103);
276
277 // Should bump timestamp by 180000 because the clock rate is 90khz.
278 SetNow(2);
279
280 EXPECT_TRUE(dmc->SendData(params, payload, &result));
281 ASSERT_TRUE(HasSentData(1));
282 EXPECT_EQ(sizeof(padded_data), GetSentData(1).length());
283 EXPECT_EQ(0, memcmp(
284 padded_data, GetSentData(1).data(), sizeof(padded_data)));
285 cricket::RtpHeader header1 = GetSentDataHeader(1);
286 EXPECT_EQ(header1.ssrc, 42U);
287 EXPECT_EQ(header1.payload_type, 103);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200288 EXPECT_EQ(static_cast<uint16_t>(header0.seq_num + 1),
289 static_cast<uint16_t>(header1.seq_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000290 EXPECT_EQ(header0.timestamp + 180000, header1.timestamp);
291}
292
mallinath@webrtc.org7e809c32013-09-30 18:59:08 +0000293TEST_F(RtpDataMediaChannelTest, SendDataMultipleClocks) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000294 // Timings owned by RtpDataEngines.
295 FakeTiming* timing1 = new FakeTiming();
kwiberg686a8ef2016-02-26 03:00:35 -0800296 std::unique_ptr<cricket::RtpDataEngine> dme1(CreateEngine(timing1));
297 std::unique_ptr<cricket::RtpDataMediaChannel> dmc1(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000298 CreateChannel(dme1.get()));
299 FakeTiming* timing2 = new FakeTiming();
kwiberg686a8ef2016-02-26 03:00:35 -0800300 std::unique_ptr<cricket::RtpDataEngine> dme2(CreateEngine(timing2));
301 std::unique_ptr<cricket::RtpDataMediaChannel> dmc2(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000302 CreateChannel(dme2.get()));
303
304 ASSERT_TRUE(dmc1->SetSend(true));
305 ASSERT_TRUE(dmc2->SetSend(true));
306
307 cricket::StreamParams stream1;
308 stream1.add_ssrc(41);
309 ASSERT_TRUE(dmc1->AddSendStream(stream1));
310 cricket::StreamParams stream2;
311 stream2.add_ssrc(42);
312 ASSERT_TRUE(dmc2->AddSendStream(stream2));
313
314 cricket::DataCodec codec;
315 codec.id = 103;
316 codec.name = cricket::kGoogleRtpDataCodecName;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200317 cricket::DataSendParameters parameters;
318 parameters.codecs.push_back(codec);
319 ASSERT_TRUE(dmc1->SetSendParameters(parameters));
320 ASSERT_TRUE(dmc2->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000321
322 cricket::SendDataParams params1;
323 params1.ssrc = 41;
324 cricket::SendDataParams params2;
325 params2.ssrc = 42;
326
327 unsigned char data[] = "foo";
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000328 rtc::Buffer payload(data, 3);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 cricket::SendDataResult result;
330
331 EXPECT_TRUE(dmc1->SendData(params1, payload, &result));
332 EXPECT_TRUE(dmc2->SendData(params2, payload, &result));
333
334 // Should bump timestamp by 90000 because the clock rate is 90khz.
335 timing1->set_now(1);
336 // Should bump timestamp by 180000 because the clock rate is 90khz.
337 timing2->set_now(2);
338
339 EXPECT_TRUE(dmc1->SendData(params1, payload, &result));
340 EXPECT_TRUE(dmc2->SendData(params2, payload, &result));
341
342 ASSERT_TRUE(HasSentData(3));
343 cricket::RtpHeader header1a = GetSentDataHeader(0);
344 cricket::RtpHeader header2a = GetSentDataHeader(1);
345 cricket::RtpHeader header1b = GetSentDataHeader(2);
346 cricket::RtpHeader header2b = GetSentDataHeader(3);
347
Peter Boström0c4e06b2015-10-07 12:23:21 +0200348 EXPECT_EQ(static_cast<uint16_t>(header1a.seq_num + 1),
349 static_cast<uint16_t>(header1b.seq_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 EXPECT_EQ(header1a.timestamp + 90000, header1b.timestamp);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200351 EXPECT_EQ(static_cast<uint16_t>(header2a.seq_num + 1),
352 static_cast<uint16_t>(header2b.seq_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000353 EXPECT_EQ(header2a.timestamp + 180000, header2b.timestamp);
354}
355
356TEST_F(RtpDataMediaChannelTest, SendDataRate) {
kwiberg686a8ef2016-02-26 03:00:35 -0800357 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358
359 ASSERT_TRUE(dmc->SetSend(true));
360
361 cricket::DataCodec codec;
362 codec.id = 103;
363 codec.name = cricket::kGoogleRtpDataCodecName;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200364 cricket::DataSendParameters parameters;
365 parameters.codecs.push_back(codec);
366 ASSERT_TRUE(dmc->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367
368 cricket::StreamParams stream;
369 stream.add_ssrc(42);
370 ASSERT_TRUE(dmc->AddSendStream(stream));
371
372 cricket::SendDataParams params;
373 params.ssrc = 42;
374 unsigned char data[] = "food";
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000375 rtc::Buffer payload(data, 4);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 cricket::SendDataResult result;
377
378 // With rtp overhead of 32 bytes, each one of our packets is 36
379 // bytes, or 288 bits. So, a limit of 872bps will allow 3 packets,
380 // but not four.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200381 parameters.max_bandwidth_bps = 872;
382 ASSERT_TRUE(dmc->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383
384 EXPECT_TRUE(dmc->SendData(params, payload, &result));
385 EXPECT_TRUE(dmc->SendData(params, payload, &result));
386 EXPECT_TRUE(dmc->SendData(params, payload, &result));
387 EXPECT_FALSE(dmc->SendData(params, payload, &result));
388 EXPECT_FALSE(dmc->SendData(params, payload, &result));
389
390 SetNow(0.9);
391 EXPECT_FALSE(dmc->SendData(params, payload, &result));
392
393 SetNow(1.1);
394 EXPECT_TRUE(dmc->SendData(params, payload, &result));
395 EXPECT_TRUE(dmc->SendData(params, payload, &result));
396 SetNow(1.9);
397 EXPECT_TRUE(dmc->SendData(params, payload, &result));
398
399 SetNow(2.2);
400 EXPECT_TRUE(dmc->SendData(params, payload, &result));
401 EXPECT_TRUE(dmc->SendData(params, payload, &result));
402 EXPECT_TRUE(dmc->SendData(params, payload, &result));
403 EXPECT_FALSE(dmc->SendData(params, payload, &result));
404}
405
406TEST_F(RtpDataMediaChannelTest, ReceiveData) {
407 // PT= 103, SN=2, TS=3, SSRC = 4, data = "abcde"
408 unsigned char data[] = {
409 0x80, 0x67, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2A,
410 0x00, 0x00, 0x00, 0x00,
411 'a', 'b', 'c', 'd', 'e'
412 };
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000413 rtc::Buffer packet(data, sizeof(data));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414
kwiberg686a8ef2016-02-26 03:00:35 -0800415 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416
417 // SetReceived not called.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000418 dmc->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 EXPECT_FALSE(HasReceivedData());
420
421 dmc->SetReceive(true);
422
423 // Unknown payload id
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000424 dmc->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 EXPECT_FALSE(HasReceivedData());
426
427 cricket::DataCodec codec;
428 codec.id = 103;
429 codec.name = cricket::kGoogleRtpDataCodecName;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200430 cricket::DataRecvParameters parameters;
431 parameters.codecs.push_back(codec);
432 ASSERT_TRUE(dmc->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433
434 // Unknown stream
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000435 dmc->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436 EXPECT_FALSE(HasReceivedData());
437
438 cricket::StreamParams stream;
439 stream.add_ssrc(42);
440 ASSERT_TRUE(dmc->AddRecvStream(stream));
441
442 // Finally works!
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000443 dmc->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 EXPECT_TRUE(HasReceivedData());
445 EXPECT_EQ("abcde", GetReceivedData());
446 EXPECT_EQ(5U, GetReceivedDataLen());
447}
448
449TEST_F(RtpDataMediaChannelTest, InvalidRtpPackets) {
450 unsigned char data[] = {
451 0x80, 0x65, 0x00, 0x02
452 };
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000453 rtc::Buffer packet(data, sizeof(data));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454
kwiberg686a8ef2016-02-26 03:00:35 -0800455 std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456
457 // Too short
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000458 dmc->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 EXPECT_FALSE(HasReceivedData());
460}