void test_discard (void) { void *ptr1; void *ptr2; int ret; TEST_FUNCTION ("nih_discard"); /* Check that nih_discard works if the block has no parent, freeing * the object. The destructor should get called and nih_discard * should return that return value. */ TEST_FEATURE ("with no parent"); ptr1 = nih_alloc (NULL, 10); nih_alloc_set_destructor (ptr1, destructor_called); destructor_was_called = 0; ret = nih_discard (ptr1); TEST_TRUE (destructor_was_called); TEST_EQ (ret, 2); /* Check that nih_discard does nothing it the block has a parent. */ TEST_FEATURE ("with parent"); ptr2 = nih_alloc (NULL, 20); ptr1 = nih_alloc (ptr2, 10); nih_alloc_set_destructor (ptr1, destructor_called); destructor_was_called = 0; ret = nih_discard (ptr1); TEST_FALSE (destructor_was_called); TEST_EQ (ret, 0); nih_free (ptr2); /* Check that the destructor on any children also gets called, which * is as good a indication as any that the children are being freed. */ TEST_FEATURE ("with destructor on child"); ptr1 = nih_alloc (NULL, 10); ptr2 = nih_alloc (ptr1, 10); nih_alloc_set_destructor (ptr2, child_destructor_called); child_destructor_was_called = 0; ret = nih_discard (ptr1); TEST_TRUE (child_destructor_was_called); TEST_EQ (ret, 0); /* Check that both destructors on parent and children are called, * and that the return value from nih_discard is that of the parent's. */ TEST_FEATURE ("with child and destructors"); ptr1 = nih_alloc (NULL, 10); ptr2 = nih_alloc (ptr1, 10); nih_alloc_set_destructor (ptr1, destructor_called); nih_alloc_set_destructor (ptr2, child_destructor_called); destructor_was_called = 0; child_destructor_was_called = 0; ret = nih_discard (ptr1); TEST_TRUE (destructor_was_called); TEST_TRUE (child_destructor_was_called); TEST_EQ (ret, 2); }
void test_operator_new (void) { EventOperator *oper; char **env; TEST_FUNCTION ("event_operator_new"); /* Check that we can create a new EventOperator structure to match * an event, and have the details filled in and returned. It * should not be placed into any tree structure. */ TEST_FEATURE ("with EVENT_MATCH"); TEST_ALLOC_FAIL { oper = event_operator_new (NULL, EVENT_MATCH, "test", NULL); if (test_alloc_failed) { TEST_EQ_P (oper, NULL); continue; } TEST_ALLOC_SIZE (oper, sizeof (EventOperator)); TEST_EQ_P (oper->node.parent, NULL); TEST_EQ_P (oper->node.left, NULL); TEST_EQ_P (oper->node.right, NULL); TEST_EQ (oper->value, FALSE); TEST_EQ_STR (oper->name, "test"); TEST_ALLOC_PARENT (oper->name, oper); TEST_EQ_P (oper->env, NULL); TEST_EQ_P (oper->event, NULL); nih_free (oper); } /* Check that environment passed to event_operator_new is reparented * to belong to the structure itself. */ TEST_FEATURE ("with EVENT_MATCH and environment"); TEST_ALLOC_FAIL { TEST_ALLOC_SAFE { env = nih_str_array_new (NULL); NIH_MUST (nih_str_array_add (&env, NULL, NULL, "foo")); NIH_MUST (nih_str_array_add (&env, NULL, NULL, "BAR=frodo")); } oper = event_operator_new (NULL, EVENT_MATCH, "test", env); if (test_alloc_failed) { TEST_EQ_P (oper, NULL); TEST_ALLOC_PARENT (env, NULL); nih_free (env); continue; } nih_discard (env); TEST_ALLOC_SIZE (oper, sizeof (EventOperator)); TEST_EQ_P (oper->node.parent, NULL); TEST_EQ_P (oper->node.left, NULL); TEST_EQ_P (oper->node.right, NULL); TEST_EQ (oper->value, FALSE); TEST_EQ_STR (oper->name, "test"); TEST_ALLOC_PARENT (oper->name, oper); TEST_EQ_P (oper->env, env); TEST_ALLOC_PARENT (oper->env, oper); TEST_EQ_P (oper->event, NULL); nih_free (oper); } /* Check that an ordinary operator needs no name attached. */ TEST_FEATURE ("with EVENT_OR"); TEST_ALLOC_FAIL { oper = event_operator_new (NULL, EVENT_OR, NULL, NULL); if (test_alloc_failed) { TEST_EQ_P (oper, NULL); continue; } TEST_ALLOC_SIZE (oper, sizeof (EventOperator)); TEST_EQ_P (oper->node.parent, NULL); TEST_EQ_P (oper->node.left, NULL); TEST_EQ_P (oper->node.right, NULL); TEST_EQ (oper->value, FALSE); TEST_EQ_P (oper->name, NULL); TEST_EQ_P (oper->env, NULL); TEST_EQ_P (oper->event, NULL); nih_free (oper); } }