1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
12143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h"
13143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h"
14143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/system_wrappers/interface/thread_wrapper.h"
15143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/voice_engine/include/voe_network.h"
16143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org#include "webrtc/voice_engine/test/auto_test/fakes/fake_external_transport.h"
17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_defines.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFakeExternalTransport::FakeExternalTransport(webrtc::VoENetwork* ptr)
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : my_network_(ptr),
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      thread_(NULL),
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      lock_(NULL),
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      event_(NULL),
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      length_(0),
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      channel_(0),
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delay_is_enabled_(0),
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delay_time_in_ms_(0) {
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const char* thread_name = "external_thread";
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  lock_ = webrtc::CriticalSectionWrapper::CreateCriticalSection();
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  event_ = webrtc::EventWrapper::Create();
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  thread_ = webrtc::ThreadWrapper::CreateThread(
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      Run, this, webrtc::kHighPriority, thread_name);
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (thread_) {
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int id;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    thread_->Start(id);
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFakeExternalTransport::~FakeExternalTransport() {
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (thread_) {
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    thread_->SetNotAlive();
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    event_->Set();
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (thread_->Stop()) {
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete thread_;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      thread_ = NULL;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete event_;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      event_ = NULL;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete lock_;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      lock_ = NULL;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FakeExternalTransport::Run(void* ptr) {
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return static_cast<FakeExternalTransport*> (ptr)->Process();
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FakeExternalTransport::Process() {
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (event_->Wait(500)) {
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case webrtc::kEventSignaled:
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      lock_->Enter();
62fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org      my_network_->ReceivedRTPPacket(channel_, packet_buffer_, length_,
63fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org                                     webrtc::PacketTime());
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      lock_->Leave();
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return true;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case webrtc::kEventTimeout:
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return true;
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case webrtc::kEventError:
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint FakeExternalTransport::SendPacket(int channel, const void *data, int len) {
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  lock_->Enter();
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (len < 1612) {
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memcpy(packet_buffer_, (const unsigned char*) data, len);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    length_ = len;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    channel_ = channel;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  lock_->Leave();
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  event_->Set();  // Triggers ReceivedRTPPacket() from worker thread.
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return len;
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint FakeExternalTransport::SendRTCPPacket(int channel,
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          const void *data,
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          int len) {
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (delay_is_enabled_) {
90143ce524d89eb802ca5dc1676352a9e2e3e12783andrew@webrtc.org    webrtc::SleepMs(delay_time_in_ms_);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  my_network_->ReceivedRTCPPacket(channel, data, len);
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return len;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid FakeExternalTransport::SetDelayStatus(bool enable,
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           unsigned int delayInMs) {
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delay_is_enabled_ = enable;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delay_time_in_ms_ = delayInMs;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
101