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

Diff for /group3/wine/dlls/cabinet/tests/tvfs.c between version 1.2 and 1.12

version 1.2, 2005/02/25 06:00:58 version 1.12, 2005/03/13 12:13:17
Line 7 
Line 7 
 #include "tvfs.h" #include "tvfs.h"
 #include <string.h> #include <string.h>
  
 /* This is extremely cheezy.  Everything is preallocated per file. */  #define MAXFILES 20
   #define MAXHANDLES 20
 #define MAXFILES 10  
 #define MAXHANDLES 10  
 #define MAXFNAME 255 #define MAXFNAME 255
 #define MAXFLEN 65536  #define MAXFLEN 65536*2
   
   #include <fcntl.h>
   #include <stdlib.h>
   #include <stdio.h>
   #include <malloc.h>
   #include <stdio.h>
   #include <stdarg.h>
   
   #define SEEK_SET 0
   #define SEEK_CUR 1
   #define SEEK_END 2
   
   #ifndef _O_BINARY
   #define _O_BINARY 0
   #endif
   
  
   #undef VERBOSE
   #ifdef TVFS_DEBUG
   #define VERBOSE
   #endif
   
   /*
   Only debug output from tvfs.c IF TVFS_DEBUG is true, not just if VERBOSE is true
   The TVFS debug traces are generally used for debugging TVFS, not cabinet_fdi
 #define TVFS_MAIN #define TVFS_MAIN
   #define TVFS_DEBUG
   */
  
 #ifdef TVFS_MAIN  #ifndef STANDALONE
 #include "cabinet_files.h"  #include "wine/test.h"
 #include <fcntl.h>  #define ok2 ok
   #else
   #include "standalone.h"
   #undef START_TEST
 #endif #endif
  
 struct tvfs_file { struct tvfs_file {
Line 27 
Line 54 
        char buf[MAXFLEN];        char buf[MAXFLEN];
 }; };
 static struct tvfs_file *files[MAXFILES]; static struct tvfs_file *files[MAXFILES];
 int nfiles = 0;  
  
 struct tvfs_fcb { struct tvfs_fcb {
        int pos;        int pos;
        int inode;        int inode;
 }; };
 static struct tvfs_fcb *handles[MAXHANDLES]; static struct tvfs_fcb *handles[MAXHANDLES];
   
 int nhandles = 0; int nhandles = 0;
   int nfiles = 0;
  
 /* tvfs_create does NOT correspond to _creat - it is an internal function /* tvfs_create does NOT correspond to _creat - it is an internal function
 use to put a file directly into our virtual filesystem. */ use to put a file directly into our virtual filesystem. */
Line 43 
Line 71 
 { {
            int inode;            int inode;
        struct tvfs_file *f;        struct tvfs_file *f;
   
       trace("tvfs_create called with %s, %d, %d\n", fname, buf, len);
   
        if (nfiles >= MAXFILES)        if (nfiles >= MAXFILES)
                return -1;                return -1;
        inode = nfiles++;        inode = nfiles++;
                 /* calloc didn't work here, while malloc did */  
            f = malloc(sizeof(struct tvfs_file));            f = malloc(sizeof(struct tvfs_file));
        strcpy(f->fname, fname);        strcpy(f->fname, fname);
        f->bytes_used = len;        f->bytes_used = len;
   
        if (buf)        if (buf)
                memcpy(f->buf, buf, len);                memcpy(f->buf, buf, len);
   
        files[inode] = f;        files[inode] = f;
        return inode;        return inode;
 } }
Line 62 
Line 95 
                 /* mode and flags are not handled */                 /* mode and flags are not handled */
        int h;        int h;
        int inode;        int inode;
       struct tvfs_fcb *handler;
   
       trace("tvfs_open called with %s, %d, %d\n", fname, flags, mode);
   
        /* Existing file? */        /* Existing file? */
        for (inode=0; inode<nfiles; inode++) {        for (inode=0; inode<nfiles; inode++) {
                if (!files[inode])                if (!files[inode])
                        continue;                        continue;
                if (!strcmp(files[inode]->fname, fname))                if (!strcmp(files[inode]->fname, fname))
                                                 break;       }              break;
       }
   
        if (inode == nfiles) {        if (inode == nfiles) {
                /* File did not exist */                /* File did not exist */
                if ((flags & O_CREAT) == 0) {                if ((flags & O_CREAT) == 0) {
                        /* ENOENT */                        /* ENOENT */
               trace("tvfs_open returning -1\n");
                        return -1;                        return -1;
                }                }
   
                inode = tvfs_create(fname, 0, 0);                inode = tvfs_create(fname, 0, 0);
        }        }
            struct tvfs_fcb *handler;  
            handler = malloc(sizeof(struct tvfs_fcb));            handler = malloc(sizeof(struct tvfs_fcb));
            handler->inode = inode;            handler->inode = inode;
            handler->pos=0;            handler->pos=0;
            h = nfiles++;      h = nhandles++;
            handles[h] = handler;            handles[h] = handler;
   
       trace("tvfs_open returning with %d\n", h);
   
            return h;            return h;
 } }
  
