Merge "doc/lang/language-criteria.txt: Link to wiki."
[asterisk/asterisk.git] / tests / test_core_format.c
index 2ae944b..164dff8 100644 (file)
@@ -31,8 +31,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/test.h"
 #include "asterisk/module.h"
 #include "asterisk/codec.h"
@@ -45,6 +43,7 @@ static int test_core_format_clone(const struct ast_format *src, struct ast_forma
 static enum ast_format_cmp_res test_core_format_cmp(const struct ast_format *format1, const struct ast_format *format2);
 static struct ast_format *test_core_format_get_joint(const struct ast_format *format1, const struct ast_format *format2);
 static struct ast_format *test_core_format_attribute_set(const struct ast_format *format, const char *name, const char *value);
+static const void *test_core_format_attribute_get(const struct ast_format *format, const char *name);
 static struct ast_format *test_core_format_parse_sdp_fmtp(const struct ast_format *format, const char *attributes);
 static void test_core_format_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str);
 
@@ -55,6 +54,7 @@ static struct ast_format_interface test_core_format_attr = {
        .format_cmp = &test_core_format_cmp,
        .format_get_joint = &test_core_format_get_joint,
        .format_attribute_set = &test_core_format_attribute_set,
+       .format_attribute_get = &test_core_format_attribute_get,
        .format_parse_sdp_fmtp = &test_core_format_parse_sdp_fmtp,
        .format_generate_sdp_fmtp = &test_core_format_generate_sdp_fmtp,
 };
@@ -202,6 +202,19 @@ static struct ast_format *test_core_format_attribute_set(const struct ast_format
        return clone;
 }
 
+/*! \brief Format attribute callback for retrieving an attribute */
+static const void *test_core_format_attribute_get(const struct ast_format *format, const char *name)
+{
+       struct test_core_format_pvt *pvt = ast_format_get_attribute_data(format);
+
+       if (!strcmp(name, "one")) {
+               return &pvt->field_one;
+       } else if (!strcmp(name, "two")) {
+               return &pvt->field_two;
+       }
+       return NULL;
+}
+
 /*! \brief Format attribute callback to construct a format from an SDP fmtp line */
 static struct ast_format *test_core_format_parse_sdp_fmtp(const struct ast_format *format, const char *attributes)
 {
@@ -232,7 +245,7 @@ static void test_core_format_generate_sdp_fmtp(const struct ast_format *format,
                return;
        }
 
-       ast_str_append(str, 0, "a=fmtp:%d one=%d;two=%d\r\n", payload, pvt->field_one, pvt->field_two);
+       ast_str_append(str, 0, "a=fmtp:%u one=%d;two=%d\r\n", payload, pvt->field_one, pvt->field_two);
 
        ++test_callbacks_called.format_generate_sdp_fmtp;
 }
@@ -333,6 +346,55 @@ AST_TEST_DEFINE(format_create_attr)
        return AST_TEST_PASS;
 }
 
