summaryrefslogtreecommitdiffstats
path: root/private/ole32/stg/utils/fail/fail.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/ole32/stg/utils/fail/fail.cxx')
-rw-r--r--private/ole32/stg/utils/fail/fail.cxx2666
1 files changed, 2666 insertions, 0 deletions
diff --git a/private/ole32/stg/utils/fail/fail.cxx b/private/ole32/stg/utils/fail/fail.cxx
new file mode 100644
index 000000000..03505335d
--- /dev/null
+++ b/private/ole32/stg/utils/fail/fail.cxx
@@ -0,0 +1,2666 @@
+//+-------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1992 - 1992.
+//
+// File: Fail.CXX
+//
+// Contents: Docfile Failure Test
+//
+// History: 21-Jan-93 AlexT Created
+//
+// Notes: This test cycles through all failure points for each call,
+// verifying that we clean up correctly.
+//
+//--------------------------------------------------------------------------
+
+#include <headers.cxx>
+
+#pragma hdrstop
+
+#include <sift.hxx>
+
+#if DBG != 1
+#error FAIL.EXE requires DBG == 1
+#endif
+
+// #define BREADTHTEST // Comment out for depth testing (just most recent tests)
+
+//+-------------------------------------------------------------------------
+//
+// Function: VerifyDisk
+//
+// Synopsis: verify that disk file does or does not exist
+//
+// Arguments: [fExist] -- TRUE if file should exist, else FALSE
+// [iteration] -- iteration number
+//
+// History: 22-Jan-93 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+void VerifyDisk(BOOL fExist, LONG iteration)
+{
+ if (_access("c:\\testfail.dfl", 0) == 0)
+ {
+ if (!fExist)
+ {
+ printf("..Iteration %ld, file still exists\n", iteration);
+ }
+ }
+ else
+ {
+ if (fExist)
+ {
+ printf("..Iteration %ld, file doesn't exist\n", iteration);
+ }
+ }
+}
+
+//+-------------------------------------------------------------------------
+//
+// Function: VerifyMemory
+//
+// Arguments: [iteration] -- iteration number
+//
+// Requires: Caller should expect 0 memory to be allocated
+//
+// History: 22-Jan-93 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+void VerifyMemory(LONG iteration)
+{
+ if (DfGetMemAlloced() > 0L)
+ {
+ printf("..Iteration %ld - memory allocated\n", iteration);
+ DfPrintAllocs();
+ }
+}
+
+//+-------------------------------------------------------------------------
+//
+// Function: VerifyClean
+//
+// Synopsis: checks disk, memory
+//
+// Arguments: [sc] -- status code
+// [dwMode] -- Docfile mode
+// [iteration] -- iteration
+//
+// History: 22-Jan-93 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+void VerifyClean(SCODE sc, DWORD dwMode, LONG iteration)
+{
+ VerifyDisk(SUCCEEDED(sc) &&
+ !(dwMode & STGM_DELETEONRELEASE), iteration);
+ VerifyMemory(iteration);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Function: CreateWorkingDocfile
+//
+// Synopsis: create and verify the test Docfile
+//
+// Arguments: [dwMode] -- Docfile creation mode
+// [ppstg] -- placeholder for IStorage
+// [iteration] -- iteration number
+//
+// Returns: SCODE
+//
+// Modifies: ppstg
+//
+// History: 22-Jan-93 AlexT Created
+//
+//--------------------------------------------------------------------------
+
+SCODE CreateWorkingDocfile(DWORD dwMode, IStorage **ppstg, LONG iteration)
+{
+ SCODE sc;
+
+ // Make sample call
+ remove("c:\\testfail.dfl");
+ sc = DfGetScode(StgCreateDocfile(
+ "c:\\testfail.dfl",
+ dwMode,
+ 0,
+ ppstg));
+
+ if (FAILED(sc))
+ {
+ if (iteration == 0)
+ {
+ // This was a prep call. Prep calls aren't supposed to fail
+ if (sc == STG_E_INVALIDFLAG)
+ {
+ // Probably a bad combination of mode flags
+ printf("..Iteration %ld, sc = STG_E_INVALIDFLAG (OK)\n",
+ iteration);
+ }
+ else if (FAILED(sc))
+ {
+ // Something unexpected
+ printf("..Iteration %ld failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ }
+ else // iteration != 0
+ {
+ if (sc == STG_E_INSUFFICIENTMEMORY || sc == STG_E_MEDIUMFULL)
+ {
+ // we expected these failures; do nothing
+ ;
+ }
+ else
+ {
+ printf("..Iteration %ld failed - sc = 0x%lX (??)\n",
+ iteration, sc);
+ }
+ }
+ }
+
+ return(sc);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestStgCreate
+//
+// Purpose: Test StgCreateDocfile
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestStgCreate : public CTestCase
+{
+private:
+ SCODE _sc;
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestStgCreate::Init(void)
+{
+ printf("SIFT StgCreateDocfile\n");
+ _mdf.Init();
+ return(TRUE);
+}
+
+SCODE CTestStgCreate::Prep(LONG iteration)
+{
+ // inherit this?
+ return(NOERROR);
+}
+
+SCODE CTestStgCreate::Call(LONG iteration)
+{
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX\n", _mdf.GetMode());
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, iteration);
+
+ return(_sc);
+}
+
+void CTestStgCreate::EndCall(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestStgCreate::CallVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+void CTestStgCreate::EndPrep(LONG iteration)
+{
+ // inherit this?
+}
+
+void CTestStgCreate::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestStgCreate::Next(void)
+{
+ if (!_mdf.Next())
+ return FALSE;
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCreateStorage
+//
+// Purpose: Test IStorage::CreateStorage
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCreateStorage : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStg _mstg;
+ IStorage *_pstgChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCreateStorage::Init(void)
+{
+ printf("SIFT IStorage::CreateStorage\n");
+ _mdf.Init();
+ _mstg.Init();
+ return(TRUE);
+}
+
+SCODE CTestCreateStorage::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ return(_sc);
+}
+
+SCODE CTestCreateStorage::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Child Storage Mode 0x%lX\n",
+ _mdf.GetMode(), _mstg.GetMode());
+
+ sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ return(sc);
+}
+
+void CTestCreateStorage::EndCall(LONG iteration)
+{
+ _pstgChild->Release();
+}
+
+void CTestCreateStorage::CallVerify(LONG iteration)
+{
+}
+
+void CTestCreateStorage::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestCreateStorage::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCreateStorage::Next(void)
+{
+ if (!_mstg.Next())
+ {
+ _mstg.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCreateStream
+//
+// Purpose: Test IStorage::CreateStream
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCreateStream : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCreateStream::Init(void)
+{
+ printf("SIFT IStorage::CreateStream\n");
+ _mdf.Init();
+ _mstm.Init();
+ return(TRUE);
+}
+
+SCODE CTestCreateStream::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ return(_sc);
+}
+
+SCODE CTestCreateStream::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Child Stream Mode 0x%lX\n",
+ _mdf.GetMode(), _mstm.GetMode());
+
+ sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ return(sc);
+}
+
+void CTestCreateStream::EndCall(LONG iteration)
+{
+ _pstmChild->Release();
+}
+
+void CTestCreateStream::CallVerify(LONG iteration)
+{
+}
+
+void CTestCreateStream::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestCreateStream::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCreateStream::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestWrite
+//
+// Purpose: Test IStream::Write
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestWrite : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestWrite::Init(void)
+{
+ printf("SIFT IStream::Write\n");
+ _mdf.Init();
+ _mstm.Init();
+ return(TRUE);
+}
+
+SCODE CTestWrite::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ }
+ return(_sc);
+}
+
+SCODE CTestWrite::Call(LONG iteration)
+{
+ SCODE sc;
+ ULONG cb = 1;
+ char c = 'X';
+ ULONG cbWritten;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Stream Mode 0x%lX, Write %ld bytes\n",
+ _mdf.GetMode(), _mstm.GetMode(), cb);
+
+ sc = DfGetScode(_pstmChild->Write(&c, cb, &cbWritten));
+
+ if (FAILED(sc))
+ {
+ if (sc != STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ return(sc);
+}
+
+void CTestWrite::EndCall(LONG iteration)
+{
+}
+
+void CTestWrite::CallVerify(LONG iteration)
+{
+}
+
+void CTestWrite::EndPrep(LONG iteration)
+{
+ _pstmChild->Release();
+ _pstg->Release();
+}
+
+void CTestWrite::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestWrite::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestOpenStream
+//
+// Purpose: Test IStorage::OpenStream
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestOpenStream : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstm;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestOpenStream::Init(void)
+{
+ printf("SIFT IStorage::OpenStream\n");
+ _mdf.Init();
+ _mstm.Init();
+ return(TRUE);
+}
+
+SCODE CTestOpenStream::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstm));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ else
+ _pstm->Release();
+ }
+ return(_sc);
+}
+
+SCODE CTestOpenStream::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Stream Mode 0x%lX\n",
+ _mdf.GetMode(), _mstm.GetMode());
+
+ sc = DfGetScode(_pstg->OpenStream(
+ "TestFail Stream",
+ 0,
+ _mstm.GetMode(),
+ 0,
+ &_pstm));
+
+ return(sc);
+}
+
+void CTestOpenStream::EndCall(LONG iteration)
+{
+ _pstm->Release();
+}
+
+void CTestOpenStream::CallVerify(LONG iteration)
+{
+}
+
+void CTestOpenStream::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestOpenStream::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestOpenStream::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestOpenStorage
+//
+// Purpose: Test IStorage::OpenStorage
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestOpenStorage : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStg _mstg;
+ IStorage *_pstgChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestOpenStorage::Init(void)
+{
+ printf("SIFT IStorage::OpenStorage\n");
+ _mdf.Init();
+ _mstg.Init();
+ return(TRUE);
+}
+
+SCODE CTestOpenStorage::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ else
+ _pstgChild->Release();
+ }
+ return(_sc);
+}
+
+SCODE CTestOpenStorage::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Storage Mode 0x%lX\n",
+ _mdf.GetMode(), _mstg.GetMode());
+
+ sc = DfGetScode(_pstg->OpenStorage("TestFail Storage", 0,
+ _mstg.GetMode(), 0, 0, &_pstgChild));
+
+ return(sc);
+}
+
+void CTestOpenStorage::EndCall(LONG iteration)
+{
+ _pstgChild->Release();
+}
+
+void CTestOpenStorage::CallVerify(LONG iteration)
+{
+}
+
+void CTestOpenStorage::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestOpenStorage::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestOpenStorage::Next(void)
+{
+ if (!_mstg.Next())
+ {
+ _mstg.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCommit
+//
+// Purpose: Test IStream::Write
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCommit : public CTestCase
+{
+private:
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStg _mstg;
+ IStorage *_pstgChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCommit::Init(void)
+{
+ printf("SIFT IStorage::Commit\n");
+ _mdf.Init();
+ _mstg.Init();
+ return(TRUE);
+}
+
+SCODE CTestCommit::Prep(LONG iteration)
+{
+ SCODE sc;
+
+ sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(sc))
+ {
+ sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ if (FAILED(sc))
+ _pstg->Release();
+ }
+ return(sc);
+}
+
+SCODE CTestCommit::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Storage Mode 0x%lX\n",
+ _mdf.GetMode(), _mstg.GetMode());
+
+ sc = DfGetScode(_pstgChild->Commit(0));
+
+ if (FAILED(sc))
+ {
+ if (sc != STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - STG_E_MEDIUMFULL\n", iteration);
+ else
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ return(sc);
+}
+
+void CTestCommit::EndCall(LONG iteration)
+{
+}
+
+void CTestCommit::CallVerify(LONG iteration)
+{
+}
+
+void CTestCommit::EndPrep(LONG iteration)
+{
+ _pstgChild->Release();
+ _pstg->Release();
+}
+
+void CTestCommit::EndVerify(LONG iteration)
+{
+ VerifyClean(S_OK, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCommit::Next(void)
+{
+ if (!_mstg.Next())
+ {
+ _mstg.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCommit2
+//
+// Purpose: Test IStorage::Commit
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCommit2 : public CTestCase
+{
+private:
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStg _mstg;
+ IStorage *_pstgChild;
+
+ IStream *_pstmChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCommit2::Init(void)
+{
+ printf("SIFT IStorage::Commit\n");
+ _mdf.Init();
+ _mstg.Init();
+ return(TRUE);
+}
+
+SCODE CTestCommit2::Prep(LONG iteration)
+{
+ SCODE sc;
+ ULONG cb = 1;
+ char c = 'X';
+ ULONG cbWritten;
+
+ sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(sc))
+ {
+ sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ if (FAILED(sc))
+ _pstg->Release();
+ else
+ {
+ sc = DfGetScode(_pstgChild->CreateStream(
+ "TestFail Stream",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(sc))
+ {
+ _pstgChild->Release();
+ _pstg->Release();
+ }
+ else
+ {
+ sc = DfGetScode(_pstmChild->Write(&c, cb, &cbWritten));
+ if (FAILED(sc))
+ {
+ _pstmChild->Release();
+ _pstgChild->Release();
+ _pstg->Release();
+ }
+ }
+ }
+ }
+ return(sc);
+}
+
+SCODE CTestCommit2::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Storage Mode 0x%lX\n",
+ _mdf.GetMode(), _mstg.GetMode());
+
+ sc = DfGetScode(_pstgChild->Commit(0));
+
+ if (FAILED(sc))
+ {
+ if (sc == STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - STG_E_MEDIUMFULL\n", iteration);
+ else
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ return(sc);
+}
+
+void CTestCommit2::EndCall(LONG iteration)
+{
+}
+
+void CTestCommit2::CallVerify(LONG iteration)
+{
+}
+
+void CTestCommit2::EndPrep(LONG iteration)
+{
+ _pstmChild->Release();
+ _pstgChild->Release();
+ _pstg->Release();
+}
+
+void CTestCommit2::EndVerify(LONG iteration)
+{
+ VerifyClean(S_OK, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCommit2::Next(void)
+{
+ if (!_mstg.Next())
+ {
+ _mstg.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCommit3
+//
+// Purpose: Test IStorage::Commit
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCommit3 : public CTestCase
+{
+private:
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCommit3::Init(void)
+{
+ printf("SIFT IStorage::Commit\n");
+ _mdf.Init();
+ return(TRUE);
+}
+
+SCODE CTestCommit3::Prep(LONG iteration)
+{
+ SCODE sc;
+ ULONG cb = 1;
+ char c = 'X';
+
+ sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+
+ if (FAILED(sc))
+ return(sc);
+
+ IStream *pstm;
+ sc = DfGetScode(_pstg->CreateStream(
+ "PP40",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &pstm));
+ pstm->Release();
+
+ IStorage *pstgChild;
+ sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &pstgChild));
+
+ sc = DfGetScode(pstgChild->CreateStream(
+ "One",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &pstm));
+ pstm->Release();
+ sc = DfGetScode(pstgChild->CreateStream(
+ "Two",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &pstm));
+ pstm->Release();
+ sc = DfGetScode(pstgChild->CreateStream(
+ "Three",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READWRITE,
+ 0,
+ 0,
+ &pstm));
+ pstm->Release();
+
+ sc = DfGetScode(pstgChild->Commit(0));
+ pstgChild->Release();
+
+ return(sc);
+}
+
+SCODE CTestCommit3::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX\n",
+ _mdf.GetMode());
+
+ sc = DfGetScode(_pstg->Commit(0));
+
+ if (FAILED(sc))
+ {
+ if (sc == STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - STG_E_MEDIUMFULL\n", iteration);
+ else
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ return(sc);
+}
+
+void CTestCommit3::EndCall(LONG iteration)
+{
+}
+
+void CTestCommit3::CallVerify(LONG iteration)
+{
+}
+
+void CTestCommit3::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestCommit3::EndVerify(LONG iteration)
+{
+ VerifyClean(S_OK, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCommit3::Next(void)
+{
+ if (!_mdf.Next())
+ return(FALSE);
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCommit4
+//
+// Purpose: Test IStorage::Commit with resized streams
+//
+// Interface: CTestCase
+//
+// History: 08-Sep-93 DrewB Created
+//
+//--------------------------------------------------------------------------
+
+class CTestCommit4 : public CTestCase
+{
+private:
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCommit4::Init(void)
+{
+ printf("SIFT IStorage::Commit\n");
+ _mdf.Init();
+ return(TRUE);
+}
+
+#define LARGE_SIZE 4097
+#define SMALL_SIZE 4095
+
+SCODE CTestCommit4::Prep(LONG iteration)
+{
+ SCODE sc;
+ IStream *pstm;
+ ULARGE_INTEGER uli;
+
+ sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (FAILED(sc))
+ goto EH_Err;
+ sc = DfGetScode(_pstg->CreateStream("Test",
+ STGM_DIRECT | STGM_SHARE_EXCLUSIVE |
+ STGM_READWRITE, 0, 0, &pstm));
+ if (FAILED(sc))
+ goto EH_pstg;
+ uli.HighPart = 0;
+ uli.LowPart = LARGE_SIZE;
+ sc = DfGetScode(pstm->SetSize(uli));
+ if (FAILED(sc))
+ goto EH_pstm;
+ sc = DfGetScode(_pstg->Commit(0));
+ if (FAILED(sc))
+ goto EH_pstm;
+ uli.LowPart = SMALL_SIZE;
+ sc = DfGetScode(pstm->SetSize(uli));
+ if (FAILED(sc))
+ goto EH_pstm;
+ pstm->Release();
+ return sc;
+
+ EH_pstm:
+ pstm->Release();
+ EH_pstg:
+ _pstg->Release();
+ EH_Err:
+ return sc;
+}
+
+SCODE CTestCommit4::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX\n",
+ _mdf.GetMode());
+
+ sc = DfGetScode(_pstg->Commit(0));
+
+ if (FAILED(sc))
+ {
+ if (sc == STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - STG_E_MEDIUMFULL\n", iteration);
+ else
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+ return(sc);
+}
+
+void CTestCommit4::EndCall(LONG iteration)
+{
+}
+
+void CTestCommit4::CallVerify(LONG iteration)
+{
+ IStream *pstm;
+ SCODE sc;
+ STATSTG stat;
+
+ sc = DfGetScode(_pstg->OpenStream("Test", NULL, STGM_DIRECT |
+ STGM_SHARE_EXCLUSIVE, 0, &pstm));
+ if (FAILED(sc))
+ {
+ printf("Can't open stream - %lX\n", sc);
+ return;
+ }
+ sc = DfGetScode(pstm->Stat(&stat, STATFLAG_NONAME));
+ pstm->Release();
+ if (FAILED(sc))
+ {
+ printf("Can't stat stream - %lX\n", sc);
+ return;
+ }
+ if (stat.cbSize.LowPart != SMALL_SIZE)
+ {
+ printf("Stream length is %lu rather than %d\n",
+ stat.cbSize.LowPart, SMALL_SIZE);
+ return;
+ }
+}
+
+void CTestCommit4::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestCommit4::EndVerify(LONG iteration)
+{
+ VerifyClean(S_OK, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCommit4::Next(void)
+{
+ if (!_mdf.Next())
+ return(FALSE);
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestStgOpen
+//
+// Purpose: Test StgOpenStorage
+//
+// Interface: CTestCase
+//
+// History: 28-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestStgOpen : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestStgOpen::Init(void)
+{
+ printf("SIFT StgOpenStorage\n");
+ _mdf.Init();
+ return(TRUE);
+}
+
+SCODE CTestStgOpen::Prep(LONG iteration)
+{
+ SCODE sc;
+ DWORD dwMode = STGM_DIRECT |
+ STGM_READWRITE |
+ STGM_SHARE_EXCLUSIVE |
+ STGM_FAILIFTHERE;
+ IStorage *pstg, *pstgChild;
+ IStream *pstmChild;
+
+ sc = CreateWorkingDocfile(dwMode, &pstg, 0);
+ if (SUCCEEDED(sc))
+ {
+ sc = DfGetScode(pstg->CreateStorage(
+ "TestFail Storage",
+ dwMode,
+ 0,
+ 0,
+ &pstgChild));
+
+ if (SUCCEEDED(sc))
+ {
+ sc = DfGetScode(pstgChild->CreateStream(
+ "TestFail Stream",
+ dwMode,
+ 0,
+ 0,
+ &pstmChild));
+
+ if (SUCCEEDED(sc))
+ pstmChild->Release();
+
+ pstgChild->Release();
+ }
+
+ pstg->Release();
+ }
+ return(sc);
+}
+
+SCODE CTestStgOpen::Call(LONG iteration)
+{
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX\n", _mdf.GetMode());
+
+ _sc = DfGetScode(StgOpenStorage("c:\\testfail.dfl",
+ NULL,
+ _mdf.GetMode(),
+ NULL,
+ 0,
+ &_pstg));
+
+ if (FAILED(_sc))
+ {
+ if (iteration == 0 && _sc == STG_E_INVALIDFLAG)
+ {
+ printf("..STG_E_INVALIDFLAG\n");
+ // Must have been a bad combination of flags - we
+ // ignore these for now.
+ }
+ else if (iteration > 0 && _sc == STG_E_INSUFFICIENTMEMORY)
+ {
+ // Do nothing (expected failure)
+ }
+ else if (iteration > 0 && _sc == STG_E_MEDIUMFULL)
+ {
+ // Do nothing (expected failure)
+ }
+ else
+ printf("..Iteration %ld, call failed - sc = 0x%lX\n",
+ iteration, _sc);
+ }
+ return(_sc);
+}
+
+void CTestStgOpen::EndCall(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestStgOpen::CallVerify(LONG iteration)
+{
+}
+
+void CTestStgOpen::EndPrep(LONG iteration)
+{
+}
+
+void CTestStgOpen::EndVerify(LONG iteration)
+{
+ // If the call failed, the file should still exist.
+ // If the call succeeded
+ // If mode was delete on release,
+ // file should not exist
+ // else file should exist
+
+ VerifyDisk((SUCCEEDED(_sc) && (!(_mdf.GetMode() & STGM_DELETEONRELEASE))) ||
+ FAILED(_sc), iteration);
+ VerifyMemory(iteration);
+}
+
+BOOL CTestStgOpen::Next(void)
+{
+ if (!_mdf.Next())
+ return(FALSE);
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestWrite2
+//
+// Purpose: Test IStream::Write for largish writes
+//
+// Interface: CTestCase
+//
+// History: 16-Feb-93 PhilipLa Created.
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestWrite2 : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ BYTE *_pb;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+ ULONG _cb;
+ ULONG _cBlock;
+
+ ULONG _cbSize;
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestWrite2::Init(void)
+{
+ printf("SIFT IStream::Write2 - large writes without Setsize\n");
+ _mdf.Init();
+ _mstm.Init();
+
+ _cb = 8192;
+ _cBlock = 8;
+
+ _pb = NULL;
+ return(TRUE);
+}
+
+SCODE CTestWrite2::Prep(LONG iteration)
+{
+
+ _pb = new BYTE[8192];
+ memset(_pb, 'X', 8192);
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ _cbSize = 0;
+ if (FAILED(_sc))
+ _pstg->Release();
+
+ }
+ return(_sc);
+}
+
+SCODE CTestWrite2::Call(LONG iteration)
+{
+ SCODE sc;
+ ULONG cbWritten;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Stream Mode 0x%lX, Write %ld bytes\n",
+ _mdf.GetMode(), _mstm.GetMode(), _cb * _cBlock);
+
+ for (ULONG i = 0; i < _cBlock; i++)
+ {
+ sc = DfGetScode(_pstmChild->Write(_pb, _cb, &cbWritten));
+ _cbSize += cbWritten;
+
+ if (FAILED(sc))
+ {
+ if (sc != STG_E_MEDIUMFULL)
+ printf("..Iteration %ld, block %lu - failed - sc = 0x%lX\n",
+ iteration, i + 1, sc);
+ break;
+ }
+ }
+ return(sc);
+}
+
+void CTestWrite2::EndCall(LONG iteration)
+{
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != _cbSize)
+ {
+ printf("..Iteration %lu - Size of stream is %lu. Expected %lu\n",
+ iteration, ULIGetLow(stat.cbSize), _cbSize);
+ }
+}
+
+void CTestWrite2::CallVerify(LONG iteration)
+{
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != _cbSize)
+ {
+ printf("..Iteration %lu - Size of stream is %lu. Expected %lu\n",
+ iteration, ULIGetLow(stat.cbSize), _cbSize);
+ }
+
+}
+
+void CTestWrite2::EndPrep(LONG iteration)
+{
+ delete _pb;
+ _pb = NULL;
+
+ _pstmChild->Release();
+ _pstg->Release();
+}
+
+void CTestWrite2::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestWrite2::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestWrite3
+//
+// Purpose: Test IStream::Write for largish writes
+//
+// Interface: CTestCase
+//
+// History: 16-Feb-93 PhilipLa Created.
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestWrite3 : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ BYTE *_pb;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+ ULONG _cb;
+ ULONG _cBlock;
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestWrite3::Init(void)
+{
+ printf("SIFT IStream::Write3 - large writes with prior Setsize\n");
+ _mdf.Init();
+ _mstm.Init();
+
+ _cb = 8192;
+ _cBlock = 8;
+
+ _pb = NULL;
+ return(TRUE);
+}
+
+SCODE CTestWrite3::Prep(LONG iteration)
+{
+
+ _pb = new BYTE[8192];
+ memset(_pb, 'X', 8192);
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ else
+ {
+ ULARGE_INTEGER cbSize;
+
+ ULISet32(cbSize, _cb * _cBlock);
+
+ _sc = DfGetScode(_pstmChild->SetSize(cbSize));
+
+ if (FAILED(_sc))
+ {
+ _pstmChild->Release();
+ _pstg->Release();
+ }
+ }
+ }
+ return(_sc);
+}
+
+SCODE CTestWrite3::Call(LONG iteration)
+{
+ SCODE sc;
+ ULONG cbWritten;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Stream Mode 0x%lX, Write %ld bytes\n",
+ _mdf.GetMode(), _mstm.GetMode(), _cb * _cBlock);
+ else
+ printf("ERROR - shouldn't hit iteration %lu\n", iteration);
+
+ for (ULONG i = 0; i < _cBlock; i++)
+ {
+ sc = DfGetScode(_pstmChild->Write(_pb, _cb, &cbWritten));
+ if (FAILED(sc))
+ {
+ if (sc != STG_E_MEDIUMFULL)
+ printf("..Iteration %ld, block %lu - failed - sc = 0x%lX\n",
+ iteration, i + 1, sc);
+ break;
+ }
+ }
+ return(sc);
+}
+
+void CTestWrite3::EndCall(LONG iteration)
+{
+}
+
+void CTestWrite3::CallVerify(LONG iteration)
+{
+}
+
+void CTestWrite3::EndPrep(LONG iteration)
+{
+ delete _pb;
+ _pb = NULL;
+
+ _pstmChild->Release();
+ _pstg->Release();
+}
+
+void CTestWrite3::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestWrite3::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestSetsize
+//
+// Purpose: Test IStream::Write for largish writes
+//
+// Interface: CTestCase
+//
+// History: 16-Feb-93 PhilipLa Created.
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestSetsize : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ BYTE *_pb;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+ ULONG _cb;
+ ULONG _cBlock;
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestSetsize::Init(void)
+{
+ printf("SIFT IStream::Setsize\n");
+ _mdf.Init();
+ _mstm.Init();
+
+ _cb = 8192;
+ _cBlock = 9;
+
+ _pb = NULL;
+ return(TRUE);
+}
+
+SCODE CTestSetsize::Prep(LONG iteration)
+{
+
+ _pb = new BYTE[8192];
+ memset(_pb, 'X', 8192);
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ }
+ return(_sc);
+}
+
+SCODE CTestSetsize::Call(LONG iteration)
+{
+ SCODE sc;
+ ULONG cbWritten;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Stream Mode 0x%lX, Write %ld bytes\n",
+ _mdf.GetMode(), _mstm.GetMode(), _cb * _cBlock);
+
+ ULARGE_INTEGER cbSize;
+
+ ULISet32(cbSize, _cb * _cBlock);
+
+ sc = DfGetScode(_pstmChild->SetSize(cbSize));
+
+
+ if (FAILED(sc))
+ {
+ if (sc != STG_E_MEDIUMFULL)
+ printf("..Iteration %ld - failed - sc = 0x%lX\n", iteration, sc);
+ }
+ else
+ {
+ for (ULONG i = 0; i < _cBlock; i++)
+ {
+ sc = DfGetScode(_pstmChild->Write(_pb, _cb, &cbWritten));
+ if (FAILED(sc))
+ {
+ printf("..Iteration %ld, Write %lu failed - sc == 0x%lX\n",
+ iteration, i + 1, sc);
+ break;
+ }
+ }
+ }
+ return(sc);
+}
+
+void CTestSetsize::EndCall(LONG iteration)
+{
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != _cb * _cBlock)
+ {
+ printf("..Iteration %lu - Size of stream is %lu, expected %lu\n",
+ iteration, ULIGetLow(stat.cbSize), _cb * _cBlock);
+ }
+
+}
+
+void CTestSetsize::CallVerify(LONG iteration)
+{
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != 0)
+ {
+ printf("..Iteration %lu - Size of stream is %lu, expected 0\n",
+ iteration, ULIGetLow(stat.cbSize));
+ }
+}
+
+void CTestSetsize::EndPrep(LONG iteration)
+{
+ delete _pb;
+ _pb = NULL;
+
+ _pstmChild->Release();
+ _pstg->Release();
+}
+
+void CTestSetsize::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestSetsize::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestCreateStream2
+//
+// Purpose: Test IStorage::CreateStream2
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestCreateStream2 : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestCreateStream2::Init(void)
+{
+ printf("SIFT IStorage::CreateStream2\n");
+ _mdf.Init();
+ _mstm.Init();
+ return(TRUE);
+}
+
+SCODE CTestCreateStream2::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ return(_sc);
+}
+
+SCODE CTestCreateStream2::Call(LONG iteration)
+{
+ SCODE sc;
+ ULONG cStream = 8;
+
+ char * pszName = "XTestFail Stream";
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Child Stream Mode 0x%lX\n",
+ _mdf.GetMode(), _mstm.GetMode());
+
+ for (ULONG i = 0; i < cStream; i++)
+ {
+ pszName[0] = ((char)i) + '0';
+
+ sc = DfGetScode(_pstg->CreateStream(
+ pszName,
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(sc))
+ {
+ if ((sc == STG_E_MEDIUMFULL) || (sc == STG_E_INSUFFICIENTMEMORY))
+ {
+ //Do nothing. We expected these.
+ }
+ else printf("..Iteration %ld, stream %lu - failed - sc = 0x%lX\n",
+ iteration, i + 1, sc);
+ break;
+ }
+ _pstmChild->Release();
+ }
+
+ return(sc);
+}
+
+void CTestCreateStream2::EndCall(LONG iteration)
+{
+}
+
+void CTestCreateStream2::CallVerify(LONG iteration)
+{
+}
+
+void CTestCreateStream2::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestCreateStream2::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestCreateStream2::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestDestroyElement
+//
+// Purpose: Test IStorage::DestroyElement
+//
+// Interface: CTestCase
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestDestroyElement : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStg _mstg;
+ IStorage *_pstgChild;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestDestroyElement::Init(void)
+{
+ printf("SIFT IStorage::DestroyElement\n");
+ _mdf.Init();
+ _mstg.Init();
+ return(TRUE);
+}
+
+SCODE CTestDestroyElement::Prep(LONG iteration)
+{
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStorage(
+ "TestFail Storage",
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ _pstgChild->Release();
+ }
+
+
+ return(_sc);
+}
+
+SCODE CTestDestroyElement::Call(LONG iteration)
+{
+ SCODE sc;
+
+ if (iteration == 0)
+ printf("Docfile Mode 0x%lX, Child Storage Mode 0x%lX\n",
+ _mdf.GetMode(), _mstg.GetMode());
+
+ sc = DfGetScode(_pstg->DestroyElement("TestFail Storage"));
+
+ if (FAILED(sc))
+ {
+ if ((sc == STG_E_MEDIUMFULL) || (sc == STG_E_INSUFFICIENTMEMORY))
+ {
+ //We expected these - do nothing.
+ }
+ else
+ printf("..Iteration %ld - failed - sc = 0x%lX\n",
+ iteration, sc);
+ }
+
+ return(sc);
+}
+
+void CTestDestroyElement::EndCall(LONG iteration)
+{
+ SCODE sc;
+
+ sc = DfGetScode(_pstg->OpenStorage(
+ "TestFail Storage",
+ 0,
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ if (sc != STG_E_FILENOTFOUND)
+ {
+ printf("..Iteration %ld - open failed with 0x%lX, expected STG_E_FILENOTFOUND\n",
+ iteration,
+ sc);
+ }
+
+ if (SUCCEEDED(sc))
+ {
+ _pstgChild->Release();
+ }
+}
+
+void CTestDestroyElement::CallVerify(LONG iteration)
+{
+ SCODE sc;
+
+ sc = DfGetScode(_pstg->OpenStorage(
+ "TestFail Storage",
+ 0,
+ _mstg.GetMode(),
+ 0,
+ 0,
+ &_pstgChild));
+
+ if (FAILED(sc))
+ {
+ printf("..Iteration %ld - open failed with 0x%lX, expected success.\n",
+ iteration,
+ sc);
+ }
+ else
+ {
+ _pstgChild->Release();
+ }
+
+}
+
+void CTestDestroyElement::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+}
+
+void CTestDestroyElement::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestDestroyElement::Next(void)
+{
+ if (!_mstg.Next())
+ {
+ _mstg.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestSetsize2
+//
+// Purpose: Test IStream::Write for largish writes
+//
+// Interface: CTestCase
+//
+// History: 16-Feb-93 PhilipLa Created.
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestSetsize2 : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ BYTE *_pb;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+ CModeStm _mstm;
+ IStream *_pstmChild;
+
+ ULONG _cb;
+ ULONG _cBlock;
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestSetsize2::Init(void)
+{
+ printf("SIFT IStream::Setsize2\n");
+ _mdf.Init();
+ _mstm.Init();
+
+ _cb = 8192;
+ _cBlock = 9;
+
+ _pb = NULL;
+ return(TRUE);
+}
+
+SCODE CTestSetsize2::Prep(LONG iteration)
+{
+
+ _pb = new BYTE[8192];
+ memset(_pb, 'X', 8192);
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ _mstm.GetMode(),
+ 0,
+ 0,
+ &_pstmChild));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ else
+ {
+ ULARGE_INTEGER ulSize;
+ ULISet32(ulSize, _cb * _cBlock);
+
+ _sc = DfGetScode(_pstmChild->SetSize(ulSize));
+ if (FAILED(_sc))
+ printf("Setsize failed in Prep()\n");
+ else
+ {
+ for (ULONG i = 0; i < _cBlock; i++)
+ {
+ ULONG cbWritten;
+
+ _sc = DfGetScode(_pstmChild->Write(_pb, _cb, &cbWritten));
+ if (FAILED(_sc))
+ break;
+ }
+ }
+ }
+ }
+ return(_sc);
+}
+
+SCODE CTestSetsize2::Call(LONG iteration)
+{
+ SCODE sc;
+
+ ULARGE_INTEGER ulSize;
+ ULISet32(ulSize, 2048L);
+
+ sc = DfGetScode(_pstmChild->SetSize(ulSize));
+
+ return(sc);
+}
+
+void CTestSetsize2::EndCall(LONG iteration)
+{
+
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != 2048L)
+ {
+ printf("..Iteration %lu - Size of stream is %lu, expected %lu\n",
+ iteration, ULIGetLow(stat.cbSize), 2048L);
+ }
+
+ LARGE_INTEGER newPos;
+ ULISet32(newPos, 0);
+ ULARGE_INTEGER dummy;
+
+ _pstmChild->Seek(newPos, STREAM_SEEK_SET, &dummy);
+ ULONG cbRead;
+
+ _pstmChild->Read(_pb, 2048, &cbRead);
+ if (cbRead != 2048)
+ {
+ printf("Unknown error - read %lu bytes, expected 2048\n");
+ }
+ else
+ {
+ for (ULONG i = 0; i < 2048; i ++)
+ {
+ if (_pb[i] != 'X')
+ {
+ printf("Error in buffer data.\n");
+ break;
+ }
+ }
+ }
+
+}
+
+
+void CTestSetsize2::CallVerify(LONG iteration)
+{
+
+ STATSTG stat;
+
+ _pstmChild->Stat(&stat, STATFLAG_NONAME);
+
+ if (ULIGetLow(stat.cbSize) != _cb * _cBlock)
+ {
+ printf("..Iteration %lu - Size of stream is %lu, expected %lu\n",
+ iteration, ULIGetLow(stat.cbSize), _cb * _cBlock);
+ }
+ else
+ {
+ LARGE_INTEGER newPos;
+ ULISet32(newPos, 0);
+ ULARGE_INTEGER dummy;
+
+ _pstmChild->Seek(newPos, STREAM_SEEK_SET, &dummy);
+
+ for (ULONG i = 0; i < _cBlock; i++)
+ {
+ ULONG cbRead;
+
+ _sc = DfGetScode(_pstmChild->Read(_pb, _cb, &cbRead));
+ if (FAILED(_sc))
+ {
+ printf("Read failed with %lX\n", _sc);
+ break;
+ }
+ if (cbRead != _cb)
+ {
+ printf("Read %lu bytes, expected %lu\n",cbRead,_cb);
+ break;
+ }
+ for (ULONG j = 0; j < _cb; j++)
+ {
+ if (_pb[j] != 'X')
+ {
+ printf("Data mismatch at byte %lu, block %lu\n",j,i);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void CTestSetsize2::EndPrep(LONG iteration)
+{
+ delete _pb;
+ _pb = NULL;
+
+ _pstmChild->Release();
+ _pstg->Release();
+}
+
+void CTestSetsize2::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestSetsize2::Next(void)
+{
+ if (!_mstm.Next())
+ {
+ _mstm.Init();
+ if (!_mdf.Next())
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Class: CTestSwitchToFile
+//
+// Purpose: Test SwitchToFile
+//
+// Interface: CTestCase
+//
+// History: 18-Jun-93 PhilipLa Created.
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+class CTestSwitchToFile : public CTestCase
+{
+private:
+ SCODE _sc;
+
+ CModeDf _mdf;
+ IStorage *_pstg;
+
+public:
+ virtual BOOL Init(void);
+ virtual SCODE Prep(LONG iteration);
+ virtual SCODE Call(LONG iteration);
+ virtual void EndCall(LONG iteration);
+ virtual void CallVerify(LONG iteration);
+ virtual void EndPrep(LONG iteration);
+ virtual void EndVerify(LONG iteration);
+ virtual BOOL Next(void);
+};
+
+BOOL CTestSwitchToFile::Init(void)
+{
+ printf("SIFT IStream::SwitchToFile\n");
+ _mdf.Init();
+ return(TRUE);
+}
+
+SCODE CTestSwitchToFile::Prep(LONG iteration)
+{
+ IStream *pstm;
+ _unlink("c:\\tmp\\stf.dfl");
+
+ _sc = CreateWorkingDocfile(_mdf.GetMode(), &_pstg, 0);
+ if (SUCCEEDED(_sc))
+ {
+ _sc = DfGetScode(_pstg->CreateStream(
+ "TestFail Stream",
+ STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE,
+ 0,
+ 0,
+ &pstm));
+
+ if (FAILED(_sc))
+ _pstg->Release();
+ else
+ {
+ ULARGE_INTEGER ul;
+
+ ULISet32(ul, 80000);
+
+ _sc = DfGetScode(pstm->SetSize(ul));
+ pstm->Release();
+
+ if (FAILED(_sc))
+ {
+ _pstg->Release();
+ }
+ }
+ }
+ return(_sc);
+}
+
+SCODE CTestSwitchToFile::Call(LONG iteration)
+{
+ SCODE sc;
+ IRootStorage *pstgRoot;
+
+ sc = DfGetScode(_pstg->QueryInterface(
+ IID_IRootStorage,
+ (void **)&pstgRoot));
+
+ if (FAILED(sc))
+ return sc;
+
+ sc = DfGetScode(pstgRoot->SwitchToFile("c:\\tmp\\stf.dfl"));
+
+ pstgRoot->Release();
+
+ if (FAILED(sc))
+ return sc;
+
+
+ sc = DfGetScode(_pstg->Commit(STGC_OVERWRITE));
+
+ if (FAILED(sc))
+ {
+ printf("... Commit with overwrite failed.\n");
+ }
+ else
+ {
+ printf("... Commit succeeded.\n");
+ }
+
+ return(sc);
+}
+
+void CTestSwitchToFile::EndCall(LONG iteration)
+{
+}
+
+
+void CTestSwitchToFile::CallVerify(LONG iteration)
+{
+}
+
+void CTestSwitchToFile::EndPrep(LONG iteration)
+{
+ _pstg->Release();
+ _unlink("c:\\tmp\\stf.dfl");
+}
+
+void CTestSwitchToFile::EndVerify(LONG iteration)
+{
+ VerifyClean(_sc, _mdf.GetMode(), iteration);
+}
+
+BOOL CTestSwitchToFile::Next(void)
+{
+ do
+ {
+ if (!_mdf.Next())
+ return FALSE;
+ }
+ while (((_mdf.GetMode() & 0x70) == STGM_SHARE_DENY_READ) ||
+ (_mdf.GetMode() & 0x70) == STGM_SHARE_DENY_NONE);
+
+ return(TRUE);
+}
+
+
+//+-------------------------------------------------------------------------
+//
+// Function: TestCount, TestItem
+//
+// Synopsis:
+//
+// Effects:
+//
+// Arguments:
+//
+// Returns:
+//
+// History: 26-Jan-93 AlexT Created
+//
+// Notes:
+//
+//--------------------------------------------------------------------------
+
+CTestStgCreate tstStgCreate;
+CTestCreateStorage tstCreateStorage;
+CTestCreateStream tstCreateStream;
+CTestWrite tstWrite;
+CTestOpenStorage tstOpenStorage;
+CTestOpenStream tstOpenStream;
+CTestCommit tstCommit;
+CTestCommit2 tstCommit2;
+CTestStgOpen tstStgOpen;
+CTestWrite2 tstWrite2;
+CTestWrite3 tstWrite3;
+CTestSetsize tstSetsize;
+CTestSetsize2 tstSetsize2;
+CTestCreateStream2 tstCreateStream2;
+CTestDestroyElement tstDestroyElement;
+CTestSwitchToFile tstSwitchToFile;
+CTestCommit3 tstCommit3;
+CTestCommit4 tstCommit4;
+
+CTestCase *atst[] =
+{
+#if defined(BREADTHTEST)
+ &tstStgCreate,
+ &tstStgOpen,
+ &tstCreateStorage,
+ &tstCreateStream,
+ &tstWrite,
+ &tstCommit,
+ &tstCommit2,
+ &tstOpenStream,
+ &tstOpenStorage,
+ &tstWrite2,
+ &tstWrite3,
+ &tstSetsize,
+ &tstCreateStream2,
+ &tstDestroyElement,
+ &tstSetsize2,
+ &tstSwitchToFile,
+ &tstCommit3,
+#endif
+ &tstCommit4
+};
+
+int TestCount(void)
+{
+ return(sizeof(atst)/sizeof(CTestCase *));
+}
+
+CTestCase *TestItem(int iTest)
+{
+ return(atst[iTest]);
+}