MT#61263 add MOS tests

Timing sensitive and long duration, so not enabled by default

Change-Id: Iade9e490bdb688b446f1ae1c9dc5642b79c513c5
pull/1872/head^2
Richard Fuchs 7 months ago
parent bf4f32b652
commit 554be7d136

@ -100,7 +100,8 @@ 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-delay-timing \
daemon-tests-evs daemon-tests-player-cache daemon-tests-redis daemon-tests-redis-json
daemon-tests-evs daemon-tests-player-cache daemon-tests-redis daemon-tests-redis-json \
daemon-tests-measure-rtp
TESTS= test-bitstr aes-crypt aead-aes-crypt test-const_str_hash.strhash
ifeq ($(with_transcoding),yes)
@ -138,7 +139,7 @@ daemon-tests: daemon-tests-main daemon-tests-jb daemon-tests-pubsub daemon-tests
daemon-tests-evs daemon-tests-async-tc \
daemon-tests-audio-player daemon-tests-audio-player-play-media \
daemon-tests-intfs daemon-tests-stats daemon-tests-player-cache daemon-tests-redis \
daemon-tests-rtpp-flags daemon-tests-redis-json
daemon-tests-rtpp-flags daemon-tests-redis-json daemon-tests-measure-rtp
daemon-test-deps: tests-preload.so
$(MAKE) -C ../daemon
@ -197,6 +198,9 @@ daemon-tests-rtpp-flags: daemon-test-deps
daemon-tests-async-tc: daemon-test-deps
./auto-test-helper "$@" perl -I../perl auto-daemon-tests-async-tc.pl
daemon-tests-measure-rtp: daemon-test-deps
./auto-test-helper "$@" perl -I../perl auto-daemon-tests-measure-rtp.pl
test-bitstr: test-bitstr.o
test-mix-buffer: test-mix-buffer.o $(COMMONOBJS) mix_buffer.o ssrc.o rtp.o crypto.o helpers.o \

@ -0,0 +1,256 @@
#!/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;
autotest_start(qw(--config-file=none -t -1 -i 203.0.113.1 -i 2001:db8:4321::1 --measure-rtp --mos=LQ
-n 2223 -c 12345 -f -L 7 -E -u 2222 --silence-detect=1 --log-level-internals=7))
or die;
my $extended_tests = $ENV{RTPENGINE_EXTENDED_TESTS};
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, $has_recv);
if ($extended_tests) {
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3000)], [qw(198.51.100.23 3001)],
[qw(198.51.100.23 3002)], [qw(198.51.100.23 3003)]);
($port_a, $port_ax) = offer('MOS basic', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3000 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS basic', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3002 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# run 15 seconds = 750 packets
for my $iter (0 .. 750) {
snd($sock_a, $port_b, rtp(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
Time::HiRes::usleep(20000);
}
$resp = rtpe_req('delete', 'MOS basic', { });
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '<=', 3, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, 44, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '<=', 1, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '<=', 3, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, 44, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '<=', 1, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, 0, 'metric matches';
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3004)], [qw(198.51.100.23 3005)],
[qw(198.51.100.23 3006)], [qw(198.51.100.23 3007)]);
($port_a, $port_ax) = offer('MOS PL', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3004 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS PL', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3006 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# run 15 seconds = 750 packets, drop every 20th (5% PL)
for my $iter (0 .. 750) {
if (($iter % 20) != 19) {
snd($sock_a, $port_b, rtp(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
}
Time::HiRes::usleep(20000);
}
$resp = rtpe_req('delete', 'MOS PL', { });
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '<=', 3, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, 41, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '<=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, '>=', 3, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, '<=', 4, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '<=', 3, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, 41, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '<=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, '>=', 3, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, '<=', 4, 'metric matches';
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3008)], [qw(198.51.100.23 3009)],
[qw(198.51.100.23 3010)], [qw(198.51.100.23 3011)]);
($port_a, $port_ax) = offer('MOS very degraded', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3008 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS very degraded', { flags => ['generate RTCP'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3010 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# run 20 seconds = 1000 packets, drop every 10th (10% PL), add random jitter
srand(123456);
for my $iter (0 .. 1000) {
if (($iter % 10) != 9) {
snd($sock_a, $port_b, rtp(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000 + $iter, 3000 + 160 * $iter, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000 + $iter, 4000 + 160 * $iter, 0x7654321, "\x00" x 160));
}
Time::HiRes::usleep(20000 + rand(40000) - 20000);
}
$resp = rtpe_req('delete', 'MOS very degraded', { });
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, '<=', 4, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, '>=', 35, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, '<=', 36, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '>=', 4, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, '<=', 12, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, '>=', 8, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, '<=', 9, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '>=', 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, '<=', 4, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, '>=', 35, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, '<=', 36, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '>=', 4, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, '<=', 12, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, '>=', 8, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, '<=', 9, 'metric matches';
}
#done_testing;NGCP::Rtpengine::AutoTest::terminate('f00');exit;
done_testing();

