Prevent duplicate sorcery wizards from being applied to sorcery object types.
authorMark Michelson <mmichelson@digium.com>
Wed, 2 Apr 2014 18:57:29 +0000 (18:57 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 2 Apr 2014 18:57:29 +0000 (18:57 +0000)
This commit contains several changes to sorcery:

1) Application of sorcery configuration based on module name is automatically performed
when sorcery is opened for a module.
2) Sorcery will not attempt to apply the same wizard to an object type more than once.
3) Sorcery gives more exact results when attempting to apply a wizard, whether as the
default or based on configuration.

Sorcery unit tests still pass for me after making these changes.

Review: https://reviewboard.asterisk.org/r/3326
........

Merged revisions 411159 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@411656 65c4cc65-6c06-0410-ace0-fbb531ad65f3

configs/sorcery.conf.sample
include/asterisk/sorcery.h
main/bucket.c
main/sorcery.c
res/res_mwi_external.c
res/res_pjsip/config_system.c
res/res_pjsip/pjsip_configuration.c
tests/test_sorcery.c
tests/test_sorcery_astdb.c
tests/test_sorcery_realtime.c

index ee13003..7406214 100644 (file)
@@ -41,7 +41,7 @@
 ;
 ; The following object mappings are used by the unit test to test certain functionality of sorcery.
 ;
-[test_sorcery]
+[test_sorcery_section]
 test=memory
 
 [test_sorcery_cache]
index 026fb40..dad7349 100644 (file)
  * object types to their respective wizards (object storage modules). If the developer would like
  * to allow the user to configure this using the sorcery.conf configuration file the
  * \ref ast_sorcery_apply_config API call can be used to read in the configuration file and apply the
- * mappings. If the storage of the object types are such that a default wizard can be used this can
+ * mappings. \ref ast_sorcery_open will automatically call \ref ast_sorcery_apply_config to allow
+ * for configuration of objects using the same category name as the module that is opening the
+ * sorcery instance. Direct calls to \ref ast_sorcery_apply_config should only be performed if a
+ * module wishes to allow for additional configuration sections in sorcery.conf to be used.
+ * If the storage of the object types are such that a default wizard can be used this can
  * be applied using the \ref ast_sorcery_apply_default API call. Note that the default mappings will not
  * override configured mappings. They are only used in the case where no configured mapping exists.
  *
@@ -322,6 +326,9 @@ int ast_sorcery_wizard_unregister(const struct ast_sorcery_wizard *interface);
  *
  * \param module The module name (AST_MODULE)
  *
+ * When called, this will automatically also call __ast_sorcery_apply_config()
+ * with the module name as the configuration section.
+ *
  * \retval non-NULL success
  * \retval NULL if allocation failed
  */
@@ -343,6 +350,19 @@ struct ast_sorcery *__ast_sorcery_open(const char *module);
  */
 struct ast_sorcery *ast_sorcery_retrieve_by_module_name(const char *module);
 
+enum ast_sorcery_apply_result {
+       /*! Sorcery wizard failed to apply. */
+       AST_SORCERY_APPLY_FAIL = -1,
+       /*! Sorcery wizard applied successfully. */
+       AST_SORCERY_APPLY_SUCCESS = 0,
+       /*! Sorcery wizard has already been applied to the object type. */
+       AST_SORCERY_APPLY_DUPLICATE = 1,
+       /*! Default sorcery wizard is unnecessary since a wizard has already been applied to the object type. */
+       AST_SORCERY_APPLY_DEFAULT_UNNECESSARY = 2,
+       /*! No sorcery.conf configuration file was found to apply. */
+       AST_SORCERY_APPLY_NO_CONFIGURATION = 3,
+};
+
 /*!
  * \brief Apply configured wizard mappings
  *
@@ -350,10 +370,17 @@ struct ast_sorcery *ast_sorcery_retrieve_by_module_name(const char *module);
  * \param name Name of the category to use within the configuration file, normally the module name
  * \param module The module name (AST_MODULE)
  *
- * \retval 0 success
- * \retval -1 failure
+ * This function is called automatically by __ast_sorcery_open() using the module name as the
+ * configuration category. The only reason you should call this function is if your module
+ * wishes to apply configuration from additional sections of sorcery.conf.
+ *
+ * If a configuration section attempts to apply the same sorcery wizard to an object type
+ * more than once, the wizard will only be applied one time.
+ *
+ * \return What happened when attempting to apply the config.
  */
-int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, const char *module);
+enum ast_sorcery_apply_result __ast_sorcery_apply_config(struct ast_sorcery *sorcery,
+               const char *name, const char *module);
 
 #define ast_sorcery_apply_config(sorcery, name) \
        __ast_sorcery_apply_config((sorcery), (name), AST_MODULE)
