普通文本  |  153行  |  5.26 KB

# Copyright (c) 2013 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 global_state

import logging
import unittest

import wardmodem_exceptions as wme

class GlobalStateSkeletonBadTestCase(unittest.TestCase):
    """
    Test failing derivations of GlobalStateSkeleton.

    """

    def test_duplicate_component_name(self):
        """
        Try (unsuccessfully) to add two components with the same name.

        """
        state = global_state.GlobalStateSkeleton()
        state._add_state_component('common_name', ['THIS_IS_FINE'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'common_name',
                          ['THIS_IS_NOT_FINE'])


    def test_ill_formed_names(self):
        """
        Try (unsuccessfully) to add components with ill formed names or ill
        formed values.

        """
        state = global_state.GlobalStateSkeleton()
        self.assertRaises(TypeError,
                          state._add_state_component,
                          'this_is_fine',
                          'must_have_been_list')
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'ill formed',
                          ['NO_SPACES'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          '',
                          ['CANT_BE_EMPTY'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'ILL_FORMED',
                          ['MUST_BE_LOWERCASE'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'no_spaces',
                          ['ILL FORMED'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'cant_be_empty',
                          [''])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'use_int_when_you_want_numbers',
                          ['2'])
        self.assertRaises(wme.WardModemSetupException,
                          state._add_state_component,
                          'must_be_uppercase',
                          ['ill_formed'])


    def test_valid_names(self):
        """
        Some examples of correct component additions.

        """
        state = global_state.GlobalStateSkeleton()

        state._add_state_component('this_is_fine', ['A', 'B', 'C'])
        state._add_state_component('so_is_this', [1, 1, 2, 3, 5, 8, 13])
        state._add_state_component('and_even_this_guy', ['A', 'B3B_CC', 34])


class GlobalStateSkeletonTestCase(unittest.TestCase):
    """
    Test the basic functionality of GlobalStateSkeleton, assuming that it is
    derived without errors.

    """

    class TestGlobalState(global_state.GlobalStateSkeleton):
        """
        This class will correctly derive from GlobalStateSkeleton.

        """

        def __init__(self):
            super(GlobalStateSkeletonTestCase.TestGlobalState, self).__init__()
            # Now, add all state components.
            self._add_state_component('comp1', ['ALLOWED_VALUE_1_1'])
            self._add_state_component('comp2', ['ALLOWED_VALUE_2_1',
                                                'ALLOWED_VALUE_2_2'])
            # No value can ever be assigned to this. Ah, what the heck!
            self._add_state_component('comp3', [])


    def setUp(self):
        self.state = GlobalStateSkeletonTestCase.TestGlobalState()


    def test_successful_read_write(self):
        """
        Test that all values are initialized correctly.

        """
        self.assertEqual(self.state.INVALID_VALUE, self.state['comp1'])
        self.assertEqual(self.state.INVALID_VALUE, self.state['comp2'])
        self.assertEqual(self.state.INVALID_VALUE, self.state['comp3'])

        self.state['comp2'] = 'ALLOWED_VALUE_2_1'
        self.assertEqual('ALLOWED_VALUE_2_1', self.state['comp2'])
        self.state['comp2'] = 'ALLOWED_VALUE_2_2'
        self.assertEqual('ALLOWED_VALUE_2_2', self.state['comp2'])
        self.state['comp1'] = 'ALLOWED_VALUE_1_1'
        self.assertEqual('ALLOWED_VALUE_1_1', self.state['comp1'])


    def _read(self, key):
        """Wrap the read from state to check exceptions raised."""
        return self.state[key]

    def _write(self, key, value):
        """Wrap the assignment to state to check exceptions raised."""
        self.state[key] = value


    def test_failed_read_write(self):
        """
        Attempt to read/write invalid values.

        """
        self.assertRaises(wme.StateMachineException,
                          self._read, 'some_invalid_var')
        self.assertRaises(wme.StateMachineException,
                          self._write, 'some_invalide_var', '')
        self.assertRaises(wme.StateMachineException,
                          self._write, 'comp1', 'DOES_NOT_EXIST')


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    unittest.main()