linux/tools/testing/selftests/futex/include/logging.h
<<
>>
Prefs
   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'
  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    0
  57#define VCRITICAL 1
  58#define VINFO     2
  59#define VMAX      VINFO
  60int _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 */
  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 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 */
  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 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 */
 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#endif
 149