1 /*
2  * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3  */
4 
5 #include "cut.h"
6 
7 struct cut_runtime cut;
8 
filter(int argc,char ** argv)9 static void filter(int argc, char** argv)
10 {
11     int i = 0;
12     struct cut_case *c = NULL;
13     if(argc==2 && 0==strcmp(argv[1], "all"))
14         return;
15 
16     for (i = 0; i < cut.ccnt_total; i++) {
17         c = cut.clist[i];
18         if ((argc==2 && (NULL==strstr(c->sname, argv[1]))) ||
19             (argc==3 && (NULL==strstr(c->sname, argv[1]) || NULL==strstr(c->cname, argv[2])))) {
20             cut.clist[i]->skip = 1;
21             cut.ccnt_skip++;
22         }
23     }
24 }
25 
usage(const char * me)26 static void usage(const char* me)
27 {
28     cut_printf("Usage: %s [OPTION] [SUITE] [CASE]\r\n\r\n" \
29     "OPTION:\r\n" \
30     "  --help  : print this help\r\n" \
31     "  --list  : list cases\r\n" \
32     "  --count : print case count\r\n" \
33     "    SUITE : suite name filter, e.g. '%s all' means run all suites\r\n" \
34     "    CASE  : case name filter\r\n", me, me);
35 }
36 
parse_arg(int argc,char ** argv)37 static int parse_arg(int argc, char** argv)
38 {
39     if (argc >= 2) {
40         if (0 == strcmp(argv[1], "--list")) {
41             int i = 0;
42             int cnt = 0;
43             cut_printf("\33[1;34mCASE_LIST_BEGIN\33[0m\r\n");
44             for(i=0; i<cut.ccnt_total; i++) {
45                 struct cut_case *c = cut.clist[i];
46                 if(argc==2 ||
47                   (argc==3 && 0==strcmp(argv[2], "all")) ||
48                   (argc==3 && NULL!=strstr(c->sname, argv[2])) ||
49                   (argc==4 && NULL!=strstr(c->sname, argv[2]) && NULL!=strstr(c->cname, argv[3])))
50                     cut_printf("\33[1;34m[%02d] %s.%s\33[0m\r\n", ++cnt, c->sname, c->cname);
51             }
52             cut_printf("\33[1;34mCASE_LIST_END\33[0m\r\n");
53             return 0;
54         }
55         if (0 == strcmp(argv[1], "--count")) {
56             cut_printf("total %d case(s).\r\n", cut.ccnt_total);
57             return 0;
58         }
59         if (0 == strcmp(argv[1], "--help")) {
60             usage(argv[0]);
61             return 0;
62         }
63     }
64     return 1;
65 }
66 
cut_result_report(struct cut_runtime * cut)67 static void cut_result_report(struct cut_runtime *cut)
68 {
69     int i = 0;
70 
71     /* print test result locally */
72     cut_printf("===========================================================================\r\n");
73     if (cut->ccnt_fail > 0) {
74         cut_printf("FAIL LIST:\r\n");
75         for (i = 0; i < cut->ccnt_fail; i++) {
76             cut_printf("  [%02d] %s\r\n", i + 1, cut->cerrmsg[i]);
77             cut_free(cut->cerrmsg[i]);
78         }
79         cut_printf("---------------------------------------------------------------------------\r\n");
80     }
81     cut_printf("SUMMARY:\r\n" \
82                "     TOTAL:    %d\r\n" \
83                "   SKIPPED:    %d\r\n" \
84                "   MATCHED:    %d\r\n" \
85                "      PASS:    %d\r\n" \
86                "    FAILED:    %d\r\n", cut->ccnt_total, cut->ccnt_skip,
87                cut->ccnt_total-cut->ccnt_skip, cut->ccnt_pass, cut->ccnt_fail);
88     cut_printf("===========================================================================\r\n");
89 }
90 
91 
cut_main(int argc,char ** argv)92 int cut_main(int argc, char** argv)
93 {
94     int i = 0, cnt = 0;
95     char *_argv[2] = {"None", "--list"};
96 
97     cut.ccnt_pass = 0;
98     cut.ccnt_fail = 0;
99     cut.ccnt_skip = 0;
100     for(i=0; i<cut.ccnt_total; i++) {
101         cut.clist[i]->skip = 0;
102         cut.clist[i]->flag = 1;
103     }
104 
105     if (0 == parse_arg(argc, argv))
106         return 0;
107 
108     parse_arg(2, _argv);
109 
110     filter(argc, argv);
111 
112     for(i=0; i < cut.ccnt_total; i++) {
113         cut.ccur = cut.clist[i];
114         if (cut.ccur->skip)
115             continue;
116 
117         cut_printf("\33[1;33mTEST [%d/%d] %s.%s...\33[0m\r\n",
118                     ++cnt, cut.ccnt_total-cut.ccnt_skip, cut.ccur->sname, cut.ccur->cname);
119         if (cut.ccur->setup)
120             cut.ccur->setup(cut.ccur->data);
121         cut.ccur->run((struct cut_case *)(cut.ccur->data));
122         if (cut.ccur->teardown)
123             cut.ccur->teardown(cut.ccur->data);
124         if (cut.ccur->flag) {
125             cut_printf("\33[1;32m[OK]\33[0m\r\n\r\n");
126             cut.ccnt_pass++;
127         }
128         else {
129             cut_printf("\33[1;31m[FAIL]: %s\33[0m\r\n\r\n", cut.cerrmsg[cut.ccnt_fail]);
130             cut.ccnt_fail++;
131         }
132     }
133     cut_result_report(&cut);
134     return cut.ccnt_fail;
135 }
136 
137