#!/usr/bin/env python3.4
#
#   Copyright 2016 - Google
#
#   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.
"""
    Test Script for Telephony Stress Call Test
"""

import collections
import time
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
from acts_contrib.test_utils.tel.tel_ims_utils import set_wfc_mode
from acts_contrib.test_utils.tel.tel_logging_utils import start_qxdm_loggers
from acts_contrib.test_utils.tel.tel_logging_utils import start_sdm_loggers
from acts_contrib.test_utils.tel.tel_message_utils import sms_send_receive_verify
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_csfb
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_voice_3g
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_voice_2g
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_volte
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_idle_iwlan
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phone_subscription
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_test_utils import verify_incall_state
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.tel_video_utils import phone_setup_video
from acts_contrib.test_utils.tel.tel_video_utils import video_call_setup
from acts_contrib.test_utils.tel.tel_video_utils import is_phone_in_call_video_bidirectional
from acts_contrib.test_utils.tel.tel_voice_utils import call_setup_teardown
from acts_contrib.test_utils.tel.tel_voice_utils import hangup_call
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_2g
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
from acts_contrib.test_utils.tel.tel_voice_utils import last_call_drop_reason
from acts_contrib.test_utils.tel.tel_wifi_utils import ensure_wifi_connected
from acts.utils import get_current_epoch_time
from acts.utils import rand_ascii_str
from acts.libs.utils.multithread import multithread_func


