# 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 dbus
import dbus.service

import dbus_std_ifaces
import pm_constants
import utils

from autotest_lib.client.cros.cellular import mm1_constants

class Testing(dbus_std_ifaces.DBusProperties):
    """
    The testing object allows the pseudomodem to be configured on the fly
    over D-Bus. It exposes a basic set of commands that can be used to
    simulate network events (such as SMS) or various other modem configurations
    that are needed for testing/debugging.

    """

    def __init__(self, modem, bus):
        self._modem = modem
        dbus_std_ifaces.DBusProperties.__init__(self,
                                                pm_constants.TESTING_PATH,
                                                bus)


    @utils.log_dbus_method()
    @dbus.service.method(pm_constants.I_TESTING, out_signature='b')
    def IsAlive(self):
        """
        A heartbeat method.

        This method can be called by clients to check that pseudomodem is alive.

        @returns: True, always.

        """
        return True


    def _InitializeProperties(self):
        return { pm_constants.I_TESTING: { 'Modem': self._modem.path } }


    @utils.log_dbus_method()
    @dbus.service.method(pm_constants.I_TESTING, in_signature='ss')
    def ReceiveSms(self, sender, text):
        """
        Simulates a fake SMS.

        @param sender: String containing the phone number of the sender.
        @param text: String containing the SMS message contents.

        """
        self._modem.sms_handler.receive_sms(text, sender)


    @utils.log_dbus_method()
    @dbus.service.method(pm_constants.I_TESTING, in_signature='a(ubay)')
    def UpdatePco(self, pco_value):
        """
        Sets the Pco to the specified value. If the Modem.Modem3gpp
        properties are currently not exposed (e.g. due to a locked or absent
        SIM), this method will do nothing.

        @param pco_value: The PCO list.

        """
        if mm1_constants.I_MODEM_3GPP in self._modem.properties:
            self._modem.AssignPco(pco_value)

    @utils.log_dbus_method()
    @dbus.service.method(pm_constants.I_TESTING, in_signature='u')
    def SetSubscriptionState(self,
                             registered_subscription_state):
        """
        Sets the Pco to something denoting the requested subscription state.
        If the Modem.Modem3gpp properties are currently not exposed (e.g. due
        to a locked or absent SIM), this method will do nothing.

        @param registered_subscription_state: This value is returned as the
                subscription state when the modem is registered on the network.
                See mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_*.

        """
        if mm1_constants.I_MODEM_3GPP in self._modem.properties:
            self._modem.AssignSubscriptionState(registered_subscription_state)
