1 /* 2 * Copyright (c) 2011 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 */ 10 11 #ifndef SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ 12 #define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ 13 14 #include <deque> 15 16 #include "webrtc/common_types.h" 17 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 18 #include "webrtc/system_wrappers/interface/event_wrapper.h" 19 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 20 #include "webrtc/system_wrappers/interface/thread_wrapper.h" 21 #include "webrtc/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h" 22 23 class TestErrorObserver; 24 25 class LoopBackTransport : public webrtc::Transport { 26 public: 27 LoopBackTransport(webrtc::VoENetwork* voe_network) 28 : crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), 29 packet_event_(webrtc::EventWrapper::Create()), 30 thread_(webrtc::ThreadWrapper::CreateThread(NetworkProcess, this)), 31 voe_network_(voe_network) { 32 unsigned int id; 33 thread_->Start(id); 34 } 35 36 ~LoopBackTransport() { thread_->Stop(); } 37 38 virtual int SendPacket(int channel, const void* data, int len) { 39 StorePacket(Packet::Rtp, channel, data, len); 40 return len; 41 } 42 43 virtual int SendRTCPPacket(int channel, const void* data, int len) { 44 StorePacket(Packet::Rtcp, channel, data, len); 45 return len; 46 } 47 48 private: 49 struct Packet { 50 enum Type { Rtp, Rtcp, } type; 51 52 Packet() : len(0) {} 53 Packet(Type type, int channel, const void* data, int len) 54 : type(type), channel(channel), len(len) { 55 assert(len <= 1500); 56 memcpy(this->data, data, static_cast<size_t>(len)); 57 } 58 59 int channel; 60 uint8_t data[1500]; 61 int len; 62 }; 63 64 void StorePacket(Packet::Type type, int channel, const void* data, int len) { 65 webrtc::CriticalSectionScoped lock(crit_.get()); 66 packet_queue_.push_back(Packet(type, channel, data, len)); 67 packet_event_->Set(); 68 } 69 70 static bool NetworkProcess(void* transport) { 71 return static_cast<LoopBackTransport*>(transport)->SendPackets(); 72 } 73 74 bool SendPackets() { 75 switch (packet_event_->Wait(10)) { 76 case webrtc::kEventSignaled: 77 packet_event_->Reset(); 78 break; 79 case webrtc::kEventTimeout: 80 break; 81 case webrtc::kEventError: 82 // TODO(pbos): Log a warning here? 83 return true; 84 } 85 86 while (true) { 87 Packet p; 88 { 89 webrtc::CriticalSectionScoped lock(crit_.get()); 90 if (packet_queue_.empty()) 91 break; 92 p = packet_queue_.front(); 93 packet_queue_.pop_front(); 94 } 95 96 switch (p.type) { 97 case Packet::Rtp: 98 voe_network_->ReceivedRTPPacket(p.channel, p.data, p.len, 99 webrtc::PacketTime()); 100 break; 101 case Packet::Rtcp: 102 voe_network_->ReceivedRTCPPacket(p.channel, p.data, p.len); 103 break; 104 } 105 } 106 return true; 107 } 108 109 webrtc::scoped_ptr<webrtc::CriticalSectionWrapper> crit_; 110 webrtc::scoped_ptr<webrtc::EventWrapper> packet_event_; 111 webrtc::scoped_ptr<webrtc::ThreadWrapper> thread_; 112 std::deque<Packet> packet_queue_ GUARDED_BY(crit_.get()); 113 webrtc::VoENetwork* const voe_network_; 114 }; 115 116 // This fixture initializes the voice engine in addition to the work 117 // done by the before-initialization fixture. It also registers an error 118 // observer which will fail tests on error callbacks. This fixture is 119 // useful to tests that want to run before we have started any form of 120 // streaming through the voice engine. 121 class AfterInitializationFixture : public BeforeInitializationFixture { 122 public: 123 AfterInitializationFixture(); 124 virtual ~AfterInitializationFixture(); 125 126 protected: 127 webrtc::scoped_ptr<TestErrorObserver> error_observer_; 128 }; 129 130 #endif // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ 131