class TelLiveStressCallTest(TelephonyBaseTest):
    def setup_class(self):
        super(TelLiveStressCallTest, self).setup_class()
        self.caller = self.android_devices[0]
        self.callee = self.android_devices[1]
        self.number_of_devices = 2
        self.user_params["telephony_auto_rerun"] = 0
        self.phone_call_iteration = int(
            self.user_params.get("phone_call_iteration", 500))
        self.phone_call_duration = int(
            self.user_params.get("phone_call_duration", 60))
        self.sleep_time_between_test_iterations = int(
            self.user_params.get("sleep_time_between_test_iterations", 0))

        return True

    def on_fail(self, test_name, begin_time):
        pass

    def _setup_wfc(self):
        for ad in self.android_devices:
            if not ensure_wifi_connected(
                    ad.log,
                    ad,
                    self.wifi_network_ssid,
                    self.wifi_network_pass,
                    retries=3):
                ad.log.error("Phone Wifi connection fails.")
                return False
            ad.log.info("Phone WIFI is connected successfully.")
            if not set_wfc_mode(self.log, ad, WFC_MODE_WIFI_PREFERRED):
                ad.log.error("Phone failed to enable Wifi-Calling.")
                return False
            ad.log.info("Phone is set in Wifi-Calling successfully.")
            if not phone_idle_iwlan(self.log, ad):
                ad.log.error("Phone is not in WFC enabled state.")
                return False
            ad.log.info("Phone is in WFC enabled state.")
        return True

    def _setup_wfc_apm(self):
        for ad in self.android_devices:
            toggle_airplane_mode(ad.log, ad, True)
            if not ensure_wifi_connected(
                    ad.log,
                    ad,
                    self.wifi_network_ssid,
                    self.wifi_network_pass,
                    retries=3):
                ad.log.error("Phone Wifi connection fails.")
                return False
            ad.log.info("Phone WIFI is connected successfully.")
            if not set_wfc_mode(self.log, ad, WFC_MODE_WIFI_PREFERRED):
                ad.log.error("Phone failed to enable Wifi-Calling.")
                return False
            ad.log.info("Phone is set in Wifi-Calling successfully.")
            if not phone_idle_iwlan(self.log, ad):
                ad.log.error("Phone is not in WFC enabled state.")
                return False
            ad.log.info("Phone is in WFC enabled state.")
        return True

    def _setup_vt(self):
        ads = self.android_devices
        tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
                                                           (self.log, ads[1]))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            return False
        return True

    def _setup_lte_volte_enabled(self):
        for ad in self.android_devices:
            if not phone_setup_volte(self.log, ad):
                ad.log.error("Phone failed to enable VoLTE.")
                return False
            ad.log.info("Phone VOLTE is enabled successfully.")
        return True

    def _setup_lte_volte_disabled(self):
        for ad in self.android_devices:
            if not phone_setup_csfb(self.log, ad):
                ad.log.error("Phone failed to setup CSFB.")
                return False
            ad.log.info("Phone VOLTE is disabled successfully.")
        return True

    def _setup_3g(self):
        for ad in self.android_devices:
            if not phone_setup_voice_3g(self.log, ad):
                ad.log.error("Phone failed to setup 3g.")
                return False
            ad.log.info("Phone RAT 3G is enabled successfully.")
        return True

    def _setup_2g(self):
        for ad in self.android_devices:
            if not phone_setup_voice_2g(self.log, ad):
                ad.log.error("Phone failed to setup 2g.")
                return False
            ad.log.info("RAT 2G is enabled successfully.")
        return True

    def _setup_phone_call(self, test_video, phone_call_duration=WAIT_TIME_IN_CALL):
        if test_video:
            if not video_call_setup(
                    self.log,
                    self.android_devices[0],
                    self.android_devices[1],
            ):
                self.log.error("Failed to setup Video call")
                return False
        else:
            if not call_setup_teardown(
                    self.log, self.caller, self.callee, ad_hangup=None, wait_time_in_call=phone_call_duration):
                self.log.error("Setup Call failed.")
                return False
        self.log.info("Setup call successfully.")
        return True

    def _hangup_call(self):
        for ad in self.android_devices:
            hangup_call(self.log, ad)

    def stress_test(self,
                    setup_func=None,
                    network_check_func=None,
                    test_sms=False,
                    test_video=False):
        for ad in self.android_devices:
            #check for sim and service
            ensure_phone_subscription(self.log, ad)

        if setup_func and not setup_func():
            self.log.error("Test setup %s failed", setup_func.__name__)
            return False
        fail_count = collections.defaultdict(int)
        for i in range(1, self.phone_call_iteration + 1):
            msg = "Stress Call Test %s Iteration: <%s> / <%s>" % (
                self.test_name, i, self.phone_call_iteration)
            begin_time = get_current_epoch_time()
            self.log.info(msg)
            iteration_result = True
            ensure_phones_idle(self.log, self.android_devices)

            if not self._setup_phone_call(test_video, phone_call_duration=self.phone_call_duration):
                fail_count["dialing"] += 1
                iteration_result = False
                self.log.error("%s call dialing failure.", msg)
            else:
                if network_check_func and not network_check_func(
                        self.log, self.caller):
                    fail_count["caller_network_check"] += 1
                    last_call_drop_reason(self.caller, begin_time)
                    iteration_result = False
                    self.log.error("%s network check %s failure.", msg,
                                   network_check_func.__name__)

                if network_check_func and not network_check_func(
                        self.log, self.callee):
                    fail_count["callee_network_check"] += 1
                    last_call_drop_reason(self.callee, begin_time)
                    iteration_result = False
                    self.log.error("%s network check failure.", msg)

                if not verify_incall_state(self.log,
                                           [self.caller, self.callee], True):
                    self.log.error("%s call dropped.", msg)
                    iteration_result = False
                    fail_count["drop"] += 1

                self._hangup_call()

            if test_sms and not sms_send_receive_verify(
                    self.log, self.caller, self.callee, [rand_ascii_str(180)]):
                fail_count["sms"] += 1

            self.log.info("%s %s", msg, iteration_result)
            if not iteration_result:
                self._take_bug_report("%s_CallNo_%s" % (self.test_name, i),
                                      begin_time)
                if self.sdm_log:
                    start_sdm_loggers(self.log, self.android_devices)
                else:
                    start_qxdm_loggers(self.log, self.android_devices)

            if self.sleep_time_between_test_iterations:
                self.caller.droid.goToSleepNow()
                self.callee.droid.goToSleepNow()
                time.sleep(self.sleep_time_between_test_iterations)

        test_result = True
        for failure, count in fail_count.items():
            if count:
                self.log.error("%s: %s %s failures in %s iterations",
                               self.test_name, count, failure,
                               self.phone_call_iteration)
                test_result = False
        return test_result

    """ Tests Begin """

    @test_tracker_info(uuid="3c3daa08-e66a-451a-a772-634ec522c965")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_default_stress(self):
        """ Default state call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in default mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test()

    @test_tracker_info(uuid="b7fd730a-d4c7-444c-9e36-12389679b430")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_and_sms_longevity(self):
        """ Default state call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in default mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3. Send a text message from PhoneA to PhoneB.
        4. Bring phone to sleep for x seconds based on the config setup.
        5, Repeat 2 around N times based on the config setup

        Expected Results:
        1. Phone calls and text messages are successfully made

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(test_sms=True)

    @test_tracker_info(uuid="3b711843-de27-4b0a-a163-8c439c901e24")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_volte_stress(self):
        """ VoLTE call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in VoLTE mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_lte_volte_enabled,
            network_check_func=is_phone_in_call_volte)

    @test_tracker_info(uuid="518516ea-1c0a-494d-ad44-272f21075d39")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_csfb_stress(self):
        """ LTE CSFB call stress test

        Steps:
        1. Make Sure PhoneA in LTE CSFB mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_lte_volte_disabled,
            network_check_func=is_phone_in_call_csfb)

    @test_tracker_info(uuid="887608cb-e5c6-4b19-b02b-3461c1e78f2d")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_wifi_calling_stress(self):
        """ Wifi calling call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in WFC On + Wifi Connected
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_wfc,
            network_check_func=is_phone_in_call_iwlan)

    @test_tracker_info(uuid="be45c620-b45b-4a06-8424-b17d744d0735")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_wifi_calling_stress_apm(self):
        """ Wifi calling in AirPlaneMode call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in WFC On + APM ON + Wifi Connected
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_wfc_apm,
            network_check_func=is_phone_in_call_iwlan)

    @test_tracker_info(uuid="8af0454b-b4db-46d8-b5cc-e13ec5bc59ab")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_3g_stress(self):
        """ 3G call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in 3G mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_3g, network_check_func=is_phone_in_call_3g)

    @test_tracker_info(uuid="12380823-2e7f-4c41-95c0-5f8c483f9510")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_2g_stress(self):
        """ 2G call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in 3G mode.
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_2g, network_check_func=is_phone_in_call_2g)

    @test_tracker_info(uuid="28a88b44-f239-4b77-b01f-e9068373d749")
    @TelephonyBaseTest.tel_test_wrap
    def test_call_video_stress(self):
        """ VT call stress test

        Steps:
        1. Make Sure PhoneA and PhoneB in VoLTE mode (ViLTE provisioned).
        2. Call from PhoneA to PhoneB, hang up on PhoneA.
        3, Repeat 2 around N times based on the config setup

        Expected Results:
        1, Verify phone is at IDLE state
        2, Verify the phone is at ACTIVE, if it is in dialing, then we retry
        3, Verify the phone is IDLE after hung up

        Returns:
            True if pass; False if fail.
        """
        return self.stress_test(
            setup_func=self._setup_vt,
            network_check_func=is_phone_in_call_video_bidirectional,
            test_video=True)

    """ Tests End """
