test.h: update to yshui/test.h@9e5fc7b
Fix unit tests on *BSD systems Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
		| @ -8,6 +8,13 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ||     \ | ||||
|     defined(__NetBSD__) || defined(__OpenBSD__) | ||||
| #define USE_SYSCTL_FOR_ARGS 1 | ||||
| #include <sys/sysctl.h> | ||||
| #include <unistd.h>        // getpid | ||||
| #endif | ||||
|  | ||||
| struct test_file_metadata; | ||||
|  | ||||
| struct test_failure { | ||||
| @ -35,8 +42,7 @@ struct test_file_metadata __attribute__((weak)) * test_file_head; | ||||
|  | ||||
| #define SET_FAILURE(_message)                                                             \ | ||||
| 	metadata->failure = (struct test_failure) {                                       \ | ||||
| 		.message = _message, .file = __FILE__, .line = __LINE__,            \ | ||||
| 		.present = true,                                                    \ | ||||
| 		.message = _message, .file = __FILE__, .line = __LINE__, .present = true, \ | ||||
| 	} | ||||
|  | ||||
| #define TEST_EQUAL(a, b)                                                                 \ | ||||
| @ -71,8 +77,7 @@ struct test_file_metadata __attribute__((weak)) * test_file_head; | ||||
| 	    .name = #_name,                                                               \ | ||||
| 	    .fn = __test_h_##_name,                                                       \ | ||||
| 	};                                                                                \ | ||||
| 	static void __attribute__((constructor(101)))                               \ | ||||
| 	    __test_h_##_name##_register(void) {                                     \ | ||||
| 	static void __attribute__((constructor(101))) __test_h_##_name##_register(void) { \ | ||||
| 		__test_h_meta_##_name.next = __test_h_file.tests;                         \ | ||||
| 		__test_h_file.tests = &__test_h_meta_##_name;                             \ | ||||
| 		if (!__test_h_file.registered) {                                          \ | ||||
| @ -91,11 +96,31 @@ extern void __attribute__((weak)) (*test_h_unittest_setup)(void); | ||||
| /// @param[out] tests_run if not NULL, set to whether tests were run | ||||
| static inline void __attribute__((constructor(102))) run_tests(void) { | ||||
| 	bool should_run = false; | ||||
| #ifdef USE_SYSCTL_FOR_ARGS | ||||
| 	int mib[] = { | ||||
| 		CTL_KERN, | ||||
| #if defined(__NetBSD__) || defined(__OpenBSD__) | ||||
| 		KERN_PROC_ARGS, | ||||
| 		getpid(), | ||||
| 		KERN_PROC_ARGV, | ||||
| #else | ||||
| 		KERN_PROC, | ||||
| 		KERN_PROC_ARGS, | ||||
| 		getpid(), | ||||
| #endif | ||||
| 	}; | ||||
| 	char *arg = NULL; | ||||
| 	size_t arglen; | ||||
| 	sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &arglen, NULL, 0); | ||||
| 	arg = malloc(arglen); | ||||
| 	sysctl(mib, sizeof(mib) / sizeof(mib[0]), arg, &arglen, NULL, 0); | ||||
| #else | ||||
| 	FILE *cmdlinef = fopen("/proc/self/cmdline", "r"); | ||||
| 	char *arg = NULL; | ||||
| 	int arglen; | ||||
| 	fscanf(cmdlinef, "%ms%n", &arg, &arglen); | ||||
| 	fclose(cmdlinef); | ||||
| #endif | ||||
| 	for (char *pos = arg; pos < arg + arglen; pos += strlen(pos) + 1) { | ||||
| 		if (strcmp(pos, "--unittest") == 0) { | ||||
| 			should_run = true; | ||||
| @ -122,9 +147,8 @@ static inline void __attribute__((constructor(102))) run_tests(void) { | ||||
| 			j->failure.present = false; | ||||
| 			j->fn(j, i); | ||||
| 			if (j->failure.present) { | ||||
| 				fprintf(stderr, "failed (%s at %s:%d)\n", | ||||
| 				        j->failure.message, j->failure.file, | ||||
| 				        j->failure.line); | ||||
| 				fprintf(stderr, "failed (%s at %s:%d)\n", j->failure.message, | ||||
| 				        j->failure.file, j->failure.line); | ||||
| 				failed++; | ||||
| 			} else { | ||||
| 				fprintf(stderr, "passed\n"); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Yuxuan Shui
					Yuxuan Shui