xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/futex/include/logging.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *   Copyright © International Business Machines  Corp., 2009
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * DESCRIPTION
7*4882a593Smuzhiyun  *      Glibc independent futex library for testing kernel functionality.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * AUTHOR
10*4882a593Smuzhiyun  *      Darren Hart <dvhart@linux.intel.com>
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * HISTORY
13*4882a593Smuzhiyun  *      2009-Nov-6: Initial version by Darren Hart <dvhart@linux.intel.com>
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *****************************************************************************/
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef _LOGGING_H
18*4882a593Smuzhiyun #define _LOGGING_H
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <stdio.h>
21*4882a593Smuzhiyun #include <string.h>
22*4882a593Smuzhiyun #include <unistd.h>
23*4882a593Smuzhiyun #include <linux/futex.h>
24*4882a593Smuzhiyun #include "kselftest.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun  * Define PASS, ERROR, and FAIL strings with and without color escape
28*4882a593Smuzhiyun  * sequences, default to no color.
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun #define ESC 0x1B, '['
31*4882a593Smuzhiyun #define BRIGHT '1'
32*4882a593Smuzhiyun #define GREEN '3', '2'
33*4882a593Smuzhiyun #define YELLOW '3', '3'
34*4882a593Smuzhiyun #define RED '3', '1'
35*4882a593Smuzhiyun #define ESCEND 'm'
36*4882a593Smuzhiyun #define BRIGHT_GREEN ESC, BRIGHT, ';', GREEN, ESCEND
37*4882a593Smuzhiyun #define BRIGHT_YELLOW ESC, BRIGHT, ';', YELLOW, ESCEND
38*4882a593Smuzhiyun #define BRIGHT_RED ESC, BRIGHT, ';', RED, ESCEND
39*4882a593Smuzhiyun #define RESET_COLOR ESC, '0', 'm'
40*4882a593Smuzhiyun static const char PASS_COLOR[] = {BRIGHT_GREEN, ' ', 'P', 'A', 'S', 'S',
41*4882a593Smuzhiyun 				  RESET_COLOR, 0};
42*4882a593Smuzhiyun static const char ERROR_COLOR[] = {BRIGHT_YELLOW, 'E', 'R', 'R', 'O', 'R',
43*4882a593Smuzhiyun 				   RESET_COLOR, 0};
44*4882a593Smuzhiyun static const char FAIL_COLOR[] = {BRIGHT_RED, ' ', 'F', 'A', 'I', 'L',
45*4882a593Smuzhiyun 				  RESET_COLOR, 0};
46*4882a593Smuzhiyun static const char INFO_NORMAL[] = " INFO";
47*4882a593Smuzhiyun static const char PASS_NORMAL[] = " PASS";
48*4882a593Smuzhiyun static const char ERROR_NORMAL[] = "ERROR";
49*4882a593Smuzhiyun static const char FAIL_NORMAL[] = " FAIL";
50*4882a593Smuzhiyun const char *INFO = INFO_NORMAL;
51*4882a593Smuzhiyun const char *PASS = PASS_NORMAL;
52*4882a593Smuzhiyun const char *ERROR = ERROR_NORMAL;
53*4882a593Smuzhiyun const char *FAIL = FAIL_NORMAL;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /* Verbosity setting for INFO messages */
56*4882a593Smuzhiyun #define VQUIET    0
57*4882a593Smuzhiyun #define VCRITICAL 1
58*4882a593Smuzhiyun #define VINFO     2
59*4882a593Smuzhiyun #define VMAX      VINFO
60*4882a593Smuzhiyun int _verbose = VCRITICAL;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* Functional test return codes */
63*4882a593Smuzhiyun #define RET_PASS   0
64*4882a593Smuzhiyun #define RET_ERROR -1
65*4882a593Smuzhiyun #define RET_FAIL  -2
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /**
68*4882a593Smuzhiyun  * log_color() - Use colored output for PASS, ERROR, and FAIL strings
69*4882a593Smuzhiyun  * @use_color:	use color (1) or not (0)
70*4882a593Smuzhiyun  */
log_color(int use_color)71*4882a593Smuzhiyun void log_color(int use_color)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	if (use_color) {
74*4882a593Smuzhiyun 		PASS = PASS_COLOR;
75*4882a593Smuzhiyun 		ERROR = ERROR_COLOR;
76*4882a593Smuzhiyun 		FAIL = FAIL_COLOR;
77*4882a593Smuzhiyun 	} else {
78*4882a593Smuzhiyun 		PASS = PASS_NORMAL;
79*4882a593Smuzhiyun 		ERROR = ERROR_NORMAL;
80*4882a593Smuzhiyun 		FAIL = FAIL_NORMAL;
81*4882a593Smuzhiyun 	}
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /**
85*4882a593Smuzhiyun  * log_verbosity() - Set verbosity of test output
86*4882a593Smuzhiyun  * @verbose:	Enable (1) verbose output or not (0)
87*4882a593Smuzhiyun  *
88*4882a593Smuzhiyun  * Currently setting verbose=1 will enable INFO messages and 0 will disable
89*4882a593Smuzhiyun  * them. FAIL and ERROR messages are always displayed.
90*4882a593Smuzhiyun  */
log_verbosity(int level)91*4882a593Smuzhiyun void log_verbosity(int level)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	if (level > VMAX)
94*4882a593Smuzhiyun 		level = VMAX;
95*4882a593Smuzhiyun 	else if (level < 0)
96*4882a593Smuzhiyun 		level = 0;
97*4882a593Smuzhiyun 	_verbose = level;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /**
101*4882a593Smuzhiyun  * print_result() - Print standard PASS | ERROR | FAIL results
102*4882a593Smuzhiyun  * @ret:	the return value to be considered: 0 | RET_ERROR | RET_FAIL
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * print_result() is primarily intended for functional tests.
105*4882a593Smuzhiyun  */
print_result(const char * test_name,int ret)106*4882a593Smuzhiyun void print_result(const char *test_name, int ret)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	switch (ret) {
109*4882a593Smuzhiyun 	case RET_PASS:
110*4882a593Smuzhiyun 		ksft_test_result_pass("%s\n", test_name);
111*4882a593Smuzhiyun 		ksft_print_cnts();
112*4882a593Smuzhiyun 		return;
113*4882a593Smuzhiyun 	case RET_ERROR:
114*4882a593Smuzhiyun 		ksft_test_result_error("%s\n", test_name);
115*4882a593Smuzhiyun 		ksft_print_cnts();
116*4882a593Smuzhiyun 		return;
117*4882a593Smuzhiyun 	case RET_FAIL:
118*4882a593Smuzhiyun 		ksft_test_result_fail("%s\n", test_name);
119*4882a593Smuzhiyun 		ksft_print_cnts();
120*4882a593Smuzhiyun 		return;
121*4882a593Smuzhiyun 	}
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /* log level macros */
125*4882a593Smuzhiyun #define info(message, vargs...) \
126*4882a593Smuzhiyun do { \
127*4882a593Smuzhiyun 	if (_verbose >= VINFO) \
128*4882a593Smuzhiyun 		fprintf(stderr, "\t%s: "message, INFO, ##vargs); \
129*4882a593Smuzhiyun } while (0)
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define error(message, err, args...) \
132*4882a593Smuzhiyun do { \
133*4882a593Smuzhiyun 	if (_verbose >= VCRITICAL) {\
134*4882a593Smuzhiyun 		if (err) \
135*4882a593Smuzhiyun 			fprintf(stderr, "\t%s: %s: "message, \
136*4882a593Smuzhiyun 				ERROR, strerror(err), ##args); \
137*4882a593Smuzhiyun 		else \
138*4882a593Smuzhiyun 			fprintf(stderr, "\t%s: "message, ERROR, ##args); \
139*4882a593Smuzhiyun 	} \
140*4882a593Smuzhiyun } while (0)
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define fail(message, args...) \
143*4882a593Smuzhiyun do { \
144*4882a593Smuzhiyun 	if (_verbose >= VCRITICAL) \
145*4882a593Smuzhiyun 		fprintf(stderr, "\t%s: "message, FAIL, ##args); \
146*4882a593Smuzhiyun } while (0)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #endif
149