123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import sys
- import inc_sip as sip
- import inc_const as const
- import inc_util as util
- import re
- from inc_cfg import *
- # Read configuration
- cfg_file = util.load_module_from_file("cfg_file", ARGS[1])
- # Default server port (should we randomize?)
- srv_port = 50070
- def test_func(test):
- pjsua = test.process[0]
- dlg = sip.Dialog("127.0.0.1", pjsua.inst_param.sip_port,
- local_port=srv_port,
- tcp=cfg_file.recvfrom_cfg.tcp)
- config = pjsua.get_config(cfg_file.recvfrom_cfg.pj_config)
- print("Config : " + config)
- last_cseq = 0
- last_method = ""
- last_call_id = ""
- for t in cfg_file.recvfrom_cfg.transaction:
- # Check if transaction requires configuration
- if t.pj_config != "":
- r = re.compile(t.pj_config, re.I)
- if r.search(config) == None:
- print("Configuration : " + t.pj_config + " not found, skipping")
- continue
- # Print transaction title
- if t.title != "":
- dlg.trace(t.title)
- # Run command and expect patterns
- for c in t.cmds:
- if c[0] and c[0] != "":
- pjsua.send(c[0])
- if len(c)>1 and c[1] and c[1] != "":
- pjsua.expect(c[1])
- # Wait for request
- if t.check_cseq:
- # Absorbs retransmissions
- cseq = 0
- method = last_method
- call_id = last_call_id
- while cseq <= last_cseq and method == last_method and call_id == last_call_id:
- request, src_addr = dlg.wait_msg_from(30)
- if request==None or request=="":
- raise TestError("Timeout waiting for request")
- method = request.split(" ", 1)[0]
- cseq_hval = sip.get_header(request, "CSeq")
- cseq_hval = cseq_hval.split(" ")[0]
- cseq = int(cseq_hval)
- call_id = sip.get_header(request, "Call-ID")
- last_cseq = cseq
- last_method = method
- else:
- request, src_addr = dlg.wait_msg_from(30)
- if request==None or request=="":
- raise TestError("Timeout waiting for request")
- # Check for include patterns
- for pat in t.include:
- if re.search(pat, request, re.M | re.I)==None:
- if t.title:
- tname = " in " + t.title + " transaction"
- else:
- tname = ""
- raise TestError("Pattern " + pat + " not found" + tname)
- # Check for exclude patterns
- for pat in t.exclude:
- if re.search(pat, request, re.M | re.I)!=None:
- if t.title:
- tname = " in " + t.title + " transaction"
- else:
- tname = ""
- raise TestError("Excluded pattern " + pat + " found" + tname)
- # Create response
- if t.resp_code!=0:
- response = dlg.create_response(request, t.resp_code, "Status reason")
- # Add headers to response
- for h in t.resp_hdr:
- response = response + h + "\r\n"
- # Add message body if required
- if t.body:
- response = response + t.body
- # Send response
- dlg.send_msg(response, src_addr)
- # Expect something to happen in pjsua
- if t.expect != "":
- pjsua.expect(t.expect)
- # Sync
- pjsua.sync_stdout()
- # Replace "$PORT" with server port in pjsua args
- cfg_file.recvfrom_cfg.inst_param.arg = cfg_file.recvfrom_cfg.inst_param.arg.replace("$PORT", str(srv_port))
- # Here where it all comes together
- test = TestParam(cfg_file.recvfrom_cfg.name,
- [cfg_file.recvfrom_cfg.inst_param],
- test_func)
|