(file) Return to cabinet_fdi.c CVS log (file) (dir) Up to [RizwankCVS] / group3 / wine / dlls / cabinet / tests

Diff for /group3/wine/dlls/cabinet/tests/cabinet_fdi.c between version 2.0 and 2.13

version 2.0, 2005/02/11 10:54:42 version 2.13, 2005/03/11 07:38:58
Line 1 
Line 1 
 /* /*
  * Unit test suite for cabinet.dll - FDI functions  * Unit test suite for cabinet.dll - FDI functions
  *  *
  * Copyright 2004 Rizwan Kassim, Dan Kegel   * Copyright 2004 Rizwan Kassim, Dan Kegel, Alexander Liber
  *  *
  * This library is free software; you can redistribute it and/or  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public  * modify it under the terms of the GNU Lesser General Public
Line 18 
Line 18 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */  */
  
   #include <stdio.h>
 #include <stdlib.h> #include <stdlib.h>
   #include <string.h>
   #include <sys/stat.h>
   #include <stdarg.h>
   #include <malloc.h>
   
   #include <stdarg.h>
   #include <stdio.h>
   
   #include "windef.h"
   #include "winbase.h"
   #include "winerror.h"
   #include "fdi.h"
   
   #ifndef WIN_ENV
   #include <msvcrt/fcntl.h>
   #else
   #include <fcntl.h>
   #endif
   
   #include "tvfs.h"
   #include "data.h"
  
 #ifndef STANDALONE #ifndef STANDALONE
 #include <wine/test.h> #include <wine/test.h>
   #define _S_IREAD  0x0100
   #define _S_IWRITE 0x0080
 #define ok2 ok #define ok2 ok
 #else #else
 /* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ cabinet_fdi.c FDI.lib  /* To build outside Wine tree, compile with cl -DSTANDALONE -D_X86_ -DWIN_ENV tvfs.c cabinet_fdi.c FDI.lib
   These are only called if standalone are used, defining ok and START_TEST, which would normally be declared in winetree */   These are only called if standalone are used, defining ok and START_TEST, which would normally be declared in winetree */
 #include <assert.h> #include <assert.h>
 #include <stdio.h>  
 #define START_TEST(name) main(int argc, char **argv) #define START_TEST(name) main(int argc, char **argv)
 #define ok(condition, msg)       \ #define ok(condition, msg)       \
         do { if(!(condition)) {  \         do { if(!(condition)) {  \
Line 40 
Line 64 
                 exit(1);         \                 exit(1);         \
         } } while(0)         } } while(0)
 #define todo_wine #define todo_wine
 #endif  
  
 #include <winerror.h>  static void trace(const char *s, ...)
 #include <fdi.h>  {
 #include <fcntl.h>      va_list ellipsis;
       va_start (ellipsis, s);
       vprintf(s, ellipsis);
       va_end(ellipsis);
   }
   
   #endif
  
 /* Do malloc and free output debug messages? /* Do malloc and free output debug messages?
 #define DEBUG_ALLOC #define DEBUG_ALLOC
 */  #define VERBOSE
   
 /* What is our "Fake" Filedescriptor? */  
 static int fakeFD = 22881;  
   
 /*  
    This hex data is the output of makecab.exe (Windows Cabinet SDK/bin)  
    ****** IS USING THE OUTPUT OF A NON LGPL program okay ******  
   
    The cab file is mirrored in the file system as simple.cab  
   
    The 'test.txt' in the cab file contains the string 'So long, and thanks for all the fish.'  
 */  
 static unsigned char compressed_file[] =  
    {0x4D,0x53,0x43,0x46,0x00,0x00,0x00,0x00,0x75,0x00,  
         0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,  
         0x00,0x00,0x00,0x00,0x03,0x01,0x01,0x00,0x01,0x00,  
         0x00,0x00,0x39,0x30,0x00,0x00,0x45,0x00,0x00,0x00,  
         0x01,0x00,0x01,0x00,0x26,0x00,0x00,0x00,0x00,0x00,  
         0x00,0x00,0x00,0x00,0x4A,0x32,0xB2,0xBE,0x20,0x00,  
         0x74,0x65,0x73,0x74,0x2E,0x74,0x78,0x74,0x00,0x9C,  
         0x74,0xD0,0x75,0x28,0x00,0x26,0x00,0x43,0x4B,0x0B,  
         0xCE,0x57,0xC8,0xC9,0xCF,0x4B,0xD7,0x51,0x48,0xCC,  
         0x4B,0x51,0x28,0xC9,0x48,0xCC,0xCB,0x2E,0x56,0x48,  
         0xCB,0x2F,0x52,0x48,0xCC,0xC9,0x01,0x72,0x53,0x15,  
         0xD2,0x32,0x8B,0x33,0xF4,0xB8,0x00};  
 static int szcompressed_file = sizeof(compressed_file);  
   
 /*  
         Multiple File Cabs are included, as cabinet.dll supports multiple file archive types.  
         The compressed file size had to be greater than 50k, cabarc restricts 'diskette spanning' to  
           archives above 50k.  
         The peculiar options were selected specifically to test cabinet.dll more throughly.  
   
         complex_lzw.cab         cabarc -m LZX:16 -pr -i 32356 N complex_lzw.cab amontillado.txt lgpl.txt gpl.txt midsummer\*  
         complex_lzw2.cab        cabarc -m LZX:17 -d 50000 -pr -i 32356 N complex_lzw*.cab amontillado.txt + lgpl.txt gpl.txt midsummer\*  
   
         complex_zip.cab         cabarc -m MSZIP -pr -i 32356 N complex_lzw.cab amontillado.txt lgpl.txt gpl.txt midsummer\*  
         complex_zip2.cab        cabarc -m MSZIP -d 50000 -pr -i 32356 N complex_zip*.cab amontillado.txt + lgpl.txt gpl.txt midsummer\*  
   
         complex_none.cab        cabarc -m NONE -pr -i 32356 N complex_none.cab amontillado.txt midsummer\act1*  
   
 /*  
         To do in FDI:                           -from wine/include/fdi.h  
         FDICreate  
                 File Write                              -FNWRITE(hf, pv, cb)  
                 File Seek                               -FNSEEK(hf,dist,seektype)  
                 Error Structure  
         FDICopy  
                 Notification function  
                 Decryption function  
         FDIDestroy  
 */ */
  
 #ifndef DEBUG_ALLOC #ifndef DEBUG_ALLOC
