Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fae0d7c authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt
Browse files

selftests: Add support files for powerpc tests



This commit adds support code used by upcoming powerpc tests.

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 0e56dacd
Loading
Loading
Loading
Loading
+105 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2013, Michael Ellerman, IBM Corp.
 * Licensed under GPLv2.
 */

#include <errno.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include "subunit.h"
#include "utils.h"

#define TIMEOUT		120
#define KILL_TIMEOUT	5


int run_test(int (test_function)(void), char *name)
{
	bool terminated;
	int rc, status;
	pid_t pid;

	/* Make sure output is flushed before forking */
	fflush(stdout);

	pid = fork();
	if (pid == 0) {
		exit(test_function());
	} else if (pid == -1) {
		perror("fork");
		return 1;
	}

	/* Wake us up in timeout seconds */
	alarm(TIMEOUT);
	terminated = false;

wait:
	rc = waitpid(pid, &status, 0);
	if (rc == -1) {
		if (errno != EINTR) {
			printf("unknown error from waitpid\n");
			return 1;
		}

		if (terminated) {
			printf("!! force killing %s\n", name);
			kill(pid, SIGKILL);
			return 1;
		} else {
			printf("!! killing %s\n", name);
			kill(pid, SIGTERM);
			terminated = true;
			alarm(KILL_TIMEOUT);
			goto wait;
		}
	}

	if (WIFEXITED(status))
		status = WEXITSTATUS(status);
	else {
		if (WIFSIGNALED(status))
			printf("!! child died by signal %d\n", WTERMSIG(status));
		else
			printf("!! child died by unknown cause\n");

		status = 1; /* Signal or other */
	}

	return status;
}

static void alarm_handler(int signum)
{
	/* Jut wake us up from waitpid */
}

static struct sigaction alarm_action = {
	.sa_handler = alarm_handler,
};

int test_harness(int (test_function)(void), char *name)
{
	int rc;

	test_start(name);
	test_set_git_version(GIT_VERSION);

	if (sigaction(SIGALRM, &alarm_action, NULL)) {
		perror("sigaction");
		test_error(name);
		return 1;
	}

	rc = run_test(test_function, name);

	test_finish(name, rc);

	return rc;
}
+47 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2013, Michael Ellerman, IBM Corp.
 * Licensed under GPLv2.
 */

#ifndef _SELFTESTS_POWERPC_SUBUNIT_H
#define _SELFTESTS_POWERPC_SUBUNIT_H

static inline void test_start(char *name)
{
	printf("test: %s\n", name);
}

static inline void test_failure_detail(char *name, char *detail)
{
	printf("failure: %s [%s]\n", name, detail);
}

static inline void test_failure(char *name)
{
	printf("failure: %s\n", name);
}

static inline void test_error(char *name)
{
	printf("error: %s\n", name);
}

static inline void test_success(char *name)
{
	printf("success: %s\n", name);
}

static inline void test_finish(char *name, int status)
{
	if (status)
		test_failure(name);
	else
		test_success(name);
}

static inline void test_set_git_version(char *value)
{
	printf("tags: git_version:%s\n", value);
}

#endif /* _SELFTESTS_POWERPC_SUBUNIT_H */
+34 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2013, Michael Ellerman, IBM Corp.
 * Licensed under GPLv2.
 */

#ifndef _SELFTESTS_POWERPC_UTILS_H
#define _SELFTESTS_POWERPC_UTILS_H

#include <stdint.h>
#include <stdbool.h>

/* Avoid headaches with PRI?64 - just use %ll? always */
typedef unsigned long long u64;
typedef   signed long long s64;

/* Just for familiarity */
typedef uint32_t u32;
typedef uint8_t u8;


int test_harness(int (test_function)(void), char *name);


/* Yes, this is evil */
#define FAIL_IF(x)						\
do {								\
	if ((x)) {						\
		fprintf(stderr,					\
		"[FAIL] Test FAILED on line %d\n", __LINE__);	\
		return 1;					\
	}							\
} while (0)

#endif /* _SELFTESTS_POWERPC_UTILS_H */