#!/usr/bin/env python
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest
import cellular
import labconfig
import labconfig_data


TEST_CELL = {
    'duts': [
        {
            'address': '1.2.3.4',
            'name': 'one_two_three_four',
            'technologies': ['CDMA_2000'],
            },
        {
            'address': '5.6.7.8',
            'name': 'five_six_seven_eight',
            'technologies': ['GPRS', 'EGPRS'],
            },
        ],
    'rf_switch': {
        'type': 'ether_io',
        'address':  '172.31.206.172',
        # Ports maps from port index to name as specified in
        # duts.name
        'ports': ['one_two_three_four', None, None, 'five_six_seven_eight'],
        }
    }

class TestLabConfig(unittest.TestCase):
    def setUp(self):
        # Monkey-patch in our test cell
        labconfig_data.CELLS['test'] = TEST_CELL

    def test_get_present_cell(self):
        c = labconfig.Configuration(['--cell', 'test'])

    def test_get_missing_cell(self):
        self.assertRaises(labconfig.LabConfigError,
                          labconfig.Configuration, ['--cell', 'NOT_PRESENT'])

    def test_get_dut(self):
        c = labconfig.Configuration(['--cell', 'test'])
        m = c._get_dut('1.2.3.4')
        self.assertEqual('one_two_three_four', m['name'])

        m = c._get_dut('one_two_three_four')
        self.assertEqual('one_two_three_four', m['name'])

    def test_get_technologies(self):
        c = labconfig.Configuration(['--cell', 'test', '--technology=all'])
        t = c.get_technologies('five_six_seven_eight')
        self.assertEqual([cellular.Technology.GPRS, cellular.Technology.EGPRS],
                         t)

        c = labconfig.Configuration(['--cell=test',
                                     '--technology=WCDMA,CDMA_2000'])

        self.assertEqual(
            [cellular.Technology.WCDMA, cellular.Technology.CDMA_2000],
            c.get_technologies('five_six_seven_eight'))

    def test_get_interface_ip(self):
        self.assertEqual('127.0.0.1', labconfig.get_interface_ip('lo'))

    def test_get_switch_port(self):
        c = labconfig.Configuration(['--cell', 'test', '--technology=all'])
        self.assertEqual(0,
                         c.get_switch_port('one_two_three_four'))

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