@@ -367,14 +394,14 @@ int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, co
  * \param name Name of the wizard to use
  * \param data Data to be passed to wizard
  *
- * \retval 0 success
- * \retval -1 failure
+ * \return What occurred when applying the default
  *
  * \note This should be called *after* applying configuration sourced mappings
  *
  * \note Only a single default can exist per object type
  */
-int __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data);
+enum ast_sorcery_apply_result __ast_sorcery_apply_default(struct ast_sorcery *sorcery,
+               const char *type, const char *module, const char *name, const char *data);
 
 #define ast_sorcery_apply_default(sorcery, type, name, data) \
        __ast_sorcery_apply_default((sorcery), (type), AST_MODULE, (name), (data))
index f698c57..f021dff 100644 (file)
@@ -933,7 +933,7 @@ int ast_bucket_init(void)
                return -1;
        }
 
-       if (ast_sorcery_apply_default(bucket_sorcery, "bucket", "bucket", NULL)) {
+       if (ast_sorcery_apply_default(bucket_sorcery, "bucket", "bucket", NULL) == AST_SORCERY_APPLY_FAIL) {
                ast_log(LOG_ERROR, "Failed to apply intermediary for 'bucket' object type in Bucket sorcery\n");
                return -1;
        }
@@ -947,7 +947,7 @@ int ast_bucket_init(void)
        ast_sorcery_object_field_register_custom(bucket_sorcery, "bucket", "created", "", timeval_str2struct, timeval_struct2str, NULL, 0, FLDSET(struct ast_bucket, created));
        ast_sorcery_object_field_register_custom(bucket_sorcery, "bucket", "modified", "", timeval_str2struct, timeval_struct2str, NULL, 0, FLDSET(struct ast_bucket, modified));
 
-       if (ast_sorcery_apply_default(bucket_sorcery, "file", "bucket_file", NULL)) {
+       if (ast_sorcery_apply_default(bucket_sorcery, "file", "bucket_file", NULL) == AST_SORCERY_APPLY_FAIL) {
                ast_log(LOG_ERROR, "Failed to apply intermediary for 'file' object type in Bucket sorcery\n");
                return -1;
        }
index 4291530..9488dee 100644 (file)
@@ -580,6 +580,14 @@ struct ast_sorcery *__ast_sorcery_open(const char *module_name)
        }
 
        strcpy(sorcery->module_name, module_name); /* Safe */
+
+       if (__ast_sorcery_apply_config(sorcery, module_name, module_name) == AST_SORCERY_APPLY_FAIL) {
+               ast_log(LOG_ERROR, "Error attempting to apply configuration %s to sorcery.\n", module_name);
+               ao2_cleanup(sorcery);
+               sorcery = NULL;
+               goto done;
+       }
+
        ao2_link_flags(instances, sorcery, OBJ_NOLOCK);
 
 done:
@@ -623,7 +631,7 @@ static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *typ
        }
 
        /* Order matters for object wizards */
-       if (!(object_type->wizards = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, 1, NULL, NULL))) {
+       if (!(object_type->wizards = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, 1, NULL, sorcery_wizard_cmp))) {
                ao2_ref(object_type, -1);
                return NULL;
        }
@@ -685,7 +693,8 @@ static void sorcery_object_wizard_destructor(void *obj)
 }
 
 /*! \brief Internal function which creates an object type and adds a wizard mapping */
-static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data, unsigned int caching)
+static enum ast_sorcery_apply_result sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery,
+               const char *type, const char *module, const char *name, const char *data, unsigned int caching)
 {
        RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
        RAII_VAR(struct ast_sorcery_wizard *, wizard, ao2_find(wizards, name, OBJ_KEY), ao2_cleanup);
@@ -693,18 +702,30 @@ static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char
        int created = 0;
 
        if (!wizard || !object_wizard) {
-               return -1;
+               return AST_SORCERY_APPLY_FAIL;
        }
 
        if (!object_type) {
                if (!(object_type = sorcery_object_type_alloc(type, module))) {
-                       return -1;
+                       return AST_SORCERY_APPLY_FAIL;
                }
                created = 1;
        }
 
+       if (!created) {
+               struct ast_sorcery_wizard *found;
+
+               found = ao2_find(object_type->wizards, wizard, OBJ_SEARCH_OBJECT);
+               if (found) {
+                       ast_debug(1, "Wizard %s already applied to object type %s\n",
+                                       wizard->name, object_type->name);
+                       ao2_cleanup(found);
+                       return AST_SORCERY_APPLY_DUPLICATE;
+               }
+       }
+
        if (wizard->open && !(object_wizard->data = wizard->open(data))) {
-               return -1;
+               return AST_SORCERY_APPLY_FAIL;
        }
 
        ast_module_ref(wizard->module);
@@ -718,18 +739,22 @@ static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char
                ao2_link(sorcery->types, object_type);
        }
 
