From 4c1d43d7ee1629be7a1fdcacda5ebc0295ee9ed0 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 27 May 2021 13:53:06 -0400 Subject: [PATCH] TT#91151 add tests for pubsub Change-Id: Id5bfe175aacf33a5b768ed3837d67517676939a9 --- perl/NGCP/Rtpengine/AutoTest.pm | 38 +- t/Makefile | 12 +- t/auto-daemon-tests-pubsub.pl | 1241 +++++++++++++++++++++++++++++++ t/auto-daemon-tests.pl | 4 +- 4 files changed, 1282 insertions(+), 13 deletions(-) create mode 100755 t/auto-daemon-tests-pubsub.pl diff --git a/perl/NGCP/Rtpengine/AutoTest.pm b/perl/NGCP/Rtpengine/AutoTest.pm index 2c499c1fa..0f9b43579 100644 --- a/perl/NGCP/Rtpengine/AutoTest.pm +++ b/perl/NGCP/Rtpengine/AutoTest.pm @@ -21,7 +21,7 @@ BEGIN { @ISA = qw(Exporter); our @EXPORT = qw(autotest_start new_call offer answer ft tt snd srtp_snd rtp rcv srtp_rcv srtp_dec escape rtpm rtpmre reverse_tags new_tt crlf sdp_split rtpe_req offer_answer - autotest_init); + autotest_init subscribe_request subscribe_answer publish); }; @@ -117,13 +117,9 @@ sub rtpe_req { is $resp->{result}, 'ok', "$name - '$cmd' status"; return $resp; } -sub offer_answer { - my ($cmd, $name, $req, $sdps) = @_; - my ($sdp_in, $exp_sdp_out) = sdp_split($sdps); - $req->{'from-tag'} = $ft; - $req->{sdp} = $sdp_in; - my $resp = rtpe_req($cmd, $name, $req); - my $regexp = "^\Q$exp_sdp_out\E\$"; +sub sdp_match { + my ($cmd, $name, $sdp, $exp) = @_; + my $regexp = "^\Q$exp\E\$"; $regexp =~ s/\\\?/./gs; $regexp =~ s/PORT/(\\d{1,5})/gs; $regexp =~ s/ICEBASE/([0-9a-zA-Z]{16})/gs; @@ -137,11 +133,21 @@ sub offer_answer { $regexp =~ s/LOOPER/([0-9a-f]{12})/gs; $regexp =~ s/FINGERPRINT256/([0-9a-fA-F:]{95})/gs; $regexp =~ s/FINGERPRINT/([0-9a-fA-F:]{59})/gs; - my $crlf = crlf($resp->{sdp}); + $regexp =~ s/SDP_VERSION/\\d+ \\d+/gs; + $regexp =~ s/RTPE_VERSION/rtpengine-\\S+/gs; + my $crlf = crlf($sdp); like $crlf, qr/$regexp/s, "$name - output '$cmd' SDP"; my @matches = $crlf =~ qr/$regexp/s; return @matches; } +sub offer_answer { + my ($cmd, $name, $req, $sdps) = @_; + my ($sdp_in, $exp_sdp_out) = sdp_split($sdps); + $req->{'from-tag'} = $ft; + $req->{sdp} = $sdp_in; + my $resp = rtpe_req($cmd, $name, $req); + return sdp_match($cmd, $name, $resp->{sdp}, $exp_sdp_out); +} sub offer { return offer_answer('offer', @_); } @@ -150,6 +156,20 @@ sub answer { $req->{'to-tag'} = $tt; return offer_answer('answer', $name, $req, $sdps); } +sub subscribe_request { + my ($name, $req, $sdp_exp) = @_; + my $resp = rtpe_req('subscribe request', $name, $req); + my @matches = sdp_match('subscribe request', $name, $resp->{sdp}, $sdp_exp); + return ($resp->{'from-tag'}, $resp->{'to-tag'}, @matches); +} +sub subscribe_answer { + my ($name, $req, $sdp) = @_; + $req->{sdp} = $sdp; + my $resp = rtpe_req('subscribe answer', $name, $req); +} +sub publish { + return offer_answer('publish', @_); +} sub snd { my ($sock, $dest, $packet, $addr) = @_; $sock->send($packet, 0, pack_sockaddr_in($dest, inet_aton($addr // '203.0.113.1'))) or die; diff --git a/t/Makefile b/t/Makefile index 74cd731ca..16e3ed66a 100644 --- a/t/Makefile +++ b/t/Makefile @@ -85,7 +85,7 @@ COMMONOBJS= str.o auxlib.o rtplib.o loglib.o include ../lib/common.Makefile .PHONY: all-tests unit-tests daemon-tests all-daemon-tests \ - daemon-tests-main daemon-tests-jb daemon-tests-dtx daemon-tests-dtx-cn + daemon-tests-main daemon-tests-jb daemon-tests-dtx daemon-tests-dtx-cn daemon-tests-pubsub TESTS= test-bitstr aes-crypt aead-aes-crypt test-const_str_hash.strhash ifeq ($(with_transcoding),yes) @@ -111,7 +111,7 @@ daemon-tests: tests-preload.so $(MAKE) -C ../daemon $(MAKE) all-daemon-tests -all-daemon-tests: daemon-tests-main daemon-tests-jb +all-daemon-tests: daemon-tests-main daemon-tests-jb daemon-tests-pubsub daemon-tests-main: rm -rf fake-$@-sockets @@ -145,6 +145,14 @@ daemon-tests-dtx-cn: test "$$(ls fake-$@-sockets)" = "" rmdir fake-$@-sockets +daemon-tests-pubsub: + 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-pubsub.pl + test "$$(ls fake-$@-sockets)" = "" + rmdir fake-$@-sockets + test-bitstr: test-bitstr.o spandsp_send_fax_pcm: spandsp_send_fax_pcm.o diff --git a/t/auto-daemon-tests-pubsub.pl b/t/auto-daemon-tests-pubsub.pl new file mode 100755 index 000000000..c680a52ab --- /dev/null +++ b/t/auto-daemon-tests-pubsub.pl @@ -0,0 +1,1241 @@ +#!/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 + -n 2223 -c 12345 -f -L 7 -E -u 2222 --silence-detect=1)) + or die; + + + +my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $port_c, $ssrc_a, $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, + $ftr, $ttr, $ttr2); + + + + + +($sock_a, $sock_b, $sock_c) = + new_call([qw(198.51.100.14 6060)], [qw(198.51.100.14 6062)], [qw(198.51.100.14 6064)]); + +($port_a) = offer('sub, multi codec, sub w diff codec', + { }, < ft() }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, < ft(), codec => { transcode => ['PCMA'] } }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, < ft(), codec => { transcode => ['PCMA'] } }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < 'foo' }, < 'bar' }, < 'foo' }, < 'foo', 'to-tag' => $ttr }, < 'foo' }, < 'bar' }, < 'foo' }, < 'bar', 'to-tag' => $ttr }, < ft(), 'transport-protocol' => 'RTP/SAVP', + SDES => ['no-AEAD_AES_256_GCM', 'no-AEAD_AES_128_GCM'] }, < ft(), 'to-tag' => $ttr }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_256_CM_HMAC_SHA1_80}, + key => $srtp_key_a, +}; + +snd($sock_b, $port_a, rtp(0, 2001, 4160, 0x3456, "\x00" x 160)); +rcv($sock_a, $port_b, rtpm(0, 2001, 4160, $ssrc_a, "\x00" x 160)); +snd($sock_a, $port_b, rtp(0, 4001, 7160, 0x6543, "\x00" x 160)); +rcv($sock_b, $port_a, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160)); +srtp_rcv($sock_c, $port_c, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160), $srtp_ctx_a); + + + + +($sock_a, $sock_b, $sock_c) = + new_call([qw(198.51.100.14 6012)], [qw(198.51.100.14 6014)], [qw(198.51.100.14 6016)]); + +($port_a) = offer('SRTP sub', + { }, < ft(), 'transport-protocol' => 'RTP/SAVP', + SDES => ['no-AEAD_AES_256_GCM', 'no-AEAD_AES_128_GCM'] }, < ft(), 'to-tag' => $ttr }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, + key => $srtp_key_a, +}; + +snd($sock_b, $port_a, rtp(0, 2001, 4160, 0x3456, "\x00" x 160)); +rcv($sock_a, $port_b, rtpm(0, 2001, 4160, $ssrc_a, "\x00" x 160)); +snd($sock_a, $port_b, rtp(0, 4001, 7160, 0x6543, "\x00" x 160)); +rcv($sock_b, $port_a, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160)); +srtp_rcv($sock_c, $port_c, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160), $srtp_ctx_a); + + + + +($sock_a, $sock_b, $sock_c) = + new_call([qw(198.51.100.14 6018)], [qw(198.51.100.14 6020)], [qw(198.51.100.14 6022)]); + +($port_a) = offer('SRTP call RTP sub', + { }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, + key => 'DVM+BTeYX2UI1LaA9bgXrcBEDBxoItA9/39fSoRF', +}; +$srtp_ctx_b = { + cs => $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, + key => 'eMlRvW8mWU4WodT9JOvAM+pn6I0/EXOhT9n0KeKk', +}; + + +srtp_snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x3456, "\x00" x 160), $srtp_ctx_b); +($ssrc_a) = srtp_rcv($sock_a, $port_b, rtpm(0, 2000, 4000, -1, "\x00" x 160), $srtp_ctx_b); +srtp_snd($sock_a, $port_b, rtp(0, 4000, 7000, 0x6543, "\x00" x 160), $srtp_ctx_a); +($ssrc_b) = srtp_rcv($sock_b, $port_a, rtpm(0, 4000, 7000, -1, "\x00" x 160), $srtp_ctx_a); + +($ftr, $ttr, $port_c) = subscribe_request('SRTP call RTP sub', + { 'from-tag' => ft(), 'transport-protocol' => 'RTP/AVP', }, < ft(), 'to-tag' => $ttr }, < ft(), ICE => 'force' }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < { accept => ['PCMA'] } }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft(), codec => { strip => ['PCMA'], transcode => ['PCMU'] } }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, < 'fw' }, < 'bk' }, <