Leaked source code of windows server 2003
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.
 
 
 
 
 
 

4474 lines
118 KiB

//-------------------------------------------------------------------------
//
// Microsoft OLE
// Copyright (C) Microsoft Corporation, 1994 - 1995.
//
// File: dftests.cxx
//
// Contents: storage base tests basically pertaining to DocFile in general.
//
// Functions:
//
// History: 3-June-1996 NarindK Created.
// 27-Mar-97 SCousens conversionified
//
//--------------------------------------------------------------------------
//BUGBUG: BUGNOTE: All not for conversion need a second look. -scousens
#include <dfheader.hxx>
#pragma hdrstop
#include <sys/stat.h>
#include <share.h>
#include <errno.h> //get errors for our runtime calls
#include "init.hxx"
//----------------------------------------------------------------------------
//
// Test: DFTEST_100
//
// Synopsis: Regression test to create a root docfile. Commit the root docfile.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct, transacted, and transacted deny write
// modes
//
// New Test Notes:
// 1. Old File: DFCOMMIT.CXX
// 2. Old name of test : LegitRootNormal
// New Name of test : DFTEST_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:DFTEST-100
// /dfRootMode:dirReadWriteShEx /dfname:DFCOMMIT.DFL
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-100
// /dfRootMode:xactReadWriteShEx /dfname:DFCOMMIT.DFL
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-100
// /dfRootMode:xactReadWriteShDenyW /dfname:DFCOMMIT.DFL
//
// BUGNOTE: Conversion: DFTEST-100 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_100(int argc, char *argv[])
{
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
LPTSTR pFileName = NULL;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_100"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_100 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Regression test for Root DocFile creation/commit. ")));
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestChanceDF->CreateFromParams(argc, argv);
DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromParams")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_100, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Create the VirtualDocFile tree from the ChanceDocFile tree created in
// the previous step. The VirtualDocFile tree consists of VirtualCtrNodes
// and VirtualStmNodes.
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - successfully created.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - failed, hr = 0x%lx."),
hr));
}
// BUGBUG: Use Random commit modes...
if (S_OK == hr)
{
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Commit completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Commit unsuccessful, hr = 0x%lx."),
hr));
}
// Call Release on 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)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_100 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_100 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
// Get the name of file, will be used later to delete the file
if(NULL != pVirtualDFRoot)
{
pFileName= new TCHAR[_tcslen(pTestVirtualDF->GetDocFileName())+1];
if (pFileName != NULL)
{
_tcscpy(pFileName, pTestVirtualDF->GetDocFileName());
}
}
// Delete the docfile on disk
if((S_OK == hr) && (NULL != pFileName))
{
if(FALSE == DeleteFile(pFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree
if(NULL != pTestVirtualDF)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete temp string
if(NULL != pFileName)
{
delete pFileName;
pFileName = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_100 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_101
//
// Synopsis: Regression test to create a root docfile, commit the root docfile,
// release the toot docfile and remove the docfile.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct, transacted, and transacted deny write
// modes
//
// New Test Notes:
// 1. Old File: DFREMOVE.CXX
// 2. Old name of test :
// New Name of test : DFTEST_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:DFTEST-101
// /dfRootMode:dirReadWriteShEx /dfname:DFREMOVE.DFL
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-101
// /dfRootMode:xactReadWriteShEx /dfname:DFREMOVE.DFL
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-101
// /dfRootMode:xactReadWriteShDenyW /dfname:DFREMOVE.DFL
//
// BUGNOTE: Conversion: DFTEST-101 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_101(int argc, char *argv[])
{
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
LPTSTR pFileName = NULL;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_101"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_101 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Regression for RootDocFile creation/commit/release/removal.")));
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestChanceDF->CreateFromParams(argc, argv);
DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromParams")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_101, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Create the VirtualDocFile tree from the ChanceDocFile tree created in
// the previous step. The VirtualDocFile tree consists of VirtualCtrNodes
// and VirtualStmNodes.
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - successfully created.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - failed, hr = 0x%lx."),
hr));
}
// Commit the root docfile with STGC_ONLYIFCURRENT mode.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Commit(STGC_ONLYIFCURRENT);
}
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 Release on 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)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_101 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_101 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
// Get the name of file, will be used later to delete the file
if(NULL != pVirtualDFRoot)
{
pFileName= new TCHAR[_tcslen(pTestVirtualDF->GetDocFileName())+1];
if (pFileName != NULL)
{
_tcscpy(pFileName, pTestVirtualDF->GetDocFileName());
}
}
// Delete the docfile on disk
if((S_OK == hr) && (NULL != pFileName))
{
if(FALSE == DeleteFile(pFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree
if(NULL != pTestVirtualDF)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete temp string
if(NULL != pFileName)
{
delete pFileName;
pFileName = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_101 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_102
//
// Synopsis: Regression test to create a root docfile, commit the root docfile,
// release the root docfile. Verify using StgIsStorageFile API.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in transacted mode.
//
// New Test Notes:
// 1. Old File: DFROOT.CXX
// 2. Old name of test : TransactedCommitTest
// New Name of test : DFTEST_102
// a. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-102
// /dfRootMode:xactReadWriteShEx /dfname:DFROOT.DFL
//
// BUGNOTE: Conversion: DFTEST-102 NO
//
// StgIsOpenStorage returns S_OK in transacted mode before Commit is done.
//-----------------------------------------------------------------------------
HRESULT DFTEST_102(int argc, char *argv[])
{
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
LPTSTR pFileName = NULL;
LPOLESTR pOleStrTemp = NULL;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_102"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_102 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Regression test for RootDocFile creation/commit/release")));
DH_TRACE((DH_LVL_TRACE1,
TEXT("in transacted mode. Use StgIsStorageFile to verify.")));
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestChanceDF->CreateFromParams(argc, argv);
DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromParams")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_102, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Create the VirtualDocFile tree from the ChanceDocFile tree created in
// the previous step. The VirtualDocFile tree consists of VirtualCtrNodes
// and VirtualStmNodes.
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - successfully created.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - CreateFromParams - failed, hr = 0x%lx."),
hr));
}
if(S_OK == hr)
{
// Convert DocFile name to OLECHAR
hr = TStringToOleString(pTestVirtualDF->GetDocFileName(), &pOleStrTemp);
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
}
// Use StgIsStorageFile now. This should return S_OK since even if
// commit is not done till this point, signature is written into it.
// This is different frol old base tests since this enhancement is
// checked in by Storage team (confirmed by PhilipLa)
if (S_OK == hr)
{
hr = StgIsStorageFile(pOleStrTemp);
if(S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgIsStorage returned hr = 0x%lx as expected."), hr));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgIsStorage returned hr = 0x%lx unexpectedly."), hr));
}
}
// Commit the root docfile with STGC_ONLYIFCURRENT mode.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Commit(STGC_ONLYIFCURRENT);
}
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));
}
// Use StgIsStorageFile now. This should again return S_OK since commit is
// done by now.
if (S_OK == hr)
{
hr = StgIsStorageFile(pOleStrTemp);
if(S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgIsStorage returned hr = 0x%lx as expected."), hr));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgIsStorage returned hr = 0x%lx unexpectedly."), hr));
}
}
// Call Release on 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)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_102 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_102 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
// Get the name of file, will be used later to delete the file
if(NULL != pVirtualDFRoot)
{
pFileName= new TCHAR[_tcslen(pTestVirtualDF->GetDocFileName())+1];
if (pFileName != NULL)
{
_tcscpy(pFileName, pTestVirtualDF->GetDocFileName());
}
}
// Delete the docfile on disk
if((S_OK == hr) && (NULL != pFileName))
{
if(FALSE == DeleteFile(pFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree
if(NULL != pTestVirtualDF)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete temp string
if(NULL != pFileName)
{
delete pFileName;
pFileName = NULL;
}
if(NULL != pOleStrTemp)
{
delete pOleStrTemp;
pOleStrTemp = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_102 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_103
//
// Synopsis: Regression test to create and instantiate a root docfile with path
// as part of the name.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct, transacted, and transacted deny write
// modes
//
// New Test Notes:
// 1. Old File: DFTESTN.CXX
// 2. Old name of test :
// New Name of test : DFTEST_103
// 3. To run the test, do the following at command prompt.
// stgbase /seed:0 /t:DFTEST-103
//
// BUGNOTE: Conversion: DFTEST-103 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_103(ULONG ulSeed)
{
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
LPSTORAGE pIRootStorage = NULL;
DWORD dwLen = 0;
DG_STRING *pdgu = NULL;
USHORT usErr = 0;
LPTSTR pFileName = NULL;
LPOLESTR poszFileName = NULL;
TCHAR tszFileName[MAX_PATH+1];
ULONG ulRef = 0;
DWORD dwDirectMode = STGM_DIRECT |
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE;
DWORD dwTransactedMode = STGM_TRANSACTED |
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE;
DWORD dwTransactedDWMode = STGM_TRANSACTED |
STGM_READWRITE |
STGM_SHARE_DENY_WRITE;
DWORD dwRootMode[3] = {dwDirectMode,
dwTransactedMode,
dwTransactedDWMode};
INT count = 0;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_103"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_103 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Regression for RootDF creation with path as part of name.")));
if(S_OK == hr)
{
// Create a new DataGen object to create random strings.
pdgu = new(NullOnFail) DG_STRING(ulSeed);
if (NULL == pdgu)
{
hr = E_OUTOFMEMORY;
}
}
if(S_OK == hr)
{
// Generate random name for root
hr = GenerateRandomName(
pdgu,
MINLENGTH,
MAXLENGTH,
&pFileName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
// Determine current directory path (so that a MAX_PATH long
// filename can be constructed).
if (S_OK == hr)
{
dwLen = GetCurrentDirectory(MAX_PATH, tszFileName);
if (0 == dwLen)
{
hr = HRESULT_FROM_WIN32(GetLastError());
DH_HRCHECK(hr, TEXT("GetCurrentDirectory"));
}
}
if (S_OK == hr)
{
_tcscat(tszFileName, SZ_SEP);
_tcscat(tszFileName, pFileName);
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Name of root docfile %ws for DFTEST_103 "),
tszFileName));
}
if(S_OK == hr)
{
// Convert RootDocFile name to OLECHAR
hr = TStringToOleString(tszFileName, &poszFileName);
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
}
// First attempt test with Direct mode.
while((count<3) && (S_OK == hr))
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_103, Access mode: %lx"),
dwRootMode[count]));
// Only direct mode is supported for flatfiles, so do accordingly
// ----------- flatfile change ---------------
if(StorageIsFlat() && ( dwDirectMode != dwRootMode[count]))
{
break;
}
// ----------- flatfile change ---------------
// Call StgCreateDocFile with path in file name.
if (S_OK == hr)
{
hr = StgCreateDocfile(
poszFileName,
STGM_CREATE | dwRootMode[count],
0,
&pIRootStorage);
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgCreateDocfile completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("StgCreateDocfile unsuccessful, hr = 0x%lx."),
hr));
}
// Commit
if (S_OK == hr)
{
hr = pIRootStorage->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));
}
// Call Release on root docfile
if (S_OK == hr)
{
ulRef = pIRootStorage->Release();
DH_ASSERT(0 == ulRef);
pIRootStorage = NULL;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("IStorage::Release completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("IStorage::Release unsuccessfull, hr = 0x%lx."),
hr));
}
// Instantiate the RootDocFile again
if (S_OK == hr)
{
hr = StgOpenStorage(
poszFileName,
NULL,
dwRootMode[count],
NULL,
0,
&pIRootStorage);
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));
}
// Call Release on root docfile
if (S_OK == hr)
{
ulRef = pIRootStorage->Release();
DH_ASSERT(0 == ulRef);
pIRootStorage = NULL;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("IStorage::Release completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("IStorage::Release unsuccessful, hr = 0x%lx."),
hr));
}
count++;
}
// if everything goes well, log test as passed else failed.
if (S_OK == hr)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_103 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_103 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
// Delete the docfile on disk
if((S_OK == hr) && (NULL != pFileName))
{
if(FALSE == DeleteFile(pFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete temp string
if(NULL != pFileName)
{
delete pFileName;
pFileName = NULL;
}
if(NULL != poszFileName)
{
delete poszFileName;
poszFileName = NULL;
}
// Delete data gen object
if(NULL != pdgu)
{
delete pdgu;
pdgu = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_103 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_104
//
// Synopsis: Regression test to create, instantiate and enumerate a root
// docfile hierarchy and count objects.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct mode.
//
// New Test Notes:
// 1. Old File: DFVERIFY.CXX
// 2. Old name of test : MiscDfVerify
// New Name of test : DFTEST_104
// 3. To run the test, do the following at command prompt.
// a. stgbase /seed:2 /dfdepth:0-5 /dfstg:0-5 /dfstm:0-10 /t:DFTEST-104
// /dfRootMode:dirReadWriteShEx
//
// BUGNOTE: Conversion: DFTEST_104
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_104(int argc, char *argv[])
{
HRESULT hr = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
LPSTORAGE pStgRoot = NULL;
ULONG cStg = 0;
ULONG cStm = 0;
ULONG cMemStg = 0;
ULONG cMemStm = 0;
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_104"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_104 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Regression for RootDF creation/instantiation/enumeration.")));
// 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)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_104, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Enumerate the DocFile in memory and get the number of VirtualCtrNodes
// and VirtualStmNodes. Later on we could compare these statistics with
// real IStorages / IStreams enumerated from the disk docfile.
if (S_OK == hr)
{
hr = EnumerateInMemoryDocFile(pVirtualDFRoot, &cMemStg, &cMemStm);
DH_HRCHECK(hr, TEXT("EnumerateInMemoryDocFile"));
}
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));
}
// Clsoe all the substorages/streams
if(S_OK == hr)
{
hr = ParseVirtualDFAndCloseOpenStgsStms(
pVirtualDFRoot,
NODE_EXC_TOPSTG);
DH_HRCHECK(hr, TEXT("ParseVirtualDFAndCloseOpenStgsStms")) ;
}
// Call Release on root docfile
if (S_OK == hr)
{
hr = pVirtualDFRoot->Close();
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close"));
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Close completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Close unsuccessful, hr = 0x%lx."),
hr));
}
// Instantiate the RootDocFile again
if (S_OK == hr)
{
hr = pVirtualDFRoot->Open(
NULL,
STGM_READWRITE |
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));
}
if (S_OK == hr)
{
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
if(NULL == pStgRoot)
{
DH_LOG((LOG_INFO,
TEXT("pVirtualDFRoot->GetIStoragePointer failed to return IStorage")) );
hr = E_FAIL;
}
}
// Enumerate the Docfile on the disk
if (S_OK == hr)
{
hr = EnumerateDiskDocFile(pStgRoot, VERIFY_SHORT, &cStg, &cStm);
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile"));
}
// Check the disk docfile enumeration with in memory docfile enumeration.
if (S_OK == hr)
{
if((cMemStg == cStg) && (cMemStm == cStm))
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile correctly written & enumerated.")) );
}
else
{
hr = S_FALSE;
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile not correctly written or enumerated.")) );
}
}
// Call Release on 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)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_104 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_104 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
CleanupTestDocfile (&pVirtualDFRoot,
&pTestVirtualDF,
&pTestChanceDF,
S_OK == hr);
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_104 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_105
//
// Synopsis: Regression test to create and instantiate a root docfile with a
// random name, a child IStorage within the root, and an additional
// child storage within the first child IStorage. The first child is
// released before its child is released, verify no error. The first
// child is reinstantiated. The root IStorage is now released before
// the child IStorage, verify no error.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct, transacted, and transacted deny write
// modes
//
// New Test Notes:
// 1. Old File: IIREL.CXX
// 2. Old name of test : IllegitInstEnumRelease Test
// New Name of test : DFTEST_105
// 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:DFTEST-105
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-105
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-105
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
//
// BUGNOTE: Conversion: DFTEST-105
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_105(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 *pvcnRootChildStorage = NULL;
LPTSTR pRootChildStgName = NULL;
VirtualCtrNode *pvcnChildChildStorage = NULL;
LPTSTR pChildChildStgName = NULL;
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_105"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_105 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Create Root DF with Child IStg which has its Child IStg.")));
DH_TRACE((DH_LVL_TRACE1,
TEXT("Release first child IStg w/o releasing its child IStg.")));
DH_TRACE((DH_LVL_TRACE1,
TEXT("Reinstantiate 1st child IStg. Release root w/o releasing")));
DH_TRACE((DH_LVL_TRACE1, TEXT("this IStg. Verify no errors.")));
// 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)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_105, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Get DG_STRING object pointer
if (S_OK == hr)
{
pdgu = pTestVirtualDF->GetDataGenUnicode();
if(NULL == pdgu)
{
DH_LOG((LOG_INFO,
TEXT("pTestVirtualDF->GetDataGenUnicode failed")) );
hr = E_FAIL;
}
}
// Create a child IStorage in the root.
// Generate a random name for child IStorage
if(S_OK == hr)
{
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootChildStgName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
// Adds a new storage to the root storage.
if(S_OK == hr)
{
hr = AddStorage(
pTestVirtualDF,
pVirtualDFRoot,
pRootChildStgName,
pTestChanceDF->GetStgMode()|
STGM_CREATE |
STGM_FAILIFTHERE,
&pvcnRootChildStorage);
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));
}
// Create a child IStorage inside the child IStorage.
// Generate a random name for the new child IStorage
if(S_OK == hr)
{
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH, &pChildChildStgName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
// Adds a new storage to the root storage.
if(S_OK == hr)
{
hr = AddStorage(
pTestVirtualDF,
pvcnRootChildStorage,
pChildChildStgName,
pTestChanceDF->GetStgMode()|
STGM_CREATE |
STGM_FAILIFTHERE,
&pvcnChildChildStorage);
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));
}
// Commit the storages
// BUGBUG: Use Random commit modes...
if (S_OK == hr)
{
hr = pvcnChildChildStorage->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));
}
// BUGBUG: Use Random commit modes...
if (S_OK == hr)
{
hr = pvcnRootChildStorage->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));
}
// BUGBUG: Use Random commit modes...
if (S_OK == hr)
{
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Commit completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualCtrNode::Commit unsuccessful, hr = 0x%lx."),
hr));
}
// Release child IStorage before its child is released, should
// cause no error
if (S_OK == hr)
{
hr = pvcnRootChildStorage->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's child IStorage
if (S_OK == hr)
{
hr = pvcnChildChildStorage->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));
}
// Reinstantiate the Root's child IStorage again
if (S_OK == hr)
{
hr = pvcnRootChildStorage->Open(
NULL,
pTestChanceDF->GetStgMode(),
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 Release on root docfile before calling Release on its child.
// Verify no error.
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 Root's child IStorage now.
if (S_OK == hr)
{
hr = pvcnRootChildStorage->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 DFTEST_105 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_105 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
CleanupTestDocfile (&pVirtualDFRoot,
&pTestVirtualDF,
&pTestChanceDF,
S_OK == hr);
// Delete strings
if(NULL != pRootChildStgName)
{
delete pRootChildStgName;
pRootChildStgName = NULL;
}
if(NULL != pChildChildStgName)
{
delete pChildChildStgName;
pChildChildStgName = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_105 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_106
//
// Synopsis: Attempts several illegitimate operations during creation of
// root docfile.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 3-June-1996 NarindK Created.
//
// Notes: This test runs in direct, transacted, and transacted deny write
// modes
//
// New Test Notes:
// 1. Old File: IRCREATE.CXX
// 2. Old name of test : IllegitRootCreate Test
// New Name of test : DFTEST_106
// 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:DFTEST-106
// /dfRootMode:dirReadWriteShEx /dfStgMode:dirReadWriteShEx
// /dfname:DFTEST.106
// b. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-106
// /dfRootMode:xactReadWriteShEx /dfStgMode:xactReadWriteShEx
// /dfname:DFTEST.106
// c. stgbase /seed:2 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:DFTEST-106
// /dfRootMode:xactReadWriteShDenyW /dfStgMode:xactReadWriteShEx
// /dfname:DFTEST.106
//
// BUGNOTE: Conversion: DFTEST-106 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_106(int argc, char *argv[])
{
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
LPTSTR pRootDocFileName = NULL;
DWORD dwRootMode = NULL;
LPSTORAGE pIStorage = NULL;
LPSTORAGE pIStorageOpen = NULL;
LPOLESTR pOleStrTemp = NULL;
FILE *hFile = NULL;
ULONG ulRef = 0;
BOOL fPass = TRUE;
int iErr = 0;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(&hr, DH_LVL_DFLIB, _TEXT("DFTEST_106"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_106 started.")) );
DH_TRACE((DH_LVL_TRACE1,
TEXT("Attempt illegitimate operations in creation of root docfile.")));
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestChanceDF->CreateFromParams(argc, argv);
DH_HRCHECK(hr, TEXT("pTestChanceDF->CreateFromParams")) ;
}
// GetRootDocFile mode
if (S_OK == hr)
{
dwRootMode = pTestChanceDF->GetRootMode();
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Run Mode for DFTEST_106, Access mode: %lx"),
pTestChanceDF->GetRootMode()));
}
// Get RootDocFile name
if (S_OK == hr)
{
if(NULL != pTestChanceDF->GetDocFileName())
{
pRootDocFileName =
new TCHAR[_tcslen(pTestChanceDF->GetDocFileName())+1];
if (pRootDocFileName == NULL)
{
hr = E_OUTOFMEMORY;
}
else
{
_tcscpy(pRootDocFileName, pTestChanceDF->GetDocFileName());
}
}
else
{
DH_ASSERT(!"No DocFile name passed from cmd line!") ;
}
DH_HRCHECK(hr, TEXT("pTestChanceDF->GetDocFileName()")) ;
}
// Make a directory with the same name DFTEST.106 that we would use to
// create the directory. Check that call to StgCreateDocFile succeeds
if (S_OK == hr)
{
iErr = _tmkdir(pRootDocFileName);
if (0 != iErr)
{
// if file already exists, try deleting it and try mkdir again
if (ENOENT != errno)
{
iErr = DeleteFile (pRootDocFileName);
if (FALSE == iErr)
{
DH_TRACE ((DH_LVL_ERROR,
TEXT("DeleteFile(%s) Failed. Error:%#lx"),
pRootDocFileName,
GetLastError ()));
}
iErr = _tmkdir(pRootDocFileName);
}
}
if (0 != iErr)
{
hr = (EACCES == errno) ? ERROR_FILE_EXISTS : ERROR_FILE_NOT_FOUND;
DH_HRCHECK (hr, TEXT("mkdir"));
}
}
// Create the VirtualDocFile tree from the ChanceDocFile tree created in
// the previous step. The VirtualDocFile tree consists of VirtualCtrNodes
// and VirtualStmNodes.
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
// This call to generate VirtualDF will call StgCreateDocFile API. This
// call is expected to fail since dir of same name exists.
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(pTestChanceDF, &pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
if (STG_E_ACCESSDENIED != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Should fail when dir of same name exists,hr = 0x%lx "),hr));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Failed as exp when dir of same name exists,hr = 0x%lx"), hr));
hr = S_OK;
}
}
// Case 2: Try STGM_CONVERT as mode now. This is also expected to fail, as
// a dir of same name pre exists.
if(S_OK == hr)
{
// Convert RootDocFile name to OLECHAR
hr = TStringToOleString(pRootDocFileName, &pOleStrTemp);
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
}
// Try creating with STGM_CONVERT mode.
// ----------- flatfile change ---------------
if(!StorageIsFlat())
{
// ----------- flatfile change ---------------
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CONVERT | dwRootMode,
0,
&pIStorage);
if (STG_E_ACCESSDENIED != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass(STGM_CONVERT) with existing same name dir,hr=0x%lx"),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp:Fail(STGM_CONVERT)with existing same name dir,hr=0x%lx"),
hr));
hr = S_OK;
}
}
// ----------- flatfile change ---------------
}
// ----------- flatfile change ---------------
// Remove the direcory DFTEST.106
if (S_OK == hr)
{
iErr = _trmdir(pRootDocFileName);
if (0 != iErr)
{
hr = (ENOENT == errno) ? ERROR_FILE_NOT_FOUND : ERROR_FILE_EXISTS;
DH_HRCHECK (hr, TEXT("rmdir"));
}
}
// Case 3: Create DocFile when file exists and is being accessed in deny
// write mode.
if (S_OK == hr)
{
hFile = _tfsopen(pRootDocFileName, TEXT("w+"), _SH_DENYWR);
DH_ASSERT(NULL != hFile);
}
// Try STGM_CREATE mode to create DocFile. This call is expected to fail
// as file exists and is being accessed in deny write mode.
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | dwRootMode,
0,
&pIStorage);
if (STG_E_SHAREVIOLATION != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass,same name file access in deny write mode, hr=0x%lx"),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp;Fail,same name file access in deny write mode, hr=0x%lx"),
hr));
hr = S_OK;
}
}
// ----------- flatfile change ---------------
if(!StorageIsFlat())
{
// ----------- flatfile change ---------------
// Try STGM_CONVERT mode to create DocFile. This call is expected to fail
// as file exists and is being accessed in deny write mode.
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CONVERT | dwRootMode,
0,
&pIStorage);
if (STG_E_SHAREVIOLATION != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass(STGM_CONVERT),same name file access in deny write mode")
TEXT(", hr = 0x%lx "),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp:Fail(STGM_CONVERT), same name file access in deny write \
mode, hr = 0x%lx "),
hr));
hr = S_OK;
}
}
// ----------- flatfile change ---------------
}
// ----------- flatfile change ---------------
// Close handle
if(NULL != hFile)
{
fclose(hFile);
}
// Change the mode to READ_ONLY and then try.
if(S_OK == hr)
{
iErr = _tchmod(pRootDocFileName, _S_IREAD);
DH_ASSERT (0 == iErr);
}
// Try STGM_CREATE mode to create DocFile. This call is expected to fail
// as file exists and is read only.
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | dwRootMode,
0,
&pIStorage);
if (STG_E_ACCESSDENIED != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass,same name file exists and is read only,hr=0x%lx "),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp:Fail,same name file exists and is read only,hr = 0x%lx"),
hr));
hr = S_OK;
}
}
// Try STGM_CONVERT mode to create DocFile. This call is expected to fail
// as file exists and is read only.
// ----------- flatfile change ---------------
if(!StorageIsFlat())
{
// ----------- flatfile change ---------------
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CONVERT | dwRootMode,
0,
&pIStorage);
if (STG_E_ACCESSDENIED != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass(STGM_CONVERT), same name file exists RO,hr=0x%lx"),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp:Fail(STGM_CONVERT),same name file exists RO,hr=0x%lx"),
hr));
hr = S_OK;
}
}
// ----------- flatfile change ---------------
}
// ----------- flatfile change ---------------
// Change mode to readwrite
iErr = _tchmod(pRootDocFileName, _S_IREAD|_S_IWRITE);
DH_ASSERT (0 == iErr);
// Try to instantiate the pRootDocFileName which isn't a storage object
if (S_OK == hr)
{
hr = StgOpenStorage(
pOleStrTemp,
NULL,
dwRootMode,
NULL,
0,
&pIStorageOpen);
// ----------- flatfile change ---------------
if(!StorageIsFlat())
{
// ----------- flatfile change ---------------
if(STG_E_FILEALREADYEXISTS == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile instantiated failed as exp with non stg obj hr=0x%lx"),
hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile instantiation passed unexp with non stg obj,hr=0x%lx"),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorageOpen->Release ();
pIStorageOpen = NULL;
}
fPass = FALSE;
}
}
else // ----------- flatfile change ---------------
{
if(S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp:Flatfile instantiation passed with non stg obj,hr=0x%lx"),
hr));
if (NULL != pIStorageOpen)
{
pIStorageOpen->Release ();
pIStorageOpen = NULL;
}
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("UnExp:Flatfile instantiation fail with nonstg obj,hr=0x%lx"),
hr));
fPass = FALSE;
hr = S_OK; // Set hr to S_OK for further conditions test
}
// ----------- flatfile change ---------------
}
// ----------- flatfile change ---------------
}
// Remove the file
iErr = _tremove(pRootDocFileName);
DH_ASSERT (0 == iErr);
// Call StgCreateDocFile with non zero data in dwReserved parameter. This
// call is expected to fail
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | dwRootMode,
999,
&pIStorage);
if (STG_E_INVALIDPARAMETER != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Err:Pass with nonzero dwReserverd para, hr = 0x%lx "),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Exp: Fail with nonzero dwReserved parameter, hr=0x%lx "),
hr));
hr = S_OK;
}
}
// Call StgCreateDocFile with NULL 4th parameter. This call is expected
// to fail.
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | dwRootMode,
0,
NULL);
if (STG_E_INVALIDPOINTER != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Should fail with NULL 4th parameter, hr = 0x%lx "), hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Failed as exp with NULL 4th parameter, hr = 0x%lx "),
hr));
hr = S_OK;
}
}
// Call StgCreateDocFile with mode STGM_CREATE|STGM_CONVERT. This call
// is expected to fail.
// ----------- flatfile change ---------------
if(!StorageIsFlat())
{
// ----------- flatfile change ---------------
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | STGM_CONVERT,
0,
&pIStorage);
if (STG_E_INVALIDFLAG != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Should fail with invalid mode, hr = 0x%lx "), hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorage->Release ();
pIStorage = 0;
}
fPass = FALSE;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Failed as expected with invalid mode., hr = 0x%lx "), hr));
hr = S_OK;
}
}
// ----------- flatfile change ---------------
}
// ----------- flatfile change ---------------
// Call StgCreateDocFile with all valid parameters. This call is
// expected to pass.
if (S_OK == hr)
{
pIStorage = NULL;
hr = StgCreateDocfile(
pOleStrTemp,
STGM_CREATE | dwRootMode,
0,
&pIStorage);
DH_HRCHECK(hr, TEXT("StgCreateDocFile")) ;
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile created successfully as expected hr = 0x%lx "),hr));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile creation failed unexpectedly, hr = 0x%lx "),hr));
fPass = FALSE;
}
}
// Instantiate DocFile again
if (S_OK == hr)
{
hr = StgOpenStorage(
pOleStrTemp,
NULL,
dwRootMode,
NULL,
0,
&pIStorageOpen);
if(STG_E_LOCKVIOLATION == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile reinstantiated failed as expected hr = 0x%lx "),hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile reinstantiation didn't fail unexp, hr = 0x%lx "),
hr));
// if it accidentally opened, close it
if (S_OK == hr)
{
pIStorageOpen->Release ();
pIStorageOpen = 0;
}
fPass = FALSE;
}
}
// If everything goes okay, report test as passed, else failure
if ((S_OK == hr) && (TRUE == fPass))
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_106 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_106 failed, hr = 0x%lx."),
hr) );
// test failed. make it look like it failed.
hr = FirstError (hr, E_FAIL);
}
// Release storage pointer(s)
if (NULL != pIStorage)
{
ulRef = pIStorage->Release();
DH_ASSERT(0 == ulRef);
}
if (NULL != pIStorageOpen)
{
ulRef = pIStorageOpen->Release();
DH_ASSERT(0 == ulRef);
}
// Delete temp string
if(NULL != pOleStrTemp)
{
delete pOleStrTemp;
pOleStrTemp = NULL;
}
// Delete the docfile on disk
if((S_OK == hr) && (NULL != pRootDocFileName))
{
if(FALSE == DeleteFile(pRootDocFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree
if(NULL != pTestVirtualDF)
{
if(NULL != pVirtualDFRoot)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
}
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete temp string
if(NULL != pRootDocFileName)
{
delete pRootDocFileName;
pRootDocFileName = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_106 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_107
//
// Synopsis: A random root DF is created with STGM_SIMPLE flag and tests done
// on it. STGM_SIMPLE mode can only be specified with STGM_CREATE,
// STGM_READWRITE, STGM_SHARE_EXCLUSIVE flags. There is no support
// for substorages. Each stream is atleast 4096 bytes in length, and
// access to streams follow a linear pattern, i.e. once a stream is
// released, it can't be opened or read/written again. The following
// IStorage methods: QueryInterface, AddRef, Release, CreateStream,
// SetClass, Commit are supported. SetElementTimes is supported with
// NULL name, allowing applications to set time on root storage in
// simple mode. Supported IStream methods are QueryInterface, AddRef,
// Release, SetSize, Read, Write, Seek. All the other methods return
// STG_E_INVALIDFUNCTION.
// The test verifies the above restrictions on DocFile if STGM_
// SIMPLE is specified in creation of a docfile.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 9-Aug-1996 NarindK Created.
// 4-Nov-1996 BogdanT Mac porting
//
// Notes: This test runs in direct mode
//
// THIS TEST HAS A MEMORY LEAK IN OLE CODE: BUG 52975
//
// New Test Notes:
// 1. Old File: STDDOC.CXX
// 2. Old name of test : TestStdDocFile Test
// New Name of test : DFTEST_107
// 3. To run the test, do the following at command prompt.
// a. stgbase /seed:0 /t:DFTEST-107
//
// BUGNOTE: Conversion: DFTEST-107
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_107(ULONG ulSeed)
{
#ifdef _MAC // Simple mode not ported yet; check with the developers
// and remove this when ready
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!Simple mode DFTEST_107 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;
VirtualStmNode *pvsnRootNewChildStream = NULL;
VirtualStmNode *pvsnRootMoreStream = NULL;
LPTSTR pRootDocFileName = NULL;
LPTSTR pRootNewChildStmName = NULL;
LPTSTR pRootMoreStmName = NULL;
DG_STRING *pdgu = NULL;
DG_INTEGER *pdgi = NULL;
USHORT usErr = 0;
LPSTORAGE pStgRoot = NULL;
DWORD dwChildMode = STGM_READWRITE |
STGM_SHARE_EXCLUSIVE;
LPSTORAGE pStgChild = NULL;
LPSTREAM pStmChild = NULL;
LPSTREAM pStmChildTest = NULL;
OLECHAR ocName[] = {'f', 'o', 'o'};
LPENUMSTATSTG penumWalk = NULL;
ULONG cb = 0;
ULONG culWritten = 0;
ULONG culRead = 0;
ULONG cRandomMinSize = 256;
ULONG cRandomMaxSize = 2048;
ULONG cNum = 0;
ULONG cRandomMinNumStms = 3;
ULONG cRandomMaxNumStms = 6;
LPTSTR ptcsBuffer = NULL;
LPTSTR ptcsSimpReadBuffer = NULL;
LPTSTR ptcsReadBuffer = NULL;
BOOL fRet = FALSE;
FILETIME cNewFileTime = {dwDefLowDateTime,
dwDefHighDateTime};
BOOL fPass = TRUE;
ULONG ulSizeOfStream = 0;
ULONG cMemStg = 0;
ULONG cMemStm = 0;
ULONG cActStg = 0;
ULONG cActStm = 0;
DWCRCSTM dwMemCRC;
DWCRCSTM dwActCRC;
SYSTEMTIME cCurrentSystemTime;
ULARGE_INTEGER uliTest;
STATSTG statStg;
FILETIME cFileTime;
CDFD cdfd;
LARGE_INTEGER liStreamPos;
ULARGE_INTEGER uli;
// Not for 2phase. Bail.
// Test needs STGM_CREATE bit which invalidates 2 phase test
if (DoingDistrib () || DoingConversion ())
{
return S_OK;
}
dwMemCRC.dwCRCSum = dwActCRC.dwCRCSum = 0;
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_107"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_107 started.")) );
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Root created /w STGM_SIMPLE, chk IStorage/IStream restrict")));
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();
}
}
if (S_OK == hr)
{
// Generate random name for root
hr = GenerateRandomName(
pdgu,
MINLENGTH,
MAXLENGTH,
&pRootDocFileName);
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 = STGM_CREATE |
STGM_DIRECT |
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE |
STGM_SIMPLE;
hr = CreateTestDocfile (&cdfd,
pRootDocFileName,
&pVirtualDFRoot,
&pTestVirtualDF,
&pTestChanceDF);
DH_HRCHECK (hr, TEXT("CreateTestDocfile"));
}
if(S_OK == hr)
{
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
if(NULL == pStgRoot)
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("VirtualCtrNode::GetIStoragePointer() failed to return IStorage"),
hr));
hr = E_FAIL;
}
}
// These interfaces must fail for IStorage interface if the root docfile
// is opened with STGM_SIMPLE flag.
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::CreateStorage"),
CreateStorage(ocName, dwChildMode|STGM_CREATE, 0, 0, &pStgChild),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::OpenStream"),
OpenStream(ocName, NULL, dwChildMode, 0, &pStmChild),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::OpenStorage"),
OpenStorage(ocName, NULL, dwChildMode, NULL, 0, &pStgChild),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::MoveElementTo"),
MoveElementTo(ocName, pStgChild, ocName, STGMOVE_MOVE),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::EnumElements"),
EnumElements(0, NULL, 0, &penumWalk),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::DestroyElement"),
DestroyElement(ocName),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::RenameElement"),
RenameElement(ocName, ocName),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::SetStateBits"),
SetStateBits(0, 0),
hr);
}
#ifndef WINNT
// NT5 spec change. This is now supported on NT5.
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::Stat"),
Stat(&statStg,STATFLAG_NONAME),
hr);
}
#endif
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::Revert"),
Revert(),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::SetElementTimes with Non-NULL name"),
SetElementTimes(ocName, &cFileTime, &cFileTime, &cFileTime),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStgRoot,
TEXT("IStorage::CopyTo"),
CopyTo(NULL, NULL, NULL, pStgChild),
hr);
}
// Set Element time with NULL name which should pass for STGM_SIMPLE mode.
if(S_OK == hr)
{
GetSystemTime(&cCurrentSystemTime);
fRet = SystemTimeToFileTime(&cCurrentSystemTime, &cNewFileTime);
DH_ASSERT(TRUE == fRet);
DH_ASSERT(dwDefLowDateTime != cNewFileTime.dwLowDateTime);
DH_ASSERT(dwDefHighDateTime != cNewFileTime.dwHighDateTime);
hr = pStgRoot->SetElementTimes(
NULL,
&cNewFileTime,
&cNewFileTime,
&cNewFileTime);
DH_HRCHECK(hr, TEXT("IStorage::SetElementTimes with NULL name")) ;
}
// Now create a stream in it with size less than 4096 bytes. If fewer
// than 4096 bytes are written into the stream, by the time stream is
// released, it would have extended to 4096 bytes.
if(S_OK == hr)
{
// Generate random name for stream
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootNewChildStmName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
if(S_OK == hr)
{
// Create a new DataGen object to create random integers.
pdgi = new(NullOnFail) DG_INTEGER(ulSeed);
if (NULL == pdgi)
{
hr = E_OUTOFMEMORY;
}
DH_HRCHECK(hr, TEXT("new")) ;
}
if (S_OK == hr)
{
// Generate random size for stream.
usErr = pdgi->Generate(&cb, cRandomMinSize, cRandomMaxSize);
if (DG_RC_SUCCESS != usErr)
{
hr = E_FAIL;
}
DH_HRCHECK(hr, TEXT("pdgi->Generate")) ;
}
if(S_OK == hr)
{
hr = AddStream(
pTestVirtualDF,
pVirtualDFRoot,
pRootNewChildStmName,
cb,
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE,
&pvsnRootNewChildStream);
DH_HRCHECK(hr, TEXT("AddStream")) ;
}
// With above stream size is set to less than 4096. But as per STGM_SIMPLE,
// the size would extend to 4096 by them time stream is released.
if(S_OK == hr)
{
hr = GenerateRandomString(pdgu, cb, cb, &ptcsBuffer);
DH_HRCHECK(hr, TEXT("GenerateRandomString")) ;
}
if (S_OK == hr)
{
hr = pvsnRootNewChildStream->Write(
ptcsBuffer,
cb,
&culWritten);
DH_HRCHECK(hr, TEXT("VSN::Write in STGM_SIMPLE")) ;
}
// Calculate the CRC for stream data
if(S_OK == hr)
{
hr = CalculateInMemoryCRCForStm(
pvsnRootNewChildStream,
ptcsBuffer,
cb,
&dwMemCRC);
DH_HRCHECK(hr, TEXT("CalculateInMemoryCRCForStm")) ;
}
// Check the read in STGM_SIMPLE mode.
// Allocate a buffer of required size
if (S_OK == hr)
{
ptcsSimpReadBuffer = new TCHAR [cb];
if (NULL == ptcsSimpReadBuffer)
{
hr = E_OUTOFMEMORY;
}
DH_HRCHECK(hr, TEXT("new")) ;
}
if(S_OK == hr)
{
// First seek to beginning of stream in STGM_SIMPLE mode.
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
hr = pvsnRootNewChildStream->Seek(liStreamPos, STREAM_SEEK_SET, NULL);
DH_HRCHECK(hr, TEXT("VirtualStmNode::Seek in STGM_SIMPLE")) ;
}
if (S_OK == hr)
{
memset(ptcsSimpReadBuffer, '\0', cb*sizeof(TCHAR));
hr = pvsnRootNewChildStream->Read(
ptcsSimpReadBuffer,
cb,
&culRead);
DH_ASSERT(culRead == cb);
DH_HRCHECK(hr, TEXT("VirtualStmNode::Read in STGM_SIMPLE")) ;
}
// Test unsupported interfaces for IStream interface.
if(S_OK == hr)
{
pStmChild = pvsnRootNewChildStream->GetIStreamPointer();
if(NULL == pStmChild)
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("VirtualStmNode->GetIStreamPointer() failed to return IStream"),
hr));
hr = E_FAIL;
}
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::CopyTo"),
CopyTo(pStmChildTest, uliTest, NULL, NULL),
hr);
}
// Don't test IStream::Commit, since that returns STG_E_NOTIMPLEMENTED,
// rather than STG_E_INVALIDFUNCTION
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::Revert"),
Revert(),
hr);
}
#ifndef WINNT
// NT5 spec change. This is now supported on NT5.
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::Stat"),
Stat(&statStg, STATFLAG_NONAME),
hr);
}
#endif
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::Clone"),
Clone(&pStmChildTest),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::LockRegion"),
LockRegion(uliTest, uliTest, 0),
hr);
}
if(S_OK == hr)
{
TestUnsupportedInterface(
pStmChild,
TEXT("IStream::UnlockRegion"),
UnlockRegion(uliTest, uliTest, 0),
hr);
}
// Close child stream.
if (S_OK == hr)
{
hr = pvsnRootNewChildStream->Close();
DH_HRCHECK(hr, TEXT("VirtualStmNode::Close")) ;
}
// Check the linear pattern of stream. Make sure that the stream can't be
// opened or be read , written again now.
if (S_OK == hr)
{
hr = pvsnRootNewChildStream->Open(NULL, dwChildMode, 0);
hr = DH_HRERRORCHECK (hr, STG_E_INVALIDFUNCTION, TEXT("VirtualStmNode::Open"));
}
// Create a few more streams in root storage. This being done to test
// additonal OLE code which occurs for more number of streams
if (S_OK == hr)
{
//calulate random number of streams to be created
usErr = pdgi->Generate(&cNum, cRandomMinNumStms, cRandomMaxNumStms);
if (DG_RC_SUCCESS != usErr)
{
hr = E_FAIL;
}
DH_HRCHECK (hr, TEXT("pdgi::Generate"));
}
while((cNum > 0) && (S_OK == hr))
{
cNum--;
if(S_OK == hr)
{
// Generate random name for stream
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootMoreStmName);
DH_HRCHECK (hr, TEXT("GenerateRandomName"));
}
if(S_OK == hr)
{
hr = AddStream(
pTestVirtualDF,
pVirtualDFRoot,
pRootMoreStmName,
0,
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE,
&pvsnRootMoreStream);
DH_HRCHECK (hr, TEXT("AddStream"));
}
if (S_OK == hr)
{
hr = pvsnRootMoreStream->Close();
DH_HRCHECK (hr, TEXT("IStream::Close"));
}
if(NULL != pRootMoreStmName)
{
delete pRootMoreStmName;
pRootMoreStmName = NULL;
}
}
if(S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualStmNode::AddStream (s) completed successfully.")));
}
else
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("VirtualStmNode::AddStream (s) not successful, hr=0x%lx."),
hr));
}
// Commit Root Docfile.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Commit")) ;
}
// Enumerate In Memory DocFile to count no of stgs/stms for verification
// later
if (S_OK == hr)
{
hr = EnumerateInMemoryDocFile(pVirtualDFRoot, &cMemStg, &cMemStm);
DH_HRCHECK(hr, TEXT("EnumerateInMemoryDocFile"));
}
// Close Root Docfile.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Close();
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
}
// Open the root docfile without STGM_SIMPLE mode, i.e open in STGM_DIRECT|
// STGM_READWRITE | STGM_SHARE_EXCLUSIVE mode.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Open(
NULL,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
NULL,
0);
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open")) ;
}
// Open the stream and Verify the CRC of the stream 1 that was calculated
// before.
if (S_OK == hr)
{
hr = pvsnRootNewChildStream->Open(NULL, dwChildMode, 0);
DH_HRCHECK(hr, TEXT("VirtualStmNode::Open")) ;
}
// Calculate CRC on stream for the number of bytes that were written during
// the time the root was opened in STGM_SIMPLE mode. Since the stream size
// has got extended, the CRC on total stream would be different, since the
// fill bytes would be present in extended size. Garbage tests verify to
// see that fill bytes are all zero's not checked here.
// Allocate a buffer of required size
if (S_OK == hr)
{
ptcsReadBuffer = new TCHAR [cb];
if (NULL == ptcsReadBuffer)
{
hr = E_OUTOFMEMORY;
}
DH_HRCHECK(hr, TEXT("new")) ;
}
if (S_OK == hr)
{
memset(ptcsReadBuffer, '\0', cb*sizeof(TCHAR));
culRead = 0;
hr = pvsnRootNewChildStream->Read(
ptcsReadBuffer,
cb,
&culRead);
DH_ASSERT(culRead == cb);
DH_HRCHECK(hr, TEXT("VirtualStmNode::Read")) ;
}
if(S_OK == hr)
{
hr = CalculateInMemoryCRCForStm(
pvsnRootNewChildStream,
ptcsReadBuffer,
cb,
&dwActCRC);
DH_HRCHECK(hr, TEXT("CalculateInMmeoryCRCForStm")) ;
}
// Compare CRC's
if(S_OK == hr)
{
if(dwMemCRC.dwCRCSum == dwActCRC.dwCRCSum)
{
DH_TRACE((DH_LVL_TRACE1, TEXT("CRC's of stream match as exp.")));
}
else
{
DH_TRACE((DH_LVL_ERROR, TEXT("CRC's of stream don't match as exp.")));
fPass = FALSE;
}
}
// Verify the size of stream is 4096 bytes.
// Now seek to the current stream to end of stream
if(S_OK == hr)
{
memset(&liStreamPos, 0, sizeof(LARGE_INTEGER));
hr = pvsnRootNewChildStream->Seek(liStreamPos, STREAM_SEEK_END, &uli);
DH_HRCHECK(hr, TEXT("VirtualStmNode::Seek")) ;
ulSizeOfStream = ULIGetLow(uli);
}
if(S_OK == hr)
{
if(4096 == ulSizeOfStream)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Size of stream extended to 4096 bytes as exp")));
}
else
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("Size of stream not extended to 4096 bytes as exp")));
fPass = FALSE;
}
}
// Close the stream
if (S_OK == hr)
{
hr = pvsnRootNewChildStream->Close();
DH_HRCHECK(hr, TEXT("VirtualStmNode::Close")) ;
}
// Check times set from SetElementTimes. BUGBUG: On FAT, the timestamp
// resolution is not fine enough to make dwLowDateTimeStamp meaningful,
// so verify with dwHighDataTimeStamp only.
// Stat on Root Storage
if(S_OK == hr)
{
hr = pVirtualDFRoot->Stat(&statStg, STATFLAG_NONAME);
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Stat")) ;
}
if(S_OK == hr)
{
if(cNewFileTime.dwHighDateTime == statStg.mtime.dwHighDateTime)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("SetElementTime and STATSTG.mtime match as exp")));
}
else
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("SetElementTime and STATSTG.mtime don't match as exp")));
fPass = FALSE;
}
}
// Enumerate Actual DocFile to count no of stgs/stms for verification
// with in memory enumerated stgs and stms
if (S_OK == hr)
{
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
DH_ASSERT(NULL != pStgRoot);
if (NULL == pStgRoot)
{
DH_TRACE((
DH_LVL_ERROR,
TEXT("VirtualCtrNode::GetIStoragePointer() failed to return IStorage"),
hr));
hr = E_FAIL;
}
}
if (S_OK == hr)
{
hr = EnumerateDiskDocFile(pStgRoot, VERIFY_SHORT, &cActStg, &cActStm);
DH_HRCHECK(hr, TEXT("EnumerateDiskDocFile"));
}
// Verify structure of DocFile
if(S_OK == hr)
{
if((cActStg == cMemStg) && (cActStm == cMemStm))
{
DH_TRACE((DH_LVL_TRACE1, TEXT("DocFile enumeration passed as exp")));
}
else
{
DH_TRACE((DH_LVL_ERROR, TEXT("DocFile enumeration failed unexp")));
fPass = FALSE;
}
}
// Close the root.
if (S_OK == hr)
{
hr = pVirtualDFRoot->Close();
DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close")) ;
}
// if everything goes well, log test as passed else failed.
if ((S_OK == hr) && (TRUE == fPass))
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_107 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_107 failed, hr=0x%lx, fPass=%d."),
hr,
fPass));
// test failed. make it look like it failed.
hr = FirstError (hr, E_FAIL);
}
// Cleanup
CleanupTestDocfile (&pVirtualDFRoot, &pTestVirtualDF, &pTestChanceDF, S_OK==hr);
// Delete strings
if(NULL != pRootDocFileName)
{
delete pRootDocFileName;
pRootDocFileName = NULL;
}
if(NULL != pRootNewChildStmName)
{
delete pRootNewChildStmName;
pRootNewChildStmName = NULL;
}
if(NULL != ptcsBuffer)
{
delete [] ptcsBuffer;
ptcsBuffer = NULL;
}
if(NULL != ptcsSimpReadBuffer)
{
delete [] ptcsSimpReadBuffer;
ptcsSimpReadBuffer = NULL;
}
if(NULL != ptcsReadBuffer)
{
delete [] ptcsReadBuffer;
ptcsReadBuffer = NULL;
}
// Delete data generators
if(NULL != pdgi)
{
delete pdgi;
pdgi = NULL;
}
if(NULL != pdgu)
{
delete pdgu;
pdgu = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_107 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
#endif //_MAC
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_108
//
// Synopsis: A random root DF is created with STGM_SIMPLE flag. Illegal
// operations are done on that DocFile permitted methods.
//
// Arguments:[argc]
// [argv]
//
// Returns: HRESULT
//
// History: 12-Aug-1996 NarindK Created.
// 04-Nov-1996 BogdanT Mac porting
//
// Notes: This test runs in direct mode
//
// THIS TEST GPF's IN OLE CODE: BUG 53142, BUG 53615 - fixed 6/97
//
// New Test Notes:
// 1. Old File: -none-
// 2. Old name of test : -none-
// New Name of test : DFTEST_108
// 3. To run the test, do the following at command prompt.
// a. stgbase /seed:0 /t:DFTEST-108
//
// BUGNOTE: Conversion: DFTEST-108 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_108(ULONG ulSeed)
{
#ifdef _MAC // Simple mode not ported yet; check with the developers
// and remove this when ready
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!Simple mode DFTEST_108 crashes.")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!To be investigated")) );
return E_NOTIMPL;
#elif defined (_CHICAGO_) || (_WIN32_WINNT < 0x500)
DH_TRACE ((DH_LVL_ALWAYS,
TEXT("DCOM has not picked up the new bits yet. Failure hardcoded in test")));
DH_LOG ((LOG_FAIL,
TEXT("DFTEST-108 Failed. DCOM not updated in chicago. Bugs# 53142,53615")));
return E_FAIL;
#else
HRESULT hr = S_OK;
HRESULT hr2 = S_OK;
ChanceDF *pTestChanceDF = NULL;
VirtualDF *pTestVirtualDF = NULL;
VirtualCtrNode *pVirtualDFRoot = NULL;
VirtualStmNode *pvsnRootNewChildStream = NULL;
LPTSTR pRootDocFileName = NULL;
LPTSTR pRootNewChildStmName = NULL;
LPOLESTR poszRootNewChildStmName = NULL;
DG_STRING *pdgu = NULL;
USHORT usErr = 0;
LPSTORAGE pStgRoot = NULL;
LPSTREAM pStmChild = NULL;
ULONG ulRef = 0;
CDFD cdfd;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_108"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_108 started.")) );
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Attempt illegal tests on STGM_SIMPLE docfile")));
if(S_OK == hr)
{
// Create a new DataGen object to create random strings.
pdgu = new(NullOnFail) DG_STRING(ulSeed);
if (NULL == pdgu)
{
hr = E_OUTOFMEMORY;
}
}
if(S_OK == hr)
{
// Generate random name for root
hr = GenerateRandomName(
pdgu,
MINLENGTH,
MAXLENGTH,
&pRootDocFileName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if(S_OK == hr)
{
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 = STGM_CREATE |
STGM_DIRECT |
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE |
STGM_SIMPLE;
hr = pTestChanceDF->Create(&cdfd, pRootDocFileName);
DH_HRCHECK(hr, TEXT("pTestChanceDF->Create"));
}
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(
pTestChanceDF,
&pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - Create - successfully created.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - Create - failed, hr=0x%lx."),
hr));
}
if(S_OK == hr)
{
// Get Root Storage pointer
pStgRoot = pVirtualDFRoot->GetIStoragePointer();
if(NULL == pStgRoot)
{
DH_LOG((LOG_INFO,
TEXT("pVirtualDFRoot->GetIStoragePointer failed to return IStorage")) );
hr = E_FAIL;
}
}
if(S_OK == hr)
{
// Generate random name for stream
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootNewChildStmName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
if(S_OK == hr)
{
// Convert stream name to OLECHAR
hr = TStringToOleString(pRootNewChildStmName, &poszRootNewChildStmName);
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
}
// Call CSimpStorage::CreateStream with valid paramter .
if(S_OK == hr)
{
hr = pStgRoot->CreateStream(
poszRootNewChildStmName,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
0,
&pStmChild);
DH_HRCHECK(hr, TEXT("CSimpStorage::CreateStream"));
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream passed as exp")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream failed unexp,hr=0x%lx"),
hr));
}
}
// Call QueryInterface on IStream with invalid out parameter.
if(S_OK == hr)
{
hr = pStmChild->QueryInterface(IID_IStream, NULL);
if (STG_E_INVALIDPOINTER == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStream:QueryInterface failed as exp, hr =0x%lx."),
hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStream::QueryInterface didn't fail exp,hr=0x%lx"),
hr));
hr = E_FAIL;
}
}
// Release ptr, if reqd
if(NULL != pStmChild)
{
ulRef = pStmChild->Release();
DH_ASSERT(0 == ulRef);
pStmChild = NULL;
}
// delete these strings and create new ones so we get different
// names when trying to create things in the df (avoid name collisions)
delete pRootNewChildStmName;
pRootNewChildStmName = NULL;
delete poszRootNewChildStmName;
poszRootNewChildStmName = NULL;
if(S_OK == hr)
{
// Generate random name for stream
hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootNewChildStmName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
if(S_OK == hr)
{
// Convert stream name to OLECHAR
hr = TStringToOleString(pRootNewChildStmName, &poszRootNewChildStmName);
DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
}
// Call QueryInterface on CSimpStorage with invalid out parameter.
if(S_OK == hr)
{
hr = pStgRoot->QueryInterface(IID_IStorage, NULL);
if (STG_E_INVALIDPOINTER == hr)
{
DH_TRACE((DH_LVL_TRACE1,
TEXT("CSimpStorage:QueryInterface failed as exp, hr =0x%lx."),
hr));
hr = S_OK;
}
else
{
DH_TRACE((DH_LVL_TRACE1,
TEXT("CSimpStorage::QueryInterface didn't fail exp,hr=0x%lx"),
hr));
hr = E_FAIL;
}
}
// Call CSimpStorage::CreateStream with invalid out &pStmChild paramter .
if(S_OK == hr)
{
hr = pStgRoot->CreateStream(
poszRootNewChildStmName,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
0,
NULL);
DH_HRCHECK(hr, TEXT("CSimpStorage::CreateStream"));
if (STG_E_INVALIDPOINTER == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream failed as exp, hr =0x%lx."),
hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream didn't fail as exp,hr=0x%lx"),
hr));
hr = E_FAIL;
}
}
// Call CSimpStorage::CreateStream with NULL name .
if(S_OK == hr)
{
hr = pStgRoot->CreateStream(
NULL,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
0,
&pStmChild);
DH_HRCHECK(hr, TEXT("CSimpStorage::CreateStream"));
if (S_OK != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream failed as exp, hr =0x%lx."),
hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream didn't fail as exp,hr=0x%lx"),
hr));
hr = E_FAIL;
}
}
// Release ptr, if reqd
if(NULL != pStmChild)
{
ulRef = pStmChild->Release();
DH_ASSERT(0 == ulRef);
pStmChild = NULL;
}
// Call CSimpStorage::CreateStream with invalid reserved paramter .
if(S_OK == hr)
{
hr = pStgRoot->CreateStream(
poszRootNewChildStmName,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
999,
999,
&pStmChild);
DH_HRCHECK(hr, TEXT("CSimpStorage::CreateStream"));
if (S_OK != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream failed as exp, hr =0x%lx."),
hr));
hr = S_OK;
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("CSimpStorage:CreateStream didn't fail as exp,hr=0x%lx"),
hr));
hr = E_FAIL;
}
}
// Release ptr, if reqd
if(NULL != pStmChild)
{
ulRef = pStmChild->Release();
DH_ASSERT(0 == ulRef);
pStmChild = NULL;
}
// if everything goes well, log test as passed else failed.
if(S_OK == hr)
{
DH_LOG((LOG_PASS, TEXT("Test variation DFTEST_108 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_108 failed, hr=0x%lx."),
hr) );
}
// Cleanup
// Delete docfile on disk
if((S_OK == hr) && (NULL != pRootDocFileName))
{
if(FALSE == DeleteFile(pRootDocFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree for first DocFile
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree for first docfile
if(NULL != pTestVirtualDF)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete strings
if(NULL != pRootDocFileName)
{
delete pRootDocFileName;
pRootDocFileName = NULL;
}
if(NULL != pRootNewChildStmName)
{
delete pRootNewChildStmName;
pRootNewChildStmName = NULL;
}
if(NULL != poszRootNewChildStmName)
{
delete poszRootNewChildStmName;
poszRootNewChildStmName = NULL;
}
// Delete data generators
if(NULL != pdgu)
{
delete pdgu;
pdgu = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_108 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
#endif //_MAC
}
//----------------------------------------------------------------------------
//
// Test: DFTEST_109
//
// Synopsis: A simple mode 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:[ulSeed]
//
// Returns: HRESULT
//
// Notes: This test runs in direct mode only
//
// History: 29-Oct-1996 JiminLi Created.
//
// Notes:
// To run the test, do the following at command prompt.
// stgbase /seed:0 /t:DFTEST-109
//
// BUGNOTE: Conversion: DFTEST-109 NO
//
//-----------------------------------------------------------------------------
HRESULT DFTEST_109(ULONG ulSeed)
{
#ifdef _MAC // Simple mode not ported yet; check with the developers
// and remove this when ready
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!Simple mode DFTEST_109 crashes.")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("!!!!!!!To be investigated")) );
return E_NOTIMPL;
#else
HRESULT hr = S_OK;
HRESULT hr2 = 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 pRootDocFileName = 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;
CDFD cdfd;
// Not for 2phase. Bail.
if (DoingDistrib ())
{
return S_OK;
}
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("DFTEST_109"));
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_109 started.")) );
DH_TRACE((
DH_LVL_TRACE1,
TEXT("Test on adding a ministream into the simple root storage")));
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;
}
}
if (S_OK == hr)
{
// Create a new DataGen object to create random integers.
pdgi = new(NullOnFail) DG_INTEGER(ulSeed);
if (NULL == pdgi)
{
hr = E_OUTOFMEMORY;
}
}
if(S_OK == hr)
{
// Generate random name for root
hr = GenerateRandomName(
pdgu,
MINLENGTH,
MAXLENGTH,
&pRootDocFileName);
DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
}
// Create the new ChanceDocFile tree that would consist of chance nodes.
if (S_OK == hr)
{
pTestChanceDF = new ChanceDF();
if(NULL == pTestChanceDF)
{
hr = E_OUTOFMEMORY;
}
}
if(S_OK == hr)
{
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 = STGM_CREATE |
STGM_DIRECT |
STGM_READWRITE |
STGM_SHARE_EXCLUSIVE |
STGM_SIMPLE;
hr = pTestChanceDF->Create(&cdfd, pRootDocFileName);
DH_HRCHECK(hr, TEXT("pTestChanceDF->Create"));
}
if (S_OK == hr)
{
pTestVirtualDF = new VirtualDF();
if(NULL == pTestVirtualDF)
{
hr = E_OUTOFMEMORY;
}
}
if (S_OK == hr)
{
hr = pTestVirtualDF->GenerateVirtualDF(
pTestChanceDF,
&pVirtualDFRoot);
DH_HRCHECK(hr, TEXT("pTestVirtualDF->GenerateVirtualDF")) ;
}
if (S_OK == hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - Create - successfully created.")));
}
else
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("DocFile - Create - failed, hr=0x%lx."),
hr));
}
// 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(4096L).
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));
}
// Release the stream
if (S_OK == hr)
{
hr = pvsnRootNewChildStream[ulIndex]->Close();
}
if (S_OK != hr)
{
DH_TRACE((
DH_LVL_TRACE1,
TEXT("VirtualStmNode::Close unsuccessful, 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 DFTEST_109 passed.")) );
}
else
{
DH_LOG((
LOG_FAIL,
TEXT("Test variation DFTEST_109 failed, hr = 0x%lx."),
hr) );
}
// Cleanup
// Delete the docfile on disk
if ((S_OK == hr) && (NULL != pRootDocFileName))
{
if(FALSE == DeleteFile(pRootDocFileName))
{
hr2 = HRESULT_FROM_WIN32(GetLastError()) ;
DH_HRCHECK(hr2, TEXT("DeleteFile")) ;
}
}
// Delete Chance docfile tree
if(NULL != pTestChanceDF)
{
hr2 = pTestChanceDF->DeleteChanceDocFileTree(
pTestChanceDF->GetChanceDFRoot());
DH_HRCHECK(hr2, TEXT("pTestChanceDF->DeleteChanceFileDocTree")) ;
delete pTestChanceDF;
pTestChanceDF = NULL;
}
// Delete Virtual docfile tree
if(NULL != pTestVirtualDF)
{
hr2 = pTestVirtualDF->DeleteVirtualDocFileTree(pVirtualDFRoot);
DH_HRCHECK(hr2, TEXT("pTestVirtualDF->DeleteVirtualFileDocTree")) ;
delete pTestVirtualDF;
pTestVirtualDF = NULL;
}
// Delete temp space
if (NULL != pRootDocFileName)
{
delete pRootDocFileName;
pRootDocFileName = NULL;
}
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;
}
if (NULL != pdgi)
{
delete pdgi;
pdgi = NULL;
}
if (NULL != pdgu)
{
delete pdgu;
pdgu = NULL;
}
// Stop logging the test
DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation DFTEST_109 finished")) );
DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
return hr;
#endif //_MAC
}