2 * Unit test suite for lz32 functions
4 * Copyright 2004 Evan Parry, Daniel Kegel
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.
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.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/test.h"
30 /* Compressed file names end with underscore. */
31 static char filename
[] = "testfile.xxx";
32 static char filename_
[] = "testfile.xx_";
33 static WCHAR filenameW
[] = {'t','e','s','t','f','i','l','e','.','x','x','x',0};
34 static WCHAR filenameW_
[] = {'t','e','s','t','f','i','l','e','.','x','x','_',0};
36 static char dotless
[] = "dotless";
37 static char dotless_
[] = "dotless._";
38 static WCHAR dotlessW
[] = {'d','o','t','l','e','s','s', 0};
39 static WCHAR dotlessW_
[] = {'d','o','t','l','e','s','s','.','_', 0};
41 static char extless
[] = "extless.";
42 static char extless_
[] = "extless._";
43 static WCHAR extlessW
[] = {'e','x','t','l','e','s','s','.', 0};
44 static WCHAR extlessW_
[] = {'e','x','t','l','e','s','s','.','_', 0};
46 static char _terminated
[] = "_terminated.xxxx_";
47 static char _terminated_
[] = "_terminated.xxxx_";
48 static WCHAR _terminatedW
[] = {'_','t','e','r','m','i','n','a','t','e','d','.','x','x','x','x','_', 0};
49 static WCHAR _terminatedW_
[] = {'_','t','e','r','m','i','n','a','t','e','d','.','x','x','x','x','_', 0};
51 static char filename2
[] = "testfile.yyy";
53 /* This is the hex string representation of the file created by compressing
54 a simple text file with the contents "This is a test file."
56 The file was created using COMPRESS.EXE from the Windows Server 2003
57 Resource Kit from Microsoft. The resource kit was retrieved from the
60 http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en
62 static const unsigned char compressed_file
[] =
63 {0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33,0x41,
64 0x74,0x75,0x14,0x00,0x00,0xDF,0x54,0x68,0x69,
65 0x73,0x20,0xF2,0xF0,0x61,0x20,0xFF,0x74,0x65,
66 0x73,0x74,0x20,0x66,0x69,0x6C,0x03,0x65,0x2E};
67 static const DWORD compressed_file_size
= sizeof(compressed_file
);
69 static const char uncompressed_data
[] = "This is a test file.";
70 static const DWORD uncompressed_data_size
= sizeof(uncompressed_data
) - 1;
74 static void full_file_path_name_in_a_CWD(const char *src
, char *dst
, BOOL expect_short
)
77 char shortname
[MAX_PATH
];
79 retval
= GetCurrentDirectoryA(MAX_PATH
, dst
);
80 ok(retval
> 0, "GetCurrentDirectoryA returned %ld, GLE=0x%lx\n",
81 retval
, GetLastError());
86 memcpy(shortname
, dst
, MAX_PATH
);
87 GetShortPathName(shortname
, dst
, MAX_PATH
-1);
91 static void create_file(char *fname
)
97 file
= LZOpenFileA(fname
, &ofs
, OF_CREATE
);
98 ok(file
>= 0, "LZOpenFileA failed on creation\n");
100 retval
= GetFileAttributesA(fname
);
101 ok(retval
!= INVALID_FILE_ATTRIBUTES
, "GetFileAttributesA('%s'): error %ld\n", ofs
.szPathName
, GetLastError());
104 static void delete_file(char *fname
)
110 file
= LZOpenFileA(fname
, &ofs
, OF_DELETE
);
111 ok(file
>= 0, "LZOpenFileA failed on delete\n");
113 retval
= GetFileAttributesA(fname
);
114 ok(retval
== INVALID_FILE_ATTRIBUTES
, "GetFileAttributesA succeeded on deleted file ('%s')\n", ofs
.szPathName
);
117 static void test_LZOpenFileA_existing_compressed(void)
121 char expected
[MAX_PATH
];
122 char short_expected
[MAX_PATH
];
123 char filled_0xA5
[OFS_MAXPATHNAME
];
125 /* Try to open existing compressed files: */
126 create_file(filename_
);
127 create_file(dotless_
);
128 create_file(extless_
);
129 create_file(_terminated_
);
131 memset(&filled_0xA5
, 0xA5, OFS_MAXPATHNAME
);
132 memset(&test
, 0xA5, sizeof(test
));
133 full_file_path_name_in_a_CWD(filename_
, expected
, FALSE
);
135 /* a, using 8.3-conformant file name. */
136 file
= LZOpenFileA(filename
, &test
, OF_EXIST
);
137 /* If the file "foo.xxx" does not exist, LZOpenFileA should then
138 check for the file "foo.xx_" and open that -- at least on some
139 operating systems. Doesn't seem to on my copy of Win98.
141 if(file
!= LZERROR_BADINHANDLE
) {
142 ok(test
.cBytes
== sizeof(OFSTRUCT
),
143 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
144 ok(test
.nErrCode
== 0, "LZOpenFileA set test.nErrCode to %d\n",
146 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
147 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
148 test
.szPathName
, expected
);
151 ok(test
.cBytes
== 0xA5,
152 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
153 ok(test
.nErrCode
== ERROR_FILE_NOT_FOUND
,
154 "LZOpenFileA set test.nErrCode to %d\n", test
.nErrCode
);
155 ok(strncmp(test
.szPathName
, filled_0xA5
, OFS_MAXPATHNAME
) == 0,
156 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
157 test
.szPathName
, filled_0xA5
);
160 memset(&filled_0xA5
, 0xA5, OFS_MAXPATHNAME
);
161 memset(&test
, 0xA5, sizeof(test
));
162 full_file_path_name_in_a_CWD(dotless_
, expected
, FALSE
);
164 /* b, using dotless file name. */
165 file
= LZOpenFileA(dotless
, &test
, OF_EXIST
);
166 if(file
!= LZERROR_BADINHANDLE
) {
167 ok(test
.cBytes
== sizeof(OFSTRUCT
),
168 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
169 ok(test
.nErrCode
== 0, "LZOpenFileA set test.nErrCode to %d\n",
171 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
172 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
173 test
.szPathName
, expected
);
177 ok(test
.cBytes
== 0xA5,
178 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
179 ok(test
.nErrCode
== ERROR_FILE_NOT_FOUND
,
180 "LZOpenFileA set test.nErrCode to %d\n", test
.nErrCode
);
182 ok(strncmp(test
.szPathName
, filled_0xA5
, OFS_MAXPATHNAME
) == 0,
183 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
184 test
.szPathName
, filled_0xA5
);
187 memset(&filled_0xA5
, 0xA5, OFS_MAXPATHNAME
);
188 memset(&test
, 0xA5, sizeof(test
));
189 full_file_path_name_in_a_CWD(extless_
, expected
, FALSE
);
191 /* c, using extensionless file name. */
192 file
= LZOpenFileA(extless
, &test
, OF_EXIST
);
193 if(file
!= LZERROR_BADINHANDLE
) {
194 ok(test
.cBytes
== sizeof(OFSTRUCT
),
195 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
196 ok(test
.nErrCode
== 0, "LZOpenFileA set test.nErrCode to %d\n",
198 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
199 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
200 test
.szPathName
, expected
);
203 ok(test
.cBytes
== 0xA5,
204 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
205 ok(test
.nErrCode
== ERROR_FILE_NOT_FOUND
,
206 "LZOpenFileA set test.nErrCode to %d\n", test
.nErrCode
);
207 ok(strncmp(test
.szPathName
, filled_0xA5
, OFS_MAXPATHNAME
) == 0,
208 "LZOpenFileA returned '%s', but was expected to return '%s'\n",
209 test
.szPathName
, filled_0xA5
);
212 memset(&filled_0xA5
, 0xA5, OFS_MAXPATHNAME
);
213 memset(&test
, 0xA5, sizeof(test
));
214 full_file_path_name_in_a_CWD(_terminated_
, expected
, FALSE
);
215 full_file_path_name_in_a_CWD(_terminated_
, short_expected
, TRUE
);
217 /* d, using underscore-terminated file name. */
218 file
= LZOpenFileA(_terminated
, &test
, OF_EXIST
);
219 ok(file
>= 0, "LZOpenFileA failed on switching to a compressed file name\n");
220 ok(test
.cBytes
== sizeof(OFSTRUCT
),
221 "LZOpenFileA set test.cBytes to %d\n", test
.cBytes
);
222 ok(test
.nErrCode
== 0, "LZOpenFileA set test.nErrCode to %d\n",
224 ok(lstrcmpA(test
.szPathName
, expected
) == 0 ||
225 lstrcmpA(test
.szPathName
, short_expected
) == 0, /* Win9x */
226 "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
227 test
.szPathName
, expected
, short_expected
);
230 delete_file(filename_
);
231 delete_file(dotless_
);
232 delete_file(extless_
);
233 delete_file(_terminated_
);
236 static void test_LZOpenFileA(void)
241 static char badfilename_
[] = "badfilename_";
243 SetLastError(0xfaceabee);
244 /* Check for nonexistent file. */
245 file
= LZOpenFileA(badfilename_
, &test
, OF_READ
);
246 ok(file
== LZERROR_BADINHANDLE
,
247 "LZOpenFileA succeeded on nonexistent file\n");
248 ok(GetLastError() == ERROR_FILE_NOT_FOUND
,
249 "GetLastError() returns %ld\n", GetLastError());
252 /* Create an empty file. */
253 file
= LZOpenFileA(filename_
, &test
, OF_CREATE
);
254 ok(file
>= 0, "LZOpenFileA failed on creation\n");
256 retval
= GetFileAttributesA(filename_
);
257 ok(retval
!= INVALID_FILE_ATTRIBUTES
, "GetFileAttributesA: error %ld\n",
260 /* Check various opening options. */
261 file
= LZOpenFileA(filename_
, &test
, OF_READ
);
262 ok(file
>= 0, "LZOpenFileA failed on read\n");
264 file
= LZOpenFileA(filename_
, &test
, OF_WRITE
);
265 ok(file
>= 0, "LZOpenFileA failed on write\n");
267 file
= LZOpenFileA(filename_
, &test
, OF_READWRITE
);
268 ok(file
>= 0, "LZOpenFileA failed on read/write\n");
270 file
= LZOpenFileA(filename_
, &test
, OF_EXIST
);
271 ok(file
>= 0, "LZOpenFileA failed on read/write\n");
274 /* Delete the file then make sure it doesn't exist anymore. */
275 file
= LZOpenFileA(filename_
, &test
, OF_DELETE
);
276 ok(file
>= 0, "LZOpenFileA failed on delete\n");
279 retval
= GetFileAttributesA(filename_
);
280 ok(retval
== INVALID_FILE_ATTRIBUTES
,
281 "GetFileAttributesA succeeded on deleted file\n");
283 test_LZOpenFileA_existing_compressed();
286 static void test_LZRead(void)
294 /* Create the compressed file. */
295 file
= CreateFileA(filename_
, GENERIC_WRITE
, 0, NULL
, CREATE_NEW
, 0, 0);
296 ok(file
!= INVALID_HANDLE_VALUE
, "Could not create test file\n");
297 retok
= WriteFile(file
, compressed_file
, compressed_file_size
, &ret
, 0);
298 ok( retok
, "WriteFile: error %ld\n", GetLastError());
299 ok(ret
== compressed_file_size
, "Wrote wrong number of bytes with WriteFile?\n");
302 cfile
= LZOpenFileA(filename_
, &test
, OF_READ
);
303 ok(cfile
> 0, "LZOpenFileA failed\n");
305 ret
= LZRead(cfile
, buf
, uncompressed_data_size
);
306 ok(ret
== uncompressed_data_size
, "Read wrong number of bytes\n");
308 /* Compare what we read with what we think we should read. */
309 ok(memcmp(buf
, uncompressed_data
, uncompressed_data_size
) == 0,
310 "buffer contents mismatch\n");
313 /* Wine returns the number of bytes actually read instead of an error */
314 ret
= LZRead(cfile
, buf
, uncompressed_data_size
);
315 ok(ret
== LZERROR_READ
, "Expected read-past-EOF to return LZERROR_READ\n");
320 ret
= DeleteFileA(filename_
);
321 ok(ret
, "DeleteFileA: error %ld\n", GetLastError());
324 static void test_LZCopy(void)
329 OFSTRUCT stest
, dtest
;
332 /* Create the compressed file. */
333 file
= CreateFileA(filename_
, GENERIC_WRITE
, 0, NULL
, CREATE_NEW
, 0, 0);
334 ok(file
!= INVALID_HANDLE_VALUE
,
335 "CreateFileA: error %ld\n", GetLastError());
336 retok
= WriteFile(file
, compressed_file
, compressed_file_size
, &ret
, 0);
337 ok( retok
, "WriteFile error %ld\n", GetLastError());
338 ok(ret
== compressed_file_size
, "Wrote wrong number of bytes\n");
341 source
= LZOpenFileA(filename_
, &stest
, OF_READ
);
342 ok(source
>= 0, "LZOpenFileA failed on compressed file\n");
343 dest
= LZOpenFileA(filename2
, &dtest
, OF_CREATE
);
344 ok(dest
>= 0, "LZOpenFileA failed on creating new file %d\n", dest
);
346 ret
= LZCopy(source
, dest
);
347 ok(ret
> 0, "LZCopy error\n");
352 file
= CreateFileA(filename2
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
,
354 ok(file
!= INVALID_HANDLE_VALUE
,
355 "CreateFileA: error %ld\n", GetLastError());
357 retok
= ReadFile(file
, buf
, uncompressed_data_size
*2, &ret
, 0);
358 ok( retok
&& ret
== uncompressed_data_size
, "ReadFile: error %ld\n", GetLastError());
359 /* Compare what we read with what we think we should read. */
360 ok(!memcmp(buf
, uncompressed_data
, uncompressed_data_size
),
361 "buffer contents mismatch\n");
364 ret
= DeleteFileA(filename_
);
365 ok(ret
, "DeleteFileA: error %ld\n", GetLastError());
366 ret
= DeleteFileA(filename2
);
367 ok(ret
, "DeleteFileA: error %ld\n", GetLastError());
370 static void create_fileW(WCHAR
*fnameW
)
376 file
= LZOpenFileW(fnameW
, &ofs
, OF_CREATE
);
377 ok(file
>= 0, "LZOpenFileA failed on creation\n");
379 retval
= GetFileAttributesW(fnameW
);
380 ok(retval
!= INVALID_FILE_ATTRIBUTES
, "GetFileAttributesA('%s'): error %ld\n", ofs
.szPathName
, GetLastError());
383 static void delete_fileW(WCHAR
*fnameW
)
389 file
= LZOpenFileW(fnameW
, &ofs
, OF_DELETE
);
390 ok(file
>= 0, "LZOpenFileA failed on delete\n");
392 retval
= GetFileAttributesW(fnameW
);
393 ok(retval
== INVALID_FILE_ATTRIBUTES
, "GetFileAttributesA succeeded on deleted file ('%s')\n", ofs
.szPathName
);
396 static void test_LZOpenFileW_existing_compressed(void)
400 char expected
[MAX_PATH
];
402 /* Try to open existing compressed files: */
403 create_fileW(filenameW_
);
404 create_fileW(dotlessW_
);
405 create_fileW(extlessW_
);
406 create_fileW(_terminatedW_
);
408 full_file_path_name_in_a_CWD(filename_
, expected
, FALSE
);
409 memset(&test
, 0xA5, sizeof(test
));
411 /* a, using 8.3-conformant file name. */
412 file
= LZOpenFileW(filenameW
, &test
, OF_EXIST
);
413 /* If the file "foo.xxx" does not exist, LZOpenFileW should then
414 check for the file "foo.xx_" and open that.
416 ok(file
>= 0, "LZOpenFileW failed on switching to a compressed file name\n");
417 ok(test
.cBytes
== sizeof(OFSTRUCT
),
418 "LZOpenFileW set test.cBytes to %d\n", test
.cBytes
);
419 ok(test
.nErrCode
== ERROR_SUCCESS
, "LZOpenFileW set test.nErrCode to %d\n",
421 /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
422 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
423 "LZOpenFileW returned '%s', but was expected to return '%s'\n",
424 test
.szPathName
, expected
);
427 memset(&test
, 0xA5, sizeof(test
));
428 full_file_path_name_in_a_CWD(dotless_
, expected
, FALSE
);
430 /* b, using dotless file name. */
431 file
= LZOpenFileW(dotlessW
, &test
, OF_EXIST
);
432 ok(file
>= 0, "LZOpenFileW failed on switching to a compressed file name\n");
433 ok(test
.cBytes
== sizeof(OFSTRUCT
),
434 "LZOpenFileW set test.cBytes to %d\n", test
.cBytes
);
435 ok(test
.nErrCode
== ERROR_SUCCESS
, "LZOpenFileW set test.nErrCode to %d\n",
437 /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
438 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
439 "LZOpenFileW returned '%s', but was expected to return '%s'\n",
440 test
.szPathName
, expected
);
443 memset(&test
, 0xA5, sizeof(test
));
444 full_file_path_name_in_a_CWD(extless_
, expected
, FALSE
);
446 /* c, using extensionless file name. */
447 file
= LZOpenFileW(extlessW
, &test
, OF_EXIST
);
448 ok(file
>= 0, "LZOpenFileW failed on switching to a compressed file name\n");
449 ok(test
.cBytes
== sizeof(OFSTRUCT
),
450 "LZOpenFileW set test.cBytes to %d\n", test
.cBytes
);
451 ok(test
.nErrCode
== ERROR_SUCCESS
, "LZOpenFileW set test.nErrCode to %d\n",
453 /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
454 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
455 "LZOpenFileW returned '%s', but was expected to return '%s'\n",
456 test
.szPathName
, expected
);
459 memset(&test
, 0xA5, sizeof(test
));
460 full_file_path_name_in_a_CWD(_terminated_
, expected
, FALSE
);
462 /* d, using underscore-terminated file name. */
463 file
= LZOpenFileW(_terminatedW
, &test
, OF_EXIST
);
464 ok(file
>= 0, "LZOpenFileW failed on switching to a compressed file name\n");
465 ok(test
.cBytes
== sizeof(OFSTRUCT
),
466 "LZOpenFileW set test.cBytes to %d\n", test
.cBytes
);
467 ok(test
.nErrCode
== ERROR_SUCCESS
, "LZOpenFileW set test.nErrCode to %d\n",
469 /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
470 ok(lstrcmpA(test
.szPathName
, expected
) == 0,
471 "LZOpenFileW returned '%s', but was expected to return '%s'\n",
472 test
.szPathName
, expected
);
475 delete_fileW(filenameW_
);
476 delete_fileW(dotlessW_
);
477 delete_fileW(extlessW_
);
478 delete_fileW(_terminatedW_
);
481 static void test_LZOpenFileW(void)
486 static WCHAR badfilenameW
[] = {'b','a','d','f','i','l','e','n','a','m','e','.','x','t','n',0};
488 SetLastError(0xfaceabee);
489 /* Check for nonexistent file. */
490 file
= LZOpenFileW(badfilenameW
, &test
, OF_READ
);
491 if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
493 trace("LZOpenFileW call not implemented, skipping rest of the test\n");
496 ok(file
== LZERROR_BADINHANDLE
,
497 "LZOpenFileW succeeded on nonexistent file\n");
500 /* Create an empty file. */
501 file
= LZOpenFileW(filenameW_
, &test
, OF_CREATE
);
502 ok(file
>= 0, "LZOpenFile failed on creation\n");
504 retval
= GetFileAttributesW(filenameW_
);
505 ok(retval
!= INVALID_FILE_ATTRIBUTES
, "GetFileAttributes: error %ld\n",
508 /* Check various opening options. */
509 file
= LZOpenFileW(filenameW_
, &test
, OF_READ
);
510 ok(file
>= 0, "LZOpenFileW failed on read\n");
512 file
= LZOpenFileW(filenameW_
, &test
, OF_WRITE
);
513 ok(file
>= 0, "LZOpenFileW failed on write\n");
515 file
= LZOpenFileW(filenameW_
, &test
, OF_READWRITE
);
516 ok(file
>= 0, "LZOpenFileW failed on read/write\n");
518 file
= LZOpenFileW(filenameW_
, &test
, OF_EXIST
);
519 ok(file
>= 0, "LZOpenFileW failed on read/write\n");
522 /* Delete the file then make sure it doesn't exist anymore. */
523 file
= LZOpenFileW(filenameW_
, &test
, OF_DELETE
);
524 ok(file
>= 0, "LZOpenFileW failed on delete\n");
527 retval
= GetFileAttributesW(filenameW_
);
528 ok(retval
== INVALID_FILE_ATTRIBUTES
,
529 "GetFileAttributesW succeeded on deleted file\n");
531 test_LZOpenFileW_existing_compressed();
535 START_TEST(lzexpand_main
)
537 buf
= malloc(uncompressed_data_size
* 2);