1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPLv2+ - See COPYING in the top level directory
4  * PURPOSE:         Test for WinHttpOpen
5  * PROGRAMMER:      Thomas Faber <thomas.faber@reactos.org>
6  */
7 
8 #include <apitest.h>
9 
10 #define WIN32_NO_STATUS
11 #define _INC_WINDOWS
12 #define COM_NO_WINDOWS_H
13 #include <windef.h>
14 #include <winsock2.h>
15 #include <winhttp.h>
16 
17 struct hostent *(WINAPI *pgethostbyname)(const char *);
18 int (WINAPI *pWSACancelBlockingCall)(void);
19 int (WINAPI *pWSAGetLastError)(void);
20 
21 HINTERNET (WINAPI *pWinHttpOpen)(LPCWSTR, DWORD, LPCWSTR, LPCWSTR, DWORD);
22 BOOL (WINAPI *pWinHttpCloseHandle)(HINTERNET);
23 
24 static
25 PVOID
26 GetProc(
27     PCSTR FunctionName)
28 {
29     HMODULE ModuleHandle;
30 
31     ModuleHandle = GetModuleHandleW(L"ws2_32");
32     if (!ModuleHandle)
33         return NULL;
34     return GetProcAddress(ModuleHandle, FunctionName);
35 }
36 
37 #define PROC(name) (p##name = GetProc(#name))
38 
39 static
40 BOOLEAN
41 IsWinsockLoaded(VOID)
42 {
43     return GetModuleHandleW(L"ws2_32") != NULL;
44 }
45 
46 static
47 BOOLEAN
48 IsWininetLoaded(VOID)
49 {
50     return GetModuleHandleW(L"wininet") != NULL;
51 }
52 
53 static
54 BOOLEAN
55 IsWinsockInitialized(VOID)
56 {
57     struct hostent *Hostent;
58 
59     if (!PROC(gethostbyname) || !PROC(WSAGetLastError))
60         return FALSE;
61 
62     Hostent = pgethostbyname("localhost");
63     if (!Hostent)
64         ok_dec(pWSAGetLastError(), WSANOTINITIALISED);
65     return Hostent != NULL;
66 }
67 
68 static
69 BOOLEAN
70 AreLegacyFunctionsSupported(VOID)
71 {
72     int Error;
73 
74     if (!PROC(WSACancelBlockingCall) || !PROC(WSAGetLastError))
75         return FALSE;
76 
77     Error = pWSACancelBlockingCall();
78     ok(Error == SOCKET_ERROR, "Error = %d\n", Error);
79     ok(pWSAGetLastError() == WSAEOPNOTSUPP ||
80        pWSAGetLastError() == WSAEINVAL, "WSAGetLastError = %d\n", pWSAGetLastError());
81 
82     return pWSAGetLastError() != WSAEOPNOTSUPP;
83 }
84 
85 START_TEST(WinHttpOpen)
86 {
87     HMODULE ModuleHandle;
88     HINTERNET InternetHandle;
89     BOOL Success;
90 
91     ok(!IsWinsockLoaded(), "Winsock loaded on startup\n");
92     ok(!IsWinsockInitialized(), "Winsock initialized on startup\n");
93     ok(!IsWininetLoaded(), "Wininet loaded on startup\n");
94 
95     ModuleHandle = GetModuleHandleW(L"winhttp");
96     ok_ptr(ModuleHandle, NULL);
97     ModuleHandle = LoadLibraryW(L"winhttp");
98     ok(ModuleHandle != NULL, "LoadLibrary failed, error %lu\n", GetLastError());
99 
100     pWinHttpOpen = (PVOID)GetProcAddress(ModuleHandle, "WinHttpOpen");
101     pWinHttpCloseHandle = (PVOID)GetProcAddress(ModuleHandle, "WinHttpCloseHandle");
102 
103     ok(!IsWinsockLoaded(), "Winsock loaded after winhttp load\n");
104     ok(!IsWinsockInitialized(), "Winsock initialized after winhttp load\n");
105     ok(!IsWininetLoaded(), "Wininet loaded after winhttp load\n");
106 
107     InternetHandle = pWinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);
108     ok(InternetHandle != NULL, "InternetHandle = NULL\n");
109 
110     if (InternetHandle != NULL)
111     {
112         ok(IsWinsockLoaded(), "Winsock not loaded after WinHttpOpen\n");
113         ok(IsWinsockInitialized(), "Winsock not initialized after WinHttpOpen\n");
114         ok(!IsWininetLoaded(), "Wininet loaded after WinHttpOpen\n");
115         ok(AreLegacyFunctionsSupported(), "Winsock initialized with version 2\n");
116         Success = pWinHttpCloseHandle(InternetHandle);
117         ok(Success, "WinHttpCloseHandle failed, error %lu\n", GetLastError());
118     }
119 
120     ok(IsWinsockLoaded(), "Winsock unloaded after handle close\n");
121     ok(IsWinsockInitialized(), "Winsock uninitialized after handle close\n");
122 
123     FreeLibrary(ModuleHandle);
124 
125     ok(IsWinsockLoaded(), "Winsock unloaded after winhttp unload\n");
126     trace("Winsock %sinitialized after winhttp unload (should be uninitialized in 2003, still initialized in 7)\n",
127           IsWinsockInitialized() ? "" : "un");
128 }
129