You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4225 lines
120 KiB
4225 lines
120 KiB
//-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft OLE
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1995.
|
|
//
|
|
// File: vcpytsts.cxx
|
|
//
|
|
// Contents: storage base tests basically pertaining to IStorage/IStream copy
|
|
// ops
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 15-July-1996 NarindK Created.
|
|
// 27-Mar-97 SCousens conversionified
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <dfheader.hxx>
|
|
#pragma hdrstop
|
|
|
|
#include "init.hxx"
|
|
|
|
//externs
|
|
extern BOOL g_fRevert;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_100
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms, committed
|
|
// The root docfile is searched to find a VirtualCtrNode node in tree
|
|
// that is a child of the root IStorage. The child IStorage
|
|
// is then copied with the destination being the root docfile itself.
|
|
// If the 'RevertAfterCopy' switch was specified, the root docfile
|
|
// is then reverted and the CRC is recomputed on the root docfile
|
|
// and compared to the before copy CRC to verify that no changes
|
|
// occurred in the docfile hierarchy. Also it is verified by enum
|
|
// rating the docfile before and after opeartion and testing the total
|
|
// number of storages and streams in file remain unchanged.
|
|
// If case of Revert being FALSE, the contents of the child IStorage
|
|
// should be merged in with the contents of the root level of the docfile.
|
|
// Verify this case by enumerating the docfile before and after
|
|
// CopyTo is done and test that the resulting number of storages &
|
|
// streams in the DocFile is as expected.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 15-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCCTOP.CXX
|
|
// 2. Old name of test : LegitCopyChildDFToParentDF Test
|
|
// New Name of test : VCPYTEST_100
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-1 /dfstg:2-4 /dfstm:2-3 /t:VCPYTEST-100
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-1 /dfstg:2-4 /dfstm:2-3 /t:VCPYTEST-100
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-1 /dfstg:2-4 /dfstm:2-3 /t:VCPYTEST-100
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:1-1 /dfstg:2-4 /dfstm:2-3 /t:VCPYTEST-100
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:1-1 /dfstg:2-4 /dfstm:2-3 /t:VCPYTEST-100
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-100
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_100(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnRandomChild = NULL;
|
|
VirtualCtrNode *pvcnTrav = NULL;
|
|
LPSTORAGE pStgRoot = NULL;
|
|
LPSTORAGE pStgChild = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
USHORT usErr = 0;
|
|
ULONG cChildren = 0;
|
|
ULONG cRandomChild = 0;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
ULONG cTotalStg = 0;
|
|
ULONG cTotalStm = 0;
|
|
ULONG cChildStg = 0;
|
|
ULONG cChildStm = 0;
|
|
ULONG cResStg = 0;
|
|
ULONG cResStm = 0;
|
|
BOOL fPass = TRUE;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_100"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_100 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1,TEXT("Attempt valid copyto op fm child IStg to root")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
dwStgMode = pTestChanceDF->GetStgMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_100, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG whole df already commited
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms")) ;
|
|
}
|
|
|
|
// Get IStorage pointer for Root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot) ;
|
|
if(NULL == pStgRoot)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Calulcate CRC for entire docfile.
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot,VERIFY_INC_TOPSTG_NAME,&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi);
|
|
if(NULL == pdgi)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Find the total number of VirtualCtrNodes and VirtualStmNodes in the
|
|
// DocFile
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(pStgRoot, VERIFY_SHORT,&cTotalStg, &cTotalStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// Find a random child VirtualCtrNode in the file. First verify there
|
|
// are child storages in the tree.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
cChildren = pVirtualDFRoot->GetVirtualCtrNodeChildrenCount();
|
|
|
|
if(0 == cChildren)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Max original tree depth inadequate to find a child")));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Find a random child storage to pick from
|
|
|
|
usErr = pdgi->Generate(&cRandomChild, 1, cChildren);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Pick up the random child node.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pvcnTrav = pVirtualDFRoot->GetFirstChildVirtualCtrNode();
|
|
|
|
DH_ASSERT(NULL != pvcnTrav);
|
|
|
|
while((0 != --cRandomChild) &&
|
|
(NULL != pvcnTrav->GetFirstSisterVirtualCtrNode()))
|
|
{
|
|
pvcnTrav = pvcnTrav->GetFirstSisterVirtualCtrNode();
|
|
}
|
|
pvcnRandomChild = pvcnTrav;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = OpenRandomVirtualCtrNodeStg(pvcnRandomChild, dwStgMode);
|
|
|
|
DH_HRCHECK(hr, TEXT("OpenRandomVirtualCtrNodeStg")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgChild = pvcnRandomChild->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgChild) ;
|
|
}
|
|
|
|
// Find the total number of VirtualCtrNode(s) and VirtualStmNode(s) under
|
|
// this node.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(pStgChild,VERIFY_SHORT,&cChildStg,&cChildStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// Copy everything under this child node to the Root node.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRandomChild->CopyTo(0, NULL, NULL, pVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Adjust the virtual tree as a result of above operation.
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
hr = pTestVirtualDF->AdjustTreeOnCopyTo(pvcnRandomChild, pVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualDF::AdjustTreeOnCopyTo")) ;
|
|
}
|
|
|
|
// Commit if g_fRevert is false, else revert
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = pVirtualDFRoot->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Revert completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Revert unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CloseRandomVirtualCtrNodeStg(pvcnRandomChild);
|
|
|
|
DH_HRCHECK(hr, TEXT("CloseRandomVirtualCtrNodeStg")) ;
|
|
}
|
|
|
|
// Calculate the CRC now for the docfile
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot,VERIFY_INC_TOPSTG_NAME,&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Enumerate the DocFile now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(pStgRoot,VERIFY_SHORT,&cResStg, &cResStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// For verification, if this was a commit opeartion, then CRC's won't match
|
|
// ,verify by checking total number of VirtualCtrNodes and VirtualStmNodes
|
|
// expected as result of copy opeartion, therby number of IStorages/IStreams
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
if(cResStg == cTotalStg + (cChildStg-1))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & commit as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Commit not as exp")));
|
|
}
|
|
|
|
if(cResStm == cTotalStm + cChildStm)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & commit as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & commit not as exp.")));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(cResStg == cTotalStg)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Revert as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Revert not as exp.")));
|
|
}
|
|
|
|
if(cResStm == cTotalStm)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & Revert as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & Revert not as exp.")));
|
|
}
|
|
}
|
|
}
|
|
|
|
// If revert operations, the CRC's should match.
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
if(dwCRC1 == dwCRC2)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's match as exp after CopyTo & Revert Ops")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's don't match as exp after CopyTo & Revert Ops")));
|
|
}
|
|
}
|
|
|
|
// Close the Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_100 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_100 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_100 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_101
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms, committed
|
|
// The root docfile is tree is then searched for, and for each child
|
|
// IStorage found, the CRC is computed for that IStorage (only
|
|
// if Revert wasn't specified on the command line). A new child IStorage
|
|
// is then created in the root docfile with a unique, random name.
|
|
// If Revert was specified in command line,this new empty stg is CRC'd
|
|
// The IStorage is then copied to the new child IStorage via CopyTo(). If
|
|
// Revert was *not* speficied, the new child IStorage and the root
|
|
// docfile are committed, else the dest IStorage is Reverted(). The CRC
|
|
// is then computed for the dest IStorage and the CRCs are compared.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 17-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCCWPAR.CXX
|
|
// 2. Old name of test : LegitCopyChildDFWithinParent Test
|
|
// New Name of test : VCPYTEST_101
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-3 /dfstg:2-5 /dfstm:2-3 /t:VCPYTEST-101
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-3 /dfstg:2-5 /dfstm:2-3 /t:VCPYTEST-101
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-3 /dfstg:2-5 /dfstm:2-3 /t:VCPYTEST-101
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:1-3 /dfstg:2-5 /dfstm:2-3 /t:VCPYTEST-101
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:1-3 /dfstg:2-5 /dfstm:2-3 /t:VCPYTEST-101
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-101
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_101(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnTravChild = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
LPSTORAGE pStgChild = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
BOOL fPass = TRUE;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_101"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_101 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt valid copyto fm childstg to new child stg of parent")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
dwStgMode = pTestChanceDF->GetStgMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_101, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG whole df already commited
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
if(NULL == pdgu)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Go in a loop and for each child storage (child VirtualCtrNode) found,
|
|
// do a CopyTo operation. Verify with CRC mechanism usnder both commit/
|
|
// Rvert conditions.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pvcnTravChild = pVirtualDFRoot->GetFirstChildVirtualCtrNode();
|
|
|
|
if(NULL == pvcnTravChild)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualDF tree depth inadeuate to have a child.")));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
|
|
while((NULL != pvcnTravChild) && (S_OK == hr))
|
|
{
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pvcnTravChild,
|
|
NODE_EXC_TOPSTG);
|
|
}
|
|
|
|
// Calculate CRC for this child VirtualCtrNode
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
pStgChild = pvcnTravChild->GetIStoragePointer();
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Now add a new storage
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStgName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStgName,
|
|
dwStgMode | STGM_FAILIFTHERE,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
DH_ASSERT(S_OK == hr);
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("AddStorage successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
pStgChild = pvcnRootNewChildStg->GetIStoragePointer();
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnTravChild->CopyTo(0, NULL, NULL, pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("VirtualCtrNode::CopyTo successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
// Commit the new VirtualCtrNode and Root Node
|
|
|
|
hr = pvcnRootNewChildStg->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Revert the new child storage
|
|
|
|
hr = pvcnRootNewChildStg->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Revert successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Revert unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calculate CRC for the destination storage now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgChild = pvcnRootNewChildStg->GetIStoragePointer();
|
|
|
|
if(NULL == pStgChild)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Verify CRC
|
|
|
|
if((S_OK == hr) && (dwCRC1 == dwCRC2))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source and dest copied to Stg match.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source and dest copied to Stg don't match.")));
|
|
|
|
break;
|
|
}
|
|
|
|
// Release source child stg
|
|
|
|
if(NULL != pvcnTravChild)
|
|
{
|
|
hr = pvcnTravChild->Close();
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
// Release new child stg
|
|
|
|
if(NULL != pvcnRootNewChildStg)
|
|
{
|
|
hr = pvcnRootNewChildStg->Close();
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
// Destory new child stg since we are done with it. Also the while
|
|
// loop condition depends upon original number of VirtualCtrNodes
|
|
|
|
if(NULL != pvcnRootNewChildStg)
|
|
{
|
|
hr = DestroyStorage(pTestVirtualDF, pvcnRootNewChildStg);
|
|
DH_HRCHECK(hr, TEXT("DestroyStorage")) ;
|
|
}
|
|
|
|
// Release temp string
|
|
|
|
if(NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Advance pvcnTravChild to next and reset pointers to NULL.
|
|
|
|
pvcnTravChild = pvcnTravChild->GetFirstSisterVirtualCtrNode();
|
|
pStgChild = NULL;
|
|
pvcnRootNewChildStg = NULL;
|
|
}
|
|
|
|
// Close the Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_101 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_101 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_101 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_102
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms.
|
|
// The root docfile is searched for until an IStorage is found that is
|
|
// a grandchild of the root IStorage. The docfile is commited.
|
|
// The grandchild IStorage is then copied with the destination being
|
|
// the root docfile itself.
|
|
// If the 'Rever' switch was specified, the root docfile
|
|
// is then reverted and the CRC is recomputed on the root docfile
|
|
// and compared to the before copy CRC to verify that no changes
|
|
// occurred in the docfile hierarchy. Also it is verified by enum
|
|
// rating the docfile before and after opeartion and testing the total
|
|
// number of storages and streams in file remain unchanged.
|
|
// If case of Revert being FALSE, the contents of the grandchild IStorage
|
|
// should be merged in with the contents of the root level of the docfile.
|
|
// Verify this case by enumerating the docfile before and after
|
|
// CopyTo is done and test that the resulting number of storages &
|
|
// streams in the DocFile is as expected.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 17-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCGCTANC.CXX
|
|
// 2. Old name of test : LegitCopyChildDFToAncestorDF Test
|
|
// New Name of test : VCPYTEST_102
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:2-3 /t:VCPYTEST-102
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:2-3 /t:VCPYTEST-102
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:2-3 /t:VCPYTEST-102
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:2-3 /t:VCPYTEST-102
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:2-3 /t:VCPYTEST-102
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-102
|
|
//
|
|
// This test is almost same as VCPYTEST-100 with difference being that the
|
|
// root's grandchild's contents are copied to the root. The difference in
|
|
// code is in picking up the random child and in command line parameters.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_102(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnTrav = NULL;
|
|
VirtualCtrNode *pvcnRandomParent = NULL;
|
|
VirtualCtrNode *pvcnRandomGrandChild = NULL;
|
|
LPSTORAGE pStgRoot = NULL;
|
|
LPSTORAGE pStgGrandChild = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
USHORT usErr = 0;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
ULONG cTotalStg = 0;
|
|
ULONG cTotalStm = 0;
|
|
ULONG cChildStg = 0;
|
|
ULONG cChildStm = 0;
|
|
ULONG cResStg = 0;
|
|
ULONG cResStm = 0;
|
|
ULONG cDepth = 0;
|
|
BOOL fPass = TRUE;
|
|
ULONG cChildren = 0;
|
|
ULONG cGrandChildren = 0;
|
|
ULONG cParentOfGrandChild = 0;
|
|
ULONG cRandomGrandChild = 0;
|
|
ULONG cRandomParent = 0;
|
|
ULONG counter = 0;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_102"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_102 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt valid copyto operatons from grandchild to root stg")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
dwStgMode = pTestChanceDF->GetStgMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_102, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi);
|
|
if(NULL == pdgi)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Find a random grandchild VirtualCtrNode in the file.
|
|
|
|
// For that first find a random child storage in tree that has grandchild
|
|
// storages in tree
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
cChildren = pVirtualDFRoot->GetVirtualCtrNodeChildrenCount();
|
|
|
|
if(0 == cChildren)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Max tree depth inadequate to find a child")));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
|
|
// Find child nodes with grandchildren.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pvcnTrav = pVirtualDFRoot->GetFirstChildVirtualCtrNode();
|
|
|
|
DH_ASSERT(NULL != pvcnTrav);
|
|
|
|
while(NULL != pvcnTrav)
|
|
{
|
|
if(0 != pvcnTrav->GetVirtualCtrNodeChildrenCount())
|
|
{
|
|
cParentOfGrandChild++;
|
|
}
|
|
pvcnTrav = pvcnTrav->GetFirstSisterVirtualCtrNode();
|
|
}
|
|
|
|
if(0 == cParentOfGrandChild)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Max tree depth inadequate to find grandchild")));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
|
|
// Pick up a random Parent VirtualCtrNode whos have Grand children
|
|
// Generate random number
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Find a random child storage to pick from
|
|
|
|
usErr = pdgi->Generate(&cRandomParent, 1, cParentOfGrandChild);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Pick up the random parent
|
|
if(S_OK == hr)
|
|
{
|
|
pvcnTrav = pVirtualDFRoot->GetFirstChildVirtualCtrNode();
|
|
while(NULL != pvcnTrav)
|
|
{
|
|
if(0 != pvcnTrav->GetVirtualCtrNodeChildrenCount())
|
|
{
|
|
counter++;
|
|
}
|
|
if(counter == cRandomParent)
|
|
{
|
|
pvcnRandomParent = pvcnTrav;
|
|
break;
|
|
}
|
|
pvcnTrav = pvcnTrav->GetFirstSisterVirtualCtrNode();
|
|
}
|
|
}
|
|
|
|
// Now pick up a random GrandChild storage node from the above random
|
|
// parent
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
cGrandChildren = pvcnRandomParent->GetVirtualCtrNodeChildrenCount();
|
|
DH_ASSERT(0 != cGrandChildren);
|
|
|
|
// Find a random grandchild storage to pick from
|
|
|
|
usErr = pdgi->Generate(&cRandomGrandChild, 1, cGrandChildren);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pvcnRandomGrandChild =
|
|
pvcnRandomParent->GetFirstChildVirtualCtrNode();
|
|
|
|
while((0 != --cRandomGrandChild) && (NULL != pvcnRandomGrandChild))
|
|
{
|
|
pvcnRandomGrandChild =
|
|
pvcnRandomGrandChild->GetFirstSisterVirtualCtrNode();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Commit the storages from here upto root.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRandomGrandChild->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRandomParent->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close all open stgs/stms except root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms")) ;
|
|
}
|
|
|
|
// Get IStorage pointer for Root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot) ;
|
|
if(NULL == pStgRoot)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Calulcate CRC for entire docfile.
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot,VERIFY_INC_TOPSTG_NAME,&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Find the total number of VirtualCtrNodes and VirtualStmNodes in the
|
|
// DocFile
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(pStgRoot, VERIFY_SHORT,&cTotalStg, &cTotalStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// Open the grandChildStg from where CopyTo would be done to root.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = OpenRandomVirtualCtrNodeStg(pvcnRandomGrandChild, dwStgMode);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
}
|
|
|
|
// get its istorage pointer.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgGrandChild = pvcnRandomGrandChild->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgGrandChild) ;
|
|
if(NULL == pStgGrandChild)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Find the total number of VirtualCtrNode(s) and VirtualStmNode(s) under
|
|
// this node. Used for verification of copyto operation.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(
|
|
pStgGrandChild,
|
|
VERIFY_SHORT,
|
|
&cChildStg,
|
|
&cChildStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// Copy everything under this child node to the Root node.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRandomGrandChild->CopyTo(0, NULL, NULL, pVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Adjust the virtual tree as a result of above operation.
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
hr = pTestVirtualDF->AdjustTreeOnCopyTo(
|
|
pvcnRandomGrandChild,
|
|
pVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualDF::AdjustTreeOnCopyTo")) ;
|
|
}
|
|
|
|
// Commit if g_fRevert is false, else revert
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = pVirtualDFRoot->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Revert completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Revert unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CloseRandomVirtualCtrNodeStg(pvcnRandomGrandChild);
|
|
|
|
DH_HRCHECK(hr, TEXT("CloseRandomVirtualCtrNodeStg")) ;
|
|
}
|
|
|
|
// Calculate the CRC now for the docfile
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot,VERIFY_INC_TOPSTG_NAME,&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Enumerate the DocFile now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = EnumerateDiskDocFile(pStgRoot,VERIFY_SHORT,&cResStg, &cResStm);
|
|
|
|
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile")) ;
|
|
}
|
|
|
|
// For verification, if this was a commit opeartion, then CRC's won't match
|
|
// ,verify by checking total number of VirtualCtrNodes and VirtualStmNodes
|
|
// expected as result of copy opeartion, therby number of IStorages/IStreams
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
if(cResStg == cTotalStg + (cChildStg-1))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & commit as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Commit not as exp")));
|
|
}
|
|
|
|
if(cResStm == cTotalStm + cChildStm)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & commit as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & commit not as exp.")));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(cResStg == cTotalStg)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Revert as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stg's after CopyTo & Revert not as exp.")));
|
|
}
|
|
|
|
if(cResStm == cTotalStm)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & Revert as exp.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Enum of Stm's after CopyTo & Revert not as exp.")));
|
|
}
|
|
}
|
|
}
|
|
|
|
// If revert operations, the CRC's should match.
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
if(dwCRC1 == dwCRC2)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's match as exp after CopyTo & Revert Ops")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's don't match as exp after CopyTo & Revert Ops")));
|
|
}
|
|
}
|
|
|
|
// Close the Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_102 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_102 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_102 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_103
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms, committed
|
|
// The root docfile is tree is then searched for, and for each grandchild
|
|
// IStorage found, the CRC is computed for that IStorage (only
|
|
// if Revert wasn't specified on the command line). A new child IStorage
|
|
// is then created in the root docfile with a unique, random name.
|
|
// If Revert was specified in command line,this new empty stg is CRC'd
|
|
// The GrandChild IStorage is copied to new child IStorage via CopyTo().If
|
|
// Revert was *not* speficied, the new child IStorage and the root
|
|
// docfile are committed, else the dest IStorage is Reverted(). The CRC
|
|
// is then computed for the dest IStorage and the CRCs are compared.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 18-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCGCWANC.CXX
|
|
// 2. Old name of test : LegitCopyGrandChildDFWithinAncestorDF Test
|
|
// New Name of test : VCPYTEST_103
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:1-3 /t:VCPYTEST-103
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:1-3 /t:VCPYTEST-103
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:1-3 /t:VCPYTEST-103
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:1-3 /t:VCPYTEST-103
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:3-4 /dfstg:4-6 /dfstm:1-3 /t:VCPYTEST-103
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-103
|
|
//
|
|
// This test is almost same as VCPYTEST-101 with difference being that the
|
|
// root's grandchild's contents are copied to the root's new child stg.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_103(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnTravGrandChild = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
LPSTORAGE pStgGrandChild = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
BOOL fPass = TRUE;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_103"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_103 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt copyto fm grandchild stg to new childstg of grandparent")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
dwStgMode = pTestChanceDF->GetStgMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_103, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG df already commited
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
if(NULL == pdgu)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Go in a loop and for each grandchild storage (grandchild VirtualCtrNode)
|
|
// found, do a CopyTo operation. Verify with CRC mechanism under both
|
|
// commit/Revert conditions.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
VirtualCtrNode* pNode = pVirtualDFRoot->GetFirstChildVirtualCtrNode();
|
|
|
|
//keep looking till we think we find one
|
|
while (NULL != pNode && NULL == pNode->GetFirstChildVirtualCtrNode())
|
|
{
|
|
pNode = pNode->GetFirstSisterVirtualCtrNode();
|
|
}
|
|
//this one has the the grandchild
|
|
if (NULL != pNode)
|
|
{
|
|
pvcnTravGrandChild = pNode->GetFirstChildVirtualCtrNode();
|
|
}
|
|
|
|
if (NULL == pvcnTravGrandChild)
|
|
{
|
|
hr = S_FALSE;
|
|
DH_TRACE((
|
|
DH_LVL_ERROR,
|
|
TEXT("VirtualDF tree depth inadequate to have grandChild.")));
|
|
}
|
|
}
|
|
|
|
while((NULL != pvcnTravGrandChild) && (S_OK == hr))
|
|
{
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pvcnTravGrandChild,
|
|
NODE_EXC_TOPSTG);
|
|
}
|
|
|
|
// Calculate CRC for this grandchild VirtualCtrNode
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
pStgGrandChild = pvcnTravGrandChild->GetIStoragePointer();
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgGrandChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Now add a new storage
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStgName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStgName,
|
|
dwStgMode | STGM_FAILIFTHERE,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
DH_ASSERT(S_OK == hr);
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("AddStorage successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
pStgGrandChild = pvcnRootNewChildStg->GetIStoragePointer();
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgGrandChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnTravGrandChild->CopyTo(0, NULL, NULL, pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("VirtualCtrNode::CopyTo successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
// Commit the new VirtualCtrNode and Root Node
|
|
|
|
hr = pvcnRootNewChildStg->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Revert the new child storage
|
|
|
|
hr = pvcnRootNewChildStg->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Revert successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Revert unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calculate CRC for the destination storage now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgGrandChild = pvcnRootNewChildStg->GetIStoragePointer();
|
|
if(NULL == pStgGrandChild)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgGrandChild,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Verify CRC
|
|
|
|
if((S_OK == hr) && (dwCRC1 == dwCRC2))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source and dest copied to Stg match.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source and dest copied to Stg don't match.")));
|
|
|
|
break;
|
|
}
|
|
|
|
// Release source child stg
|
|
|
|
if(NULL != pvcnTravGrandChild)
|
|
{
|
|
hr = pvcnTravGrandChild->Close();
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
// Release new child stg
|
|
|
|
if(NULL != pvcnRootNewChildStg)
|
|
{
|
|
hr = pvcnRootNewChildStg->Close();
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
// Destory new child stg since we are done with it. Also the while
|
|
// loop condition depends upon original number of VirtualCtrNodes
|
|
|
|
if(NULL != pvcnRootNewChildStg)
|
|
{
|
|
hr = DestroyStorage(pTestVirtualDF, pvcnRootNewChildStg);
|
|
DH_HRCHECK(hr, TEXT("DestroyStorage")) ;
|
|
}
|
|
|
|
// Release temp string
|
|
|
|
if(NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Advance pvcnTravGrandChild to next and reset pointers to NULL.
|
|
|
|
pvcnTravGrandChild = pvcnTravGrandChild->GetFirstSisterVirtualCtrNode();
|
|
pStgGrandChild = NULL;
|
|
pvcnRootNewChildStg = NULL;
|
|
}
|
|
|
|
// Close the Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_103 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_103 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_103 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_104
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms, committed .
|
|
// Then CRC is computed for entire entire docfile. A new root docfile
|
|
// with a random name is then created. The original root docfile is next
|
|
// copied to the new root docfile via CopyTo() and the new root docfile
|
|
// is committed. The CRC is computed for the new docfile and the CRCs
|
|
// are compared. If revert flag given, the new root docfile is reverted
|
|
// instead of committed and the CRC of the new tree is compared
|
|
// against the CRC of the empty tree.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 18-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCROOT.CXX
|
|
// 2. Old name of test : LegitCopyDFToRootDF Test
|
|
// New Name of test : VCPYTEST_104
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-104
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-104
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-104
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-104
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-104
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-104
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_104(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HRESULT hr2 = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
ChanceDF *pNewTestChanceDF = NULL;
|
|
VirtualDF *pNewTestVirtualDF = NULL;
|
|
VirtualCtrNode *pNewVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
LPSTORAGE pStgRootFirstDF = NULL;
|
|
LPSTORAGE pStgRootSecondDF = NULL;
|
|
LPTSTR pNewRootDocFileName = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
BOOL fPass = TRUE;
|
|
CDFD cdfd;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_104"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_104 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt copyto from one Root DocFile to new DocFile root")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_104, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG df already commited
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close all open stgs/stms except root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms")) ;
|
|
}
|
|
|
|
if ((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
pStgRootFirstDF = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRootFirstDF);
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgRootFirstDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
if(NULL == pdgu)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pNewRootDocFileName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
// Now Create a new DocFile with random name.
|
|
|
|
// Create the new ChanceDocFile tree that would consist of chance nodes.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pNewTestChanceDF = new ChanceDF();
|
|
if(NULL == pNewTestChanceDF)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
cdfd.cDepthMin = 0;
|
|
cdfd.cDepthMax = 0;
|
|
cdfd.cStgMin = 0;
|
|
cdfd.cStgMax = 0;
|
|
cdfd.cStmMin = 0;
|
|
cdfd.cStmMax = 0;
|
|
cdfd.cbStmMin = 0;
|
|
cdfd.cbStmMax = 0;
|
|
cdfd.ulSeed = pTestChanceDF->GetSeed();
|
|
cdfd.dwRootMode = dwRootMode;
|
|
|
|
hr = pNewTestChanceDF->Create(&cdfd, pNewRootDocFileName);
|
|
|
|
DH_HRCHECK(hr, TEXT("pNewTestChanceDF->Create"));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pNewTestVirtualDF = new VirtualDF();
|
|
if(NULL == pNewTestVirtualDF)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pNewTestVirtualDF->GenerateVirtualDF(
|
|
pNewTestChanceDF,
|
|
&pNewVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("pNewTestVirtualDF->GenerateVirtualDF")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DocFile - CreateFromParams - successfully created.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DocFile - CreateFromParams - failed, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRootSecondDF = pNewVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRootSecondDF);
|
|
if(NULL == pStgRootSecondDF)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgRootSecondDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->CopyTo(0, NULL, NULL, pNewVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("VirtualCtrNode::CopyTo successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
// Commit the new Root Node
|
|
|
|
hr = pNewVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Revert the new root storage
|
|
|
|
hr = pNewVirtualDFRoot->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Revert successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Revert unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calculate CRC for the destination root storage now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgRootSecondDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Verify CRC
|
|
|
|
if((S_OK == hr) && (dwCRC1 == dwCRC2))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source docfile and dest docfile match.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source docfile and dest docfile don't match.")));
|
|
|
|
}
|
|
|
|
// Close first Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close second Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pNewVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_104 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_104 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete Chance docfile tree for second DocFile
|
|
|
|
if(NULL != pNewTestChanceDF)
|
|
{
|
|
hr2 = pNewTestChanceDF->DeleteChanceDocFileTree(
|
|
pNewTestChanceDF->GetChanceDFRoot());
|
|
|
|
DH_HRCHECK(hr2, TEXT("pNewTestChanceDF->DeleteChanceFileDocTree")) ;
|
|
|
|
delete pNewTestChanceDF;
|
|
pNewTestChanceDF = NULL;
|
|
}
|
|
|
|
// Delete Virtual docfile tree for second docfile
|
|
|
|
if(NULL != pNewTestVirtualDF)
|
|
{
|
|
hr2 = pNewTestVirtualDF->DeleteVirtualDocFileTree(pNewVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr2, TEXT("pNewTestVirtualDF->DeleteVirtualFileDocTree")) ;
|
|
|
|
delete pNewTestVirtualDF;
|
|
pNewTestVirtualDF = NULL;
|
|
}
|
|
|
|
// Delete the second docfile on disk
|
|
|
|
if((S_OK == hr) && (NULL != pNewRootDocFileName))
|
|
{
|
|
if(FALSE == DeleteFile(pNewRootDocFileName))
|
|
{
|
|
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
|
|
|
|
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
|
|
}
|
|
}
|
|
|
|
// Delete temp strings
|
|
|
|
if(NULL != pNewRootDocFileName)
|
|
{
|
|
delete pNewRootDocFileName;
|
|
pNewRootDocFileName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_104 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_105
|
|
//
|
|
// Synopsis: A random root DF is created with random storages/stms, committed .
|
|
// Then CRC is computed for entire entire docfile. A new root docfile
|
|
// with a random name is then created and a child storage is created
|
|
// inside that. The original root docfile is next copied to the child
|
|
// storage of new root docfile via CopyTo() and the new child & root
|
|
// is committed. The CRC is computed for child storage of new docfile
|
|
// and the CRCs are compared. If revert flag given, the new root docfile
|
|
// child stg is reverted instead of committed and the CRC of the new
|
|
// tree's child stg is compared against the CRC of the child stg before
|
|
// revert.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 19-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LCNEWPAR.CXX
|
|
// 2. Old name of test : LegitCopyDFWithinNewPar Test
|
|
// New Name of test : VCPYTEST_105
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-105
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-105
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-105
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-105
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /revert
|
|
// e. stgbase /seed:2 /dfdepth:1-2 /dfstg:1-3 /dfstm:1-2 /t:VCPYTEST-105
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx /revert
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-105
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_105(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HRESULT hr2 = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
ChanceDF *pNewTestChanceDF = NULL;
|
|
VirtualDF *pNewTestVirtualDF = NULL;
|
|
VirtualCtrNode *pNewVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnNewRootNewChildStg = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
LPSTORAGE pStgRootFirstDF = NULL;
|
|
LPTSTR pNewRootDocFileName = NULL;
|
|
LPTSTR pNewRootNewChildStgName = NULL;
|
|
LPSTORAGE pStgChildRootSecondDF = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
BOOL fPass = TRUE;
|
|
CDFD cdfd;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_105"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_105 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Do copyto fm one Root DocFile to new DocFile's child stg")));
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
dwStgMode = pTestChanceDF->GetStgMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_105, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG df already commited
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close all open stgs/stms except root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms")) ;
|
|
}
|
|
|
|
if ((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
pStgRootFirstDF = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRootFirstDF);
|
|
|
|
hr = CalculateCRCForDocFile(
|
|
pStgRootFirstDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
if(NULL == pdgu)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pNewRootDocFileName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
// Now Create a new DocFile with random name.
|
|
|
|
// Create the new ChanceDocFile tree that would consist of chance nodes.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pNewTestChanceDF = new ChanceDF();
|
|
if(NULL == pNewTestChanceDF)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
cdfd.cDepthMin = 0;
|
|
cdfd.cDepthMax = 0;
|
|
cdfd.cStgMin = 0;
|
|
cdfd.cStgMax = 0;
|
|
cdfd.cStmMin = 0;
|
|
cdfd.cStmMax = 0;
|
|
cdfd.cbStmMin = 0;
|
|
cdfd.cbStmMax = 0;
|
|
cdfd.ulSeed = pTestChanceDF->GetSeed();
|
|
cdfd.dwRootMode = dwRootMode;
|
|
|
|
hr = pNewTestChanceDF->Create(&cdfd, pNewRootDocFileName);
|
|
|
|
DH_HRCHECK(hr, TEXT("pNewTestChanceDF->Create"));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pNewTestVirtualDF = new VirtualDF();
|
|
if(NULL == pNewTestVirtualDF)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pNewTestVirtualDF->GenerateVirtualDF(
|
|
pNewTestChanceDF,
|
|
&pNewVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr, TEXT("pNewTestVirtualDF->GenerateVirtualDF")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DocFile - CreateFromParams - successfully created.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DocFile - CreateFromParams - failed, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Create a new child storage in this new root docfile.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for this child stg
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pNewRootNewChildStgName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pNewVirtualDFRoot,
|
|
pNewRootNewChildStgName,
|
|
dwStgMode | STGM_FAILIFTHERE,
|
|
&pvcnNewRootNewChildStg);
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("AddStorage successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgChildRootSecondDF = pvcnNewRootNewChildStg->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgChildRootSecondDF);
|
|
if(NULL == pStgChildRootSecondDF)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgChildRootSecondDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->CopyTo(0, NULL, NULL, pvcnNewRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::CopyTo")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("VirtualCtrNode::CopyTo successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::CopyTo unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(FALSE == g_fRevert)
|
|
{
|
|
// Commit the new VirtualCtrNode and Root Node
|
|
|
|
hr = pvcnNewRootNewChildStg->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pNewVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VirtualCtrNode::Commit successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root VCN::Commit unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Revert the new child storage
|
|
|
|
hr = pvcnNewRootNewChildStg->Revert();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Revert")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VirtualCtrNode::Revert successful.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child VCN::Revert unsuccessful,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Calculate CRC for the destination storage now
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(
|
|
pStgChildRootSecondDF,
|
|
VERIFY_EXC_TOPSTG_NAME,
|
|
&dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Verify CRC
|
|
|
|
if((S_OK == hr) && (dwCRC1 == dwCRC2))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source docfile and dest docfile's stg match.")));
|
|
}
|
|
else
|
|
{
|
|
fPass = FALSE;
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's of source docfile &dest docfile's stg don't match.")));
|
|
|
|
}
|
|
|
|
// Close first Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close second Root Docfile's child stg.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnNewRootNewChildStg->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Close second Root Docfile.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pNewVirtualDFRoot->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_105 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_105 failed, hr=0x%lx."),
|
|
hr) );
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete Chance docfile tree for second DocFile
|
|
|
|
if(NULL != pNewTestChanceDF)
|
|
{
|
|
hr2 = pNewTestChanceDF->DeleteChanceDocFileTree(
|
|
pNewTestChanceDF->GetChanceDFRoot());
|
|
|
|
DH_HRCHECK(hr2, TEXT("pNewTestChanceDF->DeleteChanceFileDocTree")) ;
|
|
|
|
delete pNewTestChanceDF;
|
|
pNewTestChanceDF = NULL;
|
|
}
|
|
|
|
// Delete Virtual docfile tree for second docfile
|
|
|
|
if(NULL != pNewTestVirtualDF)
|
|
{
|
|
hr2 = pNewTestVirtualDF->DeleteVirtualDocFileTree(pNewVirtualDFRoot);
|
|
|
|
DH_HRCHECK(hr2, TEXT("pNewTestVirtualDF->DeleteVirtualFileDocTree")) ;
|
|
|
|
delete pNewTestVirtualDF;
|
|
pNewTestVirtualDF = NULL;
|
|
}
|
|
|
|
// Delete the second docfile on disk
|
|
|
|
if((S_OK == hr) && (NULL != pNewRootDocFileName))
|
|
{
|
|
if(FALSE == DeleteFile(pNewRootDocFileName))
|
|
{
|
|
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
|
|
|
|
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
|
|
}
|
|
}
|
|
|
|
// Delete temp strings
|
|
|
|
if(NULL != pNewRootDocFileName)
|
|
{
|
|
delete pNewRootDocFileName;
|
|
pNewRootDocFileName = NULL;
|
|
}
|
|
|
|
if(NULL != pNewRootNewChildStgName)
|
|
{
|
|
delete pNewRootNewChildStgName;
|
|
pNewRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_105 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: VCPYTEST_106
|
|
//
|
|
// Synopsis: A root docfile is created and two streams are created within it,
|
|
// a SOURCE IStream and a DEST IStream. A clone is made of the DEST
|
|
// IStream. A random number of bytes are written to the SOURCE
|
|
// IStream.
|
|
// From 10 to 20 times, a random starting position and number of
|
|
// bytes to copy is chosen in the SOURCE IStream. These bytes are
|
|
// read and CRC'd and the SOURCE IStream seek pointer is then
|
|
// repositoned to the intended copy source offset. A random copy
|
|
// destination offset is chosen in either the DEST or CLONE IStream.
|
|
// The non-target regions of the destination IStream (those bytes
|
|
// before and after the copy target region) are read and CRC'd
|
|
// and the destination seek pointer is re-positioned to the
|
|
// destination offset. The SOURCE IStream region is then copied to
|
|
// destination (DEST or CLONE) IStream. The entire destination
|
|
// stream is then read and CRCs are verified to ensure that the copy
|
|
// was successful.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File(s): LCSTREAM.CXX
|
|
// 2. Old name of test(s) : LegitCopyStream test
|
|
// New Name of test(s) : VCPYTEST_106
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:VCPYTEST-106
|
|
// /dfRootMode:dirReadWriteShEx
|
|
// b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:VCPYTEST-106
|
|
// /dfRootMode:xactReadWriteShEx
|
|
// c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:VCPYTEST-106
|
|
// /dfRootMode:xactReadWriteShDenyW
|
|
//
|
|
// BUGNOTE: Conversion: VCPYTEST-106
|
|
//
|
|
// History: Jiminli 24-July-96 Created
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT VCPYTEST_106(int argc, char *argv[])
|
|
{
|
|
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
USHORT usErr = 0;
|
|
LPTSTR ptcsBuffer = NULL;
|
|
LPBYTE ptcsReadBuffer = NULL;
|
|
USHORT usNumIterations = 0;
|
|
USHORT usMinIteration = 10;
|
|
USHORT usMaxIteration = 20;
|
|
ULONG culBytesLeftToWrite = 0;
|
|
ULONG culBytesRead = 0;
|
|
ULONG ulIStreamSize = 0;
|
|
ULONG culIOBytes = 0;
|
|
ULONG culWritten = 0;
|
|
ULONG culRead = 0;
|
|
ULONG culRandomCommit = 0;
|
|
ULONG ulRef = 0;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwCRC[3][3];
|
|
DWORD dwTempCRC = 0;
|
|
DWORD dwSourceCRC = 0;
|
|
BYTE biIStream = 0;
|
|
BYTE biInUse = 0;
|
|
BOOL fPass = TRUE;
|
|
ULONG ulPosition[3];
|
|
ULONG ulNewPosition[3];
|
|
VirtualStmNode *pvsnRootNewChildStream[2];
|
|
LPTSTR pRootNewChildStmName[2];
|
|
LPSTREAM pIStream[3];
|
|
LARGE_INTEGER liStreamPos;
|
|
ULARGE_INTEGER uliCopy;
|
|
ULARGE_INTEGER uli;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("VCPYTEST_106"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_106 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt valid CopyTo operation b/w streams.")) );
|
|
|
|
// Initialize pointers
|
|
pIStream[SOURCESTM] = pIStream[DESTSTM] = pIStream[CLONESTM] = NULL;
|
|
pRootNewChildStmName[SOURCESTM] = pRootNewChildStmName[DESTSTM] = NULL;
|
|
pvsnRootNewChildStream[SOURCESTM] = pvsnRootNewChildStream[DESTSTM] = NULL;
|
|
|
|
// Create our ChanceDF and VirtualDF
|
|
hr = CreateTestDocfile (argc,
|
|
argv,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
UINT ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
dwRootMode = pTestChanceDF->GetRootMode();
|
|
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Run Mode for VCPYTEST_106, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
if(NULL == pdgu)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi) ;
|
|
if(NULL == pdgi)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Adds source and destination IStreams to the root storage.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random names for streams
|
|
|
|
for (biIStream=SOURCESTM; biIStream <= DESTSTM; biIStream++)
|
|
{
|
|
pRootNewChildStmName[biIStream] = NULL;
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStmName[biIStream]);
|
|
|
|
if(S_OK != hr)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName"));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
for (biIStream=SOURCESTM; biIStream <= DESTSTM; biIStream++)
|
|
{
|
|
// Initialize
|
|
|
|
pIStream[biIStream] = NULL;
|
|
ulPosition[biIStream] = 0L;
|
|
|
|
hr = AddStream(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStmName[biIStream],
|
|
0,
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE |
|
|
STGM_FAILIFTHERE,
|
|
&pvsnRootNewChildStream[biIStream]);
|
|
|
|
if(S_OK != hr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Get IStream pointers
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pIStream[biIStream] = pvsnRootNewChildStream[biIStream]->
|
|
GetIStreamPointer();
|
|
}
|
|
}
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStream")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStream completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStream not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
//
|
|
// Generate Cloned IStream
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvsnRootNewChildStream[SOURCESTM]->Clone(&pIStream[CLONESTM]);
|
|
ulPosition[CLONESTM] = 0L;
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualStmNode::Clone")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Clone completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Clone not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Pick a size for the source IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random size for stream between 1L, and MIN_SIZE * 1.5
|
|
// (from old test)
|
|
|
|
usErr = pdgi->Generate(&ulIStreamSize, 1L, (ULONG) (MIN_SIZE * 1.5));
|
|
culIOBytes = ulIStreamSize;
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Call VirtualStmNode::Write to create random bytes in the stream.
|
|
// For our test purposes, we generate a random string of size
|
|
// culIOBytes using GenerateRandomString function.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GenerateRandomString(
|
|
pdgu,
|
|
culIOBytes,
|
|
culIOBytes,
|
|
&ptcsBuffer);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomString")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvsnRootNewChildStream[SOURCESTM]->Write(
|
|
(LPBYTE)ptcsBuffer,
|
|
culIOBytes,
|
|
&culWritten);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Write wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Calculate dwSourceCRC to be used in the first pass of the loop
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
ptcsBuffer,
|
|
culIOBytes,
|
|
&dwSourceCRC);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Delete temp buffer
|
|
|
|
if (NULL != ptcsBuffer)
|
|
{
|
|
delete []ptcsBuffer;
|
|
ptcsBuffer = NULL;
|
|
}
|
|
|
|
// Commit root. BUGBUG: Use random modes
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit wasn't successfully, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Reposition to start offset of the source IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(&liStreamPos, ulPosition[SOURCESTM], sizeof(LARGE_INTEGER));
|
|
|
|
hr = pvsnRootNewChildStream[SOURCESTM]->Seek(
|
|
liStreamPos,
|
|
STREAM_SEEK_SET,
|
|
NULL);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualStmNode::Seek")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Seek completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// For the first pass of the loop, we'll specify that the DEST IStream
|
|
// (as opposed to the CLONE) IStream will be the copy destination.
|
|
// Also, for the first pass, we'll copy the whole source IStream to
|
|
// dest/clone IStream, so the length of bytes before/after CopyTo both
|
|
// are 0L, i.e. ulPosition[biInUse].
|
|
|
|
biInUse = DESTSTM;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random # of small objects for test between
|
|
// usMinIteration and usMaxIteration
|
|
|
|
usErr = pdgi->Generate(
|
|
&usNumIterations,
|
|
usMinIteration,
|
|
usMaxIteration);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Random # of small objects to test is: %d"),
|
|
usNumIterations));
|
|
}
|
|
|
|
// Before doing a copy, we read and CRC the bytes in the destinaiton
|
|
// IStream(DEST or CLONE) that *won't* be overwritten by the copy
|
|
// call because we'll later need to ensure that these bytes weren't
|
|
// inadvertently changed by the copy - because that would be a bug.
|
|
|
|
while ((S_OK == hr) && (0 != usNumIterations))
|
|
{
|
|
// ***BEFORE COPY***
|
|
|
|
// Read & CRC bytes in dest/clone before intended CopyTo() start
|
|
// Offset
|
|
|
|
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
|
|
hr = pIStream[biInUse]->Seek(liStreamPos, STREAM_SEEK_SET, NULL);
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = ulIStreamSize;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[biInUse]->Read(
|
|
ptcsReadBuffer,
|
|
ulPosition[biInUse],
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwCRC[biInUse][BYTES_BEFORE]);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
// read & CRC bytes in dest/clone after intended CopyTo() start offset
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
LISet32(liStreamPos, (ulPosition[biInUse] + culIOBytes));
|
|
|
|
hr = pIStream[biInUse]->Seek(
|
|
liStreamPos,
|
|
STREAM_SEEK_SET,
|
|
NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = ulIStreamSize;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[biInUse]->Read(
|
|
ptcsReadBuffer,
|
|
culBytesRead,
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwCRC[biInUse][BYTES_AFTER]);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
// Position to dest/clone intended start offset, ready for CopyTo().
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
LISet32(liStreamPos, ulPosition[biInUse]);
|
|
hr = pIStream[biInUse]->Seek(liStreamPos, STREAM_SEEK_SET, NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Copy from current position of SOURCE IStream to the specified
|
|
// position in the dest/clone IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
ULISet32(uliCopy, culIOBytes);
|
|
|
|
hr = pIStream[SOURCESTM]->CopyTo(
|
|
pIStream[biInUse],
|
|
uliCopy,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::CopyTo not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// For variety, only commit to the root 50% of the time
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
usErr = pdgi->Generate(&culRandomCommit, 1, 100);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if ((S_OK == hr) && (culRandomCommit > 50))
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Commit wasn't successfully, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// ***AFTER COPY***
|
|
|
|
// After the copy, verify that the source and destination seek pointers
|
|
// are set correctly
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
|
|
hr = pIStream[SOURCESTM]->Seek(liStreamPos, STREAM_SEEK_CUR, &uli);
|
|
|
|
ulNewPosition[SOURCESTM] = ULIGetLow(uli);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if ((S_OK == hr) &&
|
|
(ulNewPosition[SOURCESTM] != (ulPosition[SOURCESTM] + culIOBytes)))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Source seek pointer incorrect after copy.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
|
|
hr = pIStream[biInUse]->Seek(liStreamPos, STREAM_SEEK_CUR, &uli);
|
|
|
|
ulNewPosition[biInUse] = ULIGetLow(uli);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if ((S_OK == hr) &&
|
|
(ulNewPosition[biInUse] != (ulPosition[biInUse] + culIOBytes)))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Destination seek pointer incorrect after copy.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// After copy, read & CRC bytes in dest/clone before CopyTo() start
|
|
// offset and compare CRCs to ensure that these bytes haven't changed
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
|
|
hr = pIStream[biInUse]->Seek(liStreamPos, STREAM_SEEK_SET, NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = ulIStreamSize;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[biInUse]->Read(
|
|
ptcsReadBuffer,
|
|
ulPosition[biInUse],
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwTempCRC);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
if (dwCRC[biInUse][BYTES_BEFORE] != dwTempCRC)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC mismatched at bytes before CopyTo start offset.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// Read & CRC bytes in dest/clone that were target of CopyTo()
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = culIOBytes;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[biInUse]->Read(
|
|
ptcsReadBuffer,
|
|
culBytesRead,
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwCRC[biInUse][BYTES_COPIED]);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
if (dwCRC[biInUse][BYTES_COPIED] != dwSourceCRC)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC mismatched at bytes of CopyTo() target.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// Read & CRC bytes in dest/clone after CopyTo() start offset
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = ulIStreamSize;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[biInUse]->Read(
|
|
ptcsReadBuffer,
|
|
culBytesRead,
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwTempCRC);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
if (dwCRC[biInUse][BYTES_AFTER] != dwTempCRC)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC mismatched at bytes after CopyTo() target.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if (--usNumIterations)
|
|
{
|
|
// if we'll be looping again, pick a random copy starting position
|
|
// in the source IStream and a random number of bytes to copy.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
usErr = pdgi->Generate(
|
|
&ulPosition[SOURCESTM],
|
|
0L,
|
|
ulIStreamSize);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
if((ulIStreamSize - ulPosition[SOURCESTM]) > 0)
|
|
{
|
|
usErr = pdgi->Generate(
|
|
&culIOBytes,
|
|
1L,
|
|
ulIStreamSize - ulPosition[SOURCESTM]);
|
|
}
|
|
else
|
|
{
|
|
culIOBytes = 1L;
|
|
}
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Now seek, read and CRC the source bytes and then seek back to
|
|
// the intended copy start position
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
LISet32(liStreamPos, ulPosition[SOURCESTM]);
|
|
|
|
hr = pIStream[SOURCESTM]->Seek(
|
|
liStreamPos,
|
|
STREAM_SEEK_SET,
|
|
NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culBytesRead = culIOBytes;
|
|
ptcsReadBuffer = new BYTE[culBytesRead];
|
|
|
|
if (NULL == ptcsReadBuffer)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
memset(ptcsReadBuffer, '\0', culBytesRead * sizeof(BYTE));
|
|
|
|
hr = pIStream[SOURCESTM]->Read(
|
|
ptcsReadBuffer,
|
|
culIOBytes,
|
|
&culRead);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Read wasn't successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// culRead is the actual number of bytes read from IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDataBuffer(
|
|
(LPTSTR)ptcsReadBuffer,
|
|
culRead,
|
|
&dwSourceCRC);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CalculateCRCForDataBuffer not Ok, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
if (NULL != ptcsReadBuffer)
|
|
{
|
|
delete []ptcsReadBuffer;
|
|
ptcsReadBuffer = NULL;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
LISet32(liStreamPos, ulPosition[SOURCESTM]);
|
|
|
|
hr = pIStream[SOURCESTM]->Seek(
|
|
liStreamPos,
|
|
STREAM_SEEK_SET,
|
|
NULL);
|
|
}
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Seek not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Pick an IStream for the copy destination and a destination
|
|
// offset within that IStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
usErr = pdgi->Generate(&biInUse, DESTSTM, CLONESTM);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
usErr = pdgi->Generate(&ulPosition[biInUse], 0L, ulIStreamSize);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((S_OK != hr) || (TRUE != fPass))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Release Clone stream
|
|
|
|
if (NULL != pIStream[CLONESTM])
|
|
{
|
|
ulRef = pIStream[CLONESTM]->Release();
|
|
|
|
DH_ASSERT(0 == ulRef);
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStream::Close unsuccessful.")));
|
|
}
|
|
|
|
// Release all streams, irrespective of result
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
for (biIStream=SOURCESTM; biIStream <= DESTSTM; biIStream++)
|
|
{
|
|
hr = pvsnRootNewChildStream[biIStream]->Close();
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Release Root
|
|
|
|
if (NULL != pVirtualDFRoot)
|
|
{
|
|
hr = pVirtualDFRoot->Close();
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation VCPYTEST_106 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation VCPYTEST_106 failed, hr=0x%lx."),
|
|
hr));
|
|
// test failed. make sure it failed.
|
|
hr = FirstError (hr, E_FAIL);
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete strings
|
|
|
|
for (biIStream=SOURCESTM; biIStream <= DESTSTM; biIStream++)
|
|
{
|
|
if (NULL != pRootNewChildStmName[biIStream])
|
|
{
|
|
delete pRootNewChildStmName[biIStream];
|
|
pRootNewChildStmName[biIStream] = NULL;
|
|
}
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation VCPYTEST_106 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|