00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00027 #include "event-test.h"
00028
00029 RCSTAG("@(#)$Id: t_evg_register.c,v 1.7 2005/12/18 00:15:17 klmitch Exp $");
00030
00031 TEST_PROG(t_evg_register, "Test operation of event_gen_register()")
00032 TEST_ARG(t_evg_register, "<event-test.tc>")
00033 TEST_ARG(t_evg_register, "<engmodule.la>")
00034 TEST_DEP(t_evg_register, t_event_log)
00035 TEST_DEP(t_evg_register, t_event_init)
00036
00042 enum {
00043 TGT_01 = EGT_RESERVED, TGT_02, TGT_03, TGT_04, TGT_05, TGT_06, TGT_07,
00044 TGT_08, TGT_09, TGT_10, TGT_11
00045 };
00046
00053 struct rule {
00054 const int gens;
00055 const unsigned int endfl;
00056 const unsigned int first;
00057 const unsigned int count;
00058 };
00059
00074 #define rule_init(gens, endfl, first, count) \
00075 { (gens), (endfl), (first), (count) }
00076
00082 struct test {
00083 const char *test;
00084 const unsigned int gen;
00085 const ev_err_t err;
00086 const unsigned int rulecnt;
00087 const struct rule *rules;
00088 };
00089
00101 #define test_rule(name, gen, err, rules) \
00102 { (name), (gen), (err), sizeof(rules) / sizeof(struct rule), (rules) }
00103
00114 #define test_norule(name, gen, err) \
00115 { (name), (gen), (err), 0, 0 }
00116
00122 static struct rule endcons_rules[] = {
00123 rule_init(1, 1, TGT_06, 1)
00124 };
00125
00131 static struct rule endextforw_rules[] = {
00132 rule_init(1, 1, TGT_06, 2)
00133 };
00134
00140 static struct rule endextrev_rules[] = {
00141 rule_init(1, 1, TGT_05, 3)
00142 };
00143
00149 static struct rule midcons_rules[] = {
00150 rule_init(1, 0, TGT_02, 1),
00151 rule_init(2, 1, TGT_05, 3)
00152 };
00153
00159 static struct rule midextforw_rules[] = {
00160 rule_init(1, 0, TGT_02, 2),
00161 rule_init(2, 1, TGT_05, 3)
00162 };
00163
00169 static struct rule midextrev_rules[] = {
00170 rule_init(1, 0, TGT_01, 3),
00171 rule_init(2, 1, TGT_05, 3)
00172 };
00173
00179 static struct rule endmerge_rules[] = {
00180 rule_init(1, 1, TGT_01, 7)
00181 };
00182
00188 static struct rule midmerge_rules[] = {
00189 rule_init(1, 0, TGT_01, 9),
00190 rule_init(2, 1, TGT_11, 1)
00191 };
00192
00199 static struct test tests[] = {
00200 TEST_DECL(t_evg_register, evg_endcons, "Test that an event generator "
00201 "can be constructed at the end of the gens list")
00202 test_rule(TEST_NAME(evg_endcons), TGT_06, 0, endcons_rules),
00203
00204 TEST_DECL(t_evg_register, evg_multreg, "Test that multiple generator "
00205 "registration is rejected")
00206 test_norule(TEST_NAME(evg_multreg), TGT_06, EV_ERR_DUPGEN),
00207
00208 TEST_DECL(t_evg_register, evg_endextforw, "Test that an event generator "
00209 "at end of gens list can be extended forward")
00210 test_rule(TEST_NAME(evg_endextforw), TGT_07, 0, endextforw_rules),
00211
00212 TEST_DECL(t_evg_register, evg_endextrev, "Test that an event generator "
00213 "at end of gens list can be extended in reverse")
00214 test_rule(TEST_NAME(evg_endextrev), TGT_05, 0, endextrev_rules),
00215
00216 TEST_DECL(t_evg_register, evg_midcons, "Test that an event generator "
00217 "can be constructed in middle of gens list")
00218 test_rule(TEST_NAME(evg_midcons), TGT_02, 0, midcons_rules),
00219
00220 TEST_DECL(t_evg_register, evg_midextforw, "Test that an event generator "
00221 "in middle of gens list can be extended forward")
00222 test_rule(TEST_NAME(evg_midextforw), TGT_03, 0, midextforw_rules),
00223
00224 TEST_DECL(t_evg_register, evg_midextrev, "Test that an event generator "
00225 "in middle of gens list can be extended in reverse")
00226 test_rule(TEST_NAME(evg_midextrev), TGT_01, 0, midextrev_rules),
00227
00228 TEST_DECL(t_evg_register, evg_endmerge, "Test that adding an event "
00229 "generator directly between two gens at end of gens list will "
00230 "result in a merge")
00231 test_rule(TEST_NAME(evg_endmerge), TGT_04, 0, endmerge_rules),
00232
00233
00234 test_norule(0, TGT_09, 0),
00235 test_norule(0, TGT_11, 0),
00236
00237 TEST_DECL(t_evg_register, evg_midmerge, "Test that adding an event "
00238 "generator directly between two gens in middle of gens list will "
00239 "result in a merge")
00240 test_rule(TEST_NAME(evg_midmerge), TGT_08, 0, midmerge_rules)
00241 };
00242
00257 static int
00258 do_rules(ev_ctx_t *ctx, unsigned int rulecnt, const struct rule *rules)
00259 {
00260 int genidx = 0, i, j;
00261 ev_gens_t *gen = ctx->ec_gens;
00262
00263 for (i = 0; i < rulecnt; i++) {
00264 for (; gen && genidx < rules[i].gens;) {
00265 gen = gen->gs_next;
00266 genidx++;
00267 }
00268
00269 if (!gen ||
00270 (rules[i].endfl && gen->gs_next) ||
00271 rules[i].first != gen->gs_first || rules[i].count != gen->gs_count)
00272 return 0;
00273
00274
00275 for (j = 0; j < gen->gs_count; j++)
00276 if (gen->gs_gens[j].gd_type != (rules[i].first + j) ||
00277 gen->gs_gens[j].gd_magic != (rules[i].first + j) ||
00278 gen->gs_gens[j].gd_size != (rules[i].first + j +
00279 sizeof(ev_genhdr_t)) ||
00280 gen->gs_gens[j].gd_active.gl_count ||
00281 gen->gs_gens[j].gd_active.gl_list ||
00282 gen->gs_gens[j].gd_free.gl_count ||
00283 gen->gs_gens[j].gd_free.gl_list)
00284 return 0;
00285 }
00286
00287 return 1;
00288 }
00289
00296 int
00297 main(int argc, char **argv)
00298 {
00299 int i;
00300 char *prog;
00301 ev_err_t err;
00302 ev_ctx_t ctx;
00303
00304 ev_test_init(t_evg_register);
00305 ev_prog_name(prog, argv);
00306 ev_lib_init(argc, argv, prog, &ctx);
00307
00308 for (i = 0; i < sizeof(tests) / sizeof(struct test); i++)
00309
00310 if ((err = event_gen_register(&ctx, tests[i].gen, tests[i].gen,
00311 tests[i].gen + sizeof(ev_genhdr_t), 0)) !=
00312 tests[i].err) {
00313 if (tests[i].test)
00314 FAIL(tests[i].test, 0, "event_gen_register() failed with error %u",
00315 err);
00316 exit(0);
00317 } else if (tests[i].rulecnt && tests[i].rules &&
00318 !do_rules(&ctx, tests[i].rulecnt, tests[i].rules)) {
00319 if (tests[i].test)
00320 FAIL(tests[i].test, 0, "event_gen_register() left gens list in "
00321 "inconsistent state (do_rules() call failed)");
00322 exit(0);
00323 } else if (tests[i].test)
00324 PASS(tests[i].test, "event_gen_register() successfully registered "
00325 "generator");
00326
00327 event_destroy(&ctx);
00328
00329 return 0;
00330 }