Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Functions | Variables
test_aoc.c File Reference

Generic AOC encode decode tests. More...

#include "asterisk.h"
#include "asterisk/utils.h"
#include "asterisk/module.h"
#include "asterisk/test.h"
#include "asterisk/aoc.h"
Include dependency graph for test_aoc.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
 AST_TEST_DEFINE (aoc_encode_decode_test)
 
 AST_TEST_DEFINE (aoc_event_generation_test)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "AOC unit tests" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

Generic AOC encode decode tests.

Author
David Vossel dvoss.nosp@m.el@d.nosp@m.igium.nosp@m..com

Definition in file test_aoc.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 689 of file test_aoc.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 689 of file test_aoc.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 689 of file test_aoc.c.

◆ AST_TEST_DEFINE() [1/2]

AST_TEST_DEFINE ( aoc_encode_decode_test  )

Definition at line 309 of file test_aoc.c.

310{
311 int res = AST_TEST_PASS;
312 struct ast_aoc_decoded *decoded;
313
314 switch (cmd) {
315 case TEST_INIT:
316 info->name = "aoc_encode_decode_test";
317 info->category = "/main/aoc/";
318 info->summary = "Advice of Charge encode and decode test";
319 info->description =
320 "This tests the Advice of Charge encode and decode routines.";
321 return AST_TEST_NOT_RUN;
322 case TEST_EXECUTE:
323 break;
324 }
325
326 /* ---- Test 1 ---- create AOC-D message, encode message, and decode message once again. */
327 /* create AOC-D message */
328 if (!(decoded = ast_aoc_create(AST_AOC_D, AST_AOC_CHARGE_CURRENCY, 0)) ||
329 (ast_aoc_get_msg_type(decoded) != AST_AOC_D) ||
331
332 ast_test_status_update(test, "Test 1: failed to create AOC-D message\n");
333 res = AST_TEST_FAIL;
334 goto cleanup_aoc_test;
335 }
336
337 /* Add billing id information */
340
341 ast_test_status_update(test, "TEST 1, could not set billing id correctly\n");
342 res = AST_TEST_FAIL;
343 goto cleanup_aoc_test;
344
345 }
346
347 /* Set currency information, verify results*/
348 if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "usd")) ||
351 (ast_aoc_get_currency_amount(decoded) != 100) ||
353 (strcmp(ast_aoc_get_currency_name(decoded), "usd"))) {
354
355 ast_test_status_update(test, "Test 1: failed to set currency info\n");
356 res = AST_TEST_FAIL;
357 goto cleanup_aoc_test;
358 }
359
360 /* Set a currency name larger than 10 characters which is the maximum
361 * length allowed by the ETSI aoc standard. The name is expected to truncate
362 * to 10 characters. */
363 if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "12345678901234567890")) ||
364 (ast_aoc_get_currency_amount(decoded) != 100) ||
366 (strcmp(ast_aoc_get_currency_name(decoded), "1234567890"))) {
367
368 ast_test_status_update(test, "Test 1: failed to set currency info currency name exceeding limit\n");
369 res = AST_TEST_FAIL;
370 goto cleanup_aoc_test;
371 }
372
373 /* Encode the message */
375 ast_test_status_update(test, "Test1: encode decode routine did not match expected results \n");
376 res = AST_TEST_FAIL;
377 goto cleanup_aoc_test;
378 }
379 /* cleanup decoded msg */
380 decoded = ast_aoc_destroy_decoded(decoded);
381
382 /* ---- Test 2 ---- create AOC-E message with charge type == unit */
383 /* create AOC-E message */
384 if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_UNIT, 0)) ||
385 (ast_aoc_get_msg_type(decoded) != AST_AOC_E) ||
387
388 ast_test_status_update(test, "Test 2: failed to create AOC-E message\n");
389 res = AST_TEST_FAIL;
390 goto cleanup_aoc_test;
391 }
392
393 /* Set unit information, verify results*/
394 if ((ast_aoc_add_unit_entry(decoded, 1, 1, 1, 2)) ||
395 (!ast_aoc_add_unit_entry(decoded, 0, 123, 0, 123)) || /* this entry should fail since either number nor type are present */
396 (ast_aoc_add_unit_entry(decoded, 0, 2, 1, 3)) ||
397 (ast_aoc_add_unit_entry(decoded, 1, 3, 0, 4))) {
398
399 ast_test_status_update(test, "Test 2: failed to set unit info\n");
400 res = AST_TEST_FAIL;
401 goto cleanup_aoc_test;
402 }
403
404 /* verify unit list is correct */
405 if (ast_aoc_get_unit_count(decoded) == 3) {
406 int i;
407 const struct ast_aoc_unit_entry *unit;
408 for (i = 0; i < 3; i++) {
409 if (!(unit = ast_aoc_get_unit_info(decoded, i)) ||
410 ((unit->valid_amount) && (unit->amount != (i+1))) ||
411 ((unit->valid_type) && (unit->type != (i+2)))) {
412 ast_test_status_update(test, "TEST 2, invalid unit entry result, got %u,%u, expected %d,%d\n",
413 unit->amount,
414 unit->type,
415 i+1,
416 i+2);
417 res = AST_TEST_FAIL;
418 goto cleanup_aoc_test;
419 }
420 }
421 } else {
422 ast_test_status_update(test, "TEST 2, invalid unit list entry count \n");
423 res = AST_TEST_FAIL;
424 goto cleanup_aoc_test;
425 }
426
427
428 /* Test charging association information */
429 {
430 const struct ast_aoc_charging_association *ca;
431 if ((ast_aoc_set_association_id(decoded, 1234)) ||
432 (!(ca = ast_aoc_get_association_info(decoded)))) {
433 ast_test_status_update(test, "TEST 2, could not set charging association id info correctly\n");
434 res = AST_TEST_FAIL;
435 goto cleanup_aoc_test;
436 }
437
438 if ((ca->charging_type != AST_AOC_CHARGING_ASSOCIATION_ID) || (ca->charge.id != 1234)) {
439 ast_test_status_update(test, "TEST 2, could not get charging association id info correctly, 2\n");
440 }
441
442 if ((ast_aoc_set_association_number(decoded, "1234", 16)) ||
443 (!(ca = ast_aoc_get_association_info(decoded)))) {
444 ast_test_status_update(test, "TEST 2, could not set charging association number info correctly, 3\n");
445 res = AST_TEST_FAIL;
446 goto cleanup_aoc_test;
447 }
448
450 (ca->charge.number.plan != 16) ||
451 (strcmp(ca->charge.number.number, "1234"))) {
452 ast_test_status_update(test, "TEST 2, could not get charging association number info correctly\n");
453 }
454 }
455
456 /* Test every billing id possibility */
457 {
458 int billid[9] = {
468 };
469 int i;
470
471 /* these should fail */
472 if (!(ast_aoc_set_billing_id(decoded, (AST_AOC_BILLING_NA - 1))) ||
474
475 ast_test_status_update(test, "TEST 2, setting invalid billing id should fail\n");
476 res = AST_TEST_FAIL;
477 goto cleanup_aoc_test;
478 }
479
480 for (i = 0; i < ARRAY_LEN(billid); i++) {
481 if ((ast_aoc_set_billing_id(decoded, billid[i]) ||
482 (ast_aoc_get_billing_id(decoded) != billid[i]))) {
483
484 ast_test_status_update(test, "TEST 2, could not set billing id correctly, iteration #%d\n", i);
485 res = AST_TEST_FAIL;
486 goto cleanup_aoc_test;
487 }
488 }
489 }
490 /* Encode the message */
492 ast_test_status_update(test, "Test2: encode decode routine did not match expected results \n");
493 res = AST_TEST_FAIL;
494 goto cleanup_aoc_test;
495 }
496 /* cleanup decoded msg */
497 decoded = ast_aoc_destroy_decoded(decoded);
498
499 /* ---- Test 3 ---- create AOC-Request. test all possible combinations */
500 {
501 int request[7] = { /* all possible request combinations */
509 };
510 int i;
511
512 for (i = 0; i < ARRAY_LEN(request); i++) {
513 if (!(decoded = ast_aoc_create(AST_AOC_REQUEST, 0, request[i])) ||
516 (ast_aoc_get_request(decoded) != request[i])) {
517
518 ast_test_status_update(test, "Test 3: failed to create AOC-Request message, iteration #%d\n", i);
519 res = AST_TEST_FAIL;
520 goto cleanup_aoc_test;
521 }
522
523 /* Encode the message */
525 ast_test_status_update(test, "Test3: encode decode routine did not match expected results, iteration #%d\n", i);
526 res = AST_TEST_FAIL;
527 goto cleanup_aoc_test;
528 }
529 /* cleanup decoded msg */
530 decoded = ast_aoc_destroy_decoded(decoded);
531 }
532
533
534 /* Test termination Request Type */
535 if (!(decoded = ast_aoc_create(AST_AOC_REQUEST, 0, AST_AOC_REQUEST_E)) ||
540
541 ast_test_status_update(test, "Test 3: failed to create AOC-Request message with Termination Request set\n");
542 res = AST_TEST_FAIL;
543 goto cleanup_aoc_test;
544 }
545
546 /* Encode the message */
548 ast_test_status_update(test, "Test3: encode decode routine did not match expected results with termination request set\n");
549 res = AST_TEST_FAIL;
550 goto cleanup_aoc_test;
551 }
552 /* cleanup decoded msg */
553 decoded = ast_aoc_destroy_decoded(decoded);
554 }
555
556 /* ---- Test 4 ---- Make stuff blow up */
557 if ((decoded = ast_aoc_create(AST_AOC_D, 1234567, 0))) {
558
559 ast_test_status_update(test, "Test 4: aoc-d creation with no valid charge type should fail\n");
560 res = AST_TEST_FAIL;
561 goto cleanup_aoc_test;
562 }
563 if ((decoded = ast_aoc_create(AST_AOC_REQUEST, 0, 0))) {
564
565 ast_test_status_update(test, "Test 4: aoc request creation with no data should have failed\n");
566 res = AST_TEST_FAIL;
567 goto cleanup_aoc_test;
568 }
569 if ((decoded = ast_aoc_create(AST_AOC_REQUEST, -12345678, -23456789))) {
570
571 ast_test_status_update(test, "Test 4: aoc request creation with random data should have failed\n");
572 res = AST_TEST_FAIL;
573 goto cleanup_aoc_test;
574 }
575
576 /* ---- Test 5 ---- create AOC-E message with charge type == FREE and charge type == NA */
577 /* create AOC-E message */
578 if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_FREE, 0)) ||
579 (ast_aoc_get_msg_type(decoded) != AST_AOC_E) ||
581
582 ast_test_status_update(test, "Test 5: failed to create AOC-E message, charge type Free\n");
583 res = AST_TEST_FAIL;
584 goto cleanup_aoc_test;
585 }
587 ast_test_status_update(test, "Test5: encode decode routine did not match expected results, charge type Free\n");
588 res = AST_TEST_FAIL;
589 goto cleanup_aoc_test;
590 }
591 /* cleanup decoded msg */
592 decoded = ast_aoc_destroy_decoded(decoded);
593
594 /* create AOC-E message */
595 if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_NA, 0)) ||
596 (ast_aoc_get_msg_type(decoded) != AST_AOC_E) ||
598
599 ast_test_status_update(test, "Test 5: failed to create AOC-E message, charge type NA\n");
600 res = AST_TEST_FAIL;
601 goto cleanup_aoc_test;
602 }
604 ast_test_status_update(test, "Test5: encode decode routine did not match expected results, charge type NA.\n");
605 res = AST_TEST_FAIL;
606 goto cleanup_aoc_test;
607 }
608 /* cleanup decoded msg */
609 decoded = ast_aoc_destroy_decoded(decoded);
610
611
612/* ---- TEST 6, AOC-S encode decode */
613 if (!(decoded = ast_aoc_create(AST_AOC_S, 0, 0))) {
614 ast_test_status_update(test, "failed to create AOC-S message for encode decode testing.\n");
615
616 res = AST_TEST_FAIL;
617 goto cleanup_aoc_test;
618 }
619
622 937,
624 "jkasdf",
625 235328,
627 905423,
629 1);
630
633 1337,
635 "MONEYS");
636
640 5555,
642 "pounds");
643
646 78923,
648 "SNAP",
649 9354,
651 234933,
653 0);
654
658
660 ast_test_status_update(test, "Test6: encode decode routine for AOC-S did not match expected results\n");
661 res = AST_TEST_FAIL;
662 goto cleanup_aoc_test;
663 }
664 /* cleanup decoded msg */
665 decoded = ast_aoc_destroy_decoded(decoded);
666
667
668
669cleanup_aoc_test:
670
671 decoded = ast_aoc_destroy_decoded(decoded);
672 return res;
673}
unsigned int ast_aoc_get_unit_count(struct ast_aoc_decoded *decoded)
get the number of unit entries for AOC-D and AOC-E messages
Definition aoc.c:1028
int ast_aoc_s_add_rate_duration(struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name, unsigned long time, enum ast_aoc_time_scale time_scale, unsigned long granularity_time, enum ast_aoc_time_scale granularity_time_scale, int step_function)
Add AOC-S duration rate entry.
Definition aoc.c:779
enum ast_aoc_total_type ast_aoc_get_total_type(struct ast_aoc_decoded *decoded)
get the type of total for a AOC-D message
Definition aoc.c:923
const char * ast_aoc_get_currency_name(struct ast_aoc_decoded *decoded)
get the currency name for AOC-D and AOC-E messages
Definition aoc.c:981
@ AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT
Definition aoc.h:147
@ AST_AOC_CHARGED_ITEM_CALL_SETUP
Definition aoc.h:150
@ AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE
Definition aoc.h:152
@ AST_AOC_CHARGED_ITEM_CALL_ATTEMPT
Definition aoc.h:149
@ AST_AOC_CHARGE_CURRENCY
Definition aoc.h:72
@ AST_AOC_CHARGE_FREE
Definition aoc.h:71
@ AST_AOC_CHARGE_UNIT
Definition aoc.h:73
@ AST_AOC_CHARGE_NA
Definition aoc.h:70
@ AST_AOC_TIME_SCALE_DAY
Definition aoc.h:94
@ AST_AOC_TIME_SCALE_SECOND
Definition aoc.h:90
@ AST_AOC_TIME_SCALE_HUNDREDTH_SECOND
Definition aoc.h:88
enum ast_aoc_type ast_aoc_get_msg_type(struct ast_aoc_decoded *decoded)
get the message type, AOC-D, AOC-E, or AOC Request
Definition aoc.c:901
@ AST_AOC_VOLUME_UNIT_SEGMENT
Definition aoc.h:127
int ast_aoc_test_encode_decode_match(struct ast_aoc_decoded *decoded)
test aoc encode decode routines.
Definition aoc.c:1339
int ast_aoc_get_termination_request(struct ast_aoc_decoded *decoded)
get whether or not the AST_AOC_REQUEST message as a termination request.
Definition aoc.c:1088
@ AST_AOC_MULT_ONEHUNDREDTH
Definition aoc.h:36
@ AST_AOC_MULT_ONETHOUSANDTH
Definition aoc.h:35
@ AST_AOC_MULT_THOUSAND
Definition aoc.h:41
@ AST_AOC_MULT_ONE
Definition aoc.h:38
struct ast_aoc_decoded * ast_aoc_create(const enum ast_aoc_type msg_type, const enum ast_aoc_charge_type charge_type, const enum ast_aoc_request requests)
creates a ast_aoc_decode object of a specific message type
Definition aoc.c:285
void * ast_aoc_destroy_decoded(struct ast_aoc_decoded *decoded)
free an ast_aoc_decoded object
Definition aoc.c:316
@ AST_AOC_CHARGING_ASSOCIATION_ID
Definition aoc.h:188
@ AST_AOC_CHARGING_ASSOCIATION_NUMBER
Definition aoc.h:187
int ast_aoc_set_association_number(struct ast_aoc_decoded *decoded, const char *num, uint8_t plan)
set the charging association number for an AOC-E message
Definition aoc.c:1065
int ast_aoc_add_unit_entry(struct ast_aoc_decoded *decoded, const unsigned int amount_is_present, const unsigned int amount, const unsigned int type_is_present, const unsigned int type)
Adds a unit entry into the list of units.
Definition aoc.c:986
@ AST_AOC_BILLING_CALL_FWD_BUSY
Definition aoc.h:55
@ AST_AOC_BILLING_CALL_FWD_NO_REPLY
Definition aoc.h:56
@ AST_AOC_BILLING_NORMAL
Definition aoc.h:51
@ AST_AOC_BILLING_CALL_DEFLECTION
Definition aoc.h:57
@ AST_AOC_BILLING_CREDIT_CARD
Definition aoc.h:53
@ AST_AOC_BILLING_CALL_TRANSFER
Definition aoc.h:58
@ AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL
Definition aoc.h:54
@ AST_AOC_BILLING_REVERSE_CHARGE
Definition aoc.h:52
@ AST_AOC_BILLING_NA
Definition aoc.h:50
int ast_aoc_s_add_rate_free(struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, int from_beginning)
Add AOC-S indicating charge item is free.
Definition aoc.c:866
const struct ast_aoc_unit_entry * ast_aoc_get_unit_info(struct ast_aoc_decoded *decoded, unsigned int entry_number)
get a specific unit entry.
Definition aoc.c:1019
enum ast_aoc_request ast_aoc_get_request(struct ast_aoc_decoded *decoded)
get the types of AOC requested for when message type is AOC Request
Definition aoc.c:911
int ast_aoc_set_billing_id(struct ast_aoc_decoded *decoded, const enum ast_aoc_billing_id id)
set the billing id for a AOC-D or AST_AOC_E message
Definition aoc.c:1033
int ast_aoc_set_currency_info(struct ast_aoc_decoded *decoded, const unsigned int amount, const enum ast_aoc_currency_multiplier multiplier, const char *name)
Sets the currency values for a AOC-D or AOC-E message.
Definition aoc.c:928
int ast_aoc_set_association_id(struct ast_aoc_decoded *decoded, const int id)
set the charging association id for an AST_AOC_E message
Definition aoc.c:1049
int ast_aoc_s_add_rate_flat(struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name)
Add AOC-S flat rate entry.
Definition aoc.c:810
int ast_aoc_set_total_type(struct ast_aoc_decoded *decoded, const enum ast_aoc_total_type type)
Sets the type of total for a AOC-D message.
Definition aoc.c:916
int ast_aoc_s_add_rate_volume(struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, enum ast_aoc_volume_unit volume_unit, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name)
Add AOC-S volume rate entry.
Definition aoc.c:831
@ AST_AOC_S
Definition aoc.h:64
@ AST_AOC_D
Definition aoc.h:65
@ AST_AOC_E
Definition aoc.h:66
@ AST_AOC_REQUEST
Definition aoc.h:63
enum ast_aoc_billing_id ast_aoc_get_billing_id(struct ast_aoc_decoded *decoded)
get the billing id for AOC-D and AOC-E messages
Definition aoc.c:1044
const struct ast_aoc_charging_association * ast_aoc_get_association_info(struct ast_aoc_decoded *decoded)
get the charging association info for AOC-E messages
Definition aoc.c:1060
enum ast_aoc_currency_multiplier ast_aoc_get_currency_multiplier(struct ast_aoc_decoded *decoded)
get the currency multiplier for AOC-D and AOC-E messages
Definition aoc.c:954
@ AST_AOC_REQUEST_E
Definition aoc.h:79
@ AST_AOC_REQUEST_D
Definition aoc.h:78
@ AST_AOC_REQUEST_S
Definition aoc.h:77
int ast_aoc_set_termination_request(struct ast_aoc_decoded *decoded)
Mark the AST_AOC_REQUEST message as a termination request.
Definition aoc.c:1078
enum ast_aoc_charge_type ast_aoc_get_charge_type(struct ast_aoc_decoded *decoded)
get the charging type for an AOC-D or AOC-E message
Definition aoc.c:906
int ast_aoc_s_add_rate_na(struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item)
Add AOC-S entry indicating charge item is not available.
Definition aoc.c:878
unsigned int ast_aoc_get_currency_amount(struct ast_aoc_decoded *decoded)
get the currency amount for AOC-D and AOC-E messages
Definition aoc.c:949
@ AST_AOC_SUBTOTAL
Definition aoc.h:84
static int request(void *obj)
union ast_aoc_charging_association::@194 charge
struct ast_aoc_charging_association_number number
Definition aoc.h:197
Definition aoc.h:178
unsigned int amount
Definition aoc.h:180
unsigned int type
Definition aoc.h:182
char valid_type
Definition aoc.h:181
char valid_amount
Definition aoc.h:179
@ TEST_INIT
Definition test.h:200
@ TEST_EXECUTE
Definition test.h:201
#define ast_test_status_update(a, b, c...)
Definition test.h:129
@ AST_TEST_PASS
Definition test.h:195
@ AST_TEST_FAIL
Definition test.h:196
@ AST_TEST_NOT_RUN
Definition test.h:194
#define ARRAY_LEN(a)
Definition utils.h:703