@ -82,6 +82,499 @@ sub stun_succ {
if ($extended_tests) {
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3000)], [qw(198.51.100.23 3001)],
[qw(198.51.100.23 3002)], [qw(198.51.100.23 3003)]);
($port_a, $port_ax) = offer('MOS basic', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3000 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS basic', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3002 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# populate known payload type
snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160));
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100001, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
0 << 24 # fraction lost
| 0, # number of packets lost
2000, # extended highest sequence number received
0, # jitter
0x00000000, # last SR
0 / 65536, # delay since last SR
));
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100004, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
0 << 24 # fraction lost
| 0, # number of packets lost
1010, # extended highest sequence number received
0, # jitter
0x00010020, # last SR
3 * 65536, # delay since last SR
));
# no MOS calculated here as we don't have an opposite side RTT yet ^
Time::HiRes::usleep(2 * 1000000);
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100006, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
0 << 24 # fraction lost
| 0, # number of packets lost
2020, # extended highest sequence number received
0, # jitter
0x00040020, # last SR
2 * 65536, # delay since last SR
));
# CQ MOS for 0x1234567 calculated here ^
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100007, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
0 << 24 # fraction lost
| 0, # number of packets lost
1030, # extended highest sequence number received
0, # jitter
0x00060020, # last SR
3 * 65536, # delay since last SR
));
# CQ MOS for 0x7654321 calculated here ^
$resp = rtpe_req('delete', 'MOS basic', { });
my $processing_us = 10000; # allow for 10 ms processing time
is $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, 1, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, 44, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, 0, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '<', $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '<', $processing_us, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, 1, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, 44, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, 0, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '<', $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '>=', 0, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '<', $processing_us, 'metric matches';
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3004)], [qw(198.51.100.23 3005)],
[qw(198.51.100.23 3006)], [qw(198.51.100.23 3007)]);
($port_a, $port_ax) = offer('MOS degraded', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3004 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS degraded', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3006 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# populate known payload type
snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160));
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100001, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
(0.04*256) << 24 # fraction lost
| 0, # number of packets lost
2000, # extended highest sequence number received
15 * 8000 / 1000, # jitter
0x00000000, # last SR
0 / 65536, # delay since last SR
));
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100004, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
(0.04*256) << 24 # fraction lost
| 0, # number of packets lost
1010, # extended highest sequence number received
15 * 8000 / 1000, # jitter
0x00010020, # last SR
2.88 * 65536,# delay since last SR
));
# no MOS calculated here as we don't have an opposite side RTT yet ^
Time::HiRes::usleep(2 * 1000000);
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100006, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
(0.04*256) << 24 # fraction lost
| 0, # number of packets lost
2020, # extended highest sequence number received
15 * 8000 / 1000, # jitter
0x00040020, # last SR
1.87 * 65536,#delay since last SR
));
# CQ MOS for 0x1234567 calculated here ^
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100007, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
(0.04*256) << 24 # fraction lost
| 0, # number of packets lost
1030, # extended highest sequence number received
15 * 8000 / 1000, # jitter
0x00060020, # last SR
2.88 * 65536,# delay since last SR
));
# CQ MOS for 0x7654321 calculated here ^
$resp = rtpe_req('delete', 'MOS degraded', { });
is $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, '>=', 34, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, '<=', 35, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, 15, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, 3, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '>=', 250000, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '<', 250000 + $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '>=', 130000, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '<', 130000 + $processing_us, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, 1, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, '>=', 34, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, '<=', 35, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, 15, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, 3, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '>=', 250000, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '<', 250000 + $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '>=', 120000, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '<', 120000 + $processing_us, 'metric matches';
($sock_a, $sock_ax, $sock_b, $sock_bx) = new_call([qw(198.51.100.23 3008)], [qw(198.51.100.23 3009)],
[qw(198.51.100.23 3010)], [qw(198.51.100.23 3011)]);
($port_a, $port_ax) = offer('MOS very degraded', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3008 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
($port_b, $port_bx) = answer('MOS very degraded', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
c=IN IP4 198.51.100.23
t=0 0
m=audio 3010 RTP/AVP 0
-----------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.23
s=tester
t=0 0
m=audio PORT RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
# populate known payload type
snd($sock_a, $port_b, rtp(0, 1000, 3000, 0x1234567, "\x00" x 160));
rcv($sock_b, $port_a, rtpm(0, 1000, 3000, 0x1234567, "\x00" x 160));
snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x7654321, "\x00" x 160));
rcv($sock_a, $port_b, rtpm(0, 2000, 4000, 0x7654321, "\x00" x 160));
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100001, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
(0.04*256) << 24 # fraction lost
| 0, # number of packets lost
2000, # extended highest sequence number received
20 * 8000 / 1000, # jitter
0x00000000, # last SR
0 / 65536, # delay since last SR
));
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100004, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
(0.06*256) << 24 # fraction lost
| 0, # number of packets lost
1010, # extended highest sequence number received
20 * 8000 / 1000, # jitter
0x00010020, # last SR
2.80 * 65536,# delay since last SR
));
# no MOS calculated here as we don't have an opposite side RTT yet ^
Time::HiRes::usleep(2 * 1000000);
snd($sock_ax, $port_bx, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x1234567, # sender SSRC
0x00100006, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x7654321, # received SSRC
(0.06*256) << 24 # fraction lost
| 0, # number of packets lost
2020, # extended highest sequence number received
20 * 8000 / 1000, # jitter
0x00040020, # last SR
1.80 * 65536,#delay since last SR
));
# CQ MOS for 0x1234567 calculated here ^
Time::HiRes::usleep(3 * 1000000);
snd($sock_bx, $port_ax, pack("CC n N NN N N N N N N N N N",
0x81, # version, one reception report
200, # sender report
52 / 4 - 1, # length
0x7654321, # sender SSRC
0x00100007, # NTP MSB
0x00200000, # NTP LSB
4000, # RTP TS
100, # sender packet count
16000, # sender octet count
0x1234567, # received SSRC
(0.06*256) << 24 # fraction lost
| 0, # number of packets lost
1030, # extended highest sequence number received
20 * 8000 / 1000, # jitter
0x00060020, # last SR
2.80 * 65536,# delay since last SR
));
# CQ MOS for 0x7654321 calculated here ^
$resp = rtpe_req('delete', 'MOS very degraded', { });
is $resp->{SSRC}{0x1234567}{'average MOS'}{samples}, 1, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{MOS}, 24, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{jitter}, 20, 'metric matches';
is $resp->{SSRC}{0x1234567}{'average MOS'}{'packet loss'}, 5, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '>=', 400000, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time'}, '<', 400000 + $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '>=', 200000, 'metric matches';
cmp_ok $resp->{SSRC}{0x1234567}{'average MOS'}{'round-trip time leg'}, '<', 200000 + $processing_us, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{samples}, 1, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{MOS}, 24, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{jitter}, 20, 'metric matches';
is $resp->{SSRC}{0x7654321}{'average MOS'}{'packet loss'}, 5, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '>=', 400000, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time'}, '<', 400000 + $processing_us * 2, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '>=', 200000, 'metric matches';
cmp_ok $resp->{SSRC}{0x7654321}{'average MOS'}{'round-trip time leg'}, '<', 200000 + $processing_us, 'metric matches';
}
new_call;
offer('a=mid mixup', { 'address family' => 'IP6' }, <<SDP);

Loading…
Cancel
Save