Added pipe.ok.
[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 "wine/test.h"
22 #include "winbase.h"
23 #include "winerror.h"
24
25 void test_GetDriveTypeA(void)
26 {
27     char drive[] = "?:\\";
28     DWORD logical_drives;
29     UINT type;
30
31     logical_drives = GetLogicalDrives();
32     ok(logical_drives != 0, "GetLogicalDrives error %ld", GetLastError());
33
34     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
35     {
36         type = GetDriveTypeA(drive);
37         ok(type > 0 && type <= 6, "not a valid drive %c: type %u", drive[0], type);
38
39         if (!(logical_drives & 1))
40             ok(type == DRIVE_NO_ROOT_DIR,
41                "GetDriveTypeA should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u",
42                drive[0], type);
43
44         logical_drives >>= 1;
45     }
46 }
47
48 void test_GetDriveTypeW(void)
49 {
50     WCHAR drive[] = {'?',':','\\',0};
51     DWORD logical_drives;
52     UINT type;
53
54     logical_drives = GetLogicalDrives();
55     ok(logical_drives != 0, "GetLogicalDrives error %ld", GetLastError());
56
57     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
58     {
59         type = GetDriveTypeW(drive);
60         if (type == DRIVE_UNKNOWN && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
61         {
62             /* Must be Win9x which doesn't support the Unicode functions */
63             return;
64         }
65         ok(type > 0 && type <= 6, "not a valid drive %c: type %u", drive[0], type);
66
67         if (!(logical_drives & 1))
68             ok(type == DRIVE_NO_ROOT_DIR,
69                "GetDriveTypeW should return DRIVE_NO_ROOT_DIR for inexistant drive %c: but not %u",
70                drive[0], type);
71
72         logical_drives >>= 1;
73     }
74 }
75
76 void test_GetDiskFreeSpaceA(void)
77 {
78     BOOL ret;
79     DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters;
80     char drive[] = "?:\\";
81     DWORD logical_drives;
82
83     ret = GetDiskFreeSpaceA(NULL, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
84     ok(ret, "GetDiskFreeSpaceA error %ld", GetLastError());
85
86     ret = GetDiskFreeSpaceA("", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
87     ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_NAME),
88        "GetDiskFreeSpaceA(\"\"): ret=%d GetLastError=%ld",
89        ret, GetLastError());
90
91     ret = GetDiskFreeSpaceA("\\", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
92     ok(ret, "GetDiskFreeSpaceA error %ld", GetLastError());
93
94     ret = GetDiskFreeSpaceA("/", &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
95     ok(ret, "GetDiskFreeSpaceA error %ld", GetLastError());
96
97     logical_drives = GetLogicalDrives();
98     ok(logical_drives != 0, "GetLogicalDrives error %ld", GetLastError());
99
100     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
101     {
102         /* Skip floppy drives because NT pops up a MessageBox if no
103          * floppy is present
104          */
105         if (GetDriveTypeA(drive)!=DRIVE_REMOVABLE)
106         {
107             ret = GetDiskFreeSpaceA(drive, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
108             if (!(logical_drives & 1))
109                 ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND || GetLastError() == ERROR_INVALID_DRIVE),
110                    "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld",
111                    drive, ret, GetLastError());
112             else
113                 ok(ret ||
114                    (!ret && (GetLastError() == ERROR_NOT_READY || GetLastError() == ERROR_INVALID_DRIVE)),
115                    "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%ld",
116                    drive, ret, GetLastError());
117         }
118         logical_drives >>= 1;
119     }
120 }
121
122 void test_GetDiskFreeSpaceW(void)
123 {
124     BOOL ret;
125     DWORD sectors_per_cluster, bytes_per_sector, free_clusters, total_clusters;
126     WCHAR drive[] = {'?',':','\\',0};
127     DWORD logical_drives;
128     static const WCHAR empty_pathW[] = { 0 };
129     static const WCHAR root_pathW[] = { '\\', 0 };
130     static const WCHAR unix_style_root_pathW[] = { '/', 0 };
131
132     ret = GetDiskFreeSpaceW(NULL, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
133     if (ret == 0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
134     {
135         /* Must be Win9x which doesn't support the Unicode functions */
136         return;
137     }
138     ok(ret, "GetDiskFreeSpaceW error %ld", GetLastError());
139
140     ret = GetDiskFreeSpaceW(empty_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
141     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
142        "GetDiskFreeSpaceW(\"\"): ret=%d GetLastError=%ld",
143        ret, GetLastError());
144
145     ret = GetDiskFreeSpaceW(root_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
146     ok(ret, "GetDiskFreeSpaceW(\"\") error %ld", GetLastError());
147
148     ret = GetDiskFreeSpaceW(unix_style_root_pathW, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
149     ok(ret, "GetDiskFreeSpaceW error %ld", GetLastError());
150
151     logical_drives = GetLogicalDrives();
152     ok(logical_drives != 0, "GetLogicalDrives error %ld", GetLastError());
153
154     for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++)
155     {
156         /* Skip floppy drives because NT4 pops up a MessageBox if no floppy is present */
157         if (GetDriveTypeW(drive)!=DRIVE_REMOVABLE)
158         {
159             ret = GetDiskFreeSpaceW(drive, &sectors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters);
160             if (!(logical_drives & 1))
161                 ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
162                    "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld",
163                    drive[0], ret, GetLastError());
164             else
165                 ok(ret || GetLastError() == ERROR_NOT_READY,
166                    "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%ld",
167                    drive[0], ret, GetLastError());
168         }
169         logical_drives >>= 1;
170     }
171 }
172
173 START_TEST(drive)
174 {
175     test_GetDriveTypeA();
176     test_GetDriveTypeW();
177
178     test_GetDiskFreeSpaceA();
179     test_GetDiskFreeSpaceW();
180 }