blob: 96852ed9c08db8656234b69db090d2dfcd336fc2 [file] [log] [blame]
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +00001/*
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 */
pbos@webrtc.org24e20892013-10-28 16:32:01 +000010#include "webrtc/test/direct_transport.h"
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000011
12#include "testing/gtest/include/gtest/gtest.h"
pbos@webrtc.org24e20892013-10-28 16:32:01 +000013
14#include "webrtc/call.h"
stefan@webrtc.orge0284102013-11-18 11:45:11 +000015#include "webrtc/system_wrappers/interface/clock.h"
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000016
17namespace webrtc {
18namespace test {
19
20DirectTransport::DirectTransport()
21 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
22 packet_event_(EventWrapper::Create()),
23 thread_(ThreadWrapper::CreateThread(NetworkProcess, this)),
stefan@webrtc.orge0284102013-11-18 11:45:11 +000024 clock_(Clock::GetRealTimeClock()),
pbos@webrtc.org823a8882013-08-12 14:28:00 +000025 shutting_down_(false),
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000026 fake_network_(FakeNetworkPipe::Config()) {
stefan@webrtc.orge0284102013-11-18 11:45:11 +000027 unsigned int thread_id;
28 EXPECT_TRUE(thread_->Start(thread_id));
29}
30
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000031DirectTransport::DirectTransport(
32 const FakeNetworkPipe::Config& config)
stefan@webrtc.orge0284102013-11-18 11:45:11 +000033 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
34 packet_event_(EventWrapper::Create()),
35 thread_(ThreadWrapper::CreateThread(NetworkProcess, this)),
36 clock_(Clock::GetRealTimeClock()),
37 shutting_down_(false),
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000038 fake_network_(config) {
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000039 unsigned int thread_id;
40 EXPECT_TRUE(thread_->Start(thread_id));
41}
42
43DirectTransport::~DirectTransport() { StopSending(); }
44
pbos@webrtc.org823a8882013-08-12 14:28:00 +000045void DirectTransport::StopSending() {
46 {
47 CriticalSectionScoped crit_(lock_.get());
48 shutting_down_ = true;
49 }
50
51 packet_event_->Set();
52 EXPECT_TRUE(thread_->Stop());
53}
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000054
pbos@webrtc.orgc1797062013-08-23 09:19:30 +000055void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000056 fake_network_.SetReceiver(receiver);
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000057}
58
pbos@webrtc.org3009c812013-11-20 12:17:04 +000059bool DirectTransport::SendRtp(const uint8_t* data, size_t length) {
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000060 fake_network_.SendPacket(data, length);
61 packet_event_->Set();
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000062 return true;
63}
64
pbos@webrtc.org3009c812013-11-20 12:17:04 +000065bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000066 fake_network_.SendPacket(data, length);
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000067 packet_event_->Set();
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000068 return true;
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000069}
70
71bool DirectTransport::NetworkProcess(void* transport) {
72 return static_cast<DirectTransport*>(transport)->SendPackets();
73}
74
75bool DirectTransport::SendPackets() {
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000076 fake_network_.Process();
77 int wait_time_ms = fake_network_.TimeUntilNextProcess();
78 if (wait_time_ms > 0) {
79 switch (packet_event_->Wait(wait_time_ms)) {
80 case kEventSignaled:
81 packet_event_->Reset();
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000082 break;
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000083 case kEventTimeout:
stefan@webrtc.orge0284102013-11-18 11:45:11 +000084 break;
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000085 case kEventError:
86 // TODO(pbos): Log a warning here?
87 return true;
stefan@webrtc.orge0284102013-11-18 11:45:11 +000088 }
89 }
pbos@webrtc.org823a8882013-08-12 14:28:00 +000090 CriticalSectionScoped crit(lock_.get());
91 return shutting_down_ ? false : true;
pbos@webrtc.orgfe881f62013-08-12 12:59:04 +000092}
93} // namespace test
94} // namespace webrtc