1fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org/* 2fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * 4fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * Use of this source code is governed by a BSD-style license 5fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * that can be found in the LICENSE file in the root of the source 6fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * tree. An additional intellectual property rights grant can be found 7fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * in the file PATENTS. All contributing project authors may 8fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org */ 1024e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org#include "webrtc/test/direct_transport.h" 11fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 12fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 1324e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org 1424e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org#include "webrtc/call.h" 15e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 16fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 17fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgnamespace webrtc { 18fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgnamespace test { 19fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 20fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgDirectTransport::DirectTransport() 21fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org : lock_(CriticalSectionWrapper::CreateCriticalSection()), 22fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org packet_event_(EventWrapper::Create()), 23fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org thread_(ThreadWrapper::CreateThread(NetworkProcess, this)), 24e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org clock_(Clock::GetRealTimeClock()), 25823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org shutting_down_(false), 26aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_(FakeNetworkPipe::Config()) { 27e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org unsigned int thread_id; 28e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org EXPECT_TRUE(thread_->Start(thread_id)); 29e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org} 30e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org 31aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.orgDirectTransport::DirectTransport( 32aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org const FakeNetworkPipe::Config& config) 33e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org : lock_(CriticalSectionWrapper::CreateCriticalSection()), 34e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org packet_event_(EventWrapper::Create()), 35e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org thread_(ThreadWrapper::CreateThread(NetworkProcess, this)), 36e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org clock_(Clock::GetRealTimeClock()), 37e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org shutting_down_(false), 38aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_(config) { 39fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org unsigned int thread_id; 40fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org EXPECT_TRUE(thread_->Start(thread_id)); 41fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 42fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 43fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgDirectTransport::~DirectTransport() { StopSending(); } 44fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 459900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.orgvoid DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) { 469900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org fake_network_.SetConfig(config); 479900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org} 489900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org 49823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.orgvoid DirectTransport::StopSending() { 50823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org { 51823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org CriticalSectionScoped crit_(lock_.get()); 52823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org shutting_down_ = true; 53823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org } 54823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org 55823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org packet_event_->Set(); 56823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org EXPECT_TRUE(thread_->Stop()); 57823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org} 58fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 59c1797061756f40b9b1f3f3e82fc040ce18ecd43cpbos@webrtc.orgvoid DirectTransport::SetReceiver(PacketReceiver* receiver) { 60aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_.SetReceiver(receiver); 61fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 62fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 633009c81bf29a814dfd68ec1faad81e70e3399636pbos@webrtc.orgbool DirectTransport::SendRtp(const uint8_t* data, size_t length) { 64aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_.SendPacket(data, length); 65aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org packet_event_->Set(); 66fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org return true; 67fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 68fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 693009c81bf29a814dfd68ec1faad81e70e3399636pbos@webrtc.orgbool DirectTransport::SendRtcp(const uint8_t* data, size_t length) { 70aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_.SendPacket(data, length); 71fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org packet_event_->Set(); 72aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org return true; 73fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 74fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 75fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgbool DirectTransport::NetworkProcess(void* transport) { 76fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org return static_cast<DirectTransport*>(transport)->SendPackets(); 77fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 78fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org 79fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.orgbool DirectTransport::SendPackets() { 80aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org fake_network_.Process(); 81aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org int wait_time_ms = fake_network_.TimeUntilNextProcess(); 82aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org if (wait_time_ms > 0) { 83aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org switch (packet_event_->Wait(wait_time_ms)) { 84aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org case kEventSignaled: 85aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org packet_event_->Reset(); 86fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org break; 87aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org case kEventTimeout: 88e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org break; 89aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org case kEventError: 90aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org // TODO(pbos): Log a warning here? 91aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org return true; 92e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org } 93e028410838cd976c75e379b3c2e2eb0ac52b3c99stefan@webrtc.org } 94823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org CriticalSectionScoped crit(lock_.get()); 95823a888e7f4538d20974a537cc565513f3886658pbos@webrtc.org return shutting_down_ ? false : true; 96fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} 97fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} // namespace test 98fe881f62ea79a98b997af7d6fb0346dcb68acccepbos@webrtc.org} // namespace webrtc 99