Line 112 
Line 90 
 } }
 #else #else
 FNALLOC(final_alloc) { FNALLOC(final_alloc) {
         printf("   FNALLOC just called with %d\n",cb);      trace("   FNALLOC just called with %d\n",cb);
         return malloc(cb);         return malloc(cb);
 } }
 FNFREE(final_free) { FNFREE(final_free) {
         printf("   FNFREE just called with %d\n",pv);      trace("   FNFREE just called with %d\n",pv);
         free(pv);         free(pv);
         return;         return;
 } }
 #endif #endif
   /*Possible non trivial addition:
   Notify receives some information about the cab file(see FDI documentation).
 /*  Since this info is different depending on the value of fdint, and Notify should
         Match i/o specs of _open, _read, _write, _close, and _lseek.  be generic, it is not simple or nice to check this information.
 */  
   
 /*  
         http://msdn.microsoft.com/library/en-us/vclib/html/_crt__open.2c_._wopen.asp  
         _open           I: const char *filename, int oflag, int pmode   O: int (handler), -1 for err.  
         DUMMY  : FUNCTIONAL             FAKE : FUNCTIONAL               REAL : FUNCTIONAL  
 */ */
   FNFDINOTIFY(notification_function)
 FNOPEN(dummy_open) {  {
         printf("  FNOPEN (dummy) just called with %d, %d, %d\n",pszFile, oflag, pmode);  #ifdef VERBOSE
       trace("   FNFDINOTIFY real just called with %d, %d \n",fdint,pfdin);
   #endif
       switch (fdint)
       {
           case fdintCABINET_INFO:
           {
   #ifdef VERBOSE
               trace(
                   "fdintCABINET_INFO:\n"
                   "-next cab name: %s\n"
                   "-next disk: %s\n"
                   "-path name: %s\n"
                   "-set ID: %d\n"
                   "-number in set: %d\n",
                   pfdin->psz1,
                   pfdin->psz2,
                   pfdin->psz3,
                   pfdin->setID,
                   pfdin->iCabinet
               );
   #endif
         return 0;         return 0;
 } }
           case fdintPARTIAL_FILE:
           {
   #ifdef VERBOSE
               trace("dintPARTIAL_FILE\n");
   #endif
  
 FNOPEN(fake_open) {  
         printf("  FNOPEN (fake) just called with %d, %d, %d\n",pszFile, oflag, pmode);  
         printf("  Returning %d as file descriptor\n",fakeFD);  
         return 12;  
 }  
   
 FNOPEN(real_open) {  
         int handler = _open(pszFile,oflag,pmode);  
         printf("   FNOPEN (real) just called with %s, %d, %d\n",pszFile, oflag, pmode);  
         printf("   FNOPEN (real) returning handler (%d)\n",handler);  
         return handler;  
 }  
   
 /*  
         http://msdn.microsoft.com/library/en-us/vclib/html/_CRT__read.asp  
         _read           I: int fd, void *buffer, unsigned int count             O:      int (szBuffer)  
         DUMMY  : FUNCTIONAL             FAKE : FUNCTIONAL, INCOMPLETE           REAL : FUNCTIONAL  
 */  
   
 FNREAD(dummy_read) {  
         printf("   FNREAD (dummy) just called with %d, %d, %d\n",hf, pv, cb);  
         return 0;         return 0;
 } }
           case fdintCOPY_FILE:
 /* Doesn't keep virtual file location pointer */          {
 FNREAD(fake_read) {              int fih = 0;
         printf("   FNREAD (fake) just called with %d, %d, %d\n",hf, pv, cb);              char target[256];
         if (hf == fakeFD) {  #ifdef VERBOSE
                 printf ("   Called with fake file descriptor, populating buffer and size (%d)\n",cb);              trace(
                 memcpy (pv, compressed_file ,cb);                  "fdintCOPY_FILE:\n"
                 }                  "-name: %s\n"
         else {                  "-uncompressed size: %d\n"
                 printf ("   FNREAD (fake) was called with the unknown file handler. Failed!\n",hf);                  "-date: %d\n"
         }                  "-time: %d\n"
         return cb;                  "-attributes: %d\n"
 }                  "-file's folder index: %d\n",
                   pfdin->psz1,
 FNREAD(real_read) {                  pfdin->cb,
         int szBuffer = _read(hf,pv,cb);                  pfdin->date,
         printf("   FNREAD (read) just called with %d, %d, %d\n",hf, pv, cb);                  pfdin->time,
         printf("   FNREAD (read) returning size (%d)\n",szBuffer);                  pfdin->attribs,
         return szBuffer;                  pfdin->iFolder
               );
   #endif
               sprintf(target, "./%s",pfdin->psz1);
               fih = tvfs_open (target,
                   _O_BINARY | _O_CREAT | _O_WRONLY | _O_SEQUENTIAL,
                   _S_IREAD | _S_IWRITE
               );
               return fih;
 } }
           case fdintCLOSE_FILE_INFO:
           {
   #ifdef VERBOSE
               trace(
                   "fdintCLOSE_FILE:\n"
                   "-name: %s\n"
                   "-handle: %d\n"
                   "-date: %d\n"
                   "-time: %d\n"
                   "-attributes: %d\n"
                   "-file's folder index: %d\n"
                   "-run: %d\n",
                   pfdin->psz1,
                   pfdin->hf,
                   pfdin->date,
                   pfdin->time,
                   pfdin->attribs,
                   pfdin->iFolder,
                   pfdin->cb
               );
   #endif
  
 /*              tvfs_close(pfdin->hf);
         http://msdn.microsoft.com/library/en-us/vclib/html/_CRT__close.asp              return TRUE;
         _close          I: int fd   O:  int (0=success 1=failure)          }
         DUMMY  : FUNCTIONAL             FAKE : FUNCTIONAL               REAL : FUNCTIONAL          case fdintNEXT_CABINET:
 */          {
   #ifdef VERBOSE
 FNCLOSE(dummy_close) {              trace("fdintNEXT_CABINET\n");
         printf("   FNCLOSE (dummy) just called with %d - returning %d\n",hf,0);  #endif
         return 0;         return 0;
 } }
           case fdintENUMERATE:
 FNCLOSE(fake_close) {          {
         printf("   FNCLOSE (fake) just called with %d - returning %d\n",hf,0);  #ifdef VERBOSE
               trace("fdintENUMERATE\n");
   #endif
         return 0;         return 0;
 } }
   
 FNCLOSE(real_close) {  
         int closevalue = _close(hf);  
         printf("   FNCLOSE (real) just called with %d - returning %d\n",hf,closevalue);  
         return closevalue;  
 } }
   
   
   
   
   
 FNWRITE(dummy_write) {  
         printf("   FNWRITE just called with %d, %d, %d\n",hf, pv, cb);  
         return 0;         return 0;
 } }
  
 FNSEEK(dummy_seek) {  static void printCabInfo(FDICABINETINFO  cabinfo){
         printf("   FNSEEK just called with %d, %d, %d\n",hf, dist, seektype);  #ifdef VERBOSE
         return 0;      trace("   Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %d hp %d hn %d\n",
           cabinfo.cbCabinet,
           cabinfo.cFolders ,
           cabinfo.cFiles ,
           cabinfo.setID,
           cabinfo.iCabinet,
           cabinfo.fReserve ,
           cabinfo.hasprev ,
           cabinfo.hasnext );
   #endif
 } }
  
   static void CheckCabInfo(char *  cabname,
       FDICABINETINFO cabinfo,
       long    TcbCabinet,
       USHORT    TcFolders,
       USHORT    TcFiles,
       USHORT    TsetID,
       USHORT    TiCabinet,
       BOOL    TfReserve,
       BOOL    Thasprev,
       BOOL    Thasnext){
       ok2 ( cabinfo.cbCabinet == TcbCabinet, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.cFolders == TcFolders, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.cFiles == TcFiles, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.setID == TsetID, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.iCabinet == TiCabinet, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.fReserve == TfReserve, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.hasprev == Thasprev, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
       ok2 ( cabinfo.hasnext == Thasnext, "FDIIsCabinet,cabinfo %s data did not match! Failed!\n", cabname);
      }
  
   static HFDI hfdi_unknown;
 HFDI hfdi_unknown_dummy, hfdi_unknown_fake,hfdi_unknown_real;  
 /* yes its global and ugly */ /* yes its global and ugly */
  
 /* Is CPU386 or Unknown more commonly used? */ /* Is CPU386 or Unknown more commonly used? */
Line 229 
Line 252 
  
         ERF error_structure;         ERF error_structure;
  
         printf("Starting TestCreate()\n");      trace("Starting TestCreate()\n");
   
         hfdi_unknown_dummy = FDICreate(  
                 final_alloc,  
                 final_free,  
                 dummy_open,  
                 dummy_read,  
                 dummy_write,  
                 dummy_close,  
                 dummy_seek,  
                 cpuUNKNOWN,  
                 &error_structure  
         );  
         ok(hfdi_unknown_dummy != NULL,"FDICreate (CPU = unknown) (functions=dummy) failed!\n");  
  
         hfdi_unknown_fake = FDICreate(      hfdi_unknown = FDICreate(
                 final_alloc,                 final_alloc,
                 final_free,                 final_free,
                 fake_open,          tvfs_open, tvfs_read, tvfs_write, tvfs_close, tvfs_lseek,
                 fake_read,  
                 dummy_write,  
                 dummy_close,  
                 dummy_seek,  
                 cpuUNKNOWN,                 cpuUNKNOWN,
                 &error_structure                 &error_structure
         );         );
         ok(hfdi_unknown_fake != NULL,"FDICreate (CPU = unknown) (functions=fake) failed!\n");  
  
         hfdi_unknown_real = FDICreate(      ok(hfdi_unknown != NULL,"FDICreate (CPU = unknown) (functions=tvfs) failed!\n");
                 final_alloc,  
                 final_free,  
                 real_open,  
                 real_read,  
                 dummy_write,  
                 real_close,  
                 dummy_seek,  
                 cpuUNKNOWN,  
                 &error_structure  
         );  
         ok(hfdi_unknown_real != NULL,"FDICreate (CPU = unknown) (functions=real) failed!\n");  
  
         printf("Ending TestCreate()\n");      trace("Ending TestCreate()\n");
 } }
  
 static void TestInfo(void) { static void TestInfo(void) {
         /* Noticed Behavior :  
                 FDIIsCabinet does not open the file on its own, it requires a file open/close to be done externally.  
                         WHY?  
                 The only functions in HFDI that FDIIsCabinet directly accesses is FNREAD  
                 Important cases to check :  
                         If the filedescriptor == ERR, does it FAIL?                                                     (dummy_read)  
                         If the filedescriptor == NOTCABINET, does it FAIL?                                      (fake_read, real_read)  
                         If the filedescriptor == CABINET, does it SUCCEED?                                      (fake_read, real_read)  
                         If the filedescriptor == CABINET, does it populate FDICABINETINFO?      (fake_read, real_read)  
         */  
  
         int realfd;      int fd;
         int sizer;  
         FDICABINETINFO  fdi_cabinfo_dummy, fdi_cabinfo_simple, fdi_cabinfo_complex;      FDICABINETINFO  fdi_cabinfo_simple, fdi_cabinfo_complex;
   
         printf("Starting TestInfo()\n");      trace("Starting TestInfo()\n");
   
         /* TEST : ERR filehandle associated, dummy functions should return FALSE */      tvfs_create( name_simple_cab, file_simple_cab, size_simple_cab);
         ok ( FDIIsCabinet( hfdi_unknown_dummy, -1, &fdi_cabinfo_dummy) == FALSE,      fd = tvfs_open( name_simple_cab, _O_BINARY, 0 );
                         "FDIIsCabinet (File = Error) failed!\n");  
       ok( FDIIsCabinet( hfdi_unknown, fd, &fdi_cabinfo_simple) == TRUE,
         /* TEST : Fake filehandle associated, memory manually copied, should return TRUE */      "FDIIsCabinet (Virtual File = Simple.cab) failed!\n");
         ok ( FDIIsCabinet( hfdi_unknown_fake, fakeFD, &fdi_cabinfo_simple) == TRUE,  
                         "FDIIsCabinet (FakeFile = Cabinet) failed!\n");      printCabInfo(fdi_cabinfo_simple);
       CheckCabInfo("simple.cab",fdi_cabinfo_simple,121,1,1,0,0,0,0,0);
                 ok ( fdi_cabinfo_simple.cbCabinet == 117, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");  
                 ok ( fdi_cabinfo_simple.cFolders == 1, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");      tvfs_close(fd);
                 ok ( fdi_cabinfo_simple.cFiles == 1, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");  
                 ok ( fdi_cabinfo_simple.setID == 12345, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");      tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab);
                 ok ( fdi_cabinfo_simple.iCabinet == 0, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");      fd = tvfs_open( name_complex_cab, _O_BINARY, 0 );
                 ok ( fdi_cabinfo_simple.fReserve == 0, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");  
                 ok ( fdi_cabinfo_simple.hasprev == 0, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");  
                 ok ( fdi_cabinfo_simple.hasnext == 0, "FDIIsCabinet,cabinfo (FakeFile = Cabinet) data did not match! Failed!\n");  
   
   
         /* simply this with macros?  
                yes, make one macro with inputs (cabname, testname, [expected values] ) --- using lambda notation  
            add checks for cabinfo data!  
            Is it ok to reuse the same hfdi_unknown_real ? */  
   
         /* TEST : Opened filehandle associated, corrupted cab loaded, should return FALSE */  
         /* We can see that the Windows implementation only reads the first 36 bytes - what if we corrupted a CAB after 36 bytes?*/  
   
         realfd = real_open( "broken.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == FALSE,  
                         "FDIIsCabinet (File = Bad-Cabinet) broken.cab failed!\n");  
         real_close(realfd);  
   
         realfd = real_open( "cabinet_fdi.c" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == FALSE,  
                         "FDIIsCabinet (File = Non-Cabinet) cabinet_fdi.c failed!\n");  
         real_close(realfd);  
   
   
         /* TEST : Opened filehandle associated, valid cab loaded, should return TRUE */  
         realfd = real_open( "complex_lzw.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == TRUE,  
                         "FDIIsCabinet (File = Cabinet) complex_lzw.cab failed!\n");  
         real_close(realfd);  
   
         printf("Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %b hp %d hn %d\n",  
                         fdi_cabinfo_complex.cbCabinet,  
                         fdi_cabinfo_complex.cFolders ,  
                         fdi_cabinfo_complex.cFiles ,  
                         fdi_cabinfo_complex.setID,  
                         fdi_cabinfo_complex.iCabinet,  
                         fdi_cabinfo_complex.fReserve ,  
                         fdi_cabinfo_complex.hasprev ,  
                         fdi_cabinfo_complex.hasnext );  
   
         realfd = real_open( "complex_lzw2.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == TRUE,  
                         "FDIIsCabinet (File = Cabinet) complex_lzw2.cab failed!\n");  
         real_close(realfd);  
   
         printf("Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %b hp %d hn %d\n",  
                         fdi_cabinfo_complex.cbCabinet,  
                         fdi_cabinfo_complex.cFolders ,  
                         fdi_cabinfo_complex.cFiles ,  
                         fdi_cabinfo_complex.setID,  
                         fdi_cabinfo_complex.iCabinet,  
                         fdi_cabinfo_complex.fReserve ,  
                         fdi_cabinfo_complex.hasprev ,  
                         fdi_cabinfo_complex.hasnext );  
   
         realfd = real_open( "complex_zip.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == TRUE,  
                         "FDIIsCabinet (File = Cabinet) complex_zip.cab failed!\n");  
         real_close(realfd);  
   
         printf("Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %b hp %d hn %d\n",  
                         fdi_cabinfo_complex.cbCabinet,  
                         fdi_cabinfo_complex.cFolders ,  
                         fdi_cabinfo_complex.cFiles ,  
                         fdi_cabinfo_complex.setID,  
                         fdi_cabinfo_complex.iCabinet,  
                         fdi_cabinfo_complex.fReserve ,  
                         fdi_cabinfo_complex.hasprev ,  
                         fdi_cabinfo_complex.hasnext );  
   
         realfd = real_open( "complex_zip2.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == TRUE,  
                         "FDIIsCabinet (File = Cabinet) complex_zip2.cab failed!\n");  
         real_close(realfd);  
   
         printf("Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %b hp %d hn %d\n",  
                         fdi_cabinfo_complex.cbCabinet,  
                         fdi_cabinfo_complex.cFolders ,  
                         fdi_cabinfo_complex.cFiles ,  
                         fdi_cabinfo_complex.setID,  
                         fdi_cabinfo_complex.iCabinet,  
                         fdi_cabinfo_complex.fReserve ,  
                         fdi_cabinfo_complex.hasprev ,  
                         fdi_cabinfo_complex.hasnext );  
   
         realfd = real_open( "complex_none.cab" , _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0);  
   
         ok ( FDIIsCabinet( hfdi_unknown_real, realfd, &fdi_cabinfo_complex) == TRUE,  
                         "FDIIsCabinet (File = Cabinet) complex_zip.cab failed!\n");  
         real_close(realfd);  
   
         printf("Cabinet Data : cbC %d cF %d cFi %d si %d iC %d fr %b hp %d hn %d\n",  
                         fdi_cabinfo_complex.cbCabinet,  
                         fdi_cabinfo_complex.cFolders ,  
                         fdi_cabinfo_complex.cFiles ,  
                         fdi_cabinfo_complex.setID,  
                         fdi_cabinfo_complex.iCabinet,  
                         fdi_cabinfo_complex.fReserve ,  
                         fdi_cabinfo_complex.hasprev ,  
                         fdi_cabinfo_complex.hasnext );  
  
       ok( FDIIsCabinet( hfdi_unknown, fd, &fdi_cabinfo_complex) == TRUE,
       "FDIIsCabinet (Virtual File = Complex.cab) failed!\n");
  
       printCabInfo(fdi_cabinfo_complex);
       CheckCabInfo("complex.cab",fdi_cabinfo_complex,12918,1,2,0,0,0,0,0);
   
       tvfs_close(fd);
       tvfs_free();
   
       trace("Ending TestInfo()\n");
 } }
  
 static void TestDestroy(void) {  static void TestCopy(void){
         printf("Starting TestDestroy()\n");  
                 /* Should return TRUE if given a valid hfdi, else FALSE (only due to context errors?) */      char name_file_path[256];
       int result;
   
       trace("Starting TestCopy()\n");
       trace("---simple.cab\n");
   
       tvfs_create( name_simple_cab, file_simple_cab, size_simple_cab);
       FDICopy(hfdi_unknown,
           "simple.cab",
           "",
           0,
           notification_function,
           NULL,
           NULL);
   
       /* Filename when extracted is ./<filename> */
       sprintf(name_file_path, "./%s", name_simple_txt);
       result = tvfs_compare(name_file_path, file_simple_txt, size_simple_txt);
       if (result)
           trace ("File %s compare failed!\n",name_file_path);
       tvfs_free();
  
         ok(FDIDestroy(hfdi_unknown_dummy), "FDIDestroy (CPU = unknown) (functions=fake) failed!\n");      trace("---complex.cab\n");
         ok(FDIDestroy(hfdi_unknown_fake), "FDIDestroy (CPU = unknown) (functions=fake) failed!\n");      tvfs_create( name_complex_cab, file_complex_cab, size_complex_cab);
         ok(FDIDestroy(hfdi_unknown_real), "FDIDestroy (CPU = unknown) (functions=real) failed!\n");      FDICopy(hfdi_unknown,
         printf("Ending TestDestroy()\n");          "complex.cab",
           "",
           0,
           notification_function,
           NULL,
           NULL);
  
   
       tvfs_free();
   
       trace("Ending TestCopy()\n");
 } }
  
 START_TEST(paths)  static void TestDestroy(void) {
       trace("Starting TestDestroy()\n");
       ok(FDIDestroy(hfdi_unknown), "FDIDestroy (CPU = unknown) (functions=tvfs) failed!\n");
       trace("Ending TestDestroy()\n");
   }
   
   START_TEST(cabinet_fdi)
 { {
         TestCreate();         TestCreate();
         TestInfo();         TestInfo();
         /*  
         TestCopy();         TestCopy();
         */  
         TestDestroy();         TestDestroy();
       tvfs_free();
 } }


Legend:
Removed from v.2.0  
changed lines
  Added in v.2.13

Rizwan Kassim
Powered by
ViewCVS 0.9.2