[asterisk-commits] russell: trunk r321752 - in /trunk: main/astobj2.c tests/test_astobj2.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jun 3 13:25:16 CDT 2011
Author: russell
Date: Fri Jun 3 13:25:11 2011
New Revision: 321752
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=321752
Log:
Fix some astobj2 iterator breakage, add another unit test.
Review: https://reviewboard.asterisk.org/r/1254/
Modified:
trunk/main/astobj2.c
trunk/tests/test_astobj2.c
Modified: trunk/main/astobj2.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/astobj2.c?view=diff&rev=321752&r1=321751&r2=321752
==============================================================================
--- trunk/main/astobj2.c (original)
+++ trunk/main/astobj2.c Fri Jun 3 13:25:11 2011
@@ -734,10 +734,6 @@
}
ast_free(cur); /* free the link record */
}
- if ((match) && (!(flags & OBJ_UNLINK))) {
- AST_LIST_REMOVE_CURRENT(entry);
- AST_LIST_INSERT_HEAD(&c->buckets[i], cur, entry);
- }
if ((match & CMP_STOP) || !(flags & OBJ_MULTIPLE)) {
/* We found our only (or last) match, so force an exit from
Modified: trunk/tests/test_astobj2.c
URL: http://svnview.digium.com/svn/asterisk/trunk/tests/test_astobj2.c?view=diff&rev=321752&r1=321751&r2=321752
==============================================================================
--- trunk/tests/test_astobj2.c (original)
+++ trunk/tests/test_astobj2.c Fri Jun 3 13:25:11 2011
@@ -364,16 +364,148 @@
return res;
}
+AST_TEST_DEFINE(astobj2_test_2)
+{
+ int res = AST_TEST_PASS;
+ struct ao2_container *c;
+ struct ao2_iterator i;
+ struct test_obj *obj;
+ int num;
+ static const int NUM_OBJS = 5;
+ int destructor_count = NUM_OBJS;
+ struct test_obj tmp_obj = { "", };
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "astobj2_test2";
+ info->category = "/main/astobj2/";
+ info->summary = "Test a certain scenario using ao2 iterators";
+ info->description =
+ "This test is aimed at testing for a specific regression that occurred. "
+ "Add some objects into a container. Mix finds and iteration and make "
+ "sure that the iterator still sees all objects.";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ c = ao2_container_alloc(1, NULL, test_cmp_cb);
+ if (!c) {
+ ast_test_status_update(test, "ao2_container_alloc failed.\n");
+ res = AST_TEST_FAIL;
+ goto cleanup;
+ }
+
+ for (num = 1; num <= NUM_OBJS; num++) {
+ if (!(obj = ao2_alloc(sizeof(struct test_obj), test_obj_destructor))) {
+ ast_test_status_update(test, "ao2_alloc failed.\n");
+ res = AST_TEST_FAIL;
+ goto cleanup;
+ }
+ obj->destructor_count = &destructor_count;
+ obj->i = num;
+ ao2_link(c, obj);
+ ao2_ref(obj, -1);
+ if (ao2_container_count(c) != num) {
+ ast_test_status_update(test, "container did not link correctly\n");
+ res = AST_TEST_FAIL;
+ }
+ }
+
+ /*
+ * Iteration take 1. Just make sure we see all NUM_OBJS objects.
+ */
+ num = 0;
+ i = ao2_iterator_init(c, 0);
+ while ((obj = ao2_iterator_next(&i))) {
+ num++;
+ ao2_ref(obj, -1);
+ }
+ ao2_iterator_destroy(&i);
+
+ if (num != NUM_OBJS) {
+ ast_test_status_update(test, "iterate take 1, expected '%d', only saw '%d' objects\n",
+ NUM_OBJS, num);
+ res = AST_TEST_FAIL;
+ }
+
+ /*
+ * Iteration take 2. Do a find for the last object, then iterate and make
+ * sure we find all NUM_OBJS objects.
+ */
+ tmp_obj.i = NUM_OBJS;
+ obj = ao2_find(c, &tmp_obj, OBJ_POINTER);
+ if (!obj) {
+ ast_test_status_update(test, "ao2_find() failed.\n");
+ res = AST_TEST_FAIL;
+ } else {
+ ao2_ref(obj, -1);
+ }
+
+ num = 0;
+ i = ao2_iterator_init(c, 0);
+ while ((obj = ao2_iterator_next(&i))) {
+ num++;
+ ao2_ref(obj, -1);
+ }
+ ao2_iterator_destroy(&i);
+
+ if (num != NUM_OBJS) {
+ ast_test_status_update(test, "iterate take 2, expected '%d', only saw '%d' objects\n",
+ NUM_OBJS, num);
+ res = AST_TEST_FAIL;
+ }
+
+ /*
+ * Iteration take 3. Do a find for an object while in the middle
+ * of iterating;
+ */
+ num = 0;
+ i = ao2_iterator_init(c, 0);
+ while ((obj = ao2_iterator_next(&i))) {
+ if (num == 1) {
+ struct test_obj *obj2;
+ tmp_obj.i = NUM_OBJS - 1;
+ obj2 = ao2_find(c, &tmp_obj, OBJ_POINTER);
+ if (!obj2) {
+ ast_test_status_update(test, "ao2_find() failed.\n");
+ res = AST_TEST_FAIL;
+ } else {
+ ao2_ref(obj2, -1);
+ }
+ }
+ num++;
+ ao2_ref(obj, -1);
+ }
+ ao2_iterator_destroy(&i);
+
+ if (num != NUM_OBJS) {
+ ast_test_status_update(test, "iterate take 3, expected '%d', only saw '%d' objects\n",
+ NUM_OBJS, num);
+ res = AST_TEST_FAIL;
+ }
+
+
+cleanup:
+ if (c) {
+ ao2_ref(c, -1);
+ }
+
+ return res;
+}
+
static int unload_module(void)
{
AST_TEST_UNREGISTER(astobj2_test_1);
+ AST_TEST_UNREGISTER(astobj2_test_2);
return 0;
}
static int load_module(void)
{
AST_TEST_REGISTER(astobj2_test_1);
+ AST_TEST_REGISTER(astobj2_test_2);
return AST_MODULE_LOAD_SUCCESS;
}
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ASTOBJ2 Unit Test");
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ASTOBJ2 Unit Tests");
More information about the asterisk-commits
mailing list