# $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