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

1964 lines
52 KiB
C++

//*--------------------------------------------------------------------
//
// This is the Test Module for IGetSession interface, which is a
// mandatory interface on ROW objects.
//
// WARNING:
// PLEASE USE THE TEST CASE WIZARD TO ADD/DELETE TESTS AND VARIATIONS!
//
// Copyright (C) 1994-2000 Microsoft Corporation
//*---------------------------------------------------------------------
#include "MODStandard.hpp"
#include "IGetSession.h"
#include "ExtraLib.h"
//*---------------------------------------------------------------------
// Module Values
//*---------------------------------------------------------------------
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0xb39cade0, 0x57e5, 0x11d2, { 0x88, 0xd7, 0x00, 0x60, 0x08, 0x9f, 0xc4, 0x66} };
DECLARE_MODULE_NAME("IGetSession");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("Test Module for IGetSession interface.");
DECLARE_MODULE_VERSION(1);
// TCW_WizardVersion(2)
// TCW_Automation(FALSE)
// }} TCW_MODULE_GLOBALS_END
//*---------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
ULONG_PTR ulVal=0;
if(CommonModuleInit(pThisTestModule))
{
if(GetProperty(DBPROP_OLEOBJECTS, DBPROPSET_DATASOURCEINFO,
g_pIDBInitialize, &ulVal))
{
if((ulVal & DBPROPVAL_OO_ROWOBJECT) ||
(ulVal & DBPROPVAL_OO_SINGLETON) ||
(ulVal & DBPROPVAL_OO_DIRECTBIND) )
return TEST_PASS;
else
return TEST_SKIPPED;
}
else
return TEST_SKIPPED;
}
return FALSE;
}
//*---------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
return CommonModuleTerminate(pThisTestModule);
}
////////////////////////////////////////////////////////////////////////
// TCBase - Class for reusing Test Cases.
// This is one of the base classes from which all the Test Case
// classes will inherit. It is used to duplicate test cases, yet
// maintain some sort of distinct identity for each.
//
////////////////////////////////////////////////////////////////////////
class TCBase
{
public:
//constructor
TCBase() { SetTestCaseParam(TC_RowsetByOpenRowset); }
//Set the m_fWarning and m_fBinder flags.
virtual void SetTestCaseParam(ETESTCASE eTestCase = TC_RowsetByOpenRowset)
{
m_eTestCase = eTestCase;
m_fWarning = FALSE;
m_fBinder = FALSE;
switch(eTestCase)
{
case TC_RowsetByOpenRowset:
break;
case TC_RowsetByCommand:
break;
case TC_SchemaRowset:
break;
case TC_ColumnsRowset:
m_fWarning = TRUE;
break;
case TC_DirectBindOnRootBinder:
case TC_DirectBindOnProvider:
case TC_GetSourceRow:
m_fWarning = TRUE;
m_fBinder = TRUE;
break;
case TC_OpenRowsetDirect:
break;
case TC_CommandDirect:
break;
default:
ASSERT(!L"Unhandled Type...");
break;
};
}
//data
ETESTCASE m_eTestCase;
//This indicates if the variations in a particular test case would
//flag the return code DB_E_NOSOURCEOBJECT as a warning (or error).
BOOL m_fWarning;
//Indicates if Direct Binding was involved in obtaining the row
//object being tested in a particular test case.
BOOL m_fBinder;
};
////////////////////////////////////////////////////////////////////////
// TCTransactions - Class for Transaction Test Case.
//
////////////////////////////////////////////////////////////////////////
class TCTransactions : public CTransaction
{
public:
//constructors
TCTransactions(WCHAR* pwszTestCaseName = INVALID(WCHAR*)) : CTransaction(pwszTestCaseName) {}
int TestTxnRow(BOOL bCommit, BOOL fRetaining);
};
//*-----------------------------------------------------------------------
// @mfunc TestTxn
// Helper function for testing transaction commit/abort variations.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCTransactions::TestTxnRow(BOOL bCommit,BOOL fRetaining)
{
TBEGIN
BOOL fSuccess = FALSE;
HRESULT ExpectedHr = E_UNEXPECTED;
HRESULT hr = E_FAIL;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
ULONG cPropSets = 0;
DBPROPSET * rgPropSets = NULL;
ULONG_PTR ulVal = 0;
IGetSession * pIGetSession = NULL;
IUnknown* pSessUnk = NULL;
//Not required to set this property. Just doing it for additional testing.
SetSettableProperty(DBPROP_BOOKMARKS,DBPROPSET_ROWSET,
&cPropSets, &rgPropSets);
//Check to see if Opening ROW objects thru OpenRowset is supported.
if(!GetProperty(DBPROP_OLEOBJECTS, DBPROPSET_DATASOURCEINFO,
(IUnknown*)m_pIDBCreateSession, &ulVal) ||
(!(ulVal & DBPROPVAL_OO_SINGLETON) && !(ulVal & DBPROPVAL_OO_ROWOBJECT)))
{
odtLog<<L"INFO: ROW objects are not supported.\n";
goto CLEANUP;
}
TESTC(StartTransaction(USE_OPENROWSET, (IUnknown **)&pIGetSession,
cPropSets, rgPropSets, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
CHECK(pIGetSession->GetSession(IID_IUnknown, (IUnknown**)&pSessUnk),S_OK);
COMPARE(DefaultObjectTesting(pSessUnk, SESSION_INTERFACE), TRUE);
COMPARE(VerifyEqualInterface(pSessUnk, m_pIOpenRowset), TRUE);
SAFE_RELEASE(pSessUnk);
if (bCommit)
TESTC(GetCommit(fRetaining))
else
TESTC(GetAbort(fRetaining))
// Make sure everything still works after commit or abort
if ((bCommit && m_fCommitPreserve) ||
((!bCommit) && m_fAbortPreserve))
ExpectedHr = S_OK;
// Test zombie
if(m_pIRowset)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&rghRows), ExpectedHr);
//Make sure everything still works after commit or abort
CHECK(hr=pIGetSession->GetSession(IID_IUnknown, (IUnknown**)&pSessUnk),ExpectedHr);
if(FAILED(hr))
TESTC(!pSessUnk)
else
TESTC(DefaultObjectTesting(pSessUnk, SESSION_INTERFACE))
CLEANUP:
if (m_pIRowset && rghRows)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL),S_OK);
FreeProperties(&cPropSets, &rgPropSets);
SAFE_FREE(rghRows);
SAFE_RELEASE(pSessUnk);
SAFE_RELEASE(pIGetSession);
//Return code of Commit/Abort will vary depending on whether
//or not we have an open txn, so adjust accordingly
CleanUpTransaction((fRetaining) ? S_OK : XACT_E_NOTRANSACTION);
TRETURN
} //TestTxnRow
////////////////////////////////////////////////////////////////////////
// CGetSession - Class for IGetSession Test Cases.
//
////////////////////////////////////////////////////////////////////////
class CGetSession : public CSessionObject, public TCBase
{
public:
//constructors
CGetSession(WCHAR* pwszTestCaseName = INVALID(WCHAR*));
virtual ~CGetSession() {}
//methods
virtual BOOL Init(ETESTCASE eTC=TC_RowsetByOpenRowset);
virtual BOOL Terminate();
protected:
//VARIABLES...
HRESULT m_hr;
DBCOUNTITEM m_cRowsObtained;
HROW* m_rghRows;
WCHAR* m_pwszRowURL;
CRowset* m_pCRowset;
CRowset* m_pCRowsetA;
CRowObject* m_pCRowObj;
//INTERFACES...
IBindResource* m_pIBindResource;
IUnknown* m_pImplSess;
//METHODS...
//Cleanup operation for terminating a test case.
BOOL ReleaseAll();
//Execute a select * from [table] command to obtain a rowset.
BOOL GetRowsetFromCommand(
ICommandText* pICT,
IRowset** ppIRowset);
//Test the obtained IOpenRowset interface.
BOOL testIOpenRowset(IOpenRowset* pIOpenRowset);
//Helper function for testing variations
BOOL VerifyGetSession(REFIID riid);
//Get the IBindResource on Root Binder and get a ROW URL.
BOOL GetRootBinder();
};
//----------------------------------------------------------------------
// CGetSession::CGetSession
//
CGetSession::CGetSession(WCHAR * wstrTestCaseName) : CSessionObject(wstrTestCaseName)
{
m_pwszRowURL = NULL;
m_cRowsObtained = 0;
m_rghRows = NULL;
m_pwszRowURL = NULL;
m_pCRowset = NULL;
m_pCRowsetA = NULL;
m_pCRowObj = NULL;
m_pIBindResource = NULL;
m_pImplSess = NULL;
}
//----------------------------------------------------------------------
// CGetSession::Init
//
BOOL CGetSession::Init(ETESTCASE eTC)
{
TBEGIN
HRESULT hr = E_FAIL;
IID iid = IID_IOpenRowset;
DBID dbid;
DBIMPLICITSESSION dbImplSess;
ULONG_PTR ulVal = 0;
BOOL bSingleton = FALSE;
BOOL fSkip = FALSE;
IDBCreateCommand* pIDBCC = NULL;
IDBSchemaRowset* pIDBSR = NULL;
IColumnsRowset* pIColRowset = NULL;
ICommandText* pICT = NULL;
IRowset* pIRowset = NULL;
IGetSourceRow* pIGSR = NULL;
IRow* pIRow = NULL;
IBindResource* pIBRProv = NULL;
CRowset RowsetA;
memset(&dbImplSess, 0, sizeof(DBIMPLICITSESSION));
m_pCRowset = NULL;
m_pCRowObj = NULL;
TESTC(CSessionObject::Init())
SetTable(g_pTable, DELETETABLE_NO);
m_pCRowset = new CRowset();
TESTC(m_pCRowset!=NULL)
m_pCRowObj = new CRowObject();
TESTC(m_pCRowObj!=NULL)
GetProperty(DBPROP_OLEOBJECTS, DBPROPSET_DATASOURCEINFO,
(IUnknown*)g_pIDBInitialize, &ulVal);
//The INIT will vary depending on type of Test Case. They all involve
//getting a ROW object (by various different means) and putting it
//in m_pCRowObj.
switch(eTC)
{
//Get a Rowset using OpenRowset, and obtain a Row obj from it.
case TC_RowsetByOpenRowset:
{
VARIANT_BOOL bValue;
m_pCRowset->SetProperty(DBPROP_CANHOLDROWS);
TESTC_(m_pCRowset->CreateRowset(),S_OK);
TESTC_(m_pCRowset->GetNextRows(0, 1, &m_cRowsObtained, &m_rghRows),S_OK)
TEST3C_(hr = m_pCRowObj->CreateRowObject(m_pCRowset->pIRowset(),
m_rghRows[0]), S_OK, DB_S_NOROWSPECIFICCOLUMNS, E_NOINTERFACE)
if(!(ulVal & DBPROPVAL_OO_ROWOBJECT))
fSkip = TRUE;
if(hr == E_NOINTERFACE)
{
COMPARE(fSkip, TRUE);
TESTC_PROVIDER(!fSkip)
}
else
COMPARE(fSkip, FALSE);
//Make sure DBPROP_IRow prop is supported by the rowset.
COMPARE(GetProperty(DBPROP_IRow, DBPROPSET_ROWSET, (IUnknown*)
m_pCRowset->pIRowset(), &bValue), TRUE);
}
break;
//Get a Rowset by executing a command, and obtain a Row obj from it.
case TC_RowsetByCommand:
{
VARIANT_BOOL bValue;
TESTC_PROVIDER(VerifyInterface(g_pIOpenRowset,IID_IDBCreateCommand,
SESSION_INTERFACE, (IUnknown**)&pIDBCC))
TESTC_(pIDBCC->CreateCommand(NULL, IID_ICommandText, (IUnknown**)
&pICT), S_OK)
TESTC(GetRowsetFromCommand(pICT, &pIRowset))
TESTC_(m_pCRowset->CreateRowset(pIRowset),S_OK);
TESTC_(m_pCRowset->GetNextRows(0, 1, &m_cRowsObtained, &m_rghRows),S_OK)
TEST3C_(hr = m_pCRowObj->CreateRowObject(m_pCRowset->pIRowset(),
m_rghRows[0]), S_OK, DB_S_NOROWSPECIFICCOLUMNS, E_NOINTERFACE)
if(!(ulVal & DBPROPVAL_OO_ROWOBJECT))
fSkip = TRUE;
if(hr == E_NOINTERFACE)
{
COMPARE(fSkip, TRUE);
TESTC_PROVIDER(!fSkip)
}
else
COMPARE(fSkip, FALSE);
//Make sure DBPROP_IRow prop is supported by the rowset.
COMPARE(GetProperty(DBPROP_IRow, DBPROPSET_ROWSET, (IUnknown*)
m_pCRowset->pIRowset(), &bValue), TRUE);
}
break;
//Get a Schema Rowset, and obtain a Row obj from it.
case TC_SchemaRowset:
{
TESTC_PROVIDER(VerifyInterface(g_pIOpenRowset,IID_IDBSchemaRowset,
SESSION_INTERFACE, (IUnknown**)&pIDBSR))
TESTC_(pIDBSR->GetRowset(NULL, DBSCHEMA_PROVIDER_TYPES, 0,
NULL, IID_IRowset, 0, NULL, (IUnknown**)&pIRowset), S_OK)
TESTC_(m_pCRowset->CreateRowset(pIRowset),S_OK);
TESTC_(m_pCRowset->GetNextRows(0, 1, &m_cRowsObtained, &m_rghRows),S_OK)
TEST3C_(hr = m_pCRowObj->CreateRowObject(m_pCRowset->pIRowset(),
m_rghRows[0]), S_OK, DB_S_NOROWSPECIFICCOLUMNS, E_NOINTERFACE)
TESTC_PROVIDER(hr != E_NOINTERFACE)
}
break;
//Get a Columns Rowset, and obtain a Row obj from it.
case TC_ColumnsRowset:
{
m_pCRowsetA = new CRowset();
TESTC(m_pCRowsetA!=NULL)
m_pCRowsetA->SetProperty(DBPROP_IColumnsRowset);
TESTC_PROVIDER(S_OK == m_pCRowsetA->CreateRowset())
TESTC(VerifyInterface(m_pCRowsetA->pIRowset(),IID_IColumnsRowset,
ROWSET_INTERFACE, (IUnknown**)&pIColRowset))
TESTC_(pIColRowset->GetColumnsRowset(NULL, 0, NULL, IID_IRowset,
0, NULL, (IUnknown**)&pIRowset), S_OK)
TESTC_(m_pCRowset->CreateRowset(pIRowset),S_OK);
TESTC_(m_pCRowset->GetNextRows(0, 1, &m_cRowsObtained, &m_rghRows),S_OK)
TEST3C_(hr = m_pCRowObj->CreateRowObject(m_pCRowset->pIRowset(),
m_rghRows[0]), S_OK, DB_S_NOROWSPECIFICCOLUMNS, E_NOINTERFACE)
TESTC_PROVIDER(hr != E_NOINTERFACE)
}
break;
//Get a Row obj by direct binding from Root Binder.
case TC_DirectBindOnRootBinder:
{
TESTC(GetRootBinder())
dbImplSess.pUnkOuter = NULL;
dbImplSess.pSession = NULL;
dbImplSess.piid = &iid;
TESTC_PROVIDER(m_pwszRowURL!=NULL)
TESTC_PROVIDER((ulVal & DBPROPVAL_OO_DIRECTBIND) == DBPROPVAL_OO_DIRECTBIND)
TESTC_(m_pIBindResource->Bind(NULL, m_pwszRowURL,
DBBINDURLFLAG_READ, DBGUID_ROW, IID_IRow, NULL, &dbImplSess,
NULL, (IUnknown**)&pIRow), S_OK)
TESTC((pIRow != NULL) && (dbImplSess.pSession != NULL))
TESTC(VerifyInterface(dbImplSess.pSession,IID_IOpenRowset,
SESSION_INTERFACE, (IUnknown**)&m_pImplSess))
TESTC_(m_pCRowObj->SetRowObject(pIRow),S_OK)
}
break;
//Get a Row obj by direct binding from Provider.
case TC_DirectBindOnProvider:
{
TESTC(GetRootBinder())
dbImplSess.pUnkOuter = NULL;
dbImplSess.pSession = NULL;
dbImplSess.piid = &iid;
TESTC_PROVIDER(m_pwszRowURL!=NULL)
TESTC_PROVIDER((ulVal & DBPROPVAL_OO_DIRECTBIND) == DBPROPVAL_OO_DIRECTBIND)
TESTC_(m_pIBindResource->Bind(NULL, m_pwszRowURL,
DBBINDURLFLAG_READ, DBGUID_SESSION, IID_IBindResource, NULL,
NULL, NULL, (IUnknown**)&pIBRProv), S_OK)
TESTC(pIBRProv!=NULL)
TESTC_(pIBRProv->Bind(NULL, m_pwszRowURL,
DBBINDURLFLAG_READ, DBGUID_ROW, IID_IRow, NULL, NULL,
NULL, (IUnknown**)&pIRow), S_OK)
TESTC(pIRow != NULL)
TESTC(VerifyInterface(pIBRProv,IID_IOpenRowset,
SESSION_INTERFACE, (IUnknown**)&m_pImplSess))
TESTC_(m_pCRowObj->SetRowObject(pIRow),S_OK)
}
break;
//Get a Row obj by calling GetSourceRow from a Stream obj.
case TC_GetSourceRow:
{
TESTC(GetRootBinder())
dbImplSess.pUnkOuter = NULL;
dbImplSess.pSession = NULL;
dbImplSess.piid = &iid;
TESTC_PROVIDER(m_pwszRowURL!=NULL)
TESTC_PROVIDER((ulVal & DBPROPVAL_OO_DIRECTBIND) == DBPROPVAL_OO_DIRECTBIND)
TESTC_(m_pIBindResource->Bind(NULL, m_pwszRowURL,
DBBINDURLFLAG_READ, DBGUID_STREAM, IID_IGetSourceRow, NULL,
&dbImplSess, NULL, (IUnknown**)&pIGSR), S_OK)
TESTC((pIGSR != NULL) && (dbImplSess.pSession != NULL))
TESTC(VerifyInterface(dbImplSess.pSession,IID_IOpenRowset,
SESSION_INTERFACE, (IUnknown**)&m_pImplSess))
TESTC_PROVIDER(pIGSR->GetSourceRow(IID_IRow, (IUnknown**)&pIRow) == S_OK)
TESTC(pIRow!=NULL)
TESTC_(m_pCRowObj->SetRowObject(pIRow),S_OK)
}
break;
//Get a Row obj from OpenRowset.
case TC_OpenRowsetDirect:
{
TESTC((g_pIOpenRowset!=NULL) && (m_pTable!=NULL))
dbid = m_pTable->GetTableID();
TEST3C_(hr = g_pIOpenRowset->OpenRowset(NULL, &dbid, NULL,
IID_IRow, 0, NULL, (IUnknown**)&pIRow), S_OK, DB_S_NOTSINGLETON,
E_NOINTERFACE)
if(!(ulVal & DBPROPVAL_OO_SINGLETON))
fSkip = TRUE;
if(hr == E_NOINTERFACE)
{
COMPARE(fSkip, TRUE);
TESTC_PROVIDER(!fSkip)
}
else
COMPARE(fSkip, FALSE);
TESTC(pIRow!=NULL)
TESTC_(m_pCRowObj->SetRowObject(pIRow), S_OK)
}
break;
//Get a Row obj directly by executing a command.
case TC_CommandDirect:
{
if(ulVal & DBPROPVAL_OO_SINGLETON)
bSingleton = TRUE;
TEST3C_(hr = m_pTable->ExecuteCommand(SELECT_ALLFROMTBL, IID_IRow,
NULL, NULL, NULL, NULL, EXECUTE_IFNOERROR, 0, NULL, NULL,
(IUnknown**)&pIRow, NULL), S_OK,
DB_S_NOTSINGLETON, E_NOINTERFACE)
if(!(ulVal & DBPROPVAL_OO_SINGLETON))
fSkip = TRUE;
if(hr == E_NOINTERFACE)
{
COMPARE(fSkip, TRUE);
TESTC_PROVIDER(!fSkip)
}
else
COMPARE(fSkip, FALSE);
TESTC(pIRow != NULL)
TESTC_(m_pCRowObj->SetRowObject(pIRow), S_OK)
}
break;
default:
ASSERT(!L"Unhandled Type...");
break;
};
CLEANUP:
SAFE_RELEASE(pICT);
SAFE_RELEASE(pIBRProv);
SAFE_RELEASE(pIGSR);
SAFE_RELEASE(pIRow);
SAFE_RELEASE(dbImplSess.pSession);
SAFE_RELEASE(pIColRowset);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIDBSR);
SAFE_RELEASE(pIDBCC);
TRETURN
} //Init
//----------------------------------------------------------------------
// CGetSession::Terminate
//
BOOL CGetSession::Terminate()
{
ReleaseAll();
return CSessionObject::Terminate();
} //Terminate
//----------------------------------------------------------------------
// CGetSession::ReleaseAll
//
BOOL CGetSession::ReleaseAll()
{
if(m_rghRows && m_pCRowset)
m_pCRowset->ReleaseRows(m_cRowsObtained, m_rghRows);
SAFE_FREE(m_rghRows);
SAFE_FREE(m_pwszRowURL);
SAFE_DELETE(m_pCRowObj);
SAFE_DELETE(m_pCRowset);
SAFE_DELETE(m_pCRowsetA);
SAFE_RELEASE(m_pIBindResource);
SAFE_RELEASE(m_pImplSess);
return TRUE;
} //ReleaseAll
//----------------------------------------------------------------------
// CGetSession::testIOpenRowset
// Perform some basic testing of IOpenRowset interface that cannot be
// done in DefTestInterface func.
//
BOOL CGetSession::testIOpenRowset(IOpenRowset* pIOpenRowset)
{
TBEGIN
HRESULT hr;
ULONG cPropSets = 0;
DBPROPSET* rgPropSets = NULL;
DBID* pTableID = NULL;
IOpenRowset* pIOR = NULL;
IRowsetInfo* pIRowsetInfo = NULL;
TESTC((pIOpenRowset!=NULL) && (m_pTable!=NULL))
pTableID = &(m_pTable->GetTableIDRef());
SetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET, &cPropSets, &rgPropSets);
SetProperty(DBPROP_IRowsetIdentity, DBPROPSET_ROWSET, &cPropSets, &rgPropSets);
//Open a rowset with IRowsetInfo and test it.
TESTC_(pIOpenRowset->OpenRowset(NULL, pTableID, NULL, IID_IRowsetInfo,
cPropSets, rgPropSets, (IUnknown**)&pIRowsetInfo), S_OK)
TESTC(pIRowsetInfo!=NULL)
TEST2C_(hr=pIRowsetInfo->GetSpecification(IID_IOpenRowset, (IUnknown**)
&pIOR), S_OK, S_FALSE)
if(hr == S_OK)
TESTC(VerifyEqualInterface(pIOpenRowset, pIOR))
TESTC(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET, pIRowsetInfo))
TESTC(GetProperty(DBPROP_IRowsetIdentity, DBPROPSET_ROWSET, pIRowsetInfo))
CLEANUP:
FreeProperties(&cPropSets, &rgPropSets);
SAFE_RELEASE(pIOR);
SAFE_RELEASE(pIRowsetInfo);
TRETURN
} //testIOpenRowset
//----------------------------------------------------------------------
// CGetSession::GetRowsetFromCommand
// Execute a select * from [table] command to get back a rowset.
//
BOOL CGetSession::GetRowsetFromCommand(
ICommandText* pICT,
IRowset** ppIRowset)
{
TBEGIN
TESTC((pICT!=NULL) && (ppIRowset!=NULL) && (m_pTable!=NULL))
*ppIRowset = NULL;
TESTC_(m_pTable->ExecuteCommand(SELECT_ALLFROMTBL, IID_IRowset,
NULL,NULL,NULL,NULL, EXECUTE_IFNOERROR, 0, NULL, NULL,
(IUnknown**)ppIRowset, (ICommand**)&pICT), S_OK)
TESTC(ppIRowset != NULL)
TESTC(*ppIRowset != NULL)
CLEANUP:
TRETURN
} //GetRowsetFromCommand
//----------------------------------------------------------------------
// CGetSession::VerifyGetSession
// Common testing function for all positive case variations.
//
BOOL CGetSession::VerifyGetSession(REFIID riid)
{
TBEGIN
IUnknown* pISessUnk = INVALID(IUnknown*);
TEST3C_(m_hr = m_pCRowObj->GetSession(riid, (IUnknown**)&pISessUnk),
S_OK, DB_E_NOSOURCEOBJECT, E_NOINTERFACE)
if(FAILED(m_hr))
TESTC(!pISessUnk)
else
TESTC(pISessUnk != NULL)
//Should not get E_NOINTERFACE when a mandatory interface was asked.
if(riid==IID_IOpenRowset || riid==IID_IGetDataSource ||
riid==IID_ISessionProperties || riid==IID_IUnknown)
TEST2C_(m_hr, S_OK, DB_E_NOSOURCEOBJECT)
if(E_NOINTERFACE == m_hr)
{
odtLog<<L"INFO: "<<GetInterfaceName(riid)<<L" is not supported on session.\n";
goto CLEANUP; //Passed.
}
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
{
CHECKW(m_hr, S_OK);
goto CLEANUP; //Passed.
}
else
TESTC_(m_hr, S_OK)
TESTC(DefaultInterfaceTesting(pISessUnk, SESSION_INTERFACE, riid))
if((IID_IOpenRowset==riid) && (!m_fBinder))
TESTC(testIOpenRowset((IOpenRowset*)pISessUnk))
//If the ROW object was obtained by going thru a Binder, then
//it's Session is stored in m_pImplSess, else in g_pIOpenRowset.
if(m_fBinder)
TESTC(VerifyEqualInterface(pISessUnk, m_pImplSess))
else
TESTC(VerifyEqualInterface(pISessUnk, g_pIOpenRowset))
CLEANUP:
SAFE_RELEASE(pISessUnk);
TRETURN
} //VerifyGetSession
//----------------------------------------------------------------------
// CGetSession::GetRootBinder
// Get the IBindResource interface on Root Binder, Set Init Props, and
// get a ROW URL.
//
BOOL CGetSession::GetRootBinder()
{
TBEGIN
ULONG cPropSets = 0;
DBPROPSET* rgPropSets = NULL;
IBindResource* pIBR = NULL;
IDBBinderProperties* pIDBBProp = NULL;
pIBR = GetModInfo()->GetRootBinder();
if(!pIBR)
return FALSE;
if(!VerifyInterface(pIBR, IID_IBindResource,
BINDER_INTERFACE,(IUnknown**)&m_pIBindResource))
return FALSE;
if(!VerifyInterface(m_pIBindResource, IID_IDBBinderProperties,
BINDER_INTERFACE,(IUnknown**)&pIDBBProp))
return FALSE;
TESTC(GetInitProps(&cPropSets, &rgPropSets))
TESTC_(pIDBBProp->SetProperties(cPropSets, rgPropSets), S_OK)
//If an INI file exists and there is a [URL] section in it, get the
//ROW URL from there, otherwise look for it in CModInfo.
if(GetModInfo()->GetParseObject()->GetURL(ROW_INTERFACE))
m_pwszRowURL = wcsDuplicate(GetModInfo()->GetParseObject()->GetURL(ROW_INTERFACE));
else if(GetModInfo()->GetRootURL())
m_pwszRowURL = wcsDuplicate(GetModInfo()->GetRootURL());
if(!m_pwszRowURL)
odtLog<<L"WARNING: Could not get a ROW URL. Some Test Cases won't run.\n;";
CLEANUP:
FreeProperties(&cPropSets, &rgPropSets);
SAFE_RELEASE(pIDBBProp);
TRETURN
} //GetRootBinder
//*-----------------------------------------------------------------------
// Test Case Section
//*-----------------------------------------------------------------------
// {{ TCW_TEST_CASE_MAP(TCRowsetByOpenRowset)
//*-----------------------------------------------------------------------
// @class GetSession is tested on Row objects obtained from a Rowset which was opened using IOpenRowset
//
class TCRowsetByOpenRowset : public CGetSession {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCRowsetByOpenRowset,CGetSession);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember IID_IUnknown
int Variation_1();
// @cmember IID_IOpenRowset
int Variation_2();
// @cmember IID_IGetDataSource
int Variation_3();
// @cmember IID_ISessionProperties
int Variation_4();
// @cmember IID_IDBCreateCommand
int Variation_5();
// @cmember IID_IDBSchemaRowset
int Variation_6();
// @cmember ALL Optional Interfaces
int Variation_7();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCRowsetByOpenRowset)
#define THE_CLASS TCRowsetByOpenRowset
BEG_TEST_CASE(TCRowsetByOpenRowset, CGetSession, L"GetSession is tested on Row objects obtained from a Rowset which was opened using IOpenRowset")
TEST_VARIATION(1, L"IID_IUnknown")
TEST_VARIATION(2, L"IID_IOpenRowset")
TEST_VARIATION(3, L"IID_IGetDataSource")
TEST_VARIATION(4, L"IID_ISessionProperties")
TEST_VARIATION(5, L"IID_IDBCreateCommand")
TEST_VARIATION(6, L"IID_IDBSchemaRowset")
TEST_VARIATION(7, L"ALL Optional Interfaces")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCRowsetByOpenRowset_Boundary)
//*-----------------------------------------------------------------------
// @class Boundary cases.
//
class TCRowsetByOpenRowset_Boundary : public CGetSession {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCRowsetByOpenRowset_Boundary,CGetSession);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember E_INVALIDARG
int Variation_1();
// @cmember E_INVALIDARG or E_NOINTERFACE
int Variation_2();
// @cmember E_NOINTERFACE - IID_NULL
int Variation_3();
// @cmember E_NOINTERFACE - IID_IDBCreateSession
int Variation_4();
// @cmember E_NOINTERFACE - IID_ICommandText
int Variation_5();
// @cmember E_NOINTERFACE - IID_IRowsetInfo
int Variation_6();
// @cmember E_NOINTERFACE - IID_IRow
int Variation_7();
// @cmember E_NOINTERFACE - IID_IGetSourceRow
int Variation_8();
// @cmember E_NOINTERFACE - IID_IDBBinderProperties
int Variation_9();
// @cmember E_NOINTERFACE - IID_IRegisterProvider
int Variation_10();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCRowsetByOpenRowset_Boundary)
#define THE_CLASS TCRowsetByOpenRowset_Boundary
BEG_TEST_CASE(TCRowsetByOpenRowset_Boundary, CGetSession, L"Boundary cases.")
TEST_VARIATION(1, L"E_INVALIDARG")
TEST_VARIATION(2, L"E_INVALIDARG or E_NOINTERFACE")
TEST_VARIATION(3, L"E_NOINTERFACE - IID_NULL")
TEST_VARIATION(4, L"E_NOINTERFACE - IID_IDBCreateSession")
TEST_VARIATION(5, L"E_NOINTERFACE - IID_ICommandText")
TEST_VARIATION(6, L"E_NOINTERFACE - IID_IRowsetInfo")
TEST_VARIATION(7, L"E_NOINTERFACE - IID_IRow")
TEST_VARIATION(8, L"E_NOINTERFACE - IID_IGetSourceRow")
TEST_VARIATION(9, L"E_NOINTERFACE - IID_IDBBinderProperties")
TEST_VARIATION(10, L"E_NOINTERFACE - IID_IRegisterProvider")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCMiscellaneous)
//*-----------------------------------------------------------------------
// @class Miscellaneous variations
//
class TCMiscellaneous : public CGetSession{
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCMiscellaneous,CGetSession);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Aggregate a session and get a row.
int Variation_1();
// @cmember Release parent objects before calling GetSession.
int Variation_2();
// @cmember Delete an HROW and call GetSession.
int Variation_3();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCMiscellaneous)
#define THE_CLASS TCMiscellaneous
BEG_TEST_CASE(TCMiscellaneous, CGetSession, L"Miscellaneous variations")
TEST_VARIATION(1, L"Aggregate a session and get a row.")
TEST_VARIATION(2, L"Release parent objects before calling GetSession.")
TEST_VARIATION(3, L"Delete an HROW and call GetSession.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCRowZombie)
//*-----------------------------------------------------------------------
// @class Zombie state tests
//
class TCRowZombie : public TCTransactions {
public:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCRowZombie,TCTransactions);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Abort with fRetaining=FALSE
int Variation_1();
// @cmember Abort with fRetaining=TRUE
int Variation_2();
// @cmember Commit with fRetaining=FALSE
int Variation_3();
// @cmember Commit with fRetaining=TRUE
int Variation_4();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCRowZombie)
#define THE_CLASS TCRowZombie
BEG_TEST_CASE(TCRowZombie, TCTransactions, L"Zombie state tests")
TEST_VARIATION(1, L"Abort with fRetaining=FALSE")
TEST_VARIATION(2, L"Abort with fRetaining=TRUE")
TEST_VARIATION(3, L"Commit with fRetaining=FALSE")
TEST_VARIATION(4, L"Commit with fRetaining=TRUE")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// }} END_DECLARE_TEST_CASES()
////////////////////////////////////////////////////////////////////////
// Copying Test Cases to make duplicate ones.
//
////////////////////////////////////////////////////////////////////////
#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;
//2
COPY_TEST_CASE(TCRowsetByCommand, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCRowsetByCommand_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCRowsetByCommand_Zombie, TCRowZombie)
//3
COPY_TEST_CASE(TCSchemaRowset, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCSchemaRowset_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCSchemaRowset_Zombie, TCRowZombie)
//4
COPY_TEST_CASE(TCColumnsRowset, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCColumnsRowset_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCColumnsRowset_Zombie, TCRowZombie)
//5
COPY_TEST_CASE(TCDirectBindOnRootBinder, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCDirectBindOnRootBinder_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCDirectBindOnRootBinder_Zombie, TCRowZombie)
//6
COPY_TEST_CASE(TCDirectBindOnProvider, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCDirectBindOnProvider_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCDirectBindOnProvider_Zombie, TCRowZombie)
//7
COPY_TEST_CASE(TCGetSourceRow, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCGetSourceRow_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCGetSourceRow_Zombie, TCRowZombie)
//8
COPY_TEST_CASE(TCOpenRowsetDirect, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCOpenRowsetDirect_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCOpenRowsetDirect_Zombie, TCRowZombie)
//9
COPY_TEST_CASE(TCCommandDirect, TCRowsetByOpenRowset)
COPY_TEST_CASE(TCCommandDirect_Boundary, TCRowsetByOpenRowset_Boundary)
COPY_TEST_CASE(TCCommandDirect_Zombie, TCRowZombie)
//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 parameter 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.
#if 0
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(4, ThisModule, gwszModuleDescrip)
TEST_CASE(1, TCRowsetByOpenRowset)
TEST_CASE(2, TCRowsetByOpenRowset_Boundary)
TEST_CASE(3, TCMiscellaneous)
TEST_CASE(4, TCRowZombie)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
#else
TEST_MODULE(20, ThisModule, gwszModuleDescrip)
//1
TEST_CASE(1, TCRowsetByOpenRowset)
TEST_CASE(2, TCRowsetByOpenRowset_Boundary)
//2
TEST_CASE_WITH_PARAM(3, TCRowsetByCommand, TC_RowsetByCommand)
TEST_CASE_WITH_PARAM(4, TCRowsetByCommand_Boundary, TC_RowsetByCommand)
//3
TEST_CASE_WITH_PARAM(5, TCSchemaRowset, TC_SchemaRowset)
TEST_CASE_WITH_PARAM(6, TCSchemaRowset_Boundary, TC_SchemaRowset)
//4
TEST_CASE_WITH_PARAM(7, TCColumnsRowset, TC_ColumnsRowset)
TEST_CASE_WITH_PARAM(8, TCColumnsRowset_Boundary, TC_ColumnsRowset)
//5
TEST_CASE_WITH_PARAM(9, TCDirectBindOnRootBinder, TC_DirectBindOnRootBinder)
TEST_CASE_WITH_PARAM(10, TCDirectBindOnRootBinder_Boundary, TC_DirectBindOnRootBinder)
//6
TEST_CASE_WITH_PARAM(11, TCDirectBindOnProvider, TC_DirectBindOnProvider)
TEST_CASE_WITH_PARAM(12, TCDirectBindOnProvider_Boundary, TC_DirectBindOnProvider)
//7
TEST_CASE_WITH_PARAM(13, TCGetSourceRow, TC_GetSourceRow)
TEST_CASE_WITH_PARAM(14, TCGetSourceRow_Boundary, TC_GetSourceRow)
//8
TEST_CASE_WITH_PARAM(15, TCOpenRowsetDirect, TC_OpenRowsetDirect)
TEST_CASE_WITH_PARAM(16, TCOpenRowsetDirect_Boundary, TC_OpenRowsetDirect)
//9
TEST_CASE_WITH_PARAM(17, TCCommandDirect, TC_CommandDirect)
TEST_CASE_WITH_PARAM(18, TCCommandDirect_Boundary, TC_CommandDirect)
TEST_CASE(19, TCMiscellaneous)
TEST_CASE(20, TCRowZombie)
END_TEST_MODULE()
#endif
// {{ TCW_TC_PROTOTYPE(TCRowsetByOpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: TCRowsetByOpenRowset - GetSession is tested on Row objects obtained from a Rowset which was opened using IOpenRowset
//| Created: 9/29/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCRowsetByOpenRowset::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
return CGetSession::Init(m_eTestCase);
// }}
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc IID_IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_1()
{
return VerifyGetSession(IID_IUnknown);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc IID_IOpenRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_2()
{
return VerifyGetSession(IID_IOpenRowset);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc IID_IGetDataSource
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_3()
{
return VerifyGetSession(IID_IGetDataSource);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc IID_ISessionProperties
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_4()
{
return VerifyGetSession(IID_ISessionProperties);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc IID_IDBCreateCommand
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_5()
{
return VerifyGetSession(IID_IDBCreateCommand);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc IID_IDBSchemaRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_6()
{
return VerifyGetSession(IID_IDBSchemaRowset);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc ALL Optional Interfaces
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset::Variation_7()
{
TBEGIN
ULONG i = 0;
ULONG cInterfaces = 0;
INTERFACEMAP* rgInterfaces = NULL;
// Obtain the SESSION interface array
TESTC(GetInterfaceArray(SESSION_INTERFACE, &cInterfaces, &rgInterfaces));
for(i=0; i < cInterfaces; i++)
{
//If interface is optional
if(!rgInterfaces[i].fMandatory)
TESTC(VerifyGetSession(*(rgInterfaces[i].pIID)));
}
CLEANUP:
if(TESTB==TEST_FAIL)
odtLog<<L"INFO: Failed on interface "<<GetInterfaceName(*(rgInterfaces[i].pIID))<<".\n";
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCRowsetByOpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CGetSession::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(TCRowsetByOpenRowset_Boundary)
//*-----------------------------------------------------------------------
//| Test Case: TCRowsetByOpenRowset_Boundary - Boundary cases.
//| Created: 10/5/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCRowsetByOpenRowset_Boundary::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
return CGetSession::Init(m_eTestCase);
// }}
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_1()
{
TBEGIN
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IOpenRowset, NULL),
E_INVALIDARG, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_INVALIDARG);
CLEANUP:
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG or E_NOINTERFACE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_2()
{
TBEGIN
TEST3C_(m_hr = m_pCRowObj->GetSession(IID_IDBCreateSession, NULL),
E_INVALIDARG, E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_INVALIDARG);
CLEANUP:
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_3()
{
TBEGIN
IUnknown* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_NULL, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IDBCreateSession
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_4()
{
TBEGIN
IDBCreateSession* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IDBCreateSession, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_ICommandText
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_5()
{
TBEGIN
ICommandText* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_ICommandText, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IRowsetInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_6()
{
TBEGIN
IRowsetInfo* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IRowsetInfo, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IRow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_7()
{
TBEGIN
IRow* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IRow, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IGetSourceRow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_8()
{
TBEGIN
IGetSourceRow* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IGetSourceRow, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IDBBinderProperties
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_9()
{
TBEGIN
IDBBinderProperties* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IDBBinderProperties, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc E_NOINTERFACE - IID_IRegisterProvider
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowsetByOpenRowset_Boundary::Variation_10()
{
TBEGIN
IRegisterProvider* pIUnk = NULL;
TEST2C_(m_hr = m_pCRowObj->GetSession(IID_IRegisterProvider, (IUnknown**)&pIUnk),
E_NOINTERFACE, DB_E_NOSOURCEOBJECT)
if((DB_E_NOSOURCEOBJECT == m_hr) && m_fWarning)
CHECKW(m_hr, E_NOINTERFACE);
TESTC(!pIUnk)
CLEANUP:
SAFE_RELEASE(pIUnk);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCRowsetByOpenRowset_Boundary::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CGetSession::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(TCMiscellaneous)
//*-----------------------------------------------------------------------
//| Test Case: TCMiscellaneous - Miscellaneous variations
//| Created: 5/18/1999
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCMiscellaneous::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CSessionObject::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Aggregate a session and get a row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCMiscellaneous::Variation_1()
{
TBEGIN
HRESULT hr;
DBCOUNTITEM cRowsObtained=0;
HROW* rghRows=NULL;
IDBCreateSession* pIDBCS=NULL;
IOpenRowset* pIOR=NULL;
IGetRow* pIGR=NULL;
IRowset* pIRowset=NULL;
IGetSession* pIGS=NULL;
IUnknown* pISessUnk=NULL;
IUnknown* pIUnkInner = NULL;
IRow* pIRow = NULL;
CAggregate Aggregate;
//Create a new aggregated session.
TEST2C_(hr = CreateNewSession(NULL, IID_IUnknown,
(IUnknown**)&pIUnkInner, &Aggregate), S_OK, DB_E_NOAGGREGATION);
Aggregate.SetUnkInner(pIUnkInner);
TESTC_PROVIDER(hr == S_OK);
TESTC(VerifyInterface(pIUnkInner,IID_IOpenRowset,
SESSION_INTERFACE, (IUnknown**)&pIOR))
//Open a rowset on this aggregated session and get a row
//object from it.
TEST2C_(hr = pIOR->OpenRowset(NULL, &(g_pTable->GetTableID()),
NULL, IID_IGetRow, 0, NULL, (IUnknown**)&pIGR), S_OK, E_NOINTERFACE)
if(hr == S_OK)
{
TESTC(VerifyInterface(pIGR,IID_IRowset,
ROWSET_INTERFACE, (IUnknown**)&pIRowset))
TESTC_(hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained,
&rghRows), S_OK)
TESTC_(hr = pIGR->GetRowFromHROW(NULL, rghRows[0],
IID_IGetSession, (IUnknown**)&pIGS), S_OK)
}
else
{
TEST2C_(hr = pIOR->OpenRowset(NULL, &(g_pTable->GetTableID()),
NULL, IID_IRow, 0, NULL, (IUnknown**)&pIRow), S_OK, E_NOINTERFACE)
TESTC_PROVIDER(hr == S_OK);
TESTC(VerifyInterface(pIRow,IID_IGetSession,
ROW_INTERFACE, (IUnknown**)&pIGS))
}
//Call GetSession and verify the correct IUnknown is returned.
TEST2C_(hr = pIGS->GetSession(IID_IUnknown,
(IUnknown**)&pISessUnk), S_OK, DB_E_NOSOURCEOBJECT)
TESTC_PROVIDER(hr == S_OK)
TESTC(VerifyEqualInterface(pISessUnk, (IUnknown*)&Aggregate))
CLEANUP:
if(pIRowset && rghRows)
pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL,NULL,NULL);
SAFE_FREE(rghRows);
SAFE_RELEASE(pIUnkInner);
SAFE_RELEASE(pISessUnk);
SAFE_RELEASE(pIGS);
SAFE_RELEASE(pIRow);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIGR);
SAFE_RELEASE(pIOR);
SAFE_RELEASE(pIDBCS);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Release parent objects before calling GetSession.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCMiscellaneous::Variation_2()
{
TBEGIN
HRESULT hr;
DBCOUNTITEM cRowsObtained=0;
HROW* rghRows=NULL;
IDBCreateSession* pIDBCS=NULL;
IOpenRowset* pIOR=NULL;
IGetRow* pIGR=NULL;
IRowset* pIRowset=NULL;
IGetSession* pIGS=NULL;
IUnknown* pISessUnk=NULL;
IRow* pIRow = NULL;
//Create a new dso and session.
TESTC_(CreateNewDSO(NULL, IID_IDBCreateSession,
(IUnknown**)&pIDBCS), S_OK)
TESTC_(hr = pIDBCS->CreateSession(NULL, IID_IOpenRowset,
(IUnknown**)&pIOR), S_OK)
//Open a rowset and get a row object from first row.
TEST2C_(hr = pIOR->OpenRowset(NULL, &(g_pTable->GetTableID()),
NULL, IID_IGetRow, 0, NULL, (IUnknown**)&pIGR), S_OK, E_NOINTERFACE)
if(hr == S_OK)
{
TESTC(VerifyInterface(pIGR,IID_IRowset,
ROWSET_INTERFACE, (IUnknown**)&pIRowset))
TESTC_(hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained,
&rghRows), S_OK)
TESTC_(hr = pIGR->GetRowFromHROW(NULL, rghRows[0],
IID_IGetSession, (IUnknown**)&pIGS), S_OK)
}
else
{
TEST2C_(hr = pIOR->OpenRowset(NULL, &(g_pTable->GetTableID()),
NULL, IID_IRow, 0, NULL, (IUnknown**)&pIRow), S_OK, E_NOINTERFACE)
TESTC_PROVIDER(hr == S_OK);
TESTC(VerifyInterface(pIRow,IID_IGetSession,
ROW_INTERFACE, (IUnknown**)&pIGS))
}
//Call GetSession and verify.
TEST2C_(hr = pIGS->GetSession(IID_IUnknown,
(IUnknown**)&pISessUnk), S_OK, DB_E_NOSOURCEOBJECT)
TESTC_PROVIDER(hr == S_OK)
TESTC(VerifyEqualInterface(pISessUnk, pIOR))
//Release all parent objects.
if(pIRowset && rghRows)
pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL,NULL,NULL);
SAFE_FREE(rghRows);
SAFE_RELEASE(pISessUnk);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIGR);
SAFE_RELEASE(pIOR);
SAFE_RELEASE(pIDBCS);
//Verify that GetSession still works.
TESTC_(hr = pIGS->GetSession(IID_IOpenRowset,
(IUnknown**)&pIOR), S_OK)
TESTC(pIOR!=NULL)
TESTC(DefTestInterface((IOpenRowset*)pIOR))
CLEANUP:
if(pIRowset && rghRows)
pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL,NULL,NULL);
SAFE_FREE(rghRows);
SAFE_RELEASE(pISessUnk);
SAFE_RELEASE(pIGS);
SAFE_RELEASE(pIRow);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIGR);
SAFE_RELEASE(pIOR);
SAFE_RELEASE(pIDBCS);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete an HROW and call GetSession.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCMiscellaneous::Variation_3()
{
TBEGIN
HRESULT hr;
DBCOUNTITEM cRowsObtained=0;
ULONG cPropSets=0;
DBPROPSET* rgPropSets=NULL;
HROW* rghRows=NULL;
IDBCreateSession* pIDBCS=NULL;
IOpenRowset* pIOR=NULL;
IGetRow* pIGR=NULL;
IRowset* pIRowset=NULL;
IRowsetChange* pIRowsetChange=NULL;
IGetSession* pIGS=NULL;
IUnknown* pISessUnk=NULL;
//Create a new dso and session.
TESTC_(CreateNewDSO(NULL, IID_IDBCreateSession,
(IUnknown**)&pIDBCS), S_OK)
TESTC_(hr = pIDBCS->CreateSession(NULL, IID_IOpenRowset,
(IUnknown**)&pIOR), S_OK)
//Set props to get an updateable rowset.
SetProperty(DBPROP_IRowsetChange, DBPROPSET_ROWSET,
&cPropSets, &rgPropSets) ;
SetProperty(DBPROP_UPDATABILITY, DBPROPSET_ROWSET,
&cPropSets, &rgPropSets, (void*)DBPROPVAL_UP_DELETE, DBTYPE_I4) ;
//Get an updateable rowset, and get a row object from
//it's first row.
TEST2C_(hr = pIOR->OpenRowset(NULL, &(g_pTable->GetTableID()),
NULL, IID_IRowsetChange, cPropSets, rgPropSets, (IUnknown**)&pIRowsetChange),
S_OK, DB_E_ERRORSOCCURRED)
TESTC_PROVIDER(hr == S_OK);
TESTC_PROVIDER(VerifyInterface(pIRowsetChange,IID_IGetRow,
ROWSET_INTERFACE, (IUnknown**)&pIGR))
TESTC(VerifyInterface(pIGR,IID_IRowset,
ROWSET_INTERFACE, (IUnknown**)&pIRowset))
TESTC_(hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained,
&rghRows), S_OK)
TESTC_(hr = pIGR->GetRowFromHROW(NULL, rghRows[0],
IID_IGetSession, (IUnknown**)&pIGS), S_OK)
//Call Getsession and verify.
TEST2C_(hr = pIGS->GetSession(IID_IUnknown,
(IUnknown**)&pISessUnk), S_OK, DB_E_NOSOURCEOBJECT)
TESTC_PROVIDER(hr == S_OK)
TESTC(VerifyEqualInterface(pISessUnk, pIOR))
SAFE_RELEASE(pISessUnk);
//Delete the row.
TESTC_(hr=pIRowsetChange->DeleteRows(NULL, 1, rghRows, NULL), S_OK)
SAFE_FREE(rghRows);
//Call GetSession again and verify.
TESTC_(hr = pIGS->GetSession(IID_IUnknown,
(IUnknown**)&pISessUnk), S_OK)
TESTC(pISessUnk!=NULL)
TESTC(VerifyEqualInterface(pISessUnk, pIOR))
CLEANUP:
FreeProperties(&cPropSets, &rgPropSets);
if(pIRowset && rghRows)
pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL,NULL,NULL);
SAFE_FREE(rghRows);
SAFE_RELEASE(pISessUnk);
SAFE_RELEASE(pIGS);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIRowsetChange);
SAFE_RELEASE(pIGR);
SAFE_RELEASE(pIOR);
SAFE_RELEASE(pIDBCS);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCMiscellaneous::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CSessionObject::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END
// {{ TCW_TC_PROTOTYPE(TCRowZombie)
//*-----------------------------------------------------------------------
//| Test Case: TCRowZombie - Zombie state tests
//| Created: 10/5/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCRowZombie::Init()
{
// Check to see if Transactions are usable
if(!IsUsableInterface(SESSION_INTERFACE, IID_ITransactionLocal))
return TEST_SKIPPED;
// Initialize to a invalid pointer
m_pITransactionLocal = INVALID(ITransactionLocal*);
// {{ TCW_INIT_BASECLASS_CHECK
if(TCTransactions::Init())
// }}
{
//This is a mandatory interface, it should always succeed
if(!RegisterInterface(ROW_INTERFACE, IID_IGetSession, 0, NULL))
return TEST_SKIPPED;
else
return TRUE;
}
// Check to see if ITransaction is supported
if(!m_pITransactionLocal)
return TEST_SKIPPED;
// Clear the bad pointer value
if(m_pITransactionLocal == INVALID(ITransactionLocal*))
m_pITransactionLocal = NULL;
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Abort with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowZombie::Variation_1()
{
return TestTxnRow(FALSE, FALSE);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Abort with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowZombie::Variation_2()
{
return TestTxnRow(FALSE, TRUE);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Commit with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowZombie::Variation_3()
{
return TestTxnRow(TRUE, FALSE);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Commit with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCRowZombie::Variation_4()
{
return TestTxnRow(TRUE, TRUE);
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCRowZombie::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCTransactions::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END