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