Juan Lang : winhttp: Add tests for WinHttpSetDefaultProxyConfiguration.

Alexandre Julliard julliard at winehq.org
Wed Jul 15 09:46:50 CDT 2009


Module: wine
Branch: master
Commit: 461b1240153beed83e631ba3c28ba30eaa16d9a7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=461b1240153beed83e631ba3c28ba30eaa16d9a7

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Jul 14 12:36:41 2009 -0700

winhttp: Add tests for WinHttpSetDefaultProxyConfiguration.

---

 dlls/winhttp/session.c         |    3 +-
 dlls/winhttp/tests/Makefile.in |    2 +-
 dlls/winhttp/tests/winhttp.c   |  130 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 132 insertions(+), 3 deletions(-)

diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 55f9779..e8c1677 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -703,8 +703,7 @@ BOOL WINAPI WinHttpGetProxyForUrl( HINTERNET hsession, LPCWSTR url, WINHTTP_AUTO
  */
 BOOL WINAPI WinHttpSetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info )
 {
-    FIXME("%p [%u, %s, %s]\n", info, info->dwAccessType, debugstr_w(info->lpszProxy),
-          debugstr_w(info->lpszProxyBypass));
+    FIXME("%p\n", info);
     return TRUE;
 }
 
diff --git a/dlls/winhttp/tests/Makefile.in b/dlls/winhttp/tests/Makefile.in
index 561efac..670ee1a 100644
--- a/dlls/winhttp/tests/Makefile.in
+++ b/dlls/winhttp/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = winhttp.dll
-IMPORTS   = winhttp kernel32
+IMPORTS   = winhttp advapi32 kernel32
 
 CTESTS = \
 	notification.c \
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 74e1c9a..9dced9d 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -24,6 +24,7 @@
 #include <winbase.h>
 #include <winhttp.h>
 #include <wincrypt.h>
+#include <winreg.h>
 
 #include "wine/test.h"
 
@@ -817,6 +818,134 @@ static void test_request_parameter_defaults(void)
     WinHttpCloseHandle(ses);
 }
 
+static const WCHAR Connections[] = {
+    'S','o','f','t','w','a','r','e','\\',
+    'M','i','c','r','o','s','o','f','t','\\',
+    'W','i','n','d','o','w','s','\\',
+    'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+    'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
+    'C','o','n','n','e','c','t','i','o','n','s',0 };
+static const WCHAR WinHttpSettings[] = {
+    'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 };
+
+static DWORD get_default_proxy_reg_value( BYTE *buf, DWORD len, DWORD *type )
+{
+    LONG l;
+    HKEY key;
+    DWORD ret = 0;
+
+    l = RegOpenKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, KEY_READ, &key );
+    if (!l)
+    {
+        DWORD size = 0;
+
+        l = RegQueryValueExW( key, WinHttpSettings, NULL, type, NULL, &size );
+        if (!l)
+        {
+            if (size <= len)
+                l = RegQueryValueExW( key, WinHttpSettings, NULL, type, buf,
+                    &size );
+            if (!l)
+                ret = size;
+        }
+        RegCloseKey( key );
+    }
+    return ret;
+}
+
+static void set_default_proxy_reg_value( BYTE *buf, DWORD len, DWORD type )
+{
+    LONG l;
+    HKEY key;
+
+    l = RegCreateKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, NULL, 0,
+        KEY_WRITE, NULL, &key, NULL );
+    if (!l)
+    {
+        RegSetValueExW( key, WinHttpSettings, 0, type, buf, len );
+        RegCloseKey( key );
+    }
+}
+
+static void test_set_default_proxy_config(void)
+{
+    static const WCHAR wideString[] = { 0x226f, 0x575b, 0 };
+    static const WCHAR normalString[] = { 'f','o','o',0 };
+    DWORD type, len;
+    BYTE *saved_proxy_settings = NULL;
+    WINHTTP_PROXY_INFO info;
+    BOOL ret;
+
+    /* FIXME: it would be simpler to read the current settings using
+     * WinHttpGetDefaultProxyConfiguration and save them using
+     * WinHttpSetDefaultProxyConfiguration, but they appear to have a bug.
+     *
+     * If a proxy is configured in the registry, e.g. via 'proxcfg -p "foo"',
+     * the access type reported by WinHttpGetDefaultProxyConfiguration is 1,
+     * WINHTTP_ACCESS_TYPE_NO_PROXY, whereas it should be
+     * WINHTTP_ACCESS_TYPE_NAMED_PROXY.
+     * If WinHttpSetDefaultProxyConfiguration is called with dwAccessType = 1,
+     * the lpszProxy and lpszProxyBypass values are ignored.
+     * Thus, if a proxy is set with proxycfg, then calling
+     * WinHttpGetDefaultProxyConfiguration followed by
+     * WinHttpSetDefaultProxyConfiguration results in the proxy settings
+     * getting deleted from the registry.
+     *
+     * Instead I read the current registry value and restore it directly.
+     */
+    len = get_default_proxy_reg_value( NULL, 0, &type );
+    if (len)
+    {
+        saved_proxy_settings = HeapAlloc( GetProcessHeap(), 0, len );
+        len = get_default_proxy_reg_value( saved_proxy_settings, len, &type );
+    }
+
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(NULL);
+    todo_wine
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+        "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+    /* test with invalid access type */
+    info.dwAccessType = 0xdeadbeef;
+    info.lpszProxy = info.lpszProxyBypass = NULL;
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(&info);
+    todo_wine
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+        "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+    /* at a minimum, the proxy server must be set */
+    info.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
+    info.lpszProxy = info.lpszProxyBypass = NULL;
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(&info);
+    todo_wine
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+        "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+    info.lpszProxyBypass = normalString;
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(&info);
+    todo_wine
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+        "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+    /* the proxy server can't have wide characters */
+    info.lpszProxy = wideString;
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(&info);
+    todo_wine
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+        "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+    info.lpszProxy = normalString;
+    SetLastError(0xdeadbeef);
+    ret = WinHttpSetDefaultProxyConfiguration(&info);
+    ok(ret, "WinHttpSetDefaultProxyConfiguration failed: %d\n", GetLastError());
+
+    set_default_proxy_reg_value( saved_proxy_settings, len, type );
+}
+
 START_TEST (winhttp)
 {
     test_OpenRequest();
@@ -827,4 +956,5 @@ START_TEST (winhttp)
     test_secure_connection();
     test_request_parameter_defaults();
     test_QueryOption();
+    test_set_default_proxy_config();
 }




More information about the wine-cvs mailing list