#!/usr/bin/env python

# 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 common
import request_response

import logging
import mox
import unittest

import at_transceiver
import global_state
import modem_configuration
import task_loop


class RequestResponseTestCase(unittest.TestCase):
    """ Test fixture for RequestResponse class. """

    def setUp(self):
        self._mox = mox.Mox()

        # Prepare modem configuration to suit our needs.
        self._modem_conf = modem_configuration.ModemConfiguration()
        self._modem_conf.base_wm_request_response_map = {
                'AT1': 'AT1RESPONSE',
                'AT2': ('AT2OK', 'AT2ERROR'),
                'AT3': 'AT3RESPONSE'
        }
        self._modem_conf.plugin_wm_request_response_map = {
                'AT3': 'AT3RESPONSE_OVERRIDEN',
                'AT4': 'AT4RESPONSE',
                'AT5': ['AT5RESPONSE1', 'AT5RESPONSE2']
        }

        self._task_loop = self._mox.CreateMock(task_loop.TaskLoop)
        self._transceiver = self._mox.CreateMock(at_transceiver.ATTransceiver)
        self._machine = request_response.RequestResponse(
                global_state.GlobalState(),
                self._transceiver,
                self._modem_conf)

        # Mock out the task_loop
        self._machine._task_loop = self._task_loop

    def test_enabled_responses(self):
        """
        Responses for different configurations when machine is enabled.

        """
        self._machine.enable_machine()
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT1RESPONSE')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT2OK')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT3RESPONSE_OVERRIDEN')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT4RESPONSE')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT5RESPONSE1')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT5RESPONSE2')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_ok')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')

        self._mox.ReplayAll()
        self._machine.act_on('AT1')
        self._machine.act_on('AT2')
        self._machine.act_on('AT3')
        self._machine.act_on('AT4')
        self._machine.act_on('AT5')
        self._machine.act_on('AT6')
        self._mox.VerifyAll()


    def test_disabled_responses(self):
        """
        Responses for different configurations when machine is enabled.

        """
        self._machine.disable_machine()

        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_text_only',
                                              'AT2ERROR')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')
        self._task_loop.post_task_after_delay(mox.IgnoreArg(),
                                              0,
                                              'wm_response_error')

        self._mox.ReplayAll()
        self._machine.act_on('AT1')
        self._machine.act_on('AT2')
        self._machine.act_on('AT3')
        self._machine.act_on('AT4')
        self._machine.act_on('AT5')
        self._machine.act_on('AT6')
        self._mox.VerifyAll()


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