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
])) {
125 ds
.type
= NEBTYPE_HOSTCHECK_PROCESSED
;
126 ds
.output
= "nebtest host check";
127 return hook(cb
, &ds
);
130 static int test_sql_service_insert(void)
132 int (*hook
)(int, void *);
133 nebstruct_service_check_data ds
;
134 int cb
= NEBCALLBACK_SERVICE_CHECK_DATA
;
136 if (!(hook
= hooks
[cb
])) {
137 printf(" ! Missing service_check hook\n");
143 ds
.type
= NEBTYPE_SERVICECHECK_PROCESSED
;
144 ds
.output
= strdup("nebtest service check");
146 return hook(cb
, &ds
);
149 static int test_sql_process_data_insert(void)
151 int (*hook
)(int, void *);
152 nebstruct_process_data ds
;
153 int cb
= NEBCALLBACK_PROCESS_DATA
;
155 if (!(hook
= hooks
[cb
])) {
156 printf(" ! Missing process data hook\n");
160 memset(&ds
, 0, sizeof(ds
));
161 ds
.timestamp
.tv_sec
= time(NULL
);
162 ds
.type
= NEBTYPE_PROCESS_START
;
164 return hook(cb
, &ds
);
167 static void test_sql_downtime_insert(void)
169 int (*hook
)(int, void *);
170 nebstruct_downtime_data ds
;
171 int cb
= NEBCALLBACK_DOWNTIME_DATA
;
173 if (!(hook
= hooks
[cb
])) {
174 t_fail("downtime data hook missing");
177 t_pass("downtime data hook exists");
180 ds
.type
= NEBTYPE_DOWNTIME_START
;
181 ds
.comment_data
= "nebtest downtime";
183 ok_int(hook(cb
, &ds
), 0, "host downtime insertion");
185 ok_int(hook(cb
, &ds
), 0, "service downtime insertion");
189 static void test_sql_inserts(void)
191 t_start("Testing hooks");
192 ok_int(test_sql_host_insert(), 0, "host check hook");
193 ok_int(test_sql_service_insert(), 0, "service check hook");
194 test_sql_downtime_insert();
195 ok_int(test_sql_process_data_insert(), 0, "process data hook");
198 static nebmodule
*neb
;
199 static void test_one_module(char *arg
)
201 static void *dso
= NULL
;
203 int (*init_func
)(int, const char *, nebmodule
*);
204 int (*deinit_func
)(int, int);
205 int (*log_grok_var
)(const char *, const char *);
210 if (strchr(arg
, '/'))
213 int len
= strlen(arg
);
214 path
= calloc(len
+ 3, 1);
217 memcpy(path
+ 2, arg
, len
);
220 dso
= dlopen(path
, RTLD_NOW
| RTLD_GLOBAL
);
222 t_fail("dlopen() failed: %s", dlerror());
226 t_start("Testing module '%s'", path
);
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 t_start("Checking symbols in '%s'", path
);
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");
250 int main(int argc
, char **argv
)
256 neb
= calloc(sizeof(*neb
), 1);
258 for (i
= 1; i
< argc
; i
++) {
261 if (*arg
== '-' && arg
[1] == 'f' && i
< argc
- 1) {
262 neb
->args
= argv
[++i
];
266 test_one_module(arg
);