+AST_TEST_DEFINE(format_retrieve_attr)
+{
+       RAII_VAR(struct ast_codec *, codec, NULL, ao2_cleanup);
+       RAII_VAR(struct ast_format *, format, NULL, ao2_cleanup);
+       RAII_VAR(struct ast_format *, format_w_attr, NULL, ao2_cleanup);
+
+       switch (cmd) {
+       case TEST_INIT:
+               info->name = __PRETTY_FUNCTION__;
+               info->category = TEST_CATEGORY;
+               info->summary = "Format attribute retrieval unit test";
+               info->description =
+                       "Test retrieval of format attributes";
+               return AST_TEST_NOT_RUN;
+       case TEST_EXECUTE:
+               break;
+       }
+
+       codec = ast_codec_get("test_core_format_codec", AST_MEDIA_TYPE_AUDIO, 8000);
+       if (!codec) {
+               ast_test_status_update(test, "Could not retrieve test_core_format_codec codec\n");
+               return AST_TEST_FAIL;
+       }
+
+       format = ast_format_create(codec);
+       if (!format) {
+               ast_test_status_update(test, "Could not create format using test_core_format_codec codec\n");
+               return AST_TEST_FAIL;
+       }
+
+       format_w_attr = ast_format_attribute_set(format, "one", "1");
+       if (!format_w_attr) {
+               ast_test_status_update(test, "Could not create format with attributes using test_core_format_codec codec\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (*((int *)ast_format_attribute_get(format_w_attr, "one")) != 1) {
+               ast_test_status_update(test, "Could not retrieve valid format attribute\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (ast_format_attribute_get(format_w_attr, "foo") != NULL) {
+               ast_test_status_update(test, "Retrieved invalid format attribute\n");
+               return AST_TEST_FAIL;
+       }
+
+       return AST_TEST_PASS;
+}
+
 AST_TEST_DEFINE(format_clone)
 {
        RAII_VAR(struct ast_codec *, codec, NULL, ao2_cleanup);
@@ -796,6 +858,7 @@ AST_TEST_DEFINE(format_attribute_set_without_interface)
 {
        RAII_VAR(struct ast_codec *, codec, NULL, ao2_cleanup);
        RAII_VAR(struct ast_format *, format, NULL, ao2_cleanup);
+       struct ast_format *attr_set;
 
        switch (cmd) {
        case TEST_INIT:
@@ -821,10 +884,49 @@ AST_TEST_DEFINE(format_attribute_set_without_interface)
                return AST_TEST_FAIL;
        }
 
-       if (!ast_format_attribute_set(format, "bees", "cool")) {
+       attr_set = ast_format_attribute_set(format, "bees", "cool");
+       if (!attr_set) {
                ast_test_status_update(test, "Successfully set an attribute on a format without an interface\n");
                return AST_TEST_FAIL;
        }
+       ao2_cleanup(attr_set);
+
+       return AST_TEST_PASS;
+}
+
+AST_TEST_DEFINE(format_attribute_get_without_interface)
+{
+       RAII_VAR(struct ast_codec *, codec, NULL, ao2_cleanup);
+       RAII_VAR(struct ast_format *, format, NULL, ao2_cleanup);
+
+       switch (cmd) {
+       case TEST_INIT:
+               info->name = __PRETTY_FUNCTION__;
+               info->category = TEST_CATEGORY;
+               info->summary = "Format attribute retrieval unit test";
+               info->description =
+                       "Test that attribute retrieval on a format without an interface fails";
+               return AST_TEST_NOT_RUN;
+       case TEST_EXECUTE:
+               break;
+       }
+
+       codec = ast_codec_get("ulaw", AST_MEDIA_TYPE_AUDIO, 8000);
+       if (!codec) {
+               ast_test_status_update(test, "Could not retrieve built-in ulaw codec\n");
+               return AST_TEST_FAIL;
+       }
+
+       format = ast_format_create(codec);
+       if (!format) {
+               ast_test_status_update(test, "Could not create format using built-in codec\n");
+               return AST_TEST_FAIL;
+       }
+
+       if (ast_format_attribute_get(format, "bees") != NULL) {
+               ast_test_status_update(test, "Successfully retrieved an attribute on a format without an interface\n");
+               return AST_TEST_FAIL;
+       }
 
        return AST_TEST_PASS;
 }
@@ -925,6 +1027,7 @@ static int unload_module(void)
 {
        AST_TEST_UNREGISTER(format_create);
        AST_TEST_UNREGISTER(format_create_attr);
+       AST_TEST_UNREGISTER(format_retrieve_attr);
        AST_TEST_UNREGISTER(format_clone);
        AST_TEST_UNREGISTER(format_cmp_same_codec);
        AST_TEST_UNREGISTER(format_attr_cmp_same_codec);
@@ -934,6 +1037,7 @@ static int unload_module(void)
        AST_TEST_UNREGISTER(format_joint_different_codec);
        AST_TEST_UNREGISTER(format_copy);
        AST_TEST_UNREGISTER(format_attribute_set_without_interface);
+       AST_TEST_UNREGISTER(format_attribute_get_without_interface);
        AST_TEST_UNREGISTER(format_parse_sdp_fmtp_without_interface);
        AST_TEST_UNREGISTER(format_parse_and_generate_sdp_fmtp);
 
@@ -955,6 +1059,7 @@ static int load_module(void)
 
        AST_TEST_REGISTER(format_create);
        AST_TEST_REGISTER(format_create_attr);
+       AST_TEST_REGISTER(format_retrieve_attr);
        AST_TEST_REGISTER(format_clone);
        AST_TEST_REGISTER(format_cmp_same_codec);
        AST_TEST_REGISTER(format_attr_cmp_same_codec);
@@ -964,6 +1069,7 @@ static int load_module(void)
        AST_TEST_REGISTER(format_joint_different_codec);
        AST_TEST_REGISTER(format_copy);
        AST_TEST_REGISTER(format_attribute_set_without_interface);
+       AST_TEST_REGISTER(format_attribute_get_without_interface);
        AST_TEST_REGISTER(format_parse_sdp_fmtp_without_interface);
        AST_TEST_REGISTER(format_parse_and_generate_sdp_fmtp);