blob: ac56ec382847c85f5cbba0f19a0bbff80a6a9816 [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
stefanf116bd02015-10-27 08:29:42 -070020DirectTransport::DirectTransport(Call* send_call)
21 : send_call_(send_call),
22 packet_event_(EventWrapper::Create()),
Peter Boströmf2f82832015-05-01 13:00:41 +020023 thread_(
24 ThreadWrapper::CreateThread(NetworkProcess, this, "NetworkProcess")),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000025 clock_(Clock::GetRealTimeClock()),
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000026 shutting_down_(false),
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000027 fake_network_(FakeNetworkPipe::Config()) {
pbos@webrtc.org86639732015-03-13 00:06:21 +000028 EXPECT_TRUE(thread_->Start());
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000029}
30
stefanf116bd02015-10-27 08:29:42 -070031DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config,
32 Call* send_call)
33 : send_call_(send_call),
34 packet_event_(EventWrapper::Create()),
Peter Boströmf2f82832015-05-01 13:00:41 +020035 thread_(
36 ThreadWrapper::CreateThread(NetworkProcess, this, "NetworkProcess")),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000037 clock_(Clock::GetRealTimeClock()),
38 shutting_down_(false),
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000039 fake_network_(config) {
pbos@webrtc.org86639732015-03-13 00:06:21 +000040 EXPECT_TRUE(thread_->Start());
pbos@webrtc.org96684672013-08-12 12:59:04 +000041}
42
43DirectTransport::~DirectTransport() { StopSending(); }
44
henrik.lundin@webrtc.orgc0e9aeb2014-02-26 13:34:52 +000045void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
46 fake_network_.SetConfig(config);
47}
48
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000049void DirectTransport::StopSending() {
50 {
Peter Boströmf2f82832015-05-01 13:00:41 +020051 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +000052 shutting_down_ = true;
53 }
54
55 packet_event_->Set();
56 EXPECT_TRUE(thread_->Stop());
57}
pbos@webrtc.org96684672013-08-12 12:59:04 +000058
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000059void DirectTransport::SetReceiver(PacketReceiver* receiver) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000060 fake_network_.SetReceiver(receiver);
pbos@webrtc.org96684672013-08-12 12:59:04 +000061}
62
stefan1d8a5062015-10-02 03:39:33 -070063bool DirectTransport::SendRtp(const uint8_t* data,
64 size_t length,
65 const PacketOptions& options) {
stefanf116bd02015-10-27 08:29:42 -070066 if (send_call_) {
67 rtc::SentPacket sent_packet(options.packet_id,
68 clock_->TimeInMilliseconds());
69 send_call_->OnSentPacket(sent_packet);
70 }
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000071 fake_network_.SendPacket(data, length);
72 packet_event_->Set();
pbos@webrtc.org96684672013-08-12 12:59:04 +000073 return true;
74}
75
pbos@webrtc.org27326b62013-11-20 12:17:04 +000076bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000077 fake_network_.SendPacket(data, length);
pbos@webrtc.org96684672013-08-12 12:59:04 +000078 packet_event_->Set();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000079 return true;
pbos@webrtc.org96684672013-08-12 12:59:04 +000080}
81
82bool DirectTransport::NetworkProcess(void* transport) {
83 return static_cast<DirectTransport*>(transport)->SendPackets();
84}
85
86bool DirectTransport::SendPackets() {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000087 fake_network_.Process();
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000088 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess();
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000089 if (wait_time_ms > 0) {
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000090 switch (packet_event_->Wait(static_cast<unsigned long>(wait_time_ms))) {
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000091 case kEventSignaled:
pbos@webrtc.org96684672013-08-12 12:59:04 +000092 break;
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000093 case kEventTimeout:
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000094 break;
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000095 case kEventError:
96 // TODO(pbos): Log a warning here?
97 return true;
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000098 }
99 }
Peter Boströmf2f82832015-05-01 13:00:41 +0200100 rtc::CritScope crit(&lock_);
pbos@webrtc.org468e19a2013-08-12 14:28:00 +0000101 return shutting_down_ ? false : true;
pbos@webrtc.org96684672013-08-12 12:59:04 +0000102}
103} // namespace test
104} // namespace webrtc