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