2 * Unit test suite for directory functions.
4 * Copyright 2002 Dmitry Timoshkov
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/test.h"
28 /* If you change something in these tests, please do the same
29 * for GetSystemDirectory tests.
31 static void test_GetWindowsDirectoryA(void)
33 UINT len
, len_with_null
;
36 len_with_null
= GetWindowsDirectoryA(NULL
, 0);
37 ok(len_with_null
<= MAX_PATH
, "should fit into MAX_PATH\n");
40 len_with_null
= GetWindowsDirectoryA(buf
, 1);
41 ok(lstrcmpA(buf
, "foo") == 0, "should not touch the buffer\n");
44 len
= GetWindowsDirectoryA(buf
, len_with_null
- 1);
45 ok(lstrcmpA(buf
, "foo") == 0, "should not touch the buffer\n");
46 ok(len
== len_with_null
, "GetWindowsDirectoryW returned %d, expected %d\n",
50 len
= GetWindowsDirectoryA(buf
, len_with_null
);
51 ok(lstrcmpA(buf
, "foo") != 0, "should touch the buffer\n");
52 ok(len
== strlen(buf
), "returned length should be equal to the length of string\n");
53 ok(len
== len_with_null
-1, "GetWindowsDirectoryA returned %d, expected %d\n",
54 len
, len_with_null
-1);
57 static void test_GetWindowsDirectoryW(void)
59 UINT len
, len_with_null
;
61 static const WCHAR fooW
[] = {'f','o','o',0};
63 len_with_null
= GetWindowsDirectoryW(NULL
, 0);
64 if (len_with_null
== 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
66 win_skip("GetWindowsDirectoryW is not implemented\n");
69 ok(len_with_null
<= MAX_PATH
, "should fit into MAX_PATH\n");
72 len
= GetWindowsDirectoryW(buf
, 1);
73 ok(lstrcmpW(buf
, fooW
) == 0, "should not touch the buffer\n");
74 ok(len
== len_with_null
, "GetWindowsDirectoryW returned %d, expected %d\n",
78 len
= GetWindowsDirectoryW(buf
, len_with_null
- 1);
79 ok(lstrcmpW(buf
, fooW
) == 0, "should not touch the buffer\n");
80 ok(len
== len_with_null
, "GetWindowsDirectoryW returned %d, expected %d\n",
84 len
= GetWindowsDirectoryW(buf
, len_with_null
);
85 ok(lstrcmpW(buf
, fooW
) != 0, "should touch the buffer\n");
86 ok(len
== lstrlenW(buf
), "returned length should be equal to the length of string\n");
87 ok(len
== len_with_null
-1, "GetWindowsDirectoryW returned %d, expected %d\n",
88 len
, len_with_null
-1);
92 /* If you change something in these tests, please do the same
93 * for GetWindowsDirectory tests.
95 static void test_GetSystemDirectoryA(void)
97 UINT len
, len_with_null
;
100 len_with_null
= GetSystemDirectoryA(NULL
, 0);
101 ok(len_with_null
<= MAX_PATH
, "should fit into MAX_PATH\n");
103 lstrcpyA(buf
, "foo");
104 len
= GetSystemDirectoryA(buf
, 1);
105 ok(lstrcmpA(buf
, "foo") == 0, "should not touch the buffer\n");
106 ok(len
== len_with_null
, "GetSystemDirectoryA returned %d, expected %d\n",
109 lstrcpyA(buf
, "foo");
110 len
= GetSystemDirectoryA(buf
, len_with_null
- 1);
111 ok(lstrcmpA(buf
, "foo") == 0, "should not touch the buffer\n");
112 ok(len
== len_with_null
, "GetSystemDirectoryA returned %d, expected %d\n",
115 lstrcpyA(buf
, "foo");
116 len
= GetSystemDirectoryA(buf
, len_with_null
);
117 ok(lstrcmpA(buf
, "foo") != 0, "should touch the buffer\n");
118 ok(len
== strlen(buf
), "returned length should be equal to the length of string\n");
119 ok(len
== len_with_null
-1, "GetSystemDirectoryW returned %d, expected %d\n",
120 len
, len_with_null
-1);
123 static void test_GetSystemDirectoryW(void)
125 UINT len
, len_with_null
;
127 static const WCHAR fooW
[] = {'f','o','o',0};
129 len_with_null
= GetSystemDirectoryW(NULL
, 0);
130 if (len_with_null
== 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
132 win_skip("GetSystemDirectoryW is not available\n");
135 ok(len_with_null
<= MAX_PATH
, "should fit into MAX_PATH\n");
138 len
= GetSystemDirectoryW(buf
, 1);
139 ok(lstrcmpW(buf
, fooW
) == 0, "should not touch the buffer\n");
140 ok(len
== len_with_null
, "GetSystemDirectoryW returned %d, expected %d\n",
144 len
= GetSystemDirectoryW(buf
, len_with_null
- 1);
145 ok(lstrcmpW(buf
, fooW
) == 0, "should not touch the buffer\n");
146 ok(len
== len_with_null
, "GetSystemDirectoryW returned %d, expected %d\n",
150 len
= GetSystemDirectoryW(buf
, len_with_null
);
151 ok(lstrcmpW(buf
, fooW
) != 0, "should touch the buffer\n");
152 ok(len
== lstrlenW(buf
), "returned length should be equal to the length of string\n");
153 ok(len
== len_with_null
-1, "GetSystemDirectoryW returned %d, expected %d\n",
154 len
, len_with_null
-1);
157 static void test_CreateDirectoryA(void)
159 char tmpdir
[MAX_PATH
];
162 ret
= CreateDirectoryA(NULL
, NULL
);
163 ok(ret
== FALSE
&& (GetLastError() == ERROR_PATH_NOT_FOUND
||
164 GetLastError() == ERROR_INVALID_PARAMETER
),
165 "CreateDirectoryA(NULL): ret=%d err=%d\n", ret
, GetLastError());
167 ret
= CreateDirectoryA("", NULL
);
168 ok(ret
== FALSE
&& (GetLastError() == ERROR_BAD_PATHNAME
||
169 GetLastError() == ERROR_PATH_NOT_FOUND
),
170 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
172 ret
= GetSystemDirectoryA(tmpdir
, MAX_PATH
);
173 ok(ret
< MAX_PATH
, "System directory should fit into MAX_PATH\n");
175 ret
= SetCurrentDirectoryA(tmpdir
);
176 ok(ret
== TRUE
, "could not chdir to the System directory\n");
178 ret
= CreateDirectoryA(".", NULL
);
179 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
180 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
183 ret
= CreateDirectoryA("..", NULL
);
184 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
185 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
187 GetTempPathA(MAX_PATH
, tmpdir
);
188 tmpdir
[3] = 0; /* truncate the path */
189 ret
= CreateDirectoryA(tmpdir
, NULL
);
190 ok(ret
== FALSE
&& (GetLastError() == ERROR_ALREADY_EXISTS
||
191 GetLastError() == ERROR_ACCESS_DENIED
),
192 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
194 GetTempPathA(MAX_PATH
, tmpdir
);
195 lstrcatA(tmpdir
, "Please Remove Me");
196 ret
= CreateDirectoryA(tmpdir
, NULL
);
197 ok(ret
== TRUE
, "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
199 ret
= CreateDirectoryA(tmpdir
, NULL
);
200 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
201 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
203 ret
= RemoveDirectoryA(tmpdir
);
205 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
208 lstrcatA(tmpdir
, "?");
209 ret
= CreateDirectoryA(tmpdir
, NULL
);
210 ok(ret
== FALSE
&& (GetLastError() == ERROR_INVALID_NAME
||
211 GetLastError() == ERROR_PATH_NOT_FOUND
),
212 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
213 RemoveDirectoryA(tmpdir
);
215 tmpdir
[lstrlenA(tmpdir
) - 1] = '*';
216 ret
= CreateDirectoryA(tmpdir
, NULL
);
217 ok(ret
== FALSE
&& (GetLastError() == ERROR_INVALID_NAME
||
218 GetLastError() == ERROR_PATH_NOT_FOUND
),
219 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
220 RemoveDirectoryA(tmpdir
);
222 GetTempPathA(MAX_PATH
, tmpdir
);
223 lstrcatA(tmpdir
, "Please Remove Me/Please Remove Me");
224 ret
= CreateDirectoryA(tmpdir
, NULL
);
225 ok(ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
226 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
227 RemoveDirectoryA(tmpdir
);
229 /* Test behavior with a trailing dot.
230 * The directory should be created without the dot.
232 GetTempPathA(MAX_PATH
, tmpdir
);
233 lstrcatA(tmpdir
, "Please Remove Me.");
234 ret
= CreateDirectoryA(tmpdir
, NULL
);
236 "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
238 lstrcatA(tmpdir
, "/Please Remove Me");
239 ret
= CreateDirectoryA(tmpdir
, NULL
);
241 "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
242 ret
= RemoveDirectoryA(tmpdir
);
244 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
246 GetTempPathA(MAX_PATH
, tmpdir
);
247 lstrcatA(tmpdir
, "Please Remove Me");
248 ret
= RemoveDirectoryA(tmpdir
);
250 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
252 /* Test behavior with two trailing dots.
253 * The directory should be created without the trailing dots.
255 GetTempPathA(MAX_PATH
, tmpdir
);
256 lstrcatA(tmpdir
, "Please Remove Me..");
257 ret
= CreateDirectoryA(tmpdir
, NULL
);
259 "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
261 lstrcatA(tmpdir
, "/Please Remove Me");
262 ret
= CreateDirectoryA(tmpdir
, NULL
);
263 ok(ret
== TRUE
|| /* On Win98 */
264 (ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
), /* On NT! */
265 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
268 ret
= RemoveDirectoryA(tmpdir
);
270 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
273 GetTempPathA(MAX_PATH
, tmpdir
);
274 lstrcatA(tmpdir
, "Please Remove Me");
275 ret
= RemoveDirectoryA(tmpdir
);
277 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
279 /* Test behavior with a trailing space.
280 * The directory should be created without the trailing space.
282 GetTempPathA(MAX_PATH
, tmpdir
);
283 lstrcatA(tmpdir
, "Please Remove Me ");
284 ret
= CreateDirectoryA(tmpdir
, NULL
);
286 "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
288 lstrcatA(tmpdir
, "/Please Remove Me");
289 ret
= CreateDirectoryA(tmpdir
, NULL
);
290 ok(ret
== TRUE
|| /* On Win98 */
291 (ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
), /* On NT! */
292 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
295 ret
= RemoveDirectoryA(tmpdir
);
297 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
300 GetTempPathA(MAX_PATH
, tmpdir
);
301 lstrcatA(tmpdir
, "Please Remove Me");
302 ret
= RemoveDirectoryA(tmpdir
);
304 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
306 /* Test behavior with a trailing space.
307 * The directory should be created without the trailing spaces.
309 GetTempPathA(MAX_PATH
, tmpdir
);
310 lstrcatA(tmpdir
, "Please Remove Me ");
311 ret
= CreateDirectoryA(tmpdir
, NULL
);
313 "CreateDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
315 lstrcatA(tmpdir
, "/Please Remove Me");
316 ret
= CreateDirectoryA(tmpdir
, NULL
);
317 ok(ret
== TRUE
|| /* On Win98 */
318 (ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
), /* On NT! */
319 "CreateDirectoryA(%s): ret=%d err=%d\n", tmpdir
, ret
, GetLastError());
322 ret
= RemoveDirectoryA(tmpdir
);
324 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
327 GetTempPathA(MAX_PATH
, tmpdir
);
328 lstrcatA(tmpdir
, "Please Remove Me");
329 ret
= RemoveDirectoryA(tmpdir
);
331 "RemoveDirectoryA(%s) failed err=%d\n", tmpdir
, GetLastError());
334 static void test_CreateDirectoryW(void)
336 WCHAR tmpdir
[MAX_PATH
];
338 static const WCHAR empty_strW
[] = { 0 };
339 static const WCHAR tmp_dir_name
[] = {'P','l','e','a','s','e',' ','R','e','m','o','v','e',' ','M','e',0};
340 static const WCHAR dotW
[] = {'.',0};
341 static const WCHAR slashW
[] = {'/',0};
342 static const WCHAR dotdotW
[] = {'.','.',0};
343 static const WCHAR questionW
[] = {'?',0};
345 ret
= CreateDirectoryW(NULL
, NULL
);
346 if (!ret
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
348 win_skip("CreateDirectoryW is not available\n");
351 ok(ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
352 "should not create NULL path ret %u err %u\n", ret
, GetLastError());
354 ret
= CreateDirectoryW(empty_strW
, NULL
);
355 ok(ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
356 "should not create empty path ret %u err %u\n", ret
, GetLastError());
358 ret
= GetSystemDirectoryW(tmpdir
, MAX_PATH
);
359 ok(ret
< MAX_PATH
, "System directory should fit into MAX_PATH\n");
361 ret
= SetCurrentDirectoryW(tmpdir
);
362 ok(ret
== TRUE
, "could not chdir to the System directory ret %u err %u\n", ret
, GetLastError());
364 ret
= CreateDirectoryW(dotW
, NULL
);
365 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
366 "should not create existing path ret %u err %u\n", ret
, GetLastError());
368 ret
= CreateDirectoryW(dotdotW
, NULL
);
369 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
370 "should not create existing path ret %u err %u\n", ret
, GetLastError());
372 GetTempPathW(MAX_PATH
, tmpdir
);
373 tmpdir
[3] = 0; /* truncate the path */
374 ret
= CreateDirectoryW(tmpdir
, NULL
);
375 ok(ret
== FALSE
&& (GetLastError() == ERROR_ACCESS_DENIED
|| GetLastError() == ERROR_ALREADY_EXISTS
),
376 "should deny access to the drive root ret %u err %u\n", ret
, GetLastError());
378 GetTempPathW(MAX_PATH
, tmpdir
);
379 lstrcatW(tmpdir
, tmp_dir_name
);
380 ret
= CreateDirectoryW(tmpdir
, NULL
);
381 ok(ret
== TRUE
, "CreateDirectoryW should always succeed\n");
383 ret
= CreateDirectoryW(tmpdir
, NULL
);
384 ok(ret
== FALSE
&& GetLastError() == ERROR_ALREADY_EXISTS
,
385 "should not create existing path ret %u err %u\n", ret
, GetLastError());
387 ret
= RemoveDirectoryW(tmpdir
);
388 ok(ret
== TRUE
, "RemoveDirectoryW should always succeed\n");
390 lstrcatW(tmpdir
, questionW
);
391 ret
= CreateDirectoryW(tmpdir
, NULL
);
392 ok(ret
== FALSE
&& GetLastError() == ERROR_INVALID_NAME
,
393 "CreateDirectoryW with ? wildcard name should fail with error 183, ret=%s error=%d\n",
394 ret
? " True" : "False", GetLastError());
395 ret
= RemoveDirectoryW(tmpdir
);
396 ok(ret
== FALSE
, "RemoveDirectoryW should have failed\n");
398 tmpdir
[lstrlenW(tmpdir
) - 1] = '*';
399 ret
= CreateDirectoryW(tmpdir
, NULL
);
400 ok(ret
== FALSE
&& GetLastError() == ERROR_INVALID_NAME
,
401 "CreateDirectoryW with * wildcard name should fail with error 183, ret=%s error=%d\n",
402 ret
? " True" : "False", GetLastError());
403 ret
= RemoveDirectoryW(tmpdir
);
404 ok(ret
== FALSE
, "RemoveDirectoryW should have failed\n");
406 GetTempPathW(MAX_PATH
, tmpdir
);
407 lstrcatW(tmpdir
, tmp_dir_name
);
408 lstrcatW(tmpdir
, slashW
);
409 lstrcatW(tmpdir
, tmp_dir_name
);
410 ret
= CreateDirectoryW(tmpdir
, NULL
);
411 ok(ret
== FALSE
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
412 "CreateDirectoryW with multiple nonexistent directories in path should fail ret %u err %u\n",
413 ret
, GetLastError());
414 ret
= RemoveDirectoryW(tmpdir
);
415 ok(ret
== FALSE
, "RemoveDirectoryW should have failed\n");
418 static void test_RemoveDirectoryA(void)
420 char tmpdir
[MAX_PATH
];
423 GetTempPathA(MAX_PATH
, tmpdir
);
424 lstrcatA(tmpdir
, "Please Remove Me");
425 ret
= CreateDirectoryA(tmpdir
, NULL
);
426 ok(ret
== TRUE
, "CreateDirectoryA should always succeed\n");
428 ret
= RemoveDirectoryA(tmpdir
);
429 ok(ret
== TRUE
, "RemoveDirectoryA should always succeed\n");
431 lstrcatA(tmpdir
, "?");
432 ret
= RemoveDirectoryA(tmpdir
);
433 ok(ret
== FALSE
&& (GetLastError() == ERROR_INVALID_NAME
||
434 GetLastError() == ERROR_PATH_NOT_FOUND
),
435 "RemoveDirectoryA with ? wildcard name should fail, ret=%s error=%d\n",
436 ret
? " True" : "False", GetLastError());
438 tmpdir
[lstrlenA(tmpdir
) - 1] = '*';
439 ret
= RemoveDirectoryA(tmpdir
);
440 ok(ret
== FALSE
&& (GetLastError() == ERROR_INVALID_NAME
||
441 GetLastError() == ERROR_PATH_NOT_FOUND
),
442 "RemoveDirectoryA with * wildcard name should fail, ret=%s error=%d\n",
443 ret
? " True" : "False", GetLastError());
446 static void test_RemoveDirectoryW(void)
448 WCHAR tmpdir
[MAX_PATH
];
450 static const WCHAR tmp_dir_name
[] = {'P','l','e','a','s','e',' ','R','e','m','o','v','e',' ','M','e',0};
451 static const WCHAR questionW
[] = {'?',0};
453 GetTempPathW(MAX_PATH
, tmpdir
);
454 lstrcatW(tmpdir
, tmp_dir_name
);
455 ret
= CreateDirectoryW(tmpdir
, NULL
);
456 if (!ret
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
458 win_skip("CreateDirectoryW is not available\n");
462 ok(ret
== TRUE
, "CreateDirectoryW should always succeed\n");
464 ret
= RemoveDirectoryW(tmpdir
);
465 ok(ret
== TRUE
, "RemoveDirectoryW should always succeed\n");
467 lstrcatW(tmpdir
, questionW
);
468 ret
= RemoveDirectoryW(tmpdir
);
469 ok(ret
== FALSE
&& GetLastError() == ERROR_INVALID_NAME
,
470 "RemoveDirectoryW with wildcard should fail with error 183, ret=%s error=%d\n",
471 ret
? " True" : "False", GetLastError());
473 tmpdir
[lstrlenW(tmpdir
) - 1] = '*';
474 ret
= RemoveDirectoryW(tmpdir
);
475 ok(ret
== FALSE
&& GetLastError() == ERROR_INVALID_NAME
,
476 "RemoveDirectoryW with * wildcard name should fail with error 183, ret=%s error=%d\n",
477 ret
? " True" : "False", GetLastError());
480 static void test_SetCurrentDirectoryA(void)
483 ok( !SetCurrentDirectoryA( "\\some_dummy_dir" ), "SetCurrentDirectoryA succeeded\n" );
484 ok( GetLastError() == ERROR_FILE_NOT_FOUND
, "wrong error %d\n", GetLastError() );
485 ok( !SetCurrentDirectoryA( "\\some_dummy\\subdir" ), "SetCurrentDirectoryA succeeded\n" );
486 ok( GetLastError() == ERROR_PATH_NOT_FOUND
, "wrong error %d\n", GetLastError() );
489 START_TEST(directory
)
491 test_GetWindowsDirectoryA();
492 test_GetWindowsDirectoryW();
494 test_GetSystemDirectoryA();
495 test_GetSystemDirectoryW();
497 test_CreateDirectoryA();
498 test_CreateDirectoryW();
500 test_RemoveDirectoryA();
501 test_RemoveDirectoryW();
503 test_SetCurrentDirectoryA();