1 rizwank 1.1 /*
2 * Unit test suite for cabinet.dll - FDI functions
3 *
|
4 rizwank 2.5 * Copyright 2004 Rizwan Kassim, Dan Kegel, Alexander Liber
|
5 rizwank 1.1 *
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 rizwank 2.3 #include <stdlib.h>
22 #include <string.h>
|
23 cs130_alex 2.2 #include <sys/stat.h>
|
24 rizwank 1.1
25 #ifndef STANDALONE
26 #include <wine/test.h>
27 #define ok2 ok
28 #else
|
29 rizwank 2.5 /* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ tvfs.c cabinet_fdi.c FDI.lib
|
30 rizwank 1.1 These are only called if standalone are used, defining ok and START_TEST, which would normally be declared in winetree */
31 #include <assert.h>
32 #include <stdio.h>
33 #define START_TEST(name) main(int argc, char **argv)
34 #define ok(condition, msg) \
35 do { if(!(condition)) { \
36 fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__); \
37 exit(1); \
38 } } while(0)
39 #define ok2(condition, msg, arg) \
40 do { if(!(condition)) { \
41 fprintf(stderr,"failed at %d, msg:" msg "\n",__LINE__, arg); \
42 exit(1); \
43 } } while(0)
44 #define todo_wine
45 #endif
46
|
47 rizwank 2.7 #define TVFS
48
|
49 rizwank 1.1 #include <winerror.h>
50 #include <fdi.h>
|
51 rizwank 1.7 #include <fcntl.h>
|
52 rizwank 2.5 #include "tvfs.h"
53 #include "data.h"
|
54 rizwank 1.7
|
55 rizwank 1.8 /* Do malloc and free output debug messages?
56 #define DEBUG_ALLOC
57 */
|
58 rizwank 1.7
|
59 rizwank 1.8 #ifndef DEBUG_ALLOC
60 FNALLOC(final_alloc) {
61 return malloc(cb);
62 }
63 FNFREE(final_free) {
64 free(pv);
65 return;
66 }
67 #else
68 FNALLOC(final_alloc) {
|
69 rizwank 1.5 printf(" FNALLOC just called with %d\n",cb);
70 return malloc(cb);
|
71 rizwank 1.3 }
|
72 rizwank 1.8 FNFREE(final_free) {
|
73 rizwank 1.5 printf(" FNFREE just called with %d\n",pv);
74 free(pv);
|
75 rizwank 1.3 return;
76 }
|
77 rizwank 1.8 #endif
78
|
79 rizwank 1.3
80 FNOPEN(dummy_open) {
|
81 rizwank 1.8 printf(" FNOPEN (dummy) just called with %d, %d, %d\n",pszFile, oflag, pmode);
|
82 rizwank 1.3 return 0;
83 }
84
85 FNREAD(dummy_read) {
|
86 rizwank 1.8 printf(" FNREAD (dummy) just called with %d, %d, %d\n",hf, pv, cb);
|
87 rizwank 1.5 return 0;
|
88 rizwank 1.3 }
|
89 rizwank 1.7
|
90 rizwank 1.8 FNCLOSE(dummy_close) {
91 printf(" FNCLOSE (dummy) just called with %d - returning %d\n",hf,0);
|
92 rizwank 1.5 return 0;
|
93 rizwank 1.3 }
94
|
95 rizwank 1.8 FNWRITE(dummy_write) {
96 printf(" FNWRITE just called with %d, %d, %d\n",hf, pv, cb);
|
97 rizwank 1.5 return 0;
|
98 rizwank 1.3 }
|
99 rizwank 1.1
|
100 rizwank 1.3 FNSEEK(dummy_seek) {
|
101 rizwank 1.8 printf(" FNSEEK just called with %d, %d, %d\n",hf, dist, seektype);
|
102 rizwank 1.5 return 0;
|
103 rizwank 1.3 }
104
|
105 cs130_alex 2.1 FNFDINOTIFY(dummy_notification){
106 printf(" FNFDINOTIFY just called with %d, %d \n",fdint,pfdin);
107 return 0;
108 }
109
|
110 rizwank 2.3 FNFDINOTIFY(notification_function)
111 {
112 printf(" FNFDINOTIFY real just called with %d, %d \n",fdint,pfdin);
113 switch (fdint)
114 {
115 case fdintCABINET_INFO:
116 {
|
117 rizwank 2.9 printf(
118 "fdintCABINET_INFO:\n"
119 "-next cab name: %s\n"
120 "-next disk: %s\n"
121 "-path name: %s\n"
122 "-set ID: %d\n"
123 "-number in set: %d\n",
124 pfdin->psz1,
125 pfdin->psz2,
126 pfdin->psz3,
127 pfdin->setID,
128 pfdin->iCabinet
129 );
|
130 rizwank 2.3 return 0;
131 }
132 case fdintPARTIAL_FILE:
133 {
134 printf("dintPARTIAL_FILE\n");
135 return 0;
136 }
137 case fdintCOPY_FILE:
|
138 rizwank 2.9 {
|
139 rizwank 2.3 int fih = 0;
140 char target[256];
|
141 rizwank 2.9 printf(
142 "fdintCOPY_FILE:\n"
143 "-name: %s\n"
144 "-uncompressed size: %d\n"
145 "-date: %d\n"
146 "-time: %d\n"
147 "-attributes: %d\n"
148 "-file's folder index: %d\n",
149 pfdin->psz1,
150 pfdin->cb,
151 pfdin->date,
152 pfdin->time,
153 pfdin->attribs,
154 pfdin->iFolder
155
156 );
|
157 rizwank 2.3 sprintf(target, "./%s",pfdin->psz1);
|
158 rizwank 2.7 #ifdef TVFS
|
159 rizwank 2.6 fih = tvfs_open (target,
|
160 rizwank 2.3 _O_BINARY | _O_CREAT | _O_WRONLY | _O_SEQUENTIAL,
161 _S_IREAD | _S_IWRITE
|
162 rizwank 2.6 );
|
163 rizwank 2.9
|
164 rizwank 2.7 #else
165 fih = real_open (target,
166 _O_BINARY | _O_CREAT | _O_WRONLY | _O_SEQUENTIAL,
167 _S_IREAD | _S_IWRITE
168 );
|
169 rizwank 2.9 #endif
|
170 rizwank 2.7 return fih;
|
171 rizwank 2.9
|
172 rizwank 2.5 }
|
173 rizwank 2.3 case fdintCLOSE_FILE_INFO:
174 {
|
175 rizwank 2.7 char filebuf[256];
176 int result;
|
177 rizwank 2.9
178 printf(
179 "fdintCLOSE_FILE:\n"
180 "-name: %s\n"
181 "-handle: %d\n"
182 "-date: %d\n"
183 "-time: %d\n"
184 "-attributes: %d\n"
185 "-file's folder index: %d\n"
186 "-run: %d\n",
187 pfdin->psz1,
188 pfdin->hf,
189 pfdin->date,
190 pfdin->time,
191 pfdin->attribs,
192 pfdin->iFolder,
193 pfdin->cb
194 );
|
195 rizwank 2.3
|
196 rizwank 2.8 /*
|
197 rizwank 2.7 printf("Testing direct file compare and lseek of %s\n", name_simple_txt);
198 printf("Reading and comparing file\n");
199 result = tvfs_read(7, filebuf, size_simple_txt);
200 result = tvfs_compare( filebuf , file_simple_txt, size_simple_txt);
|
201 rizwank 2.8
|
202 rizwank 2.9 */
203 #ifdef TVFS
204 tvfs_close(pfdin->hf);
205 #else
206 real_close(pfdin->hf);
207 #endif
208
209 return TRUE;
|
210 rizwank 2.3 }
211 case fdintNEXT_CABINET:
212 {
213
214 printf("fdintNEXT_CABINET\n");
215 return 0;
216 }
217 case fdintENUMERATE:
218 {
219 printf("fdintENUMERATE\n");
220 return 0;
221 }
222 }
223 return 0;
224 }
|
225 cs130_alex 2.1
|
226 rizwank 2.3 static void printCabInfo(FDICABINETINFO cabinfo){
|
227 rizwank 2.4 printf(" Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %d hp %d hn %d\n",
|
228 cs130_alex 2.1 cabinfo.cbCabinet,
|
229 rizwank 2.5 cabinfo.cFolders ,
|
230 cs130_alex 2.1 cabinfo.cFiles ,
231 cabinfo.setID,
232 cabinfo.iCabinet,
233 cabinfo.fReserve ,
234 cabinfo.hasprev ,
|
235 rizwank 2.3 cabinfo.hasnext );
|
236 cs130_alex 2.1 }
|
237 rizwank 2.7 #ifndef TVFS
238 FNREAD(real_read) {
239 int szBuffer = _read(hf,pv,cb);
240 printf(" FNREAD (read) just called with %d, %d, %d\n",hf, pv, cb);
241 printf(" FNREAD (read) returning size (%d)\n",szBuffer);
242 return szBuffer;
243 }
244 FNCLOSE(real_close) {
245 int closevalue = _close(hf);
246 printf(" FNCLOSE (real) just called with %d - returning %d\n",hf,closevalue);
247 return closevalue;
248 }
249
250 FNWRITE(real_write) {
251 int write_value = _write(hf, pv, cb);
252 printf(" FNWRITE just called with %d, %d, %d - returning %d\n",hf, pv, cb, write_value);
253 return write_value;
254 }
255
256 FNSEEK(real_seek) {
257 long lseek_value = _lseek(hf, dist, seektype);
258 rizwank 2.7 printf(" FNSEEK just called with %d, %d, %d - returning %d\n",hf, dist, seektype,lseek_value);
259 return lseek_value;
260 }
261
262 FNOPEN(real_open) {
263 int handler = _open(pszFile,oflag,pmode);
264 printf(" FNOPEN (real) just called with %s, %d, %d\n",pszFile, oflag, pmode);
265 printf(" FNOPEN (real) returning handler (%d)\n",handler);
266 return handler;
267 }
268 #endif
|
269 cs130_alex 2.1
|
270 cs130_alex 2.2 static void CheckCabInfo(char * cabname,
271 FDICABINETINFO cabinfo,
|
272 rizwank 2.3 long TcbCabinet,
273 USHORT TcFolders,
274 USHORT TcFiles,
275 USHORT TsetID,
276 USHORT TiCabinet,
277 BOOL TfReserve,
278 BOOL Thasprev,
279 BOOL Thasnext){
|
280 rizwank 2.5 ok2 ( cabinfo.cbCabinet == TcbCabinet, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
281 ok2 ( cabinfo.cFolders == TcFolders, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
282 ok2 ( cabinfo.cFiles == TcFiles, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
283 ok2 ( cabinfo.setID == TsetID, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
284 ok2 ( cabinfo.iCabinet == TiCabinet, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
285 ok2 ( cabinfo.fReserve == TfReserve, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
286 ok2 ( cabinfo.hasprev == Thasprev, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
287 ok2 ( cabinfo.hasnext == Thasnext, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
|
288 cs130_alex 2.1 }
|
289 rizwank 2.5 HFDI hfdi_unknown_dummy, hfdi_unknown_tvfs;
|
290 rizwank 1.4 /* yes its global and ugly */
291
|
292 rizwank 2.0 /* Is CPU386 or Unknown more commonly used? */
|
293 rizwank 1.1
|
294 rizwank 1.4 static void TestCreate(void) {
295
296 ERF error_structure;
297
298 printf("Starting TestCreate()\n");
299
|
300 rizwank 1.7 hfdi_unknown_dummy = FDICreate(
|
301 rizwank 1.8 final_alloc,
302 final_free,
|
303 rizwank 1.5 dummy_open,
304 dummy_read,
305 dummy_write,
306 dummy_close,
307 dummy_seek,
308 cpuUNKNOWN,
309 &error_structure
310 );
|
311 rizwank 1.7 ok(hfdi_unknown_dummy != NULL,"FDICreate (CPU = unknown) (functions=dummy) failed!\n");
312
|
313 rizwank 2.5 hfdi_unknown_tvfs = FDICreate(
|
314 rizwank 1.8 final_alloc,
|
315 rizwank 2.6 final_free,
|
316 rizwank 2.7 #ifdef TVFS
317 tvfs_open, tvfs_read, tvfs_write, tvfs_close, tvfs_lseek,
318 #else
319 real_open, real_read, real_write, real_close,real_seek,
320 #endif
|
321 rizwank 2.6 cpuUNKNOWN,
|
322 rizwank 1.7 &error_structure
323 );
|
324 rizwank 2.5 ok(hfdi_unknown_tvfs != NULL,"FDICreate (CPU = unknown) (functions=tvfs) failed!\n");
|
325 rizwank 1.7
326 printf("Ending TestCreate()\n");
327 }
328
329 static void TestInfo(void) {
|
330 rizwank 2.7 #ifdef TVFS
|
331 rizwank 2.5 int fd;
332
|
333 rizwank 1.8 FDICABINETINFO fdi_cabinfo_dummy, fdi_cabinfo_simple, fdi_cabinfo_complex;
|
334 rizwank 1.7
335 printf("Starting TestInfo()\n");
|
336 rizwank 1.8
337 /* TEST : ERR filehandle associated, dummy functions should return FALSE */
338 ok ( FDIIsCabinet( hfdi_unknown_dummy, -1, &fdi_cabinfo_dummy) == FALSE,
|
339 rizwank 1.7 "FDIIsCabinet (File = Error) failed!\n");
|
340 rizwank 1.8
341
|
342 rizwank 2.5 tvfs_create( name_simple_cab, file_simple_cab, size_simple_cab);
343 fd = tvfs_open( name_simple_cab, _O_BINARY, 0 );
|
344 rizwank 2.0
|
345 rizwank 2.5 ok( FDIIsCabinet( hfdi_unknown_tvfs, fd, &fdi_cabinfo_simple) == TRUE,
346 "FDIIsCabinet (Virtual File = Simple.cab) failed!\n");
|
347 rizwank 2.0
|
348 rizwank 2.5 printCabInfo(fdi_cabinfo_simple);
349 CheckCabInfo("simple.cab",fdi_cabinfo_simple,121,1,1,0,0,0,0,0);
|
350 rizwank 2.0
|
351 rizwank 2.5 tvfs_close(fd);
|
352 rizwank 2.4
|
353 rizwank 2.0
|
354 rizwank 2.5 tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab);
355 fd = tvfs_open( name_complex_cab, _O_BINARY, 0 );
|
356 rizwank 2.0
|
357 rizwank 2.5 ok( FDIIsCabinet( hfdi_unknown_tvfs, fd, &fdi_cabinfo_complex) == TRUE,
358 "FDIIsCabinet (Virtual File = Complex.cab) failed!\n");
|
359 rizwank 1.7
|
360 cs130_alex 2.1 printCabInfo(fdi_cabinfo_complex);
|
361 rizwank 2.5 CheckCabInfo("complex.cab",fdi_cabinfo_complex,12918,1,2,0,0,0,0,0);
|
362 rizwank 2.0
|
363 rizwank 2.8 tvfs_close(fd);
364 tvfs_free();
|
365 rizwank 1.7
|
366 rizwank 2.5 printf("Ending TestInfo()\n");
|
367 rizwank 2.7 #endif
|
368 rizwank 1.7 }
|
369 cs130_alex 2.1
|
370 rizwank 2.3 static void TestCopy(void){
|
371 rizwank 2.8
372 char name_file_path[256];
373 int result;
374
|
375 rizwank 2.3 printf("Starting TestCopy()\n");
376 printf("---simple.cab\n");
|
377 rizwank 2.8 #ifdef TVFS
378 tvfs_create( name_simple_cab, file_simple_cab, size_simple_cab);
379 #endif
380 FDICopy(hfdi_unknown_tvfs,
381 "simple.cab",
382 "",
383 0,
384 notification_function,
385 NULL,
386 NULL);
387
388 #ifdef TVFS
389 /* Filename when extracted is ./<filename> */
390 sprintf(name_file_path, "./%s", name_simple_txt);
391 result = tvfs_compare(name_file_path, file_simple_txt, size_simple_txt);
392 if (result)
393 printf ("File compare failed!\n");
394 tvfs_free();
395 #endif
396
397
398 rizwank 2.8 printf("---complex.cab\n");
399 #ifdef TVFS
400 tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab);
401 #endif
|
402 rizwank 2.5 FDICopy(hfdi_unknown_tvfs,
|
403 rizwank 2.7 "complex.cab",
|
404 rizwank 2.5 "",
|
405 rizwank 2.3 0,
406 notification_function,
407 NULL,
408 NULL);
409
|
410 rizwank 2.8 #ifdef TVFS
411 /* Filename when extracted is ./<filename> */
412 sprintf(name_file_path, "./%s", name_README);
413 result = tvfs_compare(name_file_path, file_README, size_README);
414 if (result)
415 printf ("File compare failed!\n");
416 tvfs_free();
417 #endif
418
419
420
421 printf("Ending TestCopy()\n");
|
422 cs130_alex 2.1 }
423
|
424 rizwank 1.7 static void TestDestroy(void) {
425 printf("Starting TestDestroy()\n");
|
426 rizwank 2.0
|
427 rizwank 1.7 ok(FDIDestroy(hfdi_unknown_dummy), "FDIDestroy (CPU = unknown) (functions=fake) failed!\n");
|
428 rizwank 2.5 ok(FDIDestroy(hfdi_unknown_tvfs), "FDIDestroy (CPU = unknown) (functions=tvfs) failed!\n");
|
429 rizwank 1.7 printf("Ending TestDestroy()\n");
|
430 rizwank 1.4 }
|
431 rizwank 1.1
432 START_TEST(paths)
433 {
|
434 rizwank 1.4 TestCreate();
|
435 rizwank 1.7 TestInfo();
|
436 rizwank 1.2 TestCopy();
437 TestDestroy();
|
438 rizwank 2.5 tvfs_free();
|
439 rizwank 1.1 }
|