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