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.

1874 lines
53 KiB

  1. //-------------------------------------------------------------------------
  2. //
  3. // Microsoft OLE
  4. // Copyright (C) Microsoft Corporation, 1994 - 1995.
  5. //
  6. // File: misctsts.cxx
  7. //
  8. // Contents: miscellaneous tests pertaining to storage base tests
  9. //
  10. // Functions:
  11. //
  12. // History: 5-Aug-1996 Jiminli Created.
  13. // 27-Mar-97 SCousens conversionified
  14. //
  15. //--------------------------------------------------------------------------
  16. #include <dfheader.hxx>
  17. #pragma hdrstop
  18. #include "init.hxx"
  19. extern BOOL g_fUseStdBlk;
  20. extern USHORT ausSIZE_ARRAY[];
  21. ULONG ulStreamSize = 0;
  22. USHORT usIterations = 2;
  23. LPTSTR ptszNames[MAX_DOCFILES];
  24. ULONG *ulSeekOffset;
  25. TIMEINFO Time[] = {
  26. TEXT("FIRST_TIMING "), FIRST_TIMING, 0, 0,
  27. TEXT("CREATE_STREAM_NO_EXIST "), CREATE_STREAM_NO_EXIST, 0, 0,
  28. TEXT("CREATE_STREAM_EXIST "), CREATE_STREAM_EXIST, 0, 0,
  29. TEXT("CREATE_DOCFILE_NO_EXIST"), CREATE_DOCFILE_NO_EXIST, 0, 0,
  30. TEXT("CREATE_DOCFILE_EXIST "), CREATE_DOCFILE_EXIST, 0, 0,
  31. TEXT("CREATE_NONAME_DOCFILE "), CREATE_NONAME_DOCFILE, 0, 0,
  32. TEXT("OPEN_STORAGE_AND_STREAM"), OPEN_STORAGE_AND_STREAM, 0, 0,
  33. TEXT("OPEN_STREAM_ONLY "), OPEN_STREAM_ONLY, 0, 0,
  34. TEXT("SEQUENTIAL_WRITE "), SEQUENTIAL_WRITE, 0, 0,
  35. TEXT("SEQUENTIAL_READ "), SEQUENTIAL_READ, 0, 0,
  36. TEXT("RANDOM_WRITE "), RANDOM_WRITE, 0, 0,
  37. TEXT("RANDOM_READ "), RANDOM_READ, 0, 0 };
  38. //----------------------------------------------------------------------------
  39. //
  40. // Test: MISCTEST_100
  41. //
  42. // Synopsis: A root docfile is created and an IStream created in it. A random
  43. // number of bytes are written to the IStream and the IStream is
  44. // released. The root docfile is committed and released. This is
  45. // a particularly useful way to discover memory leaks as scratch
  46. // objects are created and (hopefully) released.
  47. //
  48. // Arguments:[argc]
  49. // [argv]
  50. //
  51. // Returns: HRESULT
  52. //
  53. // History: 5-Aug-1996 JiminLi Created.
  54. //
  55. // Notes: This test runs in direct, transacted, and transacted deny write
  56. // modes
  57. //
  58. // New Test Notes:
  59. // 1. Old File: MEMLEAK.CXX
  60. // 2. Old name of test : MiscMemLeak Test
  61. // New Name of test : MISCTEST_100
  62. // 3. To run the test, do the following at command prompt.
  63. // a. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-100
  64. // /dfRootMode:dirReadWriteShEx /logloc:2 /traceloc:2 /labmode
  65. // b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-100
  66. // /dfRootMode:xactReadWriteShEx /logloc:2 /traceloc:2 /labmode
  67. // c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-100
  68. // /dfRootMode:xactReadWriteShDenyW /logloc:2 /traceloc:2 /labmode
  69. //
  70. // BUGNOTE: Conversion: MISCTEST-100
  71. //
  72. //-----------------------------------------------------------------------------
  73. HRESULT MISCTEST_100(int argc, char *argv[])
  74. {
  75. HRESULT hr = S_OK;
  76. ChanceDF *pTestChanceDF = NULL;
  77. VirtualDF *pTestVirtualDF = NULL;
  78. VirtualCtrNode *pVirtualDFRoot = NULL;
  79. VirtualStmNode *pvsnRootNewChildStream = NULL;
  80. LPTSTR pRootNewChildStmName = NULL;
  81. DG_STRING *pdgu = NULL;
  82. DG_INTEGER *pdgi = NULL;
  83. USHORT usErr = 0;
  84. LPTSTR ptcsBuffer = NULL;
  85. ULONG culBytesLeftToWrite = 0;
  86. ULONG culWritten = 0;
  87. ULONG culRandIOBytes = 0;
  88. DWORD dwRootMode = 0;
  89. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_100"));
  90. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  91. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_100 started.")) );
  92. DH_TRACE((
  93. DH_LVL_TRACE1,
  94. TEXT("Attempt memory leaks checking as objects are created")));
  95. // Create our ChanceDF and VirtualDF
  96. hr = CreateTestDocfile (argc,
  97. argv,
  98. &pVirtualDFRoot,
  99. &pTestVirtualDF,
  100. &pTestChanceDF);
  101. // if creating the docfile - bail here
  102. if (NULL != pTestChanceDF && DoingCreate ())
  103. {
  104. UINT ulSeed = pTestChanceDF->GetSeed ();
  105. CleanupTestDocfile (&pVirtualDFRoot,
  106. &pTestVirtualDF,
  107. &pTestChanceDF,
  108. FALSE);
  109. return (HRESULT)ulSeed;
  110. }
  111. if (S_OK == hr)
  112. {
  113. dwRootMode = pTestChanceDF->GetRootMode();
  114. DH_TRACE((
  115. DH_LVL_TRACE1,
  116. TEXT("Run Mode for MISCTEST_100, Access mode: %lx"),
  117. dwRootMode));
  118. }
  119. // Get DG_STRING object pointer
  120. if (S_OK == hr)
  121. {
  122. pdgu = pTestVirtualDF->GetDataGenUnicode();
  123. DH_ASSERT(NULL != pdgu) ;
  124. }
  125. // Get DG_INTEGER object pointer
  126. if (S_OK == hr)
  127. {
  128. pdgi = pTestVirtualDF->GetDataGenInteger();
  129. DH_ASSERT(NULL != pdgi) ;
  130. }
  131. // Adds a new stream to the root storage.
  132. if(S_OK == hr)
  133. {
  134. // Generate random name for stream
  135. hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&pRootNewChildStmName);
  136. DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
  137. }
  138. if(S_OK == hr)
  139. {
  140. hr = AddStream(
  141. pTestVirtualDF,
  142. pVirtualDFRoot,
  143. pRootNewChildStmName,
  144. 0,
  145. STGM_READWRITE |
  146. STGM_SHARE_EXCLUSIVE |
  147. STGM_FAILIFTHERE,
  148. &pvsnRootNewChildStream);
  149. DH_HRCHECK(hr, TEXT("AddStream")) ;
  150. }
  151. if(S_OK == hr)
  152. {
  153. DH_TRACE((
  154. DH_LVL_TRACE1,
  155. TEXT("VirtualStmNode::AddStream completed successfully.")));
  156. }
  157. else
  158. {
  159. DH_TRACE((
  160. DH_LVL_TRACE1,
  161. TEXT("VirtualStmNode::AddStream not successful, hr=0x%lx."),
  162. hr));
  163. }
  164. if (S_OK == hr)
  165. {
  166. // Generate random size for stream between 4L, and MIN_SIZE * 1.5
  167. usErr = pdgi->Generate(&culBytesLeftToWrite,4L,(ULONG)(MIN_SIZE * 1.5));
  168. if (DG_RC_SUCCESS != usErr)
  169. {
  170. hr = E_FAIL;
  171. }
  172. }
  173. if (S_OK == hr)
  174. {
  175. // Generate random number of bytes to write per chunk b/w
  176. // RAND_IO_MIN and RAND_IO_MAX
  177. usErr = pdgi->Generate(&culRandIOBytes, RAND_IO_MIN, RAND_IO_MAX);
  178. if (DG_RC_SUCCESS != usErr)
  179. {
  180. hr = E_FAIL;
  181. }
  182. }
  183. // Loop to write new IStream in culRandIOBytes size chunks unless size
  184. // remaining to write is less than culRandIOBytes, then write the
  185. // remaining bytes. CRC is not important for this test, so no check for it.
  186. while ((S_OK == hr) && (0 != culBytesLeftToWrite))
  187. {
  188. if (culBytesLeftToWrite > culRandIOBytes)
  189. {
  190. culBytesLeftToWrite = culBytesLeftToWrite - culRandIOBytes;
  191. }
  192. else
  193. {
  194. culRandIOBytes = culBytesLeftToWrite;
  195. culBytesLeftToWrite = 0;
  196. }
  197. // Call VirtualStmNode::Write to create random bytes in the stream. For
  198. // our test purposes, we generate a random string of size culRandIOBytes
  199. // using GenerateRandomString function.
  200. if (S_OK == hr)
  201. {
  202. hr = GenerateRandomString(
  203. pdgu,
  204. culRandIOBytes,
  205. culRandIOBytes,
  206. &ptcsBuffer);
  207. DH_HRCHECK(hr, TEXT("GenerateRandomString")) ;
  208. }
  209. if (S_OK == hr)
  210. {
  211. hr = pvsnRootNewChildStream->Write(
  212. ptcsBuffer,
  213. culRandIOBytes,
  214. &culWritten);
  215. }
  216. if (S_OK != hr)
  217. {
  218. DH_TRACE((
  219. DH_LVL_TRACE1,
  220. TEXT("IStream::Write function wasn't successful, hr=0x%lx."),
  221. hr));
  222. }
  223. // Delete temp buffer
  224. if(NULL != ptcsBuffer)
  225. {
  226. delete []ptcsBuffer;
  227. ptcsBuffer = NULL;
  228. }
  229. }
  230. // Commit root. BUGBUG: Use random modes
  231. if (S_OK == hr)
  232. {
  233. hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
  234. }
  235. if (S_OK == hr)
  236. {
  237. DH_TRACE((
  238. DH_LVL_TRACE1,
  239. TEXT("VirtualCtrNode::Commit completed successfully.")));
  240. }
  241. else
  242. {
  243. DH_TRACE((
  244. DH_LVL_TRACE1,
  245. TEXT("VirtualCtrNode::Commit wasn't successful, hr=0x%lx."),
  246. hr));
  247. }
  248. // Release stream
  249. if (S_OK == hr)
  250. {
  251. hr = pvsnRootNewChildStream->Close();
  252. }
  253. if (S_OK == hr)
  254. {
  255. DH_TRACE((
  256. DH_LVL_TRACE1,
  257. TEXT("VirtualStmNode::Close completed successfully.")));
  258. }
  259. else
  260. {
  261. DH_TRACE((
  262. DH_LVL_TRACE1,
  263. TEXT("VirtulaStmNode::Close unsuccessful, hr=0x%lx."),
  264. hr));
  265. }
  266. // Release root
  267. if (S_OK == hr)
  268. {
  269. hr = pVirtualDFRoot->Close();
  270. }
  271. if (S_OK == hr)
  272. {
  273. DH_TRACE((
  274. DH_LVL_TRACE1,
  275. TEXT("VirtualCtrNode::Close completed successfully.")));
  276. }
  277. else
  278. {
  279. DH_TRACE((
  280. DH_LVL_TRACE1,
  281. TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
  282. hr));
  283. }
  284. // if everything goes well, log test as passed else failed.
  285. if (S_OK == hr)
  286. {
  287. DH_LOG((LOG_PASS, TEXT("Test variation MISCTEST_100 passed.")) );
  288. }
  289. else
  290. {
  291. DH_LOG((LOG_FAIL,
  292. TEXT("Test variation MISCTEST_100 failed, hr = 0x%lx."),
  293. hr) );
  294. }
  295. // Cleanup
  296. CleanupTestDocfile (&pVirtualDFRoot,
  297. &pTestVirtualDF,
  298. &pTestChanceDF,
  299. S_OK == hr);
  300. // Delete temp strings
  301. if (NULL != pRootNewChildStmName)
  302. {
  303. delete pRootNewChildStmName;
  304. pRootNewChildStmName = NULL;
  305. }
  306. // Stop logging the test
  307. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_100 finished")) );
  308. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  309. return hr;
  310. }
  311. //----------------------------------------------------------------------------
  312. //
  313. // Test: MISCTEST_101
  314. //
  315. // Synopsis: Create a docfile over the net using READWRITE|TRANSACTED|
  316. // DENYWRITE. 50% chance this docfile will be committed. Then
  317. // open the same file again over the net using READ|TRANSACTED|
  318. // DENYNONE. This test doesn't need to be run across the net, but
  319. // for what we are testing, this is the interesting variation.
  320. // (from old test)
  321. //
  322. // Arguments:[argc]
  323. // [argv]
  324. //
  325. // Returns: HRESULT
  326. //
  327. // History: 5-Aug-1996 JiminLi Created.
  328. //
  329. // Notes: There are no special parameterized operation modes for this
  330. // test.
  331. //
  332. // New Test Notes:
  333. // 1. Old File: DFWFWOP.CXX
  334. // 2. Old name of test : MiscWindowForWorkGroupsOpen Test
  335. // New Name of test : MISCTEST_101
  336. // 3. To run the test, do the following at command prompt.
  337. // a. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-101
  338. // /dfRootMode:xactReadWriteShDenyW /logloc:2 /traceloc:2 /labmode
  339. //
  340. // BUGNOTE: Conversion: MISCTEST-101
  341. //
  342. //-----------------------------------------------------------------------------
  343. HRESULT MISCTEST_101(int argc, char *argv[])
  344. {
  345. HRESULT hr = S_OK;
  346. ChanceDF *pTestChanceDF = NULL;
  347. VirtualDF *pTestVirtualDF = NULL;
  348. VirtualCtrNode *pVirtualDFRoot = NULL;
  349. DG_INTEGER *pdgi = NULL;
  350. USHORT usErr = 0;
  351. LPTSTR pRootDocFileName = NULL;
  352. LPOLESTR pOleStrTemp = NULL;
  353. LPSTORAGE pStgDFRoot1 = NULL;
  354. LPSTORAGE pStgDFRoot2 = NULL;
  355. DWORD dwRootMode = 0;
  356. ULONG culRandomCommit = 0;
  357. ULONG ulRef = 0;
  358. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_101"));
  359. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  360. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_101 started.")) );
  361. DH_TRACE((DH_LVL_TRACE1, TEXT("MiscWindowsForWorkGroupOpen test.")));
  362. // Create our ChanceDF and VirtualDF
  363. hr = CreateTestDocfile (argc,
  364. argv,
  365. &pVirtualDFRoot,
  366. &pTestVirtualDF,
  367. &pTestChanceDF);
  368. // if creating the docfile - bail here
  369. if (NULL != pTestChanceDF && DoingCreate ())
  370. {
  371. UINT ulSeed = pTestChanceDF->GetSeed ();
  372. CleanupTestDocfile (&pVirtualDFRoot,
  373. &pTestVirtualDF,
  374. &pTestChanceDF,
  375. FALSE);
  376. return (HRESULT)ulSeed;
  377. }
  378. if (S_OK == hr)
  379. {
  380. dwRootMode = pTestChanceDF->GetRootMode();
  381. DH_TRACE((
  382. DH_LVL_TRACE1,
  383. TEXT("Run Mode for MISCTEST_101, Access mode: %lx"),
  384. dwRootMode));
  385. }
  386. // Get DG_INTEGER object pointer
  387. if (S_OK == hr)
  388. {
  389. pdgi = pTestVirtualDF->GetDataGenInteger();
  390. DH_ASSERT(NULL != pdgi) ;
  391. }
  392. // 50% chance commit root. BUGBUG: Use random modes
  393. if (S_OK == hr)
  394. {
  395. usErr = pdgi->Generate(&culRandomCommit, 1, 100);
  396. if (DG_RC_SUCCESS != usErr)
  397. {
  398. hr = E_FAIL;
  399. }
  400. }
  401. // Get the _pstg of the root storage, for later release
  402. if (S_OK == hr)
  403. {
  404. pStgDFRoot1 = pVirtualDFRoot->GetIStoragePointer();
  405. DH_ASSERT(NULL != pStgDFRoot1);
  406. }
  407. if ((S_OK == hr) && (culRandomCommit > 50))
  408. {
  409. hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
  410. if (S_OK == hr)
  411. {
  412. DH_TRACE((
  413. DH_LVL_TRACE1,
  414. TEXT("VirtualCtrNode::Commit completed successfully.")));
  415. }
  416. else
  417. {
  418. DH_TRACE((
  419. DH_LVL_TRACE1,
  420. TEXT("VirtualCtrNode::Commit wasn't successful, hr=0x%lx."),
  421. hr));
  422. }
  423. }
  424. // Open same docfile again using READ|TRANSACTED|DENYNONE.
  425. if (S_OK == hr)
  426. {
  427. if (NULL != pVirtualDFRoot)
  428. {
  429. pRootDocFileName= new TCHAR[_tcslen (pTestVirtualDF->GetDocFileName ())+1];
  430. if (pRootDocFileName != NULL)
  431. {
  432. _tcscpy (pRootDocFileName, pTestVirtualDF->GetDocFileName());
  433. }
  434. else
  435. {
  436. hr = E_FAIL;
  437. DH_TRACE ((DH_LVL_ERROR, TEXT("unable to get/copy DocFilename")));
  438. }
  439. }
  440. }
  441. if(S_OK == hr)
  442. {
  443. // Convert the name of the docfile to OLECHAR
  444. hr = TStringToOleString(pRootDocFileName, &pOleStrTemp);
  445. DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
  446. }
  447. if (S_OK == hr)
  448. {
  449. hr = StgOpenStorage(
  450. pOleStrTemp,
  451. NULL,
  452. STGM_READ | STGM_TRANSACTED | STGM_SHARE_DENY_NONE,
  453. NULL,
  454. 0,
  455. &pStgDFRoot2);
  456. DH_ASSERT(NULL != pStgDFRoot2);
  457. DH_HRCHECK(hr, TEXT("VirtualCtrNode::Open"));
  458. }
  459. if (S_OK == hr)
  460. {
  461. DH_TRACE((
  462. DH_LVL_TRACE1,
  463. TEXT("VirtualCtrNode::Open completed successfully.")));
  464. }
  465. else
  466. {
  467. DH_TRACE((
  468. DH_LVL_TRACE1,
  469. TEXT("VirtualCtrNode::Open unsuccessful, hr=0x%lx."),
  470. hr));
  471. }
  472. // Release root, here since we opened the docfile twice, we should
  473. // release both instances of it so that we can finally delete the
  474. // docfile from disk.
  475. if (S_OK == hr)
  476. {
  477. ulRef = pStgDFRoot2->Release();
  478. DH_ASSERT(0 == ulRef);
  479. }
  480. if (S_OK == hr)
  481. {
  482. hr = pVirtualDFRoot->Close();
  483. DH_HRCHECK(hr, TEXT("VirtualCtrNode::Close"));
  484. }
  485. if (S_OK == hr)
  486. {
  487. DH_TRACE((
  488. DH_LVL_TRACE1,
  489. TEXT("VirtualCtrNode::Close completed successfully.")));
  490. }
  491. else
  492. {
  493. DH_TRACE((
  494. DH_LVL_TRACE1,
  495. TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
  496. hr));
  497. }
  498. // if everything goes well, log test as passed else failed.
  499. if (S_OK == hr)
  500. {
  501. DH_LOG((LOG_PASS, TEXT("Test variation MISCTEST_101 passed.")) );
  502. }
  503. else
  504. {
  505. DH_LOG((LOG_FAIL,
  506. TEXT("Test variation MISCTEST_101 failed, hr = 0x%lx."),
  507. hr) );
  508. }
  509. // Cleanup
  510. CleanupTestDocfile (&pVirtualDFRoot,
  511. &pTestVirtualDF,
  512. &pTestChanceDF,
  513. S_OK == hr);
  514. // Delete temp strings
  515. if (NULL != pOleStrTemp)
  516. {
  517. delete pOleStrTemp;
  518. pOleStrTemp = NULL;
  519. }
  520. if (NULL != pRootDocFileName)
  521. {
  522. delete pRootDocFileName;
  523. pRootDocFileName = NULL;
  524. }
  525. // Stop logging the test
  526. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_101 finished")) );
  527. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  528. return hr;
  529. }
  530. //----------------------------------------------------------------------------
  531. //
  532. // Test: MISCTEST_102
  533. //
  534. // Synopsis: This test measures performance for various docfile operations
  535. // as compared to the equivalent C runtime operations.
  536. //
  537. // Arguments:[argc]
  538. // [argv]
  539. //
  540. // Returns: HRESULT
  541. //
  542. // History: 6-Aug-1996 JiminLi Created.
  543. //
  544. // Notes: This test runs in direct, transacted, and transacted deny write
  545. // modes
  546. //
  547. // New Test Notes:
  548. // 1. Old File: PERFTIME.CXX
  549. // 2. Old name of test : PerformanceTiming Test
  550. // New Name of test : MISCTEST_102
  551. // 3. To run the test, do the following at command prompt.
  552. // a. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  553. // /dfRootMode:dirReadWriteShEx /logloc:2 /traceloc:2 /labmode
  554. // b. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  555. // /dfRootMode:xactReadWriteShEx /logloc:2 /traceloc:2 /labmode
  556. // c. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  557. // /dfRootMode:xactReadWriteShDenyW /logloc:2 /traceloc:2 /labmode
  558. // d. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  559. // /dfRootMode:dirReadWriteShEx /stdblock /logloc:2 /traceloc:2 /labmode
  560. // e. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  561. // /dfRootMode:xactReadWriteShEx /stdblock /logloc:2 /traceloc:2 /labmode
  562. // f. stgbase /seed:0 /dfdepth:0-0 /dfstg:0-0 /dfstm:0-0 /t:MISCTEST-102
  563. // /dfRootMode:xactReadWriteShDenyW /stdblock /logloc:2 /traceloc:2
  564. // /labmode
  565. //
  566. // BUGNOTE: Conversion: MISCTEST-102
  567. //
  568. //-----------------------------------------------------------------------------
  569. HRESULT MISCTEST_102(int argc, char *argv[])
  570. {
  571. HRESULT hr = S_OK;
  572. ChanceDF *pTestChanceDF = NULL;
  573. VirtualDF *pTestVirtualDF = NULL;
  574. VirtualCtrNode *pVirtualDFRoot = NULL;
  575. DG_STRING *pdgu = NULL;
  576. DG_INTEGER *pdgi = NULL;
  577. USHORT usErr = 0;
  578. DWORD dwRootMode = 0;
  579. ULONG ulChunkSize = 0;
  580. ULONG culArrayIndex = 0;
  581. ULONG cStartIndex = 6;
  582. ULONG ulNumofChunks = 0;
  583. ULONG culBytesLeft = 0;
  584. USHORT usIndex1 = 0;
  585. USHORT usIndex2 = 0;
  586. LONG lAvgDocfileTime = 0;
  587. LONG lAvgRuntimeTime = 0;
  588. double dSDDocfile, dSDRuntime, *pdDocRunDiff;
  589. double dAvgDocfileTime, dTotalDocfileTime, dTotalRuntimeTime;
  590. double dDocDiffTime;
  591. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_102"));
  592. pdDocRunDiff = NULL;
  593. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  594. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_102 started.")) );
  595. DH_TRACE((
  596. DH_LVL_TRACE1,
  597. TEXT("Attempt measure performance for various docfile operations")));
  598. // Create our ChanceDF and VirtualDF
  599. hr = CreateTestDocfile (argc,
  600. argv,
  601. &pVirtualDFRoot,
  602. &pTestVirtualDF,
  603. &pTestChanceDF);
  604. // if creating the docfile - bail here
  605. if (NULL != pTestChanceDF && DoingCreate ())
  606. {
  607. UINT ulSeed = pTestChanceDF->GetSeed ();
  608. CleanupTestDocfile (&pVirtualDFRoot,
  609. &pTestVirtualDF,
  610. &pTestChanceDF,
  611. FALSE);
  612. return (HRESULT)ulSeed;
  613. }
  614. if (S_OK == hr)
  615. {
  616. dwRootMode = pTestChanceDF->GetRootMode();
  617. DH_TRACE((
  618. DH_LVL_TRACE1,
  619. TEXT("Run Mode for MISCTEST_102, Access mode: %lx"),
  620. dwRootMode));
  621. }
  622. // Get DG_STRING object pointer
  623. if (S_OK == hr)
  624. {
  625. pdgu = pTestVirtualDF->GetDataGenUnicode();
  626. DH_ASSERT(NULL != pdgu) ;
  627. }
  628. // Get DG_INTEGER object pointer
  629. if (S_OK == hr)
  630. {
  631. pdgi = pTestVirtualDF->GetDataGenInteger();
  632. DH_ASSERT(NULL != pdgi) ;
  633. }
  634. // Generate stream size b/w MIN_SIZE and MIN_SIZE*1.5
  635. if (S_OK == hr)
  636. {
  637. usErr = pdgi->Generate(
  638. &ulStreamSize,
  639. (ULONG)MIN_SIZE,
  640. (ULONG) (MIN_SIZE * 1.5));
  641. if (DG_RC_SUCCESS != usErr)
  642. {
  643. hr = E_FAIL;
  644. }
  645. }
  646. // Generate chunk size for each WRITE/READ operation
  647. if (S_OK == hr)
  648. {
  649. if (TRUE == g_fUseStdBlk)
  650. {
  651. // Pick up a random array element. Choosing cStartIndex of the
  652. // array (with random blocks) as 6 because do not want to write
  653. // byte by byte or in too small chunks a large docfile.
  654. usErr = pdgi->Generate(&culArrayIndex, cStartIndex, MAX_SIZE_ARRAY);
  655. if (DG_RC_SUCCESS != usErr)
  656. {
  657. hr = E_FAIL;
  658. }
  659. else
  660. {
  661. ulChunkSize = ausSIZE_ARRAY[culArrayIndex];
  662. }
  663. }
  664. else
  665. {
  666. // Generate random number of bytes to write per chunk b/w
  667. // RAND_IO_MIN and RAND_IO_MAX.
  668. usErr = pdgi->Generate(&ulChunkSize, RAND_IO_MIN, RAND_IO_MAX);
  669. if (DG_RC_SUCCESS != usErr)
  670. {
  671. hr = E_FAIL;
  672. }
  673. }
  674. }
  675. // Calculate how many chunks be written
  676. if (S_OK == hr)
  677. {
  678. culBytesLeft = ulStreamSize;
  679. if (0 == ulChunkSize)
  680. {
  681. hr = E_FAIL;
  682. }
  683. else
  684. {
  685. while (0 != culBytesLeft)
  686. {
  687. ulNumofChunks++;
  688. if (culBytesLeft >= ulChunkSize)
  689. {
  690. culBytesLeft -= ulChunkSize;
  691. }
  692. else
  693. {
  694. culBytesLeft = 0;
  695. }
  696. }
  697. }
  698. }
  699. if (S_OK == hr)
  700. {
  701. ulSeekOffset = new ULONG[ulNumofChunks];
  702. // Generate the seek offsets for the random READ/WRITE operations
  703. for (usIndex1=0; usIndex1<ulNumofChunks; usIndex1++)
  704. {
  705. usErr = pdgi->Generate(
  706. &ulSeekOffset[usIndex1],
  707. 0L,
  708. ulStreamSize - ulChunkSize);
  709. if (DG_RC_SUCCESS != usErr)
  710. {
  711. hr = E_FAIL;
  712. }
  713. if (S_OK != hr)
  714. {
  715. break;
  716. }
  717. }
  718. }
  719. if (S_OK == hr)
  720. {
  721. // Allocate the array for storing times
  722. for (usIndex1=FIRST_TIMING+1; usIndex1<LAST_TIMING; usIndex1++)
  723. {
  724. Time[usIndex1].plDocfileTime = (LONG *) new
  725. LONG[(usIterations)*sizeof(LONG)];
  726. Time[usIndex1].plRuntimeTime = (LONG *) new
  727. LONG[(usIterations)*sizeof(LONG)];
  728. if ((NULL == Time[usIndex1].plDocfileTime) ||
  729. (NULL == Time[usIndex1].plRuntimeTime))
  730. {
  731. hr = E_OUTOFMEMORY;
  732. }
  733. else
  734. {
  735. memset(
  736. Time[usIndex1].plDocfileTime,
  737. -1,
  738. usIterations*sizeof(LONG));
  739. memset(
  740. Time[usIndex1].plDocfileTime,
  741. -1,
  742. usIterations*sizeof(LONG));
  743. }
  744. if (S_OK != hr)
  745. {
  746. break;
  747. }
  748. }
  749. if (S_OK == hr)
  750. {
  751. pdDocRunDiff = new double[usIterations];
  752. if (NULL == pdDocRunDiff)
  753. {
  754. hr = E_OUTOFMEMORY;
  755. }
  756. }
  757. // Test for StreamCreate
  758. if (S_OK == hr)
  759. {
  760. hr = StreamCreate(
  761. dwRootMode,
  762. pdgu,
  763. CREATE_STREAM_NO_EXIST,
  764. DOCFILE | COMMIT,
  765. usIterations);
  766. }
  767. if (S_OK == hr)
  768. {
  769. hr = StreamCreate(
  770. dwRootMode,
  771. pdgu,
  772. CREATE_STREAM_NO_EXIST,
  773. RUNTIME | COMMIT,
  774. usIterations);
  775. }
  776. if (S_OK == hr)
  777. {
  778. hr = StreamCreate(
  779. dwRootMode,
  780. pdgu,
  781. CREATE_STREAM_EXIST,
  782. DOCFILE | EXIST | COMMIT,
  783. usIterations);
  784. }
  785. if (S_OK == hr)
  786. {
  787. hr = StreamCreate(
  788. dwRootMode,
  789. pdgu,
  790. CREATE_STREAM_EXIST,
  791. RUNTIME | EXIST | COMMIT,
  792. usIterations);
  793. }
  794. if (S_OK != hr)
  795. {
  796. DH_TRACE((DH_LVL_TRACE1, TEXT("Error in StreamCreate")));
  797. }
  798. // Test for DocfileCreate
  799. if (S_OK == hr)
  800. {
  801. hr = DocfileCreate(
  802. dwRootMode,
  803. pdgu,
  804. CREATE_DOCFILE_NO_EXIST,
  805. DOCFILE | COMMIT,
  806. usIterations);
  807. }
  808. if (S_OK == hr)
  809. {
  810. hr = DocfileCreate(
  811. dwRootMode,
  812. pdgu,
  813. CREATE_DOCFILE_NO_EXIST,
  814. RUNTIME | COMMIT,
  815. usIterations);
  816. }
  817. if (S_OK == hr)
  818. {
  819. hr = DocfileCreate(
  820. dwRootMode,
  821. pdgu,
  822. CREATE_DOCFILE_EXIST,
  823. DOCFILE | EXIST | COMMIT,
  824. usIterations);
  825. }
  826. if (S_OK == hr)
  827. {
  828. hr = DocfileCreate(
  829. dwRootMode,
  830. pdgu,
  831. CREATE_NONAME_DOCFILE,
  832. DOCFILE | NONAME | COMMIT,
  833. usIterations);
  834. }
  835. if (S_OK != hr)
  836. {
  837. DH_TRACE((DH_LVL_TRACE1, TEXT("Error in DocfileCreate")));
  838. }
  839. // Test for StreamOpen
  840. if (S_OK == hr)
  841. {
  842. hr = StreamOpen(
  843. dwRootMode,
  844. pdgu,
  845. OPEN_STORAGE_AND_STREAM,
  846. DOCFILE | COMMIT | OPENBOTH,
  847. usIterations);
  848. }
  849. if (S_OK == hr)
  850. {
  851. hr = StreamOpen(
  852. dwRootMode,
  853. pdgu,
  854. OPEN_STORAGE_AND_STREAM,
  855. RUNTIME | COMMIT | OPENBOTH,
  856. usIterations);
  857. }
  858. if (S_OK == hr)
  859. {
  860. hr = StreamOpen(
  861. dwRootMode,
  862. pdgu,
  863. OPEN_STREAM_ONLY,
  864. DOCFILE | COMMIT,
  865. usIterations);
  866. }
  867. if (S_OK == hr)
  868. {
  869. hr = StreamOpen(
  870. dwRootMode,
  871. pdgu,
  872. OPEN_STREAM_ONLY,
  873. RUNTIME | COMMIT,
  874. usIterations);
  875. }
  876. if (S_OK != hr)
  877. {
  878. DH_TRACE((DH_LVL_TRACE1, TEXT("Error in StreamOpen")));
  879. }
  880. // Generate an array of file names to use for the test
  881. if (S_OK == hr)
  882. {
  883. for (usIndex1=0; usIndex1<MAX_DOCFILES; usIndex1++)
  884. {
  885. hr = GenerateRandomName(
  886. pdgu,
  887. MINLENGTH,
  888. MAXLENGTH,
  889. &ptszNames[usIndex1]);
  890. DH_HRCHECK(hr, TEXT("GenerateRandomName")) ;
  891. if (S_OK != hr)
  892. {
  893. break;
  894. }
  895. }
  896. }
  897. // Sequential operations
  898. if (S_OK == hr)
  899. {
  900. for (usIndex1=0; usIndex1<usIterations; usIndex1++)
  901. {
  902. hr = WriteStreamInSameSizeChunks(
  903. dwRootMode,
  904. pdgu,
  905. SEQUENTIAL_WRITE,
  906. DOCFILE,
  907. ulChunkSize,
  908. usIndex1);
  909. if (S_OK == hr)
  910. {
  911. hr = ReadStreamInSameSizeChunks(
  912. dwRootMode,
  913. SEQUENTIAL_READ,
  914. DOCFILE,
  915. ulChunkSize,
  916. usIndex1);
  917. }
  918. if (S_OK == hr)
  919. {
  920. hr = WriteStreamInSameSizeChunks(
  921. dwRootMode,
  922. pdgu,
  923. SEQUENTIAL_WRITE,
  924. RUNTIME,
  925. ulChunkSize,
  926. usIndex1);
  927. }
  928. if (S_OK == hr)
  929. {
  930. hr = ReadStreamInSameSizeChunks(
  931. dwRootMode,
  932. SEQUENTIAL_READ,
  933. RUNTIME,
  934. ulChunkSize,
  935. usIndex1);
  936. }
  937. if (S_OK != hr)
  938. {
  939. DH_TRACE((DH_LVL_TRACE1, TEXT("Error in seq. write/read")));
  940. break;
  941. }
  942. }
  943. }
  944. // Random operations
  945. if (S_OK == hr)
  946. {
  947. for (usIndex1=0; usIndex1<usIterations; usIndex1++)
  948. {
  949. hr = WriteStreamInSameSizeChunks(
  950. dwRootMode,
  951. pdgu,
  952. RANDOM_WRITE,
  953. DOCFILE,
  954. ulChunkSize,
  955. usIndex1);
  956. if (S_OK == hr)
  957. {
  958. hr = ReadStreamInSameSizeChunks(
  959. dwRootMode,
  960. RANDOM_READ,
  961. DOCFILE,
  962. ulChunkSize,
  963. usIndex1);
  964. }
  965. if (S_OK == hr)
  966. {
  967. hr = WriteStreamInSameSizeChunks(
  968. dwRootMode,
  969. pdgu,
  970. RANDOM_WRITE,
  971. RUNTIME,
  972. ulChunkSize,
  973. usIndex1);
  974. }
  975. if (S_OK == hr)
  976. {
  977. hr = ReadStreamInSameSizeChunks(
  978. dwRootMode,
  979. RANDOM_READ,
  980. RUNTIME,
  981. ulChunkSize,
  982. usIndex1);
  983. }
  984. if (S_OK != hr)
  985. {
  986. DH_TRACE((DH_LVL_TRACE1, TEXT("Error in random write/read")));
  987. break;
  988. }
  989. }
  990. }
  991. // Delete all files on disk
  992. if (S_OK == hr)
  993. {
  994. for (usIndex1=0; usIndex1<MAX_DOCFILES; usIndex1++)
  995. {
  996. if (NULL != ptszNames[usIndex1])
  997. {
  998. if(FALSE == DeleteFile(ptszNames[usIndex1]))
  999. {
  1000. hr = HRESULT_FROM_WIN32(GetLastError()) ;
  1001. DH_HRCHECK(hr, TEXT("DeleteFile")) ;
  1002. }
  1003. }
  1004. if (S_OK != hr)
  1005. {
  1006. break;
  1007. }
  1008. }
  1009. }
  1010. // Delete temp strings
  1011. for (usIndex1=0; usIndex1<MAX_DOCFILES; usIndex1++)
  1012. {
  1013. if (NULL != ptszNames[usIndex1])
  1014. {
  1015. delete []ptszNames[usIndex1];
  1016. ptszNames[usIndex1] = NULL;
  1017. }
  1018. }
  1019. if (NULL != ulSeekOffset)
  1020. {
  1021. delete []ulSeekOffset;
  1022. ulSeekOffset = NULL;
  1023. }
  1024. }
  1025. // Report statistics result for this run
  1026. if (S_OK == hr)
  1027. {
  1028. DH_TRACE((
  1029. DH_LVL_TRACE1,
  1030. TEXT("\n\nTest was run %u iterations"), usIterations));
  1031. DH_TRACE((
  1032. DH_LVL_TRACE1,
  1033. TEXT("Test Type\t\tDocFile\t\tRuntime\t\tDocFile-RunTime\t\tDocFile\tRuntime")));
  1034. DH_TRACE((
  1035. DH_LVL_TRACE1,
  1036. TEXT(" \t\tavg (SD)\tavg (SD)\taverage (X) (SD)\ttotal\ttotal")));
  1037. DH_TRACE((
  1038. DH_LVL_TRACE1,
  1039. TEXT("=========\t\t=======\t\t=======\t\t===============\t\t=======\t=======")));
  1040. for (usIndex1=FIRST_TIMING+1; usIndex1<LAST_TIMING; usIndex1++)
  1041. {
  1042. Statistics(
  1043. Time[usIndex1].plDocfileTime,
  1044. usIterations,
  1045. &lAvgDocfileTime,
  1046. &dTotalDocfileTime,
  1047. &dSDDocfile);
  1048. Statistics(
  1049. Time[usIndex1].plRuntimeTime,
  1050. usIterations,
  1051. &lAvgRuntimeTime,
  1052. &dTotalRuntimeTime,
  1053. &dSDRuntime);
  1054. DH_TRACE((DH_LVL_TRACE1, TEXT("%s"), Time[usIndex1].Text));
  1055. DH_TRACE((DH_LVL_TRACE1, TEXT("\t%6.1ld"), lAvgDocfileTime));
  1056. DH_TRACE((DH_LVL_TRACE1, TEXT(" (%3.1f)"), dSDDocfile));
  1057. if (0 > dTotalRuntimeTime)
  1058. {
  1059. DH_TRACE((DH_LVL_TRACE1, TEXT("\t")));
  1060. DH_TRACE((DH_LVL_TRACE1, TEXT("\t")));
  1061. DH_TRACE((DH_LVL_TRACE1, TEXT("\t")));
  1062. }
  1063. else
  1064. {
  1065. DH_TRACE((DH_LVL_TRACE1, TEXT("\t%6.1ld"), lAvgRuntimeTime));
  1066. DH_TRACE((DH_LVL_TRACE1, TEXT(" (%2.1f)"), dSDRuntime));
  1067. DH_TRACE((
  1068. DH_LVL_TRACE1,
  1069. TEXT("\t%6.1f"),
  1070. (dTotalDocfileTime - dTotalRuntimeTime)/usIterations));
  1071. }
  1072. if (0 < dTotalRuntimeTime)
  1073. {
  1074. DH_TRACE((
  1075. DH_LVL_TRACE1,
  1076. TEXT(" (%2.1fx)"), dTotalDocfileTime / dTotalRuntimeTime));
  1077. for (usIndex2=0; usIndex2<usIterations; usIndex2++)
  1078. {
  1079. pdDocRunDiff[usIndex2] =
  1080. ((float) Time[usIndex1].plDocfileTime[usIndex2]) /
  1081. (Time[usIndex1].plRuntimeTime[usIndex2] + 1);
  1082. }
  1083. Statistics(
  1084. pdDocRunDiff,
  1085. usIterations,
  1086. &dAvgDocfileTime,
  1087. &dDocDiffTime,
  1088. &dSDDocfile);
  1089. DH_TRACE((DH_LVL_TRACE1, TEXT(" (+- %2.1f)"), dSDDocfile));
  1090. }
  1091. else
  1092. {
  1093. DH_TRACE((DH_LVL_TRACE1, TEXT(" \t")));
  1094. }
  1095. DH_TRACE((DH_LVL_TRACE1, TEXT("\t%6.1f"), dTotalDocfileTime));
  1096. if (0 <= dTotalRuntimeTime)
  1097. {
  1098. DH_TRACE((DH_LVL_TRACE1, TEXT("\t%6.1f "), dTotalRuntimeTime));
  1099. }
  1100. else
  1101. {
  1102. DH_TRACE((DH_LVL_TRACE1, TEXT("\t")));
  1103. }
  1104. if (NULL != Time[usIndex1].plDocfileTime)
  1105. {
  1106. delete Time[usIndex1].plDocfileTime;
  1107. Time[usIndex1].plDocfileTime = NULL;
  1108. }
  1109. if (NULL != Time[usIndex1].plRuntimeTime)
  1110. {
  1111. delete Time[usIndex1].plRuntimeTime;
  1112. Time[usIndex1].plRuntimeTime = NULL;
  1113. }
  1114. }
  1115. if (NULL != pdDocRunDiff)
  1116. {
  1117. delete []pdDocRunDiff;
  1118. pdDocRunDiff = NULL;
  1119. }
  1120. DH_TRACE((
  1121. DH_LVL_TRACE1,
  1122. TEXT("\nNote: All times are measured in milliseconds(accuracy of +- 55).")));
  1123. }
  1124. // Release root
  1125. if (S_OK == hr)
  1126. {
  1127. hr = pVirtualDFRoot->Close();
  1128. }
  1129. if (S_OK == hr)
  1130. {
  1131. DH_TRACE((
  1132. DH_LVL_TRACE1,
  1133. TEXT("VirtualCtrNode::Close completed successfully.")));
  1134. }
  1135. else
  1136. {
  1137. DH_TRACE((
  1138. DH_LVL_TRACE1,
  1139. TEXT("VirtualCtrNode::Close unsuccessful, hr=0x%lx."),
  1140. hr));
  1141. }
  1142. // if everything goes well, log test as passed else failed.
  1143. if (S_OK == hr)
  1144. {
  1145. DH_LOG((LOG_PASS, TEXT("Test variation MISCTEST_102 passed.")) );
  1146. }
  1147. else
  1148. {
  1149. DH_LOG((LOG_FAIL,
  1150. TEXT("Test variation MISCTEST_102 failed, hr = 0x%lx."),
  1151. hr) );
  1152. }
  1153. // Cleanup
  1154. CleanupTestDocfile (&pVirtualDFRoot,
  1155. &pTestVirtualDF,
  1156. &pTestChanceDF,
  1157. S_OK == hr);
  1158. // Stop logging the test
  1159. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_102 finished")) );
  1160. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  1161. return hr;
  1162. }
  1163. //----------------------------------------------------------------------------
  1164. //
  1165. // Test: MISCTEST_103
  1166. //
  1167. // Synopsis: Coverage for NTbug 117010. Test that we can't create a storage
  1168. // if a stream with the same name already exists.
  1169. //
  1170. // Arguments:[argc]
  1171. // [argv]
  1172. //
  1173. // Returns: HRESULT
  1174. //
  1175. // History: 9-Dec-1997 BogdanT Created.
  1176. //
  1177. //-----------------------------------------------------------------------------
  1178. HRESULT MISCTEST_103(int argc, char *argv[])
  1179. {
  1180. HRESULT hr = S_OK;
  1181. LPTSTR ptszFileName = NULL;
  1182. LPOLESTR poleFileName = NULL;
  1183. LPTSTR ptszStmName = NULL;
  1184. LPOLESTR poleStmName = NULL;
  1185. DG_STRING *pdgu = NULL;
  1186. DG_INTEGER *pdgi = NULL;
  1187. ULONG ulSeed = 0;
  1188. LPSTORAGE pRootStg = NULL;
  1189. LPSTORAGE pStg = NULL;
  1190. LPSTREAM pStm = NULL;
  1191. BOOL fTransacted = FALSE;
  1192. DWORD dwMode = STGM_CREATE |
  1193. STGM_READWRITE |
  1194. STGM_SHARE_EXCLUSIVE;
  1195. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_103"));
  1196. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  1197. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_103 started.")) );
  1198. ulSeed = GetSeedFromCmdLineArgs(argc, argv);
  1199. pdgu = new(NullOnFail) DG_STRING(ulSeed);
  1200. ulSeed = pdgu->GetSeed();
  1201. if (NULL == pdgu)
  1202. {
  1203. hr = E_OUTOFMEMORY;
  1204. DH_HRCHECK(hr, TEXT("new DG_STRING")) ;
  1205. }
  1206. pdgi = new(NullOnFail) DG_INTEGER(ulSeed);
  1207. if (NULL == pdgi)
  1208. {
  1209. hr = E_OUTOFMEMORY;
  1210. DH_HRCHECK(hr, TEXT("new DG_INTEGER")) ;
  1211. }
  1212. pdgi->Generate(&fTransacted, 0, 1);
  1213. if(fTransacted)
  1214. {
  1215. DH_TRACE((DH_LVL_ALWAYS,
  1216. TEXT("Transacted mode")));
  1217. dwMode |= STGM_TRANSACTED;
  1218. }
  1219. if(S_OK == hr)
  1220. {
  1221. // Generate random filename
  1222. hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&ptszFileName);
  1223. DH_HRCHECK(hr, TEXT("GenerateRandomName pFileName")) ;
  1224. }
  1225. if(S_OK == hr)
  1226. {
  1227. hr = TStringToOleString(ptszFileName, &poleFileName);
  1228. DH_HRCHECK(hr, TEXT("TStringToOleString poleFileName"));
  1229. }
  1230. if(S_OK == hr)
  1231. {
  1232. hr = StgCreateDocfile(poleFileName,
  1233. dwMode | STGM_DELETEONRELEASE,
  1234. 0,
  1235. &pRootStg);
  1236. DH_HRCHECK(hr, TEXT("StgCreateDocfile")) ;
  1237. }
  1238. if(S_OK == hr)
  1239. {
  1240. // Generate random name for stream&storage
  1241. hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&ptszStmName);
  1242. DH_HRCHECK(hr, TEXT("GenerateRandomName pStmName")) ;
  1243. }
  1244. if(S_OK == hr)
  1245. {
  1246. hr = TStringToOleString(ptszStmName, &poleStmName);
  1247. DH_HRCHECK(hr, TEXT("TStringToOleString poleStmName"));
  1248. }
  1249. if(S_OK == hr)
  1250. {
  1251. hr = pRootStg->CreateStream(poleStmName,
  1252. STGM_CREATE |
  1253. STGM_READWRITE |
  1254. STGM_SHARE_EXCLUSIVE,
  1255. 0,
  1256. 0,
  1257. &pStm);
  1258. DH_HRCHECK(hr, TEXT("CreateStream")) ;
  1259. }
  1260. if(S_OK == hr)
  1261. {
  1262. hr = pRootStg->CreateStorage(poleStmName,
  1263. dwMode,
  1264. 0,
  1265. 0,
  1266. &pStg);
  1267. if(S_OK == hr)
  1268. {
  1269. DH_TRACE((
  1270. DH_LVL_ERROR,
  1271. TEXT("Storage over stream succeeded!!!")));
  1272. hr = E_FAIL;
  1273. }
  1274. else
  1275. {
  1276. hr = S_OK;
  1277. }
  1278. }
  1279. if(S_OK == hr)
  1280. {
  1281. DH_LOG((LOG_PASS, TEXT("MISCTEST_103")) );
  1282. }
  1283. else
  1284. {
  1285. DH_LOG((LOG_FAIL, TEXT("MISCTEST_103")) );
  1286. DH_DUMPCMD((LOG_FAIL, TEXT(" /seed:%u"), ulSeed));
  1287. }
  1288. if(NULL != pStg)
  1289. {
  1290. pStg->Release();
  1291. }
  1292. if(NULL != pRootStg)
  1293. {
  1294. pRootStg->Release();
  1295. }
  1296. delete[] ptszFileName;
  1297. delete[] poleFileName;
  1298. delete[] ptszStmName;
  1299. delete[] poleStmName;
  1300. delete pdgu;
  1301. delete pdgi;
  1302. return hr;
  1303. }
  1304. //----------------------------------------------------------------------------
  1305. //
  1306. // Test: MISCTEST_104
  1307. //
  1308. // Synopsis: Coverage for NTbug 117010. Test that we can't create a stream
  1309. // if a storage with the same name already exists.
  1310. //
  1311. // Arguments:[argc]
  1312. // [argv]
  1313. //
  1314. // Returns: HRESULT
  1315. //
  1316. // History: 9-Dec-1997 BogdanT Created.
  1317. //
  1318. //-----------------------------------------------------------------------------
  1319. HRESULT MISCTEST_104(int argc, char *argv[])
  1320. {
  1321. HRESULT hr = S_OK;
  1322. LPTSTR ptszFileName = NULL;
  1323. LPOLESTR poleFileName = NULL;
  1324. LPTSTR ptszStmName = NULL;
  1325. LPOLESTR poleStmName = NULL;
  1326. DG_STRING *pdgu = NULL;
  1327. DG_INTEGER *pdgi = NULL;
  1328. ULONG ulSeed = 0;
  1329. LPSTORAGE pRootStg = NULL;
  1330. LPSTORAGE pStg = NULL;
  1331. LPSTREAM pStm = NULL;
  1332. BOOL fTransacted = FALSE;
  1333. DWORD dwMode = STGM_CREATE |
  1334. STGM_READWRITE |
  1335. STGM_SHARE_EXCLUSIVE;
  1336. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_104"));
  1337. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  1338. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_104 started.")) );
  1339. ulSeed = GetSeedFromCmdLineArgs(argc, argv);
  1340. pdgu = new(NullOnFail) DG_STRING(ulSeed);
  1341. ulSeed = pdgu->GetSeed();
  1342. if (NULL == pdgu)
  1343. {
  1344. hr = E_OUTOFMEMORY;
  1345. DH_HRCHECK(hr, TEXT("new DG_STRING")) ;
  1346. }
  1347. pdgi = new(NullOnFail) DG_INTEGER(ulSeed);
  1348. if (NULL == pdgi)
  1349. {
  1350. hr = E_OUTOFMEMORY;
  1351. DH_HRCHECK(hr, TEXT("new DG_INTEGER")) ;
  1352. }
  1353. pdgi->Generate(&fTransacted, 0, 1);
  1354. if(fTransacted)
  1355. {
  1356. DH_TRACE((DH_LVL_ALWAYS,
  1357. TEXT("Transacted mode")));
  1358. dwMode |= STGM_TRANSACTED;
  1359. }
  1360. if(S_OK == hr)
  1361. {
  1362. // Generate random filename
  1363. hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&ptszFileName);
  1364. DH_HRCHECK(hr, TEXT("GenerateRandomName pFileName")) ;
  1365. }
  1366. if(S_OK == hr)
  1367. {
  1368. hr = TStringToOleString(ptszFileName, &poleFileName);
  1369. DH_HRCHECK(hr, TEXT("TStringToOleString poleFileName"));
  1370. }
  1371. if(S_OK == hr)
  1372. {
  1373. hr = StgCreateDocfile(poleFileName,
  1374. dwMode | STGM_DELETEONRELEASE,
  1375. 0,
  1376. &pRootStg);
  1377. DH_HRCHECK(hr, TEXT("StgCreateDocfile")) ;
  1378. }
  1379. if(S_OK == hr)
  1380. {
  1381. // Generate random name for stream&storage
  1382. hr = GenerateRandomName(pdgu,MINLENGTH,MAXLENGTH,&ptszStmName);
  1383. DH_HRCHECK(hr, TEXT("GenerateRandomName pStmName")) ;
  1384. }
  1385. if(S_OK == hr)
  1386. {
  1387. hr = TStringToOleString(ptszStmName, &poleStmName);
  1388. DH_HRCHECK(hr, TEXT("TStringToOleString poleStmName"));
  1389. }
  1390. if(S_OK == hr)
  1391. {
  1392. hr = pRootStg->CreateStorage(poleStmName,
  1393. dwMode,
  1394. 0,
  1395. 0,
  1396. &pStg);
  1397. DH_HRCHECK(hr, TEXT("CreateStorage")) ;
  1398. }
  1399. if(S_OK == hr)
  1400. {
  1401. hr = pRootStg->CreateStream(poleStmName,
  1402. STGM_CREATE |
  1403. STGM_READWRITE |
  1404. STGM_SHARE_EXCLUSIVE,
  1405. 0,
  1406. 0,
  1407. &pStm);
  1408. if(S_OK == hr)
  1409. {
  1410. DH_TRACE((
  1411. DH_LVL_ERROR,
  1412. TEXT("Stream over storage succeeded!!!")));
  1413. hr = E_FAIL;
  1414. }
  1415. else
  1416. {
  1417. hr = S_OK;
  1418. }
  1419. }
  1420. if(S_OK == hr)
  1421. {
  1422. DH_LOG((LOG_PASS, TEXT("MISCTEST_104")) );
  1423. }
  1424. else
  1425. {
  1426. DH_LOG((LOG_FAIL, TEXT("MISCTEST_104")) );
  1427. DH_DUMPCMD((LOG_FAIL, TEXT(" /seed:%u"), ulSeed));
  1428. }
  1429. if(NULL != pStg)
  1430. {
  1431. pStg->Release();
  1432. }
  1433. if(NULL != pRootStg)
  1434. {
  1435. pRootStg->Release();
  1436. }
  1437. delete[] ptszFileName;
  1438. delete[] poleFileName;
  1439. delete[] ptszStmName;
  1440. delete[] poleStmName;
  1441. delete pdgu;
  1442. delete pdgi;
  1443. return hr;
  1444. }
  1445. //----------------------------------------------------------------------------
  1446. //
  1447. // Test: MISCTEST_105
  1448. //
  1449. // Synopsis: Coverage for NTbug 144547. Test that if we open STGM_READ we
  1450. // don't get other privileges; for that, before opening the
  1451. // storage we're opening the underlying file with read&deny write.
  1452. //
  1453. // Arguments:[argc]
  1454. // [argv]
  1455. //
  1456. // Returns: HRESULT
  1457. //
  1458. // History: 2-Mar-1998 BogdanT Created.
  1459. //
  1460. //-----------------------------------------------------------------------------
  1461. HRESULT MISCTEST_105(int argc, char *argv[])
  1462. {
  1463. HRESULT hr = S_OK;
  1464. /* HRESULT hr2 = S_OK;
  1465. ChanceDF *pTestChanceDF = NULL;
  1466. VirtualDF *pTestVirtualDF = NULL;
  1467. VirtualCtrNode *pVirtualDFRoot = NULL;
  1468. UINT ulSeed = 0;
  1469. LPTSTR pRootDocFileName = NULL;
  1470. LPOLESTR poleFileName = NULL;
  1471. LPSTORAGE pRootStg = NULL;
  1472. DWORD stgfmtOpen = 0;
  1473. HANDLE hFile = INVALID_HANDLE_VALUE;
  1474. DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("MISCTEST_105"));
  1475. DH_TRACE((DH_LVL_TRACE1, TEXT("--------------------------------------------")) );
  1476. DH_TRACE((DH_LVL_TRACE1, TEXT("Test variation MISCTEST_105 started.")) );
  1477. stgfmtOpen = STGFMT_DOCFILE;
  1478. if(StorageIsFlat())
  1479. {
  1480. stgfmtOpen = STGFMT_FILE;
  1481. }
  1482. if(DoingOpenNssfile())
  1483. {
  1484. stgfmtOpen = STGFMT_NATIVE;
  1485. }
  1486. // Create our ChanceDF and VirtualDF
  1487. hr = CreateTestDocfile (argc,
  1488. argv,
  1489. &pVirtualDFRoot,
  1490. &pTestVirtualDF,
  1491. &pTestChanceDF);
  1492. if (S_OK == hr)
  1493. {
  1494. ulSeed = pTestChanceDF->GetSeed (); // for repro line
  1495. if(NULL != pTestVirtualDF->GetDocFileName())
  1496. {
  1497. pRootDocFileName =
  1498. new TCHAR[_tcslen(pTestVirtualDF->GetDocFileName())+1];
  1499. if (pRootDocFileName == NULL)
  1500. {
  1501. hr = E_OUTOFMEMORY;
  1502. }
  1503. else
  1504. {
  1505. _tcscpy(pRootDocFileName, pTestVirtualDF->GetDocFileName());
  1506. }
  1507. DH_HRCHECK(hr, TEXT("new TCHAR"));
  1508. }
  1509. else
  1510. {
  1511. hr = TESTSTG_E_ABORT;
  1512. DH_HRCHECK(hr, TEXT("VirtualDF::GetDocFileName")) ;
  1513. }
  1514. }
  1515. if(S_OK == hr)
  1516. {
  1517. // Convert RootDocFile name to OLECHAR
  1518. hr = TStringToOleString(pRootDocFileName, &poleFileName);
  1519. DH_HRCHECK(hr, TEXT("TStringToOleString")) ;
  1520. }
  1521. // Now do a valid commit
  1522. if (S_OK == hr)
  1523. {
  1524. hr = pVirtualDFRoot->Commit(STGC_DEFAULT);
  1525. DH_HRCHECK (hr, TEXT("VirtualCtrNode::Commit"));
  1526. }
  1527. // Close the root docfile
  1528. if (NULL != pVirtualDFRoot)
  1529. {
  1530. hr2 = pVirtualDFRoot->Close();
  1531. DH_HRCHECK (hr2, TEXT("VirtualCtrNode::Close"));
  1532. hr = FirstError (hr, hr2);
  1533. }
  1534. if(S_OK == hr)
  1535. {
  1536. hFile = CreateFile(pRootDocFileName,
  1537. GENERIC_READ,
  1538. FILE_SHARE_READ,
  1539. NULL,
  1540. OPEN_EXISTING,
  1541. FILE_ATTRIBUTE_NORMAL,
  1542. NULL);
  1543. if(INVALID_HANDLE_VALUE == hFile)
  1544. {
  1545. hr = TESTSTG_E_ABORT;
  1546. DH_HRCHECK (hr, TEXT("CreateFile"));
  1547. }
  1548. }
  1549. if(S_OK == hr)
  1550. {
  1551. hr = StgOpenStorageEx(poleFileName,
  1552. STGM_READ |
  1553. STGM_SHARE_DENY_WRITE,
  1554. stgfmtOpen,
  1555. 0,
  1556. 0,
  1557. 0,
  1558. IID_IStorage,
  1559. (void**)&pRootStg);
  1560. DH_HRCHECK(hr, TEXT("StgOpenStorageEx")) ;
  1561. }
  1562. if(S_OK == hr)
  1563. {
  1564. DH_LOG((LOG_PASS, TEXT("MISCTEST_105")) );
  1565. }
  1566. else
  1567. {
  1568. DH_LOG((LOG_FAIL, TEXT("MISCTEST_105")) );
  1569. }
  1570. if(NULL != pRootStg)
  1571. {
  1572. pRootStg->Release();
  1573. }
  1574. if(INVALID_HANDLE_VALUE != hFile)
  1575. {
  1576. CloseHandle(hFile);
  1577. }
  1578. // Cleanup
  1579. CleanupTestDocfile (&pVirtualDFRoot,
  1580. &pTestVirtualDF,
  1581. &pTestChanceDF,
  1582. S_OK == hr);
  1583. delete[] pRootDocFileName;
  1584. delete[] poleFileName;
  1585. */
  1586. return hr;
  1587. }