275 lines
7.3 KiB
C++
275 lines
7.3 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
// BWETester.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <ctime>
|
|
|
|
#include "event_wrapper.h"
|
|
#include "trace.h"
|
|
|
|
#include "BWEStabilityTest.h"
|
|
#include "BWEConvergenceTest.h"
|
|
#include "BWETwoWayLimitFinding.h"
|
|
|
|
#include "MatlabPlot.h"
|
|
|
|
//#include "vld.h"
|
|
|
|
#ifdef MATLAB
|
|
MatlabEngine eng;
|
|
#endif
|
|
|
|
|
|
class testContainer
|
|
{
|
|
public:
|
|
testContainer(BWETest *test, bool waitForKeyStroke, int delayStartSec,
|
|
std::string instruction) :
|
|
_test(test),
|
|
_waitMaster(waitForKeyStroke),
|
|
_waitSlave(waitForKeyStroke),
|
|
_delayMaster(delayStartSec),
|
|
_delaySlave(delayStartSec),
|
|
_instr(instruction) {};
|
|
|
|
testContainer(BWETest *test,
|
|
bool waitForKeyStrokeMaster,
|
|
bool waitForKeyStrokeSlave,
|
|
int delayStartSecMaster,
|
|
int delayStartSecSlave,
|
|
std::string instruction) :
|
|
_test(test),
|
|
_waitMaster(waitForKeyStrokeMaster),
|
|
_waitSlave(waitForKeyStrokeSlave),
|
|
_delayMaster(delayStartSecMaster),
|
|
_delaySlave(delayStartSecSlave),
|
|
_instr(instruction) {};
|
|
|
|
~testContainer() { if(_test) delete _test; _test = NULL; };
|
|
|
|
BWETest *_test;
|
|
bool _waitMaster;
|
|
bool _waitSlave;
|
|
int _delayMaster;
|
|
int _delaySlave;
|
|
std::string _instr;
|
|
};
|
|
|
|
|
|
// This is were the test cases are created.
|
|
// Syntax:
|
|
// tests->push_back(new testContainer(
|
|
// new _BWETestConstructor_, // constructor for the test case
|
|
// _wait_, // wait for user key press before start
|
|
// _delay_, // delay test start (after a key press if enabled)
|
|
// "Intruction to user.")); // message to show in console before starting
|
|
//
|
|
// Or:
|
|
// tests->push_back(new testContainer(
|
|
// new _BWETestConstructor_, // constructor for the test case
|
|
// _waitMaster_, // master will wait for user key press before start
|
|
// _waitSlave_, // slave will wait for user key press before start
|
|
// _delayMaster_, // delay master test start (after a key press if enabled)
|
|
// _delaySlave_, // delay slave test start (after a key press if enabled)
|
|
// "Intruction to user.")); // message to show in console before starting
|
|
//
|
|
// Valid test cases are:
|
|
// BWEConvergenceTestUp
|
|
// BWEStabilityTest
|
|
// BWETwoWayLimitFinding
|
|
|
|
|
|
void PopulateTests(std::vector<testContainer *>* tests, bool isMaster)
|
|
{
|
|
tests->push_back(new testContainer(
|
|
new BWEStabilityTest("Stability", 400, 5*60),
|
|
true, true,
|
|
0, 0,
|
|
"Set bandwidth limit to 512 kbps"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWEStabilityTest("Stability", 4000, 5*60),
|
|
true, true,
|
|
0, 0,
|
|
"Set bandwidth limit to 5120 kbps"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWEStabilityTest("Stability", 400, 5*60),
|
|
true, true,
|
|
0, 0,
|
|
"Set bandwidth limit to 512 kbps and a normal distributed delay\
|
|
with mean 100 ms and std dev 15 ms"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWEConvergenceTestUp("Convergence 256->512", 256, 512),
|
|
true,
|
|
0,
|
|
"Set bandwith limit to 512 kbps"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWEConvergenceTestUp("Convergence 1024->5120", 1024, 5120),
|
|
true,
|
|
0,
|
|
"Set bandwith limit to 5120 kbps"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWETwoWayLimitFinding("Asymmetric limit finding {1024, 2048} kbps",
|
|
500, 1024,
|
|
500, 2048,
|
|
isMaster),
|
|
true,
|
|
0,
|
|
"Set bandwith limit to {1024, 2048} kbps asymmetric"));
|
|
|
|
tests->push_back(new testContainer(
|
|
new BWETwoWayLimitFinding("Symmetric limit finding {1024, 1024} kbps",
|
|
500, 1024,
|
|
500, 1024,
|
|
isMaster),
|
|
true,
|
|
0,
|
|
"Set bandwith limit to 1024 kbps symmetric"));
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
|
|
bool isMaster = false;
|
|
WebRtc_UWord16 port;
|
|
std::string ip;
|
|
std::fstream log;
|
|
log.open("TestLog.txt", std::fstream::out | std::fstream::app);
|
|
|
|
log << "\n\nBWE TESTER\n";
|
|
|
|
time_t t = time(0); // get time now
|
|
struct tm * now = localtime( & t );
|
|
log << (now->tm_year + 1900) << '-'
|
|
<< (now->tm_mon + 1) << '-'
|
|
<< now->tm_mday << " "
|
|
<< now->tm_hour << ":" << now->tm_min
|
|
<< "\n";
|
|
|
|
if (argc == 4)
|
|
{
|
|
// read IP
|
|
ip = argv[1];
|
|
|
|
// read port
|
|
port = atoi(argv[2]);
|
|
|
|
// read master/slave
|
|
isMaster = (atoi(argv[3]) != 0);
|
|
|
|
std::cout << "Destination: " << ip << "\n";
|
|
log << "Destination: " << ip << "\n";
|
|
std::cout << "Port: " << port << "\n";
|
|
log << "Port: " << port << "\n";
|
|
if (isMaster)
|
|
{
|
|
std::cout << "Master\n";
|
|
log << "Master\n";
|
|
}
|
|
else
|
|
{
|
|
std::cout << "Slave\n";
|
|
log << "Slave\n";
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
printf("Usage\nBWETester dstIP port master\n");
|
|
exit(1);
|
|
}
|
|
|
|
std::vector<testContainer*> tests;
|
|
PopulateTests(&tests, isMaster);
|
|
|
|
int testIndex = 0;
|
|
EventWrapper* event = EventWrapper::Create();
|
|
std::vector<testContainer*>::iterator it;
|
|
for (it=tests.begin() ; it < tests.end(); it++)
|
|
{
|
|
++testIndex;
|
|
|
|
BWETest *theTest = (*it)->_test;
|
|
|
|
if (theTest)
|
|
{
|
|
std::cout << "\nTest " << testIndex << ": " << theTest->TestName() << "\n";
|
|
}
|
|
|
|
// Print instructions
|
|
std::cout << "--> " << (*it)->_instr << std::endl;
|
|
|
|
if ((isMaster && (*it)->_waitMaster)
|
|
|| (!isMaster && (*it)->_waitSlave))
|
|
{
|
|
// Wait for a key press
|
|
std::cout << "Press enter to start test\n";
|
|
getc(stdin);
|
|
}
|
|
|
|
if (isMaster)
|
|
{
|
|
if ((*it)->_delayMaster > 0)
|
|
{
|
|
// Wait
|
|
std::cout << "Test starting in "
|
|
<< (*it)->_delayMaster
|
|
<< " seconds" << std::endl;
|
|
event->Wait((*it)->_delayMaster * 1000);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((*it)->_delaySlave > 0)
|
|
{
|
|
// Wait
|
|
std::cout << "Test starting in "
|
|
<< (*it)->_delaySlave
|
|
<< " seconds" << std::endl;
|
|
event->Wait((*it)->_delaySlave * 1000);
|
|
}
|
|
}
|
|
|
|
// Start execution
|
|
if (theTest)
|
|
{
|
|
theTest->SetMaster(isMaster);
|
|
if (theTest->Init(ip, port) != 0)
|
|
{
|
|
throw "Error initializing sender";
|
|
exit (1);
|
|
}
|
|
|
|
theTest->Start();
|
|
theTest->ProcLoop();
|
|
theTest->Stop();
|
|
theTest->Report(log);
|
|
log << std::flush;
|
|
}
|
|
|
|
delete (*it); // deletes the test too
|
|
}
|
|
delete event;
|
|
event = NULL;
|
|
|
|
log.close();
|
|
return (0);
|
|
}
|