diff --git a/configs/sorcery.conf.sample b/configs/sorcery.conf.sample index ee130036039a6e68572f984ef3d9ee8fcee1abd4..7406214fbe3f9f1d0f704015ee84e46dbd4ea60c 100644 --- a/configs/sorcery.conf.sample +++ b/configs/sorcery.conf.sample @@ -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] diff --git a/include/asterisk/sorcery.h b/include/asterisk/sorcery.h index 026fb4074bd379d23b59687323ad4277a85c12a7..dad7349b4c9f4d7eda6adc23c8cf73f367d408b0 100644 --- a/include/asterisk/sorcery.h +++ b/include/asterisk/sorcery.h @@ -39,7 +39,11 @@ * 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)) diff --git a/main/bucket.c b/main/bucket.c index f698c570b43fd4ec986f0168d5a28be628870e68..f021dffcffae3d0d4e963948a34e6d3f3bf94ea3 100644 --- a/main/bucket.c +++ b/main/bucket.c @@ -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; } diff --git a/main/sorcery.c b/main/sorcery.c index 4291530d19a74b5a89d81f8e4c9e87211e300544..9488dee4b2693dfb198c60c528321b11225af25f 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -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); diff --git a/res/res_mwi_external.c b/res/res_mwi_external.c index c3fc0eaf405c59ece461207099a66b7a242e9ebd..875f3277347a1d7ebd73e50b7b7d2bac27d19dd6 100644 --- a/res/res_mwi_external.c +++ b/res/res_mwi_external.c @@ -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; } diff --git a/res/res_pjsip/config_system.c b/res/res_pjsip/config_system.c index f88b96b895d3fd937776f1b259d6f4d916d917c4..7f8da85978e16f84d8cb6bceda061b8655d58acf 100644 --- a/res/res_pjsip/config_system.c +++ b/res/res_pjsip/config_system.c @@ -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)) { diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index 164ca4a0e68915111429a89bfea241b7a2fee35b..857805a8395cb13801f469acc17bd6ead9707a20 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -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()) { diff --git a/tests/test_sorcery.c b/tests/test_sorcery.c index ed4d604e6ba3f251201f969187037ff2312b5534..aa34a11d3a8f59dfa1fc459792c0b73d89fdf4e2 100644 --- a/tests/test_sorcery.c +++ b/tests/test_sorcery.c @@ -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; } diff --git a/tests/test_sorcery_astdb.c b/tests/test_sorcery_astdb.c index 41e7adbc95cf94444d6836e4beaf804a383f6166..b87ed74f8686a60bce9c25ab91a381c97d0e3d8c 100644 --- a/tests/test_sorcery_astdb.c +++ b/tests/test_sorcery_astdb.c @@ -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; diff --git a/tests/test_sorcery_realtime.c b/tests/test_sorcery_realtime.c index 7cf42d2107ee0e9867899b8705e3c29d4bcb928a..e3d0a4b3728e3f842bdf5964ac4569b48af7a1e2 100644 --- a/tests/test_sorcery_realtime.c +++ b/tests/test_sorcery_realtime.c @@ -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);