• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import global_state
6
7import logging
8import unittest
9
10import wardmodem_exceptions as wme
11
12class GlobalStateSkeletonBadTestCase(unittest.TestCase):
13    """
14    Test failing derivations of GlobalStateSkeleton.
15
16    """
17
18    def test_duplicate_component_name(self):
19        """
20        Try (unsuccessfully) to add two components with the same name.
21
22        """
23        state = global_state.GlobalStateSkeleton()
24        state._add_state_component('common_name', ['THIS_IS_FINE'])
25        self.assertRaises(wme.WardModemSetupException,
26                          state._add_state_component,
27                          'common_name',
28                          ['THIS_IS_NOT_FINE'])
29
30
31    def test_ill_formed_names(self):
32        """
33        Try (unsuccessfully) to add components with ill formed names or ill
34        formed values.
35
36        """
37        state = global_state.GlobalStateSkeleton()
38        self.assertRaises(TypeError,
39                          state._add_state_component,
40                          'this_is_fine',
41                          'must_have_been_list')
42        self.assertRaises(wme.WardModemSetupException,
43                          state._add_state_component,
44                          'ill formed',
45                          ['NO_SPACES'])
46        self.assertRaises(wme.WardModemSetupException,
47                          state._add_state_component,
48                          '',
49                          ['CANT_BE_EMPTY'])
50        self.assertRaises(wme.WardModemSetupException,
51                          state._add_state_component,
52                          'ILL_FORMED',
53                          ['MUST_BE_LOWERCASE'])
54        self.assertRaises(wme.WardModemSetupException,
55                          state._add_state_component,
56                          'no_spaces',
57                          ['ILL FORMED'])
58        self.assertRaises(wme.WardModemSetupException,
59                          state._add_state_component,
60                          'cant_be_empty',
61                          [''])
62        self.assertRaises(wme.WardModemSetupException,
63                          state._add_state_component,
64                          'use_int_when_you_want_numbers',
65                          ['2'])
66        self.assertRaises(wme.WardModemSetupException,
67                          state._add_state_component,
68                          'must_be_uppercase',
69                          ['ill_formed'])
70
71
72    def test_valid_names(self):
73        """
74        Some examples of correct component additions.
75
76        """
77        state = global_state.GlobalStateSkeleton()
78
79        state._add_state_component('this_is_fine', ['A', 'B', 'C'])
80        state._add_state_component('so_is_this', [1, 1, 2, 3, 5, 8, 13])
81        state._add_state_component('and_even_this_guy', ['A', 'B3B_CC', 34])
82
83
84class GlobalStateSkeletonTestCase(unittest.TestCase):
85    """
86    Test the basic functionality of GlobalStateSkeleton, assuming that it is
87    derived without errors.
88
89    """
90
91    class TestGlobalState(global_state.GlobalStateSkeleton):
92        """
93        This class will correctly derive from GlobalStateSkeleton.
94
95        """
96
97        def __init__(self):
98            super(GlobalStateSkeletonTestCase.TestGlobalState, self).__init__()
99            # Now, add all state components.
100            self._add_state_component('comp1', ['ALLOWED_VALUE_1_1'])
101            self._add_state_component('comp2', ['ALLOWED_VALUE_2_1',
102                                                'ALLOWED_VALUE_2_2'])
103            # No value can ever be assigned to this. Ah, what the heck!
104            self._add_state_component('comp3', [])
105
106
107    def setUp(self):
108        self.state = GlobalStateSkeletonTestCase.TestGlobalState()
109
110
111    def test_successful_read_write(self):
112        """
113        Test that all values are initialized correctly.
114
115        """
116        self.assertEqual(self.state.INVALID_VALUE, self.state['comp1'])
117        self.assertEqual(self.state.INVALID_VALUE, self.state['comp2'])
118        self.assertEqual(self.state.INVALID_VALUE, self.state['comp3'])
119
120        self.state['comp2'] = 'ALLOWED_VALUE_2_1'
121        self.assertEqual('ALLOWED_VALUE_2_1', self.state['comp2'])
122        self.state['comp2'] = 'ALLOWED_VALUE_2_2'
123        self.assertEqual('ALLOWED_VALUE_2_2', self.state['comp2'])
124        self.state['comp1'] = 'ALLOWED_VALUE_1_1'
125        self.assertEqual('ALLOWED_VALUE_1_1', self.state['comp1'])
126
127
128    def _read(self, key):
129        """Wrap the read from state to check exceptions raised."""
130        return self.state[key]
131
132    def _write(self, key, value):
133        """Wrap the assignment to state to check exceptions raised."""
134        self.state[key] = value
135
136
137    def test_failed_read_write(self):
138        """
139        Attempt to read/write invalid values.
140
141        """
142        self.assertRaises(wme.StateMachineException,
143                          self._read, 'some_invalid_var')
144        self.assertRaises(wme.StateMachineException,
145                          self._write, 'some_invalide_var', '')
146        self.assertRaises(wme.StateMachineException,
147                          self._write, 'comp1', 'DOES_NOT_EXIST')
148
149
150if __name__ == '__main__':
151    logging.basicConfig(level=logging.DEBUG)
152    unittest.main()
153