#!/usr/bin/env python
'''
Copyright (C) 2012, Digium, Inc.
Matthew Jordan <mjordan@digium.com>
Joshua Colp <jcolp@digium.com>

This program is free software, distributed under the terms of
the GNU General Public License Version 2.
'''

import sys
import os
import logging

sys.path.append("lib/python")

from asterisk.asterisk import Asterisk
from asterisk.version import AsteriskVersion
from asterisk.test_case import TestCase
from asterisk.sipp import SIPpScenario
from twisted.internet import reactor

logger = logging.getLogger(__name__)
TEST_DIR = os.path.dirname(os.path.realpath(__file__))

class SDPPassthrough(TestCase):
    def __init__(self):
        TestCase.__init__(self)
        self.create_asterisk()
        self.sipp_phone_a_scenarios = [{'scenario':'phone_A_speex.xml','-i':'127.0.0.2','-p':'5065'},]
        self.sipp_phone_b_scenarios = [{'scenario':'phone_B_speex.xml','-i':'127.0.0.3','-p':'5066'},]
        if (AsteriskVersion() < AsteriskVersion("13")):
            self.sipp_phone_a_scenarios.extend([{'scenario':'phone_A_h263.xml','-i':'127.0.0.2','-p':'5061'},
                                                {'scenario':'phone_A_h264.xml','-i':'127.0.0.2','-p':'5062'},])
                                           
            self.sipp_phone_b_scenarios.extend([{'scenario':'phone_B_h263.xml','-i':'127.0.0.3','-p':'5063'},
                                                {'scenario':'phone_B_h264.xml','-i':'127.0.0.3','-p':'5064'},])
        else:
            self.sipp_phone_a_scenarios.extend([{'scenario':'phone_A_h263_13.xml','-i':'127.0.0.2','-p':'5061'},
                                                {'scenario':'phone_A_h264_13.xml','-i':'127.0.0.2','-p':'5062'},])
            self.sipp_phone_b_scenarios.extend([{'scenario':'phone_B_h263_13.xml','-i':'127.0.0.3','-p':'5063'},
                                                {'scenario':'phone_B_h264_13.xml','-i':'127.0.0.3','-p':'5064'},])

        self.passed = True
        self.__test_counter = 0

    def ami_connect(self, ami):
        TestCase.ami_connect(self, ami)
        logger.info("Starting SIP scenario")
        self.execute_scenarios()

    def execute_scenarios(self):
        def __check_scenario_a(result):
            self.__a_finished = True
            return result

        def __check_scenario_b(result):
            self.__b_finished = True
            return result

        def __execute_next_scenario(result):
            if self.__a_finished and self.__b_finished:
                self.__test_counter += 1
                self.reset_timeout()
                self.execute_scenarios()
            return result

        if self.__test_counter == len(self.sipp_phone_a_scenarios):
            logger.info("All scenarios executed")
            self.stop_reactor()
            return

        self.sipp_a = SIPpScenario(TEST_DIR, self.sipp_phone_a_scenarios[self.__test_counter])
        self.sipp_b = SIPpScenario(TEST_DIR, self.sipp_phone_b_scenarios[self.__test_counter])

        # Start up the listener first - Phone A calls Phone B
        self.__a_finished = False
        self.__b_finished = False
        db = self.sipp_b.run(self)
        da = self.sipp_a.run(self)

        da.addCallback(__check_scenario_a)
        da.addCallback(__execute_next_scenario)
        db.addCallback(__check_scenario_b)
        db.addCallback(__execute_next_scenario)

    def run(self):
        TestCase.run(self)
        self.create_ami_factory()


def main():
    test = SDPPassthrough()
    test.start_asterisk()
    reactor.run()
    test.stop_asterisk()

    if not test.passed:
        return 1

#    if not test.sipp_a.passed:
#        return 1

#    if not test.sipp_b.passed:
#        return 1

    return 0

if __name__ == "__main__":
    sys.exit(main())


# vim:sw=4:ts=4:expandtab:textwidth=79
