#!/usr/bin/python3

__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', '', None)),
                ('host:21', ('host', 'root', '', 21)),
                ('user@host', ('host', 'user', '', None)),
                ('user:pass@host', ('host', 'user', 'pass', None)),
                ('user:pass@host:1234', ('host', 'user', 'pass', 1234)),
                ('user:pass@10.3.2.1', ('10.3.2.1', 'user', 'pass', None)),
                ('user:pass@10.3.2.1:1234', ('10.3.2.1', 'user', 'pass',
                                             1234)),
                ('::1', ('::1', 'root', '', None)),
                ('user:pass@abdc::ef', ('abdc::ef', 'user', 'pass', None)),
                ('abdc::ef:99', ('abdc::ef:99', 'root', '', None)),
                ('user:pass@[abdc::ef:99]', ('abdc::ef:99', 'user', 'pass',
                                             None)),
                ('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()
