Browse code

Add del test

Dario Rodriguez authored on 15/03/2019 13:38:18
Showing 2 changed files
... ...
@@ -1096,7 +1096,7 @@ redata_data_compare(redata_t *redata, long cmppos, char *buf, long buflen)
1096 1096
         long compared;
1097 1097
         long n;
1098 1098
         int res;
1099
-        if(redata==NULL || pos<0 || buf==NULL || buflen<0
1099
+        if(redata==NULL || cmppos<0 || buf==NULL || buflen<0
1100 1100
           || cmppos>redata_getused(redata)
1101 1101
           || (cmppos+buflen)>redata_getused(redata))
1102 1102
                 return(-1); /* sanity check failed */
... ...
@@ -48,6 +48,7 @@ main(int argc, char *argv[])
48 48
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
49 49
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
50 50
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
51
+                {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
51 52
         };
52 53
         redata_t *redata;
53 54
         int i;
... ...
@@ -149,7 +150,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
149 150
         static char errorbuf[256];
150 151
         char progress[256];
151 152
         int k;
152
-        int cursize;
153
+        int cursize,maxsize;
153 154
         char *ptr;
154 155
         int l;
155 156
         char *mem;
... ...
@@ -162,7 +163,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
162 163
         mem=NULL;
163 164
 fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(edits!=NULL)?"\"":"",(edits!=NULL)?edits:"NULL",(edits!=NULL)?"\"":"",filesize,seed);
164 165
         /* two passes: k==0 count needed memory, k==1 do edits */
165
-        for(k=0,cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
166
+        for(k=0,maxsize=cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
166 167
                 for(ptr=edits;*ptr!='\0';) {
167 168
                         if(k!=0) {
168 169
                                 redata_memhash(redata,mem,cursize,hash129_memold);
... ...
@@ -196,6 +197,40 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
196 197
                                 cursize+=size;
197 198
                                 ptr+=size;
198 199
                                 ptr+=(*ptr!='\0')?1:0;
200
+                        } else if(*ptr=='D') {
201
+                                /* D<delpos><endchar><text><endchar> */
202
+                                ptr++;
203
+                                errno=0;
204
+                                l=(int)strtol(ptr,&ptr,10);
205
+                                if(errno!=0) {
206
+                                        if(mem!=NULL)
207
+                                                free(mem),mem=NULL;
208
+                                        return("test_edit(): error parsing position");
209
+                                }
210
+                                endcode=*ptr;
211
+                                ptr+=(*ptr!='\0')?1:0;
212
+                                ptrend=strchr(ptr,endcode);
213
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
214
+                                size=ptrend-ptr;
215
+                                if(l<0 || (l+size)>cursize) {
216
+                                        if(mem!=NULL)
217
+                                                free(mem),mem=NULL;
218
+                                        return("test_edit(): internal error: invalid pasition or size");
219
+                                }
220
+                                if(k!=0) {
221
+                                        if(memcmp(mem+l,ptr,size)!=0
222
+                                          || redata_data_compare(redata,l,ptr,size)!=0) {
223
+                                                if(mem!=NULL)
224
+                                                        free(mem),mem=NULL;
225
+                                                return("test_edit(): internal error: deletion data doesn't match");
226
+                                        }
227
+                                        /* editing */
228
+                                        memmove(mem+l,mem+l+size,cursize-l-size);
229
+                                        redata_op_del(redata,l,size,NULL);
230
+                                }
231
+                                cursize-=size;
232
+                                ptr+=size;
233
+                                ptr+=(*ptr!='\0')?1:0;
199 234
                         } else {
200 235
                                 if(mem!=NULL)
201 236
                                         free(mem),mem=NULL;
... ...
@@ -204,6 +239,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
204 239
                                 errorbuf[sizeof(errorbuf)-1]='\0';
205 240
                                 return(errorbuf);
206 241
                         }
242
+                        if(cursize>maxsize)
243
+                                maxsize=cursize;
207 244
                         if(k!=0) {
208 245
 /*if(k!=0) redata_save(redata,"test.post");*/
209 246
                                 redata_hash(redata,hash129_redata);
... ...
@@ -242,7 +279,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
242 279
                 }
243 280
                 if(k==0) {
244 281
                         /* reserve memory, do init */
245
-                        if((mem=malloc_data(cursize,seed))==NULL)
282
+                        if((mem=malloc_data(maxsize,seed))==NULL)
246 283
                                 return("insuf. mem. for temp. buffer");
247 284
                         if(write_file(filename,mem,filesize)==-1)
248 285
                                 return("couldn't create temporary file");