162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright © International Business Machines Corp., 2009 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * DESCRIPTION 762306a36Sopenharmony_ci * Glibc independent futex library for testing kernel functionality. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * AUTHOR 1062306a36Sopenharmony_ci * Darren Hart <dvhart@linux.intel.com> 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * HISTORY 1362306a36Sopenharmony_ci * 2009-Nov-6: Initial version by Darren Hart <dvhart@linux.intel.com> 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci *****************************************************************************/ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef _LOGGING_H 1862306a36Sopenharmony_ci#define _LOGGING_H 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <stdio.h> 2162306a36Sopenharmony_ci#include <string.h> 2262306a36Sopenharmony_ci#include <unistd.h> 2362306a36Sopenharmony_ci#include <linux/futex.h> 2462306a36Sopenharmony_ci#include "kselftest.h" 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* 2762306a36Sopenharmony_ci * Define PASS, ERROR, and FAIL strings with and without color escape 2862306a36Sopenharmony_ci * sequences, default to no color. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci#define ESC 0x1B, '[' 3162306a36Sopenharmony_ci#define BRIGHT '1' 3262306a36Sopenharmony_ci#define GREEN '3', '2' 3362306a36Sopenharmony_ci#define YELLOW '3', '3' 3462306a36Sopenharmony_ci#define RED '3', '1' 3562306a36Sopenharmony_ci#define ESCEND 'm' 3662306a36Sopenharmony_ci#define BRIGHT_GREEN ESC, BRIGHT, ';', GREEN, ESCEND 3762306a36Sopenharmony_ci#define BRIGHT_YELLOW ESC, BRIGHT, ';', YELLOW, ESCEND 3862306a36Sopenharmony_ci#define BRIGHT_RED ESC, BRIGHT, ';', RED, ESCEND 3962306a36Sopenharmony_ci#define RESET_COLOR ESC, '0', 'm' 4062306a36Sopenharmony_cistatic const char PASS_COLOR[] = {BRIGHT_GREEN, ' ', 'P', 'A', 'S', 'S', 4162306a36Sopenharmony_ci RESET_COLOR, 0}; 4262306a36Sopenharmony_cistatic const char ERROR_COLOR[] = {BRIGHT_YELLOW, 'E', 'R', 'R', 'O', 'R', 4362306a36Sopenharmony_ci RESET_COLOR, 0}; 4462306a36Sopenharmony_cistatic const char FAIL_COLOR[] = {BRIGHT_RED, ' ', 'F', 'A', 'I', 'L', 4562306a36Sopenharmony_ci RESET_COLOR, 0}; 4662306a36Sopenharmony_cistatic const char INFO_NORMAL[] = " INFO"; 4762306a36Sopenharmony_cistatic const char PASS_NORMAL[] = " PASS"; 4862306a36Sopenharmony_cistatic const char ERROR_NORMAL[] = "ERROR"; 4962306a36Sopenharmony_cistatic const char FAIL_NORMAL[] = " FAIL"; 5062306a36Sopenharmony_ciconst char *INFO = INFO_NORMAL; 5162306a36Sopenharmony_ciconst char *PASS = PASS_NORMAL; 5262306a36Sopenharmony_ciconst char *ERROR = ERROR_NORMAL; 5362306a36Sopenharmony_ciconst char *FAIL = FAIL_NORMAL; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* Verbosity setting for INFO messages */ 5662306a36Sopenharmony_ci#define VQUIET 0 5762306a36Sopenharmony_ci#define VCRITICAL 1 5862306a36Sopenharmony_ci#define VINFO 2 5962306a36Sopenharmony_ci#define VMAX VINFO 6062306a36Sopenharmony_ciint _verbose = VCRITICAL; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* Functional test return codes */ 6362306a36Sopenharmony_ci#define RET_PASS 0 6462306a36Sopenharmony_ci#define RET_ERROR -1 6562306a36Sopenharmony_ci#define RET_FAIL -2 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/** 6862306a36Sopenharmony_ci * log_color() - Use colored output for PASS, ERROR, and FAIL strings 6962306a36Sopenharmony_ci * @use_color: use color (1) or not (0) 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_civoid log_color(int use_color) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci if (use_color) { 7462306a36Sopenharmony_ci PASS = PASS_COLOR; 7562306a36Sopenharmony_ci ERROR = ERROR_COLOR; 7662306a36Sopenharmony_ci FAIL = FAIL_COLOR; 7762306a36Sopenharmony_ci } else { 7862306a36Sopenharmony_ci PASS = PASS_NORMAL; 7962306a36Sopenharmony_ci ERROR = ERROR_NORMAL; 8062306a36Sopenharmony_ci FAIL = FAIL_NORMAL; 8162306a36Sopenharmony_ci } 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/** 8562306a36Sopenharmony_ci * log_verbosity() - Set verbosity of test output 8662306a36Sopenharmony_ci * @verbose: Enable (1) verbose output or not (0) 8762306a36Sopenharmony_ci * 8862306a36Sopenharmony_ci * Currently setting verbose=1 will enable INFO messages and 0 will disable 8962306a36Sopenharmony_ci * them. FAIL and ERROR messages are always displayed. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_civoid log_verbosity(int level) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci if (level > VMAX) 9462306a36Sopenharmony_ci level = VMAX; 9562306a36Sopenharmony_ci else if (level < 0) 9662306a36Sopenharmony_ci level = 0; 9762306a36Sopenharmony_ci _verbose = level; 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/** 10162306a36Sopenharmony_ci * print_result() - Print standard PASS | ERROR | FAIL results 10262306a36Sopenharmony_ci * @ret: the return value to be considered: 0 | RET_ERROR | RET_FAIL 10362306a36Sopenharmony_ci * 10462306a36Sopenharmony_ci * print_result() is primarily intended for functional tests. 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_civoid print_result(const char *test_name, int ret) 10762306a36Sopenharmony_ci{ 10862306a36Sopenharmony_ci switch (ret) { 10962306a36Sopenharmony_ci case RET_PASS: 11062306a36Sopenharmony_ci ksft_test_result_pass("%s\n", test_name); 11162306a36Sopenharmony_ci ksft_print_cnts(); 11262306a36Sopenharmony_ci return; 11362306a36Sopenharmony_ci case RET_ERROR: 11462306a36Sopenharmony_ci ksft_test_result_error("%s\n", test_name); 11562306a36Sopenharmony_ci ksft_print_cnts(); 11662306a36Sopenharmony_ci return; 11762306a36Sopenharmony_ci case RET_FAIL: 11862306a36Sopenharmony_ci ksft_test_result_fail("%s\n", test_name); 11962306a36Sopenharmony_ci ksft_print_cnts(); 12062306a36Sopenharmony_ci return; 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* log level macros */ 12562306a36Sopenharmony_ci#define info(message, vargs...) \ 12662306a36Sopenharmony_cido { \ 12762306a36Sopenharmony_ci if (_verbose >= VINFO) \ 12862306a36Sopenharmony_ci fprintf(stderr, "\t%s: "message, INFO, ##vargs); \ 12962306a36Sopenharmony_ci} while (0) 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define error(message, err, args...) \ 13262306a36Sopenharmony_cido { \ 13362306a36Sopenharmony_ci if (_verbose >= VCRITICAL) {\ 13462306a36Sopenharmony_ci if (err) \ 13562306a36Sopenharmony_ci fprintf(stderr, "\t%s: %s: "message, \ 13662306a36Sopenharmony_ci ERROR, strerror(err), ##args); \ 13762306a36Sopenharmony_ci else \ 13862306a36Sopenharmony_ci fprintf(stderr, "\t%s: "message, ERROR, ##args); \ 13962306a36Sopenharmony_ci } \ 14062306a36Sopenharmony_ci} while (0) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#define fail(message, args...) \ 14362306a36Sopenharmony_cido { \ 14462306a36Sopenharmony_ci if (_verbose >= VCRITICAL) \ 14562306a36Sopenharmony_ci fprintf(stderr, "\t%s: "message, FAIL, ##args); \ 14662306a36Sopenharmony_ci} while (0) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#endif 149