2025-11-28 00:35:46 +09:00

3291 lines
84 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright (C) 1995-2000 Microsoft Corporation
//
// @doc
//
// @module SCOPEDCMD.CPP | SCOPEDCMD source file for all test modules.
//
#define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H
#define INITGUID
#include "modstandard.hpp"
#include "SCOPEDCMD.h"
#include "ExtraLib.h"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0x6bf08870, 0x798f, 0x11d2, { 0xaf, 0x40, 0x00, 0xc0, 0x4f, 0x78, 0x29, 0x26} };
DECLARE_MODULE_NAME("ScopedCmd");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("Scoped Command Test");
DECLARE_MODULE_VERSION(795921705);
// TCW_WizardVersion(2)
// TCW_Automation(True)
// }} TCW_MODULE_GLOBALS_END
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Globals
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CTree * g_pTree = NULL;
IUnknown * pUnkSession = NULL;
BOOL g_fResetIniFile = FALSE;
CTable *g_pConfProvTable2 = NULL;
CTree *g_pConfProvTree2 = NULL;
const CLSID CLSID_ConfProv = {0xb2a233c1, 0x5b20, 0x11d0, {0x84, 0x18, 0x0, 0xaa, 0x00, 0x3f, 0xd, 0xd4}};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Base Class Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @class CScopedCmd
// @base public | CCommandObject
//
class CScopedCmd : public CSessionObject
{
protected:
// Root Row Object
CRowObject * m_pCRootRowObj;
// IDBCreateCommand object
IDBCreateCommand * m_pIDBCreateCommand;
// Keeps track of the Root Row Object's Session
IUnknown * m_pIRowSession;
// Tree Object
CTree * m_pTree;
// Alter way IBindResource is obtained.
BOOL m_fUseSessionBinder;
// @cmember Constructor
CScopedCmd(LPWSTR wszTestCaseName) : CSessionObject (wszTestCaseName) { };
// @cmember Constructor
virtual ~CScopedCmd() {};
//@cmember Init
BOOL Init();
//@cmember Terminate
BOOL Terminate();
//@cmember Get tree member's root row object
IRow * GetRootRow();
//@cmember Recurse through every level in m_pTree
BOOL VerifyRowAndChildren(CRowObject *pCRowObject, CSchema* pSchema);
//@cmember Create a command object
BOOL CreateCommand
(
REFIID iid,
IUnknown** ppIUnknownCommand,
IUnknown* pIUnknownSession = NULL
);
//@cmember Set a scoped query text (e.g. select * from scope())
HRESULT SetScopedCmdTxt(IUnknown* pIUnknownCommand, EQUERY eQuery);
//@cmember Set command text
HRESULT SetCmdTxt(IUnknown* pIUnknownCommand, WCHAR *pwszCmd);
//@cmember Prepares a command
HRESULT PrepareCmd(IUnknown* pIUnknownCommand, ULONG cExpectedRuns);
//@cmember UnPrepares a command
HRESULT UnPrepareCmd(IUnknown* pIUnknownCommand);
//@cmember Checks session object against Root Row Session
BOOL VerifyRowSession(IUnknown* pIUnknownSession);
//@cmember Checks equality of two command objects
BOOL VerifyEqualCommands(IUnknown* pIUnkCmd1, IUnknown* pIUnkCmd2);
//@cmember Iterates through Session interfaces
HRESULT TestGetDBSession(ICommand* pICmd);
//@cmember Checks GetDBSession for multiple commands
HRESULT TestMultipleCommands(ULONG cCmds);
//@cmember Checks rowset creation using cmds from mult rows
BOOL TestMultipleRowObjects(ULONG cRows);
public:
//@cmember Alter way the tests obtains the IBindResource interface
virtual void SetTestCaseParam(BOOL fUseSessionBinder)
{
m_fUseSessionBinder = fUseSessionBinder;
}
// Command/Execute thread variations
static ULONG WINAPI Thread_Cancel(LPVOID pv);
static ULONG WINAPI Thread_Execute(LPVOID pv);
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @cmember Init
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BOOL CScopedCmd::Init()
{
IRow * pIRootRow;
BOOL fPass = FALSE;
if (COLEDB::Init())
{
SetDBSession(pUnkSession);
m_pCRootRowObj = new CRowObject;
TESTC(m_pCRootRowObj != NULL);
pIRootRow = GetRootRow();
TESTC_(m_pCRootRowObj->SetRowObject(pIRootRow),S_OK);
fPass = TRUE;
}
CLEANUP:
SAFE_RELEASE(pIRootRow);
return fPass;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @cmember Terminate
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BOOL CScopedCmd::Terminate()
{
ReleaseDBSession();
SAFE_DELETE(m_pCRootRowObj);
return(COLEDB::Terminate());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @cmember GetRootRow
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IRow * CScopedCmd::GetRootRow()
{
IRow * pIRow = NULL;
IBindResource * pIBindResource = NULL;
WCHAR * pwszRowURL = NULL;
DBBINDSTATUS dwBindStatus;
ASSERT(g_pTree);
pwszRowURL = g_pTree->GetRootURL();
TESTC(NULL != pwszRowURL);
if( m_fUseSessionBinder )
{
TESTC_(GetSessionObject(IID_IBindResource, (IUnknown **)&pIBindResource), S_OK);
}
else
{
pIBindResource = GetModInfo()->GetRootBinder();
SAFE_ADDREF(pIBindResource);
}
TESTC(NULL != pIBindResource);
TESTC_(pIBindResource->Bind(NULL, pwszRowURL, DBBINDURLFLAG_READ, DBGUID_ROW,
IID_IRow, NULL, NULL, &dwBindStatus, (IUnknown **)&pIRow), S_OK);
TESTC(dwBindStatus == DBBINDURLSTATUS_S_OK);
CLEANUP:
SAFE_RELEASE(pIBindResource);
return pIRow;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @cmember VerifyRowAndChildren
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BOOL CScopedCmd::VerifyRowAndChildren(CRowObject* pCParentRowObject, CSchema* pSchema)
{
BOOL fSuccess = TEST_FAIL;
IRowset * pIRowset = NULL;
IColumnsInfo * pIColumnsInfo = NULL;
DBCOUNTITEM cRowsetCols = 0;
DBCOLUMNINFO * rgRowsetColInfo = NULL;
DBORDINAL * rgRowsetColOrdinals = NULL;
WCHAR * pStringsBuffer = NULL;
HROW * rghRows = NULL;
HRESULT hr;
CRowObject ChildRowObj;
ULONG_PTR cIter;
ULONG_PTR ulRow = 0;
DBCOUNTITEM cRowsObtained = 0;
DBREFCOUNT RefCount = 0;
DBROWSTATUS RowStatus = DBROWSTATUS_E_FAIL;
if (pCParentRowObject->pIDBCreateCommand() == NULL)
{
fSuccess = TEST_SKIPPED;
odtLog << L"Row object doesn't support scoped commands." << ENDL;
goto CLEANUP;
}
TESTC_(hr = pCParentRowObject->ExecuteCommand
(
SHALLOW_SCOPED_SELECT,
IID_IRowset,
0,
NULL,
(IUnknown **)&pIRowset
), S_OK);
TESTC(pIRowset != NULL);
TESTC(VerifyInterface(pIRowset, IID_IColumnsInfo, ROWSET_INTERFACE,
(IUnknown **)&pIColumnsInfo));
TESTC_(pIColumnsInfo->GetColumnInfo(&cRowsetCols, &rgRowsetColInfo, &pStringsBuffer), S_OK);
rgRowsetColOrdinals = (DBORDINAL *)PROVIDER_ALLOC(sizeof(DBORDINAL) * cRowsetCols);
for(cIter = 0; cIter < cRowsetCols; cIter++)
{
rgRowsetColOrdinals[cIter] = rgRowsetColInfo[cIter].iOrdinal;
}
hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows);
if (hr == DB_S_ENDOFROWSET)
{
// leaf node
fSuccess = TEST_PASS;
goto CLEANUP;
}
TESTC_(hr, S_OK);
do
{
TESTC(cRowsObtained == 1);
TESTC(pSchema != NULL);
TESTC_(ChildRowObj.CreateRowObject(pIRowset, rghRows[0]),S_OK)
TESTC(ChildRowObj.VerifyGetColumns(ulRow, pSchema,
UPDATEABLE_NONINDEX_COLS_BOUND | USE_COLS_TO_BIND_ARRAY, NO_BLOB_COLS,
FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, cRowsetCols, rgRowsetColOrdinals));
m_pTree->MoveDownToChildNode(ulRow);
TESTC(VerifyRowAndChildren(&ChildRowObj,reinterpret_cast<CSchema*>(m_pTree->GetCurrentSchema())));
m_pTree->ReturnFromChildNode();
ChildRowObj.ReleaseRowObject();
TESTC_(hr =pIRowset->ReleaseRows(1, rghRows, NULL, &RefCount, &RowStatus), S_OK);
COMPARE(RefCount, 0);
COMPARE(RowStatus, DBROWSTATUS_S_OK);
SAFE_FREE(rghRows);
ulRow++;
hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows);
} while (hr == S_OK);
TESTC_(hr, DB_S_ENDOFROWSET);
fSuccess = TEST_PASS;
CLEANUP:
SAFE_FREE(rgRowsetColOrdinals);
SAFE_FREE(rgRowsetColInfo);
SAFE_FREE(pStringsBuffer);
SAFE_FREE(rghRows);
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pIRowset)
return fSuccess;
}
//-------------------------------------------------------------------
// CreateCommand
//--------------------------------------------------------------------
BOOL CScopedCmd::CreateCommand
(
REFIID iid, // [OUT] IID for command
IUnknown** ppIUnknownCommand, // [OUT] command pointer
IUnknown* pIUnknownSessionRow // [IN] session object
)
{
BOOL fResult = FALSE;
IDBCreateCommand* pSession = NULL;
ASSERT(ppIUnknownCommand);
// If no session specified, just use m_pIDBCreateCommand
if(pIUnknownSessionRow)
{
TESTC(VerifyInterface(pIUnknownSessionRow, IID_IDBCreateCommand,
SESSION_INTERFACE, (IUnknown**)&pSession));
TESTC_(pSession->CreateCommand(NULL,iid,ppIUnknownCommand),S_OK);
}
else
{
TESTC_(m_pIDBCreateCommand->CreateCommand(NULL,iid,ppIUnknownCommand),S_OK);
}
fResult = TRUE;
CLEANUP:
SAFE_RELEASE(pSession);
return fResult;
}
//-------------------------------------------------------------------
// SetScopedCmdText
//--------------------------------------------------------------------
HRESULT CScopedCmd::SetScopedCmdTxt(IUnknown* pIUnknownCommand, EQUERY eQuery)
{
HRESULT hr = E_FAIL;
WCHAR* pwszCmd = NULL;
ICommandText* pICommandText=NULL;
ASSERT(pIUnknownCommand);
// Get commandtext interface
if (!VerifyInterface(pIUnknownCommand, IID_ICommandText, COMMAND_INTERFACE, (IUnknown**)&pICommandText))
{
hr = E_NOINTERFACE;
goto CLEANUP;
}
pwszCmd = FetchRowScopedQuery(eQuery);
TESTC(pwszCmd != NULL);
// Set text
hr = pICommandText->SetCommandText(DBGUID_DEFAULT,pwszCmd);
CLEANUP:
SAFE_RELEASE(pICommandText);
return hr;
}
//-------------------------------------------------------------------
// SetCmdText
//--------------------------------------------------------------------
HRESULT CScopedCmd::SetCmdTxt(IUnknown* pIUnknownCommand, WCHAR *pwszCmd)
{
HRESULT hr = E_FAIL;
ICommandText* pICommandText=NULL;
ASSERT(pIUnknownCommand);
// Get commandtext interface
if (!VerifyInterface(pIUnknownCommand, IID_ICommandText, COMMAND_INTERFACE, (IUnknown**)&pICommandText))
{
hr = E_NOINTERFACE;
goto CLEANUP;
}
// Set text
hr = pICommandText->SetCommandText(DBGUID_DEFAULT,pwszCmd);
CLEANUP:
SAFE_RELEASE(pICommandText);
return hr;
}
//-------------------------------------------------------------------
// PrepareCmd
//-------------------------------------------------------------------
HRESULT CScopedCmd::PrepareCmd(IUnknown* pIUnknownCommand, ULONG cExpectedRuns)
{
HRESULT hr = E_FAIL;
ICommandPrepare* pICommandPrepare=NULL;
ASSERT(pIUnknownCommand);
// Get commandtext interface
if (!VerifyInterface(pIUnknownCommand, IID_ICommandPrepare, COMMAND_INTERFACE, (IUnknown**)&pICommandPrepare))
{
hr = E_NOINTERFACE;
goto CLEANUP;
}
// Set text
hr = pICommandPrepare->Prepare(cExpectedRuns);
CLEANUP:
SAFE_RELEASE(pICommandPrepare);
return hr;
}
//-------------------------------------------------------------------
// UnPrepareCmd
//-------------------------------------------------------------------
HRESULT CScopedCmd::UnPrepareCmd(IUnknown* pIUnknownCommand)
{
HRESULT hr = E_FAIL;
ICommandPrepare* pICommandPrepare=NULL;
ASSERT(pIUnknownCommand);
// Get commandtext interface
if (!VerifyInterface(pIUnknownCommand, IID_ICommandPrepare, COMMAND_INTERFACE, (IUnknown**)&pICommandPrepare))
{
hr = E_NOINTERFACE;
goto CLEANUP;
}
// Set text
hr = pICommandPrepare->Unprepare();
CLEANUP:
SAFE_RELEASE(pICommandPrepare);
return hr;
}
//--------------------------------------------------------------------
// VerifyRowSession
//
// Checks session object against Root Row Session
//--------------------------------------------------------------------
BOOL CScopedCmd::VerifyRowSession(IUnknown* pIUnknownSession)
{
BOOL fSame = FALSE;
TESTC(VerifyEqualInterface(pIUnknownSession, m_pIRowSession));
TESTC(DefaultObjectTesting(pIUnknownSession, SESSION_INTERFACE));
fSame = TRUE;
CLEANUP:
return fSame;
}
//--------------------------------------------------------------------
// VerifyRowSession
//
// Checks equality of two commands
//--------------------------------------------------------------------
BOOL CScopedCmd::VerifyEqualCommands
(
IUnknown* pIUnknownCmd1,
IUnknown* pIUnknownCmd2
)
{
BOOL fSame = FALSE;
TESTC(VerifyEqualInterface(pIUnknownCmd1, pIUnknownCmd2));
TESTC(DefaultObjectTesting(pIUnknownCmd1, COMMAND_INTERFACE));
fSame = TRUE;
CLEANUP:
return fSame;
}
//--------------------------------------------------------------------
// CScopedCmd::TestGetDBSession
//
//--------------------------------------------------------------------
HRESULT CScopedCmd::TestGetDBSession(ICommand* pICmd)
{
HRESULT hr;
IUnknown* pIUnknown = NULL;
ULONG i = 0;
ULONG cSessionIIDs = 0;
INTERFACEMAP* rgSessionIIDs = NULL;
//Obtain the Session Interfaces..
GetInterfaceArray(SESSION_INTERFACE, &cSessionIIDs, &rgSessionIIDs);
//For every [MANDATORY] interface, try to get the parent Session object...
for(i=0; i<cSessionIIDs; i++)
{
//ICommand::GetDBSession
hr = pICmd->GetDBSession(*rgSessionIIDs[i].pIID, (IUnknown**)&pIUnknown);
if (hr == DB_E_NOSOURCEOBJECT || hr == S_FALSE)
{
TWARNING(L"This command does not have a session");
}
//Determine results
if(rgSessionIIDs[i].fMandatory)
{
//[MANDATORY]
if(hr!=S_OK && hr!=DB_E_NOSOURCEOBJECT && hr!=S_FALSE)
{
CHECK(hr, S_OK);
TOUTPUT_(L"ERROR: Interface Incorrect for " << GetInterfaceName(*rgSessionIIDs[i].pIID) << "\n");
}
// Match against what we know to be the command's session
VerifyRowSession(pIUnknown);
}
else
{
//[OPTIONAL]
if(hr!=S_OK && hr!=DB_E_NOSOURCEOBJECT && hr!=S_FALSE && hr!=E_NOINTERFACE)
{
CHECK(hr, S_OK);
TOUTPUT_(L"ERROR: Interface Incorrect for " << GetInterfaceName(*rgSessionIIDs[i].pIID) << "\n");
}
}
SAFE_RELEASE(pIUnknown);
}
return S_OK;
}
//--------------------------------------------------------------------
// CScopedCmd::TestMultipleCommands
//
//--------------------------------------------------------------------
HRESULT CScopedCmd::TestMultipleCommands(ULONG cCmds)
{
ICommand** rgpICommands = NULL;
IUnknown* pIUnknown = NULL;
ULONG ulCmd;
//Create cCmds number of commands
SAFE_ALLOC(rgpICommands, ICommand*, cCmds);
memset(rgpICommands, 0, cCmds * sizeof(ICommand*));
for(ulCmd=0; ulCmd<cCmds; ulCmd++)
{
//Create the Command
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&(rgpICommands[ulCmd])));
TESTC(rgpICommands[ulCmd] != NULL);
TEST3C_(rgpICommands[ulCmd]->GetDBSession(IID_IUnknown, &pIUnknown), S_OK, S_FALSE, DB_E_NOSOURCEOBJECT);
if(pIUnknown)
{
//Make sure its returning the original object
TESTC(VerifyEqualInterface(pIUnknown, m_pIRowSession));
}
SAFE_RELEASE(pIUnknown);
}
CLEANUP:
for(ulCmd=0; ulCmd<cCmds; ulCmd++)
SAFE_RELEASE(rgpICommands[ulCmd]);
SAFE_RELEASE(pIUnknown);
SAFE_FREE(rgpICommands);
return S_OK;
}
//--------------------------------------------------------------------
// CScopedCmd::TestMultipleRowObjects
//
//--------------------------------------------------------------------
BOOL CScopedCmd::TestMultipleRowObjects(ULONG cRows)
{
CRowObject** rgpCRowObjects = NULL;
IUnknown* pIUnknown = NULL;
IRowset* pIRowset = NULL;
IRowset** rgpIRowsets = NULL;
HROW* rghRows = NULL;
DBCOUNTITEM cRowsCreated = 0;
DBCOUNTITEM cRowsObtained = 0;
ULONG_PTR ulRow = 0;
BOOL fSuccess = TEST_FAIL;
// Looks at the Root Row's rowset.
// Try to instantiate up to "cRows"# of Row objects
SAFE_ALLOC(rgpCRowObjects, CRowObject*, cRows);
SAFE_ALLOC(rgpIRowsets, IRowset*, cRows);
memset(rgpCRowObjects, 0, cRows * sizeof(CRowObject*));
memset(rgpIRowsets, 0, cRows * sizeof(IRowset*));
TESTC_(m_hr = m_pCRootRowObj->ExecuteCommand
(
SHALLOW_SCOPED_SELECT,
IID_IRowset,
0,
NULL,
(IUnknown **)&pIRowset
), S_OK);
TESTC(pIRowset != NULL);
while(cRowsCreated<cRows &&
pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows) == S_OK)
{
COMPARE(cRowsObtained,1);
rgpCRowObjects[cRowsCreated] = new CRowObject;
TESTC_(rgpCRowObjects[cRowsCreated]->CreateRowObject(pIRowset, rghRows[0]),S_OK);
SAFE_FREE(rghRows);
cRowsCreated++;
}
if (cRowsCreated == 0)
{
CHECK(m_hr, DB_S_ENDOFROWSET);
fSuccess = TEST_SKIPPED;
goto CLEANUP;
}
//Create a command for each Row Object we have
for(ulRow=0; ulRow<cRowsCreated; ulRow++)
{
TESTC_(m_hr = rgpCRowObjects[ulRow]->ExecuteCommand
(
SHALLOW_SCOPED_SELECT,
IID_IRowset,
0,
NULL,
(IUnknown **)&(rgpIRowsets[ulRow])
), S_OK);
TESTC(DefaultObjectTesting(rgpIRowsets[ulRow],ROWSET_INTERFACE));
}
fSuccess = TEST_PASS;
CLEANUP:
for(ulRow=0; ulRow<cRowsCreated; ulRow++)
{
SAFE_RELEASE(rgpIRowsets[ulRow]);
SAFE_DELETE(rgpCRowObjects[ulRow]);
}
SAFE_RELEASE(pIUnknown);
SAFE_RELEASE(pIRowset);
SAFE_FREE(rgpIRowsets);
SAFE_FREE(rgpCRowObjects)
return fSuccess;
}
//--------------------------------------------------------------------
// Execute
//
//--------------------------------------------------------------------
ULONG CScopedCmd::Thread_Execute(LPVOID pv)
{
THREAD_BEGIN
ASSERT(pv);
//Thread Stack Variables
CScopedCmd* pThis = (CScopedCmd*)THREAD_FUNC;
ICommand* pICommand = (ICommand *)THREAD_ARG1;
HRESULT hr = *(HRESULT *)THREAD_ARG2; // expected result
HRESULT hrOptionalResult = *(HRESULT *)THREAD_ARG3; // Alternate expected result
//Local Variables
IRowset* pIRowset = NULL;
DBROWCOUNT cRowsAffected = -111;
HRESULT hrReturnResult = E_FAIL;
ThreadSwitch(); //Let the other thread(s) catch up
hrReturnResult = pICommand->Execute(NULL,IID_IRowset,NULL,&cRowsAffected,(IUnknown **)&pIRowset);
TEST2C_(hrReturnResult, hr, hrOptionalResult);
if (hrReturnResult == S_OK)
{
TESTC(pIRowset != NULL);
}
else // DB_E_CANCELED
{
TESTC(pIRowset == NULL);
}
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
SAFE_RELEASE(pIRowset);
THREAD_END(hrReturnResult);
}
//--------------------------------------------------------------------
// Cancel
//
//--------------------------------------------------------------------
ULONG CScopedCmd::Thread_Cancel(LPVOID pv)
{
THREAD_BEGIN
HRESULT hrReturnResult;
ASSERT(pv);
//Thread Stack Variables
CScopedCmd* pThis = (CScopedCmd*)THREAD_FUNC;
ICommand* pICommand = (ICommand *)THREAD_ARG1;
HRESULT hr = *(HRESULT *)THREAD_ARG2;
HRESULT hrOptionalResult = *(HRESULT *)THREAD_ARG3;
ThreadSwitch(); //Let the other thread(s) catch up
TEST2C_(hrReturnResult = pICommand->Cancel(), hr, hrOptionalResult);
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
THREAD_END(hrReturnResult);
}
// {{ TCW_TEST_CASE_MAP(Traversal)
//*-----------------------------------------------------------------------
// @class Navigate a hierarchy
//
class Traversal : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Traversal,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Complete traversal
int Variation_1();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(Traversal)
#define THE_CLASS Traversal
BEG_TEST_CASE(Traversal, CScopedCmd, L"Navigate a hierarchy")
TEST_VARIATION(1, L"Complete traversal")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Aggregation)
//*-----------------------------------------------------------------------
// @class Test Aggregation cases
//
class Aggregation : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Aggregation,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Test pIUnkOuter != NULL and refiid != IID_IUnknown
int Variation_1();
// @cmember ::Execute on row scoped command with pIUnkOuter != NULL and refiid!=IID_IUnknown
int Variation_2();
// @cmember Aggregate returned command and verify aggregation
int Variation_3();
// @cmember Aggregate returned command, get rowset and call GetSpecification
int Variation_4();
// @cmember Create command, aggregate returned rowset and verify agg
int Variation_5();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(Aggregation)
#define THE_CLASS Aggregation
BEG_TEST_CASE(Aggregation, CScopedCmd, L"Test Aggregation cases")
TEST_VARIATION(1, L"Test pIUnkOuter != NULL and refiid != IID_IUnknown")
TEST_VARIATION(2, L"::Execute on row scoped command with pIUnkOuter != NULL and refiid!=IID_IUnknown")
TEST_VARIATION(3, L"Aggregate returned command and verify aggregation")
TEST_VARIATION(4, L"Aggregate returned command, get rowset and call GetSpecification")
TEST_VARIATION(5, L"Create command, aggregate returned rowset and verify agg")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CCancel)
//*-----------------------------------------------------------------------
// @class General cases
//
class CCancel : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CCancel,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Before and After executing
int Variation_1();
// @cmember Two selects cancel during execution
int Variation_2();
// @cmember Two cmds, cancel 1 during, cancel 1 after
int Variation_3();
// @cmember Two cmds, cancel 1 before, cancel 1 during
int Variation_4();
// @cmember 1 cmd, cancel before execution
int Variation_5();
// @cmember 1 cmd obj, cancel after execution
int Variation_6();
// @cmember 1 cmd, execute, cancel, cancel
int Variation_7();
// @cmember 1 cmd, no query set, one cancel per thrd
int Variation_8();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(CCancel)
#define THE_CLASS CCancel
BEG_TEST_CASE(CCancel, CScopedCmd, L"General cases")
TEST_VARIATION(1, L"Before and After executing")
TEST_VARIATION(2, L"Two selects cancel during execution")
TEST_VARIATION(3, L"Two cmds, cancel 1 during, cancel 1 after")
TEST_VARIATION(4, L"Two cmds, cancel 1 before, cancel 1 during")
TEST_VARIATION(5, L"1 cmd, cancel before execution")
TEST_VARIATION(6, L"1 cmd obj, cancel after execution")
TEST_VARIATION(7, L"1 cmd, execute, cancel, cancel")
TEST_VARIATION(8, L"1 cmd, no query set, one cancel per thrd")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CDBSession)
//*-----------------------------------------------------------------------
// @class Test GetDBSession method
//
class CDBSession : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CDBSession,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember IRowsetInfo::GetSpecification
int Variation_1();
// @cmember Verify GetDBSession on non executed command
int Variation_2();
// @cmember E_NOINTERFACE, dso iid, valid ptr
int Variation_3();
// @cmember E_NOINTERFACE, iid_null, valid ptr
int Variation_4();
// @cmember E_INVALIDARG, valid session, ptr=NULL
int Variation_5();
// @cmember E_NOINTERFACE, row iid, valid ptr
int Variation_6();
// @cmember Multiple Command Objects
int Variation_7();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(CDBSession)
#define THE_CLASS CDBSession
BEG_TEST_CASE(CDBSession, CScopedCmd, L"Test GetDBSession method")
TEST_VARIATION(1, L"IRowsetInfo::GetSpecification")
TEST_VARIATION(2, L"Verify GetDBSession on non executed command")
TEST_VARIATION(3, L"E_NOINTERFACE, dso iid, valid ptr")
TEST_VARIATION(4, L"E_NOINTERFACE, iid_null, valid ptr")
TEST_VARIATION(5, L"E_INVALIDARG, valid session, ptr=NULL")
TEST_VARIATION(6, L"E_NOINTERFACE, row iid, valid ptr")
TEST_VARIATION(7, L"Multiple Command Objects")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CExecute)
//*-----------------------------------------------------------------------
// @class General Execute variations
//
class CExecute : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CExecute,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Multiple executions on same command object
int Variation_1();
// @cmember Multiple Commands on same Row
int Variation_2();
// @cmember Multilpe Row objects open
int Variation_3();
// @cmember Properties tests
int Variation_4();
// @cmember E_INVALIDARG, pcRowsAffected and pIRowset NULL
int Variation_5();
// @cmember Valid, iid=IRowsetLocate
int Variation_6();
// @cmember Valid, iid=IColumnsInfo
int Variation_7();
// @cmember Valid, iid=IUnknown
int Variation_8();
// @cmember cParam=0
int Variation_9();
// @cmember ICommand::Execute iid=IID_IRow
int Variation_10();
// @cmember ICommandText::Execute, iid=IID_IRow
int Variation_11();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(CExecute)
#define THE_CLASS CExecute
BEG_TEST_CASE(CExecute, CScopedCmd, L"General Execute variations")
TEST_VARIATION(1, L"Multiple executions on same command object")
TEST_VARIATION(2, L"Multiple Commands on same Row")
TEST_VARIATION(3, L"Multilpe Row objects open")
TEST_VARIATION(4, L"Properties tests")
TEST_VARIATION(5, L"E_INVALIDARG, pcRowsAffected and pIRowset NULL")
TEST_VARIATION(6, L"Valid, iid=IRowsetLocate")
TEST_VARIATION(7, L"Valid, iid=IColumnsInfo")
TEST_VARIATION(8, L"Valid, iid=IUnknown")
TEST_VARIATION(9, L"cParam=0")
TEST_VARIATION(10, L"ICommand::Execute iid=IID_IRow")
TEST_VARIATION(11, L"ICommandText::Execute, iid=IID_IRow")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CPrepare)
//*-----------------------------------------------------------------------
// @class test ICommandPrepare cases
//
class CPrepare : public CScopedCmd {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CPrepare,CScopedCmd);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Invalid, prepare empty text string
int Variation_1();
// @cmember Invalid, prepare after NULL ppwszCommand
int Variation_2();
// @cmember DB_E_NOCOMMAND, prepare before setting text
int Variation_3();
// @cmember DB_E_NOCOMMAND - Prepare with open rowset object
int Variation_4();
// @cmember S_OK - valid select
int Variation_5();
// @cmember S_OK - prepare after ::GetColumnInfo FAILS
int Variation_6();
// @cmember S_OK ::GetColumnsInfo after Prepare
int Variation_7();
// @cmember S_OK - Prepare, SetCommandText, GetColumnsInfo
int Variation_8();
// @cmember Prepare and set properties
int Variation_11();
// @cmember DB_E_OBJECTOPEN - unprepare with open rowset
int Variation_12();
// @cmember S_OK - Unprepare valid select
int Variation_13();
// @cmember S_OK - Unprepare and verify GetColumnsInfo fails
int Variation_14();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(CPrepare)
#define THE_CLASS CPrepare
BEG_TEST_CASE(CPrepare, CScopedCmd, L"test ICommandPrepare cases")
TEST_VARIATION(1, L"Invalid, prepare empty text string")
TEST_VARIATION(2, L"Invalid, prepare after NULL ppwszCommand")
TEST_VARIATION(3, L"DB_E_NOCOMMAND, prepare before setting text")
TEST_VARIATION(4, L"DB_E_NOCOMMAND - Prepare with open rowset object")
TEST_VARIATION(5, L"S_OK - valid select")
TEST_VARIATION(6, L"S_OK - prepare after ::GetColumnInfo FAILS")
TEST_VARIATION(7, L"S_OK ::GetColumnsInfo after Prepare")
TEST_VARIATION(8, L"S_OK - Prepare, SetCommandText, GetColumnsInfo")
TEST_VARIATION(11, L"Prepare and set properties")
TEST_VARIATION(12, L"DB_E_OBJECTOPEN - unprepare with open rowset")
TEST_VARIATION(13, L"S_OK - Unprepare valid select")
TEST_VARIATION(14, L"S_OK - Unprepare and verify GetColumnsInfo fails")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
//--------------------------------------------------------------------
// @func Reinitialize the Conformance Provider by ignoring the Ini file
// and constructing the tree - added on 04/30/2001
//
BOOL ReInitializeConfProv(CThisTestModule* pThisTestModule)
{
BOOL fSuccess = FALSE;
WCHAR* pwszRootURL = NULL;
WCHAR* pwszNewURL = NULL;
WCHAR* pwszCmdURL = NULL;
WCHAR* pwszRowURL = NULL;
WCHAR* pwszRowQuery = NULL;
CList<WCHAR *,WCHAR *> NativeTypesList;
CList<DBTYPE,DBTYPE> ProviderTypesList;
CCol col;
DBCOLUMNDESC *rgColumnDesc = NULL;
DBORDINAL cColumnDesc = 0;
DBORDINAL ulIndxCol = 0;
BOOL fTableExist = FALSE;
CList <CCol, CCol&> colList;
POSITION pos;
DBORDINAL cIter=0;
DBORDINAL ulParentOrdinal;
DBORDINAL rgOrdinals[2]; // ConfProv reserves two columns for its own use
pwszRootURL = (WCHAR *)PROVIDER_ALLOC((wcslen(L"confprov://dso/session/")+MAXBUFLEN)*sizeof(WCHAR));
TESTC(pwszRootURL != NULL);
wcscpy(pwszRootURL, L"confprov://dso/session/");
GetModInfo()->SetRootURL(pwszRootURL);
// Create a table.
if (g_pConfProvTable2)
{
g_pConfProvTable2->DropTable();
SAFE_DELETE(g_pConfProvTable2);
}
g_pConfProvTable2 = new CTable(pThisTestModule->m_pIUnknown2);
g_pConfProvTable2->CreateColInfo(NativeTypesList, ProviderTypesList);
g_pConfProvTable2->DuplicateColList(colList);
pos = colList.GetHeadPosition();
TESTC(NULL != pos)
cColumnDesc = 2;
for (; pos; )
{
POSITION oldPos = pos;
col = colList.GetNext(pos);
if (!col.GetNullable())
colList.RemoveAt(oldPos);
else
{
col.SetColNum(++cColumnDesc);
colList.SetAt(oldPos, col);
}
}
TESTC(g_pConfProvTable2->GetColWithAttr(COL_COND_AUTOINC, &ulIndxCol));
// duplicate the first column - use one for index and one for values
TESTC_(g_pConfProvTable2->GetColInfo(ulIndxCol, col), S_OK);
col.SetColName(L"RESOURCE_PARSENAME");
col.SetNullable(FALSE);
col.SetColNum(1);
colList.AddHead(col);
// Find a candidate for the RESOURCE_PARENTNAME columns
for(cIter=1; cIter <= g_pConfProvTable2->CountColumnsOnTable(); cIter++)
{
TESTC_(g_pConfProvTable2->GetColInfo(cIter, col), S_OK);
if (col.GetIsLong() == FALSE && col.GetIsFixedLength() == FALSE &&
(col.GetProviderType() == DBTYPE_WSTR ||
col.GetProviderType() == DBTYPE_BSTR ||
col.GetProviderType() == DBTYPE_STR ))
break;
}
// Did we find a candidate?
TESTC(cIter < g_pConfProvTable2->CountColumnsOnTable());
ulParentOrdinal = col.GetColNum();
col.SetColName(L"RESOURCE_PARENTNAME");
col.SetIsFixedLength(FALSE);
col.SetColumnSize(200);
col.SetColNum(2);
colList.AddHead(col);
g_pConfProvTable2->SetColList(colList);
g_pConfProvTable2->SetBuildColumnDesc(FALSE); // do not create ColList again
cColumnDesc = g_pConfProvTable2->CountColumnsOnTable();
g_pConfProvTable2->BuildColumnDescs(&rgColumnDesc);
// make sure the first column is not autoincrementable
FreeProperties(&rgColumnDesc[0].cPropertySets, &rgColumnDesc[0].rgPropertySets);
SAFE_FREE(rgColumnDesc[0].pwszTypeName);
// make sure the parent column doesn't specify a type name
SAFE_FREE(rgColumnDesc[ulParentOrdinal-1].pwszTypeName);
g_pConfProvTable2->SetColumnDesc(rgColumnDesc, cColumnDesc);
// TESTC_(g_pConfProvTable->CreateTable(0, cColumnDesc), S_OK);
TESTC_(g_pConfProvTable2->CreateTable(0, 0), S_OK); // avoid creating a rowset on the last col
// create a unique index on the two special columns
rgOrdinals[0] = 1;
rgOrdinals[1] = 2;
TESTC_(g_pConfProvTable2->CreateIndex(rgOrdinals,2,UNIQUE), S_OK);
// get the name of the created table
// and alter the ROOT_URL.
pwszNewURL = (WCHAR *)PROVIDER_ALLOC((wcslen(pwszRootURL)+MAXBUFLEN)*sizeof(WCHAR));
TESTC(pwszNewURL != NULL);
wcscpy(pwszNewURL, pwszRootURL);
wcscat(pwszNewURL, L"/");
wcscat(pwszNewURL, g_pConfProvTable2->GetTableName());
//CreateTree with one node.
g_pConfProvTree2 = new CTree(pThisTestModule->m_pIUnknown2);
g_pConfProvTree2->CreateTree(pwszNewURL, 1, 2);
PROVIDER_FREE(pwszRootURL);
pwszRootURL = g_pConfProvTree2->GetRootURL();
TESTC(pwszRootURL && wcslen(pwszRootURL)>1)
pwszCmdURL = (WCHAR *)PROVIDER_ALLOC((wcslen(L"confprov://dso/session/")+MAXBUFLEN)*sizeof(WCHAR));
TESTC(pwszCmdURL != NULL);
wcscpy(pwszCmdURL, L"confprov://dso/session/");
wcscat(pwszCmdURL, L"select * from ");
wcscat(pwszCmdURL, g_pConfProvTable2->GetTableName());
pwszRowURL = (WCHAR *)PROVIDER_ALLOC((wcslen(pwszRootURL)+MAXBUFLEN)*sizeof(WCHAR));
TESTC(pwszRowURL != NULL);
wcscpy(pwszRowURL, pwszRootURL);
wcscat(pwszRowURL, L"/0");
GetModInfo()->SetRootURL(pwszRowURL);
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(DATASOURCE_INTERFACE, pwszRootURL));
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(SESSION_INTERFACE, pwszRootURL));
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(ROWSET_INTERFACE, pwszNewURL));
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(ROW_INTERFACE, pwszRowURL));
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(STREAM_INTERFACE, pwszRootURL));
TESTC(GetModInfo()->GetParseObject()->OverwriteURL(COMMAND_INTERFACE, pwszCmdURL));
// Override the default Row Scoped Command Query
pwszRowQuery = (WCHAR *)PROVIDER_ALLOC((wcslen(g_pConfProvTable2->GetTableName())+wcslen(wszSELECT_ALLFROMTBL)+1)*sizeof(WCHAR));
TESTC(pwszRowQuery != NULL);
swprintf(pwszRowQuery, wszSELECT_ALLFROMTBL, g_pConfProvTable2->GetTableName());
GetModInfo()->SetRowScopedQuery(pwszRowQuery);
fSuccess = TRUE;
CLEANUP:
PROVIDER_FREE(pwszRowQuery);
PROVIDER_FREE(pwszNewURL);
PROVIDER_FREE(pwszCmdURL);
PROVIDER_FREE(pwszRowURL);
PROVIDER_FREE(pwszRootURL);
return fSuccess;
}
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
ULONG_PTR ulOleObj = 0;
BOOL fConfProv = FALSE;
// Get connection and session objects
if (!ModuleCreateDBSession(pThisTestModule))
{
odtLog << L"Fail to initialize\n";
return FALSE;
}
//Check if provider supports direct binding. If the provider doesn't support
//direct binding then we skip all test cases. As per the OLE DB spec if the provider sets
//DBPROPVAL_OO_DIRECTBIND value of the DBPROP_OLE_OBJECTS, then the consumer
//can assume that direct binding is supported.
TESTC_PROVIDER(GetProperty(DBPROP_OLEOBJECTS, DBPROPSET_DATASOURCEINFO,
(IUnknown*)pThisTestModule->m_pIUnknown, &ulOleObj) &&
((ulOleObj & DBPROPVAL_OO_DIRECTBIND) == DBPROPVAL_OO_DIRECTBIND));
if( !VerifyInterface((IUnknown *)pThisTestModule->m_pIUnknown2, IID_IUnknown,
SESSION_INTERFACE, &pUnkSession) )
return FALSE;
if(CLSID_ConfProv == GetModInfo()->GetProviderCLSID())
{
fConfProv = TRUE;
}
// Added on April 30th 2001 so that test does not fail if ini file is used
if(GetModInfo()->GetFileName())
{ odtLog << L"WARNING: Test does not support using ini file. \n";
if(fConfProv)
{
odtLog << L" Resetting to ignore ini file. \n";
odtLog << L" This test will construct internally the table and tree based on the ROOT_URL : confprov://dso/session . \n";
GetModInfo()->ResetIniFile();
g_fResetIniFile = TRUE;
ReInitializeConfProv(pThisTestModule);
}
else
{
odtLog << L"Skipping all test cases.\n";
TESTB = TEST_SKIPPED;
goto CLEANUP;
}
}
// Create a hierarchy
g_pTree = new CTree((IUnknown *)pThisTestModule->m_pIUnknown2,
(LPWSTR)gwszModuleName);
if (!g_pTree)
{
odtLog << wszMemoryAllocationError;
return FALSE;
}
if (NULL == GetModInfo()->GetRootURL() && !g_fResetIniFile)
{
TWARNING(L"A Root URL must be specified in the initialization string.");
TESTW(FALSE);
return TEST_SKIPPED;
}
if (NULL == GetModInfo()->GetRowScopedQuery() && !g_fResetIniFile)
{
TWARNING(L"A Row scoped query must be specified to run the test.");
TESTW(FALSE);
return TEST_SKIPPED;
}
// Create a tree
if (FAILED(g_pTree->CreateTree(GetModInfo()->GetRootURL(),2,8)))
return FALSE;
// If we made it this far, everything has succeeded
return TRUE;
CLEANUP:
TRETURN
//return FALSE;
}
//--------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
SAFE_RELEASE(pUnkSession);
// Drop the tree created in the ModuleInit
if (g_pTree)
{
g_pTree->DestroyTree();
SAFE_DELETE(g_pTree);
}
if (g_pConfProvTable2)
{
g_pConfProvTable2->DropTable();
SAFE_DELETE(g_pConfProvTable2);
}
if (g_pConfProvTree2)
{
g_pConfProvTree2->DestroyTree();
SAFE_DELETE(g_pConfProvTree2);
}
return ModuleReleaseDBSession(pThisTestModule);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// }} END_DECLARE_TEST_CASES()
////////////////////////////////////////////////////////////////////////
// Cloning loginc
//
////////////////////////////////////////////////////////////////////////
#define COPY_TEST_CASE(theClass, baseClass) \
class theClass : public baseClass \
{ \
public: \
static const WCHAR m_wszTestCaseName[]; \
DECLARE_TEST_CASE_FUNCS(theClass, baseClass); \
}; \
const WCHAR theClass::m_wszTestCaseName[] = { L#theClass }; \
#define TEST_CASE_WITH_PARAM(iCase, theClass, param) \
case iCase: \
pCTestCase = new theClass(NULL); \
((theClass*)pCTestCase)->SetTestCaseParam(param); \
pCTestCase->SetOwningMod(iCase-1, pCThisTestModule); \
return pCTestCase;
COPY_TEST_CASE(Traversal_RootBind, Traversal)
COPY_TEST_CASE(Traversal_SessBind, Traversal)
COPY_TEST_CASE(Aggregation_RootBind, Aggregation)
COPY_TEST_CASE(Aggregation_SessBind, Aggregation)
COPY_TEST_CASE(CCancel_RootBind, CCancel)
COPY_TEST_CASE(CCancel_SessBind, CCancel)
COPY_TEST_CASE(CDBSession_RootBind, CDBSession)
COPY_TEST_CASE(CDBSession_SessBind, CDBSession)
COPY_TEST_CASE(CExecute_RootBind, CExecute)
COPY_TEST_CASE(CExecute_SessBind, CExecute)
COPY_TEST_CASE(CPrepare_RootBind, CPrepare)
COPY_TEST_CASE(CPrepare_SessBind, CPrepare)
// }} END_DECLARE_TEST_CASES()
//NOTE: The #ifdef block below is only for test wizard. TestWizard has too many
//strict rules in the parsing code and requires a 1:1 correspondence between
//testcases and the map. What the #else section is doing is basically "reusing"
//existing testcases by just passing in a paraemter which changes the behvior.
//So we make LTM think there are 15 cases in here with different names, but in
//reality we only have to maintain code for the unique cases. This way we can
//easily get testing of other storage interfaces, without maintaining 4 different
//tests with almost identical code...
#if 0
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(6, ThisModule, gwszModuleDescrip)
TEST_CASE(1, Traversal)
TEST_CASE(2, Aggregation)
TEST_CASE(3, CCancel)
TEST_CASE(4, CDBSession)
TEST_CASE(5, CExecute)
TEST_CASE(6, CPrepare)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
#else
TEST_MODULE(12, ThisModule, gwszModuleDescrip)
// Clone 1 for Traversal
TEST_CASE_WITH_PARAM(1, Traversal_RootBind, ROOTBINDER)
// Clone 2 for Traversal
TEST_CASE_WITH_PARAM(2, Traversal_SessBind, SESSIONBINDER)
// Clone 1 for Aggregation
TEST_CASE_WITH_PARAM(3, Aggregation_RootBind, ROOTBINDER)
// Clone 2 for Aggregation
TEST_CASE_WITH_PARAM(4, Aggregation_SessBind, SESSIONBINDER)
// Clone 1 for CCancel
TEST_CASE_WITH_PARAM(5, CCancel_RootBind, ROOTBINDER)
// Clone 2 for CCancel
TEST_CASE_WITH_PARAM(6, CCancel_SessBind, SESSIONBINDER)
// Clone 1 for CDBSession
TEST_CASE_WITH_PARAM(7, CDBSession_RootBind, ROOTBINDER)
// Clone 2 for CDBSession
TEST_CASE_WITH_PARAM(8, CDBSession_SessBind, SESSIONBINDER)
// Clone 1 for CExecute
TEST_CASE_WITH_PARAM(9, CExecute_RootBind, ROOTBINDER)
// Clone 2 for CExecute
TEST_CASE_WITH_PARAM(10, CExecute_SessBind, SESSIONBINDER)
// Clone 1 for CPrepare
TEST_CASE_WITH_PARAM(11, CPrepare_RootBind, ROOTBINDER)
// Clone 2 for CPrepare
TEST_CASE_WITH_PARAM(12, CPrepare_SessBind, SESSIONBINDER)
END_TEST_MODULE()
#endif
// {{ TCW_TC_PROTOTYPE(Traversal)
//*-----------------------------------------------------------------------
//| Test Case: Traversal - Navigate a hierarchy
//| Created: 11/11/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Traversal::Init()
{
ASSERT(g_pTree);
if(!g_pTree)
{
return FALSE;
}
m_pTree = g_pTree;
m_pTree->ResetPosition();
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Complete traversal
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Traversal::Variation_1()
{
// Completely traverse a tree using row scoped commands
return VerifyRowAndChildren(m_pCRootRowObj, reinterpret_cast<CSchema*>(m_pTree->GetRootSchema()));
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL Traversal::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(Aggregation)
//*-----------------------------------------------------------------------
//| Test Case: Aggregation - Test Aggregation cases
//| Created: 11/17/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Aggregation::Init()
{
m_pTree = g_pTree;
m_pTree->ResetPosition();
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
if (NULL == FetchRowScopedQuery(SHALLOW_SCOPED_SELECT))
{
odtLog << L"Unable to run this test case without a Row Scoped Query." << ENDL;
return TEST_SKIPPED;
}
m_pIDBCreateCommand = m_pCRootRowObj->pIDBCreateCommand();
if (m_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
else
return TRUE;
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Test pIUnkOuter != NULL and refiid != IID_IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Aggregation::Variation_1()
{
CAggregate Aggregate(m_pCRootRowObj->pIRow());
ICommand* pICommand = INVALID(ICommand*);
TESTC_(m_pIDBCreateCommand->CreateCommand
(
&Aggregate,
IID_ICommand,
(IUnknown **)&pICommand
), DB_E_NOAGGREGATION);
COMPARE(Aggregate.GetRefCount(), 1);
TESTC(pICommand == NULL);
CLEANUP:
if (pICommand != INVALID(ICommand*))
SAFE_RELEASE(pICommand);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc ::Execute on row scoped command with pIUnkOuter != NULL and refiid!=IID_IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Aggregation::Variation_2()
{
CAggregate Aggregate(m_pCRootRowObj->pIRow());
ICommand* pICommand = NULL;
IRowset* pIRowset = INVALID(IRowset*);
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICommand));
TESTC_(SetScopedCmdTxt(pICommand, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(pICommand->Execute(&Aggregate, IID_IRowset, NULL, NULL, (IUnknown **)&pIRowset), DB_E_NOAGGREGATION);
COMPARE(Aggregate.GetRefCount(), 1);
TEST(pIRowset == NULL);
CLEANUP:
SAFE_RELEASE(pICommand);
if (pIRowset != INVALID(IRowset*))
SAFE_RELEASE(pIRowset);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Aggregate returned command and verify aggregation
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Aggregation::Variation_3()
{
CAggregate Aggregate(m_pCRootRowObj->pIRow());
IUnknown * pUnkInner = NULL;
m_hr = m_pIDBCreateCommand->CreateCommand
(
&Aggregate,
IID_IUnknown,
&pUnkInner
);
Aggregate.SetUnkInner(pUnkInner);
if(Aggregate.VerifyAggregationQI(m_hr, IID_IConvertType))
odtLog << L"Provider supports aggregation.";
SAFE_RELEASE(pUnkInner);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Aggregate returned command, get rowset and call GetSpecification
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Aggregation::Variation_4()
{
CAggregate Aggregate(m_pCRootRowObj->pIRow());
CAggregate * pIAggregate = NULL;
ICommandText * pICmdText = NULL;
IRowsetInfo * pIRowsetInfo = NULL;
IUnknown * pUnkInner = NULL;
ULONG ulRefCountAfter, ulRefCountBefore;
m_hr = m_pIDBCreateCommand->CreateCommand
(
&Aggregate,
IID_IUnknown,
&pUnkInner
);
Aggregate.SetUnkInner(pUnkInner);
if(Aggregate.VerifyAggregationQI(m_hr, IID_ICommandText, (IUnknown **)&pICmdText))
{
TESTC_(SetScopedCmdTxt(pICmdText, SHALLOW_SCOPED_SELECT),S_OK);
ulRefCountBefore = Aggregate.GetRefCount();
TESTC_(pICmdText->Execute(NULL, IID_IRowsetInfo, NULL, NULL, (IUnknown **)&pIRowsetInfo),S_OK);
ulRefCountAfter = Aggregate.GetRefCount();
TEST2C_(m_hr = pIRowsetInfo->GetSpecification(IID_IAggregate, (IUnknown **)&pIAggregate),S_OK,S_FALSE);
if(m_hr==S_OK)
{
TESTC(VerifyEqualInterface(pIAggregate, pICmdText));
//Verify the child correctly addref'd the parent outer.
TCOMPARE_(ulRefCountAfter > ulRefCountBefore);
}
else
{
TWARNING(L"IRowsetInfo::GetSpecification unable to retrieve Parent object!");
}
}
CLEANUP:
SAFE_RELEASE(pIRowsetInfo);
SAFE_RELEASE(pICmdText);
SAFE_RELEASE(pUnkInner);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Create command, aggregate returned rowset and verify agg
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Aggregation::Variation_5()
{
CAggregate Aggregate(m_pCRootRowObj->pIRow());
ICommand * pICmd1 = NULL;
IUnknown * pUnkInner = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
m_hr = pICmd1->Execute(&Aggregate, IID_IUnknown, NULL, NULL, &pUnkInner);
Aggregate.SetUnkInner(pUnkInner);
//Verify Aggregation for this rowset...
TESTC_PROVIDER(Aggregate.VerifyAggregationQI(m_hr, IID_IColumnsInfo));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pUnkInner);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL Aggregation::Terminate()
{
m_pIDBCreateCommand = NULL;
m_pTree = NULL;
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(CCancel)
//*-----------------------------------------------------------------------
//| Test Case: CCancel - General cases
//| Created: 11/17/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CCancel::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
if (NULL == FetchRowScopedQuery(SHALLOW_SCOPED_SELECT))
{
odtLog << L"Unable to run this test case without a Row Scoped Query." << ENDL;
return TEST_SKIPPED;
}
m_pIDBCreateCommand = m_pCRootRowObj->pIDBCreateCommand();
if (m_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
else
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Before and After executing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_1()
{
ICommand* pICmd1=NULL;
ICommand* pICmd2=NULL;
HRESULT hr = NOERROR;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd2));
// Set text in command object
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(SetScopedCmdTxt(pICmd2, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(pICmd1->Cancel(),S_OK);
// cRowsAffected is null on purpose
TESTC_(pICmd1->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
// cRowsAffected is null on purpose
TESTC_(pICmd2->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
TEST2C_(hr = pICmd2->Cancel(), S_OK, DB_E_CANTCANCEL);
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Two selects cancel during execution
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_2()
{
ICommand* pICmd1 = NULL;
ICommand* pICmd2 = NULL;
HRESULT hr = NOERROR;
INIT_THREADS(FOUR_THREADS);
// create a pair of commands
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd2));
// Set text in command objects
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(SetScopedCmdTxt(pICmd2, SHALLOW_SCOPED_SELECT),S_OK);
{ // new block for thread args
// Setup Thread Arguments
// Expect either hrExecute or hrExecuteOr result from Execute command.
HRESULT hrExecute = DB_E_CANCELED;
HRESULT hrExecuteOr = S_OK;
HRESULT hrCancel = S_OK;
HRESULT hrCancelOr = DB_E_CANTCANCEL;
THREADARG ExecuteFirstCmd = { this, pICmd1,&hrExecute, &hrExecuteOr};
THREADARG CancelFirstCmd = { this, pICmd1,&hrCancelOr, &hrCancel};
THREADARG ExecuteSecondCmd ={ this, pICmd2,&hrExecute, &hrExecuteOr};
THREADARG CancelSecondCmd = { this, pICmd2,&hrCancelOr, &hrCancel};
//Create Threads
CREATE_THREAD(THREAD_ONE, Thread_Execute, &ExecuteFirstCmd);
CREATE_THREAD(THREAD_TWO, Thread_Cancel, &CancelFirstCmd);
CREATE_THREAD(THREAD_THREE, Thread_Execute, &ExecuteSecondCmd);
CREATE_THREAD(THREAD_FOUR, Thread_Cancel, &CancelSecondCmd);
// Execute
START_THREADS();
END_THREADS();
}
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Two cmds, cancel 1 during, cancel 1 after
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_3()
{
ICommand* pICmd1=NULL;
ICommand* pICmd2=NULL;
HRESULT hr = NOERROR;
INIT_THREADS(TWO_THREADS);
// create a pair of commands
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd2));
// Set text in command objects
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(SetScopedCmdTxt(pICmd2, SHALLOW_SCOPED_SELECT),S_OK);
{ // new block for thread args
// Set up Thread arguments
// Expect either Canceled or S_OK
HRESULT hrExecute1 = DB_E_CANCELED;
HRESULT hrExecuteOr = S_OK;
HRESULT hrCancel1 = S_OK;
HRESULT hrCancel1Or = DB_E_CANTCANCEL;
THREADARG ExecuteFirstCmd = { this, pICmd1, &hrExecute1, &hrExecuteOr};
THREADARG CancelFirstCmd = { this, pICmd1, &hrCancel1, &hrCancel1Or};
//Create Thread
CREATE_THREAD(THREAD_ONE, Thread_Execute, &ExecuteFirstCmd);
CREATE_THREAD(THREAD_TWO, Thread_Cancel, &CancelFirstCmd);
//Execute
START_THREADS();
END_THREADS();
}
// Second cmd object
// cRowsAffected is null on purpose
TESTC_(pICmd2->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
TEST2C_(hr = pICmd2->Cancel(), S_OK, DB_E_CANTCANCEL);
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Two cmds, cancel 1 before, cancel 1 during
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_4()
{
ICommand* pICmd1=NULL;
ICommand* pICmd2=NULL;
HRESULT hr = NOERROR;
INIT_THREADS(TWO_THREADS);
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd2));
// Set text in command object
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(SetScopedCmdTxt(pICmd2, SHALLOW_SCOPED_SELECT),S_OK);
// Second cmd object
// cRowsAffected is null on purpose
TESTC_(pICmd2->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
TEST2C_(hr = pICmd2->Cancel(), S_OK, DB_E_CANTCANCEL);
{ // new block for thread args
// Set up thread arguments
// Expect DB_E_CANCELED or S_OK.
HRESULT hrExecute1 = DB_E_CANCELED;
HRESULT hrExecuteOr = S_OK;
HRESULT hrCancel1 = S_OK;
HRESULT hrCancel1Or = DB_E_CANTCANCEL;
THREADARG ExecuteFirstCmd = { this, pICmd1, &hrExecute1, &hrExecuteOr};
THREADARG CancelFirstCmd = { this, pICmd1, &hrCancel1, &hrCancel1Or};
// Create Threads
CREATE_THREAD(THREAD_ONE, Thread_Execute, &ExecuteFirstCmd);
CREATE_THREAD(THREAD_TWO, Thread_Cancel, &CancelFirstCmd);
// Execute
START_THREADS();
END_THREADS();
}
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc 1 cmd, cancel before execution
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_5()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(pICmd1->Cancel(),S_OK);
// cRowsAffected is null on purpose
TESTC_(pICmd1->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc 1 cmd obj, cancel after execution
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_6()
{
HRESULT hr;
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
// cRowsAffected is null on purpose
TESTC_(pICmd1->Execute(NULL,IID_NULL,NULL,NULL,NULL),S_OK);
TEST2C_(hr = pICmd1->Cancel(), S_OK, DB_E_CANTCANCEL);
CLEANUP:
SAFE_RELEASE(pICmd1);
TRETURN;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc 1 cmd, execute, cancel, cancel
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_7()
{
ICommand* pICmd1 = NULL;
INIT_THREADS(THREE_THREADS);
// Create command and set text in command object
TESTC(CreateCommand(IID_ICommand,(IUnknown **) &pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
{ // new block for thread args
// Set up thread arguments
// Expect S_OK or DB_E_CANCELED.
HRESULT hrExecute1 = DB_E_CANCELED;
HRESULT hrExecuteOr = S_OK;
HRESULT hrCancel1 = S_OK;
HRESULT hrCancel1Or = DB_E_CANTCANCEL;
HRESULT hrCancel2 = S_OK;
HRESULT hrCancel2Or = DB_E_CANTCANCEL;
THREADARG ExecuteFirstCmd = { this, pICmd1, &hrExecute1, &hrExecuteOr};
THREADARG CancelFirstCmd = { this, pICmd1, &hrCancel1, &hrCancel1Or};
THREADARG CancelFirstCmd2 = { this, pICmd1, &hrCancel2, &hrCancel2Or};
// Create Threads
CREATE_THREAD(THREAD_ONE, Thread_Execute, &ExecuteFirstCmd);
CREATE_THREAD(THREAD_TWO, Thread_Cancel, &CancelFirstCmd);
CREATE_THREAD(THREAD_THREE, Thread_Cancel, &CancelFirstCmd2);
// Execute
START_THREADS();
END_THREADS();
}
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc 1 cmd, no query set, one cancel per thrd
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CCancel::Variation_8()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
// cRowsAffected is null on purpose
TESTC_(pICmd1->Cancel(),S_OK);
TESTC_(pICmd1->Execute(NULL,IID_NULL,NULL,NULL,NULL),DB_E_NOCOMMAND);
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL CCancel::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(CDBSession)
//*-----------------------------------------------------------------------
//| Test Case: CDBSession - Test GetDBSession method
//| Created: 11/18/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CDBSession::Init()
{
m_pIRowSession = NULL;
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
if (NULL == FetchRowScopedQuery(SHALLOW_SCOPED_SELECT))
{
odtLog << L"Unable to run this test case without a Row Scoped Query." << ENDL;
return TEST_SKIPPED;
}
m_pIDBCreateCommand = m_pCRootRowObj->pIDBCreateCommand();
if (m_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
TEST2C_(m_pCRootRowObj->pIGetSession()->GetSession
(
IID_IUnknown,
&m_pIRowSession
),S_OK, DB_E_NOSOURCEOBJECT);
return TRUE;
}
CLEANUP:
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc IRowsetInfo::GetSpecification
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_1()
{
ICommand* pICmd1 = NULL;
IRowsetInfo* pIRowsetInfo = NULL;
ICommand* pICmd2 = NULL;
IUnknown* pIUnknownSession = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowsetInfo,NULL,NULL, (IUnknown **)&pIRowsetInfo),S_OK);
TESTC_(m_hr = pIRowsetInfo->GetSpecification(IID_ICommand, (IUnknown **)&pICmd2),S_OK);
TESTC(VerifyEqualCommands(pICmd1, pICmd2));
TESTC_(m_hr=pICmd2->GetDBSession(IID_IUnknown,&pIUnknownSession),S_OK);
TESTC(VerifyRowSession(pIUnknownSession));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
SAFE_RELEASE(pIRowsetInfo);
SAFE_RELEASE(pIUnknownSession);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Verify GetDBSession on non executed command
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_2()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(TestGetDBSession(pICmd1),S_OK);
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE, dso iid, valid ptr
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_3()
{
ICommand* pICmd1 = NULL;
IDBInitialize* pIDBInitialize = INVALID(IDBInitialize *);
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr=pICmd1->GetDBSession(IID_IDBInitialize,(IUnknown **)&pIDBInitialize),E_NOINTERFACE);
TESTC(pIDBInitialize == NULL);
CLEANUP:
SAFE_RELEASE(pICmd1);
if(pIDBInitialize != INVALID(IDBInitialize *))
SAFE_RELEASE(pIDBInitialize);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE, iid_null, valid ptr
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_4()
{
ICommand* pICmd1 = NULL;
IDBCreateCommand* pIDBCreateCommand = INVALID(IDBCreateCommand *);
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr=pICmd1->GetDBSession(IID_NULL, (IUnknown **)&pIDBCreateCommand),E_NOINTERFACE);
TESTC(pIDBCreateCommand == NULL);
CLEANUP:
SAFE_RELEASE(pICmd1);
if(pIDBCreateCommand != INVALID(IDBCreateCommand *))
SAFE_RELEASE(pIDBCreateCommand);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG, valid session, ptr=NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_5()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC(CHECKW(m_hr=pICmd1->GetDBSession(IID_IDBCreateCommand,NULL),E_INVALIDARG));
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE, row iid, valid ptr
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_6()
{
ICommand* pICmd1 = NULL;
IRow* pIRow = INVALID(IRow *);
TESTC(CreateCommand(IID_ICommand, (IUnknown **) &pICmd1,NULL));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr=pICmd1->GetDBSession(IID_IRow,(IUnknown **)&pIRow),E_NOINTERFACE);
TESTC(pIRow == NULL);
CLEANUP:
SAFE_RELEASE(pICmd1);
if(pIRow != INVALID(IRow *))
SAFE_RELEASE(pIRow);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Multiple Command Objects
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CDBSession::Variation_7()
{
return CHECK(TestMultipleCommands(20), S_OK);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL CDBSession::Terminate()
{
SAFE_RELEASE(m_pIRowSession);
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(CExecute)
//*-----------------------------------------------------------------------
//| Test Case: CExecute - General Execute variations
//| Created: 11/18/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CExecute::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
if (NULL == FetchRowScopedQuery(SHALLOW_SCOPED_SELECT))
{
odtLog << L"Unable to run this test case without a Row Scoped Query." << ENDL;
return TEST_SKIPPED;
}
m_pIDBCreateCommand = m_pCRootRowObj->pIDBCreateCommand();
if (m_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
else
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Multiple executions on same command object
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_1()
{
ICommand* pICmd1 = NULL;
IRowset* pRowset1 = NULL;
IRowset* pRowset2 = NULL;
IRowset* pRowset3 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pRowset1),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pRowset2),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pRowset3),S_OK);
TESTC(DefaultObjectTesting(pRowset1, ROWSET_INTERFACE));
TESTC(DefaultObjectTesting(pRowset2, ROWSET_INTERFACE));
TESTC(DefaultObjectTesting(pRowset3, ROWSET_INTERFACE));
CLEANUP:
SAFE_RELEASE(pRowset1);
SAFE_RELEASE(pRowset2);
SAFE_RELEASE(pRowset3);
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Multiple Commands on same Row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_2()
{
IRowset* pRowset1 = NULL;
IRowset* pRowset2 = NULL;
ICommand* pICmd1 = NULL;
ICommand* pICmd2 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd2));
TESTC(pICmd2 && pICmd2);
// First row object's command
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pRowset1),S_OK);
// Second row object's command
TESTC_(SetScopedCmdTxt(pICmd2, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd2->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pRowset2),S_OK);
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pICmd2);
SAFE_RELEASE(pRowset1);
SAFE_RELEASE(pRowset2);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Multilpe Row objects open
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_3()
{
return TestMultipleRowObjects(20);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Properties tests
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_4()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG, pcRowsAffected and pIRowset NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_5()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,NULL),E_INVALIDARG);
CLEANUP:
SAFE_RELEASE(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Valid, iid=IRowsetLocate
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_6()
{
DBROWCOUNT cRowsAffected=0;
ICommand* pICmd1=NULL;
IRowsetLocate* pIRowsetLocate=NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT),S_OK);
m_hr = pICmd1->Execute(NULL,IID_IRowsetLocate,NULL,&cRowsAffected,(IUnknown **)&pIRowsetLocate);
TEST2C_(m_hr, S_OK, E_NOINTERFACE);
if (m_hr == S_OK)
{
TESTC(DefaultObjectTesting(pIRowsetLocate, ROWSET_INTERFACE));
}
else
{
TESTC(pIRowsetLocate == NULL);
}
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pIRowsetLocate);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Valid, iid=IColumnsInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_7()
{
DBROWCOUNT cRowsAffected=0;
ICommand* pICmd1=NULL;
IRowsetLocate* pIColumnsInfo=NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IColumnsInfo,NULL,&cRowsAffected,(IUnknown **)&pIColumnsInfo),S_OK);
TESTC(DefaultObjectTesting(pIColumnsInfo, ROWSET_INTERFACE));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pIColumnsInfo);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Valid, iid=IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_8()
{
DBROWCOUNT cRowsAffected = 0;
ICommand* pICmd1 = NULL;
IUnknown* pIUnknown = NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IColumnsInfo,NULL,&cRowsAffected,(IUnknown **)&pIUnknown),S_OK);
TESTC(DefaultObjectTesting(pIUnknown, ROWSET_INTERFACE));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pIUnknown);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc cParam=0
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_9()
{
ICommand* pICmd1=NULL;
IUnknown* pIUnknown=NULL;
DBPARAMS pParams;
pParams.pData=NULL;
pParams.cParamSets=0;
pParams.hAccessor = DB_NULL_HACCESSOR;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IUnknown,&pParams,NULL,(IUnknown **)&pIUnknown),S_OK);
TESTC(DefaultObjectTesting(pIUnknown, ROWSET_INTERFACE));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pIUnknown);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc ICommand::Execute iid=IID_IRow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_10()
{
ICommand* pICmd1=NULL;
IUnknown* pIUnknown=NULL;
TESTC(CreateCommand(IID_ICommand,(IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmd1->Execute(NULL,IID_IRow,NULL,NULL,(IUnknown **)&pIUnknown),S_OK);
TESTC(DefaultObjectTesting(pIUnknown, ROW_INTERFACE));
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_RELEASE(pIUnknown);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc ICommandText::Execute, iid=IID_IRow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CExecute::Variation_11()
{
ICommandText* pICmdText1=NULL;
IUnknown* pIUnknown=NULL;
TESTC(CreateCommand(IID_ICommandText,(IUnknown **)&pICmdText1));
TESTC_(SetScopedCmdTxt(pICmdText1, SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(m_hr = pICmdText1->Execute(NULL,IID_IRow,NULL,NULL,(IUnknown **)&pIUnknown),S_OK);
TESTC(DefaultObjectTesting(pIUnknown, ROW_INTERFACE));
CLEANUP:
SAFE_RELEASE(pICmdText1);
SAFE_RELEASE(pIUnknown);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL CExecute::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(CPrepare)
//*-----------------------------------------------------------------------
//| Test Case: CPrepare - test ICommandPrepare cases
//| Created: 11/23/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CPrepare::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CScopedCmd::Init())
// }}
{
if (NULL == FetchRowScopedQuery(SHALLOW_SCOPED_SELECT))
{
odtLog << L"Unable to run this test case without a Row Scoped Query." << ENDL;
return TEST_SKIPPED;
}
m_pIDBCreateCommand = m_pCRootRowObj->pIDBCreateCommand();
if (m_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
else
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Invalid, prepare empty text string
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_1()
{
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICmd1 = NULL; // ICommand Object
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR));
TESTC(pwszSQLStmt != NULL);
// Make a Empty String Command
wcscpy(pwszSQLStmt, L"\0");
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(SetCmdTxt(pICmd1, pwszSQLStmt), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), DB_E_NOCOMMAND);
CLEANUP:
SAFE_RELEASE(pICmd1);
SAFE_FREE(pwszSQLStmt);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Invalid, prepare after NULL ppwszCommand
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_2()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(SetCmdTxt(pICmd1, NULL), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), DB_E_NOCOMMAND);
CLEANUP:
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc DB_E_NOCOMMAND, prepare before setting text
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_3()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(PrepareCmd(pICmd1, 1), DB_E_NOCOMMAND);
CLEANUP:
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc DB_E_NOCOMMAND - Prepare with open rowset object
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_4()
{
ICommand* pICmd1 = NULL;
IRowset* pIRowset = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(pICmd1->Execute(NULL, IID_IRowset, NULL, NULL, (IUnknown **)&pIRowset), S_OK);
TESTC(DefaultObjectTesting(pIRowset, ROWSET_INTERFACE));
TESTC_(PrepareCmd(pICmd1, 1), DB_E_OBJECTOPEN);
CLEANUP:
SAFE_RELEASE(pIRowset)
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc S_OK - valid select
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_5()
{
ICommand* pICmd1 = NULL;
IRowset* pIRowset = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT),S_OK);
TESTC_(PrepareCmd(pICmd1, 0),S_OK);
TESTC_(pICmd1->Execute(NULL,IID_IRowset,NULL,NULL,(IUnknown **)&pIRowset),S_OK);
TESTC(DefaultObjectTesting(pIRowset, ROWSET_INTERFACE));
CLEANUP:
SAFE_RELEASE(pIRowset);
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc S_OK - prepare after ::GetColumnInfo FAILS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_6()
{
ICommand* pICmd1 = NULL;
IColumnsInfo* pIColumnsInfo = NULL;
DBCOUNTITEM cColumns = 0;
DBCOLUMNINFO* rgInfo = NULL;
WCHAR* pStringsBuffer = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1,SHALLOW_SCOPED_SELECT), S_OK);
TESTC(VerifyInterface(pICmd1, IID_IColumnsInfo, COMMAND_INTERFACE, (IUnknown**)&pIColumnsInfo));
TESTC(DefaultObjectTesting(pIColumnsInfo, COMMAND_INTERFACE));
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
TESTC_(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer), DB_E_NOTPREPARED);
// Compare Results from the DB_E_NOTPREPARED call
COMPARE(cColumns, 0);
COMPARE(rgInfo, NULL);
COMPARE(pStringsBuffer, NULL);
TESTC_(PrepareCmd(pICmd1, ULONG_MAX),S_OK);
CLEANUP:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE_(pICmd1);
// Free Memory
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc S_OK ::GetColumnsInfo after Prepare
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_7()
{
ICommand* pICmd1 = NULL;
IColumnsInfo* pIColumnsInfo = NULL;
DBCOUNTITEM cColumns = 0;
DBCOLUMNINFO* rgInfo = NULL;
WCHAR* pStringsBuffer = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), S_OK);
TESTC(VerifyInterface(pICmd1, IID_IColumnsInfo, COMMAND_INTERFACE, (IUnknown**)&pIColumnsInfo));
TESTC(DefaultObjectTesting(pIColumnsInfo, COMMAND_INTERFACE));
// Call IColumnsInfo::GetInfo and expect it to return S_OK
TESTC_(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer), S_OK);
CLEANUP:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE_(pICmd1);
// Free Memory
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare, SetCommandText, GetColumnsInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_8()
{
ICommandPrepare* pICmdPrep = NULL;
IColumnsInfo* pIColumnsInfo = NULL;
DBCOUNTITEM cColumns = 0;
DBCOLUMNINFO* rgInfo = NULL;
WCHAR* pStringsBuffer = NULL;
TESTC(CreateCommand(IID_ICommandPrepare, (IUnknown **)&pICmdPrep));
TESTC_(pICmdPrep->Prepare(1), DB_E_NOCOMMAND);
TESTC_(SetScopedCmdTxt(pICmdPrep,SHALLOW_SCOPED_SELECT),S_OK);
TESTC(VerifyInterface(pICmdPrep, IID_IColumnsInfo, COMMAND_INTERFACE, (IUnknown**)&pIColumnsInfo));
TESTC(DefaultObjectTesting(pIColumnsInfo, COMMAND_INTERFACE));
TESTC_(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer), DB_E_NOTPREPARED);
CLEANUP:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICmdPrep);
// Free Memory
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Prepare and set properties
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_11()
{
HRESULT hr = E_FAIL;
ICommand* pICmd1 = NULL;
ICommandProperties* pICommandProp = NULL;
IUnknown * pRowset = NULL;
DBPROPSET PropSet;
DBPROP PropIdOwnInsert = {DBPROP_OWNINSERT, DBPROPOPTIONS_REQUIRED, 0, {DB_NULLGUID, 0, (LPOLESTR)0}, {VT_EMPTY, 0, 0, 0}};
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), S_OK);
TESTC(VerifyInterface(pICmd1, IID_ICommandProperties, COMMAND_INTERFACE, (IUnknown**)&pICommandProp));
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_ROWSET;
PropSet.rgProperties = &PropIdOwnInsert;
m_hr = pICommandProp->SetProperties(1, &PropSet);
TEST2C_(m_hr, S_OK, DB_E_ERRORSOCCURRED);
if (m_hr == DB_E_ERRORSOCCURRED)
{
CHECKW(hr, DB_E_ERRORSOCCURRED);
odtLog << L"OwnInsert property was not set for this variation" << ENDL;
}
// Execute the Command
TESTC_(pICmd1->Execute(NULL, IID_IRowset, 0, NULL, &pRowset), S_OK);
TESTC(DefaultObjectTesting(pRowset, ROWSET_INTERFACE));
CLEANUP:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandProp);
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - unprepare with open rowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_12()
{
ICommand* pICmd1 = NULL;
IRowset* pIRowset = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(pICmd1->Execute(NULL, IID_IRowset, 0, NULL, (IUnknown **)&pIRowset), S_OK);
TESTC(DefaultObjectTesting(pIRowset, ROWSET_INTERFACE));
TESTC_(UnPrepareCmd(pICmd1), DB_E_OBJECTOPEN);
CLEANUP:
// Release Objects
SAFE_RELEASE(pIRowset);
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Unprepare valid select
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_13()
{
ICommand* pICmd1 = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(UnPrepareCmd(pICmd1), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), S_OK);
TESTC_(UnPrepareCmd(pICmd1), S_OK);
CLEANUP:
SAFE_RELEASE_(pICmd1);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Unprepare and verify GetColumnsInfo fails
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CPrepare::Variation_14()
{
ICommand* pICmd1 = NULL;
IColumnsInfo* pIColumnsInfo = NULL;
DBCOUNTITEM cColumns = 0;
DBCOLUMNINFO* rgInfo = NULL;
WCHAR* pStringsBuffer = NULL;
TESTC(CreateCommand(IID_ICommand, (IUnknown **)&pICmd1));
TESTC_(SetScopedCmdTxt(pICmd1, SHALLOW_SCOPED_SELECT), S_OK);
TESTC_(PrepareCmd(pICmd1, 1), S_OK);
TESTC_(UnPrepareCmd(pICmd1), S_OK);
TESTC(VerifyInterface(pICmd1, IID_IColumnsInfo, COMMAND_INTERFACE, (IUnknown**)&pIColumnsInfo));
TESTC(DefaultObjectTesting(pIColumnsInfo, COMMAND_INTERFACE));
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
TESTC_(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer), DB_E_NOTPREPARED);
// Compare Results from the DB_E_NOTPREPARED
COMPARE(cColumns, 0);
COMPARE(rgInfo, NULL);
COMPARE(pStringsBuffer, NULL);
CLEANUP:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE_(pICmd1);
// Free Memory
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL CPrepare::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CScopedCmd::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END