diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-08-08 14:34:10 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-08-08 14:34:10 -0300 |
| commit | 56f96f0bdc6187ce19064d311c000656ae68008b (patch) | |
| tree | 104a7843861befbd4da34a66f03b85d7b9ea0df9 /tests/testmesg.c | |
| parent | 3e8d3ed13f58af810934de696c34bf5bf16ddcc6 (diff) | |
New upstream version 1.5.0upstream
Diffstat (limited to 'tests/testmesg.c')
| -rw-r--r-- | tests/testmesg.c | 173 |
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(); |
