| 
									
										
										
										
											2015-06-10 03:15:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2012-03-23 10:01:23 -07:00
										 |  |  | #ifndef _TEST_RUNNER_H_
 | 
					
						
							|  |  |  | #define _TEST_RUNNER_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-19 12:14:19 +03:00
										 |  |  | #ifdef NDEBUG
 | 
					
						
							|  |  |  | #error "Tests must not be built with NDEBUG defined, they rely on assert()."
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:14:46 +01:00
										 |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 18:03:16 -05:00
										 |  |  | struct test { | 
					
						
							|  |  |  | 	const char *name; | 
					
						
							|  |  |  | 	void (*run)(void); | 
					
						
							| 
									
										
										
										
											2012-04-19 14:26:51 +03:00
										 |  |  | 	int must_fail; | 
					
						
							|  |  |  | } __attribute__ ((aligned (16))); | 
					
						
							| 
									
										
										
										
											2012-03-02 18:03:16 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:04 +01:00
										 |  |  | #define TEST(name)							\
 | 
					
						
							|  |  |  | 	static void name(void);						\ | 
					
						
							|  |  |  | 									\ | 
					
						
							|  |  |  | 	const struct test test##name					\ | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:05 +01:00
										 |  |  | 		 __attribute__ ((used, section ("test_section"))) = {	\ | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:04 +01:00
										 |  |  | 		#name, name, 0						\
 | 
					
						
							|  |  |  | 	};								\ | 
					
						
							|  |  |  | 									\ | 
					
						
							| 
									
										
										
										
											2012-04-19 14:26:51 +03:00
										 |  |  | 	static void name(void) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:04 +01:00
										 |  |  | #define FAIL_TEST(name)							\
 | 
					
						
							|  |  |  | 	static void name(void);						\ | 
					
						
							|  |  |  | 									\ | 
					
						
							|  |  |  | 	const struct test test##name					\ | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:05 +01:00
										 |  |  | 		 __attribute__ ((used, section ("test_section"))) = {	\ | 
					
						
							| 
									
										
										
										
											2017-04-14 19:48:04 +01:00
										 |  |  | 		#name, name, 1						\
 | 
					
						
							|  |  |  | 	};								\ | 
					
						
							|  |  |  | 									\ | 
					
						
							| 
									
										
										
										
											2012-03-02 18:03:16 -05:00
										 |  |  | 	static void name(void) | 
					
						
							| 
									
										
										
										
											2012-03-23 10:01:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-19 16:52:32 +03:00
										 |  |  | int | 
					
						
							|  |  |  | count_open_fds(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-20 14:22:51 +03:00
										 |  |  | void | 
					
						
							|  |  |  | exec_fd_leak_check(int nr_expected_fds); /* never returns */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-19 14:53:00 +01:00
										 |  |  | int | 
					
						
							|  |  |  | get_current_alloc_num(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | check_leaks(int supposed_allocs, int supposed_fds); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:16:42 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * set/reset the timeout in seconds. The timeout starts | 
					
						
							|  |  |  |  * at the point of invoking this function | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | test_set_timeout(unsigned int); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:14:46 +01:00
										 |  |  | /* 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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-19 14:53:06 +01:00
										 |  |  | #define DISABLE_LEAK_CHECKS			\
 | 
					
						
							|  |  |  | 	do {					\ | 
					
						
							|  |  |  | 		extern int leak_check_enabled;	\ | 
					
						
							|  |  |  | 		leak_check_enabled = 0;		\ | 
					
						
							|  |  |  | 	} while (0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-23 10:01:23 -07:00
										 |  |  | #endif
 |