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


# Test body function
def test_func(t):
	u1 = t.process[0]
	uri1 = cfg_file.test_param.inst_params[0].uri
	acc1 = "-1"
	u2 = t.process[1]
	uri2 = cfg_file.test_param.inst_params[1].uri
	acc2 = "-1"

	# if have_reg then wait for couple of seconds for PUBLISH
	# to complete (just in case pUBLISH is used)
	if u1.inst_param.have_reg:
		time.sleep(1)
	if u2.inst_param.have_reg:
		time.sleep(1)

	# U1 adds U2 as buddy
	u1.send("+b")
	u1.send(uri2)
	u1.expect("Subscription state changed NULL --> SENT")
	u1.expect("Presence subscription.*is ACCEPTED")
	if not u2.inst_param.have_publish:
		# Process incoming SUBSCRIBE in U2
		# Finds out which account gets the subscription in U2
		line = u2.expect("pjsua_pres.*subscription.*using account")
		acc2 = line.split("using account ")[1]
	# wait until we've got Online notification
	u1.expect(uri2 + ".*Online")

	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# U2 adds U1 as buddy
	u2.send("+b")
	u2.send(uri1)
	u2.expect("Subscription state changed NULL --> SENT")
	u2.expect("Presence subscription.*is ACCEPTED")
	if not u1.inst_param.have_publish:
		# Process incoming SUBSCRIBE in U1
		# Finds out which account gets the subscription in U1
		line = u1.expect("pjsua_pres.*subscription.*using account")
		acc1 = line.split("using account ")[1]
	# wait until we've got Online notification
	u2.expect(uri1 + ".*Online")

	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# Set current account in both U1 and U2
	if acc1!="-1":
		u1.send(">")
		u1.send(acc1)
		u1.expect("Current account changed")
	if acc2!="-1":
		u2.send(">")
		u2.send(acc2)
		u2.expect("Current account changed")

	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# u2 toggles online status
	u2.send("t")
	u1.expect(uri2 + ".*status.*Offline")
	u2.expect("offline")
	
	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# u1 toggles online status
	u1.send("t")
	u2.expect(uri1 + ".*status.*Offline")
	u1.expect("offline")

	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# u2 set online status to On the phone
	u2.send("T")
	u2.send("3")
	u1.expect(uri2 + ".*status.*On the phone")
	u2.expect("On the phone")
	
	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()

	# U1 send IM
	im_text = "Hello World from U1"
	u1.send("i")
	u1.send(uri2)
	u2.expect(" is typing")
	u1.send(im_text)
	u1.expect(im_text+".*delivered successfully")
	u2.expect("MESSAGE from.*"+im_text)
	
	# Synchronize stdout
	u1.sync_stdout()
	u2.sync_stdout()


# Here where it all comes together
test = cfg_file.test_param
test.test_func = test_func

