#include #include #include #include #include "pagemgr.h" #include "VarObjHeap.h" #include #include #include // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Assertion code // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DWORD _RetAssert(TCHAR *msg, DWORD dwRes, const char *filename, int line) { if (dwRes == ERROR_SUCCESS) return dwRes; TCHAR *buf = new TCHAR[512]; if (buf == NULL) { return dwRes; } wsprintf(buf, __TEXT("%s\ndwRes = 0x%X\nFile: %S, Line: %lu\n\nPress Cancel to stop in debugger, OK to continue"), msg, dwRes, filename, line); _tprintf(buf); int mbRet = MessageBox(0, buf, __TEXT("WMI Assert"), MB_OKCANCEL | MB_ICONSTOP | MB_SYSTEMMODAL | MB_SERVICE_NOTIFICATION); delete [] buf; if (mbRet == IDCANCEL) { DebugBreak(); } return dwRes; } #define TEST_ASSERT(msg, dwRes) _RetAssert(msg, dwRes, __FILE__, __LINE__) CVarObjHeap *pHeap = NULL; CPageSource *pTranMan = NULL; #define TEST_OBJECT_SIZE 30000 #define TEST_OBJECT_ITER 25000 DWORD TestMem(BYTE *buff, DWORD dwLen, BYTE dwSig) { for (DWORD dwIndex = 0; dwIndex != dwLen; dwIndex++) { if (buff[dwIndex] != dwSig) return ERROR_INVALID_DATA; } return ERROR_SUCCESS; } DWORD Init() { DWORD dwRes = ERROR_SUCCESS; pHeap = new CVarObjHeap; pTranMan = new CPageSource; if ((pHeap == NULL) || (pTranMan == NULL)) { dwRes = ERROR_OUTOFMEMORY; } if (dwRes == ERROR_SUCCESS) { dwRes = pTranMan->Init(); TEST_ASSERT(L"Initialization of Transaction Manager failed!", dwRes); } if (dwRes == ERROR_SUCCESS) { dwRes = pHeap->Initialize(pTranMan); TEST_ASSERT(L"Initialization of object heap failed!", dwRes); } return dwRes; } DWORD WriteBuffer(BYTE *pbBuffer, DWORD dwLength, DWORD *pdwPage, DWORD *pdwOffset) { DWORD dwRes; dwRes = pTranMan->BeginTrans(); TEST_ASSERT(L"Begin Transaction Failed!", dwRes); if (dwRes == ERROR_SUCCESS) dwRes = pHeap->WriteNewBuffer(dwLength, pbBuffer, pdwPage, pdwOffset); printf("Written %d bytes with signature of <%d> to pageId <0x%X>, offset <0x%X>\n", dwLength, pbBuffer[0], *pdwPage, *pdwOffset); TEST_ASSERT(L"Write failed!", dwRes); if (dwRes == ERROR_SUCCESS) { dwRes = pTranMan->CommitTrans(); TEST_ASSERT(L"Commit Transaction Failed!", dwRes); } if (dwRes != ERROR_SUCCESS) { dwRes = pTranMan->RollbackTrans(); TEST_ASSERT(L"Abort Transaction Failed!", dwRes); } return dwRes; } DWORD DeleteBuffer(DWORD dwPage, DWORD dwOffset) { DWORD dwRes; dwRes = pTranMan->BeginTrans(); TEST_ASSERT(L"Begin Transaction Failed!", dwRes); dwRes = pHeap->DeleteBuffer(dwPage, dwOffset); TEST_ASSERT(L"DeleteBuffer failed!", dwRes); if (dwRes == ERROR_SUCCESS) { dwRes = pTranMan->CommitTrans(); TEST_ASSERT(L"Commit Transaction Failed!", dwRes); } if (dwRes != ERROR_SUCCESS) { dwRes = pTranMan->RollbackTrans(); TEST_ASSERT(L"Abort Transaction Failed!", dwRes); } return dwRes; } void __cdecl main(void) { DWORD dwRes = ERROR_SUCCESS; BYTE* buff = new BYTE[TEST_OBJECT_SIZE]; DWORD* aPageId = new DWORD[TEST_OBJECT_ITER]; DWORD* aOffsetId = new DWORD [TEST_OBJECT_ITER]; DWORD* aSize = new DWORD [TEST_OBJECT_ITER]; BYTE *pBuffer; if ((buff == 0) || (aPageId == 0) || (aOffsetId == 0) || (aSize == 0)) { dwRes = ERROR_OUTOFMEMORY; } if (dwRes == ERROR_SUCCESS) dwRes = Init(); if (dwRes == ERROR_SUCCESS) { for (int i = 0; i < TEST_OBJECT_ITER; i++) { aSize[i] = rand() % TEST_OBJECT_SIZE; memset(buff, i, aSize[i]); dwRes = WriteBuffer(buff, aSize[i], &aPageId[i], &aOffsetId[i]); } for (i = 0; i < TEST_OBJECT_ITER; i++) { pBuffer = NULL; DWORD dwLen; dwRes = pHeap->ReadBuffer(aPageId[i], aOffsetId[i], &pBuffer, &dwLen); TEST_ASSERT(L"ReadBuffer failed!", dwRes); dwRes = TestMem(pBuffer, aSize[i], (BYTE)i); TEST_ASSERT(L"Buffer read was not what we wrote!", dwRes); printf("Read %d bytes with signature of <%d> from pageId <0x%X>, offset <0x%X>\n", aSize[i], i, aPageId[i], aOffsetId[i]); delete [] pBuffer; } for (int i = 0; i < TEST_OBJECT_ITER; i++) { dwRes = DeleteBuffer(aPageId[i], aOffsetId[i]); TEST_ASSERT(L"DeleteBuffer failed!", dwRes); printf("Deleted %d bytes with signature of <%d> from pageId <0x%X>, offset <0x%X>\n", aSize[i], i, aPageId[i], aOffsetId[i]); } } if (dwRes == ERROR_SUCCESS) { dwRes = pHeap->Shutdown(0); TEST_ASSERT(L"Heap Shutdown failed!", dwRes); dwRes = pTranMan->Shutdown(0); TEST_ASSERT(L"Transaction manager Shutdown failed!", dwRes); } delete [] buff; delete [] aPageId; delete [] aOffsetId; delete [] aSize; delete pHeap; delete pTranMan; }