Nikolay Sivov : comctl32/dpa: Separate tests for parameter validation in DPA_LoadStream().
Alexandre Julliard
julliard at winehq.org
Tue Sep 15 17:47:24 CDT 2009
Module: wine
Branch: master
Commit: b07ca01527c2e38c476a9725c9b21ee160c1401c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b07ca01527c2e38c476a9725c9b21ee160c1401c
Author: Nikolay Sivov <bunglehead at gmail.com>
Date: Sat Sep 12 03:17:54 2009 +0400
comctl32/dpa: Separate tests for parameter validation in DPA_LoadStream().
---
dlls/comctl32/tests/dpa.c | 127 +++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 123 insertions(+), 4 deletions(-)
diff --git a/dlls/comctl32/tests/dpa.c b/dlls/comctl32/tests/dpa.c
index e9a1fa5..5d7124a 100644
--- a/dlls/comctl32/tests/dpa.c
+++ b/dlls/comctl32/tests/dpa.c
@@ -33,6 +33,13 @@
#define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got)
+typedef struct _STREAMDATA
+{
+ DWORD dwSize;
+ DWORD dwData2;
+ DWORD dwItems;
+} STREAMDATA, *PSTREAMDATA;
+
static HDPA (WINAPI *pDPA_Clone)(const HDPA,const HDPA);
static HDPA (WINAPI *pDPA_Create)(INT);
static HDPA (WINAPI *pDPA_CreateEx)(INT,HANDLE);
@@ -45,9 +52,9 @@ static INT (WINAPI *pDPA_GetPtr)(const HDPA,INT);
static INT (WINAPI *pDPA_GetPtrIndex)(const HDPA,PVOID);
static BOOL (WINAPI *pDPA_Grow)(HDPA,INT);
static INT (WINAPI *pDPA_InsertPtr)(const HDPA,INT,PVOID);
-static HRESULT (WINAPI *pDPA_LoadStream)(HDPA*,PFNDPASTREAM,IStream*,LPARAM);
+static HRESULT (WINAPI *pDPA_LoadStream)(HDPA*,PFNDPASTREAM,IStream*,LPVOID);
static BOOL (WINAPI *pDPA_Merge)(const HDPA,const HDPA,DWORD,PFNDPACOMPARE,PFNDPAMERGE,LPARAM);
-static HRESULT (WINAPI *pDPA_SaveStream)(HDPA,PFNDPASTREAM,IStream*,LPARAM);
+static HRESULT (WINAPI *pDPA_SaveStream)(HDPA,PFNDPASTREAM,IStream*,LPVOID);
static INT (WINAPI *pDPA_Search)(HDPA,PVOID,INT,PFNDPACOMPARE,LPARAM,UINT);
static BOOL (WINAPI *pDPA_SetPtr)(const HDPA,INT,PVOID);
static BOOL (WINAPI *pDPA_Sort)(const HDPA,PFNDPACOMPARE,LPARAM);
@@ -525,6 +532,117 @@ static void test_DPA_DestroyCallback(void)
ok(nEnum == 3, "nEnum=%d\n", nEnum);
}
+static void test_DPA_LoadStream(void)
+{
+ static const WCHAR szStg[] = { 'S','t','g',0 };
+ IStorage* pStg = NULL;
+ IStream* pStm = NULL;
+ LARGE_INTEGER li;
+ ULARGE_INTEGER uli;
+ DWORD dwMode;
+ HRESULT hRes;
+ STREAMDATA header;
+ ULONG written, ret;
+ HDPA dpa;
+
+ hRes = CoInitialize(NULL);
+ if (hRes != S_OK)
+ {
+ ok(0, "hResult: %d\n", hRes);
+ return;
+ }
+
+ dwMode = STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE;
+ hRes = StgCreateDocfile(NULL, dwMode|STGM_DELETEONRELEASE, 0, &pStg);
+ expect(S_OK, hRes);
+
+ hRes = IStorage_CreateStream(pStg, szStg, dwMode, 0, 0, &pStm);
+ expect(S_OK, hRes);
+
+ /* write less than header size */
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+
+ memset(&header, 0, sizeof(header));
+ written = 0;
+ uli.QuadPart = sizeof(header)-1;
+ hRes = IStream_SetSize(pStm, uli);
+ expect(S_OK, hRes);
+ hRes = IStream_Write(pStm, &header, sizeof(header)-1, &written);
+ expect(S_OK, hRes);
+ written -= sizeof(header)-1;
+ expect(0, written);
+
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+
+ hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, NULL);
+ expect(E_FAIL, hRes);
+
+ /* check stream position after header read failed */
+ li.QuadPart = 0;
+ uli.QuadPart = 1;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_CUR, &uli);
+ expect(S_OK, hRes);
+ todo_wine ok(uli.QuadPart == 0, "Expected to position reset\n");
+
+ /* write valid header for empty DPA */
+ header.dwSize = sizeof(header);
+ header.dwData2 = 1;
+ header.dwItems = 0;
+ written = 0;
+
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+
+ uli.QuadPart = sizeof(header);
+ hRes = IStream_SetSize(pStm, uli);
+ expect(S_OK, hRes);
+
+ hRes = IStream_Write(pStm, &header, sizeof(header), &written);
+ expect(S_OK, hRes);
+ written -= sizeof(header);
+ expect(0, written);
+
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+
+ hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, NULL);
+ todo_wine expect(S_OK, hRes);
+
+ /* try with altered dwData2 field */
+ header.dwSize = sizeof(header);
+ header.dwData2 = 2;
+ header.dwItems = 0;
+
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+ hRes = IStream_Write(pStm, &header, sizeof(header), &written);
+ expect(S_OK, hRes);
+ written -= sizeof(header);
+ expect(0, written);
+
+ li.QuadPart = 0;
+ hRes = IStream_Seek(pStm, li, STREAM_SEEK_SET, NULL);
+ expect(S_OK, hRes);
+
+ hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, (void*)0xdeadbeef);
+ todo_wine expect(E_FAIL, hRes);
+
+ ret = IStream_Release(pStm);
+ ok(!ret, "ret=%d\n", ret);
+
+ ret = IStorage_Release(pStg);
+ ok(!ret, "ret=%d\n", ret);
+
+ CoUninitialize();
+}
+
static void test_dpa_stream(void)
{
HDPA dpa;
@@ -566,14 +684,14 @@ static void test_dpa_stream(void)
hRes = IStorage_CreateStream(pStg, szStg, dwMode, 0, 0, &pStm);
ok(hRes == S_OK, "hRes=0x%x\n", hRes);
- hRes = pDPA_SaveStream(dpa, CB_Save, pStm, 0xdeadbeef);
+ hRes = pDPA_SaveStream(dpa, CB_Save, pStm, (void*)0xdeadbeef);
todo_wine ok(hRes == S_OK, "hRes=0x%x\n", hRes);
pDPA_Destroy(dpa);
liZero.QuadPart = 0;
hRes = IStream_Seek(pStm, liZero, STREAM_SEEK_SET, NULL);
ok(hRes == S_OK, "hRes=0x%x\n", hRes);
- hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, 0xdeadbeef);
+ hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, (void*)0xdeadbeef);
todo_wine
{
ok(hRes == S_OK, "hRes=0x%x\n", hRes);
@@ -607,5 +725,6 @@ START_TEST(dpa)
test_DPA_Merge();
test_DPA_EnumCallback();
test_DPA_DestroyCallback();
+ test_DPA_LoadStream();
test_dpa_stream();
}
More information about the wine-cvs
mailing list