Stub implementation for MsiGetFileHashA/W.
[wine] / dlls / kernel / tests / drive.c
1 /*
2  * Unit test suite for drive functions.
3  *
4  * Copyright 2002 Dmitry Timoshkov
5  *
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.
10  *
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.
15  *
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <stdarg.h>
22
23 #include "wine/test.h"
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winerror.h"
27
28 static void test_GetDriveTypeA(void)
29 {
30     char drive[] = "?:\\";
31     DWORD logical_drives;
32     UINT type;
33
34     logical_drives = GetLogicalDrives();
35     ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError());
36
37     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
38     {
39         type = GetDriveTypeA(drive);
40         ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type);
41
42         if (!(logical_drives & 1))
43             ok(type == DRIVE_NO_ROOT_DIR,
44                "GetDriveTypeA should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u\n",
45                drive[0], type);
46
47         logical_drives >>= 1;
48     }
49 }
50
51 static void test_GetDriveTypeW(void)
52 {
53     WCHAR drive[] = {'?',':','\\',0};
54     DWORD logical_drives;
55     UINT type;
56
57     logical_drives = GetLogicalDrives();
58     ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError());
59
60     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
61     {
62         type = GetDriveTypeW(drive);
63         if (type == DRIVE_UNKNOWN && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
64         {
65             /* Must be Win9x which doesn't support the Unicode functions */
66             return;
67         }
68         ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type);
69
70         if (!(logical_drives & 1))
71             ok(type == DRIVE_NO_ROOT_DIR,
72                "GetDriveTypeW should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u\n",
73                drive[0], type);
74
75         logical_drives >>= 1;
76     }
77 }
78
79 static void test_GetDiskFreeSpaceA(void)
80 {
81     BOOL ret;
82     DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters;
83     char drive[] = "?:\\";
84     DWORD logical_drives;
85
86     ret = GetDiskFreeSpaceA(NULL, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
87     ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError());
88
89     ret = GetDiskFreeSpaceA("", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
90     ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_NAME),
91        "GetDiskFreeSpaceA(\"\"): ret=%d GetLastError=%ld\n",
92        ret, GetLastError());
93
94     ret = GetDiskFreeSpaceA("\\", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
95     ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError());
96
97     ret = GetDiskFreeSpaceA("/", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
98     ok(ret, "GetDiskFreeSpaceA error %ld\n", GetLastError());
99
100     logical_drives = GetLogicalDrives();
101     ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError());
102
103     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
104     {
105         UINT drivetype = GetDriveTypeA(drive);
106         /* Skip floppy drives because NT pops up a MessageBox if no
107          * floppy is present
108          */
109         if (drivetype != DRIVE_REMOVABLE && drivetype != DRIVE_NO_ROOT_DIR)
110         {
111             ret = GetDiskFreeSpaceA(drive, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
112             if (!(logical_drives & 1))
113                 ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_DRIVE),
114                    "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld\n",
115                    drive, ret, GetLastError());
116             else
117             {
118                 ok(ret ||
119                    (!ret && (GetLastError() == ERROR_NOT_READY || GetLastError() == ERROR_INVALID_DRIVE)),
120                    "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld\n",
121                    drive, ret, GetLastError());
122                 if( GetVersion() & 0x80000000)
123                     /* win3.0 thru winME */
124                     ok( total_clusters <= 65535,
125                             "total clusters is %ld > 65535\n", total_clusters);
126                 else {
127                     /* NT, 2k, XP : GetDiskFreeSpace shoud be accurate */
128                     ULARGE_INTEGER totEx, tot, d;
129                     tot.QuadPart = sectors_per_cluster;
130                     tot.QuadPart = (tot.QuadPart * bytes_per_sector) * total_clusters;
131                     ret = GetDiskFreeSpaceExA( drive, &d, &totEx, NULL);
132                     ok( ret, "GetDiskFreeSpaceExA( %s ) failed. GetLastError=%ld\n", drive, GetLastError());
133                     ok( bytes_per_sector == 0 || /* empty cd rom drive */
134                         totEx.QuadPart <= tot.QuadPart,
135                         "GetDiskFreeSpaceA should report at least as much bytes on disk %s as GetDiskFreeSpaceExA\n", drive);
136                 }
137             }
138         }
139         logical_drives >>= 1;
140     }
141 }
142
143 static void test_GetDiskFreeSpaceW(void)
144 {
145     BOOL ret;
146     DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters;
147     WCHAR drive[] = {'?',':','\\',0};
148     DWORD logical_drives;
149     static const WCHAR empty_pathW[] = { 0 };
150     static const WCHAR root_pathW[] = { '\\', 0 };
151     static const WCHAR unix_style_root_pathW[] = { '/', 0 };
152
153     ret = GetDiskFreeSpaceW(NULL, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
154     if (ret == 0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
155     {
156         /* Must be Win9x which doesn't support the Unicode functions */
157         return;
158     }
159     ok(ret, "GetDiskFreeSpaceW error %ld\n", GetLastError());
160
161     ret = GetDiskFreeSpaceW(empty_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
162     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
163        "GetDiskFreeSpaceW(\"\"): ret=%d GetLastError=%ld\n",
164        ret, GetLastError());
165
166     ret = GetDiskFreeSpaceW(root_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
167     ok(ret, "GetDiskFreeSpaceW(\"\") error %ld\n", GetLastError());
168
169     ret = GetDiskFreeSpaceW(unix_style_root_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
170     ok(ret, "GetDiskFreeSpaceW error %ld\n", GetLastError());
171
172     logical_drives = GetLogicalDrives();
173     ok(logical_drives != 0, "GetLogicalDrives error %ld\n", GetLastError());
174
175     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
176     {
177         UINT drivetype = GetDriveTypeW(drive);
178         /* Skip floppy drives because NT4 pops up a MessageBox if no floppy is present */
179         if (drivetype != DRIVE_REMOVABLE && drivetype != DRIVE_NO_ROOT_DIR)
180         {
181             ret = GetDiskFreeSpaceW(drive, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
182             if (!(logical_drives & 1))
183                 ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
184                    "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld\n",
185                    drive[0], ret, GetLastError());
186             else
187                 ok(ret || GetLastError() == ERROR_NOT_READY,
188                    "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld\n",
189                    drive[0], ret, GetLastError());
190         }
191         logical_drives >>= 1;
192     }
193 }
194
195 START_TEST(drive)
196 {
197     test_GetDriveTypeA();
198     test_GetDriveTypeW();
199
200     test_GetDiskFreeSpaceA();
201     test_GetDiskFreeSpaceW();
202 }