Mercurial > hg > freeDiameter
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 ) ); |