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