[APITEST:WININET]
[reactos.git] / rostests / apitests / wininet / InternetOpen.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for InternetOpen
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
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 <wininet.h>
16
17 struct hostent *(WINAPI *pgethostbyname)(const char *);
18 int (WINAPI *pWSACancelBlockingCall)(void);
19 int (WINAPI *pWSAGetLastError)(void);
20
21 HINTERNET (WINAPI *pInternetOpen)(LPCTSTR, DWORD, LPCTSTR, LPCTSTR, DWORD);
22 BOOL (WINAPI *pInternetCloseHandle)(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 IsWinsockInitialized(VOID)
49 {
50 struct hostent *Hostent;
51
52 if (!PROC(gethostbyname) || !PROC(WSAGetLastError))
53 return FALSE;
54
55 Hostent = pgethostbyname("localhost");
56 if (!Hostent)
57 ok_dec(pWSAGetLastError(), WSANOTINITIALISED);
58 return Hostent != NULL;
59 }
60
61 static
62 BOOLEAN
63 AreLegacyFunctionsSupported(VOID)
64 {
65 int Error;
66
67 if (!PROC(WSACancelBlockingCall) || !PROC(WSAGetLastError))
68 return FALSE;
69
70 Error = pWSACancelBlockingCall();
71 ok(Error == SOCKET_ERROR, "Error = %d\n", Error);
72 ok(pWSAGetLastError() == WSAEOPNOTSUPP ||
73 pWSAGetLastError() == WSAEINVAL, "WSAGetLastError = %d\n", pWSAGetLastError());
74
75 return pWSAGetLastError() != WSAEOPNOTSUPP;
76 }
77
78 START_TEST(InternetOpen)
79 {
80 HMODULE ModuleHandle;
81 HINTERNET InternetHandle;
82 BOOL Success;
83
84 ok(!IsWinsockLoaded(), "Winsock loaded on startup\n");
85 ok(!IsWinsockInitialized(), "Winsock initialized on startup\n");
86
87 ModuleHandle = GetModuleHandleW(L"wininet");
88 ok_ptr(ModuleHandle, NULL);
89 ModuleHandle = LoadLibraryW(L"wininet");
90 ok(ModuleHandle != NULL, "LoadLibrary failed, error %lu\n", GetLastError());
91
92 pInternetOpen = (PVOID)GetProcAddress(ModuleHandle, "InternetOpenW");
93 pInternetCloseHandle = (PVOID)GetProcAddress(ModuleHandle, "InternetCloseHandle");
94
95 ok(!IsWinsockLoaded(), "Winsock loaded after wininet load\n");
96 ok(!IsWinsockInitialized(), "Winsock initialized after wininet load\n");
97
98 InternetHandle = pInternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
99 ok(InternetHandle != NULL, "InternetHandle = NULL\n");
100
101 if (InternetHandle != NULL)
102 {
103 ok(IsWinsockLoaded(), "Winsock not loaded after InternetOpen\n");
104 ok(IsWinsockInitialized(), "Winsock not initialized after InternetOpen\n");
105 ok(!AreLegacyFunctionsSupported(), "Winsock initialized with version 1\n");
106 Success = pInternetCloseHandle(InternetHandle);
107 ok(Success, "InternetCloseHandle failed, error %lu\n", GetLastError());
108 }
109
110 ok(IsWinsockLoaded(), "Winsock unloaded after handle close\n");
111 ok(IsWinsockInitialized(), "Winsock uninitialized after handle close\n");
112
113 FreeLibrary(ModuleHandle);
114
115 ok(IsWinsockLoaded(), "Winsock unloaded after wininet unload\n");
116 trace("Winsock %sinitialized after wininet unload (should be uninitialized in 2003, still initialized in 7)\n",
117 IsWinsockInitialized() ? "" : "un");
118 }