bridges/bridge_t38: Add a bridging module for managing T.38 state
[asterisk/asterisk.git] / tests / test_sorcery.c
index b6b3d09..5d96422 100644 (file)
@@ -138,6 +138,9 @@ struct sorcery_test_caching {
        /*! \brief Whether the object has been deleted from the cache or not */
        unsigned int deleted:1;
 
+       /*! \brief Whether the object is stale or not */
+       unsigned int is_stale:1;
+
        /*! \brief Object to return when asked */
        struct test_sorcery_object object;
 };
@@ -217,6 +220,12 @@ static int sorcery_test_delete(const struct ast_sorcery *sorcery, void *data, vo
        return 0;
 }
 
+static int sorcery_test_is_stale(const struct ast_sorcery *sorcery, void *data, void *object)
+{
+       cache.is_stale = 1;
+       return 1;
+}
+
 /*! \brief Dummy sorcery wizards, not actually used so we only populate the name and nothing else */
 static struct ast_sorcery_wizard test_wizard = {
        .name = "test",
@@ -234,6 +243,7 @@ static struct ast_sorcery_wizard test_wizard2 = {
        .retrieve_id = sorcery_test_retrieve_id,
        .update = sorcery_test_update,
        .delete = sorcery_test_delete,
+       .is_stale = sorcery_test_is_stale,
 };
 
 static void sorcery_observer_created(const void *object)
@@ -2223,6 +2233,84 @@ AST_TEST_DEFINE(object_delete_uncreated)
        return AST_TEST_PASS;
 }
 
+AST_TEST_DEFINE(object_is_stale)
+{
+       RAII_VAR(struct ast_sorcery *, sorcery, NULL, ast_sorcery_unref);
+       RAII_VAR(struct ast_sorcery_wizard *, wizard1, &test_wizard, ast_sorcery_wizard_unregister);
+       RAII_VAR(struct ast_sorcery_wizard *, wizard2, &test_wizard2, ast_sorcery_wizard_unregister);
+       RAII_VAR(struct test_sorcery_object *, obj1, NULL, ao2_cleanup);
+       RAII_VAR(struct test_sorcery_object *, obj2, NULL, ao2_cleanup);
+
+       switch (cmd) {
+       case TEST_INIT:
+               info->name = "object_is_stale";
+               info->category = "/main/sorcery/";
+               info->summary = "sorcery object staleness unit test";
+               info->description =
+                       "Test whether sorcery will query a wizard correctly if asked\n"
+                       "if an object is stale.";
+               return AST_TEST_NOT_RUN;
+       case TEST_EXECUTE:
+               break;
+       }
+
+       if (ast_sorcery_wizard_register(&test_wizard)) {
+               ast_test_status_update(test, "Failed to register a perfectly valid sorcery wizard\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (ast_sorcery_wizard_register(&test_wizard2)) {
+               ast_test_status_update(test, "Failed to register a perfectly valid sorcery wizard\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (!(sorcery = ast_sorcery_open())) {
+               ast_test_status_update(test, "Failed to open sorcery structure\n");
+               return AST_TEST_FAIL;
+       }
+
+       if ((ast_sorcery_apply_default(sorcery, "test", "test", NULL) != AST_SORCERY_APPLY_SUCCESS) ||
+               ast_sorcery_internal_object_register(sorcery, "test", test_sorcery_object_alloc, NULL, NULL)) {
+               return AST_TEST_FAIL;
+       }
+
+       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));
+       ast_sorcery_object_field_register_custom_nodoc(sorcery, "test", "jim", "444", jim_handler, NULL, jim_vl, 0, 0);
+       ast_sorcery_object_field_register_custom_nodoc(sorcery, "test", "jack", "888,999", jack_handler, jack_str, NULL, 0, 0);
+
+
+       if ((ast_sorcery_apply_default(sorcery, "test2", "test2", "test2data") != AST_SORCERY_APPLY_SUCCESS) ||
+               ast_sorcery_internal_object_register(sorcery, "test2", test_sorcery_object_alloc, NULL, NULL)) {
+               return AST_TEST_FAIL;
+       }
+
+       ast_sorcery_object_field_register_nodoc(sorcery, "test2", "bob", "5", OPT_UINT_T, 0, FLDSET(struct test_sorcery_object, bob));
+       ast_sorcery_object_field_register_nodoc(sorcery, "test2", "joe", "10", OPT_UINT_T, 0, FLDSET(struct test_sorcery_object, joe));
+       ast_sorcery_object_field_register_custom_nodoc(sorcery, "test2", "jim", "444", jim_handler, NULL, jim_vl, 0, 0);
+       ast_sorcery_object_field_register_custom_nodoc(sorcery, "test2", "jack", "888,999", jack_handler, jack_str, NULL, 0, 0);
+
+
+       if (!(obj1 = ast_sorcery_alloc(sorcery, "test", "blah"))) {
+               ast_test_status_update(test, "Failed to allocate a known object type\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (!(obj2 = ast_sorcery_alloc(sorcery, "test2", "blah"))) {
+               ast_test_status_update(test, "Failed to allocate a known object type\n");
+               return AST_TEST_FAIL;
+       }
+
+       /* The 'test' wizard has no is_stale callback */
+       ast_test_validate(test, ast_sorcery_is_stale(sorcery, obj1) == 0);
+
+       /* The 'test2' wizard should return stale */
+       ast_test_validate(test, ast_sorcery_is_stale(sorcery, obj2) == 1);
+       ast_test_validate(test, cache.is_stale == 1);
+
+       return AST_TEST_PASS;
+}
+
 AST_TEST_DEFINE(caching_wizard_behavior)
 {
        struct ast_flags flags = { CONFIG_FLAG_NOCACHE };
@@ -3505,6 +3593,7 @@ static int unload_module(void)
        AST_TEST_UNREGISTER(object_update_uncreated);
        AST_TEST_UNREGISTER(object_delete);
        AST_TEST_UNREGISTER(object_delete_uncreated);
+       AST_TEST_UNREGISTER(object_is_stale);
        AST_TEST_UNREGISTER(caching_wizard_behavior);
        AST_TEST_UNREGISTER(object_type_observer);
        AST_TEST_UNREGISTER(configuration_file_wizard);
@@ -3561,6 +3650,7 @@ static int load_module(void)
        AST_TEST_REGISTER(object_update_uncreated);
        AST_TEST_REGISTER(object_delete);
        AST_TEST_REGISTER(object_delete_uncreated);
+       AST_TEST_REGISTER(object_is_stale);
        AST_TEST_REGISTER(caching_wizard_behavior);
        AST_TEST_REGISTER(object_type_observer);
        AST_TEST_REGISTER(configuration_file_wizard);