Move the VoE tests to use external transport instead of the built in udp transport

Review URL: https://webrtc-codereview.appspot.com/1223006

git-svn-id: http://webrtc.googlecode.com/svn/trunk@3708 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pwestin@webrtc.org 2013-03-22 16:12:57 +00:00
parent e86f43b02a
commit e30823911c
15 changed files with 325 additions and 1989 deletions

View File

@ -15,17 +15,20 @@
#include "gflags/gflags.h"
#include "gtest/gtest.h"
#include "voice_engine/include/voe_audio_processing.h"
#include "voice_engine/include/voe_base.h"
#include "voice_engine/include/voe_codec.h"
#include "voice_engine/include/voe_hardware.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
#include "webrtc/voice_engine/include/voe_audio_processing.h"
#include "webrtc/voice_engine/include/voe_base.h"
#include "webrtc/voice_engine/include/voe_codec.h"
#include "webrtc/voice_engine/include/voe_hardware.h"
#include "webrtc/voice_engine/include/voe_network.h"
DEFINE_string(render, "render", "render device name");
DEFINE_string(codec, "ISAC", "codec name");
DEFINE_int32(rate, 16000, "codec sample rate in Hz");
namespace webrtc {
namespace {
namespace test {
void RunHarness() {
VoiceEngine* voe = VoiceEngine::Create();
@ -38,12 +41,18 @@ void RunHarness() {
ASSERT_TRUE(codec != NULL);
VoEHardware* hardware = VoEHardware::GetInterface(voe);
ASSERT_TRUE(hardware != NULL);
VoENetwork* network = VoENetwork::GetInterface(voe);
ASSERT_TRUE(network != NULL);
ASSERT_EQ(0, base->Init());
int channel = base->CreateChannel();
ASSERT_NE(-1, channel);
ASSERT_EQ(0, base->SetSendDestination(channel, 1234, "127.0.0.1"));
ASSERT_EQ(0, base->SetLocalReceiver(channel, 1234));
scoped_ptr<VoiceChannelTransport> voice_channel_transport(
new VoiceChannelTransport(network, channel));
ASSERT_EQ(0, voice_channel_transport->SetSendDestination("127.0.0.1", 1234));
ASSERT_EQ(0, voice_channel_transport->SetLocalReceiver(1234));
CodecInst codec_params = {0};
bool codec_found = false;
@ -90,10 +99,10 @@ void RunHarness() {
}
}
} // namespace
} // namespace test
} // namespace webrtc
int main(int argc, char** argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
webrtc::RunHarness();
webrtc::test::RunHarness();
}

View File

@ -13,6 +13,7 @@
'target_name': 'audio_e2e_harness',
'type': 'executable',
'dependencies': [
'<(webrtc_root)/test/channel_transport.gyp:channel_transport',
'<(webrtc_root)/voice_engine/voice_engine.gyp:voice_engine_core',
'<(DEPTH)/testing/gtest.gyp:gtest',
'<(DEPTH)/third_party/google-gflags/google-gflags.gyp:google-gflags',

View File

@ -13,9 +13,30 @@
#include "before_initialization_fixture.h"
#include "scoped_ptr.h"
#include "webrtc/common_types.h"
class TestErrorObserver;
class LoopBackTransport : public webrtc::Transport {
public:
LoopBackTransport(webrtc::VoENetwork* voe_network)
: voe_network_(voe_network) {
}
virtual int SendPacket(int channel, const void *data, int len) {
voe_network_->ReceivedRTPPacket(channel, data, len);
return len;
}
virtual int SendRTCPPacket(int channel, const void *data, int len) {
voe_network_->ReceivedRTCPPacket(channel, data, len);
return len;
}
private:
webrtc::VoENetwork* voe_network_;
};
// This fixture initializes the voice engine in addition to the work
// done by the before-initialization fixture. It also registers an error
// observer which will fail tests on error callbacks. This fixture is

View File

@ -12,8 +12,6 @@
#include <cstring>
static const char* kLoopbackIp = "127.0.0.1";
AfterStreamingFixture::AfterStreamingFixture()
: channel_(voe_base_->CreateChannel()) {
EXPECT_GE(channel_, 0);
@ -30,7 +28,9 @@ AfterStreamingFixture::~AfterStreamingFixture() {
voe_file_->StopPlayingFileAsMicrophone(channel_);
PausePlaying();
EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(channel_));
voe_base_->DeleteChannel(channel_);
delete transport_;
}
void AfterStreamingFixture::SwitchToManualMicrophone() {
@ -59,8 +59,8 @@ void AfterStreamingFixture::ResumePlaying() {
}
void AfterStreamingFixture::SetUpLocalPlayback() {
EXPECT_EQ(0, voe_base_->SetSendDestination(channel_, 8000, kLoopbackIp));
EXPECT_EQ(0, voe_base_->SetLocalReceiver(0, 8000));
transport_ = new LoopBackTransport(voe_network_);
EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel_, *transport_));
webrtc::CodecInst codec;
codec.channels = 1;

View File

@ -42,6 +42,8 @@ class AfterStreamingFixture : public AfterInitializationFixture {
private:
void SetUpLocalPlayback();
LoopBackTransport* transport_;
};

View File

@ -23,79 +23,6 @@ class NetworkTest : public AfterStreamingFixture {
using ::testing::Between;
TEST_F(NetworkTest, GetSourceInfoReturnsPortsAndIpAfterReceivingPackets) {
// Give some time to send speech packets.
Sleep(200);
int rtp_port = 0;
int rtcp_port = 0;
char source_ip[32] = "127.0.0.1";
EXPECT_EQ(0, voe_network_->GetSourceInfo(channel_, rtp_port, rtcp_port,
source_ip));
EXPECT_EQ(kDefaultRtpPort, rtp_port);
EXPECT_EQ(kDefaultRtcpPort, rtcp_port);
}
TEST_F(NetworkTest, NoFilterIsEnabledByDefault) {
int filter_rtp_port = -1;
int filter_rtcp_port = -1;
char filter_ip[64] = { 0 };
EXPECT_EQ(0, voe_network_->GetSourceFilter(
channel_, filter_rtp_port, filter_rtcp_port, filter_ip));
EXPECT_EQ(0, filter_rtp_port);
EXPECT_EQ(0, filter_rtcp_port);
EXPECT_STREQ("", filter_ip);
}
TEST_F(NetworkTest, ManualCanFilterRtpPort) {
TEST_LOG("No filter, should hear audio.\n");
Sleep(1000);
int port_to_block = kDefaultRtpPort + 10;
EXPECT_EQ(0, voe_network_->SetSourceFilter(channel_, port_to_block));
// Changes should take effect immediately.
int filter_rtp_port = -1;
int filter_rtcp_port = -1;
char filter_ip[64] = { 0 };
EXPECT_EQ(0, voe_network_->GetSourceFilter(
channel_, filter_rtp_port, filter_rtcp_port, filter_ip));
EXPECT_EQ(port_to_block, filter_rtp_port);
TEST_LOG("Now filtering port %d, should not hear audio.\n", port_to_block);
Sleep(1000);
TEST_LOG("Removing filter, should hear audio.\n");
EXPECT_EQ(0, voe_network_->SetSourceFilter(channel_, 0));
Sleep(1000);
}
TEST_F(NetworkTest, ManualCanFilterIp) {
TEST_LOG("You should hear audio.\n");
Sleep(1000);
int rtcp_port_to_block = kDefaultRtcpPort + 10;
TEST_LOG("Filtering IP 10.10.10.10, should not hear audio.\n");
EXPECT_EQ(0, voe_network_->SetSourceFilter(
channel_, 0, rtcp_port_to_block, "10.10.10.10"));
int filter_rtp_port = -1;
int filter_rtcp_port = -1;
char filter_ip[64] = { 0 };
EXPECT_EQ(0, voe_network_->GetSourceFilter(
channel_, filter_rtp_port, filter_rtcp_port, filter_ip));
EXPECT_EQ(0, filter_rtp_port);
EXPECT_EQ(rtcp_port_to_block, filter_rtcp_port);
EXPECT_STREQ("10.10.10.10", filter_ip);
}
TEST_F(NetworkTest,
CallsObserverOnTimeoutAndRestartWhenPacketTimeoutNotificationIsEnabled) {
// First, get rid of the default, asserting observer and install our observer.

View File

@ -101,10 +101,10 @@ class RtpRtcpTest : public AfterStreamingFixture {
second_channel_ = voe_base_->CreateChannel();
EXPECT_GE(second_channel_, 0);
EXPECT_EQ(0, voe_base_->SetSendDestination(
second_channel_, 8002, "127.0.0.1"));
EXPECT_EQ(0, voe_base_->SetLocalReceiver(
second_channel_, 8002));
transport_ = new LoopBackTransport(voe_network_);
EXPECT_EQ(0, voe_network_->RegisterExternalTransport(second_channel_,
*transport_));
EXPECT_EQ(0, voe_base_->StartReceive(second_channel_));
EXPECT_EQ(0, voe_base_->StartPlayout(second_channel_));
EXPECT_EQ(0, voe_rtp_rtcp_->SetLocalSSRC(second_channel_, 5678));
@ -115,10 +115,13 @@ class RtpRtcpTest : public AfterStreamingFixture {
}
void TearDown() {
EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(second_channel_));
voe_base_->DeleteChannel(second_channel_);
delete transport_;
}
int second_channel_;
LoopBackTransport* transport_;
};
void RtcpAppHandler::OnApplicationDataReceived(

View File

@ -8,6 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include "voe_cpu_test.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
@ -16,9 +18,11 @@
#include <conio.h>
#endif
#include "voe_cpu_test.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
using namespace webrtc;
using namespace test;
namespace voetest {
@ -45,6 +49,7 @@ int VoECpuTest::DoTest() {
VoEFile* file = _mgr.FilePtr();
VoECodec* codec = _mgr.CodecPtr();
VoEAudioProcessing* apm = _mgr.APMPtr();
VoENetwork* voe_network = _mgr.NetworkPtr();
int channel(-1);
CodecInst isac;
@ -59,8 +64,12 @@ int VoECpuTest::DoTest() {
CHECK(base->Init());
channel = base->CreateChannel();
CHECK(base->SetLocalReceiver(channel, 5566));
CHECK(base->SetSendDestination(channel, 5566, "127.0.0.1"));
scoped_ptr<VoiceChannelTransport> voice_socket_transport(
new VoiceChannelTransport(voe_network, channel));
CHECK(voice_socket_transport->SetSendDestination("127.0.0.1", 5566));
CHECK(voice_socket_transport->SetLocalReceiver(5566));
CHECK(codec->SetRecPayloadType(channel, isac));
CHECK(codec->SetSendCodec(channel, isac));
@ -86,7 +95,6 @@ int VoECpuTest::DoTest() {
base->DeleteChannel(channel);
CHECK(base->Terminate());
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,14 @@
#define WEBRTC_VOICE_ENGINE_VOE_EXTENDED_TEST_H
#include "voe_standard_test.h"
#include "modules/audio_device/include/audio_device.h"
#include "webrtc/modules/audio_device/include/audio_device.h"
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/event_wrapper.h"
#include "webrtc/system_wrappers/interface/ref_count.h"
#include "webrtc/system_wrappers/interface/sleep.h"
#include "webrtc/system_wrappers/interface/thread_wrapper.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
namespace voetest {
@ -425,35 +432,39 @@ class VoEExtendedTest : public VoiceEngineObserver,
int TestRTP_RTCP();
int TestVideoSync();
int TestVolumeControl();
public:
int ErrorCode() const {
return _errCode;
}
void ClearErrorCode() {
_errCode = 0;
}
protected:
// from VoiceEngineObserver
void CallbackOnError(const int errCode, const int channel);
void CallbackOnTrace(const TraceLevel level, const char* message, const int length);
protected:
void CallbackOnTrace(const TraceLevel level, const char* message,
const int length);
// from VoEConnectionObserver
void OnPeriodicDeadOrAlive(const int channel, const bool alive);
private:
void Play(int channel, unsigned int timeMillisec, bool addFileAsMicrophone = false,
bool addTimeMarker = false);
void Play(int channel, unsigned int timeMillisec,
bool addFileAsMicrophone = false, bool addTimeMarker = false);
void Sleep(unsigned int timeMillisec, bool addMarker = false);
void StartMedia(int channel, int rtpPort, bool listen, bool playout, bool send);
void StartMedia(int channel, int rtpPort, bool listen, bool playout,
bool send);
void StopMedia(int channel);
int RunMixingTest(int num_remote_channels, int num_local_channels,
int16_t input_value, int16_t max_output_value,
int16_t min_output_value);
private:
VoETestManager& _mgr;
private:
int _errCode;
bool _alive;
bool _listening[32];
scoped_ptr<webrtc::test::VoiceChannelTransport> voice_channel_transports_[32];
bool _playing[32];
bool _sending[32];
};

View File

@ -23,13 +23,16 @@
#endif
#include "webrtc/voice_engine/test/auto_test/voe_stress_test.h"
#include "webrtc/voice_engine/test/auto_test/voe_standard_test.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/system_wrappers/interface/sleep.h"
#include "webrtc/system_wrappers/interface/thread_wrapper.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
#include "webrtc/voice_engine/test/auto_test/voe_standard_test.h"
#include "webrtc/voice_engine/voice_engine_defines.h" // defines build macros
using namespace webrtc;
using namespace test;
namespace voetest {
@ -122,6 +125,7 @@ int VoEStressTest::StartStopTest() {
// Get sub-API pointers
VoEBase* base = _mgr.BasePtr();
VoENetwork* voe_network = _mgr.NetworkPtr();
// Set trace
// VALIDATE_STRESS(base->SetTraceFileName(
@ -147,9 +151,12 @@ int VoEStressTest::StartStopTest() {
printf("Test will take approximately %d minutes. \n",
numberOfLoops * loopSleep / 1000 / 60 + 1);
scoped_ptr<VoiceChannelTransport> voice_channel_transport(
new VoiceChannelTransport(voe_network, 0));
for (i = 0; i < numberOfLoops; ++i) {
VALIDATE_STRESS(base->SetLocalReceiver(0, 4800));
VALIDATE_STRESS(base->SetSendDestination(0, 4800, "127.0.0.1"));
voice_channel_transport->SetSendDestination("127.0.0.1", 4800);
voice_channel_transport->SetLocalReceiver(4800);
VALIDATE_STRESS(base->StartReceive(0));
VALIDATE_STRESS(base->StartPlayout(0));
VALIDATE_STRESS(base->StartSend(0));
@ -162,8 +169,9 @@ int VoEStressTest::StartStopTest() {
}
ANL();
VALIDATE_STRESS(base->SetLocalReceiver(0, 4800));
VALIDATE_STRESS(base->SetSendDestination(0, 4800, "127.0.0.1"));
VALIDATE_STRESS(voice_channel_transport->SetSendDestination("127.0.0.1",
4800));
VALIDATE_STRESS(voice_channel_transport->SetLocalReceiver(4800));
VALIDATE_STRESS(base->StartReceive(0));
VALIDATE_STRESS(base->StartPlayout(0));
VALIDATE_STRESS(base->StartSend(0));

View File

@ -25,6 +25,7 @@
#include "webrtc/voice_engine/test/auto_test/fakes/fake_media_process.h"
using namespace webrtc;
using namespace test;
namespace voetest {
@ -248,13 +249,17 @@ int VoEUnitTest::StartMedia(int channel, int rtpPort, bool listen, bool playout,
bool send, bool fileAsMic, bool localFile) {
VoEBase* base = _mgr.BasePtr();
VoEFile* file = _mgr.FilePtr();
VoENetwork* voe_network = _mgr.NetworkPtr();
_listening[channel] = false;
_playing[channel] = false;
_sending[channel] = false;
voice_channel_transports_[channel].reset(
new VoiceChannelTransport(voe_network, channel));
CHECK(base->SetLocalReceiver(channel, rtpPort));
CHECK(base->SetSendDestination(channel, rtpPort, "127.0.0.1"));
CHECK(voice_channel_transports_[channel]->SetLocalReceiver(rtpPort));
CHECK(voice_channel_transports_[channel]->SetSendDestination("127.0.0.1",
rtpPort));
if (listen) {
_listening[channel] = true;
CHECK(base->StartReceive(channel));

View File

@ -11,7 +11,9 @@
#ifndef WEBRTC_VOICE_ENGINE_VOE_UNIT_TEST_H
#define WEBRTC_VOICE_ENGINE_VOE_UNIT_TEST_H
#include "voice_engine/test/auto_test/voe_standard_test.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
#include "webrtc/voice_engine/test/auto_test/voe_standard_test.h"
namespace voetest {
@ -57,6 +59,7 @@ class VoEUnitTest : public Encryption {
bool _listening[32];
bool _playing[32];
bool _sending[32];
scoped_ptr<webrtc::test::VoiceChannelTransport> voice_channel_transports_[32];
private:
bool _extOnOff;

View File

@ -18,8 +18,6 @@
#include <vector>
#include "gtest/gtest.h"
#include "test/testsupport/fileutils.h"
#include "voe_errors.h"
#include "voe_base.h"
#include "voe_codec.h"
@ -35,15 +33,17 @@
#include "voe_network.h"
#include "voe_neteq_stats.h"
#include "engine_configurations.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/test/channel_transport/include/channel_transport.h"
#include "webrtc/test/testsupport/fileutils.h"
// Enable this this flag to run this test with hard coded
// IP/Port/codec and start test automatically with key input
// it could be useful in repeat tests.
//#define DEBUG
// #define EXTERNAL_TRANSPORT
using namespace webrtc;
using namespace test;
#define VALIDATE \
if (res != 0) \
@ -70,29 +70,6 @@ VoENetEqStats* neteqst = NULL;
void RunTest(std::string out_path);
#ifdef EXTERNAL_TRANSPORT
class my_transportation : public Transport
{
int SendPacket(int channel,const void *data,int len);
int SendRTCPPacket(int channel, const void *data, int len);
};
int my_transportation::SendPacket(int channel,const void *data,int len)
{
netw->ReceivedRTPPacket(channel, data, len);
return 0;
}
int my_transportation::SendRTCPPacket(int channel, const void *data, int len)
{
netw->ReceivedRTCPPacket(channel, data, len);
return 0;
}
my_transportation my_transport;
#endif
class MyObserver : public VoiceEngineObserver {
public:
virtual void CallbackOnError(const int channel, const int err_code);
@ -270,44 +247,24 @@ void RunTest(std::string out_path) {
cnt++;
int j = 0;
#ifdef EXTERNAL_TRANSPORT
my_transportation ch0transport;
printf("Enabling external transport \n");
netw->RegisterExternalTransport(0, ch0transport);
#else
char ip[64];
#ifdef DEBUG
strcpy(ip, "127.0.0.1");
#else
char localip[64];
netw->GetLocalIP(localip);
printf("local IP:%s\n", localip);
printf("1. 127.0.0.1 \n");
printf("2. Specify IP \n");
ASSERT_EQ(1, scanf("%i", &i));
if (1 == i)
if (1 == i) {
strcpy(ip, "127.0.0.1");
else {
} else {
printf("Specify remote IP: ");
ASSERT_EQ(1, scanf("%s", ip));
}
#endif
int colons(0);
while (ip[j] != '\0' && j < 64 && !(colons = (ip[j++] == ':')))
;
if (colons) {
printf("Enabling IPv6\n");
res = netw->EnableIPv6(0);
VALIDATE;
}
int rPort;
#ifdef DEBUG
rPort=8500;
#else
int rPort = 8500;
#ifndef DEBUG
printf("Specify remote port (1=1234): ");
ASSERT_EQ(1, scanf("%i", &rPort));
if (1 == rPort)
@ -315,23 +272,24 @@ void RunTest(std::string out_path) {
printf("Set Send port \n");
#endif
scoped_ptr<VoiceChannelTransport> voice_channel_transport(
new VoiceChannelTransport(netw, chan));
printf("Set Send IP \n");
res = base1->SetSendDestination(chan, rPort, ip);
res = voice_channel_transport->SetSendDestination(ip, rPort);
VALIDATE;
int lPort;
#ifdef DEBUG
lPort=8500;
#else
int lPort = 8500;
#ifndef DEBUG
printf("Specify local port (1=1234): ");
ASSERT_EQ(1, scanf("%i", &lPort));
if (1 == lPort)
lPort = 1234;
printf("Set Rec Port \n");
#endif
res = base1->SetLocalReceiver(chan, lPort);
res = voice_channel_transport->SetLocalReceiver(lPort);
VALIDATE;
#endif
printf("\n");
for (i = 0; i < codec->NumOfCodecs(); i++) {
@ -367,12 +325,19 @@ void RunTest(std::string out_path) {
#endif
int channel_index = 0;
std::vector<int> channels(kMaxNumChannels);
std::vector<scoped_ptr<VoiceChannelTransport> > voice_channel_transports;
for (i = 0; i < kMaxNumChannels; ++i) {
channels[i] = base1->CreateChannel();
int port = rPort + (i + 1) * 2;
res = base1->SetSendDestination(channels[i], port, ip);
voice_channel_transports[i].reset(
new VoiceChannelTransport(netw, channels[i]));
printf("Set Send IP \n");
res = voice_channel_transports[i]->SetSendDestination(ip, port);
VALIDATE;
res = base1->SetLocalReceiver(channels[i], port);
res = voice_channel_transports[i]->SetLocalReceiver(port);
VALIDATE;
res = codec->SetSendCodec(channels[i], cinst);
VALIDATE;

View File

@ -20,7 +20,8 @@
'<(DEPTH)/testing/gmock.gyp:gmock',
'<(DEPTH)/third_party/google-gflags/google-gflags.gyp:google-gflags',
'<(webrtc_root)/test/libtest/libtest.gyp:libtest',
],
'<(webrtc_root)/test/channel_transport.gyp:channel_transport',
],
'include_dirs': [
'auto_test',
'auto_test/fixtures',
@ -102,6 +103,7 @@
'<(DEPTH)/testing/gtest.gyp:gtest',
'voice_engine_core',
'<(webrtc_root)/system_wrappers/source/system_wrappers.gyp:system_wrappers',
'<(webrtc_root)/test/channel_transport.gyp:channel_transport',
],
'sources': [
'cmd_test/voe_cmd_test.cc',