[URLMON_WINETEST] Skip test_ftp_protocol() because of timeouts. ROSTESTS-165
[reactos.git] / rostests / winetests / urlmon / misc.c
index 44483ed..7efd20d 100644 (file)
@@ -27,6 +27,7 @@
 #include <wine/test.h>
 //#include <stdarg.h>
 //#include <stddef.h>
+#include <stdio.h>
 
 //#include "windef.h"
 //#include "winbase.h"
@@ -289,7 +290,6 @@ static void test_RegisterFormatEnumerator(void)
     IEnumFORMATETC_Release(format);
     IBindCtx_Release(bctx);
 }
-
 static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l',
         '/','b','l','a','n','k','.','h','t','m',0};
 static const WCHAR url2[] = {'i','n','d','e','x','.','h','t','m',0};
@@ -305,9 +305,7 @@ static const WCHAR url8[] = {'t','e','s','t',':','1','2','3','a','b','c',0};
 static const WCHAR url9[] =
     {'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 url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e',
-        '.','j','p','g',0};
-static const WCHAR url11[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','*','.',
+static const WCHAR url10[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','*','.',
         'c','o','m',0};
 static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e',
         '.','j','p','g',0};
@@ -348,7 +346,7 @@ static const struct parse_test parse_tests[] = {
     {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},
-    {url11, E_FAIL, url11, E_INVALIDARG,        NULL, wszHttp, wszGoogle, S_OK, wszHttpGoogle, S_OK}
+    {url10, E_FAIL, url10, E_INVALIDARG,NULL, wszHttp, wszGoogle, S_OK, wszHttpGoogle, S_OK}
 };
 
 static void test_CoInternetParseUrl(void)
@@ -471,17 +469,22 @@ static void test_CoInternetQueryInfo(void)
 }
 
 static const struct {
-    const WCHAR *url;
+    const char *url;
     const char *mime;
     HRESULT hres;
+    BOOL broken_failure;
+    const char *broken_mime;
 } mime_tests[] = {
-    {url1, "text/html", S_OK},
-    {url2, "text/html", S_OK},
-    {url3, "text/html", S_OK},
-    {url4, NULL, E_FAIL},
-    {url5, NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)},
-    {url6, NULL, E_FAIL},
-    {url7, NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)}
+    {"res://mshtml.dll/blank.htm", "text/html", S_OK},
+    {"index.htm", "text/html", S_OK},
+    {"file://c:\\Index.htm", "text/html", S_OK},
+    {"file://c:\\Index.htm?q=test", "text/html", S_OK, TRUE},
+    {"file://c:\\Index.htm#hash_part", "text/html", S_OK, TRUE},
+    {"file://c:\\Index.htm#hash_part.txt", "text/html", S_OK, FALSE, "text/plain"},
+    {"file://some%20file%2ejpg", NULL, E_FAIL},
+    {"http://www.winehq.org", NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)},
+    {"about:blank", NULL, E_FAIL},
+    {"ftp://winehq.org/file.test", NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)}
 };
 
 static BYTE data1[] = "test data\n";
@@ -580,6 +583,8 @@ static BYTE data93[] = {'<','?','x','m','l',' ',' ','<','h','t','m','l','>'};
 static BYTE data94[] = {'<','h','t','m','l','>','<','?','x','m','l',' ',' '};
 static BYTE data95[] = {'{','\\','r','t','f','<','?','x','m','l',' ',' '};
 static BYTE data96[] = {'<','?','x','m','l',' '};