-       return 0;
+       return AST_SORCERY_APPLY_SUCCESS;
 }
 
-int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, const char *module)
+enum ast_sorcery_apply_result  __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, const char *module)
 {
        struct ast_flags flags = { 0 };
        struct ast_config *config = ast_config_load2("sorcery.conf", "sorcery", flags);
        struct ast_variable *mapping;
-       int res = 0;
+       int res = AST_SORCERY_APPLY_SUCCESS;
 
-       if (!config || config == CONFIG_STATUS_FILEINVALID) {
-               return -1;
+       if (!config) {
+               return AST_SORCERY_APPLY_NO_CONFIGURATION;
+       }
+
+       if (config == CONFIG_STATUS_FILEINVALID) {
+               return AST_SORCERY_APPLY_FAIL;
        }
 
        for (mapping = ast_variable_browse(config, name); mapping; mapping = mapping->next) {
@@ -752,8 +777,8 @@ int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, co
                }
 
                /* Any error immediately causes us to stop */
-               if (sorcery_apply_wizard_mapping(sorcery, type, module, wizard, data, caching)) {
-                       res = -1;
+               if (sorcery_apply_wizard_mapping(sorcery, type, module, wizard, data, caching) == AST_SORCERY_APPLY_FAIL) {
+                       res = AST_SORCERY_APPLY_FAIL;
                        break;
                }
        }
@@ -763,13 +788,13 @@ int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, co
        return res;
 }
 
-int __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data)
+enum ast_sorcery_apply_result __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data)
 {
        RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
 
        /* Defaults can not be added if any existing mapping exists */
        if (object_type) {
-               return -1;
+               return AST_SORCERY_APPLY_DEFAULT_UNNECESSARY;
        }
 
        return sorcery_apply_wizard_mapping(sorcery, type, module, name, data, 0);
index c3fc0ea..875f327 100644 (file)
@@ -163,10 +163,8 @@ static int mwi_sorcery_init(void)
        }
 
        /* Map the external MWI wizards. */
-       res = !!ast_sorcery_apply_config(mwi_sorcery, "res_mwi_external");
-       res &= !!ast_sorcery_apply_default(mwi_sorcery, MWI_MAILBOX_TYPE, "astdb",
-               MWI_ASTDB_PREFIX);
-       if (res) {
+       if (ast_sorcery_apply_default(mwi_sorcery, MWI_MAILBOX_TYPE, "astdb",
+                       MWI_ASTDB_PREFIX) == AST_SORCERY_APPLY_FAIL) {
                ast_log(LOG_ERROR, "MWI external: Sorcery could not setup wizards.\n");
                return -1;
        }
index f88b96b..7f8da85 100644 (file)
@@ -117,8 +117,6 @@ int ast_sip_initialize_system(void)
                return -1;
        }
 
-       ast_sorcery_apply_config(system_sorcery, "res_pjsip");
-
        ast_sorcery_apply_default(system_sorcery, "system", "config", "pjsip.conf,criteria=type=system");
 
        if (ast_sorcery_object_register_no_reload(system_sorcery, "system", system_alloc, NULL, system_apply)) {
index 164ca4a..857805a 100644 (file)
@@ -1619,8 +1619,6 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
                return -1;
        }
 
-       ast_sorcery_apply_config(sip_sorcery, "res_pjsip");
-
        ast_sip_initialize_cli();
 
        if (ast_sip_initialize_sorcery_auth()) {
index ed4d604..aa34a11 100644 (file)
@@ -306,7 +306,7 @@ static struct ast_sorcery *alloc_and_initialize_sorcery(void)
                return NULL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) ||
+       if ((ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) ||
                ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, NULL)) {
                ast_sorcery_unref(sorcery);
                return NULL;
@@ -452,17 +452,17 @@ AST_TEST_DEFINE(apply_default)
                return AST_TEST_FAIL;
        }
 
-       if (!ast_sorcery_apply_default(sorcery, "test", "dummy", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "dummy", NULL) != AST_SORCERY_APPLY_FAIL) {
                ast_test_status_update(test, "Successfully set a default wizard that doesn't exist\n");
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to set a known wizard as a default\n");
                return AST_TEST_FAIL;
        }
 
-       if (!ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_DEFAULT_UNNECESSARY) {
                ast_test_status_update(test, "Successfully set a default wizard on a type twice\n");
                return AST_TEST_FAIL;
        }
@@ -493,7 +493,7 @@ AST_TEST_DEFINE(apply_config)
                return AST_TEST_NOT_RUN;
        }
 
