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