Browse code

Fix bug in genname triggered when there were no '/' in filename. Add load/save unit test (test_newfile).

Dario Rodriguez authored on 07/03/2019 18:02:06
Showing 2 changed files
... ...
@@ -665,7 +665,7 @@ genname(char *filename,char *prefix, char *postfix, char *buf, int bufsize)
665 665
                         return(NULL);
666 666
                 name=buf;
667 667
         }
668
-        for(ptr=filename+strlen(filename);ptr>0 && ptr[-1]!='/';ptr--)
668
+        for(ptr=filename+strlen(filename);ptr>filename && ptr[-1]!='/';ptr--)
669 669
                 ;
670 670
         off=0;
671 671
         memcpy(name+off,filename,ptr-filename);
... ...
@@ -14,19 +14,102 @@
14 14
 #include <unistd.h>
15 15
 #include <string.h>
16 16
 #include <limits.h>
17
+#include <fcntl.h>
17 18
 
18 19
 #include "recenteditor_data.h"
19 20
 
21
+#define PREFIX "retest_"
22
+#define TEST_OK "OK"
23
+
24
+typedef struct test_t  {
25
+        char *name;
26
+        char *(*fn)(redata_t *,char *,char *, int, int);
27
+        char *param1;
28
+        char *param2;
29
+        int int1;
30
+        int int2;
31
+} test_t;
32
+
33
+char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);
34
+
20 35
 int
21 36
 main(int argc, char *argv[])
22 37
 {
38
+        test_t tests[]={
39
+                {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
40
+                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
41
+                {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
42
+                {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
43
+                {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
44
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
45
+
46
+        };
23 47
         redata_t *redata;
24
-        if((redata=redata_init())==NULL) {
25
-                fprintf(stderr,"ERROR: problem initializong redata module\n");
26
-                return(1);
48
+        int i;
49
+        int nerrors;
50
+        char *res;
51
+        for(i=0,nerrors=0;i<(sizeof(tests)/sizeof(tests[0]));i++) {
52
+                if((redata=redata_init())==NULL) {
53
+                        fprintf(stderr,"ERROR: problem initializing redata module\n");
54
+                        return(1);
55
+                }
56
+                fprintf(stderr,"%s...",tests[i].name);
57
+                res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
58
+                if(strcmp(res,TEST_OK)==0) {
59
+                        fprintf(stderr," ok.\n");
60
+                } else {
61
+                        fprintf(stderr," ERROR: %s\n",res);
62
+                        nerrors++;
63
+                }
64
+                redata_free(redata),redata=NULL;
27 65
         }
28
-#warning TODO
66
+        fprintf(stderr,"\n");
67
+        if(nerrors==0)
68
+                fprintf(stderr,"All tests passed OK\n");
69
+        else
70
+                fprintf(stderr,"%i tests failed of %i total tests.\n",nerrors,i);
29 71
         redata_free(redata),redata=NULL;
72
+        return((nerrors==0)?0:1);
30 73
 }
31 74
 
75
+char *
76
+test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
77
+{
78
+        char *mem;
79
+        char hash129_pre[129];
80
+        char hash129_post[129];
81
+        int fd,i;
82
+fprintf(stderr,"\ntest_newfile(%s%s%s,%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(dummy!=NULL)?dummy:"NULL",filesize,dummy2);
83
+        /* prepare file for loading */
84
+        if((mem=malloc(filesize))==NULL)
85
+                return("insuf. mem. for temp. buffer");
86
+        memset(mem,0,filesize);
87
+        for(i=0;i<filesize;i++)
88
+                ((unsigned char *)mem)[i]=(filesize%256);
89
+        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
90
+                free(mem),mem=NULL;
91
+                return("couldn't create temporary file");
92
+        }
93
+        write(fd,mem,filesize);
94
+        close(fd),fd=-1;
95
+        redata_filehash(redata,filename,hash129_pre);
96
+        free(mem),mem=NULL;
97
+        /* load file */
98
+        if(redata_load(redata,filename,0)!=0) {
99
+                unlink(filename);
100
+                return("couldn't load file");
101
+        }
102
+        unlink(filename);
103
+        redata_hash(redata,hash129_post);
104
+        if(strcmp(hash129_pre,hash129_post)!=0)
105
+                return("loaded file is corrupted");
106
+        /* save file */
107
+        redata_save(redata,filename);
108
+        hash129_post[0]='\0';
109
+        redata_filehash(redata,filename,hash129_post);
110
+        if(strcmp(hash129_pre,hash129_post)!=0)
111
+                return("saved file is corrupted");
112
+        unlink(filename);
113
+        return(TEST_OK);
114
+}
32 115