]> git.neil.brown.name Git - wiggle.git/commitdiff
Add valgrind testing of parts of vpatch.
authorNeilBrown <neilb@suse.de>
Thu, 14 Feb 2013 06:31:18 +0000 (17:31 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 14 Feb 2013 06:31:18 +0000 (17:31 +1100)
With --self-test, browsing a simple merge will simply
display at every line.
"make vtest" will run this for every merge in the test suite
and use valgrind to look for problems.

Signed-off-by: NeilBrown <neilb@suse.de>
Makefile
ReadMe.c
vpatch.c
wiggle.c
wiggle.h

index 212b13a88b91d203a652bcf6c15454ac6588475b..e5dbcfb351e8bff54cdfd38240dd78afe1ab2f31 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -29,6 +29,9 @@ test: wiggle dotest
 valgrind: wiggle dotest
        ./dotest valgrind
 
+vtest: wiggle dovtest
+       ./dovtest
+
 wiggle.man : wiggle.1
        nroff -man wiggle.1 > wiggle.man
 
index fec16e49b6c1d2cd2326909dae81ce43455b9318..443011736f90be3b048f7cc30614157f08df7f07 100644 (file)
--- a/ReadMe.c
+++ b/ReadMe.c
@@ -50,6 +50,7 @@ struct option long_options[] = {
        {"strip",       1, 0, 'p'},
        {"no-ignore",   0, 0, 'i'},
        {"show-wiggle", 0, 0, 'W'},
+       {"self-test",   0, 0, SELF_TEST},
        {0, 0, 0, 0}
 };
 
index 03fe0f8509af587e2a2f38e3cd63d971bb62b0af..3a30be30f63d311517266e950d7f136b01df025c 100644 (file)
--- a/vpatch.c
+++ b/vpatch.c
@@ -45,7 +45,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 
-static void term_init(void);
+static void term_init(int raw);
+
+static int intr_kills = 0;
 
 /* global attributes */
 unsigned int a_delete, a_added, a_common, a_sep, a_void,
@@ -1241,7 +1243,8 @@ static char *save_query[] = {
        NULL
 };
 
-static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
+static int merge_window(struct plist *p, FILE *f, int reverse, int replace,
+                       int selftest)
 {
        /* Display the merge window in one of the selectable modes,
         * starting with the 'merge' mode.
@@ -1317,6 +1320,11 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
                unsigned int searchlen;
        } *anchor = NULL;
 
+       if (selftest) {
+               intr_kills = 1;
+               selftest = 1;
+       }
+
        if (f == NULL) {
                if (!p->is_merge) {
                        /* three separate files */
@@ -1355,7 +1363,7 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
                free(sm.body);
                free(sb.body);
                free(sa.body);
-               term_init();
+               term_init(1);
                if (!sm.body)
                        help_window(help_missing, NULL, 0);
                else
@@ -1376,7 +1384,7 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
 
        ci = make_merger(fm, fb, fa, csl1, csl2, 0, 1, 0);
 
-       term_init();
+       term_init(!selftest);
 
        row = 1;
        pos.p.m = 0; /* merge node */
@@ -1650,7 +1658,14 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
                        move(row, curs.col-start + (cols-1)/2+2);
                else
                        move(row, curs.col-start+1);
-               c = getch();
+               switch (selftest) {
+               case 0:
+                       c = getch(); break;
+               case 1:
+                       c = 'n'; break;
+               case 2:
+                       c = 'q'; break;
+               }
                tmeta = meta; meta = 0;
                tnum = num; num = -1;
                tvpos = vpos; vpos = pos;
@@ -1838,9 +1853,11 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
                case ' ':
                case 'V'-64: /* page down */
                        pos = botpos;
-                       if (botrow <= lastrow)
+                       if (botrow <= lastrow) {
                                row = botrow;
-                       else
+                               if (selftest == 1)
+                                       selftest = 2;
+                       } else
                                row = 2;
                        refresh = 1;
                        break;
@@ -1914,8 +1931,11 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
                                if (ci.merger[tpos.p.m].type != End) {
                                        pos = tpos;
                                        row++;
-                               } else
+                               } else {
+                                       if (selftest == 1)
+                                               selftest = 2;
                                        break;
+                               }
                        }
                        break;
                case 'N':
