#!/usr/bin/env python
'''
Copyright (C) 2011, Digium, Inc.
Walter Doekes <walter+asterisk@wjd.nu>

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.test_case import TestCase
from asterisk.sipp import SIPpScenario, SIPpScenarioSequence
from twisted.internet import reactor
from starpy import manager

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

SCENARIO_TABLE = (
    ('USER',    'SECRET',       'USERADDR',                 'RESP'),

    ('baduser', 'badsecret',    'baduser@mydom.com',        403), # authreject
    ('baduser', 'badsecret',    'baduser@127.0.0.1',        403), # bad both

    ('someuser', 'somesecret',  'someuser@mydom.com',       200), # ok
    ('someuser', 'badsecret',   'someuser@mydom.com',       403), # bad pass
    ('someuser', 'somesecret',  'someuser@mydom2.com',      200), # ok
    ('someuser', 'somesecret',  'someuser@mydom3.com',      403), # bad domain
    ('someuser', 'somesecret',  'someuser@',                404), # bad sip
    ('someuser', 'somesecret',  '@someuser',                403), # bad dom/sip

    ('mydom.com', 'mysecret',   'mydom.com@mydom.com',      200), # ok
    ('mydom.com', 'mysecret',   'mydom.com@mydom2.com',     200), # ok
    ('mydom.com', 'mysecret',   'mydom.com',                200), # ok(!)
    ('mydom.com', 'mysecret',   'mydom.com@',               404), # not ok
    #('mydom.com', 'mysecret',   '@mydom.com',               200), # ok(BAH!)
)

class SIPRegisterDomainAclTest(TestCase):
    def __init__(self):
        super(SIPRegisterDomainAclTest, self).__init__()

        # Transform SCENARIO_TABLE into something usable. Use different
        # ports so the answers won't conflict with each other.
        scenario_head = dict(enumerate(SCENARIO_TABLE[0]))
        scenario_list_of_dicts = []
        for scenario in SCENARIO_TABLE[1:]:
            scenario_list_of_dicts.append(
                dict((scenario_head[i], v) for i, v in enumerate(scenario))
            )
        # Into a tuple of (scenario{}, positional_args())
        self.scenario_defs = []
        for i, scenario in enumerate(scenario_list_of_dicts):
            self.scenario_defs.append(({
                'scenario': 'reg%d.xml' % scenario['RESP'],
                '-p': str(5061 + i),
                '-s': scenario['USER'],
                '-ap': scenario['SECRET'],
                '-timeout': '8s',
            }, (
                '-key', 'useraddr', scenario['USERADDR'],
            )))

        # If any of the tests fails, they'll automatically set the passed result to False
        self.passed = True
        self.create_asterisk()

    def run(self):
        super(SIPRegisterDomainAclTest, self).run()
        self.create_ami_factory()

    def ami_connect(self, ami):
        super(SIPRegisterDomainAclTest, self).ami_connect(ami)

        logger.debug("Connected to AMI")
        sequence = SIPpScenarioSequence(test_case = self)
        for scenario_def in self.scenario_defs:
            sequence.register_scenario(SIPpScenario(TEST_DIR, scenario_def[0], scenario_def[1]))
        sequence.execute()

def main():
    test = SIPRegisterDomainAclTest()
    test.start_asterisk()
    reactor.run()
    test.stop_asterisk()
    if test.passed:
        return 0
    return 1


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


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