327 lines
7.3 KiB
C++
327 lines
7.3 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 1997 - 1999
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
senstest.cxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
BVT for the SENS Connectivity APIs.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Gopal Parupudi <GopalP>
|
||
|
|
||
|
[Notes:]
|
||
|
|
||
|
optional-notes
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
GopalP 10/13/1997 Start.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include <common.hxx>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <sensapi.h>
|
||
|
#include <conio.h>
|
||
|
|
||
|
|
||
|
//
|
||
|
// Globals
|
||
|
//
|
||
|
DWORD gdwThreads;
|
||
|
DWORD gdwInterval;
|
||
|
|
||
|
//
|
||
|
// Forwards
|
||
|
//
|
||
|
|
||
|
void
|
||
|
MultiThreadedTest(
|
||
|
void
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
inline void
|
||
|
Usage(
|
||
|
void
|
||
|
)
|
||
|
{
|
||
|
printf("\nUsage: senstest [Destination] \n");
|
||
|
printf(" senstest [-m [Threads] [Interval]] \n\n");
|
||
|
printf("Options:\n\n");
|
||
|
printf(" Destination Name of the destination whose\n"
|
||
|
" reachability is of interest.\n");
|
||
|
printf(" -m Perform Mulithreaded SensAPI test.\n");
|
||
|
printf(" Threads Number of threads [Default = 5]\n");
|
||
|
printf(" Interval Wait between calls [Default = 10 sec]\n");
|
||
|
printf("\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
int __cdecl
|
||
|
main(
|
||
|
int argc,
|
||
|
const char * argv[]
|
||
|
)
|
||
|
{
|
||
|
DWORD dwFlags = 0;
|
||
|
BOOL bAlive = FALSE;
|
||
|
BOOL bReachable = FALSE;
|
||
|
|
||
|
|
||
|
if (argc > 4)
|
||
|
{
|
||
|
Usage();
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if ( (argc == 2)
|
||
|
&& ( (strcmp(argv[1], "-?") == 0)
|
||
|
|| (strcmp(argv[1], "/?") == 0)
|
||
|
|| (strcmp(argv[1], "-help") == 0)
|
||
|
|| (strcmp(argv[1], "/help") == 0)))
|
||
|
{
|
||
|
Usage();
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Start the MultiThreadedTest, if required.
|
||
|
//
|
||
|
|
||
|
if (argc > 1)
|
||
|
{
|
||
|
if (strcmp(argv[1], "-m") == 0)
|
||
|
{
|
||
|
gdwThreads = 5;
|
||
|
gdwInterval = 10;
|
||
|
|
||
|
if (argc > 2)
|
||
|
{
|
||
|
gdwThreads = atoi(argv[2]);
|
||
|
}
|
||
|
if (argc > 3)
|
||
|
{
|
||
|
gdwInterval = atoi(argv[3]);
|
||
|
}
|
||
|
|
||
|
MultiThreadedTest();
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Call IsNetworkAlive()
|
||
|
//
|
||
|
|
||
|
printf("------------------------------------------------------------------"
|
||
|
"----\n");
|
||
|
|
||
|
bAlive = IsNetworkAlive(&dwFlags);
|
||
|
|
||
|
printf(" IsNetworkAlive() returned %s\n", bAlive ? "TRUE" : "FALSE");
|
||
|
if (bAlive)
|
||
|
{
|
||
|
printf(" Type of connection -%s%s%s\n",
|
||
|
(dwFlags & NETWORK_ALIVE_WAN) ? " WAN" : "",
|
||
|
(dwFlags & NETWORK_ALIVE_AOL) ? " AOL" : "",
|
||
|
(dwFlags & NETWORK_ALIVE_LAN) ? " LAN" : "");
|
||
|
}
|
||
|
printf(" The GetLastError() was %d\n", GetLastError());
|
||
|
|
||
|
printf("------------------------------------------------------------------"
|
||
|
"----\n");
|
||
|
|
||
|
if (argc == 1)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Test the other API.
|
||
|
//
|
||
|
|
||
|
bReachable = IsDestinationReachableA((LPCSTR) argv[1], NULL);
|
||
|
|
||
|
printf(" IsDestinationReachableA(%s, NULL) returned %s\n",
|
||
|
argv[1], bReachable ? "TRUE" : "FALSE");
|
||
|
|
||
|
if (bReachable)
|
||
|
{
|
||
|
printf(" QOC is NULL.\n");
|
||
|
}
|
||
|
printf(" The GetLastError() was %d\n", GetLastError());
|
||
|
|
||
|
//
|
||
|
// Now, call with QOC Info.
|
||
|
//
|
||
|
|
||
|
printf("------------------------------------------------------------------"
|
||
|
"----\n");
|
||
|
|
||
|
QOCINFO QOCInfo;
|
||
|
NTSTATUS NtStatus;
|
||
|
|
||
|
QOCInfo.dwSize = sizeof(QOCINFO);
|
||
|
|
||
|
#if !defined(SENS_CHICAGO)
|
||
|
|
||
|
ANSI_STRING AnsiString;
|
||
|
UNICODE_STRING UnicodeString;
|
||
|
|
||
|
RtlInitAnsiString(&AnsiString, (PSZ)argv[1]);
|
||
|
NtStatus = RtlAnsiStringToUnicodeString(
|
||
|
&UnicodeString,
|
||
|
&AnsiString,
|
||
|
TRUE
|
||
|
);
|
||
|
if (!NT_SUCCESS(NtStatus))
|
||
|
{
|
||
|
printf("RtlAnsiStringToUnicodeString() returned 0x%x\n", NtStatus);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
bReachable = IsDestinationReachableW(UnicodeString.Buffer, &QOCInfo);
|
||
|
|
||
|
wprintf(L" IsDestinationReachableW(%s, QOC) returned %s\n",
|
||
|
UnicodeString.Buffer, bReachable ? L"TRUE" : L"FALSE");
|
||
|
|
||
|
RtlFreeUnicodeString(&UnicodeString);
|
||
|
|
||
|
#else // !SENS_CHICAGO
|
||
|
|
||
|
bReachable = IsDestinationReachableA(argv[1], &QOCInfo);
|
||
|
|
||
|
printf(" IsDestinationReachableA(%s, QOC) returned %s\n",
|
||
|
argv[1], bReachable ? "TRUE" : "FALSE");
|
||
|
#endif // SENS_CHICAGO
|
||
|
|
||
|
if (bReachable)
|
||
|
{
|
||
|
printf(" QOCInfo\n");
|
||
|
printf(" o dwSize = 0x%x \n", QOCInfo.dwSize);
|
||
|
printf(" o dwFlags = 0x%x \n", QOCInfo.dwFlags);
|
||
|
printf(" o dwInSpeed = %d bits/sec.\n", QOCInfo.dwInSpeed);
|
||
|
printf(" o dwOutSpeed = %d bits/sec.\n", QOCInfo.dwOutSpeed);
|
||
|
}
|
||
|
printf(" The GetLastError() was %d\n", GetLastError());
|
||
|
|
||
|
printf("------------------------------------------------------------------"
|
||
|
"----\n");
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
#if _MSC_FULL_VER >= 13008827
|
||
|
#pragma warning(push)
|
||
|
#pragma warning(disable:4715) // Not all control paths return (due to infinite loop)
|
||
|
#endif
|
||
|
|
||
|
DWORD WINAPI
|
||
|
ThreadProc(
|
||
|
LPVOID lpvThreadNum
|
||
|
)
|
||
|
{
|
||
|
DWORD dwFlags = 0;
|
||
|
BOOL bAlive = FALSE;
|
||
|
int iThreadNum;
|
||
|
int iWait;
|
||
|
|
||
|
iThreadNum = PtrToLong(lpvThreadNum);
|
||
|
|
||
|
for (;;)
|
||
|
{
|
||
|
printf("[%2d]-----------------------------------------------------------"
|
||
|
"----\n", iThreadNum);
|
||
|
|
||
|
bAlive = IsNetworkAlive(&dwFlags);
|
||
|
|
||
|
printf("[%2d] IsNetworkAlive() returned %s\n", iThreadNum,
|
||
|
bAlive ? "TRUE" : "FALSE");
|
||
|
if (bAlive)
|
||
|
{
|
||
|
printf("[%2d] Type of connection -%s%s%s\n",
|
||
|
iThreadNum,
|
||
|
(dwFlags & NETWORK_ALIVE_WAN) ? " WAN" : "",
|
||
|
(dwFlags & NETWORK_ALIVE_AOL) ? " AOL" : "",
|
||
|
(dwFlags & NETWORK_ALIVE_LAN) ? " LAN" : "");
|
||
|
}
|
||
|
printf("[%2d] The GetLastError() was %d\n", iThreadNum, GetLastError());
|
||
|
|
||
|
iWait = rand() % gdwInterval;
|
||
|
printf("[%2d] Sleeping for %d seconds\n", iThreadNum, iWait);
|
||
|
printf("[%2d]-----------------------------------------------------------"
|
||
|
"----\n\n", iThreadNum);
|
||
|
|
||
|
Sleep(iWait * 1000);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#if _MSC_FULL_VER >= 13008827
|
||
|
#pragma warning(pop)
|
||
|
#endif
|
||
|
|
||
|
void
|
||
|
MultiThreadedTest(
|
||
|
void
|
||
|
)
|
||
|
{
|
||
|
DWORD i;
|
||
|
DWORD dwThreadId;
|
||
|
DWORD dwResult;
|
||
|
HANDLE hThread;
|
||
|
|
||
|
srand(GetTickCount());
|
||
|
|
||
|
printf("\nSENSTEST: Starting Multithreaded IsNetworkAlive Test\n"
|
||
|
"\tNumber of threads = %d\n"
|
||
|
"\tMax Wait interval = %d seconds\n\n",
|
||
|
gdwThreads, gdwInterval);
|
||
|
|
||
|
for (i = 0; i < gdwThreads; i++)
|
||
|
{
|
||
|
hThread = CreateThread(
|
||
|
NULL,
|
||
|
0,
|
||
|
ThreadProc,
|
||
|
ULongToPtr(i),
|
||
|
0,
|
||
|
&dwThreadId
|
||
|
);
|
||
|
if (NULL != hThread)
|
||
|
{
|
||
|
// Don't close the last handle.
|
||
|
if ((i+1) != gdwThreads)
|
||
|
{
|
||
|
CloseHandle(hThread);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("CreateThread(%d) failed with a GLE of %d\n", i,
|
||
|
GetLastError());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dwResult = WaitForSingleObject(hThread, INFINITE);
|
||
|
printf("WaitForSingleObject() returned %d, GLE = %d\n",
|
||
|
dwResult, GetLastError());
|
||
|
CloseHandle(hThread);
|
||
|
}
|