普通文本  |  128行  |  4.27 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 state_machine

import logging
import mox
import unittest

import at_transceiver
import global_state
import modem_configuration
import task_loop
import wardmodem_exceptions as wme

class StateMachineBadTestCase(unittest.TestCase):
    """
    Test that an abstract machine can not be instantiated.

    """

    def test_failed_instantiation(self):
        """
        Only subclasses of StateMachine that implement the get_well_known_name
        can be instantiated. Test that a direct instantiation of StateMachine
        fails.

        """
        self._mox = mox.Mox()
        self._transceiver = self._mox.CreateMock(at_transceiver.ATTransceiver)
        self._state = self._mox.CreateMock(global_state.GlobalState)
        self._task_loop = self._mox.CreateMock(task_loop.TaskLoop)
        self._modem_conf = self._mox.CreateMock(
                modem_configuration.ModemConfiguration)

        self.assertRaises(wme.WardModemSetupException,
                          state_machine.StateMachine, self._state,
                          self._transceiver, self._modem_conf)

class StateMachineTestCase(unittest.TestCase):
    """
    Test fixture for StateMachine class.

    """

    class TestStateMachine(state_machine.StateMachine):
        #pylint: disable=C0111
        """
        A simple test machine that can be instantiated.
        """

        def get_well_known_name(self):
            return 'TestStateMachine'


    def setUp(self):
        self._mox = mox.Mox()
        self._transceiver = self._mox.CreateMock(at_transceiver.ATTransceiver)
        self._state = self._mox.CreateMock(global_state.GlobalState)
        self._task_loop = self._mox.CreateMock(task_loop.TaskLoop)
        self._modem_conf = self._mox.CreateMock(
                modem_configuration.ModemConfiguration)

        self._state_machine = StateMachineTestCase.TestStateMachine(
                self._state, self._transceiver, self._modem_conf)
        # Replace some internal objects with mocks.
        self._state_machine._task_loop = self._task_loop

    def _add_response_functions(self):
        self._state_machine._add_response_function('wm_response_1')
        self._state_machine._add_response_function('wm_response_2')
        self._state_machine._add_response_function('wm_response_3')


    def test_add_response_function(self):
        """
        Tests that only valid response functions can be added.

        """
        self.assertRaises(
                wme.WardModemSetupException,
                self._state_machine._add_response_function,
                'no spaces')
        self.assertRaises(
                wme.WardModemSetupException,
                self._state_machine._add_response_function,
                'MUST_BE_LOWER_CASE')
        self.assertRaises(
                wme.WardModemSetupException,
                self._state_machine._add_response_function,
                'must_begin_with_wm_response_')

        self._state_machine._add_response_function('wm_response_something')


    def test_dispatch_functions(self):
        """
        Basic test for the _respond, _update_state and _update_state_and_respond
        dispatch functions.

        """
        self._add_response_functions()
        response_delay_ms  = 30
        response = self._state_machine.wm_response_1
        response_arg1 = 1
        response_arg2 = 'blah'
        state_update = {'comp1': 'VAL1', 'comp2': 'VAL2'}
        state_update_delay_ms = 20

        self._task_loop.post_task_after_delay(
                self._transceiver.process_wardmodem_response, response_delay_ms,
                response, response_arg1, response_arg2)
        self._task_loop.post_task_after_delay(
                self._state_machine._update_state_callback,
                state_update_delay_ms, state_update, mox.IgnoreArg())

        self._mox.ReplayAll()
        self._state_machine._respond(response, response_delay_ms, response_arg1,
                                     response_arg2)
        self._state_machine._update_state(state_update, state_update_delay_ms)
        self._mox.VerifyAll()


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