From 245c5d9eb8a3742b31fe08e4d674100fe8292cc0 Mon Sep 17 00:00:00 2001 From: rmudgett Date: Wed, 2 Jun 2010 18:10:15 +0000 Subject: Generic Advice of Charge. Asterisk Generic AOC Representation - Generic AOC encode/decode routines. (Generic AOC must be encoded to be passed on the wire in the AST_CONTROL_AOC frame) - AST_CONTROL_AOC frame type to represent generic encoded AOC data - Manager events for AOC-S, AOC-D, and AOC-E messages Asterisk App Support - app_dial AOC-S pass-through support on call setup - app_queue AOC-S pass-through support on call setup AOC Unit Tests - AOC Unit Tests for encode/decode routines - AOC Unit Test for manager event representation. SIP AOC Support - Pass-through of generic AOC-D and AOC-E messages to snom phones via the snom AOC specification. - Creation of chan_sip page3 flags for the addition of the new 'snom_aoc_enabled' sip.conf option. IAX AOC Support - Natively supports AOC pass-through through the use of the new AST_CONTROL_AOC frame type DAHDI AOC Support - ETSI PRI full AOC Pass-through support - 'aoc_enable' chan_dahdi.conf option for independently enabling pass-through of AOC-S, AOC-D, AOC-E. - 'aoce_delayhangup' option for retrieving AOC-E on disconnect. - DAHDI A() dial string option for requesting AOC services. example usage: ;requests AOC-S, AOC-D, and AOC-E on call setup exten=>1111,1,Dial(DAHDI/g1/1112/A(s,d,e)) Review: https://reviewboard.asterisk.org/r/552/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@267096 f38db490-d61c-443f-a65b-d21fe96a405b --- tests/test_aoc.c | 690 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 690 insertions(+) create mode 100644 tests/test_aoc.c (limited to 'tests') diff --git a/tests/test_aoc.c b/tests/test_aoc.c new file mode 100644 index 000000000..f6355e54f --- /dev/null +++ b/tests/test_aoc.c @@ -0,0 +1,690 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2010, Digium, Inc. + * + * David Vossel + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! + * \file + * \brief Generic AOC encode decode tests + * + * \author David Vossel + * + * \ingroup tests + */ + +/*** MODULEINFO + TEST_FRAMEWORK + ***/ + +#include "asterisk.h" + +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") + +#include "asterisk/utils.h" +#include "asterisk/module.h" +#include "asterisk/test.h" +#include "asterisk/aoc.h" + + +AST_TEST_DEFINE(aoc_event_generation_test) +{ + int res = AST_TEST_PASS; + struct ast_aoc_decoded *decoded = NULL; + struct ast_str *msg = NULL; + + switch (cmd) { + case TEST_INIT: + info->name = "aoc_event_test"; + info->category = "main/aoc/"; + info->summary = "Advice of Charge event generation test"; + info->description = + "Creates AOC messages, verify event string matches expected results"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + if (!(msg = ast_str_create(1024))) { + goto cleanup_aoc_event_test; + } + + /* ---- TEST 1, AOC-D event generation */ + if (!(decoded = ast_aoc_create(AST_AOC_D, AST_AOC_CHARGE_CURRENCY, 0))) { + + ast_test_status_update(test, "failed to create AOC-D message for event generation.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + /* Add billing id information */ + ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_CREDIT_CARD); + + /* Set currency information, verify results */ + if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "usd")) || + (ast_aoc_set_total_type(decoded, AST_AOC_SUBTOTAL))) { + + ast_test_status_update(test, "failed to set currency info in AOC-D msg\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + if (ast_aoc_decoded2str(decoded, &msg)) { + + ast_test_status_update(test, "failed to generate AOC-D msg string.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + if (strncmp(ast_str_buffer(msg), + "AOC-D\r\n" + "Type: Currency\r\n" + "BillingID: CreditCard\r\n" + "TypeOfCharging: SubTotal\r\n" + "Currency: usd\r\n" + "Currency/Amount/Cost: 100\r\n" + "Currency/Amount/Multiplier: 1\r\n", + strlen(ast_str_buffer(msg)))) { + + ast_test_status_update(test, "AOC-D msg event did not match expected results\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + decoded = ast_aoc_destroy_decoded(decoded); + ast_str_reset(msg); + + + /* ---- TEST 2, AOC-S event generation */ + if (!(decoded = ast_aoc_create(AST_AOC_S, 0, 0))) { + ast_test_status_update(test, "failed to create AOC-S message for event generation.\n"); + + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + ast_aoc_s_add_rate_flat(decoded, + AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION, + 123, + AST_AOC_MULT_TEN, + "pineapple"); + + ast_aoc_s_add_rate_volume(decoded, + AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, + AST_AOC_VOLUME_UNIT_SEGMENT, + 937, + AST_AOC_MULT_ONEHUNDREDTH, + "oranges"); + + ast_aoc_s_add_rate_duration(decoded, + AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, + 937, + AST_AOC_MULT_ONETHOUSANDTH, + "bananas", + 848, + AST_AOC_TIME_SCALE_TENTH_SECOND, + 949, + AST_AOC_TIME_SCALE_HOUR, + 1); + + ast_aoc_s_add_rate_duration(decoded, + AST_AOC_CHARGED_ITEM_USER_USER_INFO, + 937, + AST_AOC_MULT_THOUSAND, + "bananas", + 1111, + AST_AOC_TIME_SCALE_SECOND, + 2222, + AST_AOC_TIME_SCALE_DAY, + 0); + + if (ast_aoc_decoded2str(decoded, &msg)) { + + ast_test_status_update(test, "failed to generate AOC-D msg string.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + + if (strncmp(ast_str_buffer(msg), + "AOC-S\r\n" + "NumberRates: 4\r\n" + "Rate(0)/Chargeable: BasicCommunication\r\n" + "Rate(0)/Type: Flat\r\n" + "Rate(0)/Flat/Currency: pineapple\r\n" + "Rate(0)/Flat/Amount/Cost: 123\r\n" + "Rate(0)/Flat/Amount/Multiplier: 10\r\n" + "Rate(1)/Chargeable: CallAttempt\r\n" + "Rate(1)/Type: Volume\r\n" + "Rate(1)/Volume/Currency: oranges\r\n" + "Rate(1)/Volume/Amount/Cost: 937\r\n" + "Rate(1)/Volume/Amount/Multiplier: 1/100\r\n" + "Rate(1)/Volume/Unit: Segment\r\n" + "Rate(2)/Chargeable: CallAttempt\r\n" + "Rate(2)/Type: Duration\r\n" + "Rate(2)/Duration/Currency: bananas\r\n" + "Rate(2)/Duration/Amount/Cost: 937\r\n" + "Rate(2)/Duration/Amount/Multiplier: 1/1000\r\n" + "Rate(2)/Duration/ChargingType: StepFunction\r\n" + "Rate(2)/Duration/Time/Length: 848\r\n" + "Rate(2)/Duration/Time/Scale: OneTenthSecond\r\n" + "Rate(2)/Duration/Granularity/Length: 949\r\n" + "Rate(2)/Duration/Granularity/Scale: Hour\r\n" + "Rate(3)/Chargeable: UserUserInfo\r\n" + "Rate(3)/Type: Duration\r\n" + "Rate(3)/Duration/Currency: bananas\r\n" + "Rate(3)/Duration/Amount/Cost: 937\r\n" + "Rate(3)/Duration/Amount/Multiplier: 1000\r\n" + "Rate(3)/Duration/ChargingType: ContinuousCharging\r\n" + "Rate(3)/Duration/Time/Length: 1111\r\n" + "Rate(3)/Duration/Time/Scale: Second\r\n" + "Rate(3)/Duration/Granularity/Length: 2222\r\n" + "Rate(3)/Duration/Granularity/Scale: Day\r\n", + strlen(ast_str_buffer(msg)))) { + + ast_test_status_update(test, "AOC-S msg event did not match expected results\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + decoded = ast_aoc_destroy_decoded(decoded); + ast_str_reset(msg); + + /* ---- TEST 3, AOC-E event generation with various charging association information*/ + if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_UNIT, 0))) { + ast_test_status_update(test, "failed to create AOC-E message for event generation.\n"); + + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + if ((ast_aoc_add_unit_entry(decoded, 1, 111, 1, 1)) || + (!ast_aoc_add_unit_entry(decoded, 0, 2222, 0, 2)) || /* we expect this to fail, and it should not be added to entry list */ + (ast_aoc_add_unit_entry(decoded, 1, 3333, 0, 3)) || + (ast_aoc_add_unit_entry(decoded, 0, 44444, 1, 4))) { + + ast_test_status_update(test, "failed to set unit info for AOC-E message\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + if (ast_aoc_decoded2str(decoded, &msg)) { + ast_test_status_update(test, "failed to generate AOC-E msg string.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + if (strncmp(ast_str_buffer(msg), + "AOC-E\r\n" + "Type: Units\r\n" + "BillingID: NotAvailable\r\n" + "Units/NumberItems: 3\r\n" + "Units/Item(0)/NumberOf: 111\r\n" + "Units/Item(0)/TypeOf: 1\r\n" + "Units/Item(1)/NumberOf: 3333\r\n" + "Units/Item(2)/TypeOf: 4\r\n", + strlen(ast_str_buffer(msg)))) { + + ast_test_status_update(test, "AOC-E msg event did not match expected results, with no charging association info\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + /* add AOC-E charging association number info */ + if (ast_aoc_set_association_number(decoded, "555-555-5555", 16)) { + ast_test_status_update(test, "failed to set the charging association number info correctly, 3\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + ast_str_reset(msg); + if (ast_aoc_decoded2str(decoded, &msg)) { + ast_test_status_update(test, "failed to generate AOC-E msg string.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + if (strncmp(ast_str_buffer(msg), + "AOC-E\r\n" + "ChargingAssociation/Number: 555-555-5555\r\n" + "ChargingAssociation/Number/Plan: 16\r\n" + "Type: Units\r\n" + "BillingID: NotAvailable\r\n" + "Units/NumberItems: 3\r\n" + "Units/Item(0)/NumberOf: 111\r\n" + "Units/Item(0)/TypeOf: 1\r\n" + "Units/Item(1)/NumberOf: 3333\r\n" + "Units/Item(2)/TypeOf: 4\r\n", + strlen(ast_str_buffer(msg)))) { + + ast_test_status_update(test, "AOC-E msg event did not match expected results, with charging association number\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + /* add AOC-E charging association id info */ + if (ast_aoc_set_association_id(decoded, 2222)) { + ast_test_status_update(test, "failed to set the charging association number info correctly, 3\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + ast_str_reset(msg); + if (ast_aoc_decoded2str(decoded, &msg)) { + ast_test_status_update(test, "failed to generate AOC-E msg string.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + if (strncmp(ast_str_buffer(msg), + "AOC-E\r\n" + "ChargingAssociation/ID: 2222\r\n" + "Type: Units\r\n" + "BillingID: NotAvailable\r\n" + "Units/NumberItems: 3\r\n" + "Units/Item(0)/NumberOf: 111\r\n" + "Units/Item(0)/TypeOf: 1\r\n" + "Units/Item(1)/NumberOf: 3333\r\n" + "Units/Item(2)/TypeOf: 4\r\n", + strlen(ast_str_buffer(msg)))) { + + ast_test_status_update(test, "AOC-E msg event did not match expected results with charging association id.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_event_test; + } + + +cleanup_aoc_event_test: + + decoded = ast_aoc_destroy_decoded(decoded); + ast_free(msg); + return res; +} + +AST_TEST_DEFINE(aoc_encode_decode_test) +{ + int res = AST_TEST_PASS; + struct ast_aoc_decoded *decoded; + + switch (cmd) { + case TEST_INIT: + info->name = "aoc_encode_decode_test"; + info->category = "main/aoc/"; + info->summary = "Advice of Charge encode and decode test"; + info->description = + "This tests the Advice of Charge encode and decode routines."; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + /* ---- Test 1 ---- create AOC-D message, encode message, and decode message once again. */ + /* create AOC-D message */ + if (!(decoded = ast_aoc_create(AST_AOC_D, AST_AOC_CHARGE_CURRENCY, 0)) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_D) || + (ast_aoc_get_charge_type(decoded) != AST_AOC_CHARGE_CURRENCY)) { + + ast_test_status_update(test, "Test 1: failed to create AOC-D message\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Add billing id information */ + if ((ast_aoc_set_billing_id(decoded, AST_AOC_BILLING_NORMAL) || + (ast_aoc_get_billing_id(decoded) != AST_AOC_BILLING_NORMAL))) { + + ast_test_status_update(test, "TEST 1, could not set billing id correctly\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + + } + + /* Set currency information, verify results*/ + if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "usd")) || + (ast_aoc_set_total_type(decoded, AST_AOC_SUBTOTAL)) || + (ast_aoc_get_total_type(decoded) != AST_AOC_SUBTOTAL) || + (ast_aoc_get_currency_amount(decoded) != 100) || + (ast_aoc_get_currency_multiplier(decoded) != AST_AOC_MULT_ONE) || + (strcmp(ast_aoc_get_currency_name(decoded), "usd"))) { + + ast_test_status_update(test, "Test 1: failed to set currency info\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Set a currency name larger than 10 characters which is the the maximum + * length allowed by the ETSI aoc standard. The name is expected to truncate + * to 10 characters. */ + if ((ast_aoc_set_currency_info(decoded, 100, AST_AOC_MULT_ONE, "12345678901234567890")) || + (ast_aoc_get_currency_amount(decoded) != 100) || + (ast_aoc_get_currency_multiplier(decoded) != AST_AOC_MULT_ONE) || + (strcmp(ast_aoc_get_currency_name(decoded), "1234567890"))) { + + ast_test_status_update(test, "Test 1: failed to set currency info currency name exceeding limit\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Encode the message */ + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test1: encode decode routine did not match expected results \n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + + /* ---- Test 2 ---- create AOC-E message with charge type == unit */ + /* create AOC-E message */ + if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_UNIT, 0)) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_E) || + (ast_aoc_get_charge_type(decoded) != AST_AOC_CHARGE_UNIT)) { + + ast_test_status_update(test, "Test 2: failed to create AOC-E message\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Set unit information, verify results*/ + if ((ast_aoc_add_unit_entry(decoded, 1, 1, 1, 2)) || + (!ast_aoc_add_unit_entry(decoded, 0, 123, 0, 123)) || /* this entry should fail since either number nor type are present */ + (ast_aoc_add_unit_entry(decoded, 0, 2, 1, 3)) || + (ast_aoc_add_unit_entry(decoded, 1, 3, 0, 4))) { + + ast_test_status_update(test, "Test 2: failed to set unit info\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* verify unit list is correct */ + if (ast_aoc_get_unit_count(decoded) == 3) { + int i; + const struct ast_aoc_unit_entry *unit; + for (i = 0; i < 3; i++) { + if (!(unit = ast_aoc_get_unit_info(decoded, i)) || + ((unit->valid_amount) && (unit->amount != (i+1))) || + ((unit->valid_type) && (unit->type != (i+2)))) { + ast_test_status_update(test, "TEST 2, invalid unit entry result, got %d,%d, expected %d,%d\n", + unit->amount, + unit->type, + i+1, + i+2); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + } + } else { + ast_test_status_update(test, "TEST 2, invalid unit list entry count \n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + + /* Test charging association information */ + { + const struct ast_aoc_charging_association *ca; + if ((ast_aoc_set_association_id(decoded, 1234)) || + (!(ca = ast_aoc_get_association_info(decoded)))) { + ast_test_status_update(test, "TEST 2, could not set charging association id info correctly\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + if ((ca->charging_type != AST_AOC_CHARGING_ASSOCIATION_ID) || (ca->charge.id != 1234)) { + ast_test_status_update(test, "TEST 2, could not get charging association id info correctly, 2\n"); + } + + if ((ast_aoc_set_association_number(decoded, "1234", 16)) || + (!(ca = ast_aoc_get_association_info(decoded)))) { + ast_test_status_update(test, "TEST 2, could not set charging association number info correctly, 3\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + if ((ca->charging_type != AST_AOC_CHARGING_ASSOCIATION_NUMBER) || + (ca->charge.number.plan != 16) || + (strcmp(ca->charge.number.number, "1234"))) { + ast_test_status_update(test, "TEST 2, could not get charging association number info correctly\n"); + } + } + + /* Test every billing id possiblity */ + { + int billid[9] = { + AST_AOC_BILLING_NA, + AST_AOC_BILLING_NORMAL, + AST_AOC_BILLING_REVERSE_CHARGE, + AST_AOC_BILLING_CREDIT_CARD, + AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL, + AST_AOC_BILLING_CALL_FWD_BUSY, + AST_AOC_BILLING_CALL_FWD_NO_REPLY, + AST_AOC_BILLING_CALL_DEFLECTION, + AST_AOC_BILLING_CALL_TRANSFER, + }; + int i; + + /* these should fail */ + if (!(ast_aoc_set_billing_id(decoded, (AST_AOC_BILLING_NA - 1))) || + !(ast_aoc_set_billing_id(decoded, (AST_AOC_BILLING_CALL_TRANSFER + 1)))) { + + ast_test_status_update(test, "TEST 2, setting invalid billing id should fail\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + for (i = 0; i < ARRAY_LEN(billid); i++) { + if ((ast_aoc_set_billing_id(decoded, billid[i]) || + (ast_aoc_get_billing_id(decoded) != billid[i]))) { + + ast_test_status_update(test, "TEST 2, could not set billing id correctly, iteration #%d\n", i); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + } + } + /* Encode the message */ + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test2: encode decode routine did not match expected results \n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + + /* ---- Test 3 ---- create AOC-Request. test all possible combinations */ + { + int request[7] = { /* all possible request combinations */ + AST_AOC_REQUEST_S, + AST_AOC_REQUEST_D, + AST_AOC_REQUEST_E, + (AST_AOC_REQUEST_S | AST_AOC_REQUEST_D), + (AST_AOC_REQUEST_S | AST_AOC_REQUEST_E), + (AST_AOC_REQUEST_D | AST_AOC_REQUEST_E), + (AST_AOC_REQUEST_D | AST_AOC_REQUEST_E | AST_AOC_REQUEST_S) + }; + int i; + + for (i = 0; i < ARRAY_LEN(request); i++) { + if (!(decoded = ast_aoc_create(AST_AOC_REQUEST, 0, request[i])) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_REQUEST) || + (ast_aoc_get_termination_request(decoded)) || + (ast_aoc_get_request(decoded) != request[i])) { + + ast_test_status_update(test, "Test 3: failed to create AOC-Request message, iteration #%d\n", i); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Encode the message */ + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test3: encode decode routine did not match expected results, iteration #%d\n", i); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + } + + + /* Test termination Request Type */ + if (!(decoded = ast_aoc_create(AST_AOC_REQUEST, 0, AST_AOC_REQUEST_E)) || + (ast_aoc_set_termination_request(decoded)) || + (!ast_aoc_get_termination_request(decoded)) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_REQUEST) || + (ast_aoc_get_request(decoded) != AST_AOC_REQUEST_E)) { + + ast_test_status_update(test, "Test 3: failed to create AOC-Request message with Termination Request set\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* Encode the message */ + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test3: encode decode routine did not match expected results with termination request set\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + } + + /* ---- Test 4 ---- Make stuff blow up */ + if ((decoded = ast_aoc_create(AST_AOC_D, 1234567, 0))) { + + ast_test_status_update(test, "Test 4: aoc-d creation with no valid charge type should fail\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + if ((decoded = ast_aoc_create(AST_AOC_REQUEST, 0, 0))) { + + ast_test_status_update(test, "Test 4: aoc request creation with no data should have failed\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + if ((decoded = ast_aoc_create(AST_AOC_REQUEST, -12345678, -23456789))) { + + ast_test_status_update(test, "Test 4: aoc request creation with random data should have failed\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + /* ---- Test 5 ---- create AOC-E message with charge type == FREE and charge type == NA */ + /* create AOC-E message */ + if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_FREE, 0)) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_E) || + (ast_aoc_get_charge_type(decoded) != AST_AOC_CHARGE_FREE)) { + + ast_test_status_update(test, "Test 5: failed to create AOC-E message, charge type Free\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test5: encode decode routine did not match expected results, charge type Free\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + + /* create AOC-E message */ + if (!(decoded = ast_aoc_create(AST_AOC_E, AST_AOC_CHARGE_NA, 0)) || + (ast_aoc_get_msg_type(decoded) != AST_AOC_E) || + (ast_aoc_get_charge_type(decoded) != AST_AOC_CHARGE_NA)) { + + ast_test_status_update(test, "Test 5: failed to create AOC-E message, charge type NA\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test5: encode decode routine did not match expected results, charge type NA.\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + + +/* ---- TEST 6, AOC-S encode decode */ + if (!(decoded = ast_aoc_create(AST_AOC_S, 0, 0))) { + ast_test_status_update(test, "failed to create AOC-S message for encode decode testing.\n"); + + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + + ast_aoc_s_add_rate_duration(decoded, + AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE, + 937, + AST_AOC_MULT_THOUSAND, + "jkasdf", + 235328, + AST_AOC_TIME_SCALE_SECOND, + 905423, + AST_AOC_TIME_SCALE_DAY, + 1); + + ast_aoc_s_add_rate_flat(decoded, + AST_AOC_CHARGED_ITEM_CALL_SETUP, + 1337, + AST_AOC_MULT_ONEHUNDREDTH, + "MONEYS"); + + ast_aoc_s_add_rate_volume(decoded, + AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, + AST_AOC_VOLUME_UNIT_SEGMENT, + 5555, + AST_AOC_MULT_ONEHUNDREDTH, + "pounds"); + + ast_aoc_s_add_rate_duration(decoded, + AST_AOC_CHARGED_ITEM_CALL_ATTEMPT, + 78923, + AST_AOC_MULT_ONETHOUSANDTH, + "SNAP", + 9354, + AST_AOC_TIME_SCALE_HUNDREDTH_SECOND, + 234933, + AST_AOC_TIME_SCALE_SECOND, + 0); + + ast_aoc_s_add_rate_free(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, 1); + ast_aoc_s_add_rate_free(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, 0); + ast_aoc_s_add_rate_na(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT); + + if (ast_aoc_test_encode_decode_match(decoded)) { + ast_test_status_update(test, "Test6: encode decode routine for AOC-S did not match expected results\n"); + res = AST_TEST_FAIL; + goto cleanup_aoc_test; + } + /* cleanup decoded msg */ + decoded = ast_aoc_destroy_decoded(decoded); + + + +cleanup_aoc_test: + + decoded = ast_aoc_destroy_decoded(decoded); + return res; +} + +static int unload_module(void) +{ + AST_TEST_UNREGISTER(aoc_encode_decode_test); + AST_TEST_UNREGISTER(aoc_event_generation_test); + return 0; +} + +static int load_module(void) +{ + AST_TEST_REGISTER(aoc_encode_decode_test); + AST_TEST_REGISTER(aoc_event_generation_test); + return AST_MODULE_LOAD_SUCCESS; +} + +AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AOC unit tests"); -- cgit v1.2.3