Browse Source

TT#136957 tests for delay timing

Change-Id: I9bdc4a4860c13cdb3c7a2e96518caab1f7dfffea
pull/1430/head
Richard Fuchs 4 years ago
parent
commit
6d85fb6887
2 changed files with 399 additions and 2 deletions
  1. +10
    -2
      t/Makefile
  2. +389
    -0
      t/auto-daemon-tests-delay-timing.pl

+ 10
- 2
t/Makefile View File

@ -88,7 +88,7 @@ include ../lib/common.Makefile
.PHONY: all-tests unit-tests daemon-tests daemon-tests \
daemon-tests-main daemon-tests-jb daemon-tests-dtx daemon-tests-dtx-cn daemon-tests-pubsub \
daemon-tests-intfs daemon-tests-stats daemon-tests-delay-buffer
daemon-tests-intfs daemon-tests-stats daemon-tests-delay-buffer daemon-tests-delay-timing
TESTS= test-bitstr aes-crypt aead-aes-crypt test-const_str_hash.strhash
ifeq ($(with_transcoding),yes)
@ -111,7 +111,7 @@ unit-tests: $(TESTS)
for x in $(TESTS); do echo testing: $$x; G_DEBUG=fatal-warnings ./$$x || exit 1; done
daemon-tests: daemon-tests-main daemon-tests-jb daemon-tests-pubsub daemon-tests-websocket \
daemon-tests-intfs daemon-tests-stats daemon-tests-delay-buffer
daemon-tests-intfs daemon-tests-stats daemon-tests-delay-buffer daemon-tests-delay-timing
daemon-test-deps: tests-preload.so
$(MAKE) -C ../daemon
@ -188,6 +188,14 @@ daemon-tests-delay-buffer: daemon-test-deps
test "$$(ls fake-$@-sockets)" = ""
rmdir fake-$@-sockets
daemon-tests-delay-timing: daemon-test-deps
rm -rf fake-$@-sockets
mkdir fake-$@-sockets
LD_PRELOAD=../t/tests-preload.so RTPE_BIN=../daemon/rtpengine TEST_SOCKET_PATH=./fake-$@-sockets \
perl -I../perl auto-daemon-tests-delay-timing.pl
test "$$(ls fake-$@-sockets)" = ""
rmdir fake-$@-sockets
test-bitstr: test-bitstr.o
spandsp_send_fax_pcm: spandsp_send_fax_pcm.o


+ 389
- 0
t/auto-daemon-tests-delay-timing.pl View File

