6 #include "test_utils.h"
7 #include "nagios/nebstructs.h"
8 #include "nagios/nebmodules.h"
9 #include "nagios/nebmods.h"
10 #include "nagios/broker.h"
11 #include "nagios/objects.h"
13 static int (*hooks
[NEBCALLBACK_NUMITEMS
])(int, void *);
14 static int reg_errors
;
15 static int dereg_errors
;
16 int event_broker_options
= 0;
17 int daemon_dumps_core
= 0;
19 int is_tested(int callback_type
, const char *caller_func
)
21 switch (callback_type
) {
22 case NEBCALLBACK_SERVICE_CHECK_DATA
:
23 case NEBCALLBACK_HOST_CHECK_DATA
:
24 case NEBCALLBACK_DOWNTIME_DATA
:
25 case NEBCALLBACK_PROCESS_DATA
:
26 t_pass("%s: callback %d is handled by nebtest",
27 caller_func
, callback_type
);
31 t_fail("%s: callback %d is unhandled by nebtest",
32 caller_func
, callback_type
);
36 int neb_register_callback(int callback_type
, void *mod_handle
,
37 int priority
, int (*callback_func
)(int,void *))
39 if (!is_tested(callback_type
, __func__
))
40 reg_errors
|= 1 << callback_type
;
42 if (hooks
[callback_type
]) {
43 reg_errors
|= 1 << callback_type
;
44 printf("! Registering a second hook for %d!", callback_type
);
47 hooks
[callback_type
] = callback_func
;
52 int neb_deregister_callback(int callback_type
, int (*callback_func
)(int, void *))
54 if (!is_tested(callback_type
, __func__
))
55 dereg_errors
|= 1 << callback_type
;
57 if (!hooks
[callback_type
]) {
58 dereg_errors
|= 1 << callback_type
;
59 printf("! Trying to unregister an unregistered hook!\n");
62 hooks
[callback_type
] = NULL
;
67 static void check_callbacks(void)
71 for (i
= 0; i
< NEBCALLBACK_NUMITEMS
; i
++) {
72 /* only print it if something's wrong, to suppress noise */
76 t_fail("hook %d not unregistered by module unload function", i
);
80 static int check_symbols(void *dso
)
84 const char *syms
[] = {
85 "__neb_api_version", "nebmodule_init", "nebmodule_deinit",
89 for (i
= 0; syms
[i
]; i
++) {
90 const char *sym
= syms
[i
];
93 t_pass("%s exists in module", sym
);
95 t_fail("%s can't be looked up: %s", sym
, dlerror());
104 static char *__host_name
= "ndb, host";
105 static char *__service_description
= "ndb, service";
108 memset(&x, 0, sizeof(x)); \
109 x.timestamp.tv_sec = time(NULL); \
110 x.host_name = __host_name; \
112 #define set_service(x) x.service_description = __service_description
114 static int test_sql_host_insert(void)
116 int (*hook
)(int, void *);
117 nebstruct_host_check_data ds
;
118 int cb
= NEBCALLBACK_HOST_CHECK_DATA
;
120 if (!(hook
= hooks
[cb
])) {
121 printf(" ! Missing host_check hook\n");
126 ds
.type
= NEBTYPE_HOSTCHECK_PROCESSED
;
127 ds
.output
= "nebtest host check";
128 return hook(cb
, &ds
);
131 static int test_sql_service_insert(void)
133 int (*hook
)(int, void *);
134 nebstruct_service_check_data ds
;
135 int cb
= NEBCALLBACK_SERVICE_CHECK_DATA
;
137 if (!(hook
= hooks
[cb
])) {
138 printf(" ! Missing service_check hook\n");
144 ds
.type
= NEBTYPE_SERVICECHECK_PROCESSED
;
145 ds
.output
= strdup("nebtest service check");
147 return hook(cb
, &ds
);
150 static int test_sql_process_data_insert(void)
152 int (*hook
)(int, void *);
153 nebstruct_process_data ds
;
154 int cb
= NEBCALLBACK_PROCESS_DATA
;
156 if (!(hook
= hooks
[cb
])) {
157 printf(" ! Missing process data hook\n");
161 memset(&ds
, 0, sizeof(ds
));
162 ds
.timestamp
.tv_sec
= time(NULL
);
163 ds
.type
= NEBTYPE_PROCESS_START
;
165 return hook(cb
, &ds
);
168 static void test_sql_downtime_insert(void)
170 int (*hook
)(int, void *);
171 nebstruct_downtime_data ds
;
172 int cb
= NEBCALLBACK_DOWNTIME_DATA
;
174 if (!(hook
= hooks
[cb
])) {
175 t_fail("downtime data hook missing");
178 t_pass("downtime data hook exists");
181 ds
.type
= NEBTYPE_DOWNTIME_START
;
182 ds
.comment_data
= "nebtest downtime";
184 ok_int(hook(cb
, &ds
), 0, "host downtime insertion");
186 ok_int(hook(cb
, &ds
), 0, "service downtime insertion");
190 static void test_sql_inserts(void)
192 printf("%sTesting hooks%s\n", cyan
, reset
);
193 ok_int(test_sql_host_insert(), 0, "host check hook");
194 ok_int(test_sql_service_insert(), 0, "service check hook");
195 test_sql_downtime_insert();
196 ok_int(test_sql_process_data_insert(), 0, "process data hook");
199 static nebmodule
*neb
;
200 static void test_one_module(char *arg
)
202 static void *dso
= NULL
;
204 int (*init_func
)(int, const char *, nebmodule
*);
205 int (*deinit_func
)(int, int);
206 int (*log_grok_var
)(const char *, const char *);
211 if (strchr(arg
, '/'))
214 int len
= strlen(arg
);
215 path
= calloc(len
+ 3, 1);
218 memcpy(path
+ 2, arg
, len
);
221 dso
= dlopen(path
, RTLD_NOW
| RTLD_GLOBAL
);
223 t_fail("dlopen() failed: %s", dlerror());
227 t_pass("dlopen() worked out fine");
228 log_grok_var
= dlsym(dso
, "log_grok_var");
230 log_grok_var("log_file", "/dev/null");
232 printf("%sChecking symbols in '%s'%s\n", cyan
, path
, reset
);
236 init_func
= dlsym(dso
, "nebmodule_init");
237 ok_int(init_func(-1, neb
->args
, neb
), 0, "module init function");
240 deinit_func
= dlsym(dso
, "nebmodule_deinit");
241 ok_int(deinit_func(0, 0), 0, "module deinit function");
242 ok_int(reg_errors
, 0, "registering callbacks");
243 ok_int(dereg_errors
, 0, "deregistering callbacks");
249 int main(int argc
, char **argv
)
255 neb
= calloc(sizeof(*neb
), 1);
257 for (i
= 1; i
< argc
; i
++) {
260 if (*arg
== '-' && arg
[1] == 'f' && i
< argc
- 1) {
261 neb
->args
= argv
[++i
];
265 test_one_module(arg
);