References ast_aoc_unit_entry::amount, ARRAY_LEN, ast_aoc_add_unit_entry(), AST_AOC_BILLING_CALL_DEFLECTION, AST_AOC_BILLING_CALL_FWD_BUSY, AST_AOC_BILLING_CALL_FWD_NO_REPLY, AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL, AST_AOC_BILLING_CALL_TRANSFER, AST_AOC_BILLING_CREDIT_CARD, AST_AOC_BILLING_NA, AST_AOC_BILLING_NORMAL, AST_AOC_BILLING_REVERSE_CHARGE, AST_AOC_CHARGE_CURRENCY, AST_AOC_CHARGE_FREE, AST_AOC_CHARGE_NA, AST_AOC_CHARGE_UNIT, AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, AST_AOC_CHARGED_ITEM_CALL_SETUP, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE, AST_AOC_CHARGING_ASSOCIATION_ID, AST_AOC_CHARGING_ASSOCIATION_NUMBER, ast_aoc_create(), AST_AOC_D, ast_aoc_destroy_decoded(), AST_AOC_E, ast_aoc_get_association_info(), ast_aoc_get_billing_id(), ast_aoc_get_charge_type(), ast_aoc_get_currency_amount(), ast_aoc_get_currency_multiplier(), ast_aoc_get_currency_name(), ast_aoc_get_msg_type(), ast_aoc_get_request(), ast_aoc_get_termination_request(), ast_aoc_get_total_type(), ast_aoc_get_unit_count(), ast_aoc_get_unit_info(), AST_AOC_MULT_ONE, AST_AOC_MULT_ONEHUNDREDTH, AST_AOC_MULT_ONETHOUSANDTH, AST_AOC_MULT_THOUSAND, AST_AOC_REQUEST, AST_AOC_REQUEST_D, AST_AOC_REQUEST_E, AST_AOC_REQUEST_S, AST_AOC_S, ast_aoc_s_add_rate_duration(), ast_aoc_s_add_rate_flat(), ast_aoc_s_add_rate_free(), ast_aoc_s_add_rate_na(), ast_aoc_s_add_rate_volume(), ast_aoc_set_association_id(), ast_aoc_set_association_number(), ast_aoc_set_billing_id(), ast_aoc_set_currency_info(), ast_aoc_set_termination_request(), ast_aoc_set_total_type(), AST_AOC_SUBTOTAL, ast_aoc_test_encode_decode_match(), AST_AOC_TIME_SCALE_DAY, AST_AOC_TIME_SCALE_HUNDREDTH_SECOND, AST_AOC_TIME_SCALE_SECOND, AST_AOC_VOLUME_UNIT_SEGMENT, AST_TEST_FAIL, AST_TEST_NOT_RUN, AST_TEST_PASS, ast_test_status_update, ast_aoc_charging_association::charge, ast_aoc_charging_association::charging_type, ast_aoc_charging_association::id, ast_aoc_charging_association_number::number, ast_aoc_charging_association::number, ast_aoc_charging_association_number::plan, request(), TEST_EXECUTE, TEST_INIT, ast_aoc_unit_entry::type, ast_aoc_unit_entry::valid_amount, and ast_aoc_unit_entry::valid_type.

