dyld-832.7.1.tar.gz
[apple/dyld.git] / testing / include / test_support.h
1 #ifndef __DYLD_TEST_SUPPORT_H__
2 #define __DYLD_TEST_SUPPORT_H__ 1
3
4 #if __cplusplus
5 extern "C" {
6 #endif /* __cplusplus */
7
8 #include <unistd.h>
9 #include <mach/mach.h>
10 #include <mach/machine.h>
11 #include <dispatch/dispatch.h>
12
13 #if __cplusplus
14 };
15
16 // Only allow this interface for Objective-C++ due to typename and ARC issues in the default constructor
17
18 typedef void (^_dyld_test_reader_t)(int fd);
19 typedef void (^_dyld_test_exit_handler_t)(pid_t pid);
20 typedef void (^_dyld_test_crash_handler_t)(task_t task);
21
22 struct _process {
23 _process();
24 ~_process();
25 void set_executable_path(const char* EP);
26 void set_args(const char** A);
27 void set_env(const char** E);
28 void set_stdout_handler(_dyld_test_reader_t SOH);
29 void set_stderr_handler(_dyld_test_reader_t SEH);
30 void set_exit_handler(_dyld_test_exit_handler_t EH);
31 void set_crash_handler(_dyld_test_crash_handler_t CH);
32 void set_launch_suspended(bool S);
33 void set_launch_async(bool S);
34 void set_launch_arch(cpu_type_t A);
35 pid_t launch();
36 void *operator new(size_t size);
37 void operator delete(void *ptr);
38 private:
39 const char* executablePath;
40 const char** args;
41 const char** env;
42 _dyld_test_reader_t stdoutHandler;
43 _dyld_test_reader_t stderrHandler;
44 _dyld_test_crash_handler_t crashHandler;
45 _dyld_test_exit_handler_t exitHandler;
46 pid_t pid;
47 cpu_type_t arch;
48 bool suspended;
49 bool async;
50 };
51
52 #define STDERR_WRITER ^(int fd) { \
53 char buffer[16384]; \
54 ssize_t size = 0; \
55 do { \
56 size = read(fd, &buffer[0], 16384); \
57 buffer[size] = 0; \
58 fprintf(stderr, "%s", &buffer[0]); \
59 } while (size > 0); \
60 }
61
62 #define STDOUT_WRITER ^(int fd) { \
63 char buffer[16384]; \
64 ssize_t size = 0; \
65 do { \
66 size = read(fd, &buffer[0], 16384); \
67 buffer[size] = 0; \
68 fprintf(stdout, "%s", &buffer[0]); \
69 } while (size > 0); \
70 }
71
72 #endif /* __cplusplus */
73
74 #define PASS(...) _PASS(__FILE__,__LINE__,__VA_ARGS__)
75 #define FAIL(...) _FAIL(__FILE__,__LINE__,__VA_ARGS__)
76 #define LOG(...) _LOG(__FILE__,__LINE__,__VA_ARGS__)
77 #define TIMEOUT(seconds) _TIMEOUT(__FILE__,__LINE__,seconds)
78
79 // MARK: Private implementation details
80
81 #if __cplusplus
82 extern "C" {
83 #endif /* __cplusplus */
84 __attribute__((format(printf, 3, 4)))
85 __attribute__ ((noreturn))
86 extern void _PASS(const char* file, unsigned line, const char* format, ...);
87
88 __attribute__((format(printf, 3, 4)))
89 __attribute__ ((noreturn))
90 extern void _FAIL(const char* file, unsigned line, const char* format, ...);
91
92 __attribute__((format(printf, 3, 4)))
93 extern void _LOG(const char* file, unsigned line, const char* format, ...);
94
95 extern void _TIMEOUT(const char* file, unsigned line, uint64_t seconds);
96 #if __cplusplus
97 };
98 #endif /* __cplusplus */
99
100 #endif /* __DYLD_TEST_SUPPORT_H__ */