https://git.reactos.org/?p=reactos.git;a=commitdiff;h=454e3603036d2bf7c20e1510153d6b9574cea2c0
commit 454e3603036d2bf7c20e1510153d6b9574cea2c0 Author: Amine Khaldi <amine.kha...@reactos.org> AuthorDate: Mon Jun 4 03:37:50 2018 +0100 Commit: Amine Khaldi <amine.kha...@reactos.org> CommitDate: Mon Jun 4 03:37:50 2018 +0100 [ITSS_WINETEST] Sync with Wine Staging 3.9. CORE-14656 --- modules/rostests/winetests/itss/protocol.c | 67 ++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/modules/rostests/winetests/itss/protocol.c b/modules/rostests/winetests/itss/protocol.c index 663411f2e9..ea3a1d6967 100644 --- a/modules/rostests/winetests/itss/protocol.c +++ b/modules/rostests/winetests/itss/protocol.c @@ -17,6 +17,9 @@ */ #define COBJMACROS +#ifdef __REACTOS__ +#define CONST_VTABLE +#endif #include <wine/test.h> #include <stdarg.h> @@ -60,6 +63,7 @@ DEFINE_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); DEFINE_EXPECT(ReportProgress_DIRECTBIND); DEFINE_EXPECT(ReportData); DEFINE_EXPECT(ReportResult); +DEFINE_EXPECT(outer_QI_test); static HRESULT expect_hrResult; static IInternetProtocol *read_protocol = NULL; @@ -660,6 +664,68 @@ static void delete_chm(void) ok(ret, "DeleteFileA failed: %d\n", GetLastError()); } +static const IID outer_test_iid = {0xabcabc00,0,0,{0,0,0,0,0,0,0,0x66}}; + +static HRESULT WINAPI outer_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &outer_test_iid)) { + CHECK_EXPECT(outer_QI_test); + *ppv = (IUnknown*)0xdeadbeef; + return S_OK; + } + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI outer_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI outer_Release(IUnknown *iface) +{ + return 1; +} + +static const IUnknownVtbl outer_vtbl = { + outer_QueryInterface, + outer_AddRef, + outer_Release +}; + +static void test_com_aggregation(const CLSID *clsid) +{ + IUnknown outer = { &outer_vtbl }; + IClassFactory *class_factory; + IUnknown *unk, *unk2, *unk3; + HRESULT hres; + + hres = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)&class_factory); + ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres); + + hres = IClassFactory_CreateInstance(class_factory, &outer, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "CreateInstance returned: %08x\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocol, (void**)&unk2); + ok(hres == S_OK, "Could not get IInternetProtocol iface: %08x\n", hres); + + SET_EXPECT(outer_QI_test); + hres = IUnknown_QueryInterface(unk2, &outer_test_iid, (void**)&unk3); + CHECK_CALLED(outer_QI_test); + ok(hres == S_OK, "Could not get IInternetProtocol iface: %08x\n", hres); + ok(unk3 == (IUnknown*)0xdeadbeef, "unexpected unk2\n"); + + IUnknown_Release(unk2); + IUnknown_Release(unk); + + unk = (void*)0xdeadbeef; + hres = IClassFactory_CreateInstance(class_factory, &outer, &IID_IInternetProtocol, (void**)&unk); + ok(hres == CLASS_E_NOAGGREGATION, "CreateInstance returned: %08x\n", hres); + ok(!unk, "unk = %p\n", unk); + + IClassFactory_Release(class_factory); +} + START_TEST(protocol) { OleInitialize(NULL); @@ -669,6 +735,7 @@ START_TEST(protocol) test_its_protocol(); test_mk_protocol(); + test_com_aggregation(&CLSID_ITSProtocol); delete_chm(); OleUninitialize();