You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rate-o-mat/t/rateomat-05-parallel.t

122 lines
4.8 KiB

use strict;
use Utils::Api qw();
use Utils::Rateomat qw();
use Test::More;
### testcase outline:
### onnet calls between subscribers of multiple resellers
### are rated by multiple rateomat instances running
### concurrently
###
### this tests verify that ratomat can be run safely against
### one and the same accounting.cdr table.
{
my $number_of_rateomat_threads = 3;
my $rateomat_timeout = 60;
my $number_of_providers = 3;
my $number_of_subscribers_per_provider = 3;
my $balance = 0.0;
my %subscribers = ();
foreach (1..$number_of_providers) {
my $rate_interval = 30 + int(rand(31));
my $provider = create_provider($rate_interval);
my $caller_fee = $provider->{subscriber_fees}->[0];
foreach (1..$number_of_subscribers_per_provider) {
my $subscriber = Utils::Api::setup_subscriber($provider,$caller_fee->{profile},$balance,{ cc => 888, ac => '3<n>', sn => '<t>' });
$subscriber->{provider} = $provider;
$subscriber->{fee} = $caller_fee;
$subscriber->{rate_interval} = $rate_interval;
$subscribers{$subscriber->{customer}->{id}} = $subscriber;
}
}
my @caller_callee_matrix = ();
# add calls from each subscriber to each subscriber except itself:
Utils::Api::cartesian_product(sub {
my ($caller,$callee) = @_;
push(@caller_callee_matrix,{ caller => $caller, callee => $callee }) unless $caller->{customer}->{id} == $callee->{customer}->{id};
},[ values %subscribers ],[ values %subscribers ]);
## add calls from each subscriber to itself:
#Utils::Api::cartesian_product(sub {
# my ($caller,$callee) = @_;
# push(@caller_callee_matrix,{ caller => $caller, callee => $callee }) if $caller->{customer}->{id} == $callee->{customer}->{id};
#},[ values %subscribers ],[ values %subscribers ]);
# place calls by generating cdrs:
my @cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([ map {
Utils::Rateomat::prepare_cdr($_->{caller}->{subscriber},undef,$_->{caller}->{reseller},
$_->{callee}->{subscriber},undef,$_->{callee}->{reseller},
'192.168.0.1',Utils::Api::current_unix(),$_->{caller}->{rate_interval} + 1);
} @caller_callee_matrix ]) };
my $number_of_calls = ($number_of_providers * $number_of_subscribers_per_provider) * ($number_of_providers * $number_of_subscribers_per_provider - 1);
$ENV{RATEOMAT_BATCH_SIZE} = $number_of_calls; # ensure all rateomats grab all cdrs at once
$ENV{RATEOMAT_SHUFFLE_BATCH} = 1; # enable and see the speedup
if (ok((scalar @cdr_ids) == $number_of_calls,'there are '.$number_of_calls.' calls to rate')
&& ok(Utils::Rateomat::run_rateomat_threads($number_of_rateomat_threads, $rateomat_timeout),'rate-o-mat threads executed')) {
ok(Utils::Rateomat::check_cdrs('',
map {
my $cdr = Utils::Rateomat::get_cdrs($_);
my $caller = $subscribers{$cdr->{source_account_id}};
my $call_costs = $caller->{fee}->{fees}->[0]->{onpeak_init_rate} *
$caller->{fee}->{fees}->[0]->{onpeak_init_interval} +
$caller->{fee}->{fees}->[0]->{onpeak_follow_rate} *
$caller->{fee}->{fees}->[0]->{onpeak_follow_interval};
$caller->{call_costs} += $call_costs;
$_ => {
id => $_,
rating_status => 'ok',
source_customer_cost => Utils::Rateomat::decimal_to_string($call_costs),
destination_customer_cost => Utils::Rateomat::decimal_to_string(0.0),
source_reseller_cost => Utils::Rateomat::decimal_to_string(0.0),
destination_reseller_cost => Utils::Rateomat::decimal_to_string(0.0),
};
} @cdr_ids
),'cdrs were all processed');
foreach (keys %subscribers) {
my $caller = $subscribers{$_};
Utils::Api::check_interval_history("caller $_: ",$_,[
{ #cash => (100.0 * $balance - $caller->{call_costs})/100.0,
debit => $caller->{call_costs}/100.0,
},
]);
}
}
}
done_testing();
exit;
sub create_provider {
my $rate_interval = shift;
$rate_interval //= 60;
return Utils::Api::setup_provider('test<n>.com',
[ #rates:
{ #any
onpeak_init_rate => 2,
onpeak_init_interval => $rate_interval,
onpeak_follow_rate => 1,
onpeak_follow_interval => $rate_interval,
offpeak_init_rate => 2,
offpeak_init_interval => $rate_interval,
offpeak_follow_rate => 1,
offpeak_follow_interval => $rate_interval,
},
],
[ #billing networks:
]
);
}