Line 91 
Line 135 
        int pos = handles[h]->pos;        int pos = handles[h]->pos;
            int size = files[inode]->bytes_used;            int size = files[inode]->bytes_used;
  
        /* FIXME: handle edge cases */      trace("tvfs_read called with %d, %d, %d\n", h, buf, len);
   
            /* Edge Case 1 : Request beyond boundary of file */            /* Edge Case 1 : Request beyond boundary of file */
            if (pos + len > size) {            if (pos + len > size) {
                    len = size-pos;                    len = size-pos;
Line 103 
Line 148 
        return len;        return len;
 } }
  
 void tvfs_free(){  void tvfs_free()
   {
         int inode;         int inode;
       int handle;
   
       trace("tvfs_free\n");
   
       nfiles=0;
       nhandles=0;
   
        for (inode=0; inode<nfiles; inode++) {        for (inode=0; inode<nfiles; inode++) {
                         if (!files[inode])                         if (!files[inode])
                                 continue;                                 continue;
                         free(files[inode]);                         free(files[inode]);
                 }                 }
   
       for (handle=0; handle<nhandles; handle++) {
           if (!handles[handle])
               continue;
           free(handles[handle]);
         }         }
  
   }
  
   /* Compare given file with given contents, return 0 on equal, else nonzero */
   int tvfs_compare(const char *fname, const char *buf, int len)
   {
   
       int inode;
   
       trace("tvfs_compare called with %s, %d, %d\n", fname, buf, len);
   
       for (inode=0; inode<nfiles; inode++) {
           if (!files[inode])
               continue;
           if (!strcmp(files[inode]->fname, fname))
           break;
       }
   
       if (inode == nfiles) {
           /* File did not exist */
           trace("tvfs_compare returning -1 (FAILURE)\n");
           return -1;
       }
   
       return (memcmp(files[inode]->buf,buf,len));
       /* does not check for out of bound */
   }
   
   long tvfs_lseek(int h, long whence, int whither )
   {
   
       int inode = handles[h]->inode;
       int size = files[inode]->bytes_used;
       trace("tvfs_lseek called with %d, %d, %d\n", h, whither, whence);
   
   /*  if (whence > size)
       whence = size;*/
   /*  Legit lseek does NOT do boundary checking */
   
       switch(whither) {
           case SEEK_SET: {
               handles[h]->pos = whence;
               break;
           }
           case SEEK_CUR: {
               handles[h]->pos += whence;
               break;
           }
           case SEEK_END: {
               handles[h]->pos = size+whence;
               break;
           }
           case 5: {
               handles[h]->pos = size+whence;
               break;
           }
           default:
           {
               trace("lseek was called with an invalid whither %d\n",whither);
               return -1;
           }
       }
       return handles[h]->pos;
     }
   
   int tvfs_close(int h)
   {
       int inode = handles[h]->inode;
       trace("tvfs_close called with %d\n", h);
       if (!files[inode]) {
           return -1;
       }
       free(handles[h]);
       /* Currently does NOT enabled open to reuse this handle */
       return 0;
   }
   
   unsigned int tvfs_write(int h, void *buf, unsigned int len)
   {
   
       int inode = handles[h]->inode;
       int pos = handles[h]->pos;
       trace("tvfs_write called with %d, %d, %d\n", h, buf, len);
       memcpy(files[inode]->buf+pos, buf, len);
       files[inode]->bytes_used += len;
       handles[h]->pos += len;
   
       return len;
       /* return -1 to simulate diskfull or some other error */
   }
   
   
   START_TEST(tvfs){
      printf("dummy!");
   }
  
  
 #ifdef TVFS_MAIN #ifdef TVFS_MAIN
 static char file_test_txt[] = "This is a test. Don't Panic!";  
 static int szfile_test_txt = sizeof(file_test_txt);  
  
 main(){  const static char name_test_txt[] = "test.txt";
   const static char file_test_txt[] = "This is a test. Don't Panic!";
   const static int size_test_txt = sizeof(file_test_txt);
   
   main()
   {
         int result;         int result;
         int active_handler;         int active_handler;
  
         char *filebuf;         char *filebuf;
  
         char test_filename[] = "test.txt";  
         char dummy_filename[] = "dummy.txt";         char dummy_filename[] = "dummy.txt";
         char bad_filename[] = "chicken.txt";         char bad_filename[] = "chicken.txt";
  
         filebuf = malloc(MAXFLEN);         filebuf = malloc(MAXFLEN);
  
         printf("Testing TVFS implementation, creating %s\n",test_filename);      trace("Testing TVFS implementation, creating %s\n",name_test_txt);
         result = tvfs_create( dummy_filename, file_test_txt, szfile_test_txt );      result = tvfs_create( dummy_filename, file_test_txt, size_test_txt);
         result = tvfs_create( test_filename, file_test_txt, szfile_test_txt );      result = tvfs_create( name_test_txt, file_test_txt,size_test_txt);
         printf("Created virtual file with inode %d\n",result);      trace("Created virtual file with inode %d\n",result);
  
         /* This test failes because strcmp returns 0 incorrectly! */      trace("Attempting to open non-existent file\n");
         printf("Attempting to open non-existant file\n");  
         result = tvfs_open(bad_filename, _O_BINARY, 0 );         result = tvfs_open(bad_filename, _O_BINARY, 0 );
         printf("Result code %d\n",result);      trace("Result code %d\n",result);
         printf("Attempting to open existant file\n");      trace("Attempting to open existent file\n");
         result = tvfs_open(test_filename, _O_BINARY, 0 );      result = tvfs_open(name_test_txt, _O_BINARY, 0 );
         printf("Result code %d\n",result);      trace("Result code %d\n",result);
  
         active_handler = result;         active_handler = result;
  
         memset (filebuf,0,MAXFLEN);         memset (filebuf,0,MAXFLEN);
  
         printf("Testing reading from file %s\n",test_filename);      trace("Testing reading from file %s\n",name_test_txt);
         result = tvfs_read(active_handler, filebuf, 9);         result = tvfs_read(active_handler, filebuf, 9);
         printf("Read _%s_\n", filebuf);      trace("Read _%s_\n", filebuf);
         if ( strcmp(filebuf,"This is a")) {      if ( strcmp(filebuf,"This is a"))
                 printf("File read check failed!\n");      trace("File read check failed!\n");
         }  
  
         printf("Testing sequential reading from file %s\n",test_filename);      trace("Testing sequential reading from file %s\n",name_test_txt);
         result = tvfs_read(active_handler, filebuf, 12);         result = tvfs_read(active_handler, filebuf, 12);
         printf("Read _%s_\n", filebuf);      trace("Read _%s_\n", filebuf);
         if ( strcmp(filebuf," test. Don't")) {      if ( strcmp(filebuf," test. Don't"))
                 printf("File read check failed!\n");      trace("File read check failed!\n");
         }  
       trace("Testing edge reading from file %s\n",name_test_txt);
         printf("Testing edge reading from file %s\n",test_filename);      result = tvfs_read(active_handler, filebuf, 42);
         result = tvfs_read(active_handler, filebuf, 20);      trace("Read %d bytes - _%s_\n", result, filebuf);
         printf("Read %d bytes - _%s_\n", result, filebuf);      if ( result != 8 )
         if ( result != 8 ) {      trace("File read check failed!\n");
                 printf("File read check failed!\n");  
         }      trace("Testing direct file compare and lseek of %s\n", name_test_txt);
       trace("Seeking to 0 (not needed) - ");
       tvfs_lseek( active_handler, SEEK_SET, 0);
       trace("Comparing file\n");
       result = tvfs_compare( name_test_txt , file_test_txt, size_test_txt);
       if (result)
       trace ("File compare failed!\n");
   
   
       trace("Closing %s\n",name_test_txt);
       tvfs_close(active_handler);
       if (result)
       trace ("File close failed!\n");
  
         tvfs_free();         tvfs_free();
         free(filebuf);         free(filebuf);


Legend:
Removed from v.1.2  
changed lines
  Added in v.1.12

Rizwan Kassim
Powered by
ViewCVS 0.9.2