#!/usr/bin/env python3
#
#   Copyright 2016 - The Android Open Source Project
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
"""
Sanity tests for voice tests in telephony
"""
import time

from acts.controllers.anritsu_lib._anritsu_utils import AnritsuError
from acts.controllers.anritsu_lib.md8475a import CBCHSetup
from acts.controllers.anritsu_lib.md8475a import CTCHSetup
from acts.controllers.anritsu_lib.md8475a import MD8475A
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_CATEGORY_AMBER
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_CATEGORY_EXTREME
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_CATEGORY_PRESIDENTIAL
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_CERTIANTY_LIKELY
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_RESPONSETYPE_EVACUATE
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_RESPONSETYPE_MONITOR
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_RESPONSETYPE_SHELTER
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_SEVERITY_EXTREME
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_URGENCY_IMMEDIATE
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_C2K_CERTIANTY_OBSERVED
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_MESSAGE_CHILD_ABDUCTION_EMERGENCY
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_MESSAGE_EXTREME_IMMEDIATE_LIKELY
from acts_contrib.test_utils.tel.anritsu_utils import CMAS_MESSAGE_PRESIDENTIAL_ALERT
from acts_contrib.test_utils.tel.anritsu_utils import cb_serial_number
from acts_contrib.test_utils.tel.anritsu_utils import cmas_receive_verify_message_cdma1x
from acts_contrib.test_utils.tel.anritsu_utils import cmas_receive_verify_message_lte_wcdma
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_1x
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_1x_evdo
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_lte
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_gsm
from acts_contrib.test_utils.tel.anritsu_utils import set_system_model_wcdma
from acts_contrib.test_utils.tel.anritsu_utils import set_usim_parameters
from acts_contrib.test_utils.tel.anritsu_utils import set_post_sim_params
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_CDMA
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_GSM_ONLY
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_GSM_UMTS
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_LTE_GSM_WCDMA
from acts_contrib.test_utils.tel.tel_defines import RAT_1XRTT
from acts_contrib.test_utils.tel.tel_defines import RAT_LTE
from acts_contrib.test_utils.tel.tel_defines import RAT_GSM
from acts_contrib.test_utils.tel.tel_defines import RAT_WCDMA
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_CDMA2000
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_GSM
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_LTE
from acts_contrib.test_utils.tel.tel_defines import RAT_FAMILY_UMTS
from acts_contrib.test_utils.tel.tel_test_utils import ensure_network_rat
from acts_contrib.test_utils.tel.tel_test_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.tel_test_utils import start_qxdm_loggers
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts.test_decorators import test_tracker_info

WAIT_TIME_BETWEEN_REG_AND_MSG = 15  # default 15 sec


