#!/usr/bin/python2

__author__ = 'raphtee@google.com (Travis Miller)'

import unittest
import common
from autotest_lib.server import utils


class UtilsTest(unittest.TestCase):

    def setUp(self):
        # define out machines here
        self.machines = ['mach1', 'mach2', 'mach3', 'mach4', 'mach5',
                                'mach6', 'mach7']

        self.ntuples = [['mach1', 'mach2'], ['mach3', 'mach4'],
                        ['mach5', 'mach6']]
        self.failures = []
        self.failures.append(('mach7', "machine can not be tupled"))


    def test_form_cell_mappings(self):
        (ntuples, failures) = utils.form_ntuples_from_machines(self.machines)
        self.assertEquals(self.ntuples, ntuples)
        self.assertEquals(self.failures, failures)


    # parse_machine() test cases
    def test_parse_machine_good(self):
        '''test that parse_machine() is outputting the correct data'''
        gooddata = (('host',                ('host', 'root', '', 22)),
                    ('host:21',             ('host', 'root', '', 21)),
                    ('user@host',           ('host', 'user', '', 22)),
                    ('user:pass@host',      ('host', 'user', 'pass', 22)),
                    ('user:pass@host:1234', ('host', 'user', 'pass', 1234)),

                    ('user:pass@10.3.2.1',
                     ('10.3.2.1', 'user', 'pass', 22)),
                    ('user:pass@10.3.2.1:1234',
                     ('10.3.2.1', 'user', 'pass', 1234)),

                    ('::1',                 ('::1', 'root', '', 22)),
                    ('user:pass@abdc::ef',  ('abdc::ef', 'user', 'pass', 22)),
                    ('abdc::ef:99',         ('abdc::ef:99', 'root', '', 22)),
                    ('user:pass@[abdc::ef:99]',
                     ('abdc::ef:99', 'user', 'pass', 22)),
                    ('user:pass@[abdc::ef]:1234',
                     ('abdc::ef', 'user', 'pass', 1234)),
                   )
        for machine, result in gooddata:
            self.assertEquals(utils.parse_machine(machine), result)


    def test_parse_machine_override(self):
        '''Test that parse_machine() defaults can be overridden'''
        self.assertEquals(utils.parse_machine('host', 'bob', 'foo', 1234),
                          ('host', 'bob', 'foo', 1234))


    def test_parse_machine_bad(self):
        '''test that bad data passed to parse_machine() will raise an exception'''
        baddata = ((':22', IndexError),         # neglect to pass a hostname #1
                   ('user@', IndexError),       # neglect to pass a hostname #2
                   ('user@:22', IndexError),    # neglect to pass a hostname #3
                   (':pass@host', ValueError),  # neglect to pass a username
                   ('host:', ValueError),       # empty port after hostname
                   ('[1::2]:', ValueError),     # empty port after IPv6
                  )
        for machine, exception in baddata:
            self.assertRaises(exception, utils.parse_machine, machine)


if __name__ == "__main__":
    unittest.main()
