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

Side by Side Diff: webrtc/media/sctp/sctpdataengine_unittest.cc

Issue 1823503002: Reland Use CopyOnWriteBuffer instead of Buffer to avoid unnecessary copies. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 9 months 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <errno.h> 11 #include <errno.h>
12 #include <stdarg.h> 12 #include <stdarg.h>
13 #include <stdio.h> 13 #include <stdio.h>
14 14
15 #include <memory> 15 #include <memory>
16 #include <string> 16 #include <string>
17 #include <vector> 17 #include <vector>
18 18
19 #include "webrtc/base/bind.h" 19 #include "webrtc/base/bind.h"
20 #include "webrtc/base/buffer.h" 20 #include "webrtc/base/copyonwritebuffer.h"
21 #include "webrtc/base/criticalsection.h" 21 #include "webrtc/base/criticalsection.h"
22 #include "webrtc/base/gunit.h" 22 #include "webrtc/base/gunit.h"
23 #include "webrtc/base/helpers.h" 23 #include "webrtc/base/helpers.h"
24 #include "webrtc/base/messagehandler.h" 24 #include "webrtc/base/messagehandler.h"
25 #include "webrtc/base/messagequeue.h" 25 #include "webrtc/base/messagequeue.h"
26 #include "webrtc/base/ssladapter.h" 26 #include "webrtc/base/ssladapter.h"
27 #include "webrtc/base/thread.h" 27 #include "webrtc/base/thread.h"
28 #include "webrtc/media/base/mediachannel.h" 28 #include "webrtc/media/base/mediachannel.h"
29 #include "webrtc/media/base/mediaconstants.h" 29 #include "webrtc/media/base/mediaconstants.h"
30 #include "webrtc/media/sctp/sctpdataengine.h" 30 #include "webrtc/media/sctp/sctpdataengine.h"
31 31
32 enum { 32 enum {
33 MSG_PACKET = 1, 33 MSG_PACKET = 1,
34 }; 34 };
35 35
36 // Fake NetworkInterface that sends/receives sctp packets. The one in 36 // Fake NetworkInterface that sends/receives sctp packets. The one in
37 // webrtc/media/base/fakenetworkinterface.h only works with rtp/rtcp. 37 // webrtc/media/base/fakenetworkinterface.h only works with rtp/rtcp.
38 class SctpFakeNetworkInterface : public cricket::MediaChannel::NetworkInterface, 38 class SctpFakeNetworkInterface : public cricket::MediaChannel::NetworkInterface,
39 public rtc::MessageHandler { 39 public rtc::MessageHandler {
40 public: 40 public:
41 explicit SctpFakeNetworkInterface(rtc::Thread* thread) 41 explicit SctpFakeNetworkInterface(rtc::Thread* thread)
42 : thread_(thread), 42 : thread_(thread),
43 dest_(NULL) { 43 dest_(NULL) {
44 } 44 }
45 45
46 void SetDestination(cricket::DataMediaChannel* dest) { dest_ = dest; } 46 void SetDestination(cricket::DataMediaChannel* dest) { dest_ = dest; }
47 47
48 protected: 48 protected:
49 // Called to send raw packet down the wire (e.g. SCTP an packet). 49 // Called to send raw packet down the wire (e.g. SCTP an packet).
50 virtual bool SendPacket(rtc::Buffer* packet, 50 virtual bool SendPacket(rtc::CopyOnWriteBuffer* packet,
51 const rtc::PacketOptions& options) { 51 const rtc::PacketOptions& options) {
52 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::SendPacket"; 52 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::SendPacket";
53 53
54 // TODO(ldixon): Can/should we use Buffer.TransferTo here? 54 rtc::CopyOnWriteBuffer* buffer = new rtc::CopyOnWriteBuffer(*packet);
55 // Note: this assignment does a deep copy of data from packet.
56 rtc::Buffer* buffer = new rtc::Buffer(packet->data(), packet->size());
57 thread_->Post(this, MSG_PACKET, rtc::WrapMessageData(buffer)); 55 thread_->Post(this, MSG_PACKET, rtc::WrapMessageData(buffer));
58 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::SendPacket, Posted message."; 56 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::SendPacket, Posted message.";
59 return true; 57 return true;
60 } 58 }
61 59
62 // Called when a raw packet has been recieved. This passes the data to the 60 // Called when a raw packet has been recieved. This passes the data to the
63 // code that will interpret the packet. e.g. to get the content payload from 61 // code that will interpret the packet. e.g. to get the content payload from
64 // an SCTP packet. 62 // an SCTP packet.
65 virtual void OnMessage(rtc::Message* msg) { 63 virtual void OnMessage(rtc::Message* msg) {
66 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::OnMessage"; 64 LOG(LS_VERBOSE) << "SctpFakeNetworkInterface::OnMessage";
67 std::unique_ptr<rtc::Buffer> buffer( 65 std::unique_ptr<rtc::CopyOnWriteBuffer> buffer(
68 static_cast<rtc::TypedMessageData<rtc::Buffer*>*>( 66 static_cast<rtc::TypedMessageData<rtc::CopyOnWriteBuffer*>*>(
69 msg->pdata)->data()); 67 msg->pdata)->data());
70 if (dest_) { 68 if (dest_) {
71 dest_->OnPacketReceived(buffer.get(), rtc::PacketTime()); 69 dest_->OnPacketReceived(buffer.get(), rtc::PacketTime());
72 } 70 }
73 delete msg->pdata; 71 delete msg->pdata;
74 } 72 }
75 73
76 // Unsupported functions required to exist by NetworkInterface. 74 // Unsupported functions required to exist by NetworkInterface.
77 // TODO(ldixon): Refactor parent NetworkInterface class so these are not 75 // TODO(ldixon): Refactor parent NetworkInterface class so these are not
78 // required. They are RTC specific and should be in an appropriate subclass. 76 // required. They are RTC specific and should be in an appropriate subclass.
79 virtual bool SendRtcp(rtc::Buffer* packet, 77 virtual bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
80 const rtc::PacketOptions& options) { 78 const rtc::PacketOptions& options) {
81 LOG(LS_WARNING) << "Unsupported: SctpFakeNetworkInterface::SendRtcp."; 79 LOG(LS_WARNING) << "Unsupported: SctpFakeNetworkInterface::SendRtcp.";
82 return false; 80 return false;
83 } 81 }
84 virtual int SetOption(SocketType type, rtc::Socket::Option opt, 82 virtual int SetOption(SocketType type, rtc::Socket::Option opt,
85 int option) { 83 int option) {
86 LOG(LS_WARNING) << "Unsupported: SctpFakeNetworkInterface::SetOption."; 84 LOG(LS_WARNING) << "Unsupported: SctpFakeNetworkInterface::SetOption.";
87 return 0; 85 return 0;
88 } 86 }
89 virtual void SetDefaultDSCPCode(rtc::DiffServCodePoint dscp) { 87 virtual void SetDefaultDSCPCode(rtc::DiffServCodePoint dscp) {
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 return channel; 274 return channel;
277 } 275 }
278 276
279 bool SendData(cricket::SctpDataMediaChannel* chan, 277 bool SendData(cricket::SctpDataMediaChannel* chan,
280 uint32_t ssrc, 278 uint32_t ssrc,
281 const std::string& msg, 279 const std::string& msg,
282 cricket::SendDataResult* result) { 280 cricket::SendDataResult* result) {
283 cricket::SendDataParams params; 281 cricket::SendDataParams params;
284 params.ssrc = ssrc; 282 params.ssrc = ssrc;
285 283
286 return chan->SendData(params, rtc::Buffer( 284 return chan->SendData(params, rtc::CopyOnWriteBuffer(
287 &msg[0], msg.length()), result); 285 &msg[0], msg.length()), result);
288 } 286 }
289 287
290 bool ReceivedData(const SctpFakeDataReceiver* recv, 288 bool ReceivedData(const SctpFakeDataReceiver* recv,
291 uint32_t ssrc, 289 uint32_t ssrc,
292 const std::string& msg) { 290 const std::string& msg) {
293 return (recv->received() && 291 return (recv->received() &&
294 recv->last_params().ssrc == ssrc && 292 recv->last_params().ssrc == ssrc &&
295 recv->last_data() == msg); 293 recv->last_data() == msg);
296 } 294 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 SetupConnectedChannels(); 393 SetupConnectedChannels();
396 394
397 cricket::SendDataResult result; 395 cricket::SendDataResult result;
398 cricket::SendDataParams params; 396 cricket::SendDataParams params;
399 params.ssrc = 1; 397 params.ssrc = 1;
400 398
401 std::vector<char> buffer(1024 * 64, 0); 399 std::vector<char> buffer(1024 * 64, 0);
402 400
403 for (size_t i = 0; i < 100; ++i) { 401 for (size_t i = 0; i < 100; ++i) {
404 channel1()->SendData( 402 channel1()->SendData(
405 params, rtc::Buffer(&buffer[0], buffer.size()), &result); 403 params, rtc::CopyOnWriteBuffer(&buffer[0], buffer.size()), &result);
406 if (result == cricket::SDR_BLOCK) 404 if (result == cricket::SDR_BLOCK)
407 break; 405 break;
408 } 406 }
409 407
410 EXPECT_EQ(cricket::SDR_BLOCK, result); 408 EXPECT_EQ(cricket::SDR_BLOCK, result);
411 } 409 }
412 410
413 TEST_F(SctpDataMediaChannelTest, ClosesRemoteStream) { 411 TEST_F(SctpDataMediaChannelTest, ClosesRemoteStream) {
414 SetupConnectedChannels(); 412 SetupConnectedChannels();
415 SignalChannelClosedObserver chan_1_sig_receiver, chan_2_sig_receiver; 413 SignalChannelClosedObserver chan_1_sig_receiver, chan_2_sig_receiver;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 // Channel 1 is gone now. 516 // Channel 1 is gone now.
519 517
520 // Create a new channel 1. 518 // Create a new channel 1.
521 AddStream(1); 519 AddStream(1);
522 ASSERT_TRUE(SendData(channel1(), 1, "hi?", &result)); 520 ASSERT_TRUE(SendData(channel1(), 1, "hi?", &result));
523 EXPECT_EQ(cricket::SDR_SUCCESS, result); 521 EXPECT_EQ(cricket::SDR_SUCCESS, result);
524 EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hi?"), 1000); 522 EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hi?"), 1000);
525 channel1()->RemoveSendStream(1); 523 channel1()->RemoveSendStream(1);
526 EXPECT_TRUE_WAIT(chan_2_sig_receiver.StreamCloseCount(1) == 2, 1000); 524 EXPECT_TRUE_WAIT(chan_2_sig_receiver.StreamCloseCount(1) == 2, 1000);
527 } 525 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698