class TelLabCmasTest(TelephonyBaseTest):
    SERIAL_NO = cb_serial_number()

    def setup_class(self):
        super().setup_class()
        self.ad = self.android_devices[0]
        self.ad.sim_card = getattr(self.ad, "sim_card", None)
        self.md8475a_ip_address = self.user_params[
            "anritsu_md8475a_ip_address"]
        self.wlan_option = self.user_params.get("anritsu_wlan_option", False)
        self.md8475_version = self.user_params.get("md8475", "A")
        self.wait_time_between_reg_and_msg = self.user_params.get(
            "wait_time_between_reg_and_msg", WAIT_TIME_BETWEEN_REG_AND_MSG)

        try:
            self.anritsu = MD8475A(self.md8475a_ip_address, self.wlan_option,
                                   self.md8475_version)
        except AnritsuError:
            self.log.error("Error in connecting to Anritsu Simulator")
            return False
        return True

    def setup_test(self):
        if getattr(self, "qxdm_log", True):
            start_qxdm_loggers(self.log, self.android_devices)
        ensure_phones_idle(self.log, self.android_devices)
        toggle_airplane_mode(self.log, self.ad, True)
        self.ad.adb.shell("logcat -c -b all", ignore_status=True)
        return True

    def teardown_test(self):
        self.log.info("Stopping Simulation")
        self.anritsu.stop_simulation()
        toggle_airplane_mode(self.log, self.ad, True)
        return True

    def teardown_class(self):
        self.anritsu.disconnect()
        return True

    def _send_receive_cmas_message(
            self,
            set_simulation_func,
            rat,
            message_id,
            warning_message,
            c2k_response_type=CMAS_C2K_RESPONSETYPE_SHELTER,
            c2k_severity=CMAS_C2K_SEVERITY_EXTREME,
            c2k_urgency=CMAS_C2K_URGENCY_IMMEDIATE,
            c2k_certainty=CMAS_C2K_CERTIANTY_OBSERVED):
        try:
            [self.bts1] = set_simulation_func(self.anritsu, self.user_params,
                                              self.ad.sim_card)
            set_usim_parameters(self.anritsu, self.ad.sim_card)
            if rat == RAT_LTE:
                set_post_sim_params(self.anritsu, self.user_params,
                                    self.ad.sim_card)
            self.anritsu.start_simulation()

            if rat == RAT_LTE:
                preferred_network_setting = NETWORK_MODE_LTE_GSM_WCDMA
                rat_family = RAT_FAMILY_LTE
            elif rat == RAT_WCDMA:
                self.bts1.wcdma_ctch = CTCHSetup.CTCH_ENABLE
                self.ad.droid.telephonyToggleDataConnection(False)
                preferred_network_setting = NETWORK_MODE_GSM_UMTS
                rat_family = RAT_FAMILY_UMTS
            elif rat == RAT_GSM:
                self.bts1.gsm_cbch = CBCHSetup.CBCH_ENABLE
                self.ad.droid.telephonyToggleDataConnection(False)
                preferred_network_setting = NETWORK_MODE_GSM_ONLY
                rat_family = RAT_FAMILY_GSM
            elif rat == RAT_1XRTT:
                self.ad.droid.telephonyToggleDataConnection(False)
                preferred_network_setting = NETWORK_MODE_CDMA
                rat_family = RAT_FAMILY_CDMA2000
            else:
                self.log.error("No valid RAT provided for CMAS test.")
                return False

            if not ensure_network_rat(
                    self.log,
                    self.ad,
                    preferred_network_setting,
                    rat_family,
                    toggle_apm_after_setting=True):
                self.log.error(
                    "Failed to set rat family {}, preferred network:{}".format(
                        rat_family, preferred_network_setting))
                return False

            self.anritsu.wait_for_registration_state()
            if rat != RAT_1XRTT:
                if not cmas_receive_verify_message_lte_wcdma(
                        self.log, self.ad, self.anritsu,
                        next(TelLabCmasTest.SERIAL_NO), message_id,
                        warning_message):
                    self.log.warning("Phone {} Failed to receive CMAS message"
                                     .format(self.ad.serial))
                    # Another check of logcat before confirming failure
                    if self.ad.search_logcat(warning_message):
                        self.ad.log.info(
                            "Confirmed from Logcat - User received %s",
                            warning_message)
                        return True
                    return False
            else:
                if not cmas_receive_verify_message_cdma1x(
                        self.log, self.ad, self.anritsu,
                        next(TelLabCmasTest.SERIAL_NO), message_id,
                        warning_message, c2k_response_type, c2k_severity,
                        c2k_urgency, c2k_certainty):
                    self.log.warning("Phone {} Failed to receive CMAS message"
                                     .format(self.ad.serial))
                    if self.ad.search_logcat(warning_message):
                        self.ad.log.info(
                            "Confirmed from Logcat - User received %s",
                            warning_message)
                        return True
                    return False
        except AnritsuError as e:
            self.log.error("Error in connection with Anritsu Simulator: " +
                           str(e))
            return False
        except Exception as e:
            self.log.error("Exception during CMAS send/receive: " + str(e))
            return False
        return True

    def test_carrier_tmobile(self):
        """ Sets the Carrier to TMO.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiTMO")

    def test_carrier_sprint(self):
        """ Sets the Carrier to SPR.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiSPR")

    def test_carrier_uscc(self):
        """ Sets the Carrier to USCC.
        Returns: None
        """
        setattr(self.ad, "sim_card", "FiUSCC")

    """ Tests Begin """

    @test_tracker_info(uuid="e5ddf562-e94b-4b58-bc7d-6635c01f290e")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_presidential_alert_lte(self):
        """CMAS Presidential alert message reception on LTE

        Tests the capability of device to receive and inform the user
        about the CMAS presedential alert message when camped on LTE newtork

        Steps:
        1. Make Sure Phone is camped on LTE network
        2. Send CMAS Presidential message from Anritsu

        Expected Result:
        Phone receives CMAS Presidential alert message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(set_system_model_lte, RAT_LTE,
                                               CMAS_MESSAGE_PRESIDENTIAL_ALERT,
                                               "LTE CMAS Presidential Alert")

    @test_tracker_info(uuid="33be2aaa-e8a6-4832-afea-8bd7e5555cc7")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_extreme_immediate_likely_lte(self):
        """CMAS Extreme immediate likely message reception on LTE

        Tests the capability of device to receive and inform the user
        about the Extreme immediate likely message when camped on LTE newtork

        1. Make Sure Phone is camped on LTE network
        2. Send CMAS Extreme immediate likely message from Anritsu

        Expected Result:
        Phone receives CMAS Extreme immediate likely message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_lte, RAT_LTE,
            CMAS_MESSAGE_EXTREME_IMMEDIATE_LIKELY,
            "LTE CMAS Extreme Immediate Likely")

    @test_tracker_info(uuid="111d3b0b-020a-4818-9681-e46d1d4d61fd")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_child_abduction_emergency_lte(self):
        """CMAS Child abduction emergency message reception on LTE

        Tests the capability of device to receive and inform the user
        about the CMAS Child abduction emergency message when camped on LTE newtork

        1. Make Sure Phone is camped on LTE network
        2. Send CMAS Child abduction emergency message from Anritsu

        Expected Result:
        Phone receives CMAS Child abduction emergency message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_lte, RAT_LTE,
            CMAS_MESSAGE_CHILD_ABDUCTION_EMERGENCY,
            "LTE CMAS Child abduction Alert")

    @test_tracker_info(uuid="df5676b2-cfab-4d64-8c51-ed2b95642dce")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_presidential_alert_wcdma(self):
        """CMAS Presidential alert message reception on WCDMA

        Tests the capability of device to receive and inform the user
        about the CMAS presedential alert message when camped on WCDMA newtork

        Steps:
        1. Make Sure Phone is camped on WCDMA network
        2. Send CMAS Presidential message from Anritsu

        Expected Result:
        Phone receives CMAS Presidential alert message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_wcdma, RAT_WCDMA, CMAS_MESSAGE_PRESIDENTIAL_ALERT,
            "WCDMA CMAS Presidential Alert")

    @test_tracker_info(uuid="954544cc-75e8-408b-a5a5-4d820d0e0b3d")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_extreme_immediate_likely_wcdma(self):
        """CMAS Extreme immediate likely message reception on WCDMA

        Tests the capability of device to receive and inform the user
        about the Extreme immediate likely message when camped on WCDMA newtork

        1. Make Sure Phone is camped on WCDMA network
        2. Send CMAS Extreme immediate likely message from Anritsu

        Expected Result:
        Phone receives CMAS Extreme immediate likely message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_wcdma, RAT_WCDMA,
            CMAS_MESSAGE_EXTREME_IMMEDIATE_LIKELY,
            "WCDMA CMAS Extreme Immediate Likely")

    @test_tracker_info(uuid="8c681524-b217-422b-9b45-0dea9b30deed")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_child_abduction_emergency_wcdma(self):
        """CMAS Child abduction emergency message reception on WCDMA

        Tests the capability of device to receive and inform the user
        about the CMAS Child abduction emergency message when camped on WCDMA newtork

        1. Make Sure Phone is camped on WCDMA network
        2. Send CMAS Child abduction emergency message from Anritsu

        Expected Result:
        Phone receives CMAS Child abduction emergency message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_wcdma, RAT_WCDMA,
            CMAS_MESSAGE_CHILD_ABDUCTION_EMERGENCY,
            "WCDMA CMAS Child abduction Alert")

    @test_tracker_info(uuid="44b0c8c5-b5f4-4fe0-b62f-6586bd37c728")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_presidential_alert_1x(self):
        """CMAS Presidential alert message reception on 1x

        Tests the capability of device to receive and inform the user
        about the CMAS presedential alert message when camped on 1x newtork

        Steps:
        1. Make Sure Phone is camped on 1x network
        2. Send CMAS Presidential message from Anritsu

        Expected Result:
        Phone receives CMAS Presidential alert message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(set_system_model_1x, RAT_1XRTT,
                                               CMAS_C2K_CATEGORY_PRESIDENTIAL,
                                               "1X CMAS Presidential Alert")

    @test_tracker_info(uuid="67cccd46-4cce-47b2-9cba-a24abe7aedc5")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_extreme_immediate_likely_1x(self):
        """CMAS Extreme immediate likely message reception on 1x

        Tests the capability of device to receive and inform the user
        about the Extreme immediate likely message when camped on 1x newtork

        1. Make Sure Phone is camped on 1x network
        2. Send CMAS Extreme immediate likely message from Anritsu

        Expected Result:
        Phone receives CMAS Extreme immediate likely message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_1x, RAT_1XRTT, CMAS_C2K_CATEGORY_EXTREME,
            "1X CMAS Extreme Immediate Likely", CMAS_C2K_RESPONSETYPE_EVACUATE,
            CMAS_C2K_SEVERITY_EXTREME, CMAS_C2K_URGENCY_IMMEDIATE,
            CMAS_C2K_CERTIANTY_LIKELY)

    @test_tracker_info(uuid="4053c54b-cda8-456a-8bce-5483732c9aee")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_child_abduction_emergency_1x(self):
        """CMAS Child abduction emergency message reception on 1x

        Tests the capability of device to receive and inform the user
        about the CMAS Child abduction emergency message when camped on 1x newtork

        1. Make Sure Phone is camped on 1x network
        2. Send CMAS Child abduction emergency message from Anritsu

        Expected Result:
        Phone receives CMAS Child abduction emergency message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_1x, RAT_1XRTT, CMAS_C2K_CATEGORY_AMBER,
            "1X CMAS Child abduction Alert", CMAS_C2K_RESPONSETYPE_MONITOR,
            CMAS_C2K_SEVERITY_EXTREME, CMAS_C2K_URGENCY_IMMEDIATE,
            CMAS_C2K_CERTIANTY_OBSERVED)

    @test_tracker_info(uuid="95e4643b-3387-41ce-ac24-8db3a8f96557")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_presidential_alert_1x_evdo(self):
        """CMAS Presidential alert message reception on 1x with EVDO

        Tests the capability of device to receive and inform the user
        about the CMAS presedential alert message when camped on 1x newtork

        Steps:
        1. Make Sure Phone is camped on 1x network with EVDO
        2. Send CMAS Presidential message from Anritsu

        Expected Result:
        Phone receives CMAS Presidential alert message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_1x_evdo, RAT_1XRTT,
            CMAS_C2K_CATEGORY_PRESIDENTIAL, "1X CMAS Presidential Alert")

    @test_tracker_info(uuid="d1283544-81d0-4852-9387-c94826794896")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_extreme_immediate_likely_1x_evdo(self):
        """CMAS Extreme immediate likely message reception on 1x with EVDO

        Tests the capability of device to receive and inform the user
        about the Extreme immediate likely message when camped on 1x newtork

        1. Make Sure Phone is camped on 1x network with EVDO
        2. Send CMAS Extreme immediate likely message from Anritsu

        Expected Result:
        Phone receives CMAS Extreme immediate likely message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_1x_evdo, RAT_1XRTT, CMAS_C2K_CATEGORY_EXTREME,
            "1X CMAS Extreme Immediate Likely", CMAS_C2K_RESPONSETYPE_EVACUATE,
            CMAS_C2K_SEVERITY_EXTREME, CMAS_C2K_URGENCY_IMMEDIATE,
            CMAS_C2K_CERTIANTY_LIKELY)

    @test_tracker_info(uuid="8ae7027e-77ec-4c9b-88e5-c20caef007a5")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_child_abduction_emergency_1x_evdo(self):
        """CMAS Child abduction emergency message reception on 1x with EVDO

        Tests the capability of device to receive and inform the user
        about the CMAS Child abduction emergency message when camped on 1x newtork

        1. Make Sure Phone is camped on 1x network
        2. Send CMAS Child abduction emergency message from Anritsu

        Expected Result:
        Phone receives CMAS Child abduction emergency message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_1x_evdo, RAT_1XRTT, CMAS_C2K_CATEGORY_AMBER,
            "1X CMAS Child abduction Alert", CMAS_C2K_RESPONSETYPE_MONITOR,
            CMAS_C2K_SEVERITY_EXTREME, CMAS_C2K_URGENCY_IMMEDIATE,
            CMAS_C2K_CERTIANTY_OBSERVED)

    @test_tracker_info(uuid="7e4ab36b-4e9b-4bdf-bdb8-8356103a3e79")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_presidential_alert_gsm(self):
        """CMAS Presidential alert message reception on GSM

        Tests the capability of device to receive and inform the user
        about the CMAS presedential alert message when camped on GSM newtork

        Steps:
        1. Make Sure Phone is camped on GSM network
        2. Send CMAS Presidential message from Anritsu

        Expected Result:
        Phone receives CMAS Presidential alert message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(set_system_model_gsm, RAT_GSM,
                                               CMAS_MESSAGE_PRESIDENTIAL_ALERT,
                                               "GSM CMAS Presidential Alert")

    @test_tracker_info(uuid="c6d6b57b-c915-46e3-acbe-4d7f8cd6e52e")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_extreme_immediate_likely_gsm(self):
        """CMAS Extreme immediate likely message reception on GSM

        Tests the capability of device to receive and inform the user
        about the Extreme immediate likely message when camped on GSM newtork

        1. Make Sure Phone is camped on GSM network
        2. Send CMAS Extreme immediate likely message from Anritsu

        Expected Result:
        Phone receives CMAS Extreme immediate likely message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_gsm, RAT_GSM,
            CMAS_MESSAGE_EXTREME_IMMEDIATE_LIKELY,
            "GSM CMAS Extreme Immediate Likely")

    @test_tracker_info(uuid="eb0a51de-f5fa-4b66-b0c2-21320fca44ca")
    @TelephonyBaseTest.tel_test_wrap
    def test_cmas_child_abduction_emergency_gsm(self):
        """CMAS Child abduction emergency message reception on GSM

        Tests the capability of device to receive and inform the user
        about the CMAS Child abduction emergency message when camped on GSM newtork

        1. Make Sure Phone is camped on GSM network
        2. Send CMAS Child abduction emergency message from Anritsu

        Expected Result:
        Phone receives CMAS Child abduction emergency message

        Returns:
            True if pass; False if fail
        """
        return self._send_receive_cmas_message(
            set_system_model_gsm, RAT_GSM,
            CMAS_MESSAGE_CHILD_ABDUCTION_EMERGENCY,
            "GSM CMAS Child abduction Alert")

    """ Tests End """