-       if (!ast_category_get(config, "test_sorcery")) {
+       if (!ast_category_get(config, "test_sorcery_section")) {
                ast_test_status_update(test, "Sorcery configuration file does not have test_sorcery section\n");
                ast_config_destroy(config);
                return AST_TEST_NOT_RUN;
@@ -506,7 +506,7 @@ AST_TEST_DEFINE(apply_config)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_config(sorcery, "test_sorcery")) {
+       if (ast_sorcery_apply_config(sorcery, "test_sorcery_section") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to apply configured object mappings\n");
                return AST_TEST_FAIL;
        }
@@ -535,7 +535,7 @@ AST_TEST_DEFINE(object_register)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to set a known wizard as a default\n");
                return AST_TEST_FAIL;
        }
@@ -608,7 +608,7 @@ AST_TEST_DEFINE(object_field_register)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to set a known wizard as a default\n");
                return AST_TEST_FAIL;
        }
@@ -657,7 +657,7 @@ AST_TEST_DEFINE(object_fields_register)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to set a known wizard as a default\n");
                return AST_TEST_FAIL;
        }
@@ -1192,7 +1192,7 @@ AST_TEST_DEFINE(objectset_create_regex)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) ||
+       if ((ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) ||
            ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, test_apply_handler)) {
                ast_test_status_update(test, "Failed to register 'test' object type\n");
                return AST_TEST_FAIL;
@@ -1292,7 +1292,7 @@ AST_TEST_DEFINE(objectset_apply_handler)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) ||
+       if ((ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) ||
            ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, test_apply_handler)) {
                ast_test_status_update(test, "Failed to register 'test' object type\n");
                return AST_TEST_FAIL;
@@ -1387,7 +1387,7 @@ AST_TEST_DEFINE(objectset_transform)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL)) {
+       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to set a known wizard as a default\n");
                return AST_TEST_FAIL;
        }
@@ -1453,7 +1453,7 @@ AST_TEST_DEFINE(objectset_apply_fields)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "memory", NULL) ||
+       if ((ast_sorcery_apply_default(sorcery, "test", "memory", NULL) != AST_SORCERY_APPLY_SUCCESS) ||
            ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, test_apply_handler)) {
                ast_test_status_update(test, "Failed to register 'test' object type\n");
                return AST_TEST_FAIL;
@@ -2244,7 +2244,7 @@ AST_TEST_DEFINE(caching_wizard_behavior)
                goto end;
        }
 
-       if (ast_sorcery_apply_config(sorcery, "test_sorcery_cache")) {
+       if (ast_sorcery_apply_config(sorcery, "test_sorcery_cache") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Failed to apply configured object mappings\n");
                goto end;
        }
@@ -2489,7 +2489,7 @@ AST_TEST_DEFINE(configuration_file_wizard)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
@@ -2552,7 +2552,7 @@ AST_TEST_DEFINE(configuration_file_wizard_with_file_integrity)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf,integrity=file")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf,integrity=file") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
@@ -2606,7 +2606,7 @@ AST_TEST_DEFINE(configuration_file_wizard_with_criteria)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf,criteria=type=zombies")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf,criteria=type=zombies") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
@@ -2665,7 +2665,7 @@ AST_TEST_DEFINE(configuration_file_wizard_retrieve_field)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
@@ -2728,7 +2728,7 @@ AST_TEST_DEFINE(configuration_file_wizard_retrieve_multiple)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
@@ -2799,7 +2799,7 @@ AST_TEST_DEFINE(configuration_file_wizard_retrieve_multiple_all)
                return AST_TEST_FAIL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf")) {
+       if (ast_sorcery_apply_default(sorcery, "test", "config", "test_sorcery.conf") != AST_SORCERY_APPLY_SUCCESS) {
                ast_test_status_update(test, "Could not set a default wizard of the 'config' type, so skipping since it may not be loaded\n");
                return AST_TEST_NOT_RUN;
        }
index 41e7adb..b87ed74 100644 (file)
@@ -60,7 +60,7 @@ static struct ast_sorcery *alloc_and_initialize_sorcery(void)
                return NULL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "astdb", "test") ||
+       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;
index 7cf42d2..e3d0a4b 100644 (file)
@@ -212,7 +212,7 @@ static struct ast_sorcery *alloc_and_initialize_sorcery(void)
                return NULL;
        }
 
-       if (ast_sorcery_apply_default(sorcery, "test", "realtime", "sorcery_realtime_test") ||
+       if ((ast_sorcery_apply_default(sorcery, "test", "realtime", "sorcery_realtime_test") != AST_SORCERY_APPLY_SUCCESS) ||
                ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, NULL) ||
                !(realtime_objects = ast_config_new())) {
                ast_sorcery_unref(sorcery);