175 lines
4.2 KiB
C++
175 lines
4.2 KiB
C++
|
|
#include "stdafx.h"
|
|
#include "shelldrt.h"
|
|
|
|
// g_aTestDlls
|
|
//
|
|
// The array of tests that we are available to be run
|
|
|
|
vector<SHTESTDESCRIPTOR> g_aTests;
|
|
vector<HMODULE> g_ahTestDlls;
|
|
|
|
// usage
|
|
//
|
|
// Displays program usage instructions. Does NOT exit on its own.
|
|
|
|
void usage()
|
|
{
|
|
_ftprintf(stderr, TEXT("\nSHELLDRT: Shell Developer Regression Tests\n")
|
|
TEXT("---------------------------------------------------------------------\n")
|
|
TEXT("Usage: SHELLDRT -h [[testdll1] ...]\n")
|
|
TEXT("\n")
|
|
TEXT("Where: -h Help (this list)\n"));
|
|
}
|
|
|
|
// AddTestsFromDll
|
|
//
|
|
// Given the name of a test dll, loads it and queries it for the tests it contains,
|
|
// adding them to the mix.
|
|
|
|
bool AddTestsFromDll(LPCTSTR pszDllName)
|
|
{
|
|
HMODULE hMod = LoadLibrary(pszDllName);
|
|
if (!hMod)
|
|
return false;
|
|
|
|
g_ahTestDlls.push_back( hMod );
|
|
|
|
SHTESTLISTPROC pfnListTests = (SHTESTLISTPROC) GetProcAddress(hMod, "ListTestProcs");
|
|
if (!pfnListTests)
|
|
{
|
|
_ftprintf(stderr, TEXT("SHELLDRT: Test dll %s does not expose the ListTestProcs entry point.\n"), pszDllName);
|
|
return false;
|
|
}
|
|
|
|
DWORD cTests = pfnListTests(NULL);
|
|
if (!cTests)
|
|
{
|
|
_ftprintf(stderr, TEXT("SHELLDRT: Test dll %s exposes no tests.\n"), pszDllName);
|
|
return false;
|
|
}
|
|
|
|
AutoPtr<SHTESTDESCRIPTOR> spDescriptors = new SHTESTDESCRIPTOR[cTests];
|
|
|
|
if (cTests != pfnListTests(spDescriptors))
|
|
{
|
|
fprintf(stderr, "SHELLDRT: Test dll %s advertised %d tests but did not supply them all.\n", pszDllName, cTests);
|
|
return false;
|
|
}
|
|
|
|
for (DWORD i = 0; i < cTests; i++)
|
|
g_aTests.push_back(spDescriptors[i]);
|
|
|
|
return true;
|
|
}
|
|
|
|
// AddTestsFromLocalDir
|
|
//
|
|
// Looks in the current directory for test dlls and adds them to the array
|
|
|
|
void AddTestsFromLocalDir()
|
|
{
|
|
WIN32_FIND_DATA finddata;
|
|
AutoFindHandle spFindHandle;
|
|
BOOL fHaveFile = TRUE;
|
|
|
|
for (spFindHandle = FindFirstFile(TEXT("shdrt-*.dll"), &finddata); (INVALID_HANDLE_VALUE != spFindHandle) && fHaveFile;
|
|
fHaveFile = FindNextFile(spFindHandle, &finddata))
|
|
{
|
|
if (!AddTestsFromDll(finddata.cFileName))
|
|
{
|
|
_ftprintf(stderr, TEXT("SHELLDRT: Cannot load test dll %s [Err: %08dX]\n"), finddata.cFileName, GetLastError());
|
|
ExitProcess(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
// RunTests
|
|
//
|
|
// Loops through the loaded tests and
|
|
|
|
bool RunTests()
|
|
{
|
|
for (DWORD i = 0; i < g_aTests.size(); i++)
|
|
{
|
|
_ftprintf(stdout, TEXT("Starting Test : %s\n"), g_aTests[i]._pszTestName);
|
|
if (g_aTests[i]._pfnTestProc())
|
|
{
|
|
_ftprintf(stdout, TEXT("Success : %s\n"), g_aTests[i]._pszTestName);
|
|
}
|
|
else
|
|
{
|
|
_ftprintf(stderr, TEXT("** FAILURE ** : %s\n"), g_aTests[i]._pszTestName);
|
|
return false;
|
|
}
|
|
}
|
|
_ftprintf(stdout, TEXT("++ SUCCESS ++\n"));
|
|
return true;
|
|
}
|
|
|
|
// main
|
|
//
|
|
// Program entry point
|
|
|
|
#ifdef UNICODE
|
|
extern "C"
|
|
{
|
|
int __cdecl wmain(int argc, wchar_t* argv[])
|
|
{
|
|
#else
|
|
int __cdecl main(int argc, char* argv[])
|
|
{
|
|
#endif
|
|
LPTSTR p;
|
|
|
|
argc--;
|
|
argv++;
|
|
|
|
while ( argc-- > 0 )
|
|
{
|
|
p = *argv++;
|
|
if ( *p == '-' || *p == '/' )
|
|
{
|
|
p++;
|
|
switch ( tolower(*p) )
|
|
{
|
|
case 'h':
|
|
usage();
|
|
ExitProcess(0);
|
|
|
|
default:
|
|
usage();
|
|
ExitProcess(0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!AddTestsFromDll(p))
|
|
{
|
|
_ftprintf(stderr, TEXT("SHELLDRT: Cannot load test dll %s [Err: %08dX]\n"), p, GetLastError());
|
|
ExitProcess(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
// If no tests were specified manually on the command line, look for
|
|
// them in the current directory
|
|
|
|
if (0 == g_aTests.size())
|
|
AddTestsFromLocalDir();
|
|
|
|
// If still no tests, there's nothing to do
|
|
|
|
if (0 == g_aTests.size())
|
|
{
|
|
_ftprintf(stderr, TEXT("SHELLDRT: No tests specified and none found in current directory.\n"));
|
|
usage();
|
|
ExitProcess(0);
|
|
}
|
|
|
|
return RunTests();
|
|
}
|
|
#ifdef UNICODE
|
|
}
|
|
#endif
|