149 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/******************************************************************************3 *4 * Copyright © International Business Machines Corp., 20095 *6 * DESCRIPTION7 * Glibc independent futex library for testing kernel functionality.8 *9 * AUTHOR10 * Darren Hart <dvhart@linux.intel.com>11 *12 * HISTORY13 * 2009-Nov-6: Initial version by Darren Hart <dvhart@linux.intel.com>14 *15 *****************************************************************************/16 17#ifndef _LOGGING_H18#define _LOGGING_H19 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 escape28 * 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, ESCEND37#define BRIGHT_YELLOW ESC, BRIGHT, ';', YELLOW, ESCEND38#define BRIGHT_RED ESC, BRIGHT, ';', RED, ESCEND39#define RESET_COLOR ESC, '0', 'm'40static const char PASS_COLOR[] = {BRIGHT_GREEN, ' ', 'P', 'A', 'S', 'S',41 RESET_COLOR, 0};42static const char ERROR_COLOR[] = {BRIGHT_YELLOW, 'E', 'R', 'R', 'O', 'R',43 RESET_COLOR, 0};44static const char FAIL_COLOR[] = {BRIGHT_RED, ' ', 'F', 'A', 'I', 'L',45 RESET_COLOR, 0};46static const char INFO_NORMAL[] = " INFO";47static const char PASS_NORMAL[] = " PASS";48static const char ERROR_NORMAL[] = "ERROR";49static const char FAIL_NORMAL[] = " FAIL";50const char *INFO = INFO_NORMAL;51const char *PASS = PASS_NORMAL;52const char *ERROR = ERROR_NORMAL;53const char *FAIL = FAIL_NORMAL;54 55/* Verbosity setting for INFO messages */56#define VQUIET 057#define VCRITICAL 158#define VINFO 259#define VMAX VINFO60int _verbose = VCRITICAL;61 62/* Functional test return codes */63#define RET_PASS 064#define RET_ERROR -165#define RET_FAIL -266 67/**68 * log_color() - Use colored output for PASS, ERROR, and FAIL strings69 * @use_color: use color (1) or not (0)70 */71void 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 output86 * @verbose: Enable (1) verbose output or not (0)87 *88 * Currently setting verbose=1 will enable INFO messages and 0 will disable89 * them. FAIL and ERROR messages are always displayed.90 */91void 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 results102 * @ret: the return value to be considered: 0 | RET_ERROR | RET_FAIL103 *104 * print_result() is primarily intended for functional tests.105 */106void 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...) \126do { \127 if (_verbose >= VINFO) \128 fprintf(stderr, "\t%s: "message, INFO, ##vargs); \129} while (0)130 131#define error(message, err, args...) \132do { \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...) \143do { \144 if (_verbose >= VCRITICAL) \145 fprintf(stderr, "\t%s: "message, FAIL, ##args); \146} while (0)147 148#endif149