summaryrefslogtreecommitdiff
path: root/utils/socket_tests
diff options
context:
space:
mode:
Diffstat (limited to 'utils/socket_tests')
-rw-r--r--utils/socket_tests/StdAfx.cpp15
-rw-r--r--utils/socket_tests/StdAfx.h30
-rw-r--r--utils/socket_tests/socket_tests.cpp166
-rw-r--r--utils/socket_tests/socket_tests.vcproj226
4 files changed, 437 insertions, 0 deletions
diff --git a/utils/socket_tests/StdAfx.cpp b/utils/socket_tests/StdAfx.cpp
new file mode 100644
index 0000000..fbf99c9
--- /dev/null
+++ b/utils/socket_tests/StdAfx.cpp
@@ -0,0 +1,15 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.cpp : source file that includes just the standard includes
+// socket_tests.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/utils/socket_tests/StdAfx.h b/utils/socket_tests/StdAfx.h
new file mode 100644
index 0000000..124b621
--- /dev/null
+++ b/utils/socket_tests/StdAfx.h
@@ -0,0 +1,30 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__62CC06CE_9B37_4015_8F00_2E8386891128__INCLUDED_)
+#define AFX_STDAFX_H__62CC06CE_9B37_4015_8F00_2E8386891128__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+#include <windows.h>
+#include <stdio.h>
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__62CC06CE_9B37_4015_8F00_2E8386891128__INCLUDED_)
diff --git a/utils/socket_tests/socket_tests.cpp b/utils/socket_tests/socket_tests.cpp
new file mode 100644
index 0000000..7a9e045
--- /dev/null
+++ b/utils/socket_tests/socket_tests.cpp
@@ -0,0 +1,166 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// socket_tests.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+#include <stdlib.h>
+#include "iphelpers.h"
+#include "tcpsocket.h"
+#include "utlvector.h"
+#include "fragment_channel.h"
+#include "reliable_channel.h"
+#include "tier0/fasttimer.h"
+
+
+#if defined( _DEBUG )
+ #if defined( assert )
+ #undef assert
+ #endif
+
+ #define assert(x) if ( !x ) __asm int 3;
+#else
+ #define assert(x)
+#endif
+
+
+bool CompareArrays( const CUtlVector<unsigned char> &a1, const CUtlVector<unsigned char> &a2 )
+{
+ if ( a1.Count() != a2.Count() )
+ return false;
+
+ for ( int i=0; i < a1.Count(); i++ )
+ {
+ if ( a1[i] != a2[i] )
+ return false;
+ }
+ return true;
+}
+
+
+// Test two reliable channels that are hooked up to each other.
+void TestChannels( IChannel *pChannel1, IChannel *pChannel2, int maxPacketSize, int nTests )
+{
+ for ( int iTest=0; iTest < nTests; iTest++ )
+ {
+ float t = (float)rand() / VALVE_RAND_MAX;
+ int testSize = (int)( t * (maxPacketSize-1) ) + 1;
+
+ CUtlVector<unsigned char> rnd1, rnd2;
+ rnd1.SetSize( testSize );
+ rnd2.SetSize( testSize );
+ for ( int i=0; i < testSize; i++ )
+ {
+ rnd1[i] = rand();
+ rnd2[i] = rand();
+ }
+
+ pChannel1->Send( rnd1.Base(), testSize );
+ pChannel2->Send( rnd2.Base(), testSize );
+
+
+ // Now wait for up to 5 seconds for the data to come in.
+ CUtlVector<unsigned char> tmp;
+ tmp.SetSize( testSize );
+
+ CUtlVector<unsigned char> testVec;
+ bool bReceived;
+ if ( !( bReceived = pChannel1->Recv( testVec, 15 ) ) || !CompareArrays( testVec, rnd2 ) )
+ {
+ assert( false );
+ }
+
+ if ( !( bReceived = pChannel2->Recv( testVec, 15 ) ) || !CompareArrays( testVec, rnd1 ) )
+ {
+ assert( false );
+ }
+ }
+}
+
+
+template<class T>
+void TestChannels( T *pSock[2] )
+{
+ int iPorts[2];
+ for ( int iPort=0; iPort < 2; iPort++ )
+ {
+ int nTries = 150;
+ for ( int iTry=0; iTry < nTries; iTry++ )
+ {
+ iPorts[iPort] = 27111 + iTry;
+ if ( pSock[iPort]->BindToAny( iPorts[iPort] ) )
+ break;
+ }
+ }
+
+ // Bind them to random ports.
+ pSock[0]->BeginListen();
+ pSock[1]->BeginConnect( CIPAddr( 127, 0, 0, 1, iPorts[0] ) );
+ while ( !pSock[0]->IsConnected() || !pSock[1]->IsConnected() )
+ {
+ CIPAddr remoteAddr;
+ if ( !pSock[0]->IsConnected() )
+ pSock[0]->UpdateListen( &remoteAddr );
+
+ if ( !pSock[1]->IsConnected() )
+ pSock[1]->UpdateConnect();
+ }
+
+
+// Measure ping-pong time.
+__int64 totalMicroseconds = 0;
+int nTests = 1500;
+for ( int i=0; i < nTests; i++ )
+{
+ char buf[2116];
+ CFastTimer timer;
+ timer.Start();
+
+ pSock[0]->Send( buf, sizeof( buf ) );
+
+ CUtlVector<unsigned char> recvBuf;
+ pSock[1]->Recv( recvBuf );
+ timer.End();
+ totalMicroseconds += timer.GetDuration().GetMicroseconds();
+}
+
+
+ // Now, test them with the fragmentation layer.
+ IChannel *pFrag[2] = { CreateFragmentLayer( pSock[0] ), CreateFragmentLayer( pSock[1] ) };
+ TestChannels( pFrag[0], pFrag[1], 1024*300, 5 );
+
+
+ TestChannels( pSock[0], pSock[1], 1024, 1000 );
+}
+
+
+int main(int argc, char* argv[])
+{
+ // First, test two TCP sockets.
+ for ( int iChannelType=0; iChannelType < 2; iChannelType++ )
+ {
+ DWORD startTime = GetTickCount();
+
+ srand( 0 );
+ if ( iChannelType == 0 )
+ {
+ ITCPSocket *pTCPSockets[2] = { CreateTCPSocket(), CreateTCPSocket() };
+ TestChannels( pTCPSockets );
+ }
+ else
+ {
+ IReliableChannel *pReliableChannels[2] = { CreateReliableChannel(), CreateReliableChannel() };
+ TestChannels( pReliableChannels );
+ }
+
+ float flElapsed = (float)( GetTickCount() - startTime ) / 1000.0;
+ }
+
+ return 0;
+}
+
diff --git a/utils/socket_tests/socket_tests.vcproj b/utils/socket_tests/socket_tests.vcproj
new file mode 100644
index 0000000..5d8e59d
--- /dev/null
+++ b/utils/socket_tests/socket_tests.vcproj
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="socket_tests"
+ ProjectGUID="{88AD4E41-A904-457D-954A-11C3B2A268C7}"
+ SccProjectName=""
+ SccAuxPath=""
+ SccLocalPath=""
+ SccProvider="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\Release"
+ IntermediateDirectory=".\Release"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\public,..\common"
+ PreprocessorDefinitions="NDEBUG;WIN32;_CONSOLE;PROTECTED_THINGS_DISABLE"
+ StringPooling="TRUE"
+ RuntimeLibrary="4"
+ EnableFunctionLevelLinking="TRUE"
+ PrecompiledHeaderFile=".\Release/socket_tests.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib odbc32.lib odbccp32.lib"
+ OutputFile=".\Release/socket_tests.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ ProgramDatabaseFile=".\Release/socket_tests.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/socket_tests.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\Debug"
+ IntermediateDirectory=".\Debug"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\public,..\common"
+ PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE;PROTECTED_THINGS_DISABLE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ PrecompiledHeaderFile=".\Debug/socket_tests.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ DebugInformationFormat="4"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ws2_32.lib odbc32.lib odbccp32.lib"
+ OutputFile=".\Debug/socket_tests.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile=".\Debug/socket_tests.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/socket_tests.tlb"
+ HeaderFileName=""/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+ <File
+ RelativePath="..\common\fragment_channel.cpp">
+ </File>
+ <File
+ RelativePath="..\common\iphelpers.cpp">
+ </File>
+ <File
+ RelativePath="..\common\loopback_channel.cpp">
+ </File>
+ <File
+ RelativePath="..\common\reliable_channel.cpp">
+ </File>
+ <File
+ RelativePath="socket_tests.cpp">
+ </File>
+ <File
+ RelativePath="StdAfx.cpp">
+ </File>
+ <File
+ RelativePath="..\common\tcpsocket.cpp">
+ </File>
+ <File
+ RelativePath="..\common\threadupdatemgr.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl">
+ <File
+ RelativePath="..\common\connectionmgr.h">
+ </File>
+ <File
+ RelativePath="..\common\fragment_channel.h">
+ </File>
+ <File
+ RelativePath="..\common\ichannel.h">
+ </File>
+ <File
+ RelativePath="..\common\iphelpers.h">
+ </File>
+ <File
+ RelativePath="..\common\loopback_channel.h">
+ </File>
+ <File
+ RelativePath="..\common\reliable_channel.h">
+ </File>
+ <File
+ RelativePath="StdAfx.h">
+ </File>
+ <File
+ RelativePath="..\common\tcpsocket.h">
+ </File>
+ <File
+ RelativePath="..\common\threadupdatemgr.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
+ </Filter>
+ <File
+ RelativePath="ReadMe.txt">
+ </File>
+ <File
+ RelativePath="..\..\lib\public\tier0.lib">
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ CommandLine=""/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ CommandLine=""/>
+ </FileConfiguration>
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>