comparison tests/testmesg.c @ 1425:b09f1b4c9fad

fd_msg_add_result: add function Add fd_msg_add_result() as a superset of fd_msg_rescode_set() to allow setting of either Result-Code or Experimental-Result (Grouped), depending upon whether the supplied vendor is 0 or not. Reimplement fd_msg_rescode_set() in terms of fd_msg_add_result().
author Luke Mewburn <luke@mewburn.net>
date Wed, 19 Feb 2020 10:26:29 +1100
parents 67c263056d78
children 7c60cb0ac8c8
comparison
equal deleted inserted replaced
1424:c8057892e56b 1425:b09f1b4c9fad
280 struct dict_object * command = NULL; 280 struct dict_object * command = NULL;
281 struct dict_cmd_data cmd_data = { 73573, "Test-Command-Answer", CMD_FLAG_REQUEST, 0 }; 281 struct dict_cmd_data cmd_data = { 73573, "Test-Command-Answer", CMD_FLAG_REQUEST, 0 };
282 282
283 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application, ENOENT ) ); 283 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application, ENOENT ) );
284 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_COMMAND, &cmd_data , application, &command ) ); 284 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_COMMAND, &cmd_data , application, &command ) );
285 ADD_RULE(command, 0, "Session-Id", RULE_FIXED_HEAD, 1, 1, 1);
286 ADD_RULE(command, 0, "Result-Code", RULE_OPTIONAL, 0, 1, 0);
287 ADD_RULE(command, 0, "Experimental-Result", RULE_OPTIONAL, 0, 1, 0);
288 ADD_RULE(command, 0, "Origin-Host", RULE_REQUIRED, 1, 1, 0);
289 ADD_RULE(command, 0, "Origin-Realm", RULE_REQUIRED, 1, 1, 0);
285 } 290 }
286 291
287 { 292 {
288 struct dict_object * gavp = NULL; 293 struct dict_object * gavp = NULL;
289 struct dict_avp_data avp_data = { 73574, 73565, "AVP Test - rules", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED }; 294 struct dict_avp_data avp_data = { 73574, 73565, "AVP Test - rules", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED };
314 struct dict_type_data type_data = { AVP_TYPE_OCTETSTRING, "OS test2", NULL, NULL, NULL, fd_dictfct_CharInOS_check, "@." }; 319 struct dict_type_data type_data = { AVP_TYPE_OCTETSTRING, "OS test2", NULL, NULL, NULL, fd_dictfct_CharInOS_check, "@." };
315 struct dict_avp_data avp_data = { 73575, 73565, "AVP Test - os2", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_OCTETSTRING }; 320 struct dict_avp_data avp_data = { 73575, 73565, "AVP Test - os2", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_OCTETSTRING };
316 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); 321 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) );
317 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); 322 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) );
318 } 323 }
319 324
325 {
326 struct dict_object * type = NULL;
327 struct dict_type_data type_data = { AVP_TYPE_UNSIGNED32, "Enumerated(73565/Experimental-Result-Code)" };
328 struct dict_avp_data avp_data = { 73576, 73565, "Experimental-Result-Code", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_UNSIGNED32 };
329 struct dict_enumval_data val1 = { "DIAMETER_TEST_RESULT_1000", { .u32 = 1000 } };
330 struct dict_enumval_data val2 = { "DIAMETER_TEST_RESULT_5000", { .u32 = 5000 } };
331 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) );
332 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) );
333 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val1 , type, NULL ) );
334 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val2 , type, NULL ) );
335 }
336
320 #if 0 337 #if 0
321 { 338 {
322 fd_log_debug("%s", fd_dict_dump_object(FD_DUMP_TEST_PARAMS, vendor)); 339 fd_log_debug("%s", fd_dict_dump_object(FD_DUMP_TEST_PARAMS, vendor));
323 } 340 }
324 #endif 341 #endif
1475 1492
1476 CHECK( 0, fd_msg_free( msg ) ); 1493 CHECK( 0, fd_msg_free( msg ) );
1477 } 1494 }
1478 } 1495 }
1479 1496
1497 /* Test the fd_msg_add_result function for Result-Code */
1498 {
1499 struct msg * msg = NULL;
1500 struct dict_object * avp_model = NULL;
1501 struct avp * rc = NULL;
1502 struct avp_hdr * avpdata = NULL;
1503
1504 {
1505 struct dict_object * cmd_model = NULL;
1506 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) );
1507
1508 /* Create a message */
1509 CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) );
1510
1511 /* Add a session id */
1512 CHECK( 0, fd_msg_new_session( msg, (os0_t)"tm2", strlen("tm2") ) );
1513
1514 /* Find the DICT_TYPE Enumerated(Result-Code) */
1515 struct dict_object * restype = NULL;
1516 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(Result-Code)", &restype, ENOENT ) );
1517
1518 /* Now test the behavior of fd_msg_add_result for Result-Code AVP */
1519 CHECK( 0, fd_msg_add_result(msg, 0, restype, "DIAMETER_SUCCESS", NULL, NULL, 1) );
1520
1521 LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
1522 }
1523
1524 /* Ensure Result-Code is present */
1525 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) );
1526 CHECK( 0, fd_msg_search_avp( msg, avp_model, &rc ) );
1527
1528 /* Check the Result-Code AVP value is DIAMETER_SUCCESS */
1529 CHECK( 0, fd_msg_avp_hdr ( rc, &avpdata ) );
1530 CHECK( ER_DIAMETER_SUCCESS, avpdata->avp_value->u32 );
1531
1532 /* Ensure Experimental-Result is missing */
1533 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) );
1534 CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) );
1535
1536 /* Free msg */
1537 CHECK( 0, fd_msg_free( msg ) );
1538 }
1539
1540 /* Test the fd_msg_add_result function for Experimental-Result */
1541 {
1542 struct msg * msg = NULL;
1543 struct dict_object * avp_model = NULL;
1544 struct avp * er = NULL;
1545 struct avp * erc = NULL;
1546 struct avp_hdr * avpdata = NULL;
1547
1548 {
1549 struct dict_object * cmd_model = NULL;
1550 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Answer", &cmd_model, ENOENT ) );
1551
1552 /* Create a message */
1553 CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) );
1554
1555 /* Add a session id */
1556 CHECK( 0, fd_msg_new_session( msg, (os0_t)"tm2", strlen("tm2") ) );
1557
1558 /* Find the DICT_TYPE Enumerated(73565/Experimental-Result-Code) */
1559 struct dict_object * restype = NULL;
1560 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_TYPE, TYPE_BY_NAME, "Enumerated(73565/Experimental-Result-Code)", &restype, ENOENT ) );
1561
1562 /* Now test the behavior of fd_msg_add_result for Experimental-Result AVP */
1563 CHECK( 0, fd_msg_add_result(msg, 73565, restype, "DIAMETER_TEST_RESULT_5000", NULL, NULL, 1) );
1564
1565 LOG_D("%s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, fd_g_config->cnf_dict, 0, 1));
1566 }
1567
1568 /* Ensure Result-Code is missing */
1569 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &avp_model, ENOENT ) );
1570 CHECK( ENOENT, fd_msg_search_avp( msg, avp_model, NULL ) );
1571
1572 /* Ensure Experimental-Result is present */
1573 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result", &avp_model, ENOENT ) );
1574 CHECK( 0, fd_msg_search_avp( msg, avp_model, &er ) );
1575
1576 /* Ensure Experimental-Result-Code is present */
1577 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Experimental-Result-Code", &avp_model, ENOENT ) );
1578 CHECK( 0, fd_msg_search_avp( er, avp_model, &erc ) );
1579
1580 /* Check the Experimental-Result-Code AVP value is 5000 */
1581 CHECK( 0, fd_msg_avp_hdr ( erc, &avpdata ) );
1582 CHECK( 5000, avpdata->avp_value->u32 );
1583
1584 /* Free msg */
1585 CHECK( 0, fd_msg_free( msg ) );
1586 }
1587
1480 /* Check IPv4 -> IPv6 and IPv6->IPv4 mapping */ 1588 /* Check IPv4 -> IPv6 and IPv6->IPv4 mapping */
1481 { 1589 {
1482 struct in_addr i4; 1590 struct in_addr i4;
1483 memset(&i4, 0xff, sizeof(i4)); 1591 memset(&i4, 0xff, sizeof(i4));
1484 CHECK( 1, inet_pton( AF_INET, TEST_IP4, &i4 ) ); 1592 CHECK( 1, inet_pton( AF_INET, TEST_IP4, &i4 ) );
"Welcome to our mercurial repository"