summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_config.c533
-rw-r--r--tests/test_sorcery.c4
-rw-r--r--tests/test_sorcery_realtime.c15
3 files changed, 543 insertions, 9 deletions
diff --git a/tests/test_config.c b/tests/test_config.c
index a9a281ddc..b1f55c782 100644
--- a/tests/test_config.c
+++ b/tests/test_config.c
@@ -227,6 +227,533 @@ out:
return res;
}
+AST_TEST_DEFINE(config_basic_ops)
+{
+ enum ast_test_result_state res = AST_TEST_FAIL;
+ struct ast_config *cfg = NULL;
+ struct ast_category *cat = NULL;
+ struct ast_variable *var;
+ char temp[32];
+ const char *cat_name;
+ const char *var_value;
+ int i;
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "config_basic_ops";
+ info->category = "/main/config/";
+ info->summary = "Test basic config ops";
+ info->description = "Test basic config ops";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ cfg = ast_config_new();
+ if (!cfg) {
+ return res;
+ }
+
+ /* load the config */
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ ast_category_append(cfg, ast_category_new(temp, "dummy", -1));
+ }
+
+ /* test0 test1 test2 test3 test4 */
+ /* check the config has 5 elements */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, NULL))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* search for test2 */
+ cat = ast_category_get(cfg, "test2", NULL);
+ if (!cat || strcmp(ast_category_get_name(cat), "test2")) {
+ ast_test_status_update(test, "Get failed %s != %s\n", ast_category_get_name(cat), "test2");
+ goto out;
+ }
+
+ /* delete test2 */
+ cat = ast_category_delete(cfg, cat);
+
+ /* Now: test0 test1 test3 test4 */
+ /* make sure the curr category is test1 */
+ if (!cat || strcmp(ast_category_get_name(cat), "test1")) {
+ ast_test_status_update(test, "Delete failed %s != %s\n", ast_category_get_name(cat), "test1");
+ goto out;
+ }
+
+ /* Now: test0 test1 test3 test4 */
+ /* make sure the test2 is not found */
+ cat = ast_category_get(cfg, "test2", NULL);
+ if (cat) {
+ ast_test_status_update(test, "Should not have found test2\n");
+ goto out;
+ }
+
+ /* Now: test0 test1 test3 test4 */
+ /* make sure the sequence is correctly missing test2 */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, NULL))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ i++;
+ if (i == 2) {
+ i++;
+ }
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* insert test2 back in before test3 */
+ ast_category_insert(cfg, ast_category_new("test2", "dummy", -1), "test3");
+
+ /* Now: test0 test1 test2 test3 test4 */
+ /* make sure the sequence is correct again */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, NULL))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* Now: test0 test1 test2 test3 test4 */
+ /* make sure non filtered browse still works */
+ i = 0;
+ cat_name = NULL;
+ while ((cat_name = ast_category_browse(cfg, cat_name))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(cat_name, temp)) {
+ ast_test_status_update(test, "%s != %s\n", cat_name, temp);
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* append another test2 */
+ ast_category_append(cfg, ast_category_new("test2", "dummy", -1));
+ /* Now: test0 test1 test2 test3 test4 test2*/
+ /* make sure only test2's are returned */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, "test2", cat, NULL))) {
+ if (strcmp(ast_category_get_name(cat), "test2")) {
+ ast_test_status_update(test, "Should have returned test2 instead of %s\n", ast_category_get_name(cat));
+ goto out;
+ }
+ i++;
+ }
+ /* make sure 2 test2's were found */
+ if (i != 2) {
+ ast_test_status_update(test, "Should have found 2 test2's %d\n", i);
+ goto out;
+ }
+
+ /* Test in-flight deletion using ast_category_browse_filtered */
+ /* Now: test0 test1 test2 test3 test4 test2 */
+ /* Delete the middle test2 and continue */
+ cat = NULL;
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat = ast_category_browse_filtered(cfg, NULL, cat, NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, temp)) {
+ ast_test_status_update(test, "Should have returned %s instead of %s: %d\n", temp, cat_name, i);
+ goto out;
+ }
+ if (i == 2) {
+ cat = ast_category_delete(cfg, cat);
+ }
+ }
+
+ /* Now: test0 test1 test3 test4 test2 */
+ /* Test in-flight deletion using ast_category_browse */
+ /* Delete test1 and continue */
+ cat_name = NULL;
+ for(i = 0; i < 5; i++) {
+ if (i == 2) { /* 2 was already deleted above */
+ continue;
+ }
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat_name = ast_category_browse(cfg, cat_name);
+ cat = ast_category_get(cfg, cat_name, NULL);
+ if (strcmp(cat_name, temp)) {
+ ast_test_status_update(test, "Should have returned %s instead of %s: %d\n", temp, cat_name, i);
+ goto out;
+ }
+ if (i == 1) {
+ ast_category_delete(cfg, cat);
+ }
+ }
+
+ /* Now: test0 test3 test4 test2 */
+ /* delete the head item */
+ cat = ast_category_browse_filtered(cfg, NULL, NULL, NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, "test0")) {
+ ast_test_status_update(test, "Should have returned test0 instead of %s\n", cat_name);
+ goto out;
+ }
+ ast_category_delete(cfg, cat);
+ /* Now: test3 test4 test2 */
+
+ /* make sure head got updated to the new first element */
+ cat = ast_category_browse_filtered(cfg, NULL, NULL, NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, "test3")) {
+ ast_test_status_update(test, "Should have returned test3 instead of %s\n", cat_name);
+ goto out;
+ }
+
+ /* delete the tail item */
+ cat = ast_category_get(cfg, "test2", NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, "test2")) {
+ ast_test_status_update(test, "Should have returned test2 instead of %s\n", cat_name);
+ goto out;
+ }
+ ast_category_delete(cfg, cat);
+ /* Now: test3 test4 */
+
+ /* There should now only be 2 elements in the list */
+ cat = NULL;
+ cat = ast_category_browse_filtered(cfg, NULL, cat, NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, "test3")) {
+ ast_test_status_update(test, "Should have returned test3 instead of %s\n", cat_name);
+ goto out;
+ }
+
+ cat = ast_category_browse_filtered(cfg, NULL, cat, NULL);
+ cat_name = ast_category_get_name(cat);
+ if (strcmp(cat_name, "test4")) {
+ ast_test_status_update(test, "Should have returned test4 instead of %s\n", cat_name);
+ goto out;
+ }
+
+ /* There should be nothing more */
+ cat = ast_category_browse_filtered(cfg, NULL, cat, NULL);
+ if (cat) {
+ ast_test_status_update(test, "Should not have returned anything\n");
+ goto out;
+ }
+
+ /* Test ast_variable retrieve.
+ * Get the second category.
+ */
+ cat = ast_category_browse_filtered(cfg, NULL, NULL, NULL);
+ cat = ast_category_browse_filtered(cfg, NULL, cat, NULL);
+ cat_name = ast_category_get_name(cat);
+ var = ast_variable_new("aaa", "bbb", "dummy");
+ if (!var) {
+ ast_test_status_update(test, "Couldn't allocate variable.\n");
+ goto out;
+ }
+ ast_variable_append(cat, var);
+
+ /* Make sure we can retrieve with specific category name */
+ var_value = ast_variable_retrieve(cfg, cat_name, "aaa");
+ if (!var_value || strcmp(var_value, "bbb")) {
+ ast_test_status_update(test, "Variable not found or wrong value.\n");
+ goto out;
+ }
+
+ /* Make sure we can retrieve with NULL category name */
+ var_value = ast_variable_retrieve(cfg, NULL, "aaa");
+ if (!var_value || strcmp(var_value, "bbb")) {
+ ast_test_status_update(test, "Variable not found or wrong value.\n");
+ goto out;
+ }
+
+ res = AST_TEST_PASS;
+
+out:
+ ast_config_destroy(cfg);
+ return res;
+}
+
+AST_TEST_DEFINE(config_filtered_ops)
+{
+ enum ast_test_result_state res = AST_TEST_FAIL;
+ struct ast_config *cfg = NULL;
+ struct ast_category *cat = NULL;
+ char temp[32];
+ const char *value;
+ int i;
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "config_filtered_ops";
+ info->category = "/main/config/";
+ info->summary = "Test filtered config ops";
+ info->description = "Test filtered config ops";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ cfg = ast_config_new();
+ if (!cfg) {
+ return res;
+ }
+
+ /* load the config */
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat = ast_category_new(temp, "dummy", -1);
+ ast_variable_insert(cat, ast_variable_new("type", "a", "dummy"), "0");
+ ast_category_append(cfg, cat);
+ }
+
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat = ast_category_new(temp, "dummy", -1);
+ ast_variable_insert(cat, ast_variable_new("type", "b", "dummy"), "0");
+ ast_category_append(cfg, cat);
+ }
+
+ /* check the config has 5 elements for each type*/
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "type=a"))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ value = ast_variable_find(cat, "type");
+ if (!value || strcmp(value, "a")) {
+ ast_test_status_update(test, "Type %s != %s\n", "a", value);
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "type=b"))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (!cat || strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ value = ast_variable_find(cat, "type");
+ if (!value || strcmp(value, "b")) {
+ ast_test_status_update(test, "Type %s != %s\n", "b", value);
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* Delete b3 and make sure it's gone and a3 is still there.
+ * Really this is a test of get since delete takes a specific category structure.
+ */
+ cat = ast_category_get(cfg, "test3", "type=b");
+ value = ast_variable_find(cat, "type");
+ if (strcmp(value, "b")) {
+ ast_test_status_update(test, "Type %s != %s\n", "b", value);
+ goto out;
+ }
+ ast_category_delete(cfg, cat);
+
+ cat = ast_category_get(cfg, "test3", "type=b");
+ if (cat) {
+ ast_test_status_update(test, "Category b was not deleted.\n");
+ goto out;
+ }
+
+ cat = ast_category_get(cfg, "test3", "type=a");
+ if (!cat) {
+ ast_test_status_update(test, "Category a was deleted.\n");
+ goto out;
+ }
+
+ value = ast_variable_find(cat, "type");
+ if (strcmp(value, "a")) {
+ ast_test_status_update(test, "Type %s != %s\n", value, "a");
+ goto out;
+ }
+
+ /* Basic regex stuff is handled by regcomp/regexec so not testing here.
+ * Still need to test multiple name/value pairs though.
+ */
+ ast_category_empty(cat);
+ ast_variable_insert(cat, ast_variable_new("type", "bx", "dummy"), "0");
+ ast_variable_insert(cat, ast_variable_new("e", "z", "dummy"), "0");
+
+ cat = ast_category_get(cfg, "test3", "type=.,e=z");
+ if (!cat) {
+ ast_test_status_update(test, "Category not found.\n");
+ goto out;
+ }
+
+ cat = ast_category_get(cfg, "test3", "type=.,e=zX");
+ if (cat) {
+ ast_test_status_update(test, "Category found.\n");
+ goto out;
+ }
+
+ cat = ast_category_get(cfg, "test3", "TEMPLATE=restrict,type=.,e=z");
+ if (cat) {
+ ast_test_status_update(test, "Category found.\n");
+ goto out;
+ }
+
+ res = AST_TEST_PASS;
+
+out:
+ ast_config_destroy(cfg);
+ return res;
+}
+
+AST_TEST_DEFINE(config_template_ops)
+{
+ enum ast_test_result_state res = AST_TEST_FAIL;
+ struct ast_config *cfg = NULL;
+ struct ast_category *cat = NULL;
+ char temp[32];
+ const char *value;
+ int i;
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "config_template_ops";
+ info->category = "/main/config/";
+ info->summary = "Test template config ops";
+ info->description = "Test template config ops";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ cfg = ast_config_new();
+ if (!cfg) {
+ return res;
+ }
+
+ /* load the config with 5 templates and 5 regular */
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat = ast_category_new_template(temp, "dummy", -1);
+ ast_variable_insert(cat, ast_variable_new("type", "a", "dummy"), "0");
+ ast_category_append(cfg, cat);
+ }
+
+ for(i = 0; i < 5; i++) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ cat = ast_category_new(temp, "dummy", -1);
+ ast_variable_insert(cat, ast_variable_new("type", "b", "dummy"), "0");
+ ast_category_append(cfg, cat);
+ }
+
+ /* check the config has 5 template elements of type a */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "TEMPLATES=restrict,type=a"))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ value = ast_variable_find(cat, "type");
+ if (!value || strcmp(value, "a")) {
+ ast_test_status_update(test, "Type %s != %s\n", value, "a");
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* Test again with 'include'. There should still only be 5 (type a) */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "TEMPLATES=include,type=a"))) {
+ snprintf(temp, sizeof(temp), "test%d", i);
+ if (strcmp(ast_category_get_name(cat), temp)) {
+ ast_test_status_update(test, "%s != %s\n", ast_category_get_name(cat), temp);
+ goto out;
+ }
+ value = ast_variable_find(cat, "type");
+ if (!value || strcmp(value, "a")) {
+ ast_test_status_update(test, "Type %s != %s\n", value, "a");
+ goto out;
+ }
+ i++;
+ }
+ if (i != 5) {
+ ast_test_status_update(test, "There were %d matches instead of 5.\n", i);
+ goto out;
+ }
+
+ /* Test again with 'include' but no type. There should now be 10 (type a and type b) */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "TEMPLATES=include"))) {
+ i++;
+ }
+ if (i != 10) {
+ ast_test_status_update(test, "There were %d matches instead of 10.\n", i);
+ goto out;
+ }
+
+ /* Test again with 'restrict' and type b. There should 0 */
+ i = 0;
+ cat = NULL;
+ while ((cat = ast_category_browse_filtered(cfg, NULL, cat, "TEMPLATES=restrict,type=b"))) {
+ i++;
+ }
+ if (i != 0) {
+ ast_test_status_update(test, "There were %d matches instead of 0.\n", i);
+ goto out;
+ }
+
+ res = AST_TEST_PASS;
+
+out:
+ ast_config_destroy(cfg);
+ return res;
+}
+
/*!
* \brief Write the config file to disk
*
@@ -937,6 +1464,9 @@ AST_TEST_DEFINE(config_options_test)
static int unload_module(void)
{
+ AST_TEST_UNREGISTER(config_basic_ops);
+ AST_TEST_UNREGISTER(config_filtered_ops);
+ AST_TEST_UNREGISTER(config_template_ops);
AST_TEST_UNREGISTER(copy_config);
AST_TEST_UNREGISTER(config_hook);
AST_TEST_UNREGISTER(ast_parse_arg_test);
@@ -946,6 +1476,9 @@ static int unload_module(void)
static int load_module(void)
{
+ AST_TEST_REGISTER(config_basic_ops);
+ AST_TEST_REGISTER(config_filtered_ops);
+ AST_TEST_REGISTER(config_template_ops);
AST_TEST_REGISTER(copy_config);
AST_TEST_REGISTER(config_hook);
AST_TEST_REGISTER(ast_parse_arg_test);
diff --git a/tests/test_sorcery.c b/tests/test_sorcery.c
index 2d811b19e..cbdec0ce1 100644
--- a/tests/test_sorcery.c
+++ b/tests/test_sorcery.c
@@ -493,7 +493,7 @@ AST_TEST_DEFINE(apply_config)
return AST_TEST_NOT_RUN;
}
- if (!ast_category_get(config, "test_sorcery_section")) {
+ if (!ast_category_get(config, "test_sorcery_section", NULL)) {
ast_test_status_update(test, "Sorcery configuration file does not have test_sorcery section\n");
ast_config_destroy(config);
return AST_TEST_NOT_RUN;
@@ -2226,7 +2226,7 @@ AST_TEST_DEFINE(caching_wizard_behavior)
return AST_TEST_NOT_RUN;
}
- if (!ast_category_get(config, "test_sorcery_cache")) {
+ if (!ast_category_get(config, "test_sorcery_cache", NULL)) {
ast_test_status_update(test, "Sorcery configuration file does not contain 'test_sorcery_cache' section\n");
ast_config_destroy(config);
return AST_TEST_NOT_RUN;
diff --git a/tests/test_sorcery_realtime.c b/tests/test_sorcery_realtime.c
index b64ad9389..ab9c18814 100644
--- a/tests/test_sorcery_realtime.c
+++ b/tests/test_sorcery_realtime.c
@@ -139,15 +139,15 @@ static struct ast_config *realtime_sorcery_multi(const char *database, const cha
static int realtime_sorcery_update(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
{
- struct ast_category *object;
+ struct ast_category *object, *found;
- if (!ast_category_exist(realtime_objects, entity)) {
+ if (!(found = ast_category_get(realtime_objects, entity, NULL))) {
return 0;
} else if (!(object = ast_category_new(entity, "", 0))) {
return -1;
}
- ast_category_delete(realtime_objects, entity);
+ ast_category_delete(realtime_objects, found);
ast_variable_append(object, ast_variables_dup((struct ast_variable*)fields));
ast_variable_append(object, ast_variable_new(keyfield, entity, ""));
ast_category_append(realtime_objects, object);
@@ -161,7 +161,7 @@ static int realtime_sorcery_store(const char *database, const char *table, const
const struct ast_variable *keyfield = realtime_find_variable(fields, "id");
struct ast_category *object;
- if (!keyfield || ast_category_exist(realtime_objects, keyfield->value) || !(object = ast_category_new(keyfield->value, "", 0))) {
+ if (!keyfield || ast_category_exist(realtime_objects, keyfield->value, NULL) || !(object = ast_category_new(keyfield->value, "", 0))) {
return -1;
}
@@ -173,11 +173,12 @@ static int realtime_sorcery_store(const char *database, const char *table, const
static int realtime_sorcery_destroy(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
{
- if (!ast_category_exist(realtime_objects, entity)) {
+ struct ast_category *found;
+ if (!(found = ast_category_get(realtime_objects, entity, NULL))) {
return 0;
}
- ast_category_delete(realtime_objects, entity);
+ ast_category_delete(realtime_objects, found);
return 1;
}
@@ -570,7 +571,7 @@ AST_TEST_DEFINE(object_retrieve_regex)
ast_test_status_update(test, "Failed to retrieve a container of objects\n");
return AST_TEST_FAIL;
} else if (ao2_container_count(objects) != 2) {
- ast_test_status_update(test, "Received a container with incorrect number of objects in it\n");
+ ast_test_status_update(test, "Received a container with incorrect number of objects in it: %d instead of 2\n", ao2_container_count(objects));
return AST_TEST_FAIL;
}