[WININET_WINETEST]
[reactos.git] / rostests / winetests / wininet / internet.c
index c928076..2d2a866 100644 (file)
@@ -35,8 +35,8 @@ static BOOL (WINAPI *pCreateUrlCacheContainerA)(DWORD, DWORD, DWORD, DWORD,
                                                 DWORD, DWORD, DWORD, DWORD);
 static BOOL (WINAPI *pCreateUrlCacheContainerW)(DWORD, DWORD, DWORD, DWORD,
                                                 DWORD, DWORD, DWORD, DWORD);
-static BOOL (WINAPI *pInternetTimeFromSystemTimeA)(CONST SYSTEMTIME *,DWORD ,LPSTR ,DWORD);
-static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPWSTR ,DWORD);
+static BOOL (WINAPI *pInternetTimeFromSystemTimeA)(const SYSTEMTIME *, DWORD, LPSTR, DWORD);
+static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(const SYSTEMTIME *, DWORD, LPWSTR, DWORD);
 static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD);
 static BOOL (WINAPI *pInternetTimeToSystemTimeW)(LPCWSTR ,SYSTEMTIME *,DWORD);
 static BOOL (WINAPI *pIsDomainLegalCookieDomainW)(LPCWSTR, LPCWSTR);
@@ -44,6 +44,8 @@ static DWORD (WINAPI *pPrivacyGetZonePreferenceW)(DWORD, DWORD, LPDWORD, LPWSTR,
 static DWORD (WINAPI *pPrivacySetZonePreferenceW)(DWORD, DWORD, DWORD, LPCWSTR);
 static BOOL (WINAPI *pInternetGetCookieExA)(LPCSTR,LPCSTR,LPSTR,LPDWORD,DWORD,LPVOID);
 static BOOL (WINAPI *pInternetGetCookieExW)(LPCWSTR,LPCWSTR,LPWSTR,LPDWORD,DWORD,LPVOID);
+static BOOL (WINAPI *pInternetGetConnectedStateExA)(LPDWORD,LPSTR,DWORD,DWORD);
+static BOOL (WINAPI *pInternetGetConnectedStateExW)(LPDWORD,LPWSTR,DWORD,DWORD);
 
 /* ############################### */
 
@@ -169,7 +171,7 @@ static void test_InternetQueryOptionA(void)
   len = 0xdeadbeef;
   retval = InternetQueryOptionA(NULL, INTERNET_OPTION_PROXY, NULL, &len);
   ok(!retval && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got wrong error %x(%u)\n", retval, GetLastError());
-  ok(len >= sizeof(INTERNET_PROXY_INFO) && len != 0xdeadbeef,"len = %u\n", len);
+  ok(len >= sizeof(INTERNET_PROXY_INFOA) && len != 0xdeadbeef,"len = %u\n", len);
 
   hinet = InternetOpenA(useragent,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL, 0);
   ok((hinet != 0x0),"InternetOpen Failed\n");
@@ -363,7 +365,7 @@ static void test_get_cookie(void)
   BOOL ret;
 
   SetLastError(0xdeadbeef);
-  ret = InternetGetCookie("http://www.example.com", NULL, NULL, &len);
+  ret = InternetGetCookieA("http://www.example.com", NULL, NULL, &len);
   ok(!ret && GetLastError() == ERROR_NO_MORE_ITEMS,
     "InternetGetCookie should have failed with %s and error %d\n",
     ret ? "TRUE" : "FALSE", GetLastError());
@@ -382,33 +384,33 @@ static void test_complicated_cookie(void)
   static const WCHAR testing_example_comW[] =
       {'h','t','t','p',':','/','/','t','e','s','t','i','n','g','.','e','x','a','m','p','l','e','.','c','o','m',0};
 
-  ret = InternetSetCookie("http://www.example.com/bar",NULL,"A=B; domain=.example.com");
+  ret = InternetSetCookieA("http://www.example.com/bar",NULL,"A=B; domain=.example.com");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com/bar",NULL,"C=D; domain=.example.com; path=/");
+  ret = InternetSetCookieA("http://www.example.com/bar",NULL,"C=D; domain=.example.com; path=/");
   ok(ret == TRUE,"InternetSetCookie failed\n");
 
   /* Technically illegal! domain should require 2 dots, but native wininet accepts it */
-  ret = InternetSetCookie("http://www.example.com",NULL,"E=F; domain=example.com");
+  ret = InternetSetCookieA("http://www.example.com",NULL,"E=F; domain=example.com");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com",NULL,"G=H; domain=.example.com; path=/foo");
+  ret = InternetSetCookieA("http://www.example.com",NULL,"G=H; domain=.example.com; path=/foo");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com/bar.html",NULL,"I=J; domain=.example.com");
+  ret = InternetSetCookieA("http://www.example.com/bar.html",NULL,"I=J; domain=.example.com");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com/bar/",NULL,"K=L; domain=.example.com");
+  ret = InternetSetCookieA("http://www.example.com/bar/",NULL,"K=L; domain=.example.com");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com/bar/",NULL,"M=N; domain=.example.com; path=/foo/");
+  ret = InternetSetCookieA("http://www.example.com/bar/",NULL,"M=N; domain=.example.com; path=/foo/");
   ok(ret == TRUE,"InternetSetCookie failed\n");
-  ret = InternetSetCookie("http://www.example.com/bar/",NULL,"O=P; secure; path=/bar");
+  ret = InternetSetCookieA("http://www.example.com/bar/",NULL,"O=P; secure; path=/bar");
   ok(ret == TRUE,"InternetSetCookie failed\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com", NULL, NULL, &len);
+  ret = InternetGetCookieA("http://testing.example.com", NULL, NULL, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(len == 19, "len = %u\n", len);
 
   len = 1024;
   memset(buffer, 0xac, sizeof(buffer));
-  ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(len == 19, "len = %u\n", len);
   ok(strlen(buffer) == 18, "strlen(buffer) = %u\n", lstrlenA(buffer));
@@ -423,7 +425,7 @@ static void test_complicated_cookie(void)
 
   len = 10;
   memset(buffer, 0xac, sizeof(buffer));
-  ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com", NULL, buffer, &len);
   ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
      "InternetGetCookie returned: %x(%u), expected ERROR_INSUFFICIENT_BUFFER\n", ret, GetLastError());
   ok(len == 19, "len = %u\n", len);
@@ -448,7 +450,7 @@ static void test_complicated_cookie(void)
   ok(len == 38, "len = %u\n", len);
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/foobar", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/foobar", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
@@ -460,7 +462,7 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/foobar/", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/foobar/", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
@@ -472,7 +474,7 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/foo/bar", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/foo/bar", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
@@ -484,7 +486,7 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/barfoo", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/barfoo", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
@@ -496,7 +498,7 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/barfoo/", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/barfoo/", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
@@ -508,7 +510,7 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/bar/foo", NULL, buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/bar/foo", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(len == 24, "len = %u\n", 24);
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
@@ -522,40 +524,40 @@ static void test_complicated_cookie(void)
 
   /* Cookie name argument is not implemented */
   len = 1024;
-  ret = InternetGetCookie("http://testing.example.com/bar/foo", "A", buffer, &len);
+  ret = InternetGetCookieA("http://testing.example.com/bar/foo", "A", buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(len == 24, "len = %u\n", 24);
 
   /* test persistent cookies */
-  ret = InternetSetCookie("http://testing.example.com", NULL, "A=B; expires=Fri, 01-Jan-2038 00:00:00 GMT");
+  ret = InternetSetCookieA("http://testing.example.com", NULL, "A=B; expires=Fri, 01-Jan-2038 00:00:00 GMT");
   ok(ret, "InternetSetCookie failed with error %d\n", GetLastError());
 
   len = sizeof(user);
-  ret = GetUserName(user, &len);
+  ret = GetUserNameA(user, &len);
   ok(ret, "GetUserName failed with error %d\n", GetLastError());
   for(; len>0; len--)
       user[len-1] = tolower(user[len-1]);
 
   sprintf(buffer, "Cookie:%s@testing.example.com/", user);
-  ret = GetUrlCacheEntryInfo(buffer, NULL, &len);
+  ret = GetUrlCacheEntryInfoA(buffer, NULL, &len);
   ok(!ret, "GetUrlCacheEntryInfo succeeded\n");
   ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetLastError() = %d\n", GetLastError());
 
   /* remove persistent cookie */
-  ret = InternetSetCookie("http://testing.example.com", NULL, "A=B");
+  ret = InternetSetCookieA("http://testing.example.com", NULL, "A=B");
   ok(ret, "InternetSetCookie failed with error %d\n", GetLastError());
 
-  ret = GetUrlCacheEntryInfo(buffer, NULL, &len);
+  ret = GetUrlCacheEntryInfoA(buffer, NULL, &len);
   ok(!ret, "GetUrlCacheEntryInfo succeeded\n");
   ok(GetLastError() == ERROR_FILE_NOT_FOUND, "GetLastError() = %d\n", GetLastError());
 
   /* try setting cookie for different domain */
-  ret = InternetSetCookie("http://www.aaa.example.com/bar",NULL,"E=F; domain=different.com");
+  ret = InternetSetCookieA("http://www.aaa.example.com/bar",NULL,"E=F; domain=different.com");
   ok(!ret, "InternetSetCookie succeeded\n");
   ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %d\n", GetLastError());
-  ret = InternetSetCookie("http://www.aaa.example.com.pl/bar",NULL,"E=F; domain=example.com.pl");
+  ret = InternetSetCookieA("http://www.aaa.example.com.pl/bar",NULL,"E=F; domain=example.com.pl");
   ok(ret, "InternetSetCookie failed with error: %d\n", GetLastError());
-  ret = InternetSetCookie("http://www.aaa.example.com.pl/bar",NULL,"E=F; domain=com.pl");
+  ret = InternetSetCookieA("http://www.aaa.example.com.pl/bar",NULL,"E=F; domain=com.pl");
   todo_wine ok(!ret, "InternetSetCookie succeeded\n");
 }
 
@@ -1026,11 +1028,11 @@ static void test_InternetSetOption(void)
     DWORD size;
     BOOL ret;
 
-    ses = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
+    ses = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
     ok(ses != 0, "InternetOpen failed: 0x%08x\n", GetLastError());
-    con = InternetConnect(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+    con = InternetConnectA(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
     ok(con != 0, "InternetConnect failed: 0x%08x\n", GetLastError());
-    req = HttpOpenRequest(con, "GET", "/", NULL, NULL, NULL, 0, 0);
+    req = HttpOpenRequestA(con, "GET", "/", NULL, NULL, NULL, 0, 0);
     ok(req != 0, "HttpOpenRequest failed: 0x%08x\n", GetLastError());
 
     /* INTERNET_OPTION_POLICY tests */
@@ -1055,31 +1057,31 @@ static void test_InternetSetOption(void)
 
     SetLastError(0xdeadbeef);
     ulArg = 11;
-    ret = InternetSetOption(NULL, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
+    ret = InternetSetOptionA(NULL, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
     ok(ret == FALSE, "InternetQueryOption should've failed\n");
     ok(GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "GetLastError() = %x\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ulArg = 11;
-    ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, 20);
+    ret = InternetSetOptionA(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, 20);
     ok(ret == FALSE, "InternetQueryOption should've failed\n");
     ok(GetLastError() == ERROR_INTERNET_BAD_OPTION_LENGTH, "GetLastError() = %d\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ulArg = 11;
-    ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
+    ret = InternetSetOptionA(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
     ok(ret == TRUE, "InternetQueryOption should've succeeded\n");
     ok(GetLastError() == 0xdeadbeef, "GetLastError() = %d\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ulArg = 4;
-    ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
+    ret = InternetSetOptionA(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
     ok(ret == FALSE, "InternetQueryOption should've failed\n");
     ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %x\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ulArg = 16;
-    ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
+    ret = InternetSetOptionA(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
     ok(ret == FALSE, "InternetQueryOption should've failed\n");
     ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %x\n", GetLastError());
 
@@ -1349,11 +1351,11 @@ static void test_InternetErrorDlg(void)
     res = InternetErrorDlg(NULL, NULL, 12055, flags, NULL);
     ok(res == ERROR_INVALID_HANDLE, "Got %d\n", res);
 
-    ses = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
+    ses = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
     ok(ses != 0, "InternetOpen failed: 0x%08x\n", GetLastError());
-    con = InternetConnect(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+    con = InternetConnectA(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
     ok(con != 0, "InternetConnect failed: 0x%08x\n", GetLastError());
-    req = HttpOpenRequest(con, "GET", "/", NULL, NULL, NULL, 0, 0);
+    req = HttpOpenRequestA(con, "GET", "/", NULL, NULL, NULL, 0, 0);
     ok(req != 0, "HttpOpenRequest failed: 0x%08x\n", GetLastError());
 
     /* NULL hwnd and FLAGS_ERROR_UI_FLAGS_NO_UI not set */
@@ -1453,6 +1455,140 @@ static void test_InternetErrorDlg(void)
     ok(res == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError());
 }
 
+static void test_InternetGetConnectedStateExA(void)
+{
+    BOOL res;
+    CHAR buffer[256];
+    DWORD flags, sz;
+
+    if(!pInternetGetConnectedStateExA) {
+        win_skip("InternetGetConnectedStateExA is not supported\n");
+        return;
+    }
+
+    res = pInternetGetConnectedStateExA(&flags, buffer, sizeof(buffer), 0);
+    if(!res) {
+        win_skip("InternetGetConnectedStateExA tests require a valid connection\n");
+        return;
+    }
+    trace("Internet Connection: Flags 0x%02x - Name '%s'\n", flags, buffer);
+
+    res = pInternetGetConnectedStateExA(NULL, NULL, 0, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+
+    flags = 0;
+    res = pInternetGetConnectedStateExA(&flags, NULL, 0, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExA(&flags, buffer, 0, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    ok(!buffer[0], "Buffer must not change, got %02X\n", buffer[0]);
+
+    buffer[0] = 0;
+    res = pInternetGetConnectedStateExA(NULL, buffer, sizeof(buffer), 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    sz = strlen(buffer);
+    ok(sz > 0, "Expected a connection name\n");
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExA(&flags, buffer, sizeof(buffer), 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    sz = strlen(buffer);
+    ok(sz > 0, "Expected a connection name\n");
+
+    /* no space for complete string this time */
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExA(&flags, buffer, sz, 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    ok(sz - 1 == strlen(buffer), "Expected %u bytes, got %u\n", sz - 1, lstrlenA(buffer));
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExA(&flags, buffer, 1, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    ok(strlen(buffer) == 0, "Expected 0 bytes, got %u\n", lstrlenA(buffer));
+}
+
+static void test_InternetGetConnectedStateExW(void)
+{
+    BOOL res;
+    WCHAR buffer[256];
+    DWORD flags, sz;
+
+    if(!pInternetGetConnectedStateExW) {
+        win_skip("InternetGetConnectedStateExW is not supported\n");
+        return;
+    }
+
+    res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+    if(!res) {
+        win_skip("InternetGetConnectedStateExW tests require a valid connection\n");
+        return;
+    }
+    trace("Internet Connection: Flags 0x%02x - Name '%s'\n", flags, wine_dbgstr_w(buffer));
+
+    res = pInternetGetConnectedStateExW(NULL, NULL, 0, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+
+    flags = 0;
+    res = pInternetGetConnectedStateExW(&flags, NULL, 0, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExW(&flags, buffer, 0, 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+todo_wine
+    ok(!buffer[0], "Buffer must not change, got %02X\n", buffer[0]);
+
+    buffer[0] = 0;
+    res = pInternetGetConnectedStateExW(NULL, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    sz = lstrlenW(buffer);
+    ok(sz > 0, "Expected a connection name\n");
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExW(&flags, buffer, sizeof(buffer) / sizeof(buffer[0]), 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    sz = lstrlenW(buffer);
+    ok(sz > 0, "Expected a connection name\n");
+
+    /* no space for complete string this time */
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExW(&flags, buffer, sz, 0);
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    ok(sz - 1 == lstrlenW(buffer), "Expected %u bytes, got %u\n", sz - 1, lstrlenW(buffer));
+
+    buffer[0] = 0;
+    flags = 0;
+    res = pInternetGetConnectedStateExW(&flags, buffer, 1, 0);
+todo_wine
+    ok(res == TRUE, "Expected TRUE, got %d\n", res);
+    ok(flags, "Expected at least one flag set\n");
+    ok(lstrlenW(buffer) == 0, "Expected 0 bytes, got %u\n", lstrlenW(buffer));
+}
+
 /* ############################### */
 
 START_TEST(internet)
@@ -1471,6 +1607,8 @@ START_TEST(internet)
     pPrivacySetZonePreferenceW = (void*)GetProcAddress(hdll, "PrivacySetZonePreferenceW");
     pInternetGetCookieExA = (void*)GetProcAddress(hdll, "InternetGetCookieExA");
     pInternetGetCookieExW = (void*)GetProcAddress(hdll, "InternetGetCookieExW");
+    pInternetGetConnectedStateExA = (void*)GetProcAddress(hdll, "InternetGetConnectedStateExA");
+    pInternetGetConnectedStateExW = (void*)GetProcAddress(hdll, "InternetGetConnectedStateExW");
 
     if(!pInternetGetCookieExW) {
         win_skip("Too old IE (older than 6.0)\n");
@@ -1479,6 +1617,8 @@ START_TEST(internet)
 
     test_InternetCanonicalizeUrlA();
     test_InternetQueryOptionA();
+    test_InternetGetConnectedStateExA();
+    test_InternetGetConnectedStateExW();
     test_get_cookie();
     test_complicated_cookie();
     test_cookie_url();