diff options
author | Richard Braun <rbraun@sceen.net> | 2013-06-07 22:08:33 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2013-06-07 22:08:33 +0200 |
commit | 599cb4429d5c667599178714158f5d2090e34ad2 (patch) | |
tree | 4d6f06c62dc8fde066020fe99cbb045bddc4c782 | |
parent | 47c14590225144d524841f35dcebebbebe7bfc35 (diff) |
test_rdxtree: new tests covering node creation failures
-rw-r--r-- | rdxtree.c | 14 | ||||
-rw-r--r-- | test/test_rdxtree.c | 97 |
2 files changed, 111 insertions, 0 deletions
@@ -128,6 +128,11 @@ struct rdxtree_node { void *entries[RDXTREE_RADIX_SIZE]; }; +#ifdef RDXTREE_ENABLE_NODE_CREATION_FAILURES +unsigned int rdxtree_fail_node_creation_threshold; +unsigned int rdxtree_nr_node_creations; +#endif /* RDXTREE_ENABLE_NODE_CREATION_FAILURES */ + static inline int rdxtree_check_alignment(const void *ptr) { @@ -157,6 +162,15 @@ rdxtree_node_create(struct rdxtree_node **nodep, unsigned int height) { struct rdxtree_node *node; +#ifdef RDXTREE_ENABLE_NODE_CREATION_FAILURES + if (rdxtree_fail_node_creation_threshold != 0) { + rdxtree_nr_node_creations++; + + if (rdxtree_nr_node_creations == rdxtree_fail_node_creation_threshold) + return ERR_NOMEM; + } +#endif /* RDXTREE_ENABLE_NODE_CREATION_FAILURES */ + node = malloc(sizeof(*node)); if (node == NULL) diff --git a/test/test_rdxtree.c b/test/test_rdxtree.c index 3b9b09a..9d2a1d8 100644 --- a/test/test_rdxtree.c +++ b/test/test_rdxtree.c @@ -27,6 +27,8 @@ #include <assert.h> #include <stdarg.h> +#define RDXTREE_ENABLE_NODE_CREATION_FAILURES + #include "../error.h" #include "../macros.h" #include "../rdxtree.c" @@ -848,6 +850,97 @@ test_32(void) destroy_tree(&tree); } +extern unsigned int rdxtree_fail_node_creation_threshold; +extern unsigned int rdxtree_nr_node_creations; + +static void +test_33(void) +{ + struct rdxtree tree; + struct obj *obj; + int error; + + TITLE("prepare node creation failure at 1, insert 1"); + + rdxtree_fail_node_creation_threshold = 1; + rdxtree_nr_node_creations = 0; + + rdxtree_init(&tree); + obj = obj_create(1); + error = rdxtree_insert(&tree, obj->id, obj); + assert(error == ERR_NOMEM); + obj_destroy(obj); + print_tree(&tree); +} + +static void +test_34(void) +{ + struct rdxtree tree; + struct obj *obj; + int error; + + TITLE("prepare node creation failure at 2, insert 64"); + + rdxtree_fail_node_creation_threshold = 2; + rdxtree_nr_node_creations = 0; + + rdxtree_init(&tree); + obj = obj_create(64); + error = rdxtree_insert(&tree, obj->id, obj); + assert(error == ERR_NOMEM); + obj_destroy(obj); + print_tree(&tree); +} + +static void +test_35(void) +{ + struct rdxtree tree; + struct obj *obj; + int error; + + TITLE("prepare node creation failure at 2, insert 0 and 64"); + + rdxtree_fail_node_creation_threshold = 2; + rdxtree_nr_node_creations = 0; + + rdxtree_init(&tree); + obj = obj_create(0); + error = rdxtree_insert(&tree, obj->id, obj); + assert(!error); + obj = obj_create(64); + error = rdxtree_insert(&tree, obj->id, obj); + assert(error == ERR_NOMEM); + obj_destroy(obj); + print_tree(&tree); + destroy_tree(&tree); +} + +static void +test_36(void) +{ + struct rdxtree tree; + struct obj *obj; + int error; + + TITLE("prepare node creation failure at 2, insert 1 and 64"); + + rdxtree_fail_node_creation_threshold = 2; + rdxtree_nr_node_creations = 0; + + rdxtree_init(&tree); + obj = obj_create(1); + error = rdxtree_insert(&tree, obj->id, obj); + assert(!error); + obj = obj_create(64); + error = rdxtree_insert(&tree, obj->id, obj); + assert(error == ERR_NOMEM); + obj_destroy(obj); + print_tree(&tree); + destroy_tree(&tree); +} + int main(int argc, char *argv[]) { @@ -886,5 +979,9 @@ main(int argc, char *argv[]) test_30(); test_31(); test_32(); + test_33(); + test_34(); + test_35(); + test_36(); return 0; } |