@@ -2213,7 +2233,7 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
 
 static int show_merge(char *origname, FILE *patch, int reverse,
                      int is_merge, char *before, char *after,
-                     int replace)
+                     int replace, int selftest)
 {
        struct plist p;
 
@@ -2230,7 +2250,7 @@ static int show_merge(char *origname, FILE *patch, int reverse,
        p.after = after;
 
        freopen("/dev/null","w",stderr);
-       return merge_window(&p, patch, reverse, replace);
+       return merge_window(&p, patch, reverse, replace, selftest);
 }
 
 static void calc_one(struct plist *pl, FILE *f, int reverse)
@@ -2519,7 +2539,7 @@ static void main_window(struct plist *pl, int *np, FILE *f, int reverse,
        MEVENT mevent;
 
        freopen("/dev/null","w",stderr);
-       term_init();
+       term_init(1);
        pl = sort_patches(pl, np);
 
        while (1) {
@@ -2639,9 +2659,9 @@ static void main_window(struct plist *pl, int *np, FILE *f, int reverse,
                        } else {
                                int c;
                                if (pl[pos].is_merge)
-                                       c = merge_window(&pl[pos], NULL, reverse, 0);
+                                       c = merge_window(&pl[pos], NULL, reverse, 0, 0);
                                else
-                                       c = merge_window(&pl[pos], f, reverse, 0);
+                                       c = merge_window(&pl[pos], f, reverse, 0, 0);
                                refresh = 2;
                                if (c) {
                                        pl[pos].is_merge = 1;
@@ -2778,7 +2798,7 @@ static void main_window(struct plist *pl, int *np, FILE *f, int reverse,
 
 static void catch(int sig)
 {
-       if (sig == SIGINT) {
+       if (sig == SIGINT && !intr_kills) {
                signal(sig, catch);
                return;
        }
@@ -2794,7 +2814,7 @@ static void catch(int sig)
                signal(sig, NULL);
 }
 
-static void term_init(void)
+static void term_init(int doraw)
 {
 
        static int init_done = 0;
@@ -2809,7 +2829,12 @@ static void term_init(void)
        signal(SIGBUS, catch);
        signal(SIGSEGV, catch);
 
-       initscr(); raw(); noecho();
+       initscr();
+       if (doraw)
+               raw();
+       else
+               cbreak();
+       noecho();
        start_color();
        use_default_colors();
        if (!has_colors()) {
@@ -2849,7 +2874,7 @@ static void term_init(void)
 }
 
 int vpatch(int argc, char *argv[], int patch, int strip,
-          int reverse, int replace)
+          int reverse, int replace, int selftest)
 {
        /* NOTE argv[0] is first arg...
         * Behaviour depends on number of args:
@@ -2923,10 +2948,10 @@ int vpatch(int argc, char *argv[], int patch, int strip,
                        char *origname = strdup(argv[0]);
                        origname[strlen(origname) - 4] = '\0';
                        show_merge(origname, f, reverse, 0, NULL, NULL,
-                                  replace);
+                                  replace, selftest);
                } else
                        show_merge(argv[0], f, reverse, 1, NULL, NULL,
-                                  replace);
+                                  replace, selftest);
 
                break;
        case 2: /* an orig and a diff/.ref */
@@ -2936,11 +2961,11 @@ int vpatch(int argc, char *argv[], int patch, int strip,
                        exit(1);
                }
                show_merge(argv[0], f, reverse, 0, NULL, NULL,
-                          replace);
+                          replace, selftest);
                break;
        case 3: /* orig, before, after */
                show_merge(argv[0], NULL, reverse, 1, argv[1], argv[2],
-                          replace);
+                          replace, selftest);
                break;
        }
 
index 1b7619141779b26def1da1451cfefa15880516f8..3648249f005c4b6cac45b95e37a3497def4d2252 100644 (file)
--- a/wiggle.c
+++ b/wiggle.c
@@ -650,6 +650,7 @@ int main(int argc, char *argv[])
        int show_wiggles = 0;
        char *helpmsg;
        char *trace;
+       int selftest = 0;
 
        trace = getenv("WIGGLE_TRACE");
        if (trace && *trace)
@@ -748,13 +749,17 @@ int main(int argc, char *argv[])
                case 'q':
                        quiet = 1;
                        continue;
+
+               case SELF_TEST:
+                       selftest = 1;
+                       continue;
                }
        if (!mode)
                mode = 'm';
 
        if (mode == 'B') {
                vpatch(argc-optind, argv+optind, ispatch,
-                      strip, reverse, replace);
+                      strip, reverse, replace, selftest);
                /* should not return */
                exit(1);
        }
index 439b5004ad860fd0ba76d0e909ce1c6bf30baac0..6541a27a86d16247e05634939a9a2c8f06d02ce9 100644 (file)
--- a/wiggle.h
+++ b/wiggle.h
@@ -187,12 +187,15 @@ extern void *xmalloc(int len);
 extern int do_trace;
 
 extern int vpatch(int argc, char *argv[], int patch, int strip,
-                 int reverse, int replace);
+                 int reverse, int replace, int selftest);
 
 extern char *Cmd;
 extern char Version[];
 extern char short_options[];
 extern struct option long_options[];
+enum other_options {
+       SELF_TEST = 300,
+};
 extern char Usage[];
 extern char Help[];
 extern char HelpExtract[];