[SHELL32_APITEST] -Add some tests for SHParseDisplayName for CORE-12882.
[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 <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 }