Vincent Povirk : ole32: Add some tests for IEnumSTATSTG.
Alexandre Julliard
julliard at winehq.org
Mon Dec 21 09:39:47 CST 2009
Module: wine
Branch: master
Commit: 2010e0fb28cad8c8cba57869926558d408ea3c37
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2010e0fb28cad8c8cba57869926558d408ea3c37
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Fri Dec 18 18:36:23 2009 -0600
ole32: Add some tests for IEnumSTATSTG.
---
dlls/ole32/tests/storage32.c | 152 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 148 insertions(+), 4 deletions(-)
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 12f2504..766c83c 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -845,6 +845,8 @@ static void test_streamenum(void)
HRESULT r;
IStream *stm = NULL;
static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
+ static const WCHAR stmname2[] = { 'A','B','C','D','E','F','G','H','I',0 };
+ static const WCHAR stmname3[] = { 'A','B','C','D','E','F','G','H','I','J',0 };
STATSTG stat;
IEnumSTATSTG *ee = NULL;
ULONG count;
@@ -887,7 +889,7 @@ static void test_streamenum(void)
ok(r==S_OK, "IStorage->EnumElements failed\n");
r = IStorage_DestroyElement(stg, stmname);
- ok(r==S_OK, "IStorage->EnumElements failed\n");
+ ok(r==S_OK, "IStorage->DestroyElement failed\n");
todo_wine {
count = 0xf00;
@@ -905,11 +907,104 @@ static void test_streamenum(void)
ok(r==S_FALSE, "IEnumSTATSTG->Next failed\n");
ok(count == 0, "count wrong\n");
- r = IEnumSTATSTG_Release(ee);
- ok (r == 0, "enum not released\n");
+ /* add a stream before reading */
+ r = IEnumSTATSTG_Reset(ee);
+ ok(r==S_OK, "IEnumSTATSTG->Reset failed\n");
+
+ r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+ ok(r==S_OK, "IStorage->CreateStream failed\n");
+
+ r = IStream_Release(stm);
+
+ count = 0xf00;
+ r = IEnumSTATSTG_Next(ee, 1, &stat, &count);
+ todo_wine ok(r==S_OK, "IEnumSTATSTG->Next failed\n");
+ todo_wine ok(count == 1, "count wrong\n");
+
+ if (r == S_OK)
+ {
+ ok(lstrcmpiW(stat.pwcsName, stmname) == 0, "expected CONTENTS, got %s\n", wine_dbgstr_w(stat.pwcsName));
+ CoTaskMemFree(stat.pwcsName);
+ }
+
+ r = IStorage_CreateStream(stg, stmname2, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+ ok(r==S_OK, "IStorage->CreateStream failed\n");
+
+ r = IStream_Release(stm);
+
+ count = 0xf00;
+ r = IEnumSTATSTG_Next(ee, 1, &stat, &count);
+ todo_wine ok(r==S_OK, "IEnumSTATSTG->Next failed\n");
+ todo_wine ok(count == 1, "count wrong\n");
+
+ if (r == S_OK)
+ {
+ ok(lstrcmpiW(stat.pwcsName, stmname2) == 0, "expected ABCDEFGHI, got %s\n", wine_dbgstr_w(stat.pwcsName));
+ CoTaskMemFree(stat.pwcsName);
+ }
+
+ /* delete previous and next stream after reading */
+ r = IStorage_CreateStream(stg, stmname3, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+ ok(r==S_OK, "IStorage->CreateStream failed\n");
+
+ r = IStream_Release(stm);
+
+ r = IEnumSTATSTG_Reset(ee);
+ ok(r==S_OK, "IEnumSTATSTG->Reset failed\n");
+
+ count = 0xf00;
+ r = IEnumSTATSTG_Next(ee, 1, &stat, &count);
+ ok(r==S_OK, "IEnumSTATSTG->Next failed\n");
+ ok(count == 1, "count wrong\n");
+
+ if (r == S_OK)
+ {
+ ok(lstrcmpiW(stat.pwcsName, stmname) == 0, "expected CONTENTS, got %s\n", wine_dbgstr_w(stat.pwcsName));
+ CoTaskMemFree(stat.pwcsName);
+ }
+
+ r = IStorage_DestroyElement(stg, stmname);
+ ok(r==S_OK, "IStorage->DestroyElement failed\n");
+
+ r = IStorage_DestroyElement(stg, stmname2);
+ ok(r==S_OK, "IStorage->DestroyElement failed\n");
+
+ count = 0xf00;
+ r = IEnumSTATSTG_Next(ee, 1, &stat, &count);
+ ok(r==S_OK, "IEnumSTATSTG->Next failed\n");
+ ok(count == 1, "count wrong\n");
+
+ if (r == S_OK)
+ {
+ todo_wine ok(lstrcmpiW(stat.pwcsName, stmname3) == 0, "expected ABCDEFGHIJ, got %s\n", wine_dbgstr_w(stat.pwcsName));
+ CoTaskMemFree(stat.pwcsName);
+ }
r = IStorage_Release( stg );
- ok (r == 0, "storage not released\n");
+ todo_wine ok (r == 0, "storage not released\n");
+
+ /* enumerator is still valid and working after the storage is released */
+ r = IEnumSTATSTG_Reset(ee);
+ ok(r==S_OK, "IEnumSTATSTG->Reset failed\n");
+
+ count = 0xf00;
+ r = IEnumSTATSTG_Next(ee, 1, &stat, &count);
+ ok(r==S_OK, "IEnumSTATSTG->Next failed\n");
+ ok(count == 1, "count wrong\n");
+
+ if (r == S_OK)
+ {
+ ok(lstrcmpiW(stat.pwcsName, stmname3) == 0, "expected ABCDEFGHIJ, got %s\n", wine_dbgstr_w(stat.pwcsName));
+ CoTaskMemFree(stat.pwcsName);
+ }
+
+ /* the storage is left open until the enumerator is freed */
+ r = StgOpenStorage( filename, NULL, STGM_SHARE_EXCLUSIVE |
+ STGM_READWRITE |STGM_TRANSACTED, NULL, 0, &stg);
+ ok(r==STG_E_SHAREVIOLATION, "StgCreateDocfile failed, res=%x\n", r);
+
+ r = IEnumSTATSTG_Release(ee);
+ ok (r == 0, "enum not released\n");
DeleteFileA(filenameA);
}
@@ -2564,6 +2659,54 @@ static void test_toplevel_stat(void)
DeleteFileA(filenameA);
}
+static void test_substorage_enum(void)
+{
+ IStorage *stg, *stg2;
+ IEnumSTATSTG *ee;
+ HRESULT r;
+ ULONG ref;
+ static const WCHAR stgname[] = { 'P','E','R','M','S','T','G',0 };
+
+ DeleteFileA(filenameA);
+
+ /* create the file */
+ r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
+ STGM_READWRITE, 0, &stg);
+ ok(r==S_OK, "StgCreateDocfile failed\n");
+
+ /* create a substorage */
+ r = IStorage_CreateStorage(stg, stgname, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stg2);
+ ok(r==S_OK, "IStorage->CreateStorage failed, hr=%08x\n", r);
+
+ /* create an enumelements */
+ r = IStorage_EnumElements(stg2, 0, NULL, 0, &ee);
+ ok(r==S_OK, "IStorage->EnumElements failed, hr=%08x\n", r);
+
+ /* release the substorage */
+ ref = IStorage_Release(stg2);
+ todo_wine ok(ref==0, "storage not released\n");
+
+ /* reopening fails, because the substorage is really still open */
+ r = IStorage_OpenStorage(stg, stgname, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stg2);
+ ok(r==STG_E_ACCESSDENIED, "IStorage->OpenStorage failed, hr=%08x\n", r);
+
+ /* destroying the storage invalidates the enumerator */
+ r = IStorage_DestroyElement(stg, stgname);
+ ok(r==S_OK, "IStorage->CreateStorage failed, hr=%08x\n", r);
+
+if (0) { /* crashes on wine */
+ r = IEnumSTATSTG_Reset(ee);
+ ok(r==STG_E_REVERTED, "IEnumSTATSTG->Reset failed, hr=%08x\n", r);
+}
+
+ IEnumSTATSTG_Release(ee);
+
+ IStorage_Release(stg);
+
+ r = DeleteFileA(filenameA);
+ ok( r == TRUE, "deleted file\n");
+}
+
START_TEST(storage32)
{
CHAR temp[MAX_PATH];
@@ -2602,4 +2745,5 @@ START_TEST(storage32)
test_copyto_iidexclusions_stream();
test_rename();
test_toplevel_stat();
+ test_substorage_enum();
}
More information about the wine-cvs
mailing list