Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

t_evg_register.c

Go to the documentation of this file.
00001 /*
00002 ** Copyright (C) 2005 by Kevin L. Mitchell <klmitch@mit.edu>
00003 **
00004 ** This program is free software; you can redistribute it and/or modify
00005 ** it under the terms of the GNU General Public License as published by
00006 ** the Free Software Foundation; either version 2 of the License, or
00007 ** (at your option) any later version.
00008 **
00009 ** This program is distributed in the hope that it will be useful,
00010 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 ** GNU General Public License for more details.
00013 **
00014 ** You should have received a copy of the GNU General Public License
00015 ** along with this program; if not, write to the Free Software
00016 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 **
00018 ** @(#)$Id: t_evg_register.c,v 1.7 2005/12/18 00:15:17 klmitch Exp $
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   /* Set up for testing midlist merge */
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++) { /* walk through the rules... */
00264     for (; gen && genidx < rules[i].gens;) {
00265       gen = gen->gs_next; /* find correct gens struct */
00266       genidx++;
00267     }
00268 
00269     if (!gen || /* did we run out of gens without finding it? */
00270         (rules[i].endfl && gen->gs_next) || /* is it supposed to be the end? */
00271         rules[i].first != gen->gs_first || rules[i].count != gen->gs_count)
00272       return 0; /* all simple test performed... */
00273 
00274     /* OK, now we must walk through the generators and make sure they match */
00275     for (j = 0; j < gen->gs_count; j++)
00276       if (gen->gs_gens[j].gd_type != (rules[i].first + j) || /* check type */
00277           gen->gs_gens[j].gd_magic != (rules[i].first + j) || /* magic */
00278           gen->gs_gens[j].gd_size != (rules[i].first + j +
00279                                       sizeof(ev_genhdr_t)) || /* and size */
00280           gen->gs_gens[j].gd_active.gl_count || /* check list init... */
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; /* everything tests good! */
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); /* initialize test program */
00305   ev_prog_name(prog, argv); /* calculate program name... */
00306   ev_lib_init(argc, argv, prog, &ctx); /* initialize event library */
00307 
00308   for (i = 0; i < sizeof(tests) / sizeof(struct test); i++)
00309     /* execute the test case... */
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) /* if no test name specified, not an actual test... */
00314         FAIL(tests[i].test, 0, "event_gen_register() failed with error %u",
00315              err);
00316       exit(0); /* We can't continue, so exit here... */
00317     } else if (tests[i].rulecnt && tests[i].rules && /* check rules... */
00318                !do_rules(&ctx, tests[i].rulecnt, tests[i].rules)) {
00319       if (tests[i].test) /* if no test name specified, not an actual test... */
00320         FAIL(tests[i].test, 0, "event_gen_register() left gens list in "
00321              "inconsistent state (do_rules() call failed)");
00322       exit(0); /* We can't continue, so exit here... */
00323     } else if (tests[i].test) /* test is passed; issue the success... */
00324       PASS(tests[i].test, "event_gen_register() successfully registered "
00325            "generator");
00326 
00327   event_destroy(&ctx); /* destroy the context */
00328 
00329   return 0;
00330 }

Generated on Wed Dec 28 23:36:56 2005 for event by  doxygen 1.4.4