123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638 |
- /*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2013, Digium, Inc.
- *
- * Joshua Colp <jcolp@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
- /*!
- * \file
- * \brief Sorcery Unit Tests
- *
- * \author Joshua Colp <jcolp@digium.com>
- *
- */
- /*** MODULEINFO
- <depend>TEST_FRAMEWORK</depend>
- <support_level>core</support_level>
- ***/
- #include "asterisk.h"
- ASTERISK_FILE_VERSION(__FILE__, "")
- #include "asterisk/test.h"
- #include "asterisk/module.h"
- #include "asterisk/sorcery.h"
- #include "asterisk/astdb.h"
- #include "asterisk/logger.h"
- /*! \brief Dummy sorcery object */
- struct test_sorcery_object {
- SORCERY_OBJECT(details);
- unsigned int bob;
- unsigned int joe;
- };
- /*! \brief Internal function to allocate a test object */
- static void *test_sorcery_object_alloc(const char *id)
- {
- return ast_sorcery_generic_alloc(sizeof(struct test_sorcery_object), NULL);
- }
- static struct ast_sorcery *alloc_and_initialize_sorcery(void)
- {
- struct ast_sorcery *sorcery;
- if (!(sorcery = ast_sorcery_open())) {
- return NULL;
- }
- if ((ast_sorcery_apply_default(sorcery, "test", "astdb", "test") != AST_SORCERY_APPLY_SUCCESS) ||
- ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, NULL)) {
- ast_sorcery_unref(sorcery);
- return NULL;
- }
- ast_sorcery_object_field_register_nodoc(sorcery, "test", "bob", "5", OPT_UINT_T, 0, FLDSET(struct test_sorcery_object, bob));
- ast_sorcery_object_field_register_nodoc(sorcery, "test", "joe", "10", OPT_UINT_T, 0, FLDSET(struct test_sorcery_object, joe));
- return sorcery;
- }
- static void deinitialize_sorcery(struct ast_sorcery *sorcery)
- {
- ast_db_deltree("test/test", NULL);
- ast_sorcery_unref(sorcery);
- }
- AST_TEST_DEFINE(object_create)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- char value[2];
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_create";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery astdb object creation unit test";
- info->description =
- "Test object creation in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- } else if (ast_db_get("test/test", "blah", value, sizeof(value))) {
- ast_test_status_update(test, "Object was apparently created but does not actually exist in astdb\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_retrieve_id)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_retrieve_id";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object retrieval using id unit test";
- info->description =
- "Test object retrieval using id in sorcery with astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah2"))) {
- ast_test_status_update(test, "Failed to allocate second instance of a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create second object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_retrieve_by_id(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to retrieve properly created object using id of 'blah'\n");
- return AST_TEST_FAIL;
- } else if (strcmp(ast_sorcery_object_get_id(obj), "blah")) {
- ast_test_status_update(test, "Retrieved object does not have correct id\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_retrieve_field)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- RAII_VAR(struct ast_variable *, fields, ast_variable_new("joe", "42", ""), ast_variables_destroy);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_retrieve_field";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object retrieval using a specific field unit test";
- info->description =
- "Test object retrieval using a specific field in sorcery with astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!fields) {
- ast_test_status_update(test, "Failed to create fields for object retrieval attempt\n");
- return AST_TEST_FAIL;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- obj->joe = 42;
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_retrieve_by_fields(sorcery, "test", AST_RETRIEVE_FLAG_DEFAULT, fields))) {
- ast_test_status_update(test, "Failed to retrieve properly created object using 'joe' field\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- ast_variables_destroy(fields);
- if (!(fields = ast_variable_new("joe", "49", ""))) {
- ast_test_status_update(test, "Failed to create fields for object retrieval attempt\n");
- return AST_TEST_FAIL;
- }
- if ((obj = ast_sorcery_retrieve_by_fields(sorcery, "test", AST_RETRIEVE_FLAG_DEFAULT, fields))) {
- ast_test_status_update(test, "Retrieved an object using a field with an in-correct value... that should not happen\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_retrieve_multiple_all)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- RAII_VAR(struct ao2_container *, objects, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_retrieve_multiple_all";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery multiple object retrieval unit test";
- info->description =
- "Test multiple object retrieval in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah2"))) {
- ast_test_status_update(test, "Failed to allocate second instance of a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create second object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- if (!(objects = ast_sorcery_retrieve_by_fields(sorcery, "test", AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL))) {
- ast_test_status_update(test, "Failed to retrieve a container of all objects\n");
- return AST_TEST_FAIL;
- } else if (ao2_container_count(objects) != 2) {
- ast_test_status_update(test, "Received a container with no objects in it when there should be some\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_retrieve_multiple_field)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- RAII_VAR(struct ao2_container *, objects, NULL, ao2_cleanup);
- RAII_VAR(struct ast_variable *, fields, ast_variable_new("joe >=", "6", ""), ast_variables_destroy);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_retrieve_multiple_field";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery multiple object retrieval unit test";
- info->description =
- "Test multiple object retrieval in sorcery using fields using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!fields) {
- ast_test_status_update(test, "Failed to create fields for multiple retrieve\n");
- return AST_TEST_FAIL;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- obj->joe = 6;
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- if (!(objects = ast_sorcery_retrieve_by_fields(sorcery, "test", AST_RETRIEVE_FLAG_MULTIPLE, fields))) {
- ast_test_status_update(test, "Failed to retrieve a container of all objects\n");
- return AST_TEST_FAIL;
- } else if (ao2_container_count(objects) != 1) {
- ast_test_status_update(test, "Received a container with no objects in it when there should be some\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(objects);
- ast_variables_destroy(fields);
- if (!(fields = ast_variable_new("joe <", "6", ""))) {
- ast_test_status_update(test, "Failed to create fields for multiple retrieval\n");
- return AST_TEST_FAIL;
- } else if (!(objects = ast_sorcery_retrieve_by_fields(sorcery, "test", AST_RETRIEVE_FLAG_MULTIPLE, fields))) {
- ast_test_status_update(test, "Failed to retrieve an empty container when retrieving multiple\n");
- return AST_TEST_FAIL;
- } else if (ao2_container_count(objects)) {
- ast_test_status_update(test, "Received a container with objects when there should be none in it\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_retrieve_regex)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- RAII_VAR(struct ao2_container *, objects, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_retrieve_regex";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery multiple object retrieval using regex unit test";
- info->description =
- "Test multiple object retrieval in sorcery using regular expression for matching using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah-98joe"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah-93joe"))) {
- ast_test_status_update(test, "Failed to allocate second instance of a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create second object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "neener-93joe"))) {
- ast_test_status_update(test, "Failed to allocate third instance of a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create third object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- if (!(objects = ast_sorcery_retrieve_by_regex(sorcery, "test", "^blah-"))) {
- 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");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_update)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- RAII_VAR(struct test_sorcery_object *, obj2, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_update";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object update unit test";
- info->description =
- "Test object updating in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- if (!(obj2 = ast_sorcery_copy(sorcery, obj))) {
- ast_test_status_update(test, "Failed to allocate a known object type for updating\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- obj2->bob = 1000;
- obj2->joe = 2000;
- if (ast_sorcery_update(sorcery, obj2)) {
- ast_test_status_update(test, "Failed to update sorcery with new object\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_retrieve_by_id(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to retrieve properly updated object\n");
- return AST_TEST_FAIL;
- } else if ((obj->bob != obj2->bob) || (obj->joe != obj2->joe)) {
- ast_test_status_update(test, "Object retrieved is not the updated object\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_update_uncreated)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_update_uncreated";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object update unit test";
- info->description =
- "Test updating of an uncreated object in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (!ast_sorcery_update(sorcery, obj)) {
- ast_test_status_update(test, "Successfully updated an object which has not been created yet\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_delete)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_delete";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object deletion unit test";
- info->description =
- "Test object deletion in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_create(sorcery, obj)) {
- ast_test_status_update(test, "Failed to create object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- if (ast_sorcery_delete(sorcery, obj)) {
- ast_test_status_update(test, "Failed to delete object using astdb wizard\n");
- return AST_TEST_FAIL;
- }
- ao2_cleanup(obj);
- if ((obj = ast_sorcery_retrieve_by_id(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Retrieved deleted object that should not be there\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- AST_TEST_DEFINE(object_delete_uncreated)
- {
- RAII_VAR(struct ast_sorcery *, sorcery, NULL, deinitialize_sorcery);
- RAII_VAR(struct test_sorcery_object *, obj, NULL, ao2_cleanup);
- switch (cmd) {
- case TEST_INIT:
- info->name = "object_delete_uncreated";
- info->category = "/res/sorcery_astdb/";
- info->summary = "sorcery object deletion unit test";
- info->description =
- "Test object deletion of an uncreated object in sorcery using astdb wizard";
- return AST_TEST_NOT_RUN;
- case TEST_EXECUTE:
- break;
- }
- if (!(sorcery = alloc_and_initialize_sorcery())) {
- ast_test_status_update(test, "Failed to open sorcery structure\n");
- return AST_TEST_FAIL;
- }
- if (!(obj = ast_sorcery_alloc(sorcery, "test", "blah"))) {
- ast_test_status_update(test, "Failed to allocate a known object type\n");
- return AST_TEST_FAIL;
- }
- if (!ast_sorcery_delete(sorcery, obj)) {
- ast_test_status_update(test, "Successfully deleted an object which was never created\n");
- return AST_TEST_FAIL;
- }
- return AST_TEST_PASS;
- }
- static int unload_module(void)
- {
- AST_TEST_UNREGISTER(object_create);
- AST_TEST_UNREGISTER(object_retrieve_id);
- AST_TEST_UNREGISTER(object_retrieve_field);
- AST_TEST_UNREGISTER(object_retrieve_multiple_all);
- AST_TEST_UNREGISTER(object_retrieve_multiple_field);
- AST_TEST_UNREGISTER(object_retrieve_regex);
- AST_TEST_UNREGISTER(object_update);
- AST_TEST_UNREGISTER(object_update_uncreated);
- AST_TEST_UNREGISTER(object_delete);
- AST_TEST_UNREGISTER(object_delete_uncreated);
- return 0;
- }
- static int load_module(void)
- {
- AST_TEST_REGISTER(object_create);
- AST_TEST_REGISTER(object_retrieve_id);
- AST_TEST_REGISTER(object_retrieve_field);
- AST_TEST_REGISTER(object_retrieve_multiple_all);
- AST_TEST_REGISTER(object_retrieve_multiple_field);
- AST_TEST_REGISTER(object_retrieve_regex);
- AST_TEST_REGISTER(object_update);
- AST_TEST_REGISTER(object_update_uncreated);
- AST_TEST_REGISTER(object_delete);
- AST_TEST_REGISTER(object_delete_uncreated);
- return AST_MODULE_LOAD_SUCCESS;
- }
- AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Sorcery astdb Wizard test module");
|