+static BYTE data97[] = "<body";
+static BYTE data98[] = "blah<BoDyblahblah";
 
 static const struct {
     BYTE *data;
@@ -686,6 +691,8 @@ static const struct {
     {data94, sizeof(data94), "text/html", "text/plain"},
     {data95, sizeof(data95), "text/xml", "text/richtext"},
     {data96, sizeof(data96), "text/plain"},
+    {data97, sizeof(data97), "text/html", "text/plain"},
+    {data98, sizeof(data98), "text/html", "text/plain"},
     {data1, sizeof(data1), "text/plain", NULL, NULL, "res://mshtml.dll/blank.htm"},
     {NULL, 0, "text/html", NULL, NULL, "res://mshtml.dll/blank.htm"},
     {data1, sizeof(data1), "text/plain", NULL, NULL, "res://mshtml.dll/blank.htm", "application/octet-stream"},
@@ -714,11 +721,16 @@ static void test_FindMimeFromData(void)
 
     for(i=0; i<sizeof(mime_tests)/sizeof(mime_tests[0]); i++) {
         mime = (LPWSTR)0xf0f0f0f0;
-        hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, NULL, 0, &mime, 0);
+        url = a2w(mime_tests[i].url);
+        hres = pFindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
         if(mime_tests[i].mime) {
-            ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
-            ok(!strcmp_wa(mime, mime_tests[i].mime), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
-            CoTaskMemFree(mime);
+            ok(hres == S_OK || broken(mime_tests[i].broken_failure), "[%d] FindMimeFromData failed: %08x\n", i, hres);
+            if(hres == S_OK) {
+                ok(!strcmp_wa(mime, mime_tests[i].mime)
+                   || broken(mime_tests[i].broken_mime && !strcmp_wa(mime, mime_tests[i].broken_mime)),
+                   "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
+                CoTaskMemFree(mime);
+            }
         }else {
             ok(hres == E_FAIL || hres == mime_tests[i].hres,
                "[%d] FindMimeFromData failed: %08x, expected %08x\n",
@@ -727,16 +739,17 @@ static void test_FindMimeFromData(void)
         }
 
         mime = (LPWSTR)0xf0f0f0f0;
-        hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, text_plainW, 0, &mime, 0);
+        hres = pFindMimeFromData(NULL, url, NULL, 0, text_plainW, 0, &mime, 0);
         ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
         ok(!strcmp_wa(mime, "text/plain"), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
         CoTaskMemFree(mime);
 
         mime = (LPWSTR)0xf0f0f0f0;
-        hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, app_octet_streamW, 0, &mime, 0);
+        hres = pFindMimeFromData(NULL, url, NULL, 0, app_octet_streamW, 0, &mime, 0);
         ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
         ok(!strcmp_wa(mime, "application/octet-stream"), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
         CoTaskMemFree(mime);
+        heap_free(url);
     }
 
     for(i=0; i < sizeof(mime_tests2)/sizeof(mime_tests2[0]); i++) {
@@ -1736,6 +1749,8 @@ static void test_internet_feature_defaults(void) {
  * call hasn't already been made for the specified Feature). Because of
  * this we skip these tests on IE 7 and earlier.
  */
+static const char* szFeatureControlKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl";
+
 static void test_internet_features_registry(void) {
     HRESULT hres;
     DWORD res;
@@ -1743,11 +1758,10 @@ static void test_internet_features_registry(void) {
     char *name;
     HKEY feature_control;
     HKEY feature;
-    DWORD value, skip_zone;
+    DWORD value;
+    BOOL skip_zone;
     BOOL delete_feature_key = TRUE;
-    BOOL delete_feature_control_key = FALSE;
 
-    static const char* szFeatureControlKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl";
     static const char* szFeatureBehaviorsKey = "FEATURE_BEHAVIORS";
     static const char* szFeatureZoneElevationKey = "FEATURE_ZONE_ELEVATION";
 
@@ -1763,17 +1777,13 @@ static void test_internet_features_registry(void) {
 
     /* Some Windows machines don't have a FeatureControl key in HKCU. */
     res = RegOpenKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &feature_control);
-    if(res != ERROR_SUCCESS) {
-        res = RegCreateKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &feature_control);
-        ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
-        delete_feature_control_key = TRUE;
-    }
+    ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
 
     res = RegOpenKeyA(feature_control, szFeatureBehaviorsKey, &feature);
-    if(res == ERROR_SUCCESS)
+    if(res == ERROR_SUCCESS) {
         /* FEATURE_BEHAVIORS already existed, so don't delete it when we're done. */
         delete_feature_key = FALSE;
-    else {
+    }else {
         res = RegCreateKeyA(feature_control, szFeatureBehaviorsKey, &feature);
         ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
     }
@@ -1789,7 +1799,7 @@ static void test_internet_features_registry(void) {
         RegCloseKey(feature);
         RegDeleteKeyA(feature_control, szFeatureBehaviorsKey);
     } else {
-        RegDeleteValue(feature, name);
+        RegDeleteValueA(feature, name);
         RegCloseKey(feature);
     }
 
@@ -1802,8 +1812,6 @@ static void test_internet_features_registry(void) {
     ok(hres == S_OK, "CoInternetSetFeatureEnabled failed: %08x\n", hres);
 
     RegCloseKey(feature_control);
-    if(delete_feature_control_key)
-        RegDeleteKeyA(HKEY_CURRENT_USER, szFeatureControlKey);
 
     res = RegOpenKeyA(HKEY_LOCAL_MACHINE, szFeatureControlKey, &feature_control);
     ok(res == ERROR_SUCCESS, "RegOpenKey failed: %d\n", res);
@@ -1816,11 +1824,11 @@ static void test_internet_features_registry(void) {
     if (res == ERROR_ACCESS_DENIED)
     {
         skip("Not allowed to modify zone elevation\n");
-        skip_zone = 1;
+        skip_zone = TRUE;
     }
     else
     {
-        skip_zone = 0;
+        skip_zone = FALSE;
         ok(res == ERROR_SUCCESS, "RegSetValueEx failed: %d\n", res);
 
         hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS);
@@ -1897,11 +1905,40 @@ static void test_CoInternetSetFeatureEnabled(void) {
 }
 
 static void test_internet_features(void) {
+    HKEY key;
+    DWORD res;
+
     if(!pCoInternetIsFeatureEnabled || !pCoInternetSetFeatureEnabled) {
         win_skip("Skipping internet feature tests, IE is too old\n");
         return;
     }
 
+    /* IE10 takes FeatureControl key into account only if it's available upon process start. */
+    res = RegOpenKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &key);
+    if(res != ERROR_SUCCESS) {
+        PROCESS_INFORMATION pi;
+        STARTUPINFOA si = { 0 };
+        char cmdline[MAX_PATH];
+        char **argv;
+        BOOL ret;
+
+        res = RegCreateKeyA(HKEY_CURRENT_USER, szFeatureControlKey, &key);
+        ok(res == ERROR_SUCCESS, "RegCreateKey failed: %d\n", res);
+
+        trace("Running features tests in a separated process.\n");
+
+        winetest_get_mainargs( &argv );
+        sprintf(cmdline, "\"%s\" %s internet_features", argv[0], argv[1]);
+        ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
+        ok(ret, "Could not create process: %u\n", GetLastError());
+        winetest_wait_child_process( pi.hProcess );
+        CloseHandle(pi.hThread);
+        CloseHandle(pi.hProcess);
+
+        RegDeleteKeyA(HKEY_CURRENT_USER, szFeatureControlKey);
+        return;
+    }
+
     test_internet_features_registry();
     test_CoInternetIsFeatureEnabled();
     test_CoInternetSetFeatureEnabled();
@@ -1910,8 +1947,12 @@ static void test_internet_features(void) {
 START_TEST(misc)
 {
     HMODULE hurlmon;
+    int argc;
+    char **argv;
 
-    hurlmon = GetModuleHandle("urlmon.dll");
+    argc = winetest_get_mainargs(&argv);
+
+    hurlmon = GetModuleHandleA("urlmon.dll");
     pCoInternetCompareUrl = (void *) GetProcAddress(hurlmon, "CoInternetCompareUrl");
     pCoInternetGetSecurityUrl = (void*) GetProcAddress(hurlmon, "CoInternetGetSecurityUrl");
     pCoInternetGetSession = (void*) GetProcAddress(hurlmon, "CoInternetGetSession");
@@ -1936,23 +1977,26 @@ START_TEST(misc)
 
     OleInitialize(NULL);
 
-    register_protocols();
-
-    test_CreateFormatEnum();
-    test_RegisterFormatEnumerator();
-    test_CoInternetParseUrl();
-    test_CoInternetCompareUrl();
-    test_CoInternetQueryInfo();
-    test_FindMimeFromData();
-    test_NameSpace();
-    test_MimeFilter();
-    test_ReleaseBindInfo();
-    test_CopyStgMedium();
-    test_CopyBindInfo();
-    test_UrlMkGetSessionOption();
-    test_user_agent();
-    test_MkParseDisplayNameEx();
-    test_IsValidURL();
+    if(argc <= 2 || strcmp(argv[2], "internet_features")) {
+        register_protocols();
+
+        test_CreateFormatEnum();
+        test_RegisterFormatEnumerator();
+        test_CoInternetParseUrl();
+        test_CoInternetCompareUrl();
+        test_CoInternetQueryInfo();
+        test_FindMimeFromData();
+        test_NameSpace();
+        test_MimeFilter();
+        test_ReleaseBindInfo();
+        test_CopyStgMedium();
+        test_CopyBindInfo();
+        test_UrlMkGetSessionOption();
+        test_user_agent();
+        test_MkParseDisplayNameEx();
+        test_IsValidURL();
+    }
+
     test_internet_features();
 
     OleUninitialize();