summaryrefslogtreecommitdiff
path: root/test/decoders/sip
diff options
context:
space:
mode:
Diffstat (limited to 'test/decoders/sip')
-rw-r--r--test/decoders/sip/CMakeLists.txt151
-rw-r--r--test/decoders/sip/conf/spec.toml11
-rw-r--r--test/decoders/sip/pcap/01-complete-dialog.pcapbin0 -> 9624 bytes
-rw-r--r--test/decoders/sip/pcap/02-complete-call.pcapbin0 -> 5456 bytes
-rw-r--r--test/decoders/sip/pcap/03-complete-call-with-empty-line.pcapbin0 -> 5580 bytes
-rw-r--r--test/decoders/sip/pcap/04-complete-call-with-proxy.pcapbin0 -> 29495 bytes
-rw-r--r--test/decoders/sip/pcap/05-complete-call-with-two-dir-invite.pcapbin0 -> 12647 bytes
-rw-r--r--test/decoders/sip/pcap/06-complete-call-on-tcp.pcapbin0 -> 5395 bytes
-rw-r--r--test/decoders/sip/pcap/07-c2s-complete-dialog.pcapbin0 -> 5171 bytes
-rw-r--r--test/decoders/sip/pcap/08-c2s-complete-call.pcapbin0 -> 2705 bytes
-rw-r--r--test/decoders/sip/pcap/09-c2s-complete-call-with-proxy.pcapbin0 -> 17426 bytes
-rw-r--r--test/decoders/sip/pcap/10-s2c-complete-dialog.pcapbin0 -> 4477 bytes
-rw-r--r--test/decoders/sip/pcap/11-s2c-complete-call.pcapbin0 -> 2775 bytes
-rw-r--r--test/decoders/sip/pcap/12-s2c-complete-call-with-proxy.pcapbin0 -> 12093 bytes
-rw-r--r--test/decoders/sip/result/01-complete-dialog.json82
-rw-r--r--test/decoders/sip/result/02-complete-call.json40
-rw-r--r--test/decoders/sip/result/03-complete-call-with-empty-line.json40
-rw-r--r--test/decoders/sip/result/04-complete-call-with-proxy.json169
-rw-r--r--test/decoders/sip/result/05-complete-call-with-two-dir-invite.json77
-rw-r--r--test/decoders/sip/result/06-complete-call-on-tcp.json38
-rw-r--r--test/decoders/sip/result/07-c2s-complete-dialog.json62
-rw-r--r--test/decoders/sip/result/08-c2s-complete-call.json28
-rw-r--r--test/decoders/sip/result/09-c2s-complete-call-with-proxy.json120
-rw-r--r--test/decoders/sip/result/10-s2c-complete-dialog.json62
-rw-r--r--test/decoders/sip/result/11-s2c-complete-call.json28
-rw-r--r--test/decoders/sip/result/12-s2c-complete-call-with-proxy.json120
-rw-r--r--test/decoders/sip/result/13-complete-call-with-limit-1.json40
-rw-r--r--test/decoders/sip/result/14-complete-call-with-timeout-10s.json40
-rw-r--r--test/decoders/sip/result/15-complete-call-with-timeout-30s.json40
-rw-r--r--test/decoders/sip/sip_test_main.cpp79
-rw-r--r--test/decoders/sip/sip_test_module.cpp721
31 files changed, 1948 insertions, 0 deletions
diff --git a/test/decoders/sip/CMakeLists.txt b/test/decoders/sip/CMakeLists.txt
new file mode 100644
index 0000000..54236bd
--- /dev/null
+++ b/test/decoders/sip/CMakeLists.txt
@@ -0,0 +1,151 @@
+set(TEST_NAME sip_test)
+set(TEST_MAIN ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME})
+file(GLOB TEST_SRC "${TEST_NAME}*.cpp")
+
+add_executable(
+ ${TEST_NAME}
+ ${TEST_SRC}
+)
+
+target_include_directories(
+ ${TEST_NAME} PRIVATE
+ ${CMAKE_SOURCE_DIR}/deps/
+ ${CMAKE_SOURCE_DIR}/decoders/
+)
+
+target_link_libraries(
+ ${TEST_NAME}
+ sip
+ stellar_lib
+ cjson-static
+ dl "-rdynamic"
+ gtest
+ gmock
+)
+
+add_test(
+ NAME ${TEST_NAME}.SETUP
+ COMMAND sh -c "
+ mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/result/ &&
+
+ mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/log/ &&
+ mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/conf/ &&
+ cat ${CMAKE_SOURCE_DIR}/conf/stellar.toml > ${CMAKE_CURRENT_BINARY_DIR}/conf/stellar.toml &&
+ cat ${CMAKE_CURRENT_SOURCE_DIR}/conf/spec.toml >> ${CMAKE_CURRENT_BINARY_DIR}/conf/stellar.toml &&
+ sed -i 's/mode = \"pcapfile\"/mode = \"pcaplist\"/g' ${CMAKE_CURRENT_BINARY_DIR}/conf/stellar.toml &&
+ sed -i 's/pcap_path = \"\\\/tmp\\\/test.pcap\"/pcap_path = \"pcaplist.txt\"/g' ${CMAKE_CURRENT_BINARY_DIR}/conf/stellar.toml &&
+ find ${CMAKE_CURRENT_SOURCE_DIR}/result/ -type f | xargs -i cp {} ${CMAKE_CURRENT_BINARY_DIR}/result/ &&
+ find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/ -type f > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.01-complete-dialog
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '01-complete-dialog.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/01-complete-dialog.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.02-complete-call
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '02-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/02-complete-call.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.03-complete-call-with-empty-line
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '03-complete-call-with-empty-line.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/03-complete-call-with-empty-line.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.04-complete-call-with-proxy
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '04-complete-call-with-proxy.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/04-complete-call-with-proxy.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.05-complete-call-with-two-dir-invite
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '05-complete-call-with-two-dir-invite.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/05-complete-call-with-two-dir-invite.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.06-complete-call-on-tcp
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '06-complete-call-on-tcp.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/06-complete-call-on-tcp.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.07-c2s-complete-dialog
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '07-c2s-complete-dialog.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/07-c2s-complete-dialog.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.08-c2s-complete-call
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '08-c2s-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/08-c2s-complete-call.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.09-c2s-complete-call-with-proxy
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '09-c2s-complete-call-with-proxy.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/09-c2s-complete-call-with-proxy.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.10-s2c-complete-dialog
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '10-s2c-complete-dialog.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/10-s2c-complete-dialog.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.11-s2c-complete-call
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '11-s2c-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/11-s2c-complete-call.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.12-s2c-complete-call-with-proxy
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '12-s2c-complete-call-with-proxy.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/12-s2c-complete-call-with-proxy.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.13-complete-call-with-limit-1
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '02-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/13-complete-call-with-limit-1.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.14-complete-call-with-timeout-10s
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '02-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/14-complete-call-with-timeout-10s.json
+ "
+)
+add_test(
+ NAME ${TEST_NAME}.15-complete-call-with-timeout-30s
+ COMMAND sh -c "
+ cat ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.all | grep '02-complete-call.pcap' > ${CMAKE_CURRENT_BINARY_DIR}/pcaplist.txt &&
+ ${TEST_MAIN} -m -c ./conf/stellar.toml -f ${CMAKE_CURRENT_BINARY_DIR}/result/15-complete-call-with-timeout-30s.json
+ "
+)
+
+set_tests_properties(
+ ${TEST_NAME}.01-complete-dialog
+ PROPERTIES
+ FIXTURES_REQUIRED ${TEST_NAME}.SETUP
+)
diff --git a/test/decoders/sip/conf/spec.toml b/test/decoders/sip/conf/spec.toml
new file mode 100644
index 0000000..9bf9049
--- /dev/null
+++ b/test/decoders/sip/conf/spec.toml
@@ -0,0 +1,11 @@
+# stellar_plugin.toml
+#
+[[module]]
+path = ""
+init = "sip_init"
+exit = "sip_exit"
+
+[[module]]
+path = ""
+init = "sip_test_init"
+exit = "sip_test_exit"
diff --git a/test/decoders/sip/pcap/01-complete-dialog.pcap b/test/decoders/sip/pcap/01-complete-dialog.pcap
new file mode 100644
index 0000000..fef0252
--- /dev/null
+++ b/test/decoders/sip/pcap/01-complete-dialog.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/02-complete-call.pcap b/test/decoders/sip/pcap/02-complete-call.pcap
new file mode 100644
index 0000000..27dcd5a
--- /dev/null
+++ b/test/decoders/sip/pcap/02-complete-call.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/03-complete-call-with-empty-line.pcap b/test/decoders/sip/pcap/03-complete-call-with-empty-line.pcap
new file mode 100644
index 0000000..bd1d096
--- /dev/null
+++ b/test/decoders/sip/pcap/03-complete-call-with-empty-line.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/04-complete-call-with-proxy.pcap b/test/decoders/sip/pcap/04-complete-call-with-proxy.pcap
new file mode 100644
index 0000000..3875e73
--- /dev/null
+++ b/test/decoders/sip/pcap/04-complete-call-with-proxy.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/05-complete-call-with-two-dir-invite.pcap b/test/decoders/sip/pcap/05-complete-call-with-two-dir-invite.pcap
new file mode 100644
index 0000000..038c81d
--- /dev/null
+++ b/test/decoders/sip/pcap/05-complete-call-with-two-dir-invite.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/06-complete-call-on-tcp.pcap b/test/decoders/sip/pcap/06-complete-call-on-tcp.pcap
new file mode 100644
index 0000000..f51f64e
--- /dev/null
+++ b/test/decoders/sip/pcap/06-complete-call-on-tcp.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/07-c2s-complete-dialog.pcap b/test/decoders/sip/pcap/07-c2s-complete-dialog.pcap
new file mode 100644
index 0000000..ac83bfb
--- /dev/null
+++ b/test/decoders/sip/pcap/07-c2s-complete-dialog.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/08-c2s-complete-call.pcap b/test/decoders/sip/pcap/08-c2s-complete-call.pcap
new file mode 100644
index 0000000..081ca40
--- /dev/null
+++ b/test/decoders/sip/pcap/08-c2s-complete-call.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/09-c2s-complete-call-with-proxy.pcap b/test/decoders/sip/pcap/09-c2s-complete-call-with-proxy.pcap
new file mode 100644
index 0000000..66bce10
--- /dev/null
+++ b/test/decoders/sip/pcap/09-c2s-complete-call-with-proxy.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/10-s2c-complete-dialog.pcap b/test/decoders/sip/pcap/10-s2c-complete-dialog.pcap
new file mode 100644
index 0000000..6d2c992
--- /dev/null
+++ b/test/decoders/sip/pcap/10-s2c-complete-dialog.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/11-s2c-complete-call.pcap b/test/decoders/sip/pcap/11-s2c-complete-call.pcap
new file mode 100644
index 0000000..28319a6
--- /dev/null
+++ b/test/decoders/sip/pcap/11-s2c-complete-call.pcap
Binary files differ
diff --git a/test/decoders/sip/pcap/12-s2c-complete-call-with-proxy.pcap b/test/decoders/sip/pcap/12-s2c-complete-call-with-proxy.pcap
new file mode 100644
index 0000000..beecb8a
--- /dev/null
+++ b/test/decoders/sip/pcap/12-s2c-complete-call-with-proxy.pcap
Binary files differ
diff --git a/test/decoders/sip/result/01-complete-dialog.json b/test/decoders/sip/result/01-complete-dialog.json
new file mode 100644
index 0000000..a804264
--- /dev/null
+++ b/test/decoders/sip/result/01-complete-dialog.json
@@ -0,0 +1,82 @@
+[
+ {
+ "bye": "originator",
+ "callid": "0seuMoGmE.gmmU16GkVbxuFRPNvkZK1m",
+ "cseq": "58 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "180",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=aNoEhdOkv50IiTC2XG-ckdvPFl8Eglzv",
+ "originator_sdp": "v=0\r\no=- 3703802843 3703802843 IN IP4 202.43.148.166\r\ns=pjmedia\r\nb=AS:84\r\nt=0 0\r\na=X-nat:1\r\nm=audio 4000 RTP/AVP 0 8 104 96\r\nc=IN IP4 202.43.148.166\r\nb=TIAS:64000\r\na=rtcp:4001 IN IP4 202.43.148.166\r\na=sendrecv\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:104 iLBC/8000\r\na=fmtp:104 mode=30\r\na=rtpmap:96 telephone-event/8000\r\na=fmtp:96 0-16\r\n",
+ "originator_sdp_media_audio_port": 4000,
+ "originator_sdp_media_ip": "202.43.148.166",
+ "responder_description": "sip:[email protected]",
+ "responder_sdp": "v=0\r\no=- 3419 3419 IN IP4 139.129.211.227\r\ns=VOS3000\r\nc=IN IP4 139.129.211.227\r\nt=0 0\r\nm=audio 30790 RTP/AVP 0 101\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 30790,
+ "responder_sdp_media_ip": "139.129.211.227",
+ "server": "VOS3000 V2.1.6.00",
+ "test_result": 1,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjh06y0MA4Ef17KHi6coyNt.oYo6-A4MyU"
+ },
+ {
+ "callid": "K2OSZB7cd5OTowdHoHTzzWyYX3fVqht8",
+ "cseq": "25461 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "405"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=7-fTlqp68THG740NBxM8OLkda47k16qu",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 2,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjXIeWmm7lDGeT3UHsc.p3fCuxl4G27jl8"
+ },
+ {
+ "callid": "ylZwkyZFxejabfyj4X7G1b-KCCgKtdY.",
+ "cseq": "35307 REGISTER",
+ "method_cseq_array": [
+ "register",
+ "register",
+ "register",
+ "register",
+ "register",
+ "register"
+ ],
+ "method_rescode_array": [
+ "register",
+ "401",
+ "register",
+ "200",
+ "register",
+ "200"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=.rmiME17Bwt1ATrRYlIcijQD4LN6g5xl",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 3,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjgHErPqZEEe93p.FELmghVDsVzJwTLy3p"
+ }
+]
diff --git a/test/decoders/sip/result/02-complete-call.json b/test/decoders/sip/result/02-complete-call.json
new file mode 100644
index 0000000..a377d56
--- /dev/null
+++ b/test/decoders/sip/result/02-complete-call.json
@@ -0,0 +1,40 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/03-complete-call-with-empty-line.json b/test/decoders/sip/result/03-complete-call-with-empty-line.json
new file mode 100644
index 0000000..a377d56
--- /dev/null
+++ b/test/decoders/sip/result/03-complete-call-with-empty-line.json
@@ -0,0 +1,40 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/04-complete-call-with-proxy.json b/test/decoders/sip/result/04-complete-call-with-proxy.json
new file mode 100644
index 0000000..06aafdb
--- /dev/null
+++ b/test/decoders/sip/result/04-complete-call-with-proxy.json
@@ -0,0 +1,169 @@
+[
+ {
+ "bye": "originator",
+ "callid": "ZDRjYWNhMzA5NDdmYzYzMGRmYTYwNmZmZGRmNzc3NTE.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "407",
+ "ack",
+ "invite",
+ "100",
+ "180",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=c42cde23",
+ "originator_sdp": "v=0\r\no=- 9 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 49738 RTP/AVP 0 8 18 101\r\na=alt:1 3 : Ysbkrqav oetTILx7 169.254.7.194 49738\r\na=alt:2 2 : q9OOjmX8 Xlhn1oYR 169.254.48.65 49738\r\na=alt:3 1 : syl0IXfv afOOYd57 192.168.50.68 49738\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:354215C61E6B42BD809C4D740324B1F3\r\nm=video 57826 RTP/AVP 115 34\r\na=alt:1 3 : Yf1yx/VS PdYNr16U 169.254.7.194 57826\r\na=alt:2 2 : qsSkMBe/ IdJSK1LS 169.254.48.65 57826\r\na=alt:3 1 : liL1EzaT DfjzhxEr 192.168.50.68 57826\r\na=fmtp:115 QCIF=2 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=2 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:D5988637AE9C4053A8E6E887BC3D270D\r\n",
+ "originator_sdp_media_audio_port": 49738,
+ "originator_sdp_media_ip": "192.168.50.68",
+ "originator_sdp_media_video_port": 57826,
+ "responder_description": "\"1038\"<sip:[email protected]:5060>",
+ "responder_sdp": "v=0\r\no=- 7 2 IN IP4 192.168.36.64\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.64\r\nt=0 0\r\nm=audio 52188 RTP/AVP 0 8 18 101\r\na=alt:1 1 : 4JPpFDvE mn5GwW8z 192.168.36.64 52188\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:70F70193B63E45C6A473B0D8B8B46665\r\nm=video 30090 RTP/AVP 115 34\r\na=alt:1 1 : x54MkCBj gaoyAbUY 192.168.36.64 30090\r\na=fmtp:115 QCIF=1 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=1 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:F36E8B538BDB4748895486E45A9B9789\r\n",
+ "responder_sdp_media_audio_port": 52188,
+ "responder_sdp_media_ip": "192.168.36.64",
+ "responder_sdp_media_video_port": 30090,
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 1,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-8e418f41137fcc2c-1--d87543-;rport"
+ },
+ {
+ "bye": "originator",
+ "callid": "NzE3YzI0Y2U1NDFiZDRjYzk3NzgzOTEwODk4NWMyZTM.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "invite",
+ "407",
+ "ack",
+ "invite",
+ "407",
+ "ack",
+ "100",
+ "180",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=ae361d01",
+ "originator_sdp": "v=0\r\no=- 2 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 58256 RTP/AVP 0 8 18 101\r\na=alt:1 3 : Ukq6IWE+ sPXc/kpP 169.254.7.194 58256\r\na=alt:2 2 : 9Zzg2VLF Zk9CWytB 169.254.48.65 58256\r\na=alt:3 1 : 1PAMvtIf 4tJHWela 192.168.50.68 58256\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:96915E7B514C46E2AE550ED690392D51\r\nm=video 9582 RTP/AVP 115 34\r\na=alt:1 3 : jZqjg8B7 NAw32Thx 169.254.7.194 9582\r\na=alt:2 2 : rDZLEnot JbntDk1h 169.254.48.65 9582\r\na=alt:3 1 : k/ZVxfWw /zS8chaA 192.168.50.68 9582\r\na=fmtp:115 QCIF=2 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=2 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:E673AB2155EF4EB98F107C828ECB14A1\r\n",
+ "originator_sdp_media_audio_port": 58256,
+ "originator_sdp_media_ip": "192.168.50.68",
+ "originator_sdp_media_video_port": 9582,
+ "responder_description": "\"1038\"<sip:[email protected]:5060>",
+ "responder_sdp": "v=0\r\no=- 9 2 IN IP4 192.168.36.64\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.64\r\nt=0 0\r\nm=audio 5998 RTP/AVP 0 8 18 101\r\na=alt:1 1 : YO/bnCGP kAri1zsb 192.168.36.64 5998\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:37C21754CB9D472EAA684A680B74553D\r\nm=video 53206 RTP/AVP 115 34\r\na=alt:1 1 : tPK4TpGl Mg6nG3cl 192.168.36.64 53206\r\na=fmtp:115 QCIF=1 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=1 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:48CBA905D47E495096455E3778CE42AE\r\n",
+ "responder_sdp_media_audio_port": 5998,
+ "responder_sdp_media_ip": "192.168.36.64",
+ "responder_sdp_media_video_port": 53206,
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 2,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-a07f874b220a3b05-1--d87543-;rport"
+ },
+ {
+ "callid": "M2NhN2I0NzBkZjFhMTkwMDIxODk1YjllN2ZiZTk5ZDI.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe",
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "407",
+ "subscribe",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=8542a020",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 3,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-823a494ec8173d67-1--d87543-;rport"
+ },
+ {
+ "callid": "ZDU0NGVmN2UyZWU2ZjFkN2E2NzZkMzczZDE4NTQ1OGQ.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe",
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "407",
+ "subscribe",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=d13ff607",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 4,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-a93d19660e74c136-1--d87543-;rport"
+ },
+ {
+ "callid": "NTIwM2RmMjQyNmU1NTNiODZhYWU0MjRhN2JhMTc0NTU.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe",
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "407",
+ "subscribe",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=2721a84d",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 5,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-e6750a38d852cc14-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/05-complete-call-with-two-dir-invite.json b/test/decoders/sip/result/05-complete-call-with-two-dir-invite.json
new file mode 100644
index 0000000..aa6adb4
--- /dev/null
+++ b/test/decoders/sip/result/05-complete-call-with-two-dir-invite.json
@@ -0,0 +1,77 @@
+[
+ {
+ "bye": "responder",
+ "callid": "YTcwNjg2OTQ3MWFhZTI2MDg1MDRkMzQ5NmMyMjJmOWE.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "407",
+ "ack",
+ "invite",
+ "100",
+ "180",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"1030\"<sip:[email protected]:5060>;tag=98737c0c",
+ "originator_sdp": "v=0\r\no=- 4 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 52056 RTP/AVP 0 8 18 101\r\na=alt:1 3 : opd9/sgt Vr8Ttk83 192.168.48.1 52056\r\na=alt:2 2 : iugt0GCV dN9UXXXx 192.168.237.1 52056\r\na=alt:3 1 : JautfEUw 92B0OZ+j 192.168.36.97 52056\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:FDCC9EBB233B4AC4B793D4D25490D806\r\n",
+ "originator_sdp_media_audio_port": 52056,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "responder_sdp": "v=0\r\no=- 4 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 4944 RTP/AVP 0 8 18 101\r\na=alt:1 3 : lb0y6UiS dvaqGd2D 169.254.7.194 4944\r\na=alt:2 2 : IQWKr5N7 P24M3b1e 169.254.48.65 4944\r\na=alt:3 1 : qby+cteH PvMOdORy 192.168.50.68 4944\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:38935D9859634191BBD2008170E8F73C\r\n",
+ "responder_sdp_media_audio_port": 4944,
+ "responder_sdp_media_ip": "192.168.50.68",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:47381-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:47381;branch=z9hG4bK-d87543-f56d9c03de4b2227-1--d87543-;rport"
+ },
+ {
+ "bye": "responder",
+ "callid": "NGNkNjE0MjQ1MjI4NjdjNmE3Y2QwZDY4NjI2MDEzZjQ.",
+ "cseq": "2 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "180",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=324c8154",
+ "originator_sdp": "v=0\r\no=- 4 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 16160 RTP/AVP 0 8 18 101\r\na=alt:1 3 : VCBMZzkP KIWmfyDw 169.254.7.194 16160\r\na=alt:2 2 : z92C5YbS M5WgnYQj 169.254.48.65 16160\r\na=alt:3 1 : gfcoHYdt OJI5tsZv 192.168.50.68 16160\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:699FA8B13B374E1993D24CCD808EF1AA\r\n",
+ "originator_sdp_media_audio_port": 16160,
+ "originator_sdp_media_ip": "192.168.50.68",
+ "responder_description": "\"1030\"<sip:[email protected]:5060>",
+ "responder_sdp": "v=0\r\no=- 4 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 11208 RTP/AVP 0 8 18 101\r\na=alt:1 3 : p4Bf9q5H usALR/9g 192.168.48.1 11208\r\na=alt:2 2 : YUymdXru IDtVTg0Q 192.168.237.1 11208\r\na=alt:3 1 : C4MpNfxr ommU+2Le 192.168.36.97 11208\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:91B98646E59C4F679B4A971700660509\r\n",
+ "responder_sdp_media_audio_port": 11208,
+ "responder_sdp_media_ip": "192.168.36.97",
+ "test_result": 2,
+ "tuple6": "192.168.36.97:47381-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:7537;received=192.168.50.68;branch=z9hG4bK-d87543-0f67d1484d39436e-1--d87543-;rport=7537"
+ }
+]
diff --git a/test/decoders/sip/result/06-complete-call-on-tcp.json b/test/decoders/sip/result/06-complete-call-on-tcp.json
new file mode 100644
index 0000000..dcfcfb9
--- /dev/null
+++ b/test/decoders/sip/result/06-complete-call-on-tcp.json
@@ -0,0 +1,38 @@
+[
+ {
+ "bye": "responder",
+ "callid": "[email protected]",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "180",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "<sip:[email protected]>;tag=1c1589367133",
+ "originator_sdp": "v=0\r\no=IPP 1589356486 1589356361 IN IP4 10.33.6.100\r\ns=Phone-Call\r\nc=IN IP4 10.33.6.100\r\nt=0 0\r\nm=audio 6000 RTP/AVP 8 13 101\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15,16\r\na=ptime:20\r\na=sendrecv\r\n",
+ "originator_sdp_media_audio_port": 6000,
+ "originator_sdp_media_ip": "10.33.6.100",
+ "responder_description": "<sip:[email protected];user=phone>",
+ "responder_sdp": "v=0\r\no=GW 343007640 343007510 IN IP4 10.33.6.101\r\ns=Phone-Call\r\nc=IN IP4 10.33.6.101\r\nt=0 0\r\nm=audio 6050 RTP/AVP 8 13 101\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15,16\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 6050,
+ "responder_sdp_media_ip": "10.33.6.101",
+ "server": "GW/v.6.20A.027.012",
+ "test_result": 1,
+ "tuple6": "10.33.6.100:64802-10.33.6.101:5060-6-0",
+ "user_agent": "IPP/v.6.20A.027.012",
+ "via": "SIP/2.0/TCP 10.33.6.100;branch=z9hG4bKac1589375893;alias"
+ }
+]
diff --git a/test/decoders/sip/result/07-c2s-complete-dialog.json b/test/decoders/sip/result/07-c2s-complete-dialog.json
new file mode 100644
index 0000000..62aa1e5
--- /dev/null
+++ b/test/decoders/sip/result/07-c2s-complete-dialog.json
@@ -0,0 +1,62 @@
+[
+ {
+ "bye": "originator",
+ "callid": "0seuMoGmE.gmmU16GkVbxuFRPNvkZK1m",
+ "cseq": "58 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "ack",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "ack",
+ "bye"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=aNoEhdOkv50IiTC2XG-ckdvPFl8Eglzv",
+ "originator_sdp": "v=0\r\no=- 3703802843 3703802843 IN IP4 202.43.148.166\r\ns=pjmedia\r\nb=AS:84\r\nt=0 0\r\na=X-nat:1\r\nm=audio 4000 RTP/AVP 0 8 104 96\r\nc=IN IP4 202.43.148.166\r\nb=TIAS:64000\r\na=rtcp:4001 IN IP4 202.43.148.166\r\na=sendrecv\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:104 iLBC/8000\r\na=fmtp:104 mode=30\r\na=rtpmap:96 telephone-event/8000\r\na=fmtp:96 0-16\r\n",
+ "originator_sdp_media_audio_port": 4000,
+ "originator_sdp_media_ip": "202.43.148.166",
+ "responder_description": "sip:[email protected]",
+ "test_result": 1,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjh06y0MA4Ef17KHi6coyNt.oYo6-A4MyU"
+ },
+ {
+ "callid": "K2OSZB7cd5OTowdHoHTzzWyYX3fVqht8",
+ "cseq": "25461 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=7-fTlqp68THG740NBxM8OLkda47k16qu",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 2,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjXIeWmm7lDGeT3UHsc.p3fCuxl4G27jl8"
+ },
+ {
+ "callid": "ylZwkyZFxejabfyj4X7G1b-KCCgKtdY.",
+ "cseq": "35307 REGISTER",
+ "method_cseq_array": [
+ "register",
+ "register",
+ "register"
+ ],
+ "method_rescode_array": [
+ "register",
+ "register",
+ "register"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=.rmiME17Bwt1ATrRYlIcijQD4LN6g5xl",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 3,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "user_agent": "MythCall iOS v2.5.5/armv7-apple-darwin_ios",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;rport;branch=z9hG4bKPjgHErPqZEEe93p.FELmghVDsVzJwTLy3p"
+ }
+]
diff --git a/test/decoders/sip/result/08-c2s-complete-call.json b/test/decoders/sip/result/08-c2s-complete-call.json
new file mode 100644
index 0000000..f95dbc5
--- /dev/null
+++ b/test/decoders/sip/result/08-c2s-complete-call.json
@@ -0,0 +1,28 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "ack",
+ "ack",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "ack",
+ "ack",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/09-c2s-complete-call-with-proxy.json b/test/decoders/sip/result/09-c2s-complete-call-with-proxy.json
new file mode 100644
index 0000000..a3bc498
--- /dev/null
+++ b/test/decoders/sip/result/09-c2s-complete-call-with-proxy.json
@@ -0,0 +1,120 @@
+[
+ {
+ "bye": "originator",
+ "callid": "ZDRjYWNhMzA5NDdmYzYzMGRmYTYwNmZmZGRmNzc3NTE.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=c42cde23",
+ "originator_sdp": "v=0\r\no=- 9 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 49738 RTP/AVP 0 8 18 101\r\na=alt:1 3 : Ysbkrqav oetTILx7 169.254.7.194 49738\r\na=alt:2 2 : q9OOjmX8 Xlhn1oYR 169.254.48.65 49738\r\na=alt:3 1 : syl0IXfv afOOYd57 192.168.50.68 49738\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:354215C61E6B42BD809C4D740324B1F3\r\nm=video 57826 RTP/AVP 115 34\r\na=alt:1 3 : Yf1yx/VS PdYNr16U 169.254.7.194 57826\r\na=alt:2 2 : qsSkMBe/ IdJSK1LS 169.254.48.65 57826\r\na=alt:3 1 : liL1EzaT DfjzhxEr 192.168.50.68 57826\r\na=fmtp:115 QCIF=2 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=2 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:D5988637AE9C4053A8E6E887BC3D270D\r\n",
+ "originator_sdp_media_audio_port": 49738,
+ "originator_sdp_media_ip": "192.168.50.68",
+ "originator_sdp_media_video_port": 57826,
+ "responder_description": "\"1038\"<sip:[email protected]:5060>",
+ "test_result": 1,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-8e418f41137fcc2c-1--d87543-;rport"
+ },
+ {
+ "bye": "originator",
+ "callid": "NzE3YzI0Y2U1NDFiZDRjYzk3NzgzOTEwODk4NWMyZTM.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "ack",
+ "ack",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "ack",
+ "ack",
+ "bye"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=ae361d01",
+ "originator_sdp": "v=0\r\no=- 2 2 IN IP4 192.168.50.68\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.50.68\r\nt=0 0\r\nm=audio 58256 RTP/AVP 0 8 18 101\r\na=alt:1 3 : Ukq6IWE+ sPXc/kpP 169.254.7.194 58256\r\na=alt:2 2 : 9Zzg2VLF Zk9CWytB 169.254.48.65 58256\r\na=alt:3 1 : 1PAMvtIf 4tJHWela 192.168.50.68 58256\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:96915E7B514C46E2AE550ED690392D51\r\nm=video 9582 RTP/AVP 115 34\r\na=alt:1 3 : jZqjg8B7 NAw32Thx 169.254.7.194 9582\r\na=alt:2 2 : rDZLEnot JbntDk1h 169.254.48.65 9582\r\na=alt:3 1 : k/ZVxfWw /zS8chaA 192.168.50.68 9582\r\na=fmtp:115 QCIF=2 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=2 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:E673AB2155EF4EB98F107C828ECB14A1\r\n",
+ "originator_sdp_media_audio_port": 58256,
+ "originator_sdp_media_ip": "192.168.50.68",
+ "originator_sdp_media_video_port": 9582,
+ "responder_description": "\"1038\"<sip:[email protected]:5060>",
+ "test_result": 2,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-a07f874b220a3b05-1--d87543-;rport"
+ },
+ {
+ "callid": "M2NhN2I0NzBkZjFhMTkwMDIxODk1YjllN2ZiZTk5ZDI.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=8542a020",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "test_result": 3,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-823a494ec8173d67-1--d87543-;rport"
+ },
+ {
+ "callid": "ZDU0NGVmN2UyZWU2ZjFkN2E2NzZkMzczZDE4NTQ1OGQ.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=d13ff607",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "test_result": 4,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-a93d19660e74c136-1--d87543-;rport"
+ },
+ {
+ "callid": "NTIwM2RmMjQyNmU1NTNiODZhYWU0MjRhN2JhMTc0NTU.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=2721a84d",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>",
+ "test_result": 5,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;branch=z9hG4bK-d87543-e6750a38d852cc14-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/10-s2c-complete-dialog.json b/test/decoders/sip/result/10-s2c-complete-dialog.json
new file mode 100644
index 0000000..d3ca04e
--- /dev/null
+++ b/test/decoders/sip/result/10-s2c-complete-dialog.json
@@ -0,0 +1,62 @@
+[
+ {
+ "bye": "originator",
+ "callid": "0seuMoGmE.gmmU16GkVbxuFRPNvkZK1m",
+ "cseq": "58 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "100",
+ "180",
+ "200",
+ "200"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=aNoEhdOkv50IiTC2XG-ckdvPFl8Eglzv",
+ "responder_description": "sip:[email protected];tag=4d6ca6e64d83babb",
+ "responder_sdp": "v=0\r\no=- 3419 3419 IN IP4 139.129.211.227\r\ns=VOS3000\r\nc=IN IP4 139.129.211.227\r\nt=0 0\r\nm=audio 30790 RTP/AVP 0 101\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 30790,
+ "responder_sdp_media_ip": "139.129.211.227",
+ "server": "VOS3000 V2.1.6.00",
+ "test_result": 1,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;received=202.43.148.166;rport=5121;branch=z9hG4bKPjh06y0MA4Ef17KHi6coyNt.oYo6-A4MyU"
+ },
+ {
+ "callid": "K2OSZB7cd5OTowdHoHTzzWyYX3fVqht8",
+ "cseq": "25461 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "405"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=7-fTlqp68THG740NBxM8OLkda47k16qu",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 2,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;received=202.43.148.166;rport=5121;branch=z9hG4bKPjXIeWmm7lDGeT3UHsc.p3fCuxl4G27jl8"
+ },
+ {
+ "callid": "ylZwkyZFxejabfyj4X7G1b-KCCgKtdY.",
+ "cseq": "35307 REGISTER",
+ "method_cseq_array": [
+ "register",
+ "register",
+ "register"
+ ],
+ "method_rescode_array": [
+ "401",
+ "200",
+ "200"
+ ],
+ "originator_description": "\"13520407511\" <sip:[email protected]>;tag=.rmiME17Bwt1ATrRYlIcijQD4LN6g5xl",
+ "responder_description": "\"13520407511\" <sip:[email protected]>",
+ "test_result": 3,
+ "tuple6": "202.43.148.166:5121-139.129.211.227:5060-17-0",
+ "via": "SIP/2.0/UDP 202.43.148.166:5121;received=202.43.148.166;rport=5121;branch=z9hG4bKPjgHErPqZEEe93p.FELmghVDsVzJwTLy3p"
+ }
+]
diff --git a/test/decoders/sip/result/11-s2c-complete-call.json b/test/decoders/sip/result/11-s2c-complete-call.json
new file mode 100644
index 0000000..c885337
--- /dev/null
+++ b/test/decoders/sip/result/11-s2c-complete-call.json
@@ -0,0 +1,28 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "100",
+ "200",
+ "200",
+ "bye"
+ ],
+ "originator_description": "\"test1\" <sip:[email protected]>;tag=fd34fa7d",
+ "responder_description": "\"[email protected]\" <sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/12-s2c-complete-call-with-proxy.json b/test/decoders/sip/result/12-s2c-complete-call-with-proxy.json
new file mode 100644
index 0000000..aef3ca9
--- /dev/null
+++ b/test/decoders/sip/result/12-s2c-complete-call-with-proxy.json
@@ -0,0 +1,120 @@
+[
+ {
+ "bye": "originator",
+ "callid": "ZDRjYWNhMzA5NDdmYzYzMGRmYTYwNmZmZGRmNzc3NTE.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "407",
+ "100",
+ "180",
+ "200",
+ "200"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=c42cde23",
+ "responder_description": "\"1038\"<sip:[email protected]:5060>;tag=846d.8319acc87f795d6fad5326ce040af11e",
+ "responder_sdp": "v=0\r\no=- 7 2 IN IP4 192.168.36.64\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.64\r\nt=0 0\r\nm=audio 52188 RTP/AVP 0 8 18 101\r\na=alt:1 1 : 4JPpFDvE mn5GwW8z 192.168.36.64 52188\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:70F70193B63E45C6A473B0D8B8B46665\r\nm=video 30090 RTP/AVP 115 34\r\na=alt:1 1 : x54MkCBj gaoyAbUY 192.168.36.64 30090\r\na=fmtp:115 QCIF=1 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=1 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:F36E8B538BDB4748895486E45A9B9789\r\n",
+ "responder_sdp_media_audio_port": 52188,
+ "responder_sdp_media_ip": "192.168.36.64",
+ "responder_sdp_media_video_port": 30090,
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 1,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;received=192.168.50.68;branch=z9hG4bK-d87543-8e418f41137fcc2c-1--d87543-;rport=46442"
+ },
+ {
+ "bye": "originator",
+ "callid": "NzE3YzI0Y2U1NDFiZDRjYzk3NzgzOTEwODk4NWMyZTM.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "invite",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "407",
+ "407",
+ "100",
+ "180",
+ "200",
+ "200",
+ "200"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=ae361d01",
+ "responder_description": "\"1038\"<sip:[email protected]:5060>;tag=846d.c35a95d5b0841928748f572e5080cd90",
+ "responder_sdp": "v=0\r\no=- 9 2 IN IP4 192.168.36.64\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.64\r\nt=0 0\r\nm=audio 5998 RTP/AVP 0 8 18 101\r\na=alt:1 1 : YO/bnCGP kAri1zsb 192.168.36.64 5998\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:37C21754CB9D472EAA684A680B74553D\r\nm=video 53206 RTP/AVP 115 34\r\na=alt:1 1 : tPK4TpGl Mg6nG3cl 192.168.36.64 53206\r\na=fmtp:115 QCIF=1 I=1 J=1 K=1 MaxBR=1960\r\na=fmtp:34 QCIF=1 MaxBR=1960\r\na=rtpmap:115 H263-1998/90000\r\na=rtpmap:34 H263/90000\r\na=sendrecv\r\na=x-rtp-session-id:48CBA905D47E495096455E3778CE42AE\r\n",
+ "responder_sdp_media_audio_port": 5998,
+ "responder_sdp_media_ip": "192.168.36.64",
+ "responder_sdp_media_video_port": 53206,
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 2,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;received=192.168.50.68;branch=z9hG4bK-d87543-a07f874b220a3b05-1--d87543-;rport=46442"
+ },
+ {
+ "callid": "M2NhN2I0NzBkZjFhMTkwMDIxODk1YjllN2ZiZTk5ZDI.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "407",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=8542a020",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>;tag=846d.d4c07ec1dcdf1c8bd9f604e4c7a80ae7",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 3,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;received=192.168.50.68;branch=z9hG4bK-d87543-823a494ec8173d67-1--d87543-;rport=46442"
+ },
+ {
+ "callid": "ZDU0NGVmN2UyZWU2ZjFkN2E2NzZkMzczZDE4NTQ1OGQ.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "407",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=d13ff607",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>;tag=846d.392735082489933dfe0d5b688a48d6f3",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 4,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;received=192.168.50.68;branch=z9hG4bK-d87543-a93d19660e74c136-1--d87543-;rport=46442"
+ },
+ {
+ "callid": "NTIwM2RmMjQyNmU1NTNiODZhYWU0MjRhN2JhMTc0NTU.",
+ "cseq": "1 SUBSCRIBE",
+ "method_cseq_array": [
+ "subscribe",
+ "subscribe"
+ ],
+ "method_rescode_array": [
+ "407",
+ "503"
+ ],
+ "originator_description": "\"1032\"<sip:[email protected]:5060>;tag=2721a84d",
+ "responder_description": "\"1032\"<sip:[email protected]:5060>;tag=846d.ecc91ea49edd16acd81aeb2a61bc3233",
+ "server": "OpenSIPS (2.4.9 (x86_64/linux))",
+ "test_result": 5,
+ "tuple6": "192.168.50.68:46442-192.168.40.158:5060-17-0",
+ "via": "SIP/2.0/UDP 192.168.50.68:46442;received=192.168.50.68;branch=z9hG4bK-d87543-e6750a38d852cc14-1--d87543-;rport=46442"
+ }
+]
diff --git a/test/decoders/sip/result/13-complete-call-with-limit-1.json b/test/decoders/sip/result/13-complete-call-with-limit-1.json
new file mode 100644
index 0000000..a377d56
--- /dev/null
+++ b/test/decoders/sip/result/13-complete-call-with-limit-1.json
@@ -0,0 +1,40 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/14-complete-call-with-timeout-10s.json b/test/decoders/sip/result/14-complete-call-with-timeout-10s.json
new file mode 100644
index 0000000..a377d56
--- /dev/null
+++ b/test/decoders/sip/result/14-complete-call-with-timeout-10s.json
@@ -0,0 +1,40 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/result/15-complete-call-with-timeout-30s.json b/test/decoders/sip/result/15-complete-call-with-timeout-30s.json
new file mode 100644
index 0000000..a377d56
--- /dev/null
+++ b/test/decoders/sip/result/15-complete-call-with-timeout-30s.json
@@ -0,0 +1,40 @@
+[
+ {
+ "bye": "responder",
+ "callid": "OGIzMzVkMDY0YTVmNzJmOWRmMGFjZWU4YjFlN2VlZGI.",
+ "cseq": "1 INVITE",
+ "method_cseq_array": [
+ "invite",
+ "invite",
+ "invite",
+ "ack",
+ "invite",
+ "ack",
+ "bye",
+ "bye"
+ ],
+ "method_rescode_array": [
+ "invite",
+ "100",
+ "200",
+ "ack",
+ "200",
+ "ack",
+ "bye",
+ "200"
+ ],
+ "originator_description": "\"test1\"<sip:[email protected]>;tag=fd34fa7d",
+ "originator_sdp": "v=0\r\no=- 6 2 IN IP4 192.168.36.97\r\ns=CounterPath eyeBeam 1.5\r\nc=IN IP4 192.168.36.97\r\nt=0 0\r\nm=audio 47782 RTP/AVP 0 8 18 101\r\na=alt:1 3 : 8rYKJy7Q suxCbgXp 192.168.48.1 47782\r\na=alt:2 2 : emfnqGoq LfzkM/Ar 192.168.237.1 47782\r\na=alt:3 1 : mE7OGFW5 0sJEvxvE 192.168.36.97 47782\r\na=fmtp:18 annexb=no\r\na=fmtp:101 0-15\r\na=rtpmap:18 G729/8000\r\na=rtpmap:101 telephone-event/8000\r\na=sendrecv\r\na=x-rtp-session-id:BF8A71898AD64337A82CB51A63150F00\r\n",
+ "originator_sdp_media_audio_port": 47782,
+ "originator_sdp_media_ip": "192.168.36.97",
+ "responder_description": "\"[email protected]\"<sip:[email protected]>",
+ "responder_sdp": "v=0\r\no=CARRIER 1614051872 1614051872 IN IP4 80.239.235.113\r\ns=SIP Call\r\nc=IN IP4 80.239.235.113\r\nt=0 0\r\nm=audio 11446 RTP/AVP 0 101\r\na=rtpmap:0 pcmu/8000\r\na=rtpmap:101 telephone-event/8000\r\na=ptime:20\r\na=sendrecv\r\n",
+ "responder_sdp_media_audio_port": 11446,
+ "responder_sdp_media_ip": "80.239.235.113",
+ "server": "(Very nice Sip Registrar/Proxy Server)",
+ "test_result": 1,
+ "tuple6": "192.168.36.97:57326-77.72.169.134:5060-17-0",
+ "user_agent": "eyeBeam release 1011d stamp 40820",
+ "via": "SIP/2.0/UDP 192.168.36.97:57326;branch=z9hG4bK-d87543-1407230f4943213a-1--d87543-;rport"
+ }
+]
diff --git a/test/decoders/sip/sip_test_main.cpp b/test/decoders/sip/sip_test_main.cpp
new file mode 100644
index 0000000..91c7016
--- /dev/null
+++ b/test/decoders/sip/sip_test_main.cpp
@@ -0,0 +1,79 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "stellar/stellar.h"
+
+#include <gtest/gtest.h>
+
+const char *usage = "Usage: %s [-m] [-u test_filter] [-c config_file] [-f result_file]\n";
+
+int main(int argc, char **argv) {
+ int opt;
+ int run_unittest = 0;
+ int run_stellar = 0;
+ const char *test_filter = NULL;
+ const char *result_filename = NULL;
+ const char *conf_filename = NULL;
+
+ if (argc == 1) {
+ fprintf(stderr, usage, argv[0]);
+ exit(-1);
+ }
+
+ while ((opt = getopt(argc, argv, "hmu:c:f:")) != -1) {
+ switch (opt) {
+ case 'u':
+ run_unittest = 1;
+ test_filter = optarg;
+ break;
+ case 'm':
+ run_stellar = 1;
+ break;
+ case 'f':
+ result_filename = optarg;
+ break;
+ case 'c':
+ conf_filename = optarg;
+ break;
+ case 'h':
+ default:
+ fprintf(stderr, usage, argv[0]);
+ exit(-1);
+ }
+ }
+
+ ::testing::InitGoogleTest(&argc, argv);
+
+ if (run_unittest) {
+ testing::GTEST_FLAG(filter) = test_filter ? test_filter : "";
+ int test_ret = RUN_ALL_TESTS();
+ if (test_ret != 0) {
+ fprintf(stderr, "Tests failed with return code %d\n", test_ret);
+ return test_ret;
+ }
+ }
+
+ if (run_stellar) {
+ if (result_filename == NULL) {
+ result_filename = "./sip_result.json";
+ }
+ // setenv for sip test module
+ setenv("SIP_TEST_RESULT_EXPECT", result_filename, 1);
+
+ if (conf_filename == NULL) {
+ conf_filename = "./conf/stellar.toml";
+ }
+
+ struct stellar *st = stellar_new(conf_filename);
+ if (st == NULL) {
+ fprintf(stderr, "Failed to create stellar instance.\n");
+ return -1;
+ }
+
+ stellar_run(st);
+ stellar_free(st);
+ }
+
+ return ::testing::Test::HasFailure() ? -1 : 0;
+}
diff --git a/test/decoders/sip/sip_test_module.cpp b/test/decoders/sip/sip_test_module.cpp
new file mode 100644
index 0000000..f42e40b
--- /dev/null
+++ b/test/decoders/sip/sip_test_module.cpp
@@ -0,0 +1,721 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "stellar/stellar.h"
+#include "stellar/module.h"
+#include "stellar/session.h"
+#include "stellar/utils.h"
+#include "stellar/sip.h"
+
+#include <gtest/gtest.h>
+#include <uthash/uthash.h>
+#include "cjson/cJSON.h"
+
+#define SIP_TEST_MODULE_NAME "SIP_TEST_MODULE"
+#define SIP_TEST_RESULT_EXPECT_ENV "SIP_TEST_RESULT_EXPECT"
+#define SIP_TEST_EXDATA_NAME "SIP_TEST_EXDATA"
+
+#define SIP_TEST_TRANSACTION_SEQ_MAX 64
+
+#define timeval_delta_ms(start, end) (((end).tv_sec-(start).tv_sec)*1000 + ((end).tv_usec-(start).tv_usec)/1000)
+#define timeval_delta_us(start, end) (((end).tv_sec-(start).tv_sec)*1000*1000 + ((end).tv_usec-(start).tv_usec))
+#define timeval_to_ms(t) ((t).tv_sec*1000+(t).tv_usec/1000)
+
+struct sip_test_sockaddr_in {
+ int family;
+ union {
+ struct sockaddr_in ipv4;
+ struct sockaddr_in6 ipv6;
+ } sockaddr;
+};
+
+struct sip_test_transaction {
+ char *tuple6;
+ char *callid;
+ char *via;
+ char *cseq;
+ char *server;
+ char *user_agent;
+ char *reason;
+ char *bye;
+ char *originator_description;
+ char *originator_description_tag;
+ char *originator_sdp;
+ char *originator_sdp_media_ip;
+ char *responder_description;
+ char *responder_description_tag;
+ char *responder_sdp;
+ char *responder_sdp_media_ip;
+ unsigned short originator_sdp_media_audio_port;
+ unsigned short originator_sdp_media_video_port;
+ unsigned short responder_sdp_media_audio_port;
+ unsigned short responder_sdp_media_video_port;
+ cJSON *method_rescode_array;
+ cJSON *method_cseq_array;
+
+ int is_log_done;
+ int request_seen;
+ int response_seen;
+ long long invite_timestamp_ms;
+ long long bye_timestamp_ms;
+ struct sip_test_sockaddr_in sockaddr;
+
+ char *call_id; // hash key
+ size_t call_id_len;
+ UT_hash_handle hh;
+};
+
+struct sip_test_exdata {
+ int callback_times;
+ struct sip_test_transaction* transactions;
+ struct sip_test_module_ctx *mod_ctx_ref;
+};
+
+struct sip_test_result {
+ cJSON *test_json;
+ cJSON *expect_json;
+ int count;
+};
+
+struct sip_test_module_ctx {
+ int exdata_id;
+ struct sip_test_result *result;
+
+ // depends a single session pcap
+ int callback_times;
+ struct module_manager *mod_mgr_ref;
+};
+
+const char* g_sip_test_method_name[] = {
+ "unknown",
+ "invite",
+ "ack",
+ "options",
+ "register",
+ "bye",
+ "cancel",
+ "do",
+ "info",
+ "message",
+ "notify",
+ "prack",
+ "qauth",
+ "refer",
+ "sprack",
+ "subscribe",
+ "update",
+ "publish"
+};
+
+static void sip_test_result_commit(struct sip_test_result *result, cJSON *json)
+{
+ cJSON_AddNumberToObject(json, "test_result", ++result->count);
+ cJSON_AddItemToArray(result->test_json, json);
+}
+
+static void sip_test_result_compare(struct sip_test_result *result)
+{
+ EXPECT_TRUE(result->expect_json != NULL);
+ EXPECT_TRUE(result->test_json != NULL);
+
+ int i, json_compare;
+ int test_result_count, expect_result_count;
+ char *test_str, *expect_str;
+ cJSON *tmp_test, *tmp_expect;
+
+ //expect_str = cJSON_Print(result->expect_json);
+ //test_str = cJSON_Print(result->test_json);
+ //printf("LOAD Raw:\n%s\n", expect_str);
+ //printf("TEST Raw:\n%s\n", test_str);
+
+ test_result_count = cJSON_GetArraySize(result->test_json);
+ expect_result_count = cJSON_GetArraySize(result->expect_json);
+
+ EXPECT_EQ(test_result_count, expect_result_count);
+
+ for (i = 0; i < MIN(test_result_count, expect_result_count); i++) {
+ tmp_test = cJSON_GetArrayItem(result->test_json, i);
+ tmp_expect = cJSON_GetArrayItem(result->expect_json, i);
+ expect_str = cJSON_Print(tmp_expect);
+ test_str = cJSON_Print(tmp_test);
+
+ json_compare = cJSON_Compare(tmp_expect, tmp_test, 0);
+ if (json_compare != 1) {
+ printf("LOAD Diff:\n%s\n", expect_str);
+ printf("TEST Diff:\n%s\n", test_str);
+ }
+
+ free(expect_str);
+ free(test_str);
+
+ EXPECT_EQ(json_compare, 1);
+ break;
+ }
+}
+
+static void sip_test_result_exit(struct sip_test_result *result)
+{
+ if (result->expect_json) {
+ cJSON_Delete(result->expect_json);
+ }
+ if (result->test_json) {
+ cJSON_Delete(result->test_json);
+ }
+ free(result);
+}
+
+static struct sip_test_result * sip_test_result_init(const char *filename)
+{
+ long filesize;
+ char *buffer;
+ FILE *file;
+ struct sip_test_result *result;
+
+ result = (struct sip_test_result *)calloc(1, sizeof(struct sip_test_result));
+
+ file = fopen(filename, "rb");
+ if (file) {
+ fseek(file, 0, SEEK_END);
+ filesize = ftell(file);
+ rewind(file);
+ buffer = (char *)calloc(filesize + 1, 1);
+ fread(buffer, 1, filesize, file);
+
+ result->expect_json = cJSON_Parse(buffer);
+
+ free(buffer);
+ fclose(file);
+ }
+
+ result->test_json = cJSON_CreateArray();
+
+ printf("sip test result expect: %s\n", filename);
+ return result;
+}
+
+static void sip_test_store_packet_dst(struct sip_test_sockaddr_in *sockaddr, const struct packet *pkt) {
+ const struct layer *layer;
+
+ if (sockaddr == NULL) {
+ return;
+ }
+
+ memset(sockaddr, 0, sizeof(struct sip_test_sockaddr_in));
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 2);
+ if (layer->proto == LAYER_PROTO_IPV4) {
+ sockaddr->family = AF_INET;
+ sockaddr->sockaddr.ipv4.sin_family = AF_INET;
+ sockaddr->sockaddr.ipv4.sin_addr = layer->hdr.ip4->ip_dst;
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 1);
+ if (layer->proto == LAYER_PROTO_TCP) {
+ sockaddr->sockaddr.ipv4.sin_port = htons(layer->hdr.tcp->dest);
+ }
+ if (layer->proto == LAYER_PROTO_UDP) {
+ sockaddr->sockaddr.ipv4.sin_port = htons(layer->hdr.udp->dest);
+ }
+ }
+ if (layer->proto == LAYER_PROTO_IPV6) {
+ sockaddr->family = AF_INET6;
+ sockaddr->sockaddr.ipv6.sin6_family = AF_INET6;
+ memcpy(&sockaddr->sockaddr.ipv6.sin6_addr, &layer->hdr.ip6->ip6_dst, sizeof(struct in6_addr));
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 2);
+ if (layer->proto == LAYER_PROTO_TCP) {
+ sockaddr->sockaddr.ipv6.sin6_port = htons(layer->hdr.tcp->dest);
+ }
+ if (layer->proto == LAYER_PROTO_UDP) {
+ sockaddr->sockaddr.ipv6.sin6_port = htons(layer->hdr.udp->dest);
+ }
+ }
+}
+
+static void sip_test_store_packet_src(struct sip_test_sockaddr_in *sockaddr, const struct packet *pkt) {
+ const struct layer *layer;
+
+ if (sockaddr == NULL) {
+ return;
+ }
+
+ memset(sockaddr, 0, sizeof(struct sip_test_sockaddr_in));
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 2);
+ if (layer->proto == LAYER_PROTO_IPV4) {
+ sockaddr->family = AF_INET;
+ sockaddr->sockaddr.ipv4.sin_family = AF_INET;
+ sockaddr->sockaddr.ipv4.sin_addr = layer->hdr.ip4->ip_src;
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 1);
+ if (layer->proto == LAYER_PROTO_TCP) {
+ sockaddr->sockaddr.ipv4.sin_port = htons(layer->hdr.tcp->source);
+ }
+ if (layer->proto == LAYER_PROTO_UDP) {
+ sockaddr->sockaddr.ipv4.sin_port = htons(layer->hdr.udp->source);
+ }
+ }
+ if (layer->proto == LAYER_PROTO_IPV6) {
+ sockaddr->family = AF_INET6;
+ sockaddr->sockaddr.ipv6.sin6_family = AF_INET6;
+ memcpy(&sockaddr->sockaddr.ipv6.sin6_addr, &layer->hdr.ip6->ip6_src, sizeof(struct in6_addr));
+
+ layer = packet_get_layer_by_idx(pkt, packet_get_layer_count(pkt) - 2);
+ if (layer->proto == LAYER_PROTO_TCP) {
+ sockaddr->sockaddr.ipv6.sin6_port = htons(layer->hdr.tcp->source);
+ }
+ if (layer->proto == LAYER_PROTO_UDP) {
+ sockaddr->sockaddr.ipv6.sin6_port = htons(layer->hdr.udp->source);
+ }
+ }
+}
+
+static int sip_test_compare_packet_src(struct sip_test_sockaddr_in *sockaddr, const struct packet *pkt)
+{
+ struct sip_test_sockaddr_in pkt_src;
+ sip_test_store_packet_src(&pkt_src, pkt);
+ return 0 == memcmp(sockaddr, &pkt_src, sizeof(pkt_src));
+}
+
+void sip_test_transaction_free(struct sip_test_transaction *transaction)
+{
+ if (transaction == NULL) return;
+ if (transaction->tuple6 ) free(transaction->tuple6);
+ if (transaction->callid ) free(transaction->callid);
+ if (transaction->via ) free(transaction->via);
+ if (transaction->cseq ) free(transaction->cseq);
+ if (transaction->server ) free(transaction->server);
+ if (transaction->user_agent ) free(transaction->user_agent);
+ if (transaction->bye ) free(transaction->bye);
+ if (transaction->originator_description ) free(transaction->originator_description);
+ if (transaction->originator_description_tag ) free(transaction->originator_description_tag);
+ if (transaction->originator_sdp ) free(transaction->originator_sdp);
+ if (transaction->originator_sdp_media_ip ) free(transaction->originator_sdp_media_ip);
+ if (transaction->responder_description ) free(transaction->responder_description);
+ if (transaction->responder_description_tag ) free(transaction->responder_description_tag);
+ if (transaction->responder_sdp ) free(transaction->responder_sdp);
+ if (transaction->responder_sdp_media_ip ) free(transaction->responder_sdp_media_ip);
+
+ if (transaction->call_id) free(transaction->call_id);
+ free(transaction);
+}
+
+struct sip_test_transaction *sip_test_transaction_new(void)
+{
+ return (struct sip_test_transaction *)calloc(1, sizeof(struct sip_test_transaction));
+}
+
+static void sip_test_transaction_log(struct sip_test_module_ctx *mod_ctx, struct sip_test_transaction *transaction)
+{
+ if (transaction->is_log_done) {
+ return;
+ }
+ transaction->is_log_done = 1;
+
+ cJSON *json = cJSON_CreateObject();
+
+ if (transaction->tuple6) {
+ cJSON_AddStringToObject(json, "tuple6",transaction->tuple6);
+ }
+ if (transaction->callid) {
+ cJSON_AddStringToObject(json, "callid",transaction->callid);
+ }
+ if (transaction->via ) {
+ cJSON_AddStringToObject(json, "via",transaction->via);
+ }
+ if (transaction->cseq ) {
+ cJSON_AddStringToObject(json, "cseq",transaction->cseq);
+ }
+ if (transaction->server) {
+ cJSON_AddStringToObject(json, "server",transaction->server);
+ }
+ if (transaction->user_agent) {
+ cJSON_AddStringToObject(json, "user_agent",transaction->user_agent);
+ }
+ if (transaction->bye) {
+ cJSON_AddStringToObject(json, "bye", transaction->bye);
+ }
+ if (transaction->originator_description) {
+ cJSON_AddStringToObject(json, "originator_description",transaction->originator_description);
+ }
+ if (transaction->originator_description_tag) {
+ cJSON_AddStringToObject(json, "originator_description_tag",transaction->originator_description_tag);
+ }
+ if (transaction->originator_sdp) {
+ cJSON_AddStringToObject(json, "originator_sdp",transaction->originator_sdp);
+ }
+ if (transaction->originator_sdp_media_ip ) {
+ cJSON_AddStringToObject(json, "originator_sdp_media_ip",transaction->originator_sdp_media_ip);
+ }
+ if (transaction->originator_sdp_media_audio_port) {
+ cJSON_AddNumberToObject(json, "originator_sdp_media_audio_port",transaction->originator_sdp_media_audio_port);
+ }
+ if (transaction->originator_sdp_media_video_port) {
+ cJSON_AddNumberToObject(json, "originator_sdp_media_video_port",transaction->originator_sdp_media_video_port);
+ }
+ if (transaction->responder_description ) {
+ cJSON_AddStringToObject(json, "responder_description",transaction->responder_description);
+ }
+ if (transaction->responder_description_tag ) {
+ cJSON_AddStringToObject(json, "responder_description_tag",transaction->responder_description_tag);
+ }
+ if (transaction->responder_sdp ) {
+ cJSON_AddStringToObject(json, "responder_sdp",transaction->responder_sdp);
+ }
+ if (transaction->responder_sdp_media_ip) {
+ cJSON_AddStringToObject(json, "responder_sdp_media_ip",transaction->responder_sdp_media_ip);
+ }
+ if (transaction->responder_sdp_media_audio_port) {
+ cJSON_AddNumberToObject(json, "responder_sdp_media_audio_port", transaction->responder_sdp_media_audio_port);
+ }
+ if (transaction->responder_sdp_media_video_port) {
+ cJSON_AddNumberToObject(json, "responder_sdp_media_video_port", transaction->responder_sdp_media_video_port);
+ }
+
+ if (transaction->method_rescode_array) {
+ cJSON_AddItemToObject(json, "method_rescode_array", transaction->method_rescode_array);
+ transaction->method_rescode_array = NULL;
+ }
+ if (transaction->method_cseq_array) {
+ cJSON_AddItemToObject(json, "method_cseq_array", transaction->method_cseq_array);
+ transaction->method_cseq_array = NULL;
+ }
+
+ sip_test_result_commit(mod_ctx->result, json);
+}
+
+struct sip_test_transaction * sip_test_transaction_get(struct sip_test_exdata *exdata, char *call_id, size_t call_id_len)
+{
+ struct sip_test_transaction *transaction = NULL;
+
+ HASH_FIND(hh, exdata->transactions, call_id, call_id_len, transaction);
+ if (transaction == NULL) {
+ transaction = sip_test_transaction_new();
+ transaction->method_rescode_array = cJSON_CreateArray();
+ transaction->method_cseq_array = cJSON_CreateArray();
+ transaction->call_id = (char *)malloc(call_id_len);
+ transaction->call_id_len = call_id_len;
+ memcpy(transaction->call_id, call_id, call_id_len);
+ } else {
+ HASH_DELETE(hh, exdata->transactions, transaction);
+ }
+ HASH_ADD_KEYPTR(hh, exdata->transactions, transaction->call_id, transaction->call_id_len, transaction);
+ return transaction;
+}
+
+static void sip_test_transaction_fill_body(struct sip_test_transaction *transaction, struct sip_body *body, int is_request)
+{
+ if (is_request) {
+ // originator media
+ if (transaction->originator_sdp == NULL && body->sdp_content && body->sdp_content_len > 0) {
+ transaction->originator_sdp = strndup(body->sdp_content, body->sdp_content_len);
+ }
+ if (transaction->originator_sdp_media_ip == NULL && body->media_ip && body->media_ip_len > 0) {
+ transaction->originator_sdp_media_ip = strndup(body->media_ip, body->media_ip_len);
+ }
+ if (transaction->originator_sdp_media_audio_port == 0) {
+ transaction->originator_sdp_media_audio_port = body->media_audio_port;
+ }
+ if (transaction->originator_sdp_media_video_port == 0) {
+ transaction->originator_sdp_media_video_port = body->media_video_port;
+ }
+ } else {
+ // responder media
+ if (transaction->responder_sdp == NULL && body->sdp_content && body->sdp_content_len > 0) {
+ transaction->responder_sdp = strndup(body->sdp_content, body->sdp_content_len);
+ }
+ if (transaction->responder_sdp_media_ip == NULL && body->media_ip && body->media_ip_len > 0) {
+ transaction->responder_sdp_media_ip = strndup(body->media_ip, body->media_ip_len);
+ }
+ if (transaction->responder_sdp_media_audio_port == 0) {
+ transaction->responder_sdp_media_audio_port = body->media_audio_port;
+ }
+ if (transaction->responder_sdp_media_video_port == 0) {
+ transaction->responder_sdp_media_video_port = body->media_video_port;
+ }
+ }
+}
+
+static void sip_test_transaction_fill_header(struct sip_test_transaction *transaction, struct sip_header *header)
+{
+ struct sip_header_field *field;
+
+ field = header->call_id;
+ if (transaction->callid == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->callid = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->from;
+ if (transaction->originator_description == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->originator_description = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->to;
+ if (transaction->responder_description == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->responder_description = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->cseq;
+ if (transaction->cseq == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->cseq = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->via;
+ if (transaction->via == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->via = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->server;
+ if (transaction->server == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->server = strndup(field->field_value, field->field_value_len);
+ }
+ field = header->user_agent;
+ if (transaction->user_agent == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->user_agent = strndup(field->field_value, field->field_value_len);
+ }
+}
+
+static void sip_test_transaction_fill_method(struct sip_test_transaction *transaction, enum sip_method method)
+{
+ cJSON_AddItemToArray(transaction->method_rescode_array, cJSON_CreateString(g_sip_test_method_name[method]));
+ cJSON_AddItemToArray(transaction->method_cseq_array, cJSON_CreateString(g_sip_test_method_name[method]));
+}
+
+static void sip_test_transaction_fill_cseq_method(struct sip_test_transaction *transaction, enum sip_method cseq_method)
+{
+ cJSON_AddItemToArray(transaction->method_cseq_array, cJSON_CreateString(g_sip_test_method_name[cseq_method]));
+}
+
+static void sip_test_transaction_fill_status_code(struct sip_test_transaction *transaction, char *status_code, size_t status_code_len)
+{
+ char *status_code_str = strndup(status_code, status_code_len);
+ cJSON_AddItemToArray(transaction->method_rescode_array, cJSON_CreateString(status_code_str));
+ free(status_code_str);
+}
+
+void sip_test_exdata_free(int idx, void *ex_ptr, void *arg)
+{
+ (void)(idx);
+ struct sip_test_module_ctx *mod_ctx = (struct sip_test_module_ctx *)arg;
+ struct sip_test_exdata *exdata = (struct sip_test_exdata *)ex_ptr;
+
+ if (exdata) {
+ struct sip_test_transaction *transaction = NULL, *tmp = NULL;
+ HASH_ITER(hh, exdata->transactions, transaction, tmp) {
+ HASH_DELETE(hh, exdata->transactions, transaction);
+ sip_test_transaction_log(mod_ctx, transaction);
+ sip_test_transaction_free(transaction);
+ }
+
+ free(exdata);
+ }
+}
+
+static void sip_test_request_callback(struct session *sess,
+ struct sip_request_line *request_line,
+ struct sip_header *header,
+ struct sip_body *body,
+ void *arg)
+{
+ (void)(request_line);
+ (void)(header);
+ (void)(body);
+ (void)(arg);
+ struct timeval ts;
+ struct sip_test_exdata *exdata;
+ struct sip_test_transaction *transaction;
+ struct sip_test_module_ctx *mod_ctx = (struct sip_test_module_ctx *)arg;
+
+ exdata = (struct sip_test_exdata *)session_get_exdata(sess, mod_ctx->exdata_id);
+ if (exdata == NULL) {
+ exdata = (struct sip_test_exdata *)calloc(1, sizeof(struct sip_test_exdata));
+ session_set_exdata(sess, mod_ctx->exdata_id, exdata);
+ }
+
+ transaction = sip_test_transaction_get(exdata, (char *)header->call_id->field_value, header->call_id->field_value_len);
+ if (transaction == NULL) {
+ return;
+ }
+ if (transaction->request_seen == 0) {
+ transaction->request_seen = 1;
+ }
+ if (transaction->tuple6 == NULL) {
+ transaction->tuple6 = strdup(session_get_readable_addr(sess));
+ }
+ sip_test_transaction_fill_method(transaction, request_line->method);
+ sip_test_transaction_fill_header(transaction, header);
+
+ const struct packet *pkt = session_get_current_packet(sess);
+ switch (request_line->method) {
+ case SIP_METHOD_INVITE:
+ if (body->body) {
+ sip_test_transaction_fill_body(transaction, body, 1);
+ }
+
+ // record originator session sockaddr
+ sip_test_store_packet_src(&transaction->sockaddr, pkt);
+
+ // record invite timestamp
+ if (transaction->invite_timestamp_ms == 0) {
+ gettimeofday(&ts, NULL);
+ transaction->invite_timestamp_ms = timeval_to_ms(ts);
+ }
+ break;
+ case SIP_METHOD_BYE:
+ if (transaction->bye == NULL) {
+ // check originator session sockaddr
+ if (sip_test_compare_packet_src(&transaction->sockaddr, pkt)) {
+ transaction->bye = strdup("originator");
+ } else {
+ transaction->bye = strdup("responder");
+ }
+
+ // record bye timestamp
+ gettimeofday(&ts, NULL);
+ transaction->bye_timestamp_ms = timeval_to_ms(ts);
+
+ // transaction in symmetric session should be delete now
+ if (! (transaction->request_seen && transaction->response_seen)) {
+ sip_test_transaction_log(mod_ctx, transaction);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return;
+}
+static void sip_test_response_callback(struct session *sess,
+ struct sip_status_line *status_line,
+ struct sip_header *header,
+ struct sip_body *body,
+ void *arg)
+{
+ (void)(status_line);
+ (void)(header);
+ (void)(body);
+ (void)(arg);
+ struct timeval ts;
+ struct sip_header_field *field;
+ struct sip_test_exdata *exdata;
+ struct sip_test_transaction *transaction;
+ struct sip_test_module_ctx *mod_ctx = (struct sip_test_module_ctx *)arg;
+
+ exdata = (struct sip_test_exdata *)session_get_exdata(sess, mod_ctx->exdata_id);
+ if (exdata == NULL) {
+ exdata = (struct sip_test_exdata *)calloc(1, sizeof(struct sip_test_exdata));
+ session_set_exdata(sess, mod_ctx->exdata_id, exdata);
+ }
+
+ transaction = sip_test_transaction_get(exdata, (char*)header->call_id->field_value, header->call_id->field_value_len);
+ if (transaction == NULL) {
+ return;
+ }
+ if (transaction->response_seen == 0) {
+ transaction->response_seen = 1;
+ }
+ if (transaction->tuple6 == NULL) {
+ transaction->tuple6 = strdup(session_get_readable_addr(sess));
+ }
+ sip_test_transaction_fill_status_code(transaction, (char*)status_line->code, status_line->code_len);
+ sip_test_transaction_fill_cseq_method(transaction, header->cseq_method);
+ sip_test_transaction_fill_header(transaction, header);
+
+ const struct packet *pkt = session_get_current_packet(sess);
+ switch (header->cseq_method) {
+ case SIP_METHOD_INVITE:
+ if (body->body) {
+ sip_test_transaction_fill_body(transaction, body, 0);
+ }
+
+ // originator session sockaddr
+ sip_test_store_packet_dst(&transaction->sockaddr, pkt);
+
+ // record invite timestamp
+ if (transaction->invite_timestamp_ms == 0) {
+ gettimeofday(&ts, NULL);
+ transaction->invite_timestamp_ms = timeval_to_ms(ts);
+ }
+ break;
+ case SIP_METHOD_BYE:
+ // check originator session sockaddr
+ if (transaction->bye == NULL) {
+ if (sip_test_compare_packet_src(&transaction->sockaddr, pkt)) {
+ transaction->bye = strdup("responder");
+ } else {
+ transaction->bye = strdup("originator");
+ }
+ }
+
+ // record bye timestamp
+ if (transaction->bye_timestamp_ms == 0) {
+ gettimeofday(&ts, NULL);
+ transaction->bye_timestamp_ms = timeval_to_ms(ts);
+ }
+
+ // record bye reason
+ field = header->reason;
+ if (transaction->reason == NULL && field && field->field_value && field->field_value_len > 0) {
+ transaction->reason = strndup(field->field_value, field->field_value_len);
+ }
+
+ sip_test_transaction_log(mod_ctx, transaction);
+ break;
+ default:
+ break;
+ }
+
+ return;
+}
+
+extern "C" void sip_test_exit(struct module_manager *mod_mgr, struct module *mod)
+{
+ (void)(mod_mgr);
+ struct sip_test_module_ctx *mod_ctx;
+
+ if (mod) {
+ mod_ctx = (struct sip_test_module_ctx *)module_get_ctx(mod);
+ if (mod_ctx) {
+ sip_test_result_compare(mod_ctx->result);
+ sip_test_result_exit(mod_ctx->result);
+ free(mod_ctx);
+ }
+ module_free(mod);
+ }
+}
+
+extern "C" struct module *sip_test_init(struct module_manager *mod_mgr)
+{
+ int ret;
+ struct module *mod;
+ struct sip_test_module_ctx *mod_ctx;
+ struct session_manager *sess_mgr;
+ struct sip_decoder *decoder;
+
+ mod_ctx = (struct sip_test_module_ctx *)calloc(1, sizeof(struct sip_test_module_ctx));
+ mod_ctx->mod_mgr_ref = mod_mgr;
+ mod = module_new(SIP_TEST_MODULE_NAME, mod_ctx);
+ sess_mgr = module_to_session_manager(module_manager_get_module(mod_mgr, SESSION_MANAGER_MODULE_NAME));
+
+ if (mod_mgr == NULL || sess_mgr == NULL) {
+ goto exit;
+ }
+
+ mod_ctx->exdata_id = session_manager_new_session_exdata_index(sess_mgr, SIP_TEST_EXDATA_NAME, sip_test_exdata_free, mod_ctx);
+ if (mod_ctx->exdata_id < 0) {
+ goto exit;
+ }
+
+ mod_ctx->result = sip_test_result_init(getenv(SIP_TEST_RESULT_EXPECT_ENV));
+ if (mod_ctx->result == NULL) {
+ goto exit;
+ }
+
+ decoder = module_to_sip_decoder(module_manager_get_module(mod_mgr, SIP_MODULE_NAME));
+ ret = sip_subscribe(decoder, sip_test_request_callback, sip_test_response_callback, mod_ctx);
+ if (ret < 0) {
+ goto exit;
+ }
+
+ return mod;
+exit:
+ printf("sip_test module init failed!\n");
+ sip_test_exit(mod_mgr, mod);
+ return NULL;
+}