tests: voice: Add voice call test with Osmux enabled

Change-Id: Ie4f360a77f6fcbc74f140a7fcb5feef2d94ac734
diff --git a/suites/voice/lib/testlib.py b/suites/voice/lib/testlib.py
new file mode 100644
index 0000000..7d934f1
--- /dev/null
+++ b/suites/voice/lib/testlib.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.testenv import *
+
+def test_mo_mt_call(use_osmux=False, force_osmux=False):
+    hlr = suite.hlr()
+    bts = suite.bts()
+    mgw_msc = suite.mgw()
+    mgw_bsc = suite.mgw()
+    stp = suite.stp()
+    msc = suite.msc(hlr, mgw_msc, stp)
+    bsc = suite.bsc(msc, mgw_bsc, stp)
+    ms_mo = suite.modem()
+    ms_mt = suite.modem()
+
+    hlr.start()
+    stp.start()
+
+    msc.set_use_osmux(use_osmux, force_osmux)
+    msc.start()
+
+    # osmo-msc still doesn't support linking 2 internal leg calls through Osmux
+    # if both calls are using Osmux. Currently, RTP is always used between the 2
+    # endpoints of the MGW. See OS#4065.
+    mgw_msc.set_use_osmux(use_osmux, False)
+    mgw_msc.start()
+
+    # We don't want to force Osmux in BSC_MGW since in MGW BTS-side is still RTP.
+    mgw_bsc.set_use_osmux(use_osmux, False)
+    mgw_bsc.start()
+
+    bsc.set_use_osmux(use_osmux, force_osmux)
+    bsc.bts_add(bts)
+    bsc.start()
+
+    bts.start()
+    wait(bsc.bts_is_connected, bts)
+
+    hlr.subscriber_add(ms_mo)
+    hlr.subscriber_add(ms_mt)
+
+    ms_mo.connect(msc.mcc_mnc())
+    ms_mt.connect(msc.mcc_mnc())
+
+    ms_mo.log_info()
+    ms_mt.log_info()
+
+    print('waiting for modems to attach...')
+    wait(ms_mo.is_connected, msc.mcc_mnc())
+    wait(ms_mt.is_connected, msc.mcc_mnc())
+    wait(msc.subscriber_attached, ms_mo, ms_mt)
+
+    assert len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0
+    mo_cid = ms_mo.call_dial(ms_mt)
+    mt_cid = ms_mt.call_wait_incoming(ms_mo)
+    print('dial success')
+
+    assert not ms_mo.call_is_active(mo_cid) and not ms_mt.call_is_active(mt_cid)
+    ms_mt.call_answer(mt_cid)
+    wait(ms_mo.call_is_active, mo_cid)
+    wait(ms_mt.call_is_active, mt_cid)
+    print('answer success, call established and ongoing')
+
+    sleep(5) # maintain the call active for 5 seconds
+
+    assert ms_mo.call_is_active(mo_cid) and ms_mt.call_is_active(mt_cid)
+    ms_mt.call_hangup(mt_cid)
+    wait(lambda: len(ms_mo.call_id_list()) == 0 and len(ms_mt.call_id_list()) == 0)
+    print('hangup success')