#!/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.

# pylint: disable-msg=C0111

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'],
            'rf_switch_port': 0
            },
        {
            'address': '5.6.7.8',
            'name': 'five_six_seven_eight',
            'technologies': ['GPRS', 'EGPRS'],
            },
        ],
    'rf_switch': {
        'type': 'ether_io',
        'address':  '172.31.206.172',
        }
    }

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_rf_switch_port(self):
        c = labconfig.Configuration(['--cell', 'test', '--technology=all'])
        self.assertEqual(0,
                         c.get_rf_switch_port('one_two_three_four'))

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