ReactOS  0.4.13-dev-92-gf251225
install.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005 Stefan Leichter
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include <stdarg.h>
20 #include <stdio.h>
21 
22 #include "wine/test.h"
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winerror.h"
26 #include "winver.h"
27 #include "shlobj.h"
28 
29 static void test_find_file(void)
30 {
31  DWORD ret;
32  UINT dwCur, dwOut ;
33  char tmp[MAX_PATH];
34  char appdir[MAX_PATH];
35  char curdir[MAX_PATH];
36  char filename[MAX_PATH];
37  char outBuf[MAX_PATH];
38  char windir[MAX_PATH];
39  static const char empty[] = "",
40  regedit[] = "regedit",
41  regedit_exe[] = "regedit.exe";
42 
43  memset(appdir, 0, MAX_PATH);
44  memset(windir, 0, MAX_PATH);
45 
46  dwCur=MAX_PATH;
47  dwOut=MAX_PATH;
48  memset(curdir, 0, MAX_PATH);
49  memset(outBuf, 0, MAX_PATH);
50  ret = VerFindFileA(0, regedit, empty, empty, curdir, &dwCur, outBuf, &dwOut);
51  switch(ret) {
52  case 0L:
53  ok(dwCur == 1, "Wrong length of buffer for current location: "
54  "got %d(%s) expected 1\n", dwCur, curdir);
55  ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: "
56  "got %d(%s) expected 1\n", dwOut, outBuf);
57  break;
58  case VFF_BUFFTOOSMALL:
59  ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: "
60  "got %d(%s) expected MAX_PATH\n", dwCur, curdir);
61  ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: "
62  "got %d(%s) expected MAX_PATH\n", dwOut, outBuf);
63  break;
64  default:
65  ok(0, "Got unexpected return value %x\n", ret);
66  }
67 
68  if(!GetWindowsDirectoryA(windir, MAX_PATH))
69  trace("GetWindowsDirectoryA failed\n");
70  else {
71  sprintf(appdir, "%s\\regedit.exe", windir);
73  trace("GetFileAttributesA(%s) failed\n", appdir);
74  else {
75  dwCur=MAX_PATH;
76  dwOut=MAX_PATH;
77  memset(curdir, 0, MAX_PATH);
78  memset(outBuf, 0, MAX_PATH);
79  ret = VerFindFileA(0, regedit_exe, empty, empty, curdir, &dwCur, outBuf, &dwOut);
80  switch(ret) {
81  case VFF_CURNEDEST:
82  ok(dwCur == 1 + strlen(windir), "Wrong length of buffer for current location: "
83  "got %d(%s) expected %d\n", dwCur, curdir, lstrlenA(windir)+1);
84  ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: "
85  "got %d(%s) expected 1\n", dwOut, outBuf);
86  break;
87  case VFF_BUFFTOOSMALL:
88  ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: "
89  "got %d(%s) expected MAX_PATH\n", dwCur, curdir);
90  ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: "
91  "got %d(%s) expected MAX_PATH\n", dwOut, outBuf);
92  break;
93  default:
94  ok(0, "Got unexpected return value %x\n", ret);
95  }
96 
97  dwCur=MAX_PATH;
98  dwOut=MAX_PATH;
99  memset(curdir, 0, MAX_PATH);
100  memset(outBuf, 0, MAX_PATH);
101  ret = VerFindFileA(0, regedit_exe, NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
102  switch(ret) {
103  case VFF_CURNEDEST:
104  ok(dwCur == 1 + strlen(windir), "Wrong length of buffer for current location: "
105  "got %d(%s) expected %d\n", dwCur, curdir, lstrlenA(windir)+1);
106  ok(dwOut == 1, "Wrong length of buffer for the recommended installation location: "
107  "got %d(%s) expected 1\n", dwOut, outBuf);
108  break;
109  case VFF_BUFFTOOSMALL:
110  ok(dwCur == MAX_PATH, "Wrong length of buffer for current location: "
111  "got %d(%s) expected MAX_PATH\n", dwCur, curdir);
112  ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location: "
113  "got %d(%s) expected MAX_PATH\n", dwOut, outBuf);
114  break;
115  default:
116  ok(0, "Got unexpected return value %x\n", ret);
117  }
118  }
119  }
120  if(!GetSystemDirectoryA(windir, MAX_PATH) ||
122  !GetTempPathA(MAX_PATH, tmp) ||
123  !GetTempFileNameA(tmp, "tes", 0, filename))
124  ok(0, "GetSystemDirectoryA, SHGetSpecialFolderPathA, GetTempPathA or GetTempFileNameA failed\n");
125  else {
126  char *p = strrchr(filename, '\\');
127  if(p) {
128  *(p++) ='\0';
130  memmove(filename, p, 1 + strlen(p));
131  }
132 
133  dwCur=MAX_PATH;
134  dwOut=MAX_PATH;
135  memset(outBuf, 0, MAX_PATH);
136  memset(curdir, 0, MAX_PATH);
137  ret = VerFindFileA(0, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
138  switch(ret) {
139  case VFF_CURNEDEST:
140  ok(dwOut == 1, "Wrong length of buffer for the recommended installation location"
141  "got %d(%s) expected 1\n", dwOut, outBuf);
142  break;
143  case VFF_BUFFTOOSMALL:
144  ok(dwOut == MAX_PATH, "Wrong length of buffer for the recommended installation location"
145  "got %d(%s) expected MAX_PATH\n", dwOut, outBuf);
146  break;
147  default:
148  todo_wine ok(0, "Got unexpected return value %x\n", ret);
149  }
150 
151  dwCur=MAX_PATH;
152  dwOut=MAX_PATH;
153  memset(outBuf, 0, MAX_PATH);
154  memset(curdir, 0, MAX_PATH);
155  ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
156  ok(VFF_CURNEDEST == ret, "Wrong return value got %x expected VFF_CURNEDEST\n", ret);
157  ok(dwOut == 1 + strlen(windir), "Wrong length of buffer for current location: "
158  "got %d(%s) expected %d\n", dwOut, outBuf, lstrlenA(windir)+1);
159 
160  dwCur=MAX_PATH;
161  dwOut=MAX_PATH;
162  memset(outBuf, 0, MAX_PATH);
163  memset(curdir, 0, MAX_PATH);
164  ret = VerFindFileA(0, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
165  ok(VFF_CURNEDEST == ret, "Wrong return value got %x expected VFF_CURNEDEST\n", ret);
166  ok(dwOut == 1 + strlen(appdir), "Wrong length of buffer for current location: "
167  "got %d(%s) expected %d\n", dwOut, outBuf, lstrlenA(appdir)+1);
168 
169  /* search for filename */
170  dwCur=MAX_PATH;
171  dwOut=MAX_PATH;
172  ret = VerFindFileA(0, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
173  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
174 
175  dwCur=MAX_PATH;
176  dwOut=MAX_PATH;
177  ret = VerFindFileA(0, filename, NULL, empty, curdir, &dwCur, outBuf, &dwOut);
178  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
179 
180  dwCur=MAX_PATH;
181  dwOut=MAX_PATH;
182  ret = VerFindFileA(0, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
183  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
184 
185  dwCur=MAX_PATH;
186  dwOut=MAX_PATH;
187  ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
188  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
189 
190  dwCur=MAX_PATH;
191  dwOut=MAX_PATH;
192  ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, empty, curdir, &dwCur, outBuf, &dwOut);
193  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
194 
195  dwCur=MAX_PATH;
196  dwOut=MAX_PATH;
197  ret = VerFindFileA(VFFF_ISSHAREDFILE, filename, NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
198  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
199 
200  /* search for regedit */
201  dwCur=MAX_PATH;
202  dwOut=MAX_PATH;
203  ret = VerFindFileA(0, "regedit", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
204  ok(!ret, "Wrong return value got %x expected 0\n", ret);
205 
206  dwCur=MAX_PATH;
207  dwOut=MAX_PATH;
208  ret = VerFindFileA(0, "regedit", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
209  ok(!ret, "Wrong return value got %x expected 0\n", ret);
210 
211  dwCur=MAX_PATH;
212  dwOut=MAX_PATH;
213  ret = VerFindFileA(0, "regedit", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
214  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
215 
216  dwCur=MAX_PATH;
217  dwOut=MAX_PATH;
218  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
219  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
220 
221  dwCur=MAX_PATH;
222  dwOut=MAX_PATH;
223  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
224  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
225 
226  dwCur=MAX_PATH;
227  dwOut=MAX_PATH;
228  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
229  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
230 
231  /* search for regedit.exe */
232  dwCur=MAX_PATH;
233  dwOut=MAX_PATH;
234  ret = VerFindFileA(0, "regedit.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
235  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
236 
237  dwCur=MAX_PATH;
238  dwOut=MAX_PATH;
239  ret = VerFindFileA(0, "regedit.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
240  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
241 
242  dwCur=MAX_PATH;
243  dwOut=MAX_PATH;
244  ret = VerFindFileA(0, "regedit.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
245  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
246 
247  dwCur=MAX_PATH;
248  dwOut=MAX_PATH;
249  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
250  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
251 
252  dwCur=MAX_PATH;
253  dwOut=MAX_PATH;
254  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
255  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
256 
257  dwCur=MAX_PATH;
258  dwOut=MAX_PATH;
259  ret = VerFindFileA(VFFF_ISSHAREDFILE, "regedit.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
260  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
261 
262  /* nonexistent filename */
263  dwCur=MAX_PATH;
264  dwOut=MAX_PATH;
265  ret = VerFindFileA(0, "doesnotexist.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
266  ok(!ret, "Wrong return value got %x expected 0\n", ret);
267 
268  dwCur=MAX_PATH;
269  dwOut=MAX_PATH;
270  ret = VerFindFileA(0, "doesnotexist.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
271  ok(!ret, "Wrong return value got %x expected 0\n", ret);
272 
273  dwCur=MAX_PATH;
274  dwOut=MAX_PATH;
275  ret = VerFindFileA(0, "doesnotexist.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
276  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
277 
278  dwCur=MAX_PATH;
279  dwOut=MAX_PATH;
280  ret = VerFindFileA(0, "doesnotexist.exe", NULL, "C:\\random_path_does_not_exist", curdir, &dwCur, outBuf, &dwOut);
281  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
282 
283  dwCur=MAX_PATH;
284  dwOut=MAX_PATH;
285  ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, NULL, curdir, &dwCur, outBuf, &dwOut);
286  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
287 
288  dwCur=MAX_PATH;
289  dwOut=MAX_PATH;
290  ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, empty, curdir, &dwCur, outBuf, &dwOut);
291  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
292 
293  dwCur=MAX_PATH;
294  dwOut=MAX_PATH;
295  ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, appdir, curdir, &dwCur, outBuf, &dwOut);
296  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
297 
298  dwCur=MAX_PATH;
299  dwOut=MAX_PATH;
300  ret = VerFindFileA(VFFF_ISSHAREDFILE, "doesnotexist.exe", NULL, "C:\\random_path_does_not_exist", curdir, &dwCur, outBuf, &dwOut);
301  ok(ret & VFF_CURNEDEST, "Wrong return value got %x expected VFF_CURNEDEST set\n", ret);
302 
304  }
305 }
306 
307 static void test_install_file(void)
308 {
309  CHAR tmpname[MAX_PATH];
310  UINT size = MAX_PATH;
311  DWORD rc;
312  static const CHAR szSrcFileName[] = "nofile.txt";
313  static const CHAR szDestFileName[] = "nofile2.txt";
314  static const CHAR szSrcDir[] = "D:\\oes\\not\\exist";
315  static const CHAR szDestDir[] = "D:\\oes\\not\\exist\\either";
316  static const CHAR szCurDir[] = "C:\\";
317 
318  /* testing Invalid Parameters */
319  memset(tmpname,0,sizeof(tmpname));
320  rc = VerInstallFileA(0x0, NULL, NULL, NULL, NULL, NULL, tmpname, &size);
321  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
322  memset(tmpname,0,sizeof(tmpname));
323  size = MAX_PATH;
324  rc = VerInstallFileA(0x0, szSrcFileName, NULL, NULL, NULL, NULL, tmpname, &size);
325  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
326  memset(tmpname,0,sizeof(tmpname));
327  size = MAX_PATH;
328  rc = VerInstallFileA(0x0, szSrcFileName, szDestFileName, NULL, NULL, NULL, tmpname, &size);
329  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
330  memset(tmpname,0,sizeof(tmpname));
331  size = MAX_PATH;
332  rc = VerInstallFileA(0x0, szSrcFileName, szDestFileName, szSrcDir, NULL, NULL, tmpname, &size);
333  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
334 
335  /* Source file does not exist*/
336 
337  memset(tmpname,0,sizeof(tmpname));
338  size = MAX_PATH;
339  rc = VerInstallFileA(0x0, szSrcFileName, szDestFileName, szSrcDir, szDestDir, NULL, tmpname, &size);
340  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
341  memset(tmpname,0,sizeof(tmpname));
342  size = MAX_PATH;
343  rc = VerInstallFileA(0x0, szSrcFileName, szDestFileName, szSrcDir, szDestDir, szCurDir, tmpname, &size);
344  ok (rc == 0x10000 && tmpname[0]==0," expected return 0x10000 and no tempname, got %08x/\'%s\'\n",rc,tmpname);
345 }
346 
348 {
349  test_find_file();
351 }
#define trace(...)
Definition: kmt_test.h:217
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
GLint x0
Definition: linetemp.h:95
int install
Definition: msacm.c:1353
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static const WCHAR empty[]
Definition: main.c:49
#define VFFF_ISSHAREDFILE
Definition: verrsrc.h:105
char CHAR
Definition: xmlstorage.h:175
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2282
#define CSIDL_PROGRAM_FILES
Definition: shlobj.h:2040
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
const char * filename
Definition: ioapi.h:135
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define VFF_BUFFTOOSMALL
Definition: verrsrc.h:110
BOOL WINAPI SHGetSpecialFolderPathA(HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:2553
#define VFF_CURNEDEST
Definition: verrsrc.h:108
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:786
#define ok(value,...)
DWORD WINAPI VerInstallFileA(DWORD flags, LPCSTR srcfilename, LPCSTR destfilename, LPCSTR srcdir, LPCSTR destdir, LPCSTR curdir, LPSTR tmpfile, PUINT tmpfilelen)
Definition: version.c:1444
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
GLsizeiptr size
Definition: glext.h:5919
static void test_find_file(void)
Definition: install.c:29
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
int ret
static const WCHAR L[]
Definition: oid.c:1250
#define todo_wine
Definition: test.h:154
BOOL WINAPI SetCurrentDirectoryA(IN LPCSTR lpPathName)
Definition: path.c:2205
static void test_install_file(void)
Definition: install.c:307
DWORD WINAPI VerFindFileA(DWORD flags, LPCSTR lpszFilename, LPCSTR lpszWinDir, LPCSTR lpszAppDir, LPSTR lpszCurDir, PUINT lpuCurDirLen, LPSTR lpszDestDir, PUINT lpuDestDirLen)
Definition: version.c:1199
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2053
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2336
unsigned int UINT
Definition: ndis.h:50
START_TEST(install)
Definition: install.c:285
GLfloat GLfloat p
Definition: glext.h:8902
#define memset(x, y, z)
Definition: compat.h:39
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26