Module: wine Branch: master Commit: 4e58d594c1852f34830c5279b840c5dce325e7ad URL: https://source.winehq.org/git/wine.git/?a=commit;h=4e58d594c1852f34830c5279b...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Oct 11 19:12:10 2018 +0200
ole32/tests: Add DfMarshal custom marshaling tests.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ole32/tests/marshal.c | 59 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-)
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index 45ddc40..3a3f9e7 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -60,6 +60,7 @@ }while(0)
static const GUID CLSID_WineTestPSFactoryBuffer = { 0x22222222, 0x1234, 0x1234, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }; +static const GUID CLSID_DfMarshal = { 0x0000030b, 0x0000, 0x0000, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } };
/* functions that are not present on all versions of Windows */ static HRESULT (WINAPI * pCoInitializeEx)(LPVOID lpReserved, DWORD dwCoInit); @@ -75,6 +76,7 @@ static HRESULT (WINAPI *pDllGetClassObject)(REFCLSID,REFIID,LPVOID);
#define OBJREF_SIGNATURE (0x574f454d) #define OBJREF_STANDARD (0x1) +#define OBJREF_CUSTOM (0x4)
typedef struct tagDUALSTRINGARRAY { unsigned short wNumEntries; @@ -1352,6 +1354,7 @@ todo_wine end_host_object(tid, thread); }
+static const CLSID *unmarshal_class; DEFINE_EXPECT(CustomMarshal_GetUnmarshalClass); DEFINE_EXPECT(CustomMarshal_GetMarshalSizeMax); DEFINE_EXPECT(CustomMarshal_MarshalInterface); @@ -1384,7 +1387,7 @@ static HRESULT WINAPI CustomMarshal_GetUnmarshalClass(IMarshal *iface, REFIID ri void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *clsid) { CHECK_EXPECT(CustomMarshal_GetUnmarshalClass); - *clsid = CLSID_StdMarshal; + *clsid = *unmarshal_class; return S_OK; }
@@ -1407,6 +1410,9 @@ static HRESULT WINAPI CustomMarshal_MarshalInterface(IMarshal *iface, IStream *s
CHECK_EXPECT(CustomMarshal_MarshalInterface);
+ if(unmarshal_class != &CLSID_StdMarshal) + return S_OK; + hr = IStream_Stat(stream, &stat, STATFLAG_DEFAULT); ok_ole_success(hr, IStream_Stat); ok(U(stat.cbSize).LowPart == 0, "stream is not empty (%d)\n", U(stat.cbSize).LowPart); @@ -1467,6 +1473,7 @@ static void test_StdMarshal_custom_marshaling(void) hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); ok_ole_success(hr, CreateStreamOnHGlobal);
+ unmarshal_class = &CLSID_StdMarshal; SET_EXPECT(CustomMarshal_GetUnmarshalClass); SET_EXPECT(CustomMarshal_MarshalInterface); hr = CoMarshalInterface(stream, &IID_IUnknown, (IUnknown*)&CustomMarshal, @@ -1508,6 +1515,55 @@ static void test_StdMarshal_custom_marshaling(void) ok(size == sizeof(OBJREF), "size = %d, expected %d\n", size, (int)sizeof(OBJREF)); }
+static void test_DfMarshal_custom_marshaling(void) +{ + DWORD size, read; + IStream *stream; + OBJREF objref; + HRESULT hr; + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok_ole_success(hr, CreateStreamOnHGlobal); + + unmarshal_class = &CLSID_DfMarshal; + SET_EXPECT(CustomMarshal_GetUnmarshalClass); + SET_EXPECT(CustomMarshal_GetMarshalSizeMax); + SET_EXPECT(CustomMarshal_MarshalInterface); + hr = CoMarshalInterface(stream, &IID_IUnknown, (IUnknown*)&CustomMarshal, + MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok_ole_success(hr, CoMarshalInterface); + CHECK_CALLED(CustomMarshal_GetUnmarshalClass); + CHECK_CALLED(CustomMarshal_GetMarshalSizeMax); + CHECK_CALLED(CustomMarshal_MarshalInterface); + + hr = IStream_Seek(stream, ullZero, STREAM_SEEK_SET, NULL); + ok_ole_success(hr, IStream_Seek); + size = FIELD_OFFSET(OBJREF, u_objref.u_custom.pData); + hr = IStream_Read(stream, &objref, size, &read); + ok_ole_success(hr, IStream_Read); + ok(read == size, "read = %d, expected %d\n", read, size); + ok(objref.signature == OBJREF_SIGNATURE, "objref.signature = %x\n", + objref.signature); + ok(objref.flags == OBJREF_CUSTOM, "objref.flags = %x\n", objref.flags); + ok(IsEqualIID(&objref.iid, &IID_IUnknown), "objref.iid = %s\n", + wine_dbgstr_guid(&objref.iid)); + ok(IsEqualIID(&objref.u_objref.u_custom.clsid, &CLSID_DfMarshal), + "custom.clsid = %s\n", wine_dbgstr_guid(&objref.u_objref.u_custom.clsid)); + ok(!objref.u_objref.u_custom.cbExtension, "custom.cbExtension = %d\n", + objref.u_objref.u_custom.cbExtension); + ok(!objref.u_objref.u_custom.size, "custom.size = %d\n", + objref.u_objref.u_custom.size); + + IStream_Release(stream); + + SET_EXPECT(CustomMarshal_GetMarshalSizeMax); + hr = CoGetMarshalSizeMax(&size, &IID_IUnknown, (IUnknown*)&CustomMarshal, + MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok_ole_success(hr, CoGetMarshalSizeMax); + CHECK_CALLED(CustomMarshal_GetMarshalSizeMax); + ok(size == sizeof(OBJREF), "size = %d, expected %d\n", size, (int)sizeof(OBJREF)); +} + static void test_CoGetStandardMarshal(void) { DUALSTRINGARRAY *dualstringarr; @@ -4595,6 +4651,7 @@ START_TEST(marshal)
test_marshal_channel_buffer(); test_StdMarshal_custom_marshaling(); + test_DfMarshal_custom_marshaling(); test_CoGetStandardMarshal(); test_hresult_marshaling(); test_proxy_used_in_wrong_thread();