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.
5886 lines
160 KiB
5886 lines
160 KiB
//-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft OLE
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1995.
|
|
//
|
|
// File: stgtsts.cxx
|
|
//
|
|
// Contents: storage base tests basically pertaining to IStorage interface
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 10-July-1996 NarindK Created.
|
|
// 27-Mar-97 SCousens conversionified
|
|
// 06-Aug-97 FarzanaR cleaned up tests for stress
|
|
// BUGBUG : this file still requires to be cleaned up for stress.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <dfheader.hxx>
|
|
#pragma hdrstop
|
|
|
|
#include "init.hxx"
|
|
|
|
// externs
|
|
extern BOOL g_fRevert;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_100
|
|
//
|
|
// Synopsis: A root docfile and child IStorage are created and committed.
|
|
// The child IStorage is released and then destroyed. The root is
|
|
// then committed and a new child IStorage is created with the same
|
|
// name as the original one. The child IStorage and root docfile
|
|
// are then released without committing. The root docfile is then
|
|
// reinstantiated. The test attempts to instantiate a child
|
|
// IStorage with the name used for the original one. The test
|
|
// verifies that no such IStorage exists because it should have been
|
|
// deleted.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 10-July-1996 NarindK Created.
|
|
//
|
|
// Notes: This test runs in transacted, and transacted deny write modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: DFCOMREL.CXX
|
|
// 2. Old name of test : MiscCommitRelease Test
|
|
// New Name of test : STGTEST_100
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-100
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-100
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-100
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_100(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
BOOL fPass = TRUE;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_100"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_100 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt storage commit/release operations")) );
|
|
|
|
// 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 STGTEST_100, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit root. BUGBUG already commited
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Adds a new storage to the root 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,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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.")));
|
|
}
|
|
}
|
|
|
|
// Destroy child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = DestroyStorage(pTestVirtualDF, pvcnRootNewChildStg);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DestroyStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("DestroyStorage unsuccessful, hr=0x%lx.")));
|
|
}
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Add a child storage to root with same name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStgName,
|
|
dwStgMode,
|
|
&pvcnRootNewChildStg);
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Release root w/o commiting
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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.")));
|
|
}
|
|
}
|
|
|
|
// Open root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Open child storage that was deleted first time, and second time when
|
|
// created wasn't committed.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Open(
|
|
NULL,
|
|
dwStgMode,
|
|
NULL,
|
|
0);
|
|
|
|
if (STG_E_FILENOTFOUND == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful as exp,hr=0x%lx."),
|
|
hr));
|
|
}
|
|
else
|
|
{
|
|
HRESULT hr2;
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Open should fail with STG_E_FILENOTFOUND, hr=0x%lx."),
|
|
hr));
|
|
fPass = FALSE;
|
|
|
|
// close it coz we found & opened it
|
|
if (S_OK == hr)
|
|
{
|
|
hr2 = pvcnRootNewChildStg->Close();
|
|
DH_HRCHECK(hr2, TEXT("VirtualStgNode::Close")) ;
|
|
}
|
|
}
|
|
hr = S_OK;
|
|
}
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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 STGTEST_100 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_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);
|
|
|
|
// Delete strings
|
|
|
|
if(NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_100 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_101
|
|
//
|
|
// Synopsis: Creates a root docfile, stats, and verifies that the CLSID == NULL
|
|
// and state bits = 0. The test tries various random combinations
|
|
// of setting state bits, changing class ids, committing changes
|
|
// sometimes, reverting at others. After every event, the test
|
|
// checks to ensure that the state bits and class id are set
|
|
// correctly. It then creates a child IStorage and repeats the
|
|
// above actions.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 14-July-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: DFSET.CXX
|
|
// 2. Old name of test : MiscSetItems Test
|
|
// New Name of test : STGTEST_101
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-101
|
|
// /dfRootMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-101
|
|
// /dfRootMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-3 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-101
|
|
// /dfRootMode:xactReadWriteShDenyW
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-101
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_101(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
USHORT usErr = 0;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
BOOL fPass = TRUE;
|
|
STATSTG statStg;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_101"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_101 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt Misc setting state bits/class id'")) );
|
|
|
|
// 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 STGTEST_101, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi) ;
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Call Stat on root.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
statStg.grfStateBits = 0;
|
|
hr = pVirtualDFRoot->Stat(&statStg, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Check CLSID from STATSTG structure
|
|
|
|
if((S_OK == hr) && (IsEqualCLSID(statStg.clsid, CLSID_NULL)))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile has CLSID_NULL as expected.")));
|
|
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile doesn't have CLSID_NULL unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// Check state bits from STATSTG structure.
|
|
|
|
if((S_OK == hr) && (0 == statStg.grfStateBits))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile has grfStateBits equal to 0 as expected.")));
|
|
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile doesn't have grfStateBits = 0 unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Call SetItemsInStorage on Root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetItemsInStorage(pVirtualDFRoot, pdgi);
|
|
|
|
DH_HRCHECK(hr, TEXT("SetItemsInStorage")) ;
|
|
}
|
|
|
|
// Adds a new storage to the root 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,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Call Stat on new child storage.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
statStg.grfStateBits = 0;
|
|
hr = pvcnRootNewChildStg->Stat(&statStg, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
// Check CLSID from STATSTG structure
|
|
|
|
if((S_OK == hr) && (IsEqualCLSID(statStg.clsid, CLSID_NULL)))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Storage has CLSID_NULL as expected.")));
|
|
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child storage doesn't have CLSID_NULL unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// Check state bits from STATSTG structure.
|
|
|
|
if((S_OK == hr) && (0 == statStg.grfStateBits))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Storage has grfStateBits equal to 0 as expected.")));
|
|
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Storage doesn't have grfStateBits=0 unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Call SetItemsInStorage on Child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetItemsInStorage(pvcnRootNewChildStg, pdgi);
|
|
|
|
DH_HRCHECK(hr, TEXT("SetItemsInStorage")) ;
|
|
}
|
|
|
|
// Release child storage.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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 STGTEST_101 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_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);
|
|
|
|
// Delete temp strings
|
|
|
|
if(NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_101 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_102
|
|
//
|
|
// Synopsis: The test attempts various illegitimate operations regarding the
|
|
// renaming and deletion of contained IStorages.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 10-July-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: IRENDEST.CXX
|
|
// 2. Old name of test : IllegitRenDest Test
|
|
// New Name of test : STGTEST_102
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-102
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx /labmode
|
|
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-102
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx /labmode
|
|
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-102
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// /labmode
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-102
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_102(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg0 = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg1 = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
LPTSTR ptszNonExist = TEXT("NonExistStg");
|
|
LPTSTR ptszNonExistNew = TEXT("NonExistStgNew");
|
|
LPOLESTR poszNonExist = NULL;
|
|
LPOLESTR poszNonExistNew = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
BOOL fPass = TRUE;
|
|
ULONG i = 0;
|
|
LPSTORAGE pStgRoot = NULL;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_102"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_102 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt illegitimate storage rename/del ops")) );
|
|
|
|
// 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 STGTEST_102, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// create two new IStorages and save their names.
|
|
|
|
for (i=0;i<2;i++)
|
|
{
|
|
// Adds a new storage to the root 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,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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.")));
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(i == 0)
|
|
{
|
|
pvcnRootNewChildStg0 = pvcnRootNewChildStg;
|
|
}
|
|
else
|
|
{
|
|
pvcnRootNewChildStg1 = pvcnRootNewChildStg;
|
|
}
|
|
}
|
|
|
|
// Delete temp strings
|
|
|
|
if(NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Break out of loop under failure conditions
|
|
|
|
if(S_OK != hr)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// verify that the IStorages have been created by attempting to
|
|
// instantiate them
|
|
// Break out of loop under failure conditions
|
|
for (i=0; i<2 && S_OK == hr; i++)
|
|
{
|
|
if(i == 0)
|
|
{
|
|
pvcnRootNewChildStg = pvcnRootNewChildStg0;
|
|
}
|
|
else
|
|
{
|
|
pvcnRootNewChildStg = pvcnRootNewChildStg1;
|
|
}
|
|
|
|
hr = pvcnRootNewChildStg->Open(
|
|
NULL,
|
|
dwStgMode | STGM_FAILIFTHERE,
|
|
NULL,
|
|
0);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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.")));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Attempt to rename the storage to a name that already exists.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg0->Rename(
|
|
pvcnRootNewChildStg1->GetVirtualCtrNodeName());
|
|
if(STG_E_ACCESSDENIED == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename failed as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename didn't fail as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt to rename an element that doesn't exist.
|
|
|
|
// Covert the names to OLECHAR
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert test name to OLECHAR
|
|
|
|
hr = TStringToOleString(ptszNonExist, &poszNonExist);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert test name to OLECHAR
|
|
|
|
hr = TStringToOleString(ptszNonExistNew, &poszNonExistNew);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
// First get IStorage pointer for root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot);
|
|
|
|
hr = pStgRoot->RenameElement(
|
|
poszNonExist,
|
|
poszNonExistNew);
|
|
if(STG_E_FILENOTFOUND == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Rename failed as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Rename didn't fail as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt to delete an element that doesn't exist.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pStgRoot->DestroyElement(poszNonExist);
|
|
if(STG_E_FILENOTFOUND == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Destroy failed as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Destroy didn't fail as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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 STGTEST_102 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_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);
|
|
|
|
// Delete strings
|
|
|
|
if(NULL != poszNonExist)
|
|
{
|
|
delete poszNonExist;
|
|
poszNonExist = NULL;
|
|
}
|
|
|
|
if(NULL != poszNonExistNew)
|
|
{
|
|
delete poszNonExistNew;
|
|
poszNonExistNew = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_102 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_103
|
|
//
|
|
// Synopsis: A random docfile with some storages and some streams is generated.
|
|
// The root docfile is commited and closed.
|
|
// The root docfile is then instantiated & an enumerator is obtained. For
|
|
// each object found, the object is renamed to a new name but the old
|
|
// name is saved. An attempt is made to instantiate the object with
|
|
// the old name, this attempt should fail. The renamed object is then
|
|
// instantiated with the new name to verify that the rename worked. The
|
|
// object is then destroyed. This occurs for every object returned by
|
|
// the enumerator. The root docfile is then committed, the enumerator
|
|
// is released, and a new enumerator is obtained. The root docfile
|
|
// is enumerated to verify that no elements exist.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 11-July-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LDRENDES.CXX
|
|
// 2. Old name of test : LegitRenDestNormal Test
|
|
// New Name of test : STGTEST_103
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-1 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-103
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-1 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-103
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-1 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-103
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-103
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_103(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
LPENUMSTATSTG penumWalk = NULL;
|
|
LPMALLOC pMalloc = NULL;
|
|
LPSTORAGE pStgRoot = NULL;
|
|
LPSTORAGE pStgChild = NULL;
|
|
LPSTREAM pStmChild = NULL;
|
|
ULONG ulRef = 0;
|
|
BOOL fPass = TRUE;
|
|
BOOL fRenamedOK = TRUE;
|
|
LPTSTR ptszNewName = NULL;
|
|
LPOLESTR poszNewName = NULL;
|
|
LPTSTR ptszOldName = NULL;
|
|
LPOLESTR poszOldName = NULL;
|
|
STATSTG statStg;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_103"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_103 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt legit rename/deleted ops on stgs/stms")));
|
|
|
|
// 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 STGTEST_103, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit substorages BUGBUG df already commited
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCommitAllOpenStgs(
|
|
pVirtualDFRoot,
|
|
STGC_DEFAULT,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root and all substorages/streams too
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Release root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Reopen the root.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Call EnumElements to get a enumerator
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->EnumElements(0, NULL, 0, &penumWalk);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::EnumElements")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// First get pMalloc that would be used to free up the name string from
|
|
// STATSTG.
|
|
|
|
if ( S_OK == hr )
|
|
{
|
|
hr = CoGetMalloc(MEMCTX_TASK, &pMalloc);
|
|
|
|
DH_HRCHECK(hr, TEXT("CoGetMalloc")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot);
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
}
|
|
|
|
while(S_OK == hr && S_OK == penumWalk->Next(1, &statStg, NULL))
|
|
{
|
|
// loop to rename object until a unique name is found, typically
|
|
// this will happen the first time and we'll fall out of the loop,
|
|
// but in the event of a duplicate name we have to keep trying.
|
|
|
|
fRenamedOK = FALSE;
|
|
|
|
while ((fRenamedOK == FALSE) && (S_OK == hr))
|
|
{
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for the element
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&ptszNewName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert above name to OLECHAR
|
|
hr = TStringToOleString(ptszNewName, &poszNewName);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
// Convert old name as retrieved from STATSTG structure to OLECHAR
|
|
// by first converting it to TSTR and then to OLECHAR.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert old name statStg.pwcsName to TCHAR
|
|
hr = OleStringToTString(statStg.pwcsName, &ptszOldName);
|
|
|
|
DH_HRCHECK(hr, TEXT("OleStringToTString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Now Convert old name to OLECHAR
|
|
hr = TStringToOleString(ptszOldName, &poszOldName);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Rename the element to new name
|
|
|
|
hr = pStgRoot->RenameElement(
|
|
poszOldName,
|
|
poszNewName);
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::RenameElement successful as exp.")));
|
|
|
|
fRenamedOK = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::RenameElement failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
break;
|
|
}
|
|
} // ((fRenamedOK == FALSE) && (S_OK == hr))
|
|
|
|
// verify that the rename worked by first trying to instantiate
|
|
// the object with the original name (this should fail) and
|
|
// then instantiate it with the new name.
|
|
|
|
if((S_OK == hr) && (statStg.type == STGTY_STORAGE))
|
|
{
|
|
hr = pStgRoot->OpenStorage(
|
|
poszOldName,
|
|
NULL,
|
|
dwStgMode,
|
|
NULL,
|
|
0,
|
|
&pStgChild);
|
|
|
|
if((NULL == pStgChild) && (STG_E_FILENOTFOUND == hr))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with old name fail exp, hr = 0x%lx "),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with old name pass unexp, hr = 0x%lx"),
|
|
hr));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pStgRoot->OpenStorage(
|
|
poszNewName,
|
|
NULL,
|
|
dwStgMode,
|
|
NULL,
|
|
0,
|
|
&pStgChild);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStorage::OpenStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with new name pass as exp")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with new name fail unexp, hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release the element
|
|
|
|
if(NULL != pStgChild)
|
|
{
|
|
ulRef = pStgChild->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStgChild = NULL;
|
|
}
|
|
} // ((S_OK == hr) && (statStg.type == STGTY_STORAGE))
|
|
|
|
if ((S_OK == hr) && (statStg.type == STGTY_STREAM))
|
|
{
|
|
//element is a stream
|
|
|
|
hr = pStgRoot->OpenStream(
|
|
poszOldName,
|
|
NULL,
|
|
STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&pStmChild);
|
|
|
|
if((NULL == pStmChild) && (STG_E_FILENOTFOUND == hr))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with old name fail exp, hr = 0x%lx "),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with old name pass unexp,hr = 0x%lx "),
|
|
hr));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pStgRoot->OpenStream(
|
|
poszNewName,
|
|
NULL,
|
|
STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&pStmChild);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStorage::OpenStream")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with new name pass as exp")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Instantiation with new name fail unexp, hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release the element
|
|
|
|
if(NULL != pStmChild)
|
|
{
|
|
ulRef = pStmChild->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStmChild = NULL;
|
|
}
|
|
} // if ((S_OK == hr) && (statStg.type == STGTY_STREAM))
|
|
|
|
// Destroy the element
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pStgRoot->DestroyElement(poszNewName);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStorage::DestroyElement")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::DestoryElement succeeded as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::DestoryElement fail unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release resources
|
|
|
|
if ( NULL != statStg.pwcsName)
|
|
{
|
|
pMalloc->Free(statStg.pwcsName);
|
|
statStg.pwcsName = NULL;
|
|
}
|
|
|
|
if(NULL != ptszNewName)
|
|
{
|
|
delete ptszNewName;
|
|
ptszNewName = NULL;
|
|
}
|
|
|
|
if(NULL != poszNewName)
|
|
{
|
|
delete poszNewName;
|
|
poszNewName = NULL;
|
|
}
|
|
|
|
if(NULL != ptszOldName)
|
|
{
|
|
delete ptszOldName;
|
|
ptszOldName = NULL;
|
|
}
|
|
|
|
if(NULL != poszOldName)
|
|
{
|
|
delete poszOldName;
|
|
poszOldName = NULL;
|
|
}
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release penumWalk
|
|
|
|
if(NULL != penumWalk)
|
|
{
|
|
ulRef = penumWalk->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
penumWalk = NULL;
|
|
}
|
|
|
|
// Call EnumElements to get a enumerator again
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->EnumElements(0, NULL, 0, &penumWalk);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::EnumElements")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Try to call next on it. All elements should have been deleted
|
|
|
|
while(S_OK == hr && S_OK == penumWalk->Next(1, &statStg, NULL))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("All elements should have been deleted.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
// Release root
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Release pMalloc
|
|
|
|
if(NULL != pMalloc)
|
|
{
|
|
pMalloc->Release();
|
|
pMalloc = NULL;
|
|
}
|
|
|
|
// Release penumWalk
|
|
|
|
if(NULL != penumWalk)
|
|
{
|
|
ulRef = penumWalk->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
penumWalk = NULL;
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_103 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_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 STGTEST_103 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_104
|
|
//
|
|
// Synopsis: This test first creates a root docfile. Two child IStorages
|
|
// are created inside of it.
|
|
// Child IStorage A is renamed to name C, child IStorage B is
|
|
// renamed to name A, child IStorage C (was originally A) is
|
|
// renames to B. The root docfile is committed. Verify
|
|
// proper renaming and no errors.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 11-July-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LDRENSWP.CXX
|
|
// 2. Old name of test : LegitRenDestSwap Test
|
|
// New Name of test : STGTEST_104
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-104
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-104
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-104
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-104
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_104(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
VirtualCtrNode *pvcnRootNewChildStg0 = NULL;
|
|
LPTSTR pRootNewChildStgName0 = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg1 = NULL;
|
|
LPTSTR pRootNewChildStgName1 = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_104"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_104 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt rename swap operations on child stgs")) );
|
|
|
|
// 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 STGTEST_104, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Adds first new child storage to the root storage.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for first child storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStgName0);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStgName0,
|
|
dwStgMode,
|
|
&pvcnRootNewChildStg0);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Adds second new child storage to the root storage.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for first child storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStgName1);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStgName1,
|
|
dwStgMode,
|
|
&pvcnRootNewChildStg1);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Can't rename open storages so release the child storages
|
|
|
|
// Release first child storage.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg0->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.")));
|
|
}
|
|
}
|
|
|
|
|
|
// Release second child storage.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg1->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.")));
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt to rename the first child storage to RootDocFile's name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("pvcnRootNewChildStg0's old name, %s."),
|
|
pvcnRootNewChildStg0->GetVirtualCtrNodeName()));
|
|
|
|
hr = pvcnRootNewChildStg0->Rename(
|
|
pVirtualDFRoot->GetVirtualCtrNodeName());
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename passed as exp, new name %s."),
|
|
pvcnRootNewChildStg0->GetVirtualCtrNodeName()));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt to rename the second child storage to first child stg's name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("pvcnRootNewChildStg1's old name, %s."),
|
|
pvcnRootNewChildStg1->GetVirtualCtrNodeName()));
|
|
|
|
hr = pvcnRootNewChildStg1->Rename(pRootNewChildStgName0);
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename passed as exp, new name %s."),
|
|
pvcnRootNewChildStg1->GetVirtualCtrNodeName()));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt to rename third child storage (was originally first child
|
|
// storage) to second child stg's name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("pvcnRootNewChildStg0's old name, %s."),
|
|
pvcnRootNewChildStg0->GetVirtualCtrNodeName()));
|
|
|
|
hr = pvcnRootNewChildStg0->Rename(pRootNewChildStgName1);
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename passed as exp, new name %s."),
|
|
pvcnRootNewChildStg0->GetVirtualCtrNodeName()));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Rename failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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)
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_104 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_104 failed, hr=0x%lx."),
|
|
hr) );
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete strings
|
|
|
|
if(NULL != pRootNewChildStgName0)
|
|
{
|
|
delete pRootNewChildStgName0;
|
|
pRootNewChildStgName0 = NULL;
|
|
}
|
|
|
|
if(NULL != pRootNewChildStgName1)
|
|
{
|
|
delete pRootNewChildStgName1;
|
|
pRootNewChildStgName1 = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_104 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_105
|
|
//
|
|
// Synopsis: A random docfile with random number of storages and streams is
|
|
// generated. Root is committed and closed.
|
|
// The root docfile is instantiated and the CRC is computed for the
|
|
// entire docfile. A new root docfile with a random name is then
|
|
// created and a CRC is generated for the empty root docfile. An
|
|
// enumerator is obtained on the source docfile, each element returned
|
|
// is MoveElementTo()'d the destination docfile. If fRevertAfterMove
|
|
// equals TRUE, the dest is reverted, else the dest is committed.
|
|
// The dest is released and reinstantiated and CRC'd. If the dest
|
|
// was reverted, the CRC is compared against the empty CRC for a match.
|
|
// Otherwise, we compare against the original root docfile CRC. The
|
|
// original file is CRC'd again to verify that STGMOVE_COPY didn't
|
|
// move the elements from orginal position but copied them, the CRC
|
|
// now computed should match with the one calculated originally.
|
|
//
|
|
// This tests differs from STGTEST-107 in the way that MoveElementTo
|
|
// is called with STGMOVE_COPY flag instead of STGMOVE_MOVE.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 12-July-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LVROOT.CXX
|
|
// 2. Old name of test : LegitMoveDFToRootDF Test
|
|
// New Name of test : STGTEST_105
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-105
|
|
// /dfRootMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-105
|
|
// /dfRootMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-105
|
|
// /dfRootMode:xactReadWriteShDenyW
|
|
// d. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-105
|
|
// /dfRootMode:xactReadWriteShEx /frevertaftermove
|
|
// e. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-105
|
|
// /dfRootMode:xactReadWriteShDenyW /frevertaftermove
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
// BUGBUG: dont have /stdblock up yet. -scousens
|
|
// BUGBUG: note this fails sometimes for nssfiles need to dig deeper -scousens working seed=21590084
|
|
//
|
|
// In case of direct mode, the flag revertaftermove is not meaningful since
|
|
// changes are always directly written to disk doc file.
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-105
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_105(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HRESULT hr2 = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
LPTSTR ptszRootNewDocFile = NULL;
|
|
LPOLESTR poszRootNewDocFile = NULL;
|
|
DWORD dwRootMode = 0;
|
|
LPSTORAGE pStgRoot1 = NULL;
|
|
LPSTORAGE pStgRoot2 = NULL;
|
|
LPSTORAGE pStgRoot11 = NULL;
|
|
ULONG ulRef = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
DWORD dwCRC3 = 0;
|
|
DWORD dwCRC4 = 0;
|
|
LPMALLOC pMalloc = NULL;
|
|
LPENUMSTATSTG penumWalk = NULL;
|
|
LPTSTR ptszElementName = NULL;
|
|
LPOLESTR poszElementName = NULL;
|
|
BOOL fPass = TRUE;
|
|
STATSTG statStg;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_105"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_105 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt MoveElementTo-STGMOVE_COPY operations")));
|
|
|
|
// 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 STGTEST_105, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit substorages
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCommitAllOpenStgs(
|
|
pVirtualDFRoot,
|
|
STGC_DEFAULT,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root and all substorages/streams too
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_INC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Open the root only
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Calculate CRC for entire DocFile without the RootDocfile name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot1 = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot1);
|
|
|
|
hr = CalculateCRCForDocFile(pStgRoot1, VERIFY_EXC_TOPSTG_NAME, &dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for first child storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&ptszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert RootDocFile name to OLECHAR
|
|
|
|
hr = TStringToOleString(ptszRootNewDocFile, &poszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = StgCreateDocfile(
|
|
poszRootNewDocFile,
|
|
dwRootMode,
|
|
0,
|
|
&pStgRoot2);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgCreateDocFile")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgCreateDocfile successful as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgCreateDocfile not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot2, VERIFY_EXC_TOPSTG_NAME, &dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Call EnumElements to get a enumerator for first DocFile
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->EnumElements(0, NULL, 0, &penumWalk);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::EnumElements")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// First get pMalloc that would be used to free up the name string from
|
|
// STATSTG.
|
|
|
|
if ( S_OK == hr )
|
|
{
|
|
hr = CoGetMalloc(MEMCTX_TASK, &pMalloc);
|
|
|
|
DH_HRCHECK(hr, TEXT("CoGetMalloc")) ;
|
|
}
|
|
|
|
while((S_OK == hr) && (S_OK == penumWalk->Next(1, &statStg, NULL)))
|
|
{
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert statStg.pwcsName to TCHAR
|
|
hr = OleStringToTString(statStg.pwcsName, &ptszElementName);
|
|
|
|
DH_HRCHECK(hr, TEXT("OleStringToTString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Now Convert old name to OLECHAR
|
|
hr = TStringToOleString(ptszElementName, &poszElementName);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Move the element to second DocFile
|
|
|
|
hr = pStgRoot1->MoveElementTo(
|
|
poszElementName,
|
|
pStgRoot2,
|
|
poszElementName,
|
|
STGMOVE_COPY);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStorage::MoveElementTo")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::MoveElementTo passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::MoveElementTo unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release resources
|
|
|
|
if ( NULL != statStg.pwcsName)
|
|
{
|
|
pMalloc->Free(statStg.pwcsName);
|
|
statStg.pwcsName = NULL;
|
|
}
|
|
|
|
if(NULL != ptszElementName)
|
|
{
|
|
delete ptszElementName;
|
|
ptszElementName = NULL;
|
|
}
|
|
|
|
if(NULL != poszElementName)
|
|
{
|
|
delete poszElementName;
|
|
poszElementName = NULL;
|
|
}
|
|
|
|
// Break out of loop in error case
|
|
|
|
if(S_OK != hr)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Commit or Revert the second docfile as the case may be.
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
hr = pStgRoot2->Commit(STGC_DEFAULT);
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = pStgRoot2->Revert();
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Revert completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Revert unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Close the second DocFile
|
|
|
|
if(NULL != pStgRoot2)
|
|
{
|
|
ulRef = pStgRoot2->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStgRoot2 = NULL;
|
|
}
|
|
|
|
// Open it again and do StgIsStorageFile to verify.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = StgOpenStorage(
|
|
poszRootNewDocFile,
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0,
|
|
&pStgRoot2);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgOpenStorage")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgOpenStorage completed successfully.")));
|
|
|
|
DH_ASSERT(NULL != pStgRoot2);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgOpenStorage unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Do StgIsStorageFile to verify
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = StgIsStorageFile(poszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgIsStorageFile")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgIsStorageFile completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgIsStorageFile unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Calculate CRC on this second Root DocFile.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot2, VERIFY_EXC_TOPSTG_NAME, &dwCRC3);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
// Compare CRC's
|
|
|
|
if((S_OK == hr) && ( FALSE == g_fRevert))
|
|
{
|
|
if (dwCRC3 == dwCRC1)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for docfile1 & docfile2 after commit match.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for docfile1 & docfile2 aftr commit don't match")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
else
|
|
if((S_OK == hr) && ( TRUE == g_fRevert))
|
|
{
|
|
if (dwCRC3 == dwCRC2)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for docfile2 before & after Revert match.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for docfile2 before & after Revert don't match")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Close the second DocFile
|
|
|
|
if(NULL != pStgRoot2)
|
|
{
|
|
ulRef = pStgRoot2->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStgRoot2 = NULL;
|
|
}
|
|
|
|
// Release penumWalk
|
|
|
|
if(NULL != penumWalk)
|
|
{
|
|
ulRef = penumWalk->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
penumWalk = NULL;
|
|
}
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Open the Root DocFile again to verify the STGMOVE_COPY flags specified
|
|
// while doing MoveElementTo
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now get the CRC again on the original DocFile to verify that flag
|
|
// STGMOVE_COPY copied the elements and not moved them, so this CRC
|
|
// should match with CRC originally obtained on this DocFile.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot11 = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot11);
|
|
|
|
hr = CalculateCRCForDocFile(pStgRoot11, VERIFY_EXC_TOPSTG_NAME,&dwCRC4);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
if (dwCRC4 == dwCRC1)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for original docfle match after move as copy.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for original DF don't match after move as copy.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Release the first root docfile
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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 STGTEST_105 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_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);
|
|
|
|
// Release pMalloc
|
|
|
|
if(NULL != pMalloc)
|
|
{
|
|
pMalloc->Release();
|
|
pMalloc = NULL;
|
|
}
|
|
|
|
// Delete strings
|
|
|
|
if(NULL != poszRootNewDocFile)
|
|
{
|
|
delete poszRootNewDocFile;
|
|
poszRootNewDocFile = NULL;
|
|
}
|
|
|
|
// Delete the second docfile on disk
|
|
|
|
if((S_OK == hr) && (NULL != ptszRootNewDocFile))
|
|
{
|
|
if(FALSE == DeleteFile(ptszRootNewDocFile))
|
|
{
|
|
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
|
|
|
|
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
|
|
}
|
|
}
|
|
|
|
// Delete temp string
|
|
|
|
if(NULL != ptszRootNewDocFile)
|
|
{
|
|
delete ptszRootNewDocFile;
|
|
ptszRootNewDocFile = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_105 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_106
|
|
//
|
|
// Synopsis: This test first creates a root docfile. A child IStorage is
|
|
// then created with STGM_DENY_WRITE set. An IStream is created
|
|
// inside the child IStorage and a random number of bytes are
|
|
// written to it. The stream is released, the child and root
|
|
// IStorages are committed, and the child IStorage is released.
|
|
// The child IStorage is instantiated in STGM_TRANSACTED mode
|
|
// and then released. A count of the files in the current directory
|
|
// is then made and saved. The child IStorage is then instantiated
|
|
// in STGM_TRANSACTED | STGM_DENY_WRITE mode and another count is
|
|
// made. We then verify that only 1 scratch file was created,
|
|
// indicating that for STGM_DENY_WRITE mode, no copy is made of
|
|
// the instantiated IStorage.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 26-July-1996 NarindK Created.
|
|
//
|
|
// Notes: THIS TEST IS NOT APPLICABLE WITH PRESENT STORAGE CODE, PRESENT
|
|
// ONLY FOR DOCUMENTATION/REFERENCE PURPOSES. BY DESIGN, THE PRESENT
|
|
// DOCFILE REQUIRES THAT ALL SUBSTORAGES/SUBSTREAMS BE CREATED/OPENED
|
|
// WITH STGM_SHARE_EXCLUSIVE FLAG.
|
|
//
|
|
// This test runs in transacted modes
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: LITWWDW.CXX
|
|
// 2. Old name of test : LegitInstRootTwwDenyWrite test
|
|
// New Name of test : STGTEST_106
|
|
// 3. To run the test, do the following at command prompt.
|
|
// stgbase /t:STGTEST-106
|
|
// 4. To run for conversion, add /dfStgType:conversion to the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-106
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_106(ULONG ulSeed)
|
|
{
|
|
#ifdef _MAC
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!!!!!!!STGTEST_106 crashes")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!!!!!!!To be investigated")) );
|
|
return E_NOTIMPL;
|
|
|
|
#else
|
|
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
VirtualStmNode *pvsnNewChildStream = NULL;
|
|
DWORD dwRootMode = STGM_READWRITE | STGM_TRANSACTED;
|
|
DG_STRING *pdgu = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
USHORT usErr = 0;
|
|
LPTSTR ptszRootName = NULL;
|
|
LPTSTR ptszRootNewChildStgName = NULL;
|
|
LPTSTR ptszStreamName = NULL;
|
|
BOOL fPass = TRUE;
|
|
LPTSTR ptcsBuffer = NULL;
|
|
ULONG culWritten = 0;
|
|
ULONG culFilesInDirectory = 0;
|
|
ULONG cb = 0;
|
|
DWCRCSTM dwMemCRC;
|
|
DWCRCSTM dwActCRC;
|
|
CDFD cdfd;
|
|
|
|
dwMemCRC.dwCRCSum = dwActCRC.dwCRCSum = 0;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_106"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_106 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1,
|
|
TEXT("Attempt operations on child storage in transacted mode.")));
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Create a new DataGen object to create random UNICODE strings.
|
|
|
|
pdgu = new(NullOnFail) DG_STRING(ulSeed);
|
|
|
|
if (NULL == pdgu)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
//want to create only one seed. Once that has been done,
|
|
//use what we created from now on.
|
|
ulSeed = pdgu->GetSeed ();
|
|
}
|
|
}
|
|
|
|
// Generate RootDocFile name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr=GenerateRandomName(pdgu, MINLENGTH,MAXLENGTH, &ptszRootName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
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 = ulSeed;
|
|
cdfd.dwRootMode = dwRootMode | STGM_CREATE;
|
|
|
|
hr = CreateTestDocfile (&cdfd,
|
|
ptszRootName,
|
|
&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF);
|
|
|
|
DH_HRCHECK(hr, TEXT("CreateTestDocfile"));
|
|
}
|
|
|
|
// if creating the docfile - bail here
|
|
if (NULL != pTestChanceDF && DoingCreate ())
|
|
{
|
|
ulSeed = pTestChanceDF->GetSeed ();
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
FALSE);
|
|
return (HRESULT)ulSeed;
|
|
}
|
|
|
|
// Adds a new storage to the root storage.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&ptszRootNewChildStgName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStorage(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
ptszRootNewChildStgName,
|
|
dwRootMode | STGM_SHARE_DENY_WRITE | STGM_FAILIFTHERE,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now add a stream to this child storage
|
|
|
|
// Generate random name for stream
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr=GenerateRandomName(pdgu, MINLENGTH,MAXLENGTH, &ptszStreamName);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi);
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random size for stream.
|
|
|
|
usErr = pdgi->Generate(&cb, 1, USHRT_MAX);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = AddStream(
|
|
pTestVirtualDF,
|
|
pvcnRootNewChildStg,
|
|
ptszStreamName,
|
|
cb,
|
|
STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE |
|
|
STGM_FAILIFTHERE,
|
|
&pvsnNewChildStream);
|
|
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Write random data into stream
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = GenerateRandomString(pdgu, cb, cb, &ptcsBuffer);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvsnNewChildStream->Write(
|
|
ptcsBuffer,
|
|
cb,
|
|
&culWritten);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStream::Write")) ;
|
|
}
|
|
|
|
// Calculate the CRC for stream name and data
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateInMemoryCRCForStm(
|
|
pvsnNewChildStream,
|
|
ptcsBuffer,
|
|
cb,
|
|
&dwMemCRC);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateInMemoryCRCForStm")) ;
|
|
}
|
|
|
|
// Release stream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvsnNewChildStream->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.")));
|
|
}
|
|
}
|
|
|
|
|
|
// Now do a commit of child storage with STGC_ONLYIFCURRENT.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Commit(STGC_ONLYIFCURRENT);
|
|
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Now do a commit of root storage with STGC_ONLYIFCURRENT.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Commit(STGC_ONLYIFCURRENT);
|
|
|
|
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 the child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
}
|
|
|
|
|
|
// Open the child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Open(
|
|
NULL,
|
|
dwRootMode | STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Close the child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
}
|
|
|
|
|
|
// count number of files in directory
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
culFilesInDirectory = CountFilesInDirectory(WILD_MASK);
|
|
}
|
|
|
|
// Open the with STGM_SHARE_DENY_WRITE
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Open(
|
|
NULL,
|
|
dwRootMode | STGM_SHARE_DENY_WRITE,
|
|
NULL,
|
|
0);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Check number of files
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if((culFilesInDirectory + 1) != CountFilesInDirectory(WILD_MASK))
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT(">1 scratch file unexp STGM_SHARE_DENY_WRITE inst.")));
|
|
|
|
hr = S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("1 scratchfile as exp STGM_SHARE_DENY_WRITE inst")));
|
|
|
|
}
|
|
}
|
|
|
|
// OpenStream
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvsnNewChildStream->Open(
|
|
NULL,
|
|
dwRootMode | STGM_SHARE_DENY_WRITE,
|
|
0);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualStmNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Read stream, CRC and verify
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = ReadAndCalculateDiskCRCForStm(pvsnNewChildStream,&dwActCRC);
|
|
|
|
DH_HRCHECK(hr, TEXT("ReadAndCalculateDiskCRCForStm")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("ReadAndCalculateDiskCRCForStm function successful.")));
|
|
|
|
if(dwActCRC.dwCRCSum == dwMemCRC.dwCRCSum)
|
|
{
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("CRC's for pvsnNewChildStream match.")));
|
|
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for pvsnNewChildStream don't match.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("ReadAndCalculateDiskCRCForStm not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Close the stream in child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvsnNewChildStream->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualStmNode::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));
|
|
}
|
|
}
|
|
|
|
|
|
// Close the child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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 the root
|
|
|
|
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)
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_106 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_106 failed, hr=0x%lx."),
|
|
hr) );
|
|
}
|
|
|
|
// Cleanup
|
|
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete DataGen object
|
|
|
|
if(NULL != pdgu)
|
|
{
|
|
delete pdgu;
|
|
pdgu = NULL;
|
|
}
|
|
|
|
// Delete temp string
|
|
|
|
if(NULL != ptszRootNewChildStgName)
|
|
{
|
|
delete ptszRootNewChildStgName;
|
|
ptszRootNewChildStgName = NULL;
|
|
}
|
|
|
|
if(NULL != ptszStreamName)
|
|
{
|
|
delete ptszStreamName;
|
|
ptszStreamName = NULL;
|
|
}
|
|
|
|
if(NULL != ptcsBuffer)
|
|
{
|
|
delete ptcsBuffer;
|
|
ptcsBuffer = NULL;
|
|
}
|
|
|
|
// Delete temp string
|
|
|
|
if(NULL != ptszRootName)
|
|
{
|
|
delete ptszRootName;
|
|
ptszRootName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_106 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
#endif //_MAC
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_107
|
|
//
|
|
// Synopsis: A random docfile with random number of storages and streams is
|
|
// generated. Root is committed and closed.
|
|
// The root docfile is instantiated and the CRC is computed for the
|
|
// entire docfile. A new root docfile with a random name is then
|
|
// created and a CRC is generated for the empty root docfile. An
|
|
// enumerator is obtained on the source docfile, each element returned
|
|
// is MoveElementTo()'d with STGM_MOVE to the destination docfile.
|
|
// If fRevertAfterMove equals TRUE, the dest is reverted, else the
|
|
// dest is committed. The dest is released and reinstantiated and
|
|
// CRC'd. If the dest was reverted, the CRC is compared against the
|
|
// empty CRC for a match. Otherwise, we compare against the original
|
|
// root docfile CRC. Original file is CRC'd again to verify that
|
|
// STGMOVE_MOVE moved the elements from orginal position instead of
|
|
// copying, the CRC now computed should differ from the one calculated
|
|
// originally.
|
|
//
|
|
// This tests differs from STGTEST-105 in the way that MoveElementTo
|
|
// is called with STGMOVE_MOVE flag instead of STGMOVE_COPY.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 8-Aug-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: A part of STORAGE.CXX
|
|
// 2. Old name of test : A part of STORAGE_TEST Test
|
|
// New Name of test : STGTEST_107
|
|
// 3. To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-107
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-107
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-107
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// d. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-107
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// /frevertaftermove
|
|
// e. stgbase /seed:2 /dfdepth:1-3 /dfstg:1-3 /dfstm:2-3 /t:STGTEST-107
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// /frevertaftermove
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
// BUGBUG: dont have /stdblock up yet. -scousens
|
|
//
|
|
// In case of direct mode, the flag revertaftermove is not meaningful since
|
|
// changes are always directly written to disk doc file.
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-107
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_107(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HRESULT hr2 = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
USHORT usErr = 0;
|
|
LPTSTR ptszRootNewDocFile = NULL;
|
|
LPOLESTR poszRootNewDocFile = NULL;
|
|
DWORD dwRootMode = 0;
|
|
LPSTORAGE pStgRoot1 = NULL;
|
|
LPSTORAGE pStgRoot2 = NULL;
|
|
LPSTORAGE pStgRoot11 = NULL;
|
|
ULONG ulRef = 0;
|
|
DWORD dwCRC1 = 0;
|
|
DWORD dwCRC2 = 0;
|
|
DWORD dwCRC3 = 0;
|
|
DWORD dwCRC4 = 0;
|
|
LPMALLOC pMalloc = NULL;
|
|
LPENUMSTATSTG penumWalk = NULL;
|
|
LPTSTR ptszElementName = NULL;
|
|
LPOLESTR poszElementName = NULL;
|
|
BOOL fPass = TRUE;
|
|
STATSTG statStg;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_107"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_107 started.")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Attempt MoveElementTo-STGMOVE_MOVE operations")));
|
|
|
|
// 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 STGTEST_107, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Commit all substgs BUGBUG df already commited
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCommitAllOpenStgs(
|
|
pVirtualDFRoot,
|
|
STGC_DEFAULT,
|
|
NODE_EXC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Commit root.
|
|
|
|
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 unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root and all substorages/streams too
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = ParseVirtualDFAndCloseOpenStgsStms(
|
|
pVirtualDFRoot,
|
|
NODE_INC_TOPSTG);
|
|
|
|
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms"));
|
|
}
|
|
|
|
// Open the root only
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Calculate CRC for entire DocFile without the RootDocfile name
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot1 = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot1);
|
|
|
|
hr = CalculateCRCForDocFile(pStgRoot1, VERIFY_EXC_TOPSTG_NAME, &dwCRC1);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Generate random name for first child storage
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&ptszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert RootDocFile name to OLECHAR
|
|
|
|
hr = TStringToOleString(ptszRootNewDocFile, &poszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = StgCreateDocfile(
|
|
poszRootNewDocFile,
|
|
dwRootMode,
|
|
0,
|
|
&pStgRoot2);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgCreateDocFile")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgCreateDocfile successful as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgCreateDocfile not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot2, VERIFY_EXC_TOPSTG_NAME, &dwCRC2);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Call EnumElements to get a enumerator for first DocFile
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->EnumElements(0, NULL, 0, &penumWalk);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::EnumElements")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::EnumElements unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// First get pMalloc that would be used to free up the name string from
|
|
// STATSTG.
|
|
|
|
if ( S_OK == hr )
|
|
{
|
|
hr = CoGetMalloc(MEMCTX_TASK, &pMalloc);
|
|
|
|
DH_HRCHECK(hr, TEXT("CoGetMalloc")) ;
|
|
}
|
|
|
|
while(S_OK == hr && S_OK == penumWalk->Next(1, &statStg, NULL))
|
|
{
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert statStg.pwcsName to TCHAR
|
|
hr = OleStringToTString(statStg.pwcsName, &ptszElementName);
|
|
|
|
DH_HRCHECK(hr, TEXT("OleStringToTString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Now Convert old name to OLECHAR
|
|
hr = TStringToOleString(ptszElementName, &poszElementName);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Move the element to second DocFile
|
|
|
|
hr = pStgRoot1->MoveElementTo(
|
|
poszElementName,
|
|
pStgRoot2,
|
|
poszElementName,
|
|
STGMOVE_COPY);
|
|
|
|
DH_HRCHECK(hr, TEXT("IStorage::MoveElementTo")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::MoveElementTo passed as expected")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::MoveElementTo unexpectedly failed hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release resources
|
|
|
|
if ( NULL != statStg.pwcsName)
|
|
{
|
|
pMalloc->Free(statStg.pwcsName);
|
|
statStg.pwcsName = NULL;
|
|
}
|
|
|
|
if(NULL != ptszElementName)
|
|
{
|
|
delete ptszElementName;
|
|
ptszElementName = NULL;
|
|
}
|
|
|
|
if(NULL != poszElementName)
|
|
{
|
|
delete poszElementName;
|
|
poszElementName = NULL;
|
|
}
|
|
}
|
|
|
|
// Commit or Revert the second docfile as the case may be.
|
|
|
|
if((S_OK == hr) && (FALSE == g_fRevert))
|
|
{
|
|
hr = pStgRoot2->Commit(STGC_DEFAULT);
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Commit completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Commit unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
else
|
|
if((S_OK == hr) && (TRUE == g_fRevert))
|
|
{
|
|
hr = pStgRoot2->Revert();
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Revert completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("IStorage::Revert unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
// Close the second DocFile
|
|
|
|
if(NULL != pStgRoot2)
|
|
{
|
|
ulRef = pStgRoot2->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStgRoot2 = NULL;
|
|
}
|
|
|
|
// Open it again and do StgIsStorageFile to verify.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = StgOpenStorage(
|
|
poszRootNewDocFile,
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0,
|
|
&pStgRoot2);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgOpenStorage")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgOpenStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgOpenStorage unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Do StgIsStorageFile to verify
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = StgIsStorageFile(poszRootNewDocFile);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgIsStorageFile")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgIsStorageFile completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgIsStorageFile unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Calculate CRC on this second Root DocFile.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = CalculateCRCForDocFile(pStgRoot2, VERIFY_EXC_TOPSTG_NAME, &dwCRC3);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
}
|
|
|
|
// Compare CRC's
|
|
|
|
if((S_OK == hr) && ( FALSE == g_fRevert))
|
|
{
|
|
if (dwCRC3 == dwCRC1)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for docfile1 & docfile2 after commit match.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for docfile1 & docfile2 aftr commit don't match")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
else
|
|
if((S_OK == hr) && ( TRUE == g_fRevert))
|
|
{
|
|
if (dwCRC3 == dwCRC2)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC's for docfile2 before & after Revert match.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for docfile2 before & after Revert don't match")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
// Close the second DocFile
|
|
|
|
if(NULL != pStgRoot2)
|
|
{
|
|
ulRef = pStgRoot2->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
pStgRoot2 = NULL;
|
|
}
|
|
|
|
// Release penumWalk
|
|
|
|
if(NULL != penumWalk)
|
|
{
|
|
ulRef = penumWalk->Release();
|
|
DH_ASSERT(0 == ulRef);
|
|
penumWalk = NULL;
|
|
}
|
|
|
|
// Release the first root docfile
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Open the Root DocFile again to verify the STGMOVE_MOVE flags specified
|
|
// while doing MoveElementTo
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->OpenRoot(
|
|
NULL,
|
|
dwRootMode,
|
|
NULL,
|
|
0);
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now get the CRC again on the original DocFile to verify that flag
|
|
// STGMOVE_COPY copied the elements and not moved them, so this CRC
|
|
// should match with CRC originally obtained on this DocFile.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
pStgRoot11 = pVirtualDFRoot->GetIStoragePointer();
|
|
|
|
DH_ASSERT(NULL != pStgRoot11);
|
|
|
|
hr = CalculateCRCForDocFile(pStgRoot11, VERIFY_EXC_TOPSTG_NAME,&dwCRC4);
|
|
|
|
DH_HRCHECK(hr, TEXT("CalculateCRCForDocFile")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
if (dwCRC4 == dwCRC1)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for org docfile don't match as exp-move as move")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("CRC for org docfile match unexp -move as move")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Release the first root docfile
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
// Release pMalloc
|
|
if(NULL != pMalloc)
|
|
{
|
|
pMalloc->Release();
|
|
pMalloc = NULL;
|
|
}
|
|
|
|
// if everything goes well, log test as passed else failed.
|
|
if ((S_OK == hr) && (TRUE == fPass))
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_107 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_107 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
|
|
|
|
if(NULL != poszRootNewDocFile)
|
|
{
|
|
delete poszRootNewDocFile;
|
|
poszRootNewDocFile = NULL;
|
|
}
|
|
|
|
// Delete the second docfile on disk
|
|
|
|
if((S_OK == hr) && (NULL != ptszRootNewDocFile))
|
|
{
|
|
if(FALSE == DeleteFile(ptszRootNewDocFile))
|
|
{
|
|
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
|
|
|
|
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
|
|
}
|
|
}
|
|
|
|
// Delete temp string
|
|
|
|
if(NULL != ptszRootNewDocFile)
|
|
{
|
|
delete ptszRootNewDocFile;
|
|
ptszRootNewDocFile = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_107 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_108
|
|
//
|
|
// Synopsis: A root docfile with a child storage is created, then check if
|
|
// Set/GetConvertStorage APIs work correctly as expected by passed
|
|
// in a storage pointer(here, we test both root storage and child
|
|
// storage pointer). Also have some illegitmate tests by passing
|
|
// invalid arguments to these APIs.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 14-Aug-1996 JiminLi Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: A part of STORAGE.CXX
|
|
// 2. Old name of test : A part of STORAGE_TEST Test
|
|
// New Name of test : STGTEST_108
|
|
// 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:STGTEST-108
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-108
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-108
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-108
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_108(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
DG_INTEGER *pdgi = NULL;
|
|
LPSTORAGE pRootStg = NULL;
|
|
LPSTORAGE pChildStg = NULL;
|
|
USHORT usErr = 0;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_108"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_108 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt legit and illegit tests on Set/GetConvertStg APIs")));
|
|
|
|
// 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 STGTEST_108, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get root storage pointer
|
|
if (NULL != pVirtualDFRoot)
|
|
{
|
|
pRootStg = pVirtualDFRoot->GetIStoragePointer();
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi) ;
|
|
}
|
|
|
|
// Adds a new storage to the root 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,
|
|
&pvcnRootNewChildStg);
|
|
|
|
pChildStg = pvcnRootNewChildStg->GetIStoragePointer();
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Legit tests of Set/GetConvertStg on the root storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetConvertStg(pRootStg, TRUE);
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GetConvertStg(pRootStg);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("SetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetConvertStg(pRootStg, FALSE);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("GetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GetConvertStg(pRootStg);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("SetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
if (S_FALSE == hr)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("GetConvertStg did not return S_FALSE as expected.")));
|
|
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
|
|
// Legit tests of Set/GetConvertStg on the child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetConvertStg(pChildStg, TRUE);
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GetConvertStg(pChildStg);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("SetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetConvertStg(pChildStg, FALSE);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("GetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GetConvertStg(pChildStg);
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("SetConvertStg did not return S_OK as expected.")));
|
|
}
|
|
|
|
if (S_FALSE == hr)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("GetConvertStg did not return S_FALSE as expected.")));
|
|
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
|
|
// Illegit tests
|
|
|
|
#ifdef _MAC
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!!!!!SetConvertStg with NULL IStorage skipped")) );
|
|
|
|
#else
|
|
|
|
// Pass NULL as IStorage pointer, it should fail
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = SetConvertStg(NULL, TRUE);
|
|
if (E_INVALIDARG == hr)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("SetConvertStg did not return E_INVALIDARG as expected")));
|
|
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = GetConvertStg(NULL);
|
|
}
|
|
|
|
if (E_INVALIDARG == hr)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("GetConvertStg did not return E_INVALIDARG as expected")));
|
|
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
|
|
#endif //_MAC
|
|
|
|
// Commit the 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));
|
|
}
|
|
}
|
|
|
|
|
|
// Release child and root storages
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Close();
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close"));
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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)
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_108 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_108 failed, hr = 0x%lx."),
|
|
hr) );
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete temp strings
|
|
|
|
if (NULL != pRootNewChildStgName)
|
|
{
|
|
delete []pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_108 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_109
|
|
//
|
|
// Synopsis: A root docfile is created with a child storage. Check StgSetTimes
|
|
// API work as expected to set times on root Storage and IStorage::
|
|
// SetElementTimes on child storage. Verify by stat'ng on Storages
|
|
// and comparing stat'd times. Then attempt setting times with NULL
|
|
// time parameters. Verify that earlier time set on storage remain
|
|
// untouched. Attempt illegitmate ops on the API.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 15-Aug-1996 NarindK Created.
|
|
//
|
|
// New Test Notes:
|
|
// 1. Old File: A part of OLECMN.CXX
|
|
// 2. Old name of test : TestStgSetTime
|
|
// New Name of test : STGTEST_109
|
|
// 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:STGTEST-109
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-109
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-109
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// 4. To run for conversion, NA (add /dfStgType:conversion to each of the above)
|
|
// 5. To run for nssfile, NA (add /dfStgType:nssfile to each of the above)
|
|
// BUGBUG: -scousens StgSetTimes not supported for nssfiles????
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-109
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_109(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualCtrNode *pvcnRootNewChildStg = NULL;
|
|
LPTSTR pRootNewChildStgName = NULL;
|
|
LPOLESTR poszVirtualDFRootName = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
DWORD dwRootMode = 0;
|
|
DWORD dwStgMode = 0;
|
|
BOOL fRet = FALSE;
|
|
BOOL fPass = TRUE;
|
|
FILETIME cNewRootStgFileTime = {dwDefLowDateTime,
|
|
dwDefHighDateTime};
|
|
FILETIME cNewChildStgFileTime = {dwDefLowDateTime,
|
|
dwDefHighDateTime};
|
|
SYSTEMTIME cCurrentSystemTime;
|
|
STATSTG statStg;
|
|
STATSTG statStgChild;
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_109"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_109 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Attempt legit/illegit tests on StgSetTimes API")));
|
|
|
|
// 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 STGTEST_109, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_STRING object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Adds a new storage to the root 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,
|
|
&pvcnRootNewChildStg);
|
|
|
|
DH_HRCHECK(hr, TEXT("AddStorage")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("AddStorage not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Commit the 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));
|
|
}
|
|
}
|
|
|
|
|
|
// StgSetTimes on Root stg
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
// Convert test name to OLECHAR
|
|
|
|
hr = TStringToOleString(
|
|
pVirtualDFRoot->GetVirtualCtrNodeName(),
|
|
&poszVirtualDFRootName);
|
|
|
|
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
|
|
}
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
GetSystemTime(&cCurrentSystemTime);
|
|
|
|
fRet = SystemTimeToFileTime(&cCurrentSystemTime, &cNewRootStgFileTime);
|
|
|
|
DH_ASSERT(TRUE == fRet);
|
|
DH_ASSERT(dwDefLowDateTime != cNewRootStgFileTime.dwLowDateTime);
|
|
DH_ASSERT(dwDefHighDateTime != cNewRootStgFileTime.dwHighDateTime);
|
|
|
|
hr = StgSetTimes(
|
|
poszVirtualDFRootName,
|
|
&cNewRootStgFileTime,
|
|
&cNewRootStgFileTime,
|
|
&cNewRootStgFileTime);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgSetTimes")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes API passed as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes API failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now stat on root storage to see times are set correctly.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Stat(&statStg, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Compare times from STATSTG structure. FAT doesn't have enough
|
|
// resolution, so we would retrict to comapring dwHighDateTime part only
|
|
// for mtime and ctime.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(cNewRootStgFileTime.dwHighDateTime == statStg.mtime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile mtime set as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile mtime didn't set unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if(cNewRootStgFileTime.dwHighDateTime == statStg.ctime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile ctime set as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile ctime didn't set unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
}
|
|
|
|
|
|
// SetElementTimes on Child Storage
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
GetSystemTime(&cCurrentSystemTime);
|
|
|
|
fRet = SystemTimeToFileTime(&cCurrentSystemTime, &cNewChildStgFileTime);
|
|
|
|
DH_ASSERT(TRUE == fRet);
|
|
DH_ASSERT(dwDefLowDateTime != cNewChildStgFileTime.dwLowDateTime);
|
|
DH_ASSERT(dwDefHighDateTime != cNewChildStgFileTime.dwHighDateTime);
|
|
|
|
hr = pvcnRootNewChildStg->SetElementTimes(
|
|
&cNewChildStgFileTime,
|
|
&cNewChildStgFileTime,
|
|
&cNewChildStgFileTime);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::SetElementTimes")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::SetElementTimes passed as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::SetElementTimes failed unexp, hr = 0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now open and stat on child storage to see times are set correctly.
|
|
|
|
// Open child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Open(NULL, dwStgMode, NULL, 0);
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Stat on child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Stat(&statStgChild, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Compare times from STATSTG structure. FAT doesn't have enough
|
|
// resolution, so we would retrict to comapring dwHighDateTime part only
|
|
// for mtime and ctime.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(cNewChildStgFileTime.dwHighDateTime ==
|
|
statStgChild.mtime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Stg mtime set as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child stg mtime didn't set unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if(cNewChildStgFileTime.dwHighDateTime ==
|
|
statStgChild.ctime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child stg ctime set as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Stg ctime didn't set unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
|
|
// StgSetTimes on Root stg with all NULL time elements. Verify that the
|
|
// time doesn't change,
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = StgSetTimes(
|
|
poszVirtualDFRootName,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgSetTimes with NULL time parameters")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes API with NULL time param passed as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes API with NULL time param fail unexp, hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now stat on root storage to seeearlier times have remain untouched.
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pVirtualDFRoot->Stat(&statStg, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Compare times from STATSTG structure. FAT doesn't have enough
|
|
// resolution, so we would retrict to comapring dwHighDateTime part only
|
|
// for mtime and ctime.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(cNewRootStgFileTime.dwHighDateTime == statStg.mtime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile mtime unchanged as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile mtime changed unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if(cNewRootStgFileTime.dwHighDateTime == statStg.ctime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile ctime unchanged as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Root DocFile ctime changed unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
// SetElementTimes on Child Storage with all NULL times. Verify that
|
|
// the times remain unchanged.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->SetElementTimes(NULL,NULL,NULL);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::SetElementTimes")) ;
|
|
if(S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VCN::SetElementTimes with NULL times passed as exp.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VCN:SetElementTimes with NULL times failed unexp,hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Now open and stat on child storage to see times are set correctly.
|
|
|
|
// Open child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Open(NULL, dwStgMode, NULL, 0);
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Stat on child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->Stat(&statStgChild, STATFLAG_NONAME);
|
|
|
|
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
|
|
if (S_OK == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat completed successfully.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualCtrNode::Stat unsuccessful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Compare times from STATSTG structure. FAT doesn't have enough
|
|
// resolution, so we would retrict to comapring dwHighDateTime part only
|
|
// for mtime and ctime.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
if(cNewChildStgFileTime.dwHighDateTime ==
|
|
statStgChild.mtime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Stg mtime unchanged as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child stg mtime changed unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
|
|
if(cNewChildStgFileTime.dwHighDateTime ==
|
|
statStgChild.ctime.dwHighDateTime)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child stg ctime unchanged as expected.")));
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Child Stg ctime changed unexpectedly.")));
|
|
|
|
fPass = FALSE;
|
|
}
|
|
}
|
|
|
|
// Release child storage
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvcnRootNewChildStg->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));
|
|
}
|
|
}
|
|
|
|
|
|
// Attempt calling StgSetTimes with NULL name.
|
|
|
|
if(S_OK == hr)
|
|
{
|
|
GetSystemTime(&cCurrentSystemTime);
|
|
|
|
fRet = SystemTimeToFileTime(&cCurrentSystemTime, &cNewRootStgFileTime);
|
|
|
|
DH_ASSERT(TRUE == fRet);
|
|
DH_ASSERT(dwDefLowDateTime != cNewRootStgFileTime.dwLowDateTime);
|
|
DH_ASSERT(dwDefHighDateTime != cNewRootStgFileTime.dwHighDateTime);
|
|
|
|
hr = StgSetTimes(
|
|
NULL,
|
|
&cNewRootStgFileTime,
|
|
&cNewRootStgFileTime,
|
|
&cNewRootStgFileTime);
|
|
|
|
DH_HRCHECK(hr, TEXT("StgSetTimes")) ;
|
|
if(STG_E_INVALIDNAME == hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes API with NULL name failed as exp, hr = 0x%lx."),
|
|
hr));
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("StgSetTimes with NULL name didn't fail as exp, hr=0x%lx"),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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 STGTEST_109 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_109 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 temp strings
|
|
|
|
if (NULL != poszVirtualDFRootName)
|
|
{
|
|
delete poszVirtualDFRootName;
|
|
poszVirtualDFRootName = NULL;
|
|
}
|
|
|
|
if (NULL != pRootNewChildStgName)
|
|
{
|
|
delete pRootNewChildStgName;
|
|
pRootNewChildStgName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_109 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Test: STGTEST_110
|
|
//
|
|
// Synopsis: A root docfile is created, then add a random number of streams
|
|
// under the root storage, make sure the last stream's size is
|
|
// less than 4K(ministream), then commit and release the docfile.
|
|
//
|
|
// Arguments:[argc]
|
|
// [argv]
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Notes: This test runs in direct, transacted, and transacted deny write
|
|
// modes
|
|
//
|
|
// History: 29-Oct-1996 JiminLi Created.
|
|
//
|
|
// Notes:
|
|
// To run the test, do the following at command prompt.
|
|
// a. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-110
|
|
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
|
|
// b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-110
|
|
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
|
|
// c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:STGTEST-110
|
|
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
|
|
// 4. To run for conversion, add /dfStgType:conversion to each of the above
|
|
// 5. To run for nssfile, add /dfStgType:nssfile to each of the above
|
|
//
|
|
// BUGNOTE: Conversion: STGTEST-110
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
HRESULT STGTEST_110(int argc, char *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ChanceDF *pTestChanceDF = NULL;
|
|
VirtualDF *pTestVirtualDF = NULL;
|
|
VirtualCtrNode *pVirtualDFRoot = NULL;
|
|
VirtualStmNode **pvsnRootNewChildStream = NULL;
|
|
LPTSTR *pRootNewChildStmName = NULL;
|
|
ULONG culBytesWrite = 0;
|
|
DG_INTEGER *pdgi = NULL;
|
|
LPTSTR ptcsBuffer = NULL;
|
|
DG_STRING *pdgu = NULL;
|
|
DWORD dwRootMode = 0;
|
|
ULONG ulIndex = 0;
|
|
ULONG ulStmNum = 0;
|
|
ULONG ulMinStm = 2;
|
|
ULONG ulMaxStm = 5;
|
|
ULONG culWritten = 0;
|
|
USHORT usErr = 0;
|
|
|
|
|
|
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("STGTEST_110"));
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_110 started.")) );
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("Test on adding a ministream into the root storage")));
|
|
|
|
// 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 STGTEST_110, Access mode: %lx"),
|
|
dwRootMode));
|
|
}
|
|
|
|
// Get DG_UNICODE object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgu = pTestVirtualDF->GetDataGenUnicode();
|
|
|
|
DH_ASSERT(NULL != pdgu) ;
|
|
}
|
|
|
|
// Get DG_INTEGER object pointer
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pdgi = pTestVirtualDF->GetDataGenInteger();
|
|
|
|
DH_ASSERT(NULL != pdgi) ;
|
|
}
|
|
|
|
// Generate the number of streams to create
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
usErr = pdgi->Generate(&ulStmNum, ulMinStm, ulMaxStm);
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Initialization
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
pvsnRootNewChildStream = new VirtualStmNode*[ulStmNum];
|
|
pRootNewChildStmName = new LPTSTR[ulStmNum];
|
|
|
|
if ((NULL == pvsnRootNewChildStream) || (NULL == pRootNewChildStmName))
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
for (ulIndex = 0; ulIndex < ulStmNum; ulIndex++)
|
|
{
|
|
pvsnRootNewChildStream[ulIndex] = NULL;
|
|
pRootNewChildStmName[ulIndex] = NULL;
|
|
}
|
|
}
|
|
|
|
// Create ulStmNum streams under the root storage
|
|
|
|
for (ulIndex = 0; ulIndex < ulStmNum; ulIndex++)
|
|
{
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random name for stream
|
|
|
|
hr = GenerateRandomName(
|
|
pdgu,
|
|
MINLENGTH,
|
|
MAXLENGTH,
|
|
&pRootNewChildStmName[ulIndex]);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = AddStream(
|
|
pTestVirtualDF,
|
|
pVirtualDFRoot,
|
|
pRootNewChildStmName[ulIndex],
|
|
0,
|
|
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
|
|
&pvsnRootNewChildStream[ulIndex]);
|
|
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate random size for stream between MIN_STMSIZE and
|
|
// MAX_STMSIZE if it's not the last stream, otherwise generate a
|
|
// size between 0 and MAXSIZEOFMINISTM(4k).
|
|
|
|
if (ulStmNum-1 == ulIndex)
|
|
{
|
|
usErr = pdgi->Generate(&culBytesWrite,0L,MAXSIZEOFMINISTM);
|
|
}
|
|
else
|
|
{
|
|
usErr = pdgi->Generate(&culBytesWrite,MIN_STMSIZE,MAX_STMSIZE);
|
|
}
|
|
|
|
if (DG_RC_SUCCESS != usErr)
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
// Generate a random string of size culBytesWrite
|
|
|
|
hr = GenerateRandomString(
|
|
pdgu,
|
|
culBytesWrite,
|
|
culBytesWrite,
|
|
&ptcsBuffer);
|
|
|
|
DH_HRCHECK(hr, TEXT("GenerateRandomString")) ;
|
|
}
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = pvsnRootNewChildStream[ulIndex]->Write(
|
|
ptcsBuffer,
|
|
culBytesWrite,
|
|
&culWritten);
|
|
if (S_OK != hr)
|
|
{
|
|
DH_TRACE((
|
|
DH_LVL_TRACE1,
|
|
TEXT("VirtualStmNode::Write not successful, hr=0x%lx."),
|
|
hr));
|
|
}
|
|
}
|
|
|
|
|
|
// Delete the temp buffer
|
|
|
|
if (NULL != ptcsBuffer)
|
|
{
|
|
delete ptcsBuffer;
|
|
ptcsBuffer = NULL;
|
|
}
|
|
}
|
|
|
|
// Commit the 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));
|
|
}
|
|
}
|
|
|
|
|
|
// Release root
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
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)
|
|
{
|
|
DH_LOG((LOG_PASS, TEXT("Test variation STGTEST_110 passed.")) );
|
|
}
|
|
else
|
|
{
|
|
DH_LOG((LOG_FAIL,
|
|
TEXT("Test variation STGTEST_110 failed, hr = 0x%lx."),
|
|
hr) );
|
|
}
|
|
|
|
// Cleanup
|
|
CleanupTestDocfile (&pVirtualDFRoot,
|
|
&pTestVirtualDF,
|
|
&pTestChanceDF,
|
|
S_OK == hr);
|
|
|
|
// Delete temp strings
|
|
|
|
if (NULL != pvsnRootNewChildStream)
|
|
{
|
|
delete []pvsnRootNewChildStream;
|
|
pvsnRootNewChildStream = NULL;
|
|
}
|
|
|
|
for (ulIndex = 0; ulIndex < ulStmNum; ulIndex++)
|
|
{
|
|
if (NULL != pRootNewChildStmName[ulIndex])
|
|
{
|
|
delete pRootNewChildStmName[ulIndex];
|
|
pRootNewChildStmName[ulIndex] = NULL;
|
|
}
|
|
}
|
|
|
|
if (NULL != pRootNewChildStmName)
|
|
{
|
|
delete pRootNewChildStmName;
|
|
pRootNewChildStmName = NULL;
|
|
}
|
|
|
|
// Stop logging the test
|
|
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation STGTEST_110 finished")) );
|
|
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
|
|
|
|
return hr;
|
|
}
|