/*
 * Copyright © 2012 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial
 * portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef _TEST_RUNNER_H_
#define _TEST_RUNNER_H_

#ifdef NDEBUG
#error "Tests must not be built with NDEBUG defined, they rely on assert()."
#endif

#include <unistd.h>

struct test {
	const char *name;
	void (*run)(void);
	int must_fail;
} __attribute__ ((aligned (16)));

#define TEST(name)							\
	static void name(void);						\
									\
	const struct test test##name					\
		 __attribute__ ((used, section ("test_section"))) = {	\
		#name, name, 0						\
	};								\
									\
	static void name(void)

#define FAIL_TEST(name)							\
	static void name(void);						\
									\
	const struct test test##name					\
		 __attribute__ ((used, section ("test_section"))) = {	\
		#name, name, 1						\
	};								\
									\
	static void name(void)

int
count_open_fds(void);

void
exec_fd_leak_check(int nr_expected_fds); /* never returns */

int
get_current_alloc_num(void);

void
check_leaks(int supposed_allocs, int supposed_fds);

/*
 * set/reset the timeout in seconds. The timeout starts
 * at the point of invoking this function
 */
void
test_set_timeout(unsigned int);

/* test-runner uses alarm() and SIGALRM, so we can not
 * use usleep and sleep functions in tests (see 'man usleep'
 * or 'man sleep', respectively). Following functions are safe
 * to use in tests */
void
test_usleep(useconds_t);

void
test_sleep(unsigned int);

void
test_disable_coredumps(void);

#define DISABLE_LEAK_CHECKS			\
	do {					\
		extern int leak_check_enabled;	\
		leak_check_enabled = 0;		\
	} while (0);

#endif
