jamulus/src/testbench.h

287 lines
9.6 KiB
C++
Executable file

/******************************************************************************\
* Copyright (c) 2004-2013
*
* Author(s):
* Volker Fischer
*
******************************************************************************
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
\******************************************************************************/
#if !defined ( TESTBENCH_HOIHJH8_3_43445KJIUHF1912__INCLUDED_ )
#define TESTBENCH_HOIHJH8_3_43445KJIUHF1912__INCLUDED_
#include <QObject>
#include <QTimer>
#include <QDateTime>
#include <QHostAddress>
#include "global.h"
#include "socket.h"
#include "protocol.h"
#include "util.h"
/* Classes ********************************************************************/
class CTestbench : public QObject
{
Q_OBJECT
public:
CTestbench ( QString sNewAddress, quint16 iNewPort ) :
sAddress ( sNewAddress ),
iPort ( iNewPort )
{
// bind socket (try 100 port numbers)
quint16 iPortIncrement = 0; // start value: port nubmer plus ten
bool bSuccess = false; // initialization for while loop
while ( !bSuccess && ( iPortIncrement <= 100 ) )
{
bSuccess = UdpSocket.bind ( QHostAddress( QHostAddress::Any ),
22222 + iPortIncrement );
iPortIncrement++;
}
// connect protocol signal
QObject::connect ( &Protocol, SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ),
this, SLOT ( OnSendProtMessage ( CVector<uint8_t> ) ) );
// connect and start the timer (testbench heartbeat)
QObject::connect ( &Timer, SIGNAL ( timeout() ),
this, SLOT ( OnTimer() ) );
Timer.start ( 1 ); // 1 ms
}
protected:
int GenRandomIntInRange ( const int iStart, const int iEnd ) const
{
return static_cast<int> ( iStart +
( ( static_cast<double> ( iEnd - iStart + 1 ) * rand() ) / RAND_MAX ) );
}
QString GenRandomString() const
{
const int iLen = GenRandomIntInRange ( 0, 111 );
QString strReturn = "";
for ( int i = 0; i < iLen; i++ )
{
strReturn += static_cast<char> ( GenRandomIntInRange ( 0, 255 ) );
}
return strReturn;
}
QString sAddress;
quint16 iPort;
QTimer Timer;
CProtocol Protocol;
QUdpSocket UdpSocket;
public slots:
void OnTimer()
{
CVector<CChannelInfo> vecChanInfo ( 1 );
CNetworkTransportProps NetTrProps;
CServerCoreInfo ServerInfo;
CVector<CServerInfo> vecServerInfo ( 1 );
CHostAddress CurHostAddress ( QHostAddress ( sAddress ), iPort );
CChannelCoreInfo ChannelCoreInfo;
// generate random protocol message
switch ( GenRandomIntInRange ( 0, 24 ) )
{
case 0:
Protocol.CreateJitBufMes ( GenRandomIntInRange ( 0, 10 ) );
break;
case 1:
Protocol.CreateReqJitBufMes();
break;
case 2:
Protocol.CreateChanGainMes ( GenRandomIntInRange ( 0, 20 ),
GenRandomIntInRange ( -100, 100 ) );
break;
case 3:
vecChanInfo[0].iChanID = GenRandomIntInRange ( -2, 20 );
vecChanInfo[0].iIpAddr = GenRandomIntInRange ( 0, 100000 );
vecChanInfo[0].strName = GenRandomString();
Protocol.CreateConClientListNameMes ( vecChanInfo );
break;
case 4:
vecChanInfo[0].iChanID = GenRandomIntInRange ( -2, 20 );
vecChanInfo[0].iIpAddr = GenRandomIntInRange ( 0, 100000 );
vecChanInfo[0].strName = GenRandomString();
Protocol.CreateConClientListMes ( vecChanInfo );
break;
case 5:
Protocol.CreateReqConnClientsList();
break;
case 6:
Protocol.CreateChanNameMes ( GenRandomString() );
break;
case 7:
ChannelCoreInfo.eCountry =
static_cast<QLocale::Country> ( GenRandomIntInRange ( 0, 100 ) );
ChannelCoreInfo.eSkillLevel =
static_cast<ESkillLevel> ( GenRandomIntInRange ( 0, 3 ) );
ChannelCoreInfo.iInstrument = GenRandomIntInRange ( 0, 100000 );
ChannelCoreInfo.strCity = GenRandomString();
ChannelCoreInfo.strName = GenRandomString();
Protocol.CreateChanInfoMes ( ChannelCoreInfo );
break;
case 8:
Protocol.CreateReqChanInfoMes();
break;
case 9:
Protocol.CreateChatTextMes ( GenRandomString() );
break;
case 10:
NetTrProps.eAudioCodingType =
static_cast<EAudComprType> ( GenRandomIntInRange ( 0, 2 ) );
NetTrProps.iAudioCodingArg = GenRandomIntInRange ( -100, 100 );
NetTrProps.iBaseNetworkPacketSize = GenRandomIntInRange ( -2, 1000 );
NetTrProps.iBlockSizeFact = GenRandomIntInRange ( -2, 100 );
NetTrProps.iNumAudioChannels = GenRandomIntInRange ( -2, 10 );
NetTrProps.iSampleRate = GenRandomIntInRange ( -2, 10000 );
NetTrProps.iVersion = GenRandomIntInRange ( -2, 10000 );
Protocol.CreateNetwTranspPropsMes ( NetTrProps );
break;
case 11:
Protocol.CreateReqNetwTranspPropsMes();
break;
case 12:
Protocol.CreateOpusSupportedMes();
break;
case 13:
Protocol.CreateCLPingMes ( CurHostAddress,
GenRandomIntInRange ( -2, 1000 ) );
break;
case 14:
Protocol.CreateCLPingWithNumClientsMes ( CurHostAddress,
GenRandomIntInRange ( -2, 1000 ),
GenRandomIntInRange ( -2, 1000 ) );
break;
case 15:
Protocol.CreateCLServerFullMes ( CurHostAddress );
break;
case 16:
ServerInfo.bPermanentOnline =
static_cast<bool> ( GenRandomIntInRange ( 0, 1 ) );
ServerInfo.eCountry =
static_cast<QLocale::Country> ( GenRandomIntInRange ( 0, 100 ) );
ServerInfo.iLocalPortNumber = GenRandomIntInRange ( -2, 10000 );
ServerInfo.iMaxNumClients = GenRandomIntInRange ( -2, 10000 );
ServerInfo.strCity = GenRandomString();
ServerInfo.strName = GenRandomString();
ServerInfo.strTopic = GenRandomString();
Protocol.CreateCLRegisterServerMes ( CurHostAddress,
ServerInfo );
break;
case 17:
Protocol.CreateCLUnregisterServerMes ( CurHostAddress );
break;
case 18:
vecServerInfo[0].bPermanentOnline =
static_cast<bool> ( GenRandomIntInRange ( 0, 1 ) );
vecServerInfo[0].eCountry =
static_cast<QLocale::Country> ( GenRandomIntInRange ( 0, 100 ) );
vecServerInfo[0].HostAddr = CurHostAddress;
vecServerInfo[0].iLocalPortNumber = GenRandomIntInRange ( -2, 10000 );
vecServerInfo[0].iMaxNumClients = GenRandomIntInRange ( -2, 10000 );
vecServerInfo[0].strCity = GenRandomString();
vecServerInfo[0].strName = GenRandomString();
vecServerInfo[0].strTopic = GenRandomString();
Protocol.CreateCLServerListMes ( CurHostAddress,
vecServerInfo );
break;
case 19:
Protocol.CreateCLReqServerListMes ( CurHostAddress );
break;
case 20:
Protocol.CreateCLSendEmptyMesMes ( CurHostAddress,
CurHostAddress );
break;
case 21:
Protocol.CreateCLEmptyMes ( CurHostAddress );
break;
case 22:
Protocol.CreateCLDisconnection ( CurHostAddress );
break;
case 23:
Protocol.CreateAndImmSendAcknMess ( GenRandomIntInRange ( -10, 100 ),
GenRandomIntInRange ( -100, 100 ) );
break;
case 24:
// arbitrary "audio" packet (with random sizes)
CVector<uint8_t> vecMessage ( GenRandomIntInRange ( 1, 1000 ) );
OnSendProtMessage ( vecMessage );
break;
}
}
void OnSendProtMessage ( CVector<uint8_t> vecMessage )
{
UdpSocket.writeDatagram (
(const char*) &( (CVector<uint8_t>) vecMessage )[0],
vecMessage.Size(), QHostAddress ( sAddress ), iPort );
// reset protocol so that we do not have to wait for an acknowledge to
// send the next message
Protocol.Reset();
}
};
#endif /* !defined ( TESTBENCH_HOIHJH8_3_43445KJIUHF1912__INCLUDED_ ) */