//------------------------------------------------------------------------- // // Microsoft OLE // Copyright (C) Microsoft Corporation, 1993 - 1996. // All rights reserved. // //-------------------------------------------------------------------------- #include #pragma hdrstop #include // global defines #define LOG_FILE_NAME "/t:utest" // Debug Object DH_DEFINE; // Usage: If you would like to use CreateFromParams to create ChanceDocFile // tree, give arguments e.g // test /seed:2 /dfdepth:0-9 /dfstg:1-11 /dfstm:10-30 /dfstmlen:0-222 // /dfRootCrMode:dirReadWriteShEx // // if want to use CreateFromSize but through CreateFromParams e.g. // test /seed:2 /dfsize:tiny // // If the seed value given is zero, the datagen objects computes the // seed value to be used based on current time and some other compu- // tations, so the resulting docfiles wouldn't be same in different // instants of time if seed is 0 even if all the other parameters are // same. With seed value other than zero, the docfiles produced at // different instances of time would be identical with other parameters // remaining same. // // //------------------------------------------------------------------- // // Function: main // // Synopsis: entry point for unit test program // // Parameters: [argc] - Argument count // [argv] - Arguments // // Returns: void // // History: 20-Apr-1996 Narindk Created // //-------------------------------------------------------------------- VOID __cdecl main(int argc, char *argv[]) { HRESULT hr = S_OK; ChanceDF *pTestChanceDF = NULL; VirtualDF *pTestVirtualDF = NULL; VirtualCtrNode *pVirtualDFRoot = NULL; // Initialize our log object DH_CREATELOGCMDLINE( LOG_FILE_NAME ) ; DH_SETLOGLOC(DH_LOC_LOG) ; DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("::main")); // Initialize the OLE server. hr = CoInitialize(NULL); if (S_OK != hr) { DH_LOG(( LOG_FAIL, TEXT("test: CoInitialize failed, hr=0x%08x\n"), hr)); return; } // I: Using CreateFromSize within program to generate DocFile // Create the new ChanceDocFile tree that would consist of chance nodes. if (S_OK == hr) { pTestChanceDF = new ChanceDF(); if(NULL == pTestChanceDF) { hr = E_OUTOFMEMORY; } } if (S_OK == hr) { // To check from CreateFromSize hr = pTestChanceDF->CreateFromSize(DF_HUGE, 2); DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromSize")) ; } // Create the VirtualDocFile tree from the ChanceDocFile tree created in // the previous step. The VirtualDocFile tree consists of VirtualCtrNodes // and VirtualStmNodes. if (S_OK == hr) { pTestVirtualDF = new VirtualDF(); if(NULL == pTestVirtualDF) { hr = E_OUTOFMEMORY; } } if (S_OK == hr) { hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("DocFile - CreateFromSize - successfully created.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("DocFile - CreateFromSize - failed.\n"))); } // Cleanup if(NULL != pTestChanceDF) { hr = pTestChanceDF->DeleteChanceDocFileTree( pTestChanceDF->GetChanceDFRoot()); DH_HRCHECK(hr, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ; delete pTestChanceDF; pTestChanceDF = NULL; } if(NULL != pTestVirtualDF) { hr = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ; delete pTestVirtualDF; pTestVirtualDF = NULL; } // II: Using CreateFromParams to generate DocFile // a. Using CreateFromParams to call Create. e.g. // test /seed:3 /dfdepth:0-9 /dfstg:1-11 /dfstm:10-30 // /dfstmlen:0-222 /dfRootCrMode:4114 /dfStgCrMode:4114 // /dfStmCrMode:4114 // b. Using CreateFromParams to call CreateFromSize. e.g. // test /seed:2 /dfsize:tiny // c. Using CreateFromParams to call CreateFromFile (NYI). e.g. // test /seed:4 /dftemp:myfile // // if you do not provide the parameters, but still call the function // CreateFromParam, all default values would be used. // Create the new ChanceDocFile tree that would consist of chance nodes. if (S_OK == hr) { pTestChanceDF = new ChanceDF(); if(NULL == pTestChanceDF) { hr = E_OUTOFMEMORY; } } // Can pass the arguments after simulating command line arguments in // the test itself. if (S_OK == hr) { // To create it from Params. hr = pTestChanceDF->CreateFromParams(argc, argv); DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromParams")) ; } // Create the VirtualDocFile tree from the ChanceDocFile tree created in // the previous step. The VirtualDocFile tree consists of VirtualCtrNodes // and VirtualStmNodes. if (S_OK == hr) { pTestVirtualDF = new VirtualDF(); if(NULL == pTestVirtualDF) { hr = E_OUTOFMEMORY; } } if (S_OK == hr) { hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("DocFile - CreateFromParams - successfully created.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("DocFile - CreateFromParams - failed.\n"))); } // Cleanup if(NULL != pTestChanceDF) { hr = pTestChanceDF->DeleteChanceDocFileTree( pTestChanceDF->GetChanceDFRoot()); DH_HRCHECK(hr, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ; delete pTestChanceDF; pTestChanceDF = NULL; } if(NULL != pTestVirtualDF) { hr = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ; delete pTestVirtualDF; pTestVirtualDF = NULL; } // III: Using CreateFromSize within program to generate DocFile. // Do the following operations: // a. Close the root node and open root node again. Check it succeeds // Create the new ChanceDocFile tree that would consist of chance nodes. if (S_OK == hr) { pTestChanceDF = new ChanceDF(); if(NULL == pTestChanceDF) { hr = E_OUTOFMEMORY; } } if (S_OK == hr) { // To check from CreateFromSize hr = pTestChanceDF->CreateFromSize(DF_MEDIUM, 3); DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromSize")) ; } // Create the VirtualDocFile tree from the ChanceDocFile tree created in // the previous step. The VirtualDocFile tree consists of VirtualCtrNodes // and VirtualStmNodes. if (S_OK == hr) { pTestVirtualDF = new VirtualDF(); if(NULL == pTestVirtualDF) { hr = E_OUTOFMEMORY; } } if (S_OK == hr) { hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("DocFile - CreateFromSize - successfully created.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("DocFile - CreateFromSize - failed.\n"))); } // a. Close the root node and open root node again. Check it succeeds if (S_OK == hr) { hr = pVirtualDFRoot->Close(); DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("Root Storage closed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("Root Storage couldn't be closed successfully.\n"))); } if (S_OK == hr) { hr = pVirtualDFRoot->OpenRoot( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE , NULL, 0); DH_HRCHECK(hr, TEXT("VirtualCtrNode::OpenRoot")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("Root Storage opened successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("Root Storage couldn't be opened successfully.\n"))); } // b. Close the root node's stream and open it again. Check it succeeds VirtualStmNode *pvsnTest = NULL; VirtualCtrNode *pvcnTest = NULL; if (S_OK == hr) { // This call will return us the root of VirtualDocFileTree becoz' // we are passing NULL for second parameter. hr = GetVirtualStgNodeForTest(pTestVirtualDF, NULL, &pvcnTest, 0); DH_HRCHECK(hr, TEXT("GetVirtualStgNodeForTest")) ; } if (S_OK == hr) { // This call will return us the first stream of pvcnTest VirtualCtrNode // as we are passing zero for fourth parameter. hr = GetVirtualStmNodeForTest(pvcnTest, &pvsnTest, 0); DH_HRCHECK(hr, TEXT("GetVirtualStgNodeForTest")) ; } if (S_OK == hr) { hr = pvsnTest->Close(); DH_HRCHECK(hr, TEXT("VirtualStmNode::Close")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualStmNode::Close completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualStmNode::Close couldn't complete successfully.\n"))); } if (S_OK == hr) { hr = pvsnTest->Open( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE , 0); DH_HRCHECK(hr, TEXT("VirtualStmNode::Open")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualStmNode::Open completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualStmNode::Open couldn't complete successfully.\n"))); } // c.1 Set the size of the stream DWORD dwStreamSize = 512; ULARGE_INTEGER uli; ULISet32(uli, dwStreamSize); if (S_OK == hr) { hr = pvsnTest->SetSize(uli); } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("IStream::SetSize function completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("IStream::SetSize function wasn't successful.\n"))); } // c.2 Write into opened test stream. Check it succeeds DWORD dwSize = 0; DWORD dwBufSize = 512; DWORD dwWritten = 0; ULONG *lpBuf = NULL; const ULONG kulPattern = 0xABCDABCD; // Arbitrary fill pattern for stream lpBuf = new ULONG [dwBufSize]; if (lpBuf == NULL) { hr = E_OUTOFMEMORY; } for (dwSize = 0; dwSize < dwBufSize; dwSize++) { lpBuf[dwSize] = kulPattern; } if (S_OK == hr) { hr = pvsnTest->Write(lpBuf, dwBufSize, &dwWritten); } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("IStream::Write function completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("IStream::Write function wasn't successful.\n"))); } // Cleanup delete []lpBuf; // d. Seek test stream. Check it succeeds LARGE_INTEGER lint; memset(&lint, 0, sizeof(LARGE_INTEGER)); // Position the stream header to the begining if (S_OK == hr) { hr = pvsnTest->Seek(lint, STREAM_SEEK_SET, NULL); } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("IStream::Seek function completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("IStream::Seek function wasn't successful.\n"))); } // e. Read test stream. Check it succeeds DWORD dwRead = 0; ULONG *lpStr = NULL; lpStr = new ULONG [dwBufSize]; if (lpBuf == NULL) { hr = E_OUTOFMEMORY; } if ( S_OK == hr ) { // Read the stream. hr = pvsnTest->Read(lpStr, dwBufSize, &dwRead); } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("IStream::Read function completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("IStream::Read function wasn't successful.\n"))); } // Cleanup delete []lpStr; // f. Close the root node's substorage and open it again. Check it // succeeds VirtualCtrNode *pvcnTest1 = NULL; ULONG cChildCnt = 0; if (S_OK == hr) { // This call will return us the first substorage root of // VirtualDocFileTree if its exists. We may use pvcnTest // which points to the root of virtual docfile tree. cChildCnt = pVirtualDFRoot->GetVirtualCtrNodeChildrenCount(); /* _ftprintf(stdout, TEXT("No of substorages in RootStorage are %lu"), cChildCnt); */ if(cChildCnt <= 0) { hr = S_FALSE; DH_LOG(( LOG_INFO, TEXT("No substorages of this storage"))); } } if (S_OK == hr) { // Get the first substorage of the root. hr = GetVirtualStgNodeForTest( pTestVirtualDF,pVirtualDFRoot,&pvcnTest1,1); DH_HRCHECK(hr, TEXT("GetVirtualStgNodeForTest")) ; } if (S_OK == hr) { hr = pvcnTest1->Close(); DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualCtrNode::Close completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualCtrNode::Close couldn't complete successfully.\n"))); } if (S_OK == hr) { hr = pvcnTest1->Open( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, NULL, 0); DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ; } if (S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualCtrNode::Open completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualCtrNode::Open couldn't complete successfully.\n"))); } // f: Adds a new storage to an existing storage. We would add another // substorage to our root storage for the test. VirtualCtrNode *pvcnNewStorage = NULL; LPWSTR pNewStgName = L"NewTestStg"; if(S_OK == hr) { hr = AddStorage( pVirtualDFRoot, &pvcnNewStorage, pNewStgName, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DIRECT); DH_HRCHECK(hr, TEXT("AddStorage")) ; } if(S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualCtrNode::AddStorage completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualCtrNode::AddStorage couldn't complete successfully.\n"))); } // g: Deletes a storage in an existing storage. We would delete first // child substorage of our root storage for the test. if(S_OK == hr) { hr = DestroyStorage( pTestVirtualDF, pVirtualDFRoot->GetFirstChildVirtualCtrNode()); DH_HRCHECK(hr, TEXT("DeleteStorage")) ; } if(S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualCtrNode::DestroyStorage completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualCtrNode::DestroyStorage couldn't complete successfully.\n"))); } // h: Adds a new stream to an existing storage. We would add a stream to // newly created substorage "NewTestStg" of our root storage for test. VirtualStmNode *pvsnNewStream = NULL; LPWSTR pNewStmName = L"NewTestStm"; ULONG cbNewSize = 20; if(S_OK == hr) { hr = AddStream( pvcnNewStorage, &pvsnNewStream, pNewStmName, cbNewSize, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DIRECT); DH_HRCHECK(hr, TEXT("AddStream")) ; } if(S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("VirtualStmNode::AddStream completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("VirtualStmNode::AddStream couldn't complete successfully.\n"))); } // i: Renames the newly created storage from NewTestStg to NewRenStg LPCWSTR pRenStgName = L"RenStg"; // First close the opened storage that we want to rename if (S_OK == hr) { hr = pvcnNewStorage->Close(); DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ; } if(S_OK == hr) { hr = pvcnNewStorage->Rename(pRenStgName); } if(S_OK == hr) { DH_LOG(( LOG_PASS, TEXT("IStorage::RenameElement completed successfully.\n"))); } else { DH_LOG(( LOG_FAIL, TEXT("IStorage::RenameElement couldn't complete successfully.\n"))); } // Final Cleanup if(NULL != pTestChanceDF) { hr = pTestChanceDF->DeleteChanceDocFileTree( pTestChanceDF->GetChanceDFRoot()); DH_HRCHECK(hr, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ; delete pTestChanceDF; pTestChanceDF = NULL; } if(NULL != pTestVirtualDF) { hr = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot); DH_HRCHECK(hr, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ; delete pTestVirtualDF; pTestVirtualDF = NULL; } // Uninitialize OLE CoUninitialize(); // Log test results and quit if (S_OK == hr) { DH_LOG((LOG_PASS, TEXT("Test program executed successfully.\n"))); exit(0); } else { DH_LOG((LOG_FAIL, TEXT("Test program execution failed.\n"))); exit(1); } }