From 38a74f7e1ebf1fc2756dcd8ac7cf641e444cb12a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Fri, 5 Mar 2010 18:47:06 +0000 Subject: [PATCH 1/1] [URLMON_WINETEST] sync urlmon_winetest to wine 1.1.39 svn path=/trunk/; revision=45885 --- rostests/winetests/urlmon/misc.c | 82 +++++++++++-- rostests/winetests/urlmon/protocol.c | 37 ++++-- rostests/winetests/urlmon/sec_mgr.c | 68 +++++++++++ rostests/winetests/urlmon/stream.c | 7 +- rostests/winetests/urlmon/url.c | 171 ++++++++++++++------------- 5 files changed, 267 insertions(+), 98 deletions(-) diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index 5b59626398f..2e77c1bc237 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -270,6 +270,10 @@ static const WCHAR wszHttp[] = {'h','t','t','p',0}; static const WCHAR wszAbout[] = {'a','b','o','u','t',0}; static const WCHAR wszEmpty[] = {0}; +static const WCHAR wszWineHQ[] = {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static const WCHAR wszHttpWineHQ[] = {'h','t','t','p',':','/','/','w','w','w','.', + 'w','i','n','e','h','q','.','o','r','g',0}; + struct parse_test { LPCWSTR url; HRESULT secur_hres; @@ -277,15 +281,19 @@ struct parse_test { HRESULT path_hres; LPCWSTR path; LPCWSTR schema; + LPCWSTR domain; + HRESULT domain_hres; + LPCWSTR rootdocument; + HRESULT rootdocument_hres; }; static const struct parse_test parse_tests[] = { - {url1, S_OK, url1, E_INVALIDARG, NULL, wszRes}, - {url2, E_FAIL, url2, E_INVALIDARG, NULL, wszEmpty}, - {url3, E_FAIL, url3, S_OK, path3, wszFile}, - {url4, E_FAIL, url4e, S_OK, path4, wszFile}, - {url5, E_FAIL, url5, E_INVALIDARG, NULL, wszHttp}, - {url6, S_OK, url6, E_INVALIDARG, NULL, wszAbout} + {url1, S_OK, url1, E_INVALIDARG, NULL, wszRes, NULL, E_FAIL, NULL, E_FAIL}, + {url2, E_FAIL, url2, E_INVALIDARG, NULL, wszEmpty, NULL, E_FAIL, NULL, E_FAIL}, + {url3, E_FAIL, url3, S_OK, path3, wszFile, wszEmpty, S_OK, NULL, E_FAIL}, + {url4, E_FAIL, url4e, S_OK, path4, wszFile, wszEmpty, S_OK, NULL, E_FAIL}, + {url5, E_FAIL, url5, E_INVALIDARG, NULL, wszHttp, wszWineHQ, S_OK, wszHttpWineHQ, S_OK}, + {url6, S_OK, url6, E_INVALIDARG, NULL, wszAbout, NULL, E_FAIL, NULL, E_FAIL}, }; static void test_CoInternetParseUrl(void) @@ -331,6 +339,23 @@ static void test_CoInternetParseUrl(void) ok(hres == S_OK, "[%d] schema failed: %08x\n", i, hres); ok(size == lstrlenW(parse_tests[i].schema), "[%d] wrong size\n", i); ok(!lstrcmpW(parse_tests[i].schema, buf), "[%d] wrong schema\n", i); + + if(memcmp(parse_tests[i].url, wszRes, 3*sizeof(WCHAR)) + && memcmp(parse_tests[i].url, wszAbout, 5*sizeof(WCHAR))) { + memset(buf, 0xf0, sizeof(buf)); + hres = CoInternetParseUrl(parse_tests[i].url, PARSE_DOMAIN, 0, buf, + sizeof(buf)/sizeof(WCHAR), &size, 0); + ok(hres == parse_tests[i].domain_hres, "[%d] domain failed: %08x\n", i, hres); + if(parse_tests[i].domain) + ok(!lstrcmpW(parse_tests[i].domain, buf), "[%d] wrong domain, received %s\n", i, wine_dbgstr_w(buf)); + } + + memset(buf, 0xf0, sizeof(buf)); + hres = CoInternetParseUrl(parse_tests[i].url, PARSE_ROOTDOCUMENT, 0, buf, + sizeof(buf)/sizeof(WCHAR), &size, 0); + ok(hres == parse_tests[i].rootdocument_hres, "[%d] rootdocument failed: %08x\n", i, hres); + if(parse_tests[i].rootdocument) + ok(!lstrcmpW(parse_tests[i].rootdocument, buf), "[%d] wrong rootdocument, received %s\n", i, wine_dbgstr_w(buf)); } } @@ -755,7 +780,19 @@ static HRESULT WINAPI InternetProtocolInfo_ParseUrl(IInternetProtocolInfo *iface PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved) { - CHECK_EXPECT(ParseUrl); + CHECK_EXPECT2(ParseUrl); + + if(ParseAction == PARSE_SECURITY_URL) { + if(pcchResult) + *pcchResult = sizeof(url1)/sizeof(WCHAR); + + if(cchResultsizeof(wszFile)/sizeof(WCHAR) && + !memcmp(sec_url, wszFile, sizeof(wszFile)-sizeof(WCHAR)), + "Encoded url = %s\n", wine_dbgstr_w(sec_url)); + CoTaskMemFree(sec_url); + } + + CHECK_CALLED(QI_IInternetProtocolInfo); + CHECK_CALLED(ParseUrl); + hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest); ok(hres == S_OK, "UnregisterNameSpace failed: %08x\n", hres); diff --git a/rostests/winetests/urlmon/protocol.c b/rostests/winetests/urlmon/protocol.c index 5f48cfe3ca4..d54d00d9d42 100644 --- a/rostests/winetests/urlmon/protocol.c +++ b/rostests/winetests/urlmon/protocol.c @@ -131,7 +131,7 @@ static const WCHAR gzipW[] = {'g','z','i','p',0}; static HRESULT expect_hrResult; static LPCWSTR file_name, http_url, expect_wsz; static IInternetProtocol *async_protocol = NULL; -static BOOL first_data_notif, http_is_first, http_post_test; +static BOOL first_data_notif, http_is_first, http_post_test, test_redirect; static int state = 0, prot_state, read_report_data; static DWORD bindf, ex_priority , pi; static IInternetProtocol *binding_protocol, *filtered_protocol; @@ -442,19 +442,23 @@ static void call_continue(PROTOCOLDATA *protocol_data) CLEAR_CALLED(ReportProgress_FINDINGRESOURCE); CLEAR_CALLED(ReportProgress_CONNECTING); CLEAR_CALLED(ReportProgress_PROXYDETECTING); - } else todo_wine { - CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE); - /* IE7 does call this */ - CLEAR_CALLED(ReportProgress_CONNECTING); - } + }else if(test_redirect) { + CHECK_CALLED(ReportProgress_FINDINGRESOURCE); + }else todo_wine { + CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE); + /* IE7 does call this */ + CLEAR_CALLED(ReportProgress_CONNECTING); + } } if(tested_protocol == FTP_TEST) todo_wine CHECK_CALLED(ReportProgress_SENDINGREQUEST); else if (tested_protocol != HTTPS_TEST) CHECK_CALLED(ReportProgress_SENDINGREQUEST); + if(test_redirect) + CHECK_CALLED(ReportProgress_REDIRECTING); if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { SET_EXPECT(OnResponse); - if(tested_protocol == HTTPS_TEST) + if(tested_protocol == HTTPS_TEST || test_redirect) SET_EXPECT(ReportProgress_ACCEPTRANGES); SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) @@ -478,6 +482,8 @@ static void call_continue(PROTOCOLDATA *protocol_data) CHECK_CALLED(OnResponse); if(tested_protocol == HTTPS_TEST) CHECK_CALLED(ReportProgress_ACCEPTRANGES); + else if(test_redirect) + CLEAR_CALLED(ReportProgress_ACCEPTRANGES); CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -616,7 +622,10 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, break; case BINDSTATUS_REDIRECTING: CHECK_EXPECT(ReportProgress_REDIRECTING); - ok(szStatusText == NULL, "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + if(test_redirect) + ok(!strcmp_wa(szStatusText, "http://test.winehq.org/hello.html"), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + else + ok(szStatusText == NULL, "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); break; case BINDSTATUS_ENCODING: CHECK_EXPECT(ReportProgress_ENCODING); @@ -1346,6 +1355,7 @@ static HRESULT WINAPI ProtocolEmul_Start(IInternetProtocol *iface, LPCWSTR szUrl "GetBindString(BINDSTRING_ACCEPT_MIMES) failed: %08x\n", hres); ok(fetched == 1, "fetched = %d, expected 1\n", fetched); ok(!strcmp_ww(acc_mimeW, accept_mimes[0]), "unexpected mimes %s\n", wine_dbgstr_w(accept_mimes[0])); + CoTaskMemFree(accept_mimes[0]); hres = IInternetBindInfo_QueryInterface(pOIBindInfo, &IID_IServiceProvider, (void**)&service_provider); @@ -1952,6 +1962,7 @@ static IClassFactory mimefilter_cf = { &MimeFilterCFVtbl }; #define TEST_POST 0x10 #define TEST_EMULATEPROT 0x20 #define TEST_SHORT_READ 0x40 +#define TEST_REDIRECT 0x80 static void init_test(int prot, DWORD flags) { @@ -1977,6 +1988,7 @@ static void init_test(int prot, DWORD flags) emulate_prot = (flags & TEST_EMULATEPROT) != 0; wait_for_switch = TRUE; short_read = (flags & TEST_SHORT_READ) != 0; + test_redirect = (flags & TEST_REDIRECT) != 0; } static void test_priority(IInternetProtocol *protocol) @@ -2429,6 +2441,8 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags) SET_EXPECT(ReportProgress_FINDINGRESOURCE); SET_EXPECT(ReportProgress_CONNECTING); SET_EXPECT(ReportProgress_SENDINGREQUEST); + if(test_redirect) + SET_EXPECT(ReportProgress_REDIRECTING); SET_EXPECT(ReportProgress_PROXYDETECTING); if(prot == HTTP_TEST) SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -2516,6 +2530,9 @@ static void test_http_protocol(void) {'h','t','t','p',':','/','/','c','r','o','s','s','o','v','e','r','.', 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m','/', 'p','o','s','t','t','e','s','t','.','p','h','p',0}; + static const WCHAR redirect_url[] = + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', + 't','e','s','t','r','e','d','i','r','e','c','t',0}; trace("Testing http protocol (not from urlmon)...\n"); bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; @@ -2538,6 +2555,10 @@ static void test_http_protocol(void) trace("Testing http protocol (direct read)...\n"); bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON; test_http_protocol_url(winehq_url, HTTP_TEST, TEST_DIRECT_READ); + + trace("Testing http protocol (redirected)...\n"); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON; + test_http_protocol_url(redirect_url, HTTP_TEST, TEST_REDIRECT); } static void test_https_protocol(void) diff --git a/rostests/winetests/urlmon/sec_mgr.c b/rostests/winetests/urlmon/sec_mgr.c index 62471cf8de5..e4416981dac 100644 --- a/rostests/winetests/urlmon/sec_mgr.c +++ b/rostests/winetests/urlmon/sec_mgr.c @@ -91,6 +91,15 @@ static struct secmgr_test { {url7, 3, S_OK, sizeof(secid7), secid7, S_OK} }; +static int strcmp_w(const WCHAR *str1, const WCHAR *str2) +{ + DWORD len1 = lstrlenW(str1); + DWORD len2 = lstrlenW(str2); + + if(len1!=len2) return 1; + return memcmp(str1, str2, len1*sizeof(WCHAR)); +} + static void test_SecurityManager(void) { int i; @@ -605,11 +614,69 @@ static void test_GetZoneAttributes(void) ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr); } +static void test_InternetSecurityMarshalling(void) +{ + IInternetSecurityManager *secmgr = NULL; + IUnknown *unk; + IStream *stream; + HRESULT hres; + + hres = CoInternetCreateSecurityManager(NULL, &secmgr, 0); + if(FAILED(hres)) + return; + + hres = IInternetSecurityManager_QueryInterface(secmgr, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "QueryInterface returned: %08x\n", hres); + + hres = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hres == S_OK, "CreateStreamOnHGlobal returned: %08x\n", hres); + + hres = CoMarshalInterface(stream, &IID_IInternetSecurityManager, unk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok(hres == S_OK, "CoMarshalInterface returned: %08x\n", hres); + + IStream_Release(stream); + IUnknown_Release(unk); + IInternetSecurityManager_Release(secmgr); +} + +static void test_InternetGetSecurityUrl(void) +{ + const WCHAR url5_out[] = {'h','t','t','p',':','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; + const WCHAR url7_out[] = {'f','t','p',':','w','i','n','e','h','q','.','o','r','g',0}; + + const WCHAR *in[] = {url2, url3, url4, url5, url7, url8, url9, url10}; + const WCHAR *out_default[] = {url2, url3, url4, url5_out, url7_out, url8, url5_out, url10}; + const WCHAR *out_securl[] = {url2, url3, url4, url5, url7, url8, url9, url10}; + + WCHAR *sec; + DWORD i; + HRESULT hres; + + for(i=0; i