setupapi: Validate the cabinet filename parameter in SetupIterateCabinetA.
[wine] / dlls / setupapi / tests / setupcab.c
1 /*
2  * Unit tests for SetupIterateCabinet
3  *
4  * Copyright 2007 Hans Leidekker
5  * Copyright 2010 Andrew Nguyen
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include <stdarg.h>
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "winuser.h"
28 #include "winreg.h"
29 #include "setupapi.h"
30 #include "wine/test.h"
31
32 static void create_source_fileA(LPSTR filename, const BYTE *data, DWORD size)
33 {
34     HANDLE handle;
35     DWORD written;
36
37     handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
38                          FILE_ATTRIBUTE_NORMAL, NULL);
39     WriteFile(handle, data, size, &written, NULL);
40     CloseHandle(handle);
41 }
42
43 static UINT CALLBACK dummy_callbackA(PVOID Context, UINT Notification,
44                                      UINT_PTR Param1, UINT_PTR Param2)
45 {
46     ok(0, "Received unexpected notification (%p, %u, %lu, %lu)\n", Context,
47        Notification, Param1, Param2);
48     return 0;
49 }
50
51 static void test_invalid_parametersA(void)
52 {
53     BOOL ret;
54     char source[MAX_PATH], temp[MAX_PATH];
55     int i;
56
57     const struct
58     {
59         PCSTR CabinetFile;
60         PSP_FILE_CALLBACK MsgHandler;
61         DWORD expected_lasterror;
62         int todo_lasterror;
63     } invalid_parameters[] =
64     {
65         {NULL,                  NULL,            ERROR_INVALID_PARAMETER},
66         {NULL,                  dummy_callbackA, ERROR_INVALID_PARAMETER},
67         {"c:\\nonexistent.cab", NULL,            ERROR_FILE_NOT_FOUND},
68         {"c:\\nonexistent.cab", dummy_callbackA, ERROR_FILE_NOT_FOUND},
69         {source,                NULL,            ERROR_INVALID_DATA, 1},
70         {source,                dummy_callbackA, ERROR_INVALID_DATA, 1},
71     };
72
73     GetTempPathA(sizeof(temp), temp);
74     GetTempFileNameA(temp, "doc", 0, source);
75
76     create_source_fileA(source, NULL, 0);
77
78     for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
79     {
80         SetLastError(0xdeadbeef);
81         ret = SetupIterateCabinetA(invalid_parameters[i].CabinetFile, 0,
82                                    invalid_parameters[i].MsgHandler, NULL);
83         ok(!ret, "[%d] Expected SetupIterateCabinetA to return 0, got %d\n", i, ret);
84         if (invalid_parameters[i].todo_lasterror)
85         {
86             todo_wine
87             ok(GetLastError() == invalid_parameters[i].expected_lasterror,
88                "[%d] Expected GetLastError() to return %u, got %u\n",
89                i, invalid_parameters[i].expected_lasterror, GetLastError());
90         }
91         else
92         {
93             ok(GetLastError() == invalid_parameters[i].expected_lasterror,
94                "[%d] Expected GetLastError() to return %u, got %u\n",
95                i, invalid_parameters[i].expected_lasterror, GetLastError());
96         }
97     }
98
99     SetLastError(0xdeadbeef);
100     ret = SetupIterateCabinetA("", 0, NULL, NULL);
101     ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
102     ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
103        GetLastError() == ERROR_FILE_NOT_FOUND, /* Win9x/NT4/Win2k */
104        "Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
105        GetLastError());
106
107     SetLastError(0xdeadbeef);
108     ret = SetupIterateCabinetA("", 0, dummy_callbackA, NULL);
109     ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
110     ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
111        GetLastError() == ERROR_FILE_NOT_FOUND, /* Win9x/NT4/Win2k */
112        "Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
113        GetLastError());
114
115     DeleteFileA(source);
116 }
117
118 START_TEST(setupcab)
119 {
120     test_invalid_parametersA();
121 }