2 * Unit test suite for drive 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 static DWORD (WINAPI
*pGetDiskFreeSpaceExA
)(LPCSTR
, PULARGE_INTEGER
, PULARGE_INTEGER
, PULARGE_INTEGER
);
25 static void test_GetDriveTypeA(void)
27 char drive
[] = "?:\\";
28 char existing_drive_letter
= 0;
32 logical_drives
= GetLogicalDrives();
33 ok(logical_drives
!= 0, "GetLogicalDrives error %d\n", GetLastError());
35 for (drive
[0] = 'A'; drive
[0] <= 'Z'; drive
[0]++)
37 type
= GetDriveTypeA(drive
);
38 ok(type
> DRIVE_UNKNOWN
&& type
<= DRIVE_RAMDISK
,
39 "not a valid drive %c: type %u\n", drive
[0], type
);
41 if (!(logical_drives
& 1))
42 ok(type
== DRIVE_NO_ROOT_DIR
,
43 "GetDriveTypeA should return DRIVE_NO_ROOT_DIR for inexistent drive %c: but not %u\n",
45 else if (type
!= DRIVE_NO_ROOT_DIR
)
46 existing_drive_letter
= drive
[0];
51 if (!existing_drive_letter
) {
52 skip("No drives found, skipping drive spec format tests.\n");
56 drive
[0] = existing_drive_letter
;
57 drive
[2] = 0; /* C: */
58 type
= GetDriveTypeA(drive
);
59 ok(type
> DRIVE_NO_ROOT_DIR
&& type
<= DRIVE_RAMDISK
, "got %u for drive spec '%s'\n", type
, drive
);
61 drive
[1] = '?'; /* C? */
62 type
= GetDriveTypeA(drive
);
63 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, drive
);
66 type
= GetDriveTypeA(drive
);
67 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, drive
);
69 drive
[0] = '?'; /* the string "?" */
70 type
= GetDriveTypeA(drive
);
71 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, drive
);
73 drive
[0] = 0; /* the empty string */
74 type
= GetDriveTypeA(drive
);
75 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, drive
);
78 static void test_GetDriveTypeW(void)
80 WCHAR drive
[] = {'?',':','\\',0};
81 WCHAR existing_drive_letter
= 0;
85 logical_drives
= GetLogicalDrives();
86 ok(logical_drives
!= 0, "GetLogicalDrives error %d\n", GetLastError());
88 for (drive
[0] = 'A'; drive
[0] <= 'Z'; drive
[0]++)
90 type
= GetDriveTypeW(drive
);
91 ok(type
> DRIVE_UNKNOWN
&& type
<= DRIVE_RAMDISK
,
92 "not a valid drive %c: type %u\n", drive
[0], type
);
94 if (!(logical_drives
& 1))
95 ok(type
== DRIVE_NO_ROOT_DIR
,
96 "GetDriveTypeW should return DRIVE_NO_ROOT_DIR for inexistent drive %c: but not %u\n",
98 else if (type
!= DRIVE_NO_ROOT_DIR
)
99 existing_drive_letter
= drive
[0];
101 logical_drives
>>= 1;
104 if (!existing_drive_letter
) {
105 skip("No drives found, skipping drive spec format tests.\n");
109 drive
[0] = existing_drive_letter
;
110 drive
[2] = 0; /* C: */
111 type
= GetDriveTypeW(drive
);
112 ok(type
> DRIVE_NO_ROOT_DIR
&& type
<= DRIVE_RAMDISK
, "got %u for drive spec '%s'\n",
113 type
, wine_dbgstr_w(drive
));
115 drive
[1] = '?'; /* C? */
116 type
= GetDriveTypeW(drive
);
117 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, wine_dbgstr_w(drive
));
119 drive
[1] = 0; /* C */
120 type
= GetDriveTypeW(drive
);
121 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, wine_dbgstr_w(drive
));
123 drive
[0] = '?'; /* the string "?" */
124 type
= GetDriveTypeW(drive
);
125 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, wine_dbgstr_w(drive
));
127 drive
[0] = 0; /* the empty string */
128 type
= GetDriveTypeW(drive
);
129 ok(type
== DRIVE_NO_ROOT_DIR
, "got %u for drive spec '%s'\n", type
, wine_dbgstr_w(drive
));
132 static void test_GetDiskFreeSpaceA(void)
135 DWORD sectors_per_cluster
, bytes_per_sector
, free_clusters
, total_clusters
;
136 char drive
[] = "?:\\";
137 DWORD logical_drives
;
139 ret
= GetDiskFreeSpaceA(NULL
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
140 ok(ret
, "GetDiskFreeSpaceA error %d\n", GetLastError());
142 ret
= GetDiskFreeSpaceA("", §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
143 ok(!ret
&& (GetLastError() == ERROR_PATH_NOT_FOUND
|| GetLastError() == ERROR_INVALID_NAME
),
144 "GetDiskFreeSpaceA(\"\"): ret=%d GetLastError=%d\n",
145 ret
, GetLastError());
147 ret
= GetDiskFreeSpaceA("\\", §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
148 ok(ret
, "GetDiskFreeSpaceA error %d\n", GetLastError());
150 ret
= GetDiskFreeSpaceA("/", §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
151 ok(ret
, "GetDiskFreeSpaceA error %d\n", GetLastError());
153 logical_drives
= GetLogicalDrives();
154 ok(logical_drives
!= 0, "GetLogicalDrives error %d\n", GetLastError());
156 for (drive
[0] = 'A'; drive
[0] <= 'Z'; drive
[0]++)
158 UINT drivetype
= GetDriveTypeA(drive
);
159 /* Skip floppy drives because NT pops up a MessageBox if no
162 if (drivetype
!= DRIVE_REMOVABLE
&& drivetype
!= DRIVE_NO_ROOT_DIR
)
164 ret
= GetDiskFreeSpaceA(drive
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
165 if (!(logical_drives
& 1))
166 ok(!ret
&& (GetLastError() == ERROR_PATH_NOT_FOUND
|| GetLastError() == ERROR_INVALID_DRIVE
),
167 "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%d\n",
168 drive
, ret
, GetLastError());
173 /* GetDiskFreeSpaceA() should succeed, but it can fail with too many
174 different GetLastError() results to be usable for an ok() */
175 trace("GetDiskFreeSpaceA(%s) failed with %d\n", drive
, GetLastError());
177 if( GetVersion() & 0x80000000)
178 /* win3.0 through winME */
179 ok( total_clusters
<= 65535,
180 "total clusters is %d > 65535\n", total_clusters
);
181 else if (pGetDiskFreeSpaceExA
) {
182 /* NT, 2k, XP : GetDiskFreeSpace should be accurate */
183 ULARGE_INTEGER totEx
, tot
, d
;
185 tot
.QuadPart
= sectors_per_cluster
;
186 tot
.QuadPart
= (tot
.QuadPart
* bytes_per_sector
) * total_clusters
;
187 ret
= pGetDiskFreeSpaceExA( drive
, &d
, &totEx
, NULL
);
190 /* GetDiskFreeSpaceExA() should succeed, but it can fail with too many
191 different GetLastError() results to be usable for an ok() */
192 trace("GetDiskFreeSpaceExA(%s) failed with %d\n", drive
, GetLastError());
194 ok( bytes_per_sector
== 0 || /* empty cd rom drive */
195 totEx
.QuadPart
<= tot
.QuadPart
,
196 "GetDiskFreeSpaceA should report at least as much bytes on disk %s as GetDiskFreeSpaceExA\n", drive
);
200 logical_drives
>>= 1;
204 static void test_GetDiskFreeSpaceW(void)
207 DWORD sectors_per_cluster
, bytes_per_sector
, free_clusters
, total_clusters
;
208 WCHAR drive
[] = {'?',':','\\',0};
209 DWORD logical_drives
;
210 static const WCHAR empty_pathW
[] = { 0 };
211 static const WCHAR root_pathW
[] = { '\\', 0 };
212 static const WCHAR unix_style_root_pathW
[] = { '/', 0 };
214 ret
= GetDiskFreeSpaceW(NULL
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
215 if (ret
== 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
217 win_skip("GetDiskFreeSpaceW is not available\n");
220 ok(ret
, "GetDiskFreeSpaceW error %d\n", GetLastError());
222 ret
= GetDiskFreeSpaceW(empty_pathW
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
223 ok(!ret
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
224 "GetDiskFreeSpaceW(\"\"): ret=%d GetLastError=%d\n",
225 ret
, GetLastError());
227 ret
= GetDiskFreeSpaceW(root_pathW
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
228 ok(ret
, "GetDiskFreeSpaceW(\"\") error %d\n", GetLastError());
230 ret
= GetDiskFreeSpaceW(unix_style_root_pathW
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
231 ok(ret
, "GetDiskFreeSpaceW error %d\n", GetLastError());
233 logical_drives
= GetLogicalDrives();
234 ok(logical_drives
!= 0, "GetLogicalDrives error %d\n", GetLastError());
236 for (drive
[0] = 'A'; drive
[0] <= 'Z'; drive
[0]++)
238 UINT drivetype
= GetDriveTypeW(drive
);
239 /* Skip floppy drives because NT4 pops up a MessageBox if no floppy is present */
240 if (drivetype
!= DRIVE_REMOVABLE
&& drivetype
!= DRIVE_NO_ROOT_DIR
)
242 ret
= GetDiskFreeSpaceW(drive
, §ors_per_cluster
, &bytes_per_sector
, &free_clusters
, &total_clusters
);
243 if (!(logical_drives
& 1))
244 ok(!ret
&& GetLastError() == ERROR_PATH_NOT_FOUND
,
245 "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%d\n",
246 drive
[0], ret
, GetLastError());
248 /* GetDiskFreeSpaceW() should succeed, but it can fail with too many
249 different GetLastError() results to be usable for an ok() */
250 trace("GetDiskFreeSpaceW(%c) failed with %d\n", drive
[0], GetLastError());
252 logical_drives
>>= 1;
258 HANDLE hkernel32
= GetModuleHandleA("kernel32");
259 pGetDiskFreeSpaceExA
= (void *) GetProcAddress(hkernel32
, "GetDiskFreeSpaceExA");
261 test_GetDriveTypeA();
262 test_GetDriveTypeW();
264 test_GetDiskFreeSpaceA();
265 test_GetDiskFreeSpaceW();