https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c3fa3f6079bb3c55f3953f...
commit c3fa3f6079bb3c55f3953f2fb36bbcd36eb15726 Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Fri Jan 19 00:24:20 2018 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Fri Jan 19 00:24:20 2018 +0100
[HLINK_WINETEST] Sync with Wine 3.0. CORE-14225 --- modules/rostests/winetests/hlink/browse_ctx.c | 70 ++++++++++++++ modules/rostests/winetests/hlink/hlink.c | 126 ++++++++++++++++++++++---- 2 files changed, 180 insertions(+), 16 deletions(-)
diff --git a/modules/rostests/winetests/hlink/browse_ctx.c b/modules/rostests/winetests/hlink/browse_ctx.c index 40d132b4c8..319352500c 100644 --- a/modules/rostests/winetests/hlink/browse_ctx.c +++ b/modules/rostests/winetests/hlink/browse_ctx.c @@ -131,12 +131,82 @@ static void test_BrowseWindowInfo(void) IHlinkBrowseContext_Release(bc); }
+static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if (IsEqualIID(riid, &IID_IUnknown)) + { + *ppv = iface; + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI Unknown_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI Unknown_Release(IUnknown *iface) +{ + return 1; +} + +static IUnknownVtbl UnknownVtbl = { + Unknown_QueryInterface, + Unknown_AddRef, + Unknown_Release, +}; + +static IUnknown Unknown = { &UnknownVtbl }; + +static void test_GetObject(void) +{ + IHlinkBrowseContext *bc; + IMoniker *dummy; + IBindCtx *bindctx; + IUnknown *unk; + WCHAR one[] = {'1',0}; + WCHAR five[] = {'5',0}; + DWORD cookie; + HRESULT hres; + + hres = CreateBindCtx(0, &bindctx); + ok(hres == S_OK, "CreateBindCtx() failed: 0x%08x\n", hres); + + hres = CreateItemMoniker(one, five, &dummy); + ok(hres == S_OK, "CreateItemMoniker() failed: 0x%08x\n", hres); + + hres = HlinkCreateBrowseContext(NULL, &IID_IHlinkBrowseContext, (void **)&bc); + ok(hres == S_OK, "HlinkCreateBrowseContext() failed: 0x%08x\n", hres); + + hres = IHlinkBrowseContext_GetObject(bc, dummy, FALSE, &unk); + ok(hres == MK_E_UNAVAILABLE, "expected MK_E_UNAVAILABLE, got 0x%08x\n", hres); + + hres = IHlinkBrowseContext_Register(bc, 0, &Unknown, dummy, &cookie); + ok(hres == S_OK, "Register() failed: 0x%08x\n", hres); + + hres = IHlinkBrowseContext_GetObject(bc, dummy, FALSE, &unk); + ok(hres == S_OK, "GetObject() failed: 0x%08x\n", hres); + ok(unk == &Unknown, "wrong object returned\n"); + + hres = IHlinkBrowseContext_Revoke(bc, cookie); + ok(hres == S_OK, "Revoke() failed: 0x%08x\n", hres); + + hres = IHlinkBrowseContext_GetObject(bc, dummy, FALSE, &unk); + ok(hres == MK_E_UNAVAILABLE, "expected MK_E_UNAVAILABLE, got 0x%08x\n", hres); + + IHlinkBrowseContext_Release(bc); +} + START_TEST(browse_ctx) { CoInitialize(NULL);
test_SetInitialHlink(); test_BrowseWindowInfo(); + test_GetObject();
CoUninitialize(); } diff --git a/modules/rostests/winetests/hlink/hlink.c b/modules/rostests/winetests/hlink/hlink.c index 50f61d57f7..e40807cc8a 100644 --- a/modules/rostests/winetests/hlink/hlink.c +++ b/modules/rostests/winetests/hlink/hlink.c @@ -67,9 +67,13 @@ DEFINE_EXPECT(GetClassID); DEFINE_EXPECT(Save);
DEFINE_EXPECT(HBC_QueryInterface_IHlinkHistory); +DEFINE_EXPECT(HBC_QueryInterface_IMarshal); +DEFINE_EXPECT(HBC_QueryInterface_IdentityUnmarshal); +DEFINE_EXPECT(HBC_QueryInterface_IUnknown); DEFINE_EXPECT(HBC_GetObject); DEFINE_EXPECT(HBC_UpdateHlink);
+DEFINE_EXPECT(HT_QueryInterface_IHlinkTarget); DEFINE_EXPECT(HT_SetBrowseContext); DEFINE_EXPECT(HT_GetBrowseContext); DEFINE_EXPECT(HT_Navigate); @@ -77,8 +81,16 @@ DEFINE_EXPECT(HT_GetFriendlyName);
DEFINE_EXPECT(HLF_UpdateHlink);
+DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(IID_IHlinkHistory,0x79eac9c8,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b);
+static const WCHAR winehq_urlW[] = + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g', + '/','t','e','s','t','s','/','h','e','l','l','o','.','h','t','m','l',0}; +static const WCHAR winehq_404W[] = + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g', + '/','t','e','s','t','s','/','f','a','k','e','u','r','l',0}; + static void test_HlinkIsShortcut(void) { UINT i; @@ -627,9 +639,6 @@ static void test_HlinkParseDisplayName(void) IBindCtx *bctx; HRESULT hres;
- static const WCHAR winehq_urlW[] = - {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g', - '/','s','i','t','e','/','a','b','o','u','t',0}; static const WCHAR invalid_urlW[] = {'t','e','s','t',':','1','2','3','a','b','c',0}; static const WCHAR clsid_nameW[] = {'c','l','s','i','d',':', '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8', @@ -829,12 +838,17 @@ static HRESULT WINAPI HlinkBrowseContext_QueryInterface( { *ppv = NULL;
- if(IsEqualGUID(&IID_IHlinkHistory, riid)) { + if (IsEqualGUID(&IID_IHlinkHistory, riid)) CHECK_EXPECT(HBC_QueryInterface_IHlinkHistory); - return E_NOINTERFACE; - } + else if (IsEqualGUID(&IID_IMarshal, riid)) + CHECK_EXPECT2(HBC_QueryInterface_IMarshal); + else if (IsEqualGUID(&CLSID_IdentityUnmarshal, riid)) + CHECK_EXPECT(HBC_QueryInterface_IdentityUnmarshal); + else if (IsEqualGUID(&IID_IUnknown, riid)) + CHECK_EXPECT(HBC_QueryInterface_IUnknown); + else + ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid));
- ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; }
@@ -855,16 +869,29 @@ static HRESULT WINAPI HlinkBrowseContext_Register(IHlinkBrowseContext *iface, return E_NOTIMPL; }
+static IUnknown *HBC_object; + static IMoniker Moniker; static HRESULT WINAPI HlinkBrowseContext_GetObject(IHlinkBrowseContext *iface, IMoniker *pimk, BOOL fBindIfRootRegistered, IUnknown **ppiunk) { + IBindCtx *bctx; + WCHAR *name; + HRESULT hr; + CHECK_EXPECT(HBC_GetObject);
- ok(pimk == &Moniker, "pimk != &Moniker\n"); + CreateBindCtx(0, &bctx); + hr = IMoniker_GetDisplayName(pimk, bctx, NULL, &name); + ok(hr == S_OK, "Failed to get display name, hr %#x.\n", hr); + ok(!lstrcmpW(winehq_urlW, name) || !lstrcmpW(winehq_404W, name), "got unexpected url\n"); + CoTaskMemFree(name); + IBindCtx_Release(bctx); + ok(fBindIfRootRegistered == 1, "fBindIfRootRegistered = %x\n", fBindIfRootRegistered); - *ppiunk = NULL; - return S_FALSE; + + *ppiunk = HBC_object; + return HBC_object ? S_OK : S_FALSE; }
static HRESULT WINAPI HlinkBrowseContext_Revoke(IHlinkBrowseContext *iface, DWORD dwRegister) @@ -974,6 +1001,7 @@ static IHlinkBrowseContext HlinkBrowseContext = { &HlinkBrowseContextVtbl }; static HRESULT WINAPI HlinkTarget_QueryInterface(IHlinkTarget *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IHlinkTarget, riid)) { + CHECK_EXPECT(HT_QueryInterface_IHlinkTarget); *ppv = iface; return S_OK; } @@ -1205,10 +1233,6 @@ static HRESULT WINAPI Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther static HRESULT WINAPI Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName) { - static const WCHAR winehq_urlW[] = - {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g', - '/','s','i','t','e','/','a','b','o','u','t',0}; - CHECK_EXPECT2(GetDisplayName);
ok(pbc != NULL, "pbc == NULL\n"); @@ -2171,6 +2195,8 @@ static void test_Hlink_Navigate(void) ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres); _bctx = pbc;
+ HBC_object = NULL; + SET_EXPECT(Reduce); SET_EXPECT(Enum); SET_EXPECT(IsSystemMoniker); @@ -2188,6 +2214,7 @@ static void test_Hlink_Navigate(void) SET_EXPECT(HBC_GetObject); SET_EXPECT(Reduce); SET_EXPECT(BindToObject); + SET_EXPECT(HT_QueryInterface_IHlinkTarget); SET_EXPECT(HT_GetBrowseContext); SET_EXPECT(HT_SetBrowseContext); SET_EXPECT(HBC_QueryInterface_IHlinkHistory); @@ -2196,16 +2223,83 @@ static void test_Hlink_Navigate(void) hres = IHlink_Navigate(hlink, 0, pbc, NULL, &HlinkBrowseContext); ok(hres == S_OK, "Navigate failed: %08x\n", hres); CHECK_CALLED(IsSystemMoniker); - todo_wine CHECK_CALLED(GetDisplayName); - todo_wine CHECK_CALLED(HBC_GetObject); + CHECK_CALLED(GetDisplayName); + CHECK_CALLED(HBC_GetObject); todo_wine CHECK_CALLED(Reduce); CHECK_CALLED(BindToObject); + CHECK_CALLED(HT_QueryInterface_IHlinkTarget); todo_wine CHECK_CALLED(HT_GetBrowseContext); CHECK_CALLED(HT_SetBrowseContext); todo_wine CHECK_CALLED(HBC_QueryInterface_IHlinkHistory); CHECK_CALLED(HT_Navigate); todo_wine CHECK_CALLED(HT_GetFriendlyName);
+ /* Test with valid return from HlinkBrowseContext::GetObject */ + HBC_object = (IUnknown *)&HlinkTarget; + + SET_EXPECT(IsSystemMoniker); + SET_EXPECT(GetDisplayName); + SET_EXPECT(HBC_GetObject); + SET_EXPECT(HT_QueryInterface_IHlinkTarget); + SET_EXPECT(HT_Navigate); + SET_EXPECT(HT_GetFriendlyName); + hres = IHlink_Navigate(hlink, 0, pbc, NULL, &HlinkBrowseContext); + ok(hres == S_OK, "Navigate failed: %08x\n", hres); + CHECK_CALLED(IsSystemMoniker); + CHECK_CALLED(GetDisplayName); + CHECK_CALLED(HBC_GetObject); + CHECK_CALLED(HT_QueryInterface_IHlinkTarget); + CHECK_CALLED(HT_Navigate); + todo_wine CHECK_CALLED(HT_GetFriendlyName); + + HBC_object = NULL; + +if (0) { /* these currently open a browser window on wine */ + /* Test from string */ + SET_EXPECT(HBC_GetObject); + hres = HlinkNavigateToStringReference(winehq_404W, NULL, NULL, 0, NULL, 0, pbc, NULL, &HlinkBrowseContext); + todo_wine ok(hres == INET_E_OBJECT_NOT_FOUND, "Expected INET_E_OBJECT_NOT_FOUND, got %08x\n", hres); + CHECK_CALLED(HBC_GetObject); + + /* MSDN claims browse context and bind context can't be null, but they can */ + SET_EXPECT(HBC_GetObject); + hres = HlinkNavigateToStringReference(winehq_404W, NULL, NULL, 0, NULL, 0, NULL, NULL, &HlinkBrowseContext); + todo_wine ok(hres == INET_E_OBJECT_NOT_FOUND, "Expected INET_E_OBJECT_NOT_FOUND, got %08x\n", hres); + CHECK_CALLED(HBC_GetObject); +} + + /* these open a browser window, so mark them interactive only */ + if (winetest_interactive) + { + /* both parameters null */ + SET_EXPECT(IsSystemMoniker); + SET_EXPECT(GetDisplayName); + hres = IHlink_Navigate(hlink, 0, NULL, NULL, NULL); + ok(hres == DRAGDROP_S_DROP, "Expected DRAGDROP_S_DROP, got %08x\n", hres); + CHECK_CALLED(IsSystemMoniker); + CHECK_CALLED(GetDisplayName); + + /* same, from string */ + hres = HlinkNavigateToStringReference(winehq_404W, NULL, NULL, 0, NULL, 0, NULL, NULL, NULL); + ok(hres == DRAGDROP_S_DROP, "Expected DRAGDROP_S_DROP, got %08x\n", hres); + + /* try basic test with valid URL */ + SET_EXPECT(HBC_GetObject); + SET_EXPECT(HBC_QueryInterface_IHlinkHistory); + SET_EXPECT(HBC_QueryInterface_IMarshal); + SET_EXPECT(HBC_QueryInterface_IdentityUnmarshal); + SET_EXPECT(HBC_QueryInterface_IUnknown); + hres = HlinkNavigateToStringReference(winehq_urlW, NULL, NULL, 0, NULL, 0, pbc, NULL, &HlinkBrowseContext); + ok(hres == S_OK, "Expected S_OK, got %08x\n", hres); + CHECK_CALLED(HBC_GetObject); + todo_wine CHECK_CALLED(HBC_QueryInterface_IHlinkHistory); + todo_wine CHECK_CALLED(HBC_QueryInterface_IMarshal); + todo_wine CHECK_CALLED(HBC_QueryInterface_IdentityUnmarshal); + todo_wine CHECK_CALLED(HBC_QueryInterface_IUnknown); + } + else + skip("interactive IHlink_Navigate tests\n"); + IHlink_Release(hlink); IBindCtx_Release(pbc); _bctx = NULL;