blob: 4e7b9d01ec363acea59c861f3268b6a0208437ab [file] [log] [blame]
pbos@webrtc.org96684672013-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.org16e03b72013-10-28 16:32:01 +000010#include "webrtc/test/direct_transport.h"
pbos@webrtc.org96684672013-08-12 12:59:04 +000011
12#include "testing/gtest/include/gtest/gtest.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000013
14#include "webrtc/call.h"
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000015#include "webrtc/system_wrappers/interface/clock.h"
pbos@webrtc.org96684672013-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.orgb082ade2013-11-18 11:45:11 +000024 clock_(Clock::GetRealTimeClock()),
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000025 shutting_down_(false),
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000026 fake_network_(FakeNetworkPipe::Config()) {
pbos@webrtc.org86639732015-03-13 00:06:21 +000027 EXPECT_TRUE(thread_->Start());
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000028}
29
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000030DirectTransport::DirectTransport(
31 const FakeNetworkPipe::Config& config)
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000032 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
33 packet_event_(EventWrapper::Create()),
34 thread_(ThreadWrapper::CreateThread(NetworkProcess, this)),
35 clock_(Clock::GetRealTimeClock()),
36 shutting_down_(false),
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000037 fake_network_(config) {
pbos@webrtc.org86639732015-03-13 00:06:21 +000038 EXPECT_TRUE(thread_->Start());
pbos@webrtc.org96684672013-08-12 12:59:04 +000039}
40
41DirectTransport::~DirectTransport() { StopSending(); }
42
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000043void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
44 fake_network_.SetConfig(config);
45}
46
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000047void DirectTransport::StopSending() {
48 {
49 CriticalSectionScoped crit_(lock_.get());
50 shutting_down_ = true;
51 }
52
53 packet_event_->Set();
54 EXPECT_TRUE(thread_->Stop());
55}
pbos@webrtc.org96684672013-08-12 12:59:04 +000056
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000057void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000058 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000059}
60
pbos@webrtc.org27326b62013-11-20 12:17:04 +000061bool DirectTransport::SendRtp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000062 fake_network_.SendPacket(data, length);
63 packet_event_->Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000064 return true;
65}
66
pbos@webrtc.org27326b62013-11-20 12:17:04 +000067bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000068 fake_network_.SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:04 +000069 packet_event_->Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000070 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000071}
72
73bool DirectTransport::NetworkProcess(void* transport) {
74 return static_cast<DirectTransport*>(transport)->SendPackets();
75}
76
77bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000078 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000079 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000080 if (wait_time_ms > 0) {
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000081 switch (packet_event_->Wait(static_cast<unsigned long>(wait_time_ms))) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000082 case kEventSignaled:
pbos@webrtc.org96684672013-08-12 12:59:04 +000083 break;
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000084 case kEventTimeout:
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000085 break;
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000086 case kEventError:
87 // TODO(pbos): Log a warning here?
88 return true;
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000089 }
90 }
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000091 CriticalSectionScoped crit(lock_.get());
92 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000093}
94} // namespace test
95} // namespace webrtc