1 /*
2 * Copyright (c) 2013 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 #include "webrtc/test/direct_transport.h"
11
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 #include "webrtc/call.h"
15 #include "webrtc/system_wrappers/interface/clock.h"
16
17 namespace webrtc {
18 namespace test {
19
DirectTransport()20 DirectTransport::DirectTransport()
21 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
22 packet_event_(EventWrapper::Create()),
23 thread_(ThreadWrapper::CreateThread(NetworkProcess, this)),
24 clock_(Clock::GetRealTimeClock()),
25 shutting_down_(false),
26 fake_network_(FakeNetworkPipe::Config()) {
27 unsigned int thread_id;
28 EXPECT_TRUE(thread_->Start(thread_id));
29 }
30
DirectTransport(const FakeNetworkPipe::Config & config)31 DirectTransport::DirectTransport(
32 const FakeNetworkPipe::Config& config)
33 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
34 packet_event_(EventWrapper::Create()),
35 thread_(ThreadWrapper::CreateThread(NetworkProcess, this)),
36 clock_(Clock::GetRealTimeClock()),
37 shutting_down_(false),
38 fake_network_(config) {
39 unsigned int thread_id;
40 EXPECT_TRUE(thread_->Start(thread_id));
41 }
42
~DirectTransport()43 DirectTransport::~DirectTransport() { StopSending(); }
44
SetConfig(const FakeNetworkPipe::Config & config)45 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
46 fake_network_.SetConfig(config);
47 }
48
StopSending()49 void DirectTransport::StopSending() {
50 {
51 CriticalSectionScoped crit_(lock_.get());
52 shutting_down_ = true;
53 }
54
55 packet_event_->Set();
56 EXPECT_TRUE(thread_->Stop());
57 }
58
SetReceiver(PacketReceiver * receiver)59 void DirectTransport::SetReceiver(PacketReceiver* receiver) {
60 fake_network_.SetReceiver(receiver);
61 }
62
SendRtp(const uint8_t * data,size_t length)63 bool DirectTransport::SendRtp(const uint8_t* data, size_t length) {
64 fake_network_.SendPacket(data, length);
65 packet_event_->Set();
66 return true;
67 }
68
SendRtcp(const uint8_t * data,size_t length)69 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
70 fake_network_.SendPacket(data, length);
71 packet_event_->Set();
72 return true;
73 }
74
NetworkProcess(void * transport)75 bool DirectTransport::NetworkProcess(void* transport) {
76 return static_cast<DirectTransport*>(transport)->SendPackets();
77 }
78
SendPackets()79 bool DirectTransport::SendPackets() {
80 fake_network_.Process();
81 int wait_time_ms = fake_network_.TimeUntilNextProcess();
82 if (wait_time_ms > 0) {
83 switch (packet_event_->Wait(wait_time_ms)) {
84 case kEventSignaled:
85 packet_event_->Reset();
86 break;
87 case kEventTimeout:
88 break;
89 case kEventError:
90 // TODO(pbos): Log a warning here?
91 return true;
92 }
93 }
94 CriticalSectionScoped crit(lock_.get());
95 return shutting_down_ ? false : true;
96 }
97 } // namespace test
98 } // namespace webrtc
99