advapi32: Create MachineGuid value if it doesn't exist.
[wine] / dlls / shlwapi / tests / istream.c
1 /* Unit test suite for SHLWAPI ShCreateStreamOnFile functions.
2  *
3  * Copyright 2008 Reece H. Dunn
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19
20 #define COBJMACROS
21
22 #include <stdarg.h>
23 #include <stdio.h>
24
25 #include "wine/test.h"
26 #include "windef.h"
27 #include "winbase.h"
28 #include "objbase.h"
29 #include "shlwapi.h"
30
31
32 /* Function pointers for the SHCreateStreamOnFile functions */
33 static HMODULE hShlwapi;
34 static HRESULT (WINAPI *pSHCreateStreamOnFileA)(LPCSTR file, DWORD mode, IStream **stream);
35 static HRESULT (WINAPI *pSHCreateStreamOnFileW)(LPCWSTR file, DWORD mode, IStream **stream);
36 static HRESULT (WINAPI *pSHCreateStreamOnFileEx)(LPCWSTR file, DWORD mode, DWORD attributes, BOOL create, IStream *template, IStream **stream);
37
38
39 static void test_SHCreateStreamOnFileA(DWORD mode)
40 {
41     IStream * stream;
42     HRESULT ret;
43     ULONG refcount;
44     static const char * test_file = "c:\\test.txt";
45
46     printf("SHCreateStreamOnFileA: testing mode %d\n", mode);
47
48     /* invalid arguments */
49
50     stream = NULL;
51     ret = (*pSHCreateStreamOnFileA)(NULL, mode, &stream);
52     todo_wine
53     ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), got 0x%08x\n", ret);
54     ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream);
55
56 #if 0 /* This test crashes on WinXP SP2 */
57     ret = (*pSHCreateStreamOnFileA)(test_file, mode, NULL);
58     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret);
59 #endif
60
61     stream = NULL;
62     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CONVERT, &stream);
63     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret);
64     ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream);
65
66     stream = NULL;
67     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_DELETEONRELEASE, &stream);
68     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret);
69     ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream);
70
71     /* file does not exist */
72
73     stream = NULL;
74     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_FAILIFTHERE, &stream);
75     todo_wine
76     ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret);
77     ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream);
78
79     stream = NULL;
80     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CREATE, &stream);
81     todo_wine
82     ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret);
83     todo_wine
84     ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n");
85
86     if (stream) {
87         refcount = IStream_Release(stream);
88         ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount);
89     }
90
91     /* NOTE: don't delete the file, as it will be used for the file exists tests. */
92
93     /* file exists */
94
95     stream = NULL;
96     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_FAILIFTHERE, &stream);
97     todo_wine
98     ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret);
99     todo_wine
100     ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n");
101
102     if (stream) {
103         refcount = IStream_Release(stream);
104         ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount);
105     }
106
107     stream = NULL;
108     ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CREATE, &stream);
109     todo_wine
110     ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret);
111     todo_wine
112     ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n");
113
114     if (stream) {
115         refcount = IStream_Release(stream);
116         ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount);
117
118         ok(DeleteFileA(test_file), "SHCreateStreamOnFileA: could not delete file '%s', got error %d\n", test_file, GetLastError());
119     }
120 }
121
122
123 static void test_SHCreateStreamOnFileW(DWORD mode)
124 {
125     IStream * stream;
126     HRESULT ret;
127     ULONG refcount;
128     static const WCHAR test_file[] = { 'c', ':', '\\', 't', 'e', 's', 't', '.', 't', 'x', 't' };
129
130     printf("SHCreateStreamOnFileW: testing mode %d\n", mode);
131
132     /* invalid arguments */
133
134     stream = NULL;
135     ret = (*pSHCreateStreamOnFileW)(NULL, mode, &stream);
136     ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */
137        ret == E_INVALIDARG /* Vista */,
138       "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret);
139     ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream);
140
141 #if 0 /* This test crashes on WinXP SP2 */
142     ret = (*pSHCreateStreamOnFileW)(test_file, mode, NULL);
143     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret);
144 #endif
145
146     stream = NULL;
147     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CONVERT, &stream);
148     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret);
149     ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream);
150
151     stream = NULL;
152     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_DELETEONRELEASE, &stream);
153     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret);
154     ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream);
155
156     /* file does not exist */
157
158     stream = NULL;
159     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE, &stream);
160     todo_wine
161     ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret);
162     ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream);
163
164     stream = NULL;
165     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CREATE, &stream);
166     todo_wine
167     ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret);
168     todo_wine
169     ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n");
170
171     if (stream) {
172         refcount = IStream_Release(stream);
173         ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount);
174     }
175
176     /* NOTE: don't delete the file, as it will be used for the file exists tests. */
177
178     /* file exists */
179
180     stream = NULL;
181     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE, &stream);
182     todo_wine
183     ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret);
184     todo_wine
185     ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n");
186
187     if (stream) {
188         refcount = IStream_Release(stream);
189         ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount);
190     }
191
192     stream = NULL;
193     ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CREATE, &stream);
194     todo_wine
195     ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret);
196     todo_wine
197     ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n");
198
199     if (stream) {
200         refcount = IStream_Release(stream);
201         ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount);
202
203         ok(DeleteFileW(test_file), "SHCreateStreamOnFileW: could not delete the test file, got error %d\n", GetLastError());
204     }
205 }
206
207
208 static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm)
209 {
210     IStream * stream;
211     IStream * template = NULL;
212     HRESULT ret;
213     ULONG refcount;
214     static const WCHAR test_file[] = { 'c', ':', '\\', 't', 'e', 's', 't', '.', 't', 'x', 't' };
215
216     printf("SHCreateStreamOnFileEx: testing mode %d, STGM flags %08x\n", mode, stgm);
217
218     /* invalid arguments */
219
220     stream = NULL;
221     ret = (*pSHCreateStreamOnFileEx)(NULL, mode, 0, FALSE, NULL, &stream);
222     ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */
223        ret == E_INVALIDARG /* Vista */,
224       "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret);
225     ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
226
227     stream = NULL;
228     ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream);
229     todo_wine
230     ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret);
231     ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
232
233 #if 0 /* This test crashes on WinXP SP2 */
234     ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, NULL, NULL);
235     ok(ret == E_INVALIDARG, "SHCreateStreamOnFileEx: expected E_INVALIDARG, got 0x%08x\n", ret);
236 #endif
237
238     /* file does not exist */
239
240     stream = NULL;
241     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, FALSE, NULL, &stream);
242     todo_wine
243     ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret);
244     ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
245
246     stream = NULL;
247     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, TRUE, NULL, &stream);
248     todo_wine
249     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
250     todo_wine
251     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
252
253     if (stream) {
254         refcount = IStream_Release(stream);
255         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
256
257         ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError());
258     }
259
260     stream = NULL;
261     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream);
262     todo_wine
263     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
264     todo_wine
265     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
266
267     if (stream) {
268         refcount = IStream_Release(stream);
269         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
270
271         ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError());
272     }
273
274     stream = NULL;
275     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream);
276     todo_wine
277     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
278     todo_wine
279     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
280
281     if (stream) {
282         refcount = IStream_Release(stream);
283         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
284     }
285
286     /* NOTE: don't delete the file, as it will be used for the file exists tests. */
287
288     /* file exists */
289
290     stream = NULL;
291     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, FALSE, NULL, &stream);
292     todo_wine
293     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
294     todo_wine
295     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
296
297     if (stream) {
298         refcount = IStream_Release(stream);
299         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
300     }
301
302     stream = NULL;
303     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, TRUE, NULL, &stream);
304     todo_wine
305     ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), got 0x%08x\n", ret);
306     ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
307
308     stream = NULL;
309     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream);
310     todo_wine
311     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
312     todo_wine
313     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
314
315     if (stream) {
316         refcount = IStream_Release(stream);
317         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
318     }
319
320     stream = NULL;
321     ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream);
322     todo_wine
323     ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret);
324     todo_wine
325     ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
326
327     if (stream) {
328         refcount = IStream_Release(stream);
329         ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
330     }
331
332     todo_wine
333     ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError());
334 }
335
336
337 START_TEST(istream)
338 {
339     hShlwapi = GetModuleHandleA("shlwapi.dll");
340
341     pSHCreateStreamOnFileA = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileA");
342     pSHCreateStreamOnFileW = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileW");
343     pSHCreateStreamOnFileEx = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileEx");
344
345     if (!pSHCreateStreamOnFileA)
346         printf("SHCreateStreamOnFileA not found... skipping tests.\n");
347     else {
348         test_SHCreateStreamOnFileA(STGM_READ);
349         test_SHCreateStreamOnFileA(STGM_WRITE);
350         test_SHCreateStreamOnFileA(STGM_READWRITE);
351     }
352
353     if (!pSHCreateStreamOnFileW)
354         printf("SHCreateStreamOnFileW not found... skipping tests.\n");
355     else {
356         test_SHCreateStreamOnFileW(STGM_READ);
357         test_SHCreateStreamOnFileW(STGM_WRITE);
358         test_SHCreateStreamOnFileW(STGM_READWRITE);
359     }
360
361     if (!pSHCreateStreamOnFileEx)
362         printf("SHCreateStreamOnFileEx not found... skipping tests.\n");
363     else {
364         test_SHCreateStreamOnFileEx(STGM_READ, 0);
365         test_SHCreateStreamOnFileEx(STGM_WRITE, 0);
366         test_SHCreateStreamOnFileEx(STGM_READWRITE, 0);
367
368         test_SHCreateStreamOnFileEx(STGM_READ, STGM_CONVERT);
369         test_SHCreateStreamOnFileEx(STGM_WRITE, STGM_CONVERT);
370         test_SHCreateStreamOnFileEx(STGM_READWRITE, STGM_CONVERT);
371
372         test_SHCreateStreamOnFileEx(STGM_READ, STGM_DELETEONRELEASE);
373         test_SHCreateStreamOnFileEx(STGM_WRITE, STGM_DELETEONRELEASE);
374         test_SHCreateStreamOnFileEx(STGM_READWRITE, STGM_DELETEONRELEASE);
375
376         test_SHCreateStreamOnFileEx(STGM_READ, STGM_CONVERT | STGM_DELETEONRELEASE);
377         test_SHCreateStreamOnFileEx(STGM_WRITE, STGM_CONVERT | STGM_DELETEONRELEASE);
378         test_SHCreateStreamOnFileEx(STGM_READWRITE, STGM_CONVERT | STGM_DELETEONRELEASE);
379     }
380 }