Added yaz_log_trunc() to truncate the log file
[yaz-moved-to-github.git] / src / test.c
1 /*
2  * Copyright (C) 1995-2005, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: test.c,v 1.8 2006-07-06 13:10:31 heikki Exp $
6  */
7
8 /** \file test.c
9     \brief Unit Test for YAZ
10 */
11
12 #if HAVE_CONFIG_H
13 #include <config.h>
14 #endif
15
16 #include <stdio.h>
17 #include <string.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20
21 #include <yaz/test.h>
22 #include <yaz/log.h>
23
24 static FILE *test_fout = 0; /* can't use '= stdout' on some systems */
25 static int test_total = 0;
26 static int test_failed = 0;
27 static int test_verbose = 1;
28 static char *test_prog = 0;
29 static int log_tests = 0; 
30
31 static FILE *get_file()
32 {
33     if (test_fout)
34         return test_fout;
35     return stdout;
36 }
37
38 static char *progname(char *argv0)
39 {
40     char *cp = strrchr(argv0, '/');
41     if (cp)
42         return cp+1;
43     cp = strrchr(argv0, '\\');
44     if (cp)
45         return cp+1;
46     return argv0;
47 }
48
49 void yaz_check_init1(int *argc_p, char ***argv_p)
50 {
51     int i = 0;
52     int argc = *argc_p;
53     char **argv = *argv_p;
54
55     test_prog = progname(argv[0]);
56
57     for (i = 1; i<argc; i++)
58     {
59         if (strlen(argv[i]) >= 7 && !memcmp(argv[i], "--test-", 7))
60         {
61             const char *suf = argv[i]+7;
62             if (i < argc-1 && !strcmp(suf, "file"))
63             {
64                 i++;
65                 if (test_fout)
66                     fclose(test_fout);
67                 test_fout = fopen(argv[i], "w");
68                 continue;
69             }
70             else if (i < argc-1 && !strcmp(suf, "verbose"))
71             {
72                 i++;
73                 test_verbose = atoi(argv[i]);
74                 continue;
75             }
76             else if (!strcmp(suf, "help"))
77             {
78                 fprintf(stderr, 
79                         "--test-help           help\n"
80                         "--test-file fname     output to fname\n"
81                         "--test-verbose level  verbose level\n"
82                         "       0=Quiet. Only exit code tells what's wrong\n"
83                         "       1=Report+Summary only if tests fail.\n"
84                         "       2=Report failures. Print summary always\n"
85                         "       3=Report + summary always\n"
86                         "       4=Report + summary + extra prints from tests\n"
87                     );
88                 exit(0);
89             }
90             else
91             {
92                 fprintf(stderr, "Unrecognized option for YAZ test: %s\n",
93                         argv[i]);
94                 fprintf(stderr, "Use --test-help for more info\n");
95                 exit(1);
96             }
97             
98         }
99         break;
100     }
101     /* remove --test- options from argc, argv so that they disappear */
102     (*argv_p)[i-1] = **argv_p;  /* program name */
103     --i;
104     *argc_p -= i;
105     *argv_p += i;
106 }
107
108 /** \brief  Initialize the log system */
109 void yaz_check_init_log(char *argv0)
110 {
111     char logfilename[2048];
112     log_tests = 1; 
113     sprintf(logfilename,"%s.log", progname(argv0) );
114     unlink(logfilename);
115     yaz_log_init_file(logfilename);
116     yaz_log_trunc();
117
118 }
119
120 void yaz_check_term1(void)
121 {
122     /* summary */
123     if (test_failed)
124     {
125         if (test_verbose >= 1)
126             fprintf(get_file(), "%d out of %d tests failed for program %s\n",
127                     test_failed, test_total, test_prog);
128     }
129     else
130     {
131         if (test_verbose >= 2)
132             fprintf(get_file(), "%d tests passed for program %s\n",
133                     test_total, test_prog);
134     }
135     if (test_fout)
136         fclose(test_fout);
137     if (test_failed)
138         exit(1);
139     exit(0);
140 }
141
142 void yaz_check_eq1(int type, const char *file, int line,
143                    const char *left, const char *right, int lval, int rval)
144 {
145     char formstr[2048];
146     
147     if (type==YAZ_TEST_TYPE_OK) 
148         sprintf(formstr, "%.500s == %.500s ", left, right);
149     else
150         sprintf(formstr, "%.500s != %.500s\n %d != %d", left, right, lval,rval);
151     yaz_check_print1(type, file, line, formstr);
152 }
153
154 void yaz_check_print1(int type, const char *file, int line, 
155                       const char *expr)
156 {
157     const char *msg = "unknown";
158     int printit=1;
159
160     test_total++;
161     switch(type)
162     {
163     case YAZ_TEST_TYPE_FAIL:
164         test_failed++;
165         msg = "FAILED";
166         if (test_verbose < 1)
167             printit=0;
168         break;
169     case YAZ_TEST_TYPE_OK:
170         msg = "ok";
171         if (test_verbose < 3)
172             printit=0;
173         break;
174     }
175     if (printit) {
176         fprintf(get_file(), "%s:%d %s: ", file, line, msg);
177         fprintf(get_file(), "%s\n", expr);
178     }
179     if (log_tests) {
180         yaz_log(YLOG_LOG, "%s:%d %s: ", file, line, msg);
181         yaz_log(YLOG_LOG, "%s\n", expr);
182     }
183 }
184
185
186 int yaz_test_get_verbosity(){
187     return test_verbose;
188 }
189
190 /*
191  * Local variables:
192  * c-basic-offset: 4
193  * indent-tabs-mode: nil
194  * End:
195  * vim: shiftwidth=4 tabstop=8 expandtab
196  */
197