summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2013-06-07 22:08:33 +0200
committerRichard Braun <rbraun@sceen.net>2013-06-07 22:08:33 +0200
commit599cb4429d5c667599178714158f5d2090e34ad2 (patch)
tree4d6f06c62dc8fde066020fe99cbb045bddc4c782
parent47c14590225144d524841f35dcebebbebe7bfc35 (diff)
test_rdxtree: new tests covering node creation failures
-rw-r--r--rdxtree.c14
-rw-r--r--test/test_rdxtree.c97
2 files changed, 111 insertions, 0 deletions
diff --git a/rdxtree.c b/rdxtree.c
index 876794c..3aa8248 100644
--- a/rdxtree.c
+++ b/rdxtree.c
@@ -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;
}