@ -0,0 +1,389 @@
#!/usr/bin/perl
use strict;
use warnings;
use NGCP::Rtpengine::Test;
use NGCP::Rtpclient::SRTP;
use NGCP::Rtpengine::AutoTest;
use Test::More;
use NGCP::Rtpclient::ICE;
use POSIX;
use Time::HiRes qw(usleep gettimeofday time sleep);
(POSIX::uname())[1] eq 'moose' or exit(); # timing sensitive tests
autotest_start(qw(--config-file=none -t -1 -i 203.0.113.1
-n 2223 -c 12345 -f -L 7 -E -u 2222))
or die;
my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $ssrc, $ssrc_b, $resp,
$sock_ax, $sock_bx, $port_ax, $port_bx,
$srtp_ctx_a, $srtp_ctx_b, $srtp_ctx_a_rev, $srtp_ctx_b_rev, $ufrag_a, $ufrag_b,
@ret1, @ret2, @ret3, @ret4, $srtp_key_a, $srtp_key_b, $ts, $seq, $rseq, $sseq,
$send_start, $diff);
($sock_a, $sock_b) = new_call([qw(198.51.100.1 4008)], [qw(198.51.100.1 5008)]);
($port_a) = offer('DTMF trigger', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio 4008 RTP/AVP 0 101
c=IN IP4 198.51.100.1
a=sendrecv
a=rtpmap:101 telephone-event/8000
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio PORT RTP/AVP 0 101
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b) = answer('DTMF trigger', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio 5008 RTP/AVP 0 101
c=IN IP4 198.51.100.1
a=sendrecv
a=rtpmap:101 telephone-event/8000
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio PORT RTP/AVP 0 101
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=rtcp:PORT
SDP
rtpe_req('block DTMF', 'DTMF block',
{ 'from-tag' => ft(), 'trigger' => '##', 'trigger-end' => '#', 'DTMF-security-trigger' => 'silence',
'delay-buffer' => 2000 });
$seq = 0;
$rseq = $seq;
# first packet out determines start TS
$send_start = time();
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
# 100 packets = 2000 ms
for (1 .. 99) {
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > 0.015, 'diff > 0.015');
ok($diff < 0.020, 'diff < 0.020');
sleep($diff);
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# final 20 ms sleep replaced by waiting for the first packet out of the buffer. switch to receiver driven mode:
for (1 .. 100) {
rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, 0x1234, "\x00" x 160));
$rseq++;
# reception timestamp should line up with what is expected
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# send 10 DTMF packets while still receiving PCM
$sseq = $seq;
for my $iter (1 .. 10) {
rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, 0x1234, "\x00" x 160));
$rseq++;
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
my $vol = 10;
if ($iter != 10) {
my $dtmf = pack("CCn", 5, $vol, 160 * ($seq - $sseq + 1));
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
else {
# send end x3
$vol |= 0x80;
my $dtmf = pack("CCn", 5, $vol, 160 * ($seq - $sseq + 1));
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$seq++;
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$seq++;
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
$seq++;
}
# 90 more PCM packets
for (1 .. 90) {
rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, 0x1234, "\x00" x 160));
$rseq++;
$diff = ($send_start + 0.02 * ($seq - 2)) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# now DTMF
$sseq = $rseq;
for my $iter (1 .. 10) {
my $vol = 10;
if ($iter != 10) {
my $dtmf = pack("CCn", 5, $vol, 160 * ($rseq - $sseq + 1));
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
else {
# recv x3
$vol |= 0x80;
my $dtmf = pack("CCn", 5, $vol, 160 * ($rseq - $sseq + 1));
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$rseq++;
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$rseq++;
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
$rseq++;
$diff = ($send_start + 0.02 * ($seq - 2)) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
#done_testing;NGCP::Rtpengine::AutoTest::terminate('f00');exit;
($sock_a, $sock_b) = new_call([qw(198.51.100.1 4012)], [qw(198.51.100.1 5012)]);
($port_a) = offer('DTMF trigger w inject-DTMF', { flags => ['inject DTMF'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio 4012 RTP/AVP 0 101
c=IN IP4 198.51.100.1
a=sendrecv
a=rtpmap:101 telephone-event/8000
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio PORT RTP/AVP 0 101
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b) = answer('DTMF trigger w inject-DTMF', { flags => ['inject DTMF'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio 5012 RTP/AVP 0 101
c=IN IP4 198.51.100.1
a=sendrecv
a=rtpmap:101 telephone-event/8000
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
m=audio PORT RTP/AVP 0 101
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
a=rtcp:PORT
SDP
rtpe_req('block DTMF', 'DTMF block w inject-DTMF',
{ 'from-tag' => ft(), 'trigger' => '##', 'trigger-end' => '#', 'DTMF-security-trigger' => 'silence',
'delay-buffer' => 2000 });
$seq = 0;
$rseq = $seq;
# first packet out determines start TS
$send_start = time();
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
# 100 packets = 2000 ms
for (1 .. 99) {
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > 0.015, 'diff > 0.015');
ok($diff < 0.020, 'diff < 0.020');
sleep($diff);
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# final 20 ms sleep replaced by waiting for the first packet out of the buffer. switch to receiver driven mode:
for (1 .. 100) {
($ssrc) = rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, -1, "\x00" x 160));
$rseq++;
# reception timestamp should line up with what is expected
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# send 10 DTMF packets while still receiving PCM
$sseq = $seq;
for my $iter (1 .. 10) {
rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, $ssrc, "\x00" x 160));
$rseq++;
$diff = ($send_start + 0.02 * $seq) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
my $vol = 10;
if ($iter != 10) {
my $dtmf = pack("CCn", 5, $vol, 160 * ($seq - $sseq + 1));
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
else {
# send end x3
$vol |= 0x80;
my $dtmf = pack("CCn", 5, $vol, 160 * ($seq - $sseq + 1));
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$seq++;
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
$seq++;
snd($sock_a, $port_b, rtp(101 | ($seq == $sseq ? 0x80 : 0),
1000 + $seq, 3000 + 160 * $sseq, 0x1234, $dtmf));
}
$seq++;
}
# 90 more PCM packets
for (1 .. 90) {
rcv($sock_b, $port_a, rtpm(0, 1000 + $rseq, 3000 + 160 * $rseq, $ssrc, "\x00" x 160));
$rseq++;
$diff = ($send_start + 0.02 * ($seq - 2)) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
# now DTMF
$sseq = $rseq;
for my $iter (1 .. 10) {
my $vol = 10;
if ($iter != 10) {
my $dtmf = pack("CCn", 5, $vol, 160 * ($rseq - $sseq + 1));
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, $ssrc, $dtmf));
}
else {
# recv x3
$vol |= 0x80;
my $dtmf = pack("CCn", 5, $vol, 160 * ($rseq - $sseq + 1));
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, $ssrc, $dtmf));
$rseq++;
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, $ssrc, $dtmf));
$rseq++;
rcv($sock_b, $port_a, rtpm(101 | ($rseq == $sseq ? 0x80 : 0),
1000 + $rseq, 3000 + 160 * $sseq, $ssrc, $dtmf));
}
$rseq++;
$diff = ($send_start + 0.02 * ($seq - 2)) - time();
print("send diff $diff\n");
ok($diff > -0.01, 'diff > -0.01');
ok($diff < +0.01, 'diff < +0.01');
snd($sock_a, $port_b, rtp(0, 1000 + $seq, 3000 + 160 * $seq, 0x1234, "\x00" x 160));
$seq++;
}
done_testing();
#done_testing;NGCP::Rtpengine::AutoTest::terminate('f00');exit;

Loading…
Cancel
Save