summaryrefslogtreecommitdiff
path: root/tests/testmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/testmesg.c')
-rw-r--r--tests/testmesg.c173
1 files changed, 168 insertions, 5 deletions
diff --git a/tests/testmesg.c b/tests/testmesg.c
index 5525ff4..81c59ce 100644
--- a/tests/testmesg.c
+++ b/tests/testmesg.c
@@ -2,7 +2,7 @@
* Software License Agreement (BSD License) *
* Author: Sebastien Decugis <sdecugis@freediameter.net> *
* *
-* Copyright (c) 2015, WIDE Project and NICT *
+* Copyright (c) 2020, WIDE Project and NICT *
* All rights reserved. *
* *
* Redistribution and use of this software in source and binary forms, with or without modification, are *
@@ -164,6 +164,8 @@ int main(int argc, char *argv[])
/* Create the instance, using the templates */
CHECK( 0, fd_msg_new ( acr_model, 0, &acr ) );
+
+/* TODO: Do we need this recreated? acr is not used again . */
}
/* Now let's create some additional Dictionary objects for the test */
@@ -282,6 +284,11 @@ int main(int argc, char *argv[])
CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application, ENOENT ) );
CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_COMMAND, &cmd_data , application, &command ) );
+ ADD_RULE(command, 0, "Session-Id", RULE_FIXED_HEAD, 1, 1, 1);
+ ADD_RULE(command, 0, "Result-Code", RULE_OPTIONAL, 0, 1, 0);
+ ADD_RULE(command, 0, "Experimental-Result", RULE_OPTIONAL, 0, 1, 0);
+ ADD_RULE(command, 0, "Origin-Host", RULE_REQUIRED, 1, 1, 0);
+ ADD_RULE(command, 0, "Origin-Realm", RULE_REQUIRED, 1, 1, 0);
}
{
@@ -316,7 +323,19 @@ int main(int argc, char *argv[])
CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) );
CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) );
}
-
+
+ {
+ struct dict_object * type = NULL;
+ struct dict_type_data type_data = { AVP_TYPE_UNSIGNED32, "Enumerated(73565/Experimental-Result-Code)" };
+ struct dict_avp_data avp_data = { 73576, 73565, "Experimental-Result-Code", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_UNSIGNED32 };
+ struct dict_enumval_data val1 = { "DIAMETER_TEST_RESULT_1000", { .u32 = 1000 } };
+ struct dict_enumval_data val2 = { "DIAMETER_TEST_RESULT_5000", { .u32 = 5000 } };
+ CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) );
+ CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) );
+ CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val1 , type, NULL ) );
+ CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val2 , type, NULL ) );
+ }
+
#if 0
{
fd_log_debug("%s", fd_dict_dump_object(FD_DUMP_TEST_PARAMS, vendor));
@@ -680,21 +699,49 @@ int main(int argc, char *argv[])
{
struct dict_object * avp_model;
struct avp * found;
+ struct avp * grouped = NULL;
struct avp_hdr * avpdata = NULL;
- /* Now find the ACR dictionary object */
+ /* Now find the Test f32 AVP dictionary object */
CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "AVP Test - no vendor - f32", &avp_model, ENOENT ) );
CPYBUF();
CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) );
-
+ CHECK( 0, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) );
+#if 0
+ LOG_D("msg: %s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
+#endif
+
/* Search this AVP instance in the msg */
CHECK( 0, fd_msg_search_avp( msg, avp_model, &found ) );
/* Check the AVP value is 3.1415 */
CHECK( 0, fd_msg_avp_hdr ( found, &avpdata ) );
CHECK( 3.1415F, avpdata->avp_value->f32 );
-
+
+ /* Search for the first grouped message */
+ {
+ struct dict_avp_request grouped_req = { 73565, 0, "AVP Test - grouped"};
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &grouped_req, &avp_model, ENOENT ) );
+ }
+ CHECK( 0, fd_msg_search_avp( msg, avp_model, &grouped ) );
+#if 0
+ LOG_D("grouped: %s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, grouped, fd_g_config->cnf_dict, 0, 1));
+#endif
+
+ /* Find the first item in the grouped */
+ {
+ struct dict_avp_request avp_req = { 73565, 0, "AVP Test - os"};
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &avp_req, &avp_model, ENOENT ) );
+ }
+
+ CHECK( 0, fd_msg_search_avp( grouped, avp_model, &found ) );
+
+ /* Check the AVP value is "1" */
+ CHECK( 0, fd_msg_avp_hdr ( found, &avpdata ) );
+ CHECK( 8, avpdata->avp_value->os.len );
+ CHECK( 0, memcmp(avpdata->avp_value->os.data, "12345678", 8));
+
/* reinit the msg */
CHECK( 0, fd_msg_free ( msg ) );
@@ -1070,6 +1117,8 @@ int main(int argc, char *argv[])
fd_log_debug("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
TODO("Check the Failed-AVP is as expected");
+
+ CHECK( 0, fd_msg_free( msg ) );
}
}
@@ -1448,6 +1497,120 @@ int main(int argc, char *argv[])
CHECK( 0, fd_msg_free( msg ) );
}
}
+
+ /* Test the fd_msg_add_result function for Result-Code */
+ {
+ struct msg * msg = NULL;
+ struct dict_object * avp_model = NULL;
+ struct avp * rc = NULL;
+ struct avp_hdr * avpdata = NULL;
+
+ {
+ struct dict_object * cmd_model = NULL;
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) );
+
+ /* Create a message */
+ CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) );
+
+ /* Add a session id */
+ CHECK( 0, fd_msg_new_session( msg, (os0_t)"testmsg", strlen("testmsg") ) );
+
+ /* Find the DICT_TYPE Enumerated(Result-Code) */
+ struct dict_object * restype = NULL;
+ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(Result-Code)", &restype, ENOENT ) );
+
+ /* Now test the behavior of fd_msg_add_result for Result-Code AVP */
+ CHECK( 0, fd_msg_add_result(msg, 0, restype, "DIAMETER_SUCCESS", NULL, NULL, 1) );
+
+ LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
+ }
+
+ /* Ensure Result-Code is present */
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) );
+ CHECK( 0, fd_msg_search_avp( msg, avp_model, &rc ) );
+
+ /* Check the Result-Code AVP value is DIAMETER_SUCCESS */
+ CHECK( 0, fd_msg_avp_hdr ( rc, &avpdata ) );
+ CHECK( ER_DIAMETER_SUCCESS, avpdata->avp_value->u32 );
+
+ /* Ensure Experimental-Result is missing */
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) );
+ CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) );
+
+ /* Free msg */
+ CHECK( 0, fd_msg_free( msg ) );
+ }
+
+ /* Test the fd_msg_add_result function for Experimental-Result */
+ {
+ struct msg * msg = NULL;
+ struct dict_object * avp_model = NULL;
+ struct avp * er = NULL;
+ struct avp * erc = NULL;
+ struct avp_hdr * avpdata = NULL;
+
+ {
+ struct dict_object * cmd_model = NULL;
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) );
+
+ /* Create a message */
+ CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) );
+
+ /* Add a session id */
+ CHECK( 0, fd_msg_new_session( msg, (os0_t)"testmsg", strlen("testmsg") ) );
+
+ /* Find the DICT_TYPE Enumerated(73565/Experimental-Result-Code) */
+ struct dict_object * restype = NULL;
+ CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(73565/Experimental-Result-Code)", &restype, ENOENT ) );
+
+ /* Now test the behavior of fd_msg_add_result for Experimental-Result AVP */
+ CHECK( 0, fd_msg_add_result(msg, 73565, restype, "DIAMETER_TEST_RESULT_5000", NULL, NULL, 1) );
+
+ LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
+ }
+
+ /* Ensure Result-Code is missing */
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) );
+ CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) );
+
+ /* Ensure Experimental-Result is present */
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) );
+ CHECK( 0, fd_msg_search_avp( msg, avp_model, &er ) );
+
+ /* Ensure Experimental-Result-Code is present */
+ CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result-Code", &avp_model, ENOENT ) );
+ CHECK( 0, fd_msg_search_avp( er, avp_model, &erc ) );
+
+ /* Check the Experimental-Result-Code AVP value is 5000 */
+ CHECK( 0, fd_msg_avp_hdr ( erc, &avpdata ) );
+ CHECK( 5000, avpdata->avp_value->u32 );
+
+ /* Free msg */
+ CHECK( 0, fd_msg_free( msg ) );
+ }
+
+ /* Check IPv4 -> IPv6 and IPv6->IPv4 mapping */
+ {
+ struct in_addr i4;
+ memset(&i4, 0xff, sizeof(i4));
+ CHECK( 1, inet_pton( AF_INET, TEST_IP4, &i4 ) );
+
+ #define TEST_IP6MAP "::ffff:" TEST_IP4
+
+ struct in6_addr i6;
+ memset(&i6, 0xff, sizeof(i6));
+ IN6_ADDR_V4MAP(&i6.s6_addr, i4.s_addr);
+ char buf6[INET6_ADDRSTRLEN];
+ CHECK( 0, (inet_ntop( AF_INET6, &i6, buf6, sizeof(buf6) ) == NULL) ? errno : 0 );
+ LOG_D("buf6='%s'", buf6);
+ CHECK( 0, strcasecmp( buf6, TEST_IP6MAP ) );
+
+ struct in_addr o4;
+ o4.s_addr = IN6_ADDR_V4UNMAP(&i6);
+ char buf4[INET_ADDRSTRLEN];
+ CHECK( 0, (inet_ntop( AF_INET, &o4.s_addr, buf4, sizeof(buf4) ) == NULL) ? errno : 0 );
+ CHECK( 0, strcmp( buf4, TEST_IP4 ) );
+ }
/* That's all for the tests yet */
PASSTEST();