wininet: Add test for FtpGetCurrentDirectoryA in wininet/tests/ftp.c.
[wine] / dlls / wininet / tests / ftp.c
1 /*
2  * Wininet - ftp tests
3  *
4  * Copyright 2007 Paul Vriens
5  * Copyright 2007 Hans Leidekker
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 /*
23  * FIXME:
24  *     Use InternetGetLastResponseInfo when the last error is set to ERROR_INTERNET_EXTENDED_ERROR.
25  * TODO:
26  *     Add W-function tests.
27  *     Add missing function tests:
28  *         FtpFindFirstFile
29  *         FtpGetCurrentDirectory
30  *         FtpGetFileSize
31  *         FtpSetCurrentDirectory
32  */
33
34 #include <stdarg.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37
38 #include "windef.h"
39 #include "winbase.h"
40 #include "wininet.h"
41 #include "winsock.h"
42
43 #include "wine/test.h"
44
45 static void test_getfile_no_open(void)
46 {
47     BOOL      bRet;
48
49     /* Invalid internet handle, the others are valid parameters */
50     SetLastError(0xdeadbeef);
51     bRet = FtpGetFileA(NULL, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
52     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
53     ok ( GetLastError() == ERROR_INTERNET_NOT_INITIALIZED ||
54          GetLastError() == ERROR_INVALID_HANDLE,
55         "Expected ERROR_INTERNET_NOT_INITIALIZED or ERROR_INVALID_HANDLE (win98), got %d\n", GetLastError());
56 }
57
58 static void test_connect(HINTERNET hInternet)
59 {
60     HINTERNET hFtp;
61
62     /* Try a few username/password combinations:
63      * anonymous : NULL
64      * NULL      : IEUser@
65      * NULL      : NULL
66      */
67
68     SetLastError(0xdeadbeef);
69     hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
70     if (hFtp)  /* some servers accept an empty password */
71     {
72         ok ( GetLastError() == ERROR_SUCCESS, "ERROR_SUCCESS, got %d\n", GetLastError());
73         InternetCloseHandle(hFtp);
74     }
75     else
76         ok ( GetLastError() == ERROR_INTERNET_LOGIN_FAILURE,
77              "Expected ERROR_INTERNET_LOGIN_FAILURE, got %d\n", GetLastError());
78
79     SetLastError(0xdeadbeef);
80     hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, NULL, "IEUser@", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
81     ok ( hFtp == NULL, "Expected InternetConnect to fail\n");
82     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
83         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
84
85     /* Using a NULL username and password will be interpreted as anonymous ftp. The username will be 'anonymous' the password
86      * is created via some simple heuristics (see dlls/wininet/ftp.c).
87      * On Wine this registry key is not set by default so (NULL, NULL) will result in anonymous ftp with an (most likely) not
88      * accepted password (the username).
89      * If the first call fails because we get an ERROR_INTERNET_LOGIN_FAILURE, we try again with a (more) correct password.
90      */
91
92     SetLastError(0xdeadbeef);
93     hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
94     if (!hFtp && (GetLastError() == ERROR_INTERNET_LOGIN_FAILURE))
95     {
96         /* We are most likely running on a clean Wine install or a Windows install where the registry key is removed */
97         SetLastError(0xdeadbeef);
98         hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "anonymous", "IEUser@", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
99     }
100     ok ( hFtp != NULL, "InternetConnect failed : %d\n", GetLastError());
101     ok ( GetLastError() == ERROR_SUCCESS,
102         "ERROR_SUCCESS, got %d\n", GetLastError());
103 }
104
105 static void test_createdir(HINTERNET hFtp, HINTERNET hConnect)
106 {
107     BOOL      bRet;
108
109     /* Invalid internet handle, the other is a valid parameter */
110     SetLastError(0xdeadbeef);
111     bRet = FtpCreateDirectoryA(NULL, "new_directory_deadbeef");
112     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
113     ok ( GetLastError() == ERROR_INVALID_HANDLE,
114         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
115
116     /* No directory-name */
117     SetLastError(0xdeadbeef);
118     bRet = FtpCreateDirectoryA(hFtp, NULL);
119     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
120     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
121         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
122
123     /* Parameters are OK, but we shouldn't be allowed to create the directory */
124     SetLastError(0xdeadbeef);
125     bRet = FtpCreateDirectoryA(hFtp, "new_directory_deadbeef");
126     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
127     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
128         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
129
130     /* One small test to show that handle type is checked before parameters */
131     SetLastError(0xdeadbeef);
132     bRet = FtpCreateDirectoryA(hConnect, NULL);
133     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
134     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
135         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
136
137     SetLastError(0xdeadbeef);
138     bRet = FtpCreateDirectoryA(hConnect, "new_directory_deadbeef");
139     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
140     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
141         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
142 }
143
144 static void test_deletefile(HINTERNET hFtp, HINTERNET hConnect)
145 {
146     BOOL      bRet;
147
148     /* Invalid internet handle, the other is a valid parameter */
149     SetLastError(0xdeadbeef);
150     bRet = FtpDeleteFileA(NULL, "non_existent_file_deadbeef");
151     ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n");
152     ok ( GetLastError() == ERROR_INVALID_HANDLE,
153         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
154
155     /* No filename */
156     SetLastError(0xdeadbeef);
157     bRet = FtpDeleteFileA(hFtp, NULL);
158     ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n");
159     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
160         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
161
162     /* Parameters are OK but remote file should not be there */
163     SetLastError(0xdeadbeef);
164     bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef");
165     ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n");
166     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
167         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
168
169     /* One small test to show that handle type is checked before parameters */
170     SetLastError(0xdeadbeef);
171     bRet = FtpDeleteFileA(hConnect, NULL);
172     ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n");
173     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
174         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
175
176     SetLastError(0xdeadbeef);
177     bRet = FtpDeleteFileA(hConnect, "non_existent_file_deadbeef");
178     ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
179     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
180         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
181 }
182
183 static void test_getfile(HINTERNET hFtp, HINTERNET hConnect)
184 {
185     BOOL      bRet;
186     HANDLE    hFile;
187
188     /* The order of checking is:
189      *
190      *   All parameters except 'session handle' and 'condition flags'
191      *   Session handle
192      *   Session handle type
193      *   Condition flags
194      */
195
196     /* Test to show the parameter checking order depends on the Windows version */
197     SetLastError(0xdeadbeef);
198     bRet = FtpGetFileA(NULL, NULL, "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
199     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
200     ok ( GetLastError() == ERROR_INVALID_HANDLE ||
201          GetLastError() == ERROR_INVALID_PARAMETER,
202         "Expected ERROR_INVALID_HANDLE (win98) or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
203
204     /* Test to show session handle is checked before 'condition flags' */
205     SetLastError(0xdeadbeef);
206     bRet = FtpGetFileA(NULL, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, 5, 0);
207     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
208     ok ( GetLastError() == ERROR_INVALID_HANDLE,
209         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
210
211     /* Make sure we start clean */
212
213     DeleteFileA("should_be_non_existing_deadbeef");
214     DeleteFileA("should_also_be_non_existing_deadbeef");
215
216     /* No remote file */
217     SetLastError(0xdeadbeef);
218     bRet = FtpGetFileA(hFtp, NULL, "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
219     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
220     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
221         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
222     ok (GetFileAttributesA("should_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES,
223         "Local file should not have been created\n");
224     DeleteFileA("should_be_non_existing_deadbeef");
225
226     /* No local file */
227     SetLastError(0xdeadbeef);
228     bRet = FtpGetFileA(hFtp, "welcome.msg", NULL, FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
229     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
230     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
231         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
232
233     /* Zero attributes */
234     SetLastError(0xdeadbeef);
235     bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_existing_non_deadbeef", FALSE, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
236     ok ( bRet == TRUE, "Expected FtpGetFileA to succeed\n");
237     ok (GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
238     ok (GetFileAttributesA("should_be_existing_non_deadbeef") != INVALID_FILE_ATTRIBUTES,
239         "Local file should have been created\n");
240     DeleteFileA("should_be_existing_non_deadbeef");
241
242     /* Illegal condition flags */
243     SetLastError(0xdeadbeef);
244     bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, 0xffffffff, 0);
245     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
246     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR || GetLastError() == ERROR_INVALID_PARAMETER,
247         "Expected ERROR_INTERNET_EXTENDED_ERROR or ERROR_INVALID_PARAMETER (win98), got %d\n", GetLastError());
248     ok (GetFileAttributesA("should_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES,
249         "Local file should not have been created\n");
250     DeleteFileA("should_be_non_existing_deadbeef");
251
252     /* Remote file doesn't exist (and local doesn't exist as well) */
253     SetLastError(0xdeadbeef);
254     bRet = FtpGetFileA(hFtp, "should_be_non_existing_deadbeef", "should_also_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
255     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
256     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
257         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
258     /* Currently Wine always creates the local file (even on failure) which is not correct, hence the test */
259     todo_wine
260     ok (GetFileAttributesA("should_also_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES,
261         "Local file should not have been created\n");
262
263     DeleteFileA("should_also_be_non_existing_deadbeef");
264
265     /* Same call as the previous but now the local file does exists. Windows just removes the file if the call fails
266      * even if the local existed before!
267      */
268
269     /* Create a temporary local file */
270     SetLastError(0xdeadbeef);
271     hFile = CreateFileA("should_also_be_non_existing_deadbeef", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
272     ok ( hFile != NULL, "Error creating a local file : %d\n", GetLastError());
273     CloseHandle(hFile);
274     SetLastError(0xdeadbeef);
275     bRet = FtpGetFileA(hFtp, "should_be_non_existing_deadbeef", "should_also_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
276     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
277     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
278         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
279     /* Currently Wine always creates the local file (even on failure) which is not correct, hence the test */
280     todo_wine
281     ok (GetFileAttributesA("should_also_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES,
282         "Local file should not have been created\n");
283
284     DeleteFileA("should_also_be_non_existing_deadbeef");
285
286     /* This one should succeed */
287     SetLastError(0xdeadbeef);
288     bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_existing_non_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
289     ok ( bRet == TRUE, "Expected FtpGetFileA to fail\n");
290     ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
291
292     if (GetFileAttributesA("should_be_existing_non_deadbeef") != INVALID_FILE_ATTRIBUTES)
293     {
294         /* Should succeed as fFailIfExists is set to FALSE (meaning don't fail if local file exists) */
295         SetLastError(0xdeadbeef);
296         bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
297         ok ( bRet == TRUE, "Expected FtpGetFileA to succeed\n");
298         ok ( GetLastError() == ERROR_SUCCESS,
299             "Expected ERROR_SUCCESS, got %d\n", GetLastError());
300
301         /* Should fail as fFailIfExists is set to TRUE */
302         SetLastError(0xdeadbeef);
303         bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
304         ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
305         ok ( GetLastError() == ERROR_FILE_EXISTS,
306             "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
307
308         /* Prove that the existence of the local file is checked first (or at least reported last) */
309         SetLastError(0xdeadbeef);
310         bRet = FtpGetFileA(hFtp, "should_be_non_existing_deadbeef", "should_be_non_existing_deadbeef", TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
311         ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
312         ok ( GetLastError() == ERROR_FILE_EXISTS,
313             "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
314
315         DeleteFileA("should_be_existing_non_deadbeef");
316     }
317
318     /* Test to show the parameter checking order depends on the Windows version */
319     SetLastError(0xdeadbeef);
320     bRet = FtpGetFileA(hConnect, NULL, "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
321     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
322     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE ||
323          GetLastError() == ERROR_INVALID_PARAMETER,
324         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE (win98) or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
325
326     /* Test to show that 'session handle type' is checked before 'condition flags' */
327     SetLastError(0xdeadbeef);
328     bRet = FtpGetFileA(hConnect, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, 5, 0);
329     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
330     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
331         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
332
333     SetLastError(0xdeadbeef);
334     bRet = FtpGetFileA(hConnect, "should_be_non_existing_deadbeef", "should_be_non_existing_deadbeef", TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
335     ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
336     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
337         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
338 }
339
340 static void test_openfile(HINTERNET hFtp, HINTERNET hConnect)
341 {
342     HINTERNET hOpenFile;
343
344     /* Invalid internet handle, the rest are valid parameters */
345     SetLastError(0xdeadbeef);
346     hOpenFile = FtpOpenFileA(NULL, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
347     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
348     ok ( GetLastError() == ERROR_INVALID_HANDLE,
349         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
350     InternetCloseHandle(hOpenFile); /* Just in case */
351
352     /* No filename */
353     SetLastError(0xdeadbeef);
354     hOpenFile = FtpOpenFileA(hFtp, NULL, GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
355     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
356     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
357         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
358     InternetCloseHandle(hOpenFile); /* Just in case */
359
360     /* Illegal access flags */
361     SetLastError(0xdeadbeef);
362     hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", 0, FTP_TRANSFER_TYPE_ASCII, 0);
363     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
364     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
365         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
366     InternetCloseHandle(hOpenFile); /* Just in case */
367
368     /* Illegal combination of access flags */
369     SetLastError(0xdeadbeef);
370     hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ|GENERIC_WRITE, FTP_TRANSFER_TYPE_ASCII, 0);
371     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
372     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
373         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
374     InternetCloseHandle(hOpenFile); /* Just in case */
375
376     /* Illegal condition flags */
377     SetLastError(0xdeadbeef);
378     hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, 0xffffffff, 0);
379     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
380     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR || GetLastError() == ERROR_INVALID_PARAMETER,
381         "Expected ERROR_INTERNET_EXTENDED_ERROR or ERROR_INVALID_PARAMETER (win98), got %d\n", GetLastError());
382     InternetCloseHandle(hOpenFile); /* Just in case */
383
384     SetLastError(0xdeadbeef);
385     hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
386     ok ( hOpenFile != NULL, "Expected FtpOpenFileA to succeed\n");
387     ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", GetLastError());
388
389     if (hOpenFile)
390     {
391         BOOL bRet;
392         HINTERNET hOpenFile2;
393         HANDLE    hFile;
394
395         /* We have a handle so all ftp calls should fail (TODO: Put all ftp-calls in here) */
396         SetLastError(0xdeadbeef);
397         bRet = FtpCreateDirectoryA(hFtp, "new_directory_deadbeef");
398         ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n");
399         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
400             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
401
402         SetLastError(0xdeadbeef);
403         bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef");
404         ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n");
405         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
406             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
407
408         SetLastError(0xdeadbeef);
409         bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
410         ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n");
411         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
412             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
413         DeleteFileA("should_be_non_existing_deadbeef"); /* Just in case */
414
415         SetLastError(0xdeadbeef);
416         hOpenFile2 = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
417         ok ( bRet == FALSE, "Expected FtpOpenFileA to fail\n");
418         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
419             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
420         InternetCloseHandle(hOpenFile2); /* Just in case */
421
422         /* Create a temporary local file */
423         SetLastError(0xdeadbeef);
424         hFile = CreateFileA("now_existing_local", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
425         ok ( hFile != NULL, "Error creating a local file : %d\n", GetLastError());
426         CloseHandle(hFile);
427         SetLastError(0xdeadbeef);
428         bRet = FtpPutFileA(hFtp, "now_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
429         ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
430         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
431             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
432         DeleteFileA("now_existing_local");
433
434         SetLastError(0xdeadbeef);
435         bRet = FtpRemoveDirectoryA(hFtp, "should_be_non_existing_deadbeef_dir");
436         ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
437         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
438             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
439
440         SetLastError(0xdeadbeef);
441         bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", "new");
442         ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
443         ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS,
444             "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError());
445     }
446
447     InternetCloseHandle(hOpenFile);
448
449     /* One small test to show that handle type is checked before parameters */
450     SetLastError(0xdeadbeef);
451     hOpenFile = FtpOpenFileA(hConnect, "welcome.msg", GENERIC_READ, 5, 0);
452     ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n");
453     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
454         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
455     InternetCloseHandle(hOpenFile); /* Just in case */
456
457     SetLastError(0xdeadbeef);
458     hOpenFile = FtpOpenFileA(hConnect, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
459     ok ( hOpenFile == NULL, "Expected FtpOpenFileA to fail\n");
460     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
461         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
462
463     InternetCloseHandle(hOpenFile); /* Just in case */
464 }
465
466 static void test_putfile(HINTERNET hFtp, HINTERNET hConnect)
467 {
468     BOOL      bRet;
469     HANDLE    hFile;
470
471     /* The order of checking is:
472      *
473      *   All parameters except 'session handle' and 'condition flags'
474      *   Session handle
475      *   Session handle type
476      *   Condition flags
477      */
478
479     /* Test to show the parameter checking order depends on the Windows version */
480     SetLastError(0xdeadbeef);
481     bRet = FtpPutFileA(NULL, NULL, "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
482     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
483     ok ( GetLastError() == ERROR_INVALID_HANDLE ||
484          GetLastError() == ERROR_INVALID_PARAMETER,
485         "Expected ERROR_INVALID_HANDLE (win98) or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
486
487     /* Test to show session handle is checked before 'condition flags' */
488     SetLastError(0xdeadbeef);
489     bRet = FtpPutFileA(NULL, "non_existing_local", "non_existing_remote", 5, 0);
490     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
491     ok ( GetLastError() == ERROR_INVALID_HANDLE,
492         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
493
494     /* Start clean */
495     DeleteFileA("non_existing_local");
496
497     /* No local file given */
498     SetLastError(0xdeadbeef);
499     bRet = FtpPutFileA(hFtp, NULL, "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
500     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
501     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
502         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
503
504     /* No remote file given */
505     SetLastError(0xdeadbeef);
506     bRet = FtpPutFileA(hFtp, "non_existing_local", NULL, FTP_TRANSFER_TYPE_UNKNOWN, 0);
507     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
508     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
509         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
510
511     /* Illegal condition flags */
512     SetLastError(0xdeadbeef);
513     bRet = FtpPutFileA(hFtp, "non_existing_local", "non_existing_remote", 5, 0);
514     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
515     ok ( GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_INVALID_PARAMETER,
516         "Expected ERROR_FILE_NOT_FOUND or ERROR_INVALID_PARAMETER (win98), got %d\n", GetLastError());
517
518     /* Parameters are OK but local file doesn't exist */
519     SetLastError(0xdeadbeef);
520     bRet = FtpPutFileA(hFtp, "non_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
521     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
522     ok ( GetLastError() == ERROR_FILE_NOT_FOUND,
523         "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
524
525     /* Create a temporary local file */
526     SetLastError(0xdeadbeef);
527     hFile = CreateFileA("now_existing_local", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
528     ok ( hFile != NULL, "Error creating a local file : %d\n", GetLastError());
529     CloseHandle(hFile);
530
531     /* Local file exists but we shouldn't be allowed to 'put' the file */
532     SetLastError(0xdeadbeef);
533     bRet = FtpPutFileA(hFtp, "now_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
534     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
535     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
536         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
537
538     DeleteFileA("now_existing_local");
539
540     /* Test to show the parameter checking order depends on the Windows version */
541     SetLastError(0xdeadbeef);
542     bRet = FtpPutFileA(hConnect, NULL, "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
543     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
544     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE ||
545          GetLastError() == ERROR_INVALID_PARAMETER,
546         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE (win98) or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
547
548     /* Test to show that 'session handle type' is checked before 'condition flags' */
549     SetLastError(0xdeadbeef);
550     bRet = FtpPutFileA(hConnect, "non_existing_local", "non_existing_remote", 5, 0);
551     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
552     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
553         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
554
555     SetLastError(0xdeadbeef);
556     bRet = FtpPutFileA(hConnect, "non_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0);
557     ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");
558     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
559         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
560 }
561
562 static void test_removedir(HINTERNET hFtp, HINTERNET hConnect)
563 {
564     BOOL      bRet;
565
566     /* Invalid internet handle, the other is a valid parameter */
567     SetLastError(0xdeadbeef);
568     bRet = FtpRemoveDirectoryA(NULL, "should_be_non_existing_deadbeef_dir");
569     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
570     ok ( GetLastError() == ERROR_INVALID_HANDLE,
571         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
572
573     /* No remote directory given */
574     SetLastError(0xdeadbeef);
575     bRet = FtpRemoveDirectoryA(hFtp, NULL);
576     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
577     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
578         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
579
580     /* Remote directory doesn't exist */
581     SetLastError(0xdeadbeef);
582     bRet = FtpRemoveDirectoryA(hFtp, "should_be_non_existing_deadbeef_dir");
583     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
584     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
585         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
586
587     /* We shouldn't be allowed to remove that directory */
588     SetLastError(0xdeadbeef);
589     bRet = FtpRemoveDirectoryA(hFtp, "pub");
590     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
591     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
592         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
593
594     /* One small test to show that handle type is checked before parameters */
595     SetLastError(0xdeadbeef);
596     bRet = FtpRemoveDirectoryA(hConnect, NULL);
597     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
598     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
599         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
600
601     SetLastError(0xdeadbeef);
602     bRet = FtpRemoveDirectoryA(hConnect, "should_be_non_existing_deadbeef_dir");
603     ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n");
604     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
605         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
606 }
607
608 static void test_renamefile(HINTERNET hFtp, HINTERNET hConnect)
609 {
610     BOOL      bRet;
611
612     /* Invalid internet handle, the rest are valid parameters */
613     SetLastError(0xdeadbeef);
614     bRet = FtpRenameFileA(NULL , "should_be_non_existing_deadbeef", "new");
615     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
616     ok ( GetLastError() == ERROR_INVALID_HANDLE,
617         "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
618
619     /* No 'existing' file */
620     SetLastError(0xdeadbeef);
621     bRet = FtpRenameFileA(hFtp , NULL, "new");
622     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
623     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
624         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
625
626     /* No new file */
627     SetLastError(0xdeadbeef);
628     bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", NULL);
629     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
630     ok ( GetLastError() == ERROR_INVALID_PARAMETER,
631         "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
632
633     /* Existing file shouldn't be there */
634     SetLastError(0xdeadbeef);
635     bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", "new");
636     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
637     ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR,
638         "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError());
639
640     /* One small test to show that handle type is checked before parameters */
641     SetLastError(0xdeadbeef);
642     bRet = FtpRenameFileA(hConnect , "should_be_non_existing_deadbeef", NULL);
643     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
644     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
645         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
646
647     SetLastError(0xdeadbeef);
648     bRet = FtpRenameFileA(hConnect , "should_be_non_existing_deadbeef", "new");
649     ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n");
650     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
651         "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
652 }
653
654 static void test_command(HINTERNET hFtp, HINTERNET hConnect)
655 {
656     BOOL ret;
657     DWORD error;
658     unsigned int i;
659     static const struct
660     {
661         BOOL  ret;
662         DWORD error;
663         const char *cmd;
664     }
665     command_test[] =
666     {
667         { FALSE, ERROR_INVALID_PARAMETER,       NULL },
668         { FALSE, ERROR_INVALID_PARAMETER,       "" },
669         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "HELO" },
670         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
671         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, " SIZE" },
672         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
673         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg /welcome.msg" },
674         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE  /welcome.msg" },
675         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg " },
676         { TRUE,  ERROR_SUCCESS,                 "SIZE\t/welcome.msg" },
677         { TRUE,  ERROR_SUCCESS,                 "SIZE /welcome.msg" },
678         { FALSE, ERROR_INTERNET_EXTENDED_ERROR, "PWD /welcome.msg" },
679         { TRUE,  ERROR_SUCCESS,                 "PWD" },
680         { TRUE,  ERROR_SUCCESS,                 "PWD\r\n" }
681     };
682
683     for (i = 0; i < sizeof(command_test) / sizeof(command_test[0]); i++)
684     {
685         SetLastError(0xdeadbeef);
686         ret = FtpCommandA(hFtp, FALSE, FTP_TRANSFER_TYPE_ASCII, command_test[i].cmd, 0, NULL);
687         error = GetLastError();
688
689         ok(ret == command_test[i].ret, "%d: expected FtpCommandA to %s\n", i, command_test[i].ret ? "succeed" : "fail");
690         ok(error == command_test[i].error, "%d: expected error %u, got %u\n", i, command_test[i].error, error);
691     }
692 }
693
694 static void test_get_current_dir(HINTERNET hFtp, HINTERNET hConnect)
695 {
696     BOOL    bRet;
697     DWORD   dwCurrentDirectoryLen = MAX_PATH;
698     CHAR    lpszCurrentDirectory[MAX_PATH];
699
700     /* change directories to get a more interesting pwd */
701     bRet = FtpCommandA(hFtp, FALSE, FTP_TRANSFER_TYPE_ASCII, "CWD pub/", 0, NULL);
702     if(bRet == FALSE)
703     {
704         skip("Failed to change directories in test_get_current_dir(HINTERNET hFtp).\n");
705         return;
706     }
707
708     /* test with all NULL arguments */
709     SetLastError(0xdeadbeef);
710     bRet = FtpGetCurrentDirectoryA( NULL, NULL, 0 );
711     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
712     ok ( GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got: %d\n", GetLastError());
713
714     /* test with NULL parameters instead of expected LPSTR/LPDWORD */
715     SetLastError(0xdeadbeef);
716     bRet = FtpGetCurrentDirectoryA( hFtp, NULL, 0 );
717     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
718     ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got: %d\n", GetLastError());
719
720     /* test with no valid handle and valid parameters */
721     SetLastError(0xdeadbeef);
722     bRet = FtpGetCurrentDirectoryA( NULL, lpszCurrentDirectory, &dwCurrentDirectoryLen );
723     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
724     ok ( GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got: %d\n", GetLastError());
725
726     /* test with invalid dwCurrentDirectory and all other parameters correct */
727     SetLastError(0xdeadbeef);
728     bRet = FtpGetCurrentDirectoryA( hFtp, lpszCurrentDirectory, 0 );
729     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
730     ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got: %d\n", GetLastError());
731
732     /* test with invalid lpszCurrentDirectory and all other parameters correct */
733     SetLastError(0xdeadbeef);
734     bRet = FtpGetCurrentDirectoryA( hFtp, NULL, &dwCurrentDirectoryLen );
735     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
736     ok ( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got: %d\n", GetLastError());
737
738     /* test to show it checks the handle type */
739     SetLastError(0xdeadbeef);
740     bRet = FtpGetCurrentDirectoryA( hConnect, lpszCurrentDirectory, &dwCurrentDirectoryLen );
741     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n" );
742     ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
743     "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got: %d\n", GetLastError());
744
745     /* test for the current directory with legitimate values */
746     SetLastError(0xdeadbeef);
747     bRet = FtpGetCurrentDirectoryA( hFtp, lpszCurrentDirectory, &dwCurrentDirectoryLen );
748     ok ( bRet == TRUE, "Expected FtpGetCurrentDirectoryA to pass\n" );
749 todo_wine
750     ok ( lstrcmp(lpszCurrentDirectory, "/pub") == 0, "Expected returned value \"%s\" to match \"%s\" \n", (char*)lpszCurrentDirectory, "/pub");
751     ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got: %d\n", GetLastError());
752
753
754     /* test for the current directory with a size only large enough to
755      * fit the string and not the null terminating character */
756     SetLastError(0xdeadbeef);
757     dwCurrentDirectoryLen = 4;
758     lpszCurrentDirectory[4] = 'a'; /* set position 4 of the array to something else to make sure a leftover \0 isn't fooling the test */
759     bRet = FtpGetCurrentDirectoryA( hFtp, lpszCurrentDirectory, &dwCurrentDirectoryLen );
760 todo_wine
761     ok ( bRet == FALSE, "Expected FtpGetCurrentDirectoryA to fail\n");
762     ok ( lstrcmp(lpszCurrentDirectory, "/pub") != 0, "Expected returned value \"%s\" to not match \"%s\" \n", (char*)lpszCurrentDirectory, "/pub");
763 todo_wine
764     ok ( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got: %d\n", GetLastError());
765
766     /* test for the current directory with a size large enough to store
767      * the expected string as well as the null terminating character */
768     SetLastError(0xdeadbeef);
769     dwCurrentDirectoryLen = 5;
770     bRet = FtpGetCurrentDirectoryA( hFtp, lpszCurrentDirectory, &dwCurrentDirectoryLen );
771     ok ( bRet == TRUE, "Expected FtpGetCurrentDirectoryA to pass\n");
772 todo_wine
773     ok ( lstrcmp(lpszCurrentDirectory, "/pub") == 0, "Expected returned value \"%s\" to match \"%s\" \n", (char*)lpszCurrentDirectory, "/pub");
774     ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got: %d\n", GetLastError());
775 }
776
777 START_TEST(ftp)
778 {
779     HANDLE hInternet, hFtp, hHttp;
780
781     SetLastError(0xdeadbeef);
782     hInternet = InternetOpen("winetest", 0, NULL, NULL, 0);
783     ok(hInternet != NULL, "InternetOpen failed: %u\n", GetLastError());
784
785     hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
786     if (!hFtp)
787     {
788         InternetCloseHandle(hInternet);
789         skip("No ftp connection could be made to ftp.winehq.org\n");
790         return;
791     }
792     hHttp = InternetConnect(hInternet, "www.winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
793     if (!hHttp)
794     {
795         InternetCloseHandle(hFtp);
796         InternetCloseHandle(hInternet);
797         skip("No http connection could be made to www.winehq.org\n");
798         return;
799     }
800
801     /* The first call should always be a proper InternetOpen, if not
802      * several calls will return ERROR_INTERNET_NOT_INITIALIZED when
803      * all parameters are correct but no session handle is given. Whereas
804      * the same call will return ERROR_INVALID_HANDLE if an InternetOpen
805      * is done before.
806      * The following test will show that behaviour, where the tests inside
807      * the other sub-tests will show the other situation.
808      */
809     test_getfile_no_open();
810     test_connect(hInternet);
811     test_createdir(hFtp, hHttp);
812     test_deletefile(hFtp, hHttp);
813     test_getfile(hFtp, hHttp);
814     test_openfile(hFtp, hHttp);
815     test_putfile(hFtp, hHttp);
816     test_removedir(hFtp, hHttp);
817     test_renamefile(hFtp, hHttp);
818     test_command(hFtp, hHttp);
819     test_get_current_dir(hFtp, hHttp);
820
821     InternetCloseHandle(hHttp);
822     InternetCloseHandle(hFtp);
823     InternetCloseHandle(hInternet);
824 }