diff --git a/src/mod/applications/mod_avmd/scripts/avmd_test.pl b/src/mod/applications/mod_avmd/scripts/avmd_test.pl new file mode 100644 index 0000000000..1f1af2929a --- /dev/null +++ b/src/mod/applications/mod_avmd/scripts/avmd_test.pl @@ -0,0 +1,163 @@ +#!/usr/bin/perl -w + + +#brief Test module avmd by calling all voicemails available +# in avmd test suite and print detection results to the console. +#author Piotr Gregor +#details If you are testing locally - remember to set avmd to inbound mode, +# "avmd set inbound" in fs_cli. +#date 15 Sept 2016 03:00 PM + + +$|++; # turn on autoflush +use strict; +use warnings; +require ESL; +use POSIX; +use Time::HiRes; + + +# Hashtable of pairs +my %numbers = ( + 400 => "DETECTED", + 401 => "DETECTED", + 402 => "DETECTED", + 403 => "DETECTED", + 404 => "DETECTED", + 405 => "DETECTED", + 406 => "DETECTED", + 407 => "DETECTED", + 408 => "DETECTED", + 409 => "DETECTED", + 410 => "DETECTED", + 411 => "DETECTED", + 412 => "DETECTED", + 413 => "DETECTED", + 414 => "DETECTED", + 500 => "NOTDETECTED", + 501 => "NOTDETECTED" +); + +my $host = "127.0.0.1"; +my $port = "8021"; +my $pass = "ClueCon"; +my $extension_base = "sofia/internal/1000\@192.168.1.60"; + +my $playback = 'local_stream://moh'; +my $context = 'default'; +my $endpoint; +my $dest; +my $expectation; +my $callerid; +my $passed = 0; +my $failed = 0; +my $hanguped = 0; + + +if ($#ARGV + 1 eq 1) { + $callerid = $ARGV[0]; + print "\nDialing as [" .$callerid ."]\n"; +} elsif ($#ARGV + 1 > 1) { + die "Please specify single caller id.\n"; +} else { + die "Please specify caller id.\n"; +} + + +print "Connecting...\t"; +my $con = new ESL::ESLconnection($host, $port, $pass); +if (!$con) { + die "Unable to establish connection to $host:$port\n"; +} +if ($con->connected()) { + print "OK.\n"; +} else { + die "Conenction failure.\n"; +} + +print "Subscribing to avmd events...\t"; +$con->events("plain", "CUSTOM avmd::start"); +$con->events("plain", "CUSTOM avmd::stop"); +$con->events("plain", "CUSTOM avmd::beep"); +$con->events("plain", "CHANNEL_CALLSTATE"); +$con->events("plain", "CHANNEL_HANGUP"); +print "OK.\n\n"; +printf("\nRunning [" .keys(%numbers) ."] tests.\n\n"); + +printf("outbound uuid | destination number | timestamp | expectation | test result\n\n"); +foreach $dest (sort keys %numbers) { + if (!$con->connected()) { + last; + } + $expectation = $numbers{$dest}; + test_once($dest, $callerid, $expectation); +} +print "Disconnected.\n\n"; +if (($failed == 0) && ($hanguped == 0)) { + printf("\n\nOK. All PASS [%s]\n\n", $passed); +} else { + printf("PASS [%s], FAIL [%s], HANGUP [%s]\n\n", $passed, $failed, $hanguped); +} + +sub test_once { + my ($dest, $callerid, $expectation) = @_; + my $originate_string = + 'originate ' . + '{ignore_early_media=true,' . + 'origination_uuid=%s,' . + 'originate_timeout=60,' . + 'origination_caller_id_number=' . $callerid . ',' . + 'origination_caller_id_name=' . $callerid . '}'; + my $outcome; + my $result; + my $event_uuid; + my $uuid_in = ""; + + if(defined($endpoint)) { + $originate_string .= $endpoint; + } else { + $originate_string .= 'loopback/' . $dest . '/' . $context; + } + $originate_string .= ' ' . '&playback(' . $playback . ')'; + + my $uuid_out = $con->api('create_uuid')->getBody(); + my ($time_epoch, $time_hires) = Time::HiRes::gettimeofday(); + + printf("[%s] [%s]", $uuid_out, $dest); + $con->bgapi(sprintf($originate_string, $uuid_out)); + + while($con->connected()) { + my $e = $con->recvEvent(); + if ($e) { + my $event_name = $e->getHeader("Event-Name"); + if ($event_name eq 'CUSTOM') { + my $avmd_event_type = $e->getHeader("Event-Subclass"); + if ($avmd_event_type eq 'avmd::start') { + $uuid_in = $e->getHeader("Unique-ID"); + } elsif (!($uuid_in eq "") && (($avmd_event_type eq 'avmd::beep') || ($avmd_event_type eq 'avmd::stop'))) { + $event_uuid = $e->getHeader("Unique-ID"); + if ($event_uuid eq $uuid_in) { + $outcome = $e->getHeader("Beep-Status"); + if ($outcome eq $expectation) { + $result = "PASS"; + $passed++; + } else { + $result = "FAIL"; + $failed++; + } + last; + } + } + } elsif ($event_name eq 'CHANNEL_HANGUP') { + $event_uuid = $e->getHeader("variable_origination_uuid"); + if ($event_uuid eq $uuid_out) { + $outcome = "HANGUP"; + $result = "HANGUP"; + $hanguped++; + last; + } + } + } + } + printf("\t[%s]\t[%s]\t\t[%s]\n", POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)), $expectation, $result); +}