summaryrefslogtreecommitdiff
path: root/tests/pjsua/mod_call.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pjsua/mod_call.py')
-rw-r--r--tests/pjsua/mod_call.py226
1 files changed, 226 insertions, 0 deletions
diff --git a/tests/pjsua/mod_call.py b/tests/pjsua/mod_call.py
new file mode 100644
index 00000000..7081aed4
--- /dev/null
+++ b/tests/pjsua/mod_call.py
@@ -0,0 +1,226 @@
+# $Id$
+import time
+import imp
+import sys
+import inc_const as const
+from inc_cfg import *
+
+# Load configuration
+cfg_file = imp.load_source("cfg_file", ARGS[1])
+
+# Check media flow between ua1 and ua2
+def check_media(ua1, ua2):
+ ua1.send("#")
+ ua1.expect("#")
+ ua1.send("1122")
+ ua2.expect(const.RX_DTMF + "1")
+ ua2.expect(const.RX_DTMF + "1")
+ ua2.expect(const.RX_DTMF + "2")
+ ua2.expect(const.RX_DTMF + "2")
+
+
+# Test body function
+def test_func(t):
+ callee = t.process[0]
+ caller = t.process[1]
+
+ # if have_reg then wait for couple of seconds for PUBLISH
+ # to complete (just in case pUBLISH is used)
+ if callee.inst_param.have_reg:
+ time.sleep(1)
+ if caller.inst_param.have_reg:
+ time.sleep(1)
+
+ # Caller making call
+ caller.send("m")
+ caller.send(t.inst_params[0].uri)
+ caller.expect(const.STATE_CALLING)
+
+ # Callee waits for call and answers with 180/Ringing
+ time.sleep(0.2)
+ callee.expect(const.EVENT_INCOMING_CALL)
+ callee.send("a")
+ callee.send("180")
+ callee.expect("SIP/2.0 180")
+ caller.expect("SIP/2.0 180")
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Callee answers with 200/OK
+ callee.send("a")
+ callee.send("200")
+
+ # Wait until call is connected in both endpoints
+ time.sleep(0.2)
+ caller.expect(const.STATE_CONFIRMED)
+ callee.expect(const.STATE_CONFIRMED)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+ time.sleep(0.1)
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is okay
+ time.sleep(0.3)
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # Hold call by caller
+ caller.send("H")
+ caller.expect("INVITE sip:")
+ callee.expect("INVITE sip:")
+ caller.expect(const.MEDIA_HOLD)
+ callee.expect(const.MEDIA_HOLD)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Release hold
+ time.sleep(0.5)
+ caller.send("v")
+ caller.expect("INVITE sip:")
+ callee.expect("INVITE sip:")
+ caller.expect(const.MEDIA_ACTIVE, title="waiting for media active after call hold")
+ callee.expect(const.MEDIA_ACTIVE, title="waiting for media active after call hold")
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is okay
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Hold call by callee
+ callee.send("H")
+ callee.expect("INVITE sip:")
+ caller.expect("INVITE sip:")
+ caller.expect(const.MEDIA_HOLD)
+ callee.expect(const.MEDIA_HOLD)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Release hold
+ time.sleep(0.1)
+ callee.send("v")
+ callee.expect("INVITE sip:")
+ caller.expect("INVITE sip:")
+ callee.expect(const.MEDIA_ACTIVE, title="waiting for media active after call hold")
+ caller.expect(const.MEDIA_ACTIVE, title="waiting for media active after call hold")
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is okay
+ # Wait for some time for ICE negotiation
+ time.sleep(0.6)
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # UPDATE (by caller)
+ caller.send("U")
+ #caller.sync_stdout()
+ callee.expect(const.MEDIA_ACTIVE, title="waiting for media active with UPDATE")
+ caller.expect(const.MEDIA_ACTIVE, title="waiting for media active with UPDATE")
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is okay
+ time.sleep(0.1)
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # UPDATE (by callee)
+ callee.send("U")
+ callee.expect("UPDATE sip:")
+ caller.expect("UPDATE sip:")
+ caller.expect(const.MEDIA_ACTIVE, title="waiting for media active with UPDATE")
+ callee.expect(const.MEDIA_ACTIVE, title="waiting for media active with UPDATE")
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is okay
+ time.sleep(0.1)
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # Synchronize stdout
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Set codecs in both caller and callee so that there is
+ # no common codec between them.
+ # In caller we only enable PCMU, in callee we only enable PCMA
+ caller.send("Cp")
+ caller.expect("Enter codec")
+ caller.send("* 0")
+ caller.send("Cp")
+ caller.expect("Enter codec")
+ caller.send("pcmu 120")
+
+ callee.send("Cp")
+ callee.expect("Enter codec")
+ callee.send("* 0")
+ callee.send("Cp")
+ callee.expect("Enter codec")
+ callee.send("pcma 120")
+
+ # Test when UPDATE fails (by callee)
+ callee.send("U")
+ caller.expect("SIP/2.0 488")
+ callee.expect("SIP/2.0 488")
+ callee.sync_stdout()
+ caller.sync_stdout()
+
+ # Test that media is still okay
+ time.sleep(0.1)
+ check_media(caller, callee)
+ check_media(callee, caller)
+
+ # Test when UPDATE fails (by caller)
+ caller.send("U")
+ caller.expect("UPDATE sip:")
+ callee.expect("UPDATE sip:")
+ callee.expect("SIP/2.0 488")
+ caller.expect("SIP/2.0 488")
+ caller.sync_stdout()
+ callee.sync_stdout()
+
+ # Test that media is still okay
+ time.sleep(0.1)
+ check_media(callee, caller)
+ check_media(caller, callee)
+
+ # Hangup call
+ time.sleep(0.1)
+ caller.send("h")
+
+ # Wait until calls are cleared in both endpoints
+ caller.expect(const.STATE_DISCONNECTED)
+ callee.expect(const.STATE_DISCONNECTED)
+
+
+# Here where it all comes together
+test = cfg_file.test_param
+test.test_func = test_func
+