388 lines
9.5 KiB
C++
388 lines
9.5 KiB
C++
//+-------------------------------------------------------------------
|
||
// Microsoft OLE
|
||
// Copyright (C) Microsoft Corporation, 1994-1995.
|
||
//
|
||
// File: cmdutest.cxx
|
||
//
|
||
// Contents: Unit test for the CDebugHelp class implementation.
|
||
// Utilizes functions in arghelp.cxx and the CRegistryHelp
|
||
// class.
|
||
//
|
||
// Classes: None
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//---------------------------------------------------------------------
|
||
#include <oleworld.hxx>
|
||
|
||
|
||
// Declare the CDebugHelp object
|
||
DH_DECLARE;
|
||
|
||
|
||
// Local Functions
|
||
HRESULT SettingsTest(VOID);
|
||
HRESULT TraceTest(VOID);
|
||
HRESULT LogTest(VOID);
|
||
HRESULT AssertTest(VOID);
|
||
|
||
|
||
// Test TRACE level flags
|
||
#define DH_UTEST_LVL1 0x00001000
|
||
#define DH_UTEST_LVL2 0x08000000
|
||
|
||
|
||
// Results macros
|
||
#define TESTFAIL(msg) \
|
||
printf("FAIL: %s, %ul - %s\n", __FILE__, __LINE__, msg)
|
||
|
||
#define TESTPASS(msg) \
|
||
printf("PASS: %s\n", msg)
|
||
|
||
|
||
// Define the CDebugHelp object
|
||
DH_DEFINE;
|
||
|
||
|
||
//+---------------------------------------------------------------------
|
||
// Function: main
|
||
//
|
||
// Synopsis: Command line test utilizing a CDebugHelp object.
|
||
// Excercises Trace Location, Log Location, Trace Level,
|
||
// Trace and Log output, and Assert functionality. Uses
|
||
// a log created via DH_CREATELOGARGS.
|
||
//
|
||
// Arguments: [argc] - Number of command line arguments.
|
||
// [argv] - Command line arguments.
|
||
//
|
||
// Returns: Zero if no errors, otherwise non-zero
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//----------------------------------------------------------------------
|
||
int _cdecl main(int argc, char *argv[])
|
||
{
|
||
HRESULT hr;
|
||
|
||
// First, create a log
|
||
hr = DH_CREATELOGARGS(argc, argv);
|
||
if (FAILED(hr))
|
||
{
|
||
printf("Log creation failed - %lx\n", hr);
|
||
return(1);
|
||
}
|
||
|
||
// Set & retrieve settings
|
||
hr = SettingsTest();
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
TESTPASS("Debug settings");
|
||
}
|
||
else
|
||
{
|
||
TESTFAIL("Debug settings");
|
||
return(1);
|
||
}
|
||
|
||
// Trace output macro tests
|
||
hr = TraceTest();
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
TESTPASS("Trace Output");
|
||
}
|
||
else
|
||
{
|
||
TESTFAIL("Trace Output");
|
||
return(1);
|
||
}
|
||
|
||
// Logging output macro tests
|
||
hr = LogTest();
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
TESTPASS("Log Output");
|
||
}
|
||
else
|
||
{
|
||
TESTFAIL("Log Output");
|
||
return(1);
|
||
}
|
||
|
||
// Assert tests
|
||
hr = AssertTest();
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
TESTPASS("Assert Test");
|
||
}
|
||
else
|
||
{
|
||
TESTFAIL("Assert Test");
|
||
return(1);
|
||
}
|
||
|
||
return(0);
|
||
}
|
||
|
||
|
||
//+---------------------------------------------------------------------
|
||
// Function: SettingsTest
|
||
//
|
||
// Synopsis: Sets and checks (by retrieving) values in the
|
||
// global CDebugHelp object. Assumes a log has been
|
||
// created.
|
||
//
|
||
// Arguments: None.
|
||
//
|
||
// Returns: S_OK if test passes, error code if not.
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//----------------------------------------------------------------------
|
||
HRESULT SettingsTest()
|
||
{
|
||
HRESULT hr;
|
||
DWORD fValues;
|
||
|
||
// Set and check Trace Location
|
||
// Set a valid setting - should succeed
|
||
//
|
||
hr = DH_SETTRACELOC(DH_LOC_STDOUT);
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
fValues = DH_GETTRACELOC;
|
||
hr = (fValues & DH_LOC_STDOUT) ? S_OK : E_FAIL;
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETTRACELOC test - valid setting");
|
||
}
|
||
|
||
|
||
// Set an invalid setting - should fail
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
hr = DH_SETTRACELOC(DH_LOC_NONE);
|
||
if (FAILED(hr))
|
||
{
|
||
hr = S_OK;
|
||
}
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETTRACELOC test - invalid setting");
|
||
return(hr);
|
||
}
|
||
|
||
// Set and check Log Location
|
||
// Set a valid setting - should succeed
|
||
//
|
||
hr = DH_SETLOGLOC(DH_LOC_STDOUT|DH_LOC_LOG);
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
fValues = DH_GETLOGLOC;
|
||
hr = (fValues & DH_LOC_STDOUT) &&
|
||
(fValues & DH_LOC_LOG) ? S_OK : E_FAIL;
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETLOGLOC test - valid setting");
|
||
}
|
||
|
||
// Set an invalid setting - should fail
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
hr = DH_SETLOGLOC(DH_LOC_NONE);
|
||
if (FAILED(hr))
|
||
{
|
||
hr = S_OK;
|
||
}
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETLOGLOC test - invalid setting");
|
||
return(hr);
|
||
}
|
||
|
||
|
||
// Set and check Trace Level
|
||
// Set a valid level - should succeed
|
||
//
|
||
hr = DH_SETLVL(DH_UTEST_LVL1|DH_LVL_TRACE1);
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
fValues = DH_GETTRACELVL;
|
||
hr = (fValues & DH_UTEST_LVL1) &&
|
||
(fValues & DH_LVL_TRACE1) ? S_OK : E_FAIL;
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETLVL test - valid setting");
|
||
}
|
||
|
||
// Try to turn one of the reserved settings off - should fail
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
hr = DH_SETLVL(DH_GETTRACELVL&~DH_LVL_ERROR);
|
||
if (SUCCEEDED(hr))
|
||
{
|
||
fValues = DH_GETTRACELVL;
|
||
hr = (fValues & DH_LVL_ERROR) ? S_OK : E_FAIL;
|
||
}
|
||
}
|
||
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("DH_SETLVL - turn reserved off");
|
||
}
|
||
|
||
return(hr);
|
||
}
|
||
|
||
|
||
//+---------------------------------------------------------------------
|
||
// Function: TraceTest
|
||
//
|
||
// Synopsis: Tests TRACE macro outputs of the global CDebugHelp object.
|
||
//
|
||
// Arguments: None.
|
||
//
|
||
// Returns: S_OK if test passes, error code if not.
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//----------------------------------------------------------------------
|
||
HRESULT TraceTest()
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Set the Trace Location to STDOUT and the debug terminal so we
|
||
// can see messages
|
||
//
|
||
hr = DH_SETTRACELOC(DH_LOC_STDOUT|DH_LOC_TERM);
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("Cannot set test trace location");
|
||
return(hr);
|
||
}
|
||
|
||
printf("Six messages should appear\n");
|
||
|
||
// Set a level that should NOT produce a message...
|
||
hr = DH_SETLVL(DH_UTEST_LVL2);
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("Failure setting test trace level");
|
||
return(hr);
|
||
}
|
||
|
||
// Output a message at a level NOT set
|
||
DH_TRACE((DH_UTEST_LVL1, TEXT("ERROR! Message should not appear!")));
|
||
|
||
// Output simple messages that should appear
|
||
DH_TRACE((DH_LVL_ALWAYS, TEXT("Sample ALWAYS message")));
|
||
DH_TRACE((DH_LVL_ERROR, TEXT("Sample ERROR message")));
|
||
DH_TRACE((DH_UTEST_LVL2, TEXT("Sample USER-DEFINED message")));
|
||
|
||
// Output complex messages
|
||
DH_TRACE((DH_LVL_ALWAYS,
|
||
TEXT("ALWAYS - Expansion File: %s, Line: %lu"),
|
||
TEXT(__FILE__),
|
||
__LINE__));
|
||
|
||
// Output messages with multiple levels set
|
||
hr = DH_SETLVL(DH_UTEST_LVL2 | DH_UTEST_LVL1);
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("Failure setting multiple trace levels");
|
||
return(hr);
|
||
}
|
||
DH_TRACE((DH_UTEST_LVL1,
|
||
TEXT("Sample MULTI-USER-DEFINED message value: %lx"),
|
||
DH_UTEST_LVL1));
|
||
DH_TRACE((DH_UTEST_LVL2,
|
||
TEXT("Sample MULTI-USER-DEFINED message value: %lx"),
|
||
DH_UTEST_LVL2));
|
||
DH_TRACE((DH_LVL_TRACE4,
|
||
TEXT("ERROR! Message TRACE4 should not appear!")));
|
||
|
||
return(hr);
|
||
}
|
||
|
||
|
||
//+---------------------------------------------------------------------
|
||
// Function: LogTest
|
||
//
|
||
// Synopsis: Tests LOG macro outputs of the global CDebugHelp object.
|
||
//
|
||
// Arguments: None.
|
||
//
|
||
// Returns: S_OK if test passes, error code if not.
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//----------------------------------------------------------------------
|
||
HRESULT LogTest()
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Set the Log Location to STDOUT, the log, and the debug
|
||
// terminal so we can see messages
|
||
//
|
||
hr = DH_SETLOGLOC(DH_LOC_STDOUT|DH_LOC_TERM|DH_LOC_LOG);
|
||
if (FAILED(hr))
|
||
{
|
||
TESTFAIL("Cannot set test log location");
|
||
return(hr);
|
||
}
|
||
|
||
// Report a simple PASS, complex FAIL, and statistics
|
||
DH_LOG((LOG_PASS, TEXT("Simple sample PASS")));
|
||
DH_LOG((LOG_FAIL,
|
||
TEXT("Complex sample FAIL %s, %lu"),
|
||
TEXT(__FILE__),
|
||
__LINE__));
|
||
|
||
printf("Correct totals: 1 PASS, 1 FAIL, 0 ABORT\n");
|
||
|
||
DH_LOGSTATS;
|
||
|
||
return(hr);
|
||
}
|
||
|
||
|
||
//+---------------------------------------------------------------------
|
||
// Function: AssertTest
|
||
//
|
||
// Synopsis: Tests ASSERT macro outputs of the global CDebugHelp object.
|
||
//
|
||
// Arguments: None.
|
||
//
|
||
// Returns: S_OK if test passes, error code if not.
|
||
//
|
||
// History: 28-Nov-94 DeanE Created
|
||
//----------------------------------------------------------------------
|
||
HRESULT AssertTest()
|
||
{
|
||
#pragma warning(disable: 4127) // Examined and ignored
|
||
|
||
// Set Lab Mode to ON - we should NOT get any popups
|
||
DH_SETMODE(DH_LABMODE_ON);
|
||
|
||
// Trigger an assert
|
||
DH_ASSERT(!"LABMODE ON - NO POPUP SHOULD APPEAR");
|
||
|
||
|
||
// Set Lab Mode to ON - we should get popups
|
||
DH_SETMODE(DH_LABMODE_OFF);
|
||
|
||
// This assert should NOT trigger
|
||
DH_ASSERT(5 < 6);
|
||
|
||
// Set Lab Mode to OFF - we should get a popup
|
||
DH_ASSERT(!"LABMODE OFF - POPUP SHOULD APPEAR");
|
||
|
||
#pragma warning(default: 4127) // Examined and ignored
|
||
|
||
return(S_OK);
|
||
}
|
||
|