◆ AST_TEST_DEFINE() [2/2]

AST_TEST_DEFINE ( aoc_event_generation_test  )

Definition at line 41 of file test_aoc.c.

42{
43 int res = AST_TEST_PASS;
44 struct ast_aoc_decoded *decoded = NULL;
45 struct ast_str *msg = NULL;
46
47 switch (cmd) {
48 case TEST_INIT:
49 info->name = "aoc_event_test";
50 info->category = "/main/aoc/";
51 info->summary = "Advice of Charge event generation test";
52 info->description =
53 "Creates AOC messages, verify event string matches expected results";
54 return AST_TEST_NOT_RUN;
55 case TEST_EXECUTE:
56 break;
57 }
58
59 if (!(msg = ast_str_create(1024))) {
60 goto cleanup_aoc_event_test;
61 }
62
63 /* ---- TEST 1, AOC-D event generation */
64 if (!(decoded = ast_aoc_create(AST_AOC_D, AST_AOC_CHARGE_CURRENCY, 0))) {
65
66 ast_test_status_update(test, "failed to create AOC-D message for event generation.\n");
67 res = AST_TEST_FAIL;
68 goto cleanup_aoc_event_test;
69 }
70 /* Add billing id information */
72
73 /* Set currency information, verify results */
74 if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "usd")) ||
76
77 ast_test_status_update(test, "failed to set currency info in AOC-D msg\n");
78 res = AST_TEST_FAIL;
79 goto cleanup_aoc_event_test;
80 }
81 if (ast_aoc_decoded2str(decoded, &msg)) {
82
83 ast_test_status_update(test, "failed to generate AOC-D msg string.\n");
84 res = AST_TEST_FAIL;
85 goto cleanup_aoc_event_test;
86 }
87 if (strncmp(ast_str_buffer(msg),
88 "AOC-D\r\n"
89 "Type: Currency\r\n"
90 "BillingID: CreditCard\r\n"
91 "TypeOfCharging: SubTotal\r\n"
92 "Currency: usd\r\n"
93 "Currency/Amount/Cost: 100\r\n"
94 "Currency/Amount/Multiplier: 1\r\n",
95 strlen(ast_str_buffer(msg)))) {
96
97 ast_test_status_update(test, "AOC-D msg event did not match expected results\n");
98 res = AST_TEST_FAIL;
99 goto cleanup_aoc_event_test;
100 }
101 decoded = ast_aoc_destroy_decoded(decoded);
102 ast_str_reset(msg);
103
104
105 /* ---- TEST 2, AOC-S event generation */
106 if (!(decoded = ast_aoc_create(AST_AOC_S, 0, 0))) {
107 ast_test_status_update(test, "failed to create AOC-S message for event generation.\n");
108
109 res = AST_TEST_FAIL;
110 goto cleanup_aoc_event_test;
111 }
112
115 123,
117 "pineapple");
118
122 937,
124 "oranges");
125
128 937,
130 "bananas",
131 848,
133 949,
135 1);
136
139 937,
141 "bananas",
142 1111,
144 2222,
146 0);
147
148 if (ast_aoc_decoded2str(decoded, &msg)) {
149
150 ast_test_status_update(test, "failed to generate AOC-D msg string.\n");
151 res = AST_TEST_FAIL;
152 goto cleanup_aoc_event_test;
153 }
154
155
156 if (strncmp(ast_str_buffer(msg),
157 "AOC-S\r\n"
158 "NumberRates: 4\r\n"
159 "Rate(0)/Chargeable: BasicCommunication\r\n"
160 "Rate(0)/Type: Flat\r\n"
161 "Rate(0)/Flat/Currency: pineapple\r\n"
162 "Rate(0)/Flat/Amount/Cost: 123\r\n"
163 "Rate(0)/Flat/Amount/Multiplier: 10\r\n"
164 "Rate(1)/Chargeable: CallAttempt\r\n"
165 "Rate(1)/Type: Volume\r\n"
166 "Rate(1)/Volume/Currency: oranges\r\n"
167 "Rate(1)/Volume/Amount/Cost: 937\r\n"
168 "Rate(1)/Volume/Amount/Multiplier: 1/100\r\n"
169 "Rate(1)/Volume/Unit: Segment\r\n"
170 "Rate(2)/Chargeable: CallAttempt\r\n"
171 "Rate(2)/Type: Duration\r\n"
172 "Rate(2)/Duration/Currency: bananas\r\n"
173 "Rate(2)/Duration/Amount/Cost: 937\r\n"
174 "Rate(2)/Duration/Amount/Multiplier: 1/1000\r\n"
175 "Rate(2)/Duration/ChargingType: StepFunction\r\n"
176 "Rate(2)/Duration/Time/Length: 848\r\n"
177 "Rate(2)/Duration/Time/Scale: OneTenthSecond\r\n"
178 "Rate(2)/Duration/Granularity/Length: 949\r\n"
179 "Rate(2)/Duration/Granularity/Scale: Hour\r\n"
180 "Rate(3)/Chargeable: UserUserInfo\r\n"
181 "Rate(3)/Type: Duration\r\n"
182 "Rate(3)/Duration/Currency: bananas\r\n"
183 "Rate(3)/Duration/Amount/Cost: 937\r\n"
184 "Rate(3)/Duration/Amount/Multiplier: 1000\r\n"
185 "Rate(3)/Duration/ChargingType: ContinuousCharging\r\n"
186 "Rate(3)/Duration/Time/Length: 1111\r\n"
187 "Rate(3)/Duration/Time/Scale: Second\r\n"
188 "Rate(3)/Duration/Granularity/Length: 2222\r\n"
189 "Rate(3)/Duration/Granularity/Scale: Day\r\n",
190 strlen(ast_str_buffer(msg)))) {
191
192 ast_test_status_update(test, "AOC-S msg event did not match expected results\n");
193 res = AST_TEST_FAIL;
194 goto cleanup_aoc_event_test;
195 }
196 decoded = ast_aoc_destroy_decoded(decoded);
197 ast_str_reset(msg);
198
199 /* ---- TEST 3, AOC-E event generation with various charging association information*/
200 if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_UNIT, 0))) {
201 ast_test_status_update(test, "failed to create AOC-E message for event generation.\n");
202
203 res = AST_TEST_FAIL;
204 goto cleanup_aoc_event_test;
205 }
206 if ((ast_aoc_add_unit_entry(decoded, 1, 111, 1, 1)) ||
207 (!ast_aoc_add_unit_entry(decoded, 0, 2222, 0, 2)) || /* we expect this to fail, and it should not be added to entry list */
208 (ast_aoc_add_unit_entry(decoded, 1, 3333, 0, 3)) ||
209 (ast_aoc_add_unit_entry(decoded, 0, 44444, 1, 4))) {
210
211 ast_test_status_update(test, "failed to set unit info for AOC-E message\n");
212 res = AST_TEST_FAIL;
213 goto cleanup_aoc_event_test;
214 }
215
216 if (ast_aoc_decoded2str(decoded, &msg)) {
217 ast_test_status_update(test, "failed to generate AOC-E msg string.\n");
218 res = AST_TEST_FAIL;
219 goto cleanup_aoc_event_test;
220 }
221
222 if (strncmp(ast_str_buffer(msg),
223 "AOC-E\r\n"
224 "Type: Units\r\n"
225 "BillingID: NotAvailable\r\n"
226 "Units/NumberItems: 3\r\n"
227 "Units/Item(0)/NumberOf: 111\r\n"
228 "Units/Item(0)/TypeOf: 1\r\n"
229 "Units/Item(1)/NumberOf: 3333\r\n"
230 "Units/Item(2)/TypeOf: 4\r\n",
231 strlen(ast_str_buffer(msg)))) {
232
233 ast_test_status_update(test, "AOC-E msg event did not match expected results, with no charging association info\n");
234 res = AST_TEST_FAIL;
235 goto cleanup_aoc_event_test;
236 }
237
238 /* add AOC-E charging association number info */
239 if (ast_aoc_set_association_number(decoded, "555-555-5555", 16)) {
240 ast_test_status_update(test, "failed to set the charging association number info correctly, 3\n");
241 res = AST_TEST_FAIL;
242 goto cleanup_aoc_event_test;
243 }
244
245 ast_str_reset(msg);
246 if (ast_aoc_decoded2str(decoded, &msg)) {
247 ast_test_status_update(test, "failed to generate AOC-E msg string.\n");
248 res = AST_TEST_FAIL;
249 goto cleanup_aoc_event_test;
250 }
251
252 if (strncmp(ast_str_buffer(msg),
253 "AOC-E\r\n"
254 "ChargingAssociation/Number: 555-555-5555\r\n"
255 "ChargingAssociation/Number/Plan: 16\r\n"
256 "Type: Units\r\n"
257 "BillingID: NotAvailable\r\n"
258 "Units/NumberItems: 3\r\n"
259 "Units/Item(0)/NumberOf: 111\r\n"
260 "Units/Item(0)/TypeOf: 1\r\n"
261 "Units/Item(1)/NumberOf: 3333\r\n"
262 "Units/Item(2)/TypeOf: 4\r\n",
263 strlen(ast_str_buffer(msg)))) {
264
265 ast_test_status_update(test, "AOC-E msg event did not match expected results, with charging association number\n");
266 res = AST_TEST_FAIL;
267 goto cleanup_aoc_event_test;
268 }
269
270 /* add AOC-E charging association id info */
271 if (ast_aoc_set_association_id(decoded, 2222)) {
272 ast_test_status_update(test, "failed to set the charging association number info correctly, 3\n");
273 res = AST_TEST_FAIL;
274 goto cleanup_aoc_event_test;
275 }
276
277 ast_str_reset(msg);
278 if (ast_aoc_decoded2str(decoded, &msg)) {
279 ast_test_status_update(test, "failed to generate AOC-E msg string.\n");
280 res = AST_TEST_FAIL;
281 goto cleanup_aoc_event_test;
282 }
283
284 if (strncmp(ast_str_buffer(msg),
285 "AOC-E\r\n"
286 "ChargingAssociation/ID: 2222\r\n"
287 "Type: Units\r\n"
288 "BillingID: NotAvailable\r\n"
289 "Units/NumberItems: 3\r\n"
290 "Units/Item(0)/NumberOf: 111\r\n"
291 "Units/Item(0)/TypeOf: 1\r\n"
292 "Units/Item(1)/NumberOf: 3333\r\n"
293 "Units/Item(2)/TypeOf: 4\r\n",
294 strlen(ast_str_buffer(msg)))) {
295
296 ast_test_status_update(test, "AOC-E msg event did not match expected results with charging association id.\n");
297 res = AST_TEST_FAIL;
298 goto cleanup_aoc_event_test;
299 }
300
301
302cleanup_aoc_event_test:
303
304 decoded = ast_aoc_destroy_decoded(decoded);
305 ast_free(msg);
306 return res;
307}
int ast_aoc_decoded2str(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Convert decoded aoc msg to string representation.
Definition aoc.c:1963
@ AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION
Definition aoc.h:148
@ AST_AOC_CHARGED_ITEM_USER_USER_INFO
Definition aoc.h:151
@ AST_AOC_TIME_SCALE_TENTH_SECOND
Definition aoc.h:89
@ AST_AOC_TIME_SCALE_HOUR
Definition aoc.h:93
@ AST_AOC_MULT_TEN
Definition aoc.h:39
#define ast_free(a)
Definition astmm.h:180
#define NULL
Definition resample.c:96
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition strings.h:693
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
Support for dynamic strings.
Definition strings.h:623

References ast_aoc_add_unit_entry(), AST_AOC_BILLING_CREDIT_CARD, AST_AOC_CHARGE_CURRENCY, AST_AOC_CHARGE_UNIT, AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION, AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, AST_AOC_CHARGED_ITEM_USER_USER_INFO, ast_aoc_create(), AST_AOC_D, ast_aoc_decoded2str(), ast_aoc_destroy_decoded(), AST_AOC_E, AST_AOC_MULT_ONE, AST_AOC_MULT_ONEHUNDREDTH, AST_AOC_MULT_ONETHOUSANDTH, AST_AOC_MULT_TEN, AST_AOC_MULT_THOUSAND, AST_AOC_S, ast_aoc_s_add_rate_duration(), ast_aoc_s_add_rate_flat(), ast_aoc_s_add_rate_volume(), ast_aoc_set_association_id(), ast_aoc_set_association_number(), ast_aoc_set_billing_id(), ast_aoc_set_currency_info(), ast_aoc_set_total_type(), AST_AOC_SUBTOTAL, AST_AOC_TIME_SCALE_DAY, AST_AOC_TIME_SCALE_HOUR, AST_AOC_TIME_SCALE_SECOND, AST_AOC_TIME_SCALE_TENTH_SECOND, AST_AOC_VOLUME_UNIT_SEGMENT, ast_free, ast_str_buffer(), ast_str_create, ast_str_reset(), AST_TEST_FAIL, AST_TEST_NOT_RUN, AST_TEST_PASS, ast_test_status_update, NULL, TEST_EXECUTE, and TEST_INIT.

◆ load_module()

static int load_module ( void  )
static

Definition at line 682 of file test_aoc.c.

683{
684 AST_TEST_REGISTER(aoc_encode_decode_test);
685 AST_TEST_REGISTER(aoc_event_generation_test);
687}
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
#define AST_TEST_REGISTER(cb)
Definition test.h:127

References AST_MODULE_LOAD_SUCCESS, and AST_TEST_REGISTER.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 675 of file test_aoc.c.

676{
677 AST_TEST_UNREGISTER(aoc_encode_decode_test);
678 AST_TEST_UNREGISTER(aoc_event_generation_test);
679 return 0;
680}
#define AST_TEST_UNREGISTER(cb)
Definition test.h:128

References AST_TEST_UNREGISTER.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "AOC unit tests" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 689 of file test_aoc.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 689 of file test_aoc.c.