Merge "Add further incall data handling and checking."
diff --git a/acts/framework/acts/test_utils/tel/tel_test_utils.py b/acts/framework/acts/test_utils/tel/tel_test_utils.py
index 4777493..6d69db0 100644
--- a/acts/framework/acts/test_utils/tel/tel_test_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_test_utils.py
@@ -1525,6 +1525,22 @@
         setattr(ad, 'telephony', {"capabilities": capabilities})
     else:
         ad.telephony["capabilities"] = capabilities
+    if CAPABILITY_WFC not in capabilities:
+        wfc_modes = []
+    else:
+        if carrier_configs.get(CarrierConfigs.EDITABLE_WFC_MODE_BOOL, False):
+            wfc_modes = [WFC_MODE_CELLULAR_PREFERRED, WFC_MODE_WIFI_PREFERRED]
+        else:
+            wfc_modes = [
+                carrier_configs.get(CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT,
+                                    WFC_MODE_CELLULAR_PREFERRED)
+            ]
+    if carrier_configs.get(CarrierConfigs.WFC_SUPPORTS_WIFI_ONLY_BOOL,
+                           False) and WFC_MODE_WIFI_ONLY not in wfc_modes:
+        wfc_modes.append(WFC_MODE_WIFI_ONLY)
+    ad.telephony["wfc_modes"] = wfc_modes
+    if wfc_modes:
+        ad.log.info("Supported WFC modes: %s", wfc_modes)
 
 
 def call_reject(log, ad_caller, ad_callee, reject=True):
diff --git a/acts/tests/google/tel/live/TelLiveImsSettingsTest.py b/acts/tests/google/tel/live/TelLiveImsSettingsTest.py
index b9c0d1a..8520d3b 100644
--- a/acts/tests/google/tel/live/TelLiveImsSettingsTest.py
+++ b/acts/tests/google/tel/live/TelLiveImsSettingsTest.py
@@ -96,21 +96,7 @@
             self.carrier_configs[CarrierConfigs.DEFAULT_WFC_IMS_ENABLED_BOOL])
         self.default_wfc_mode = self.carrier_configs.get(
             CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT, None)
-        if self.carrier_configs.get(CarrierConfigs.EDITABLE_WFC_MODE_BOOL,
-                                    False):
-            self.dut_wfc_modes = [
-                WFC_MODE_CELLULAR_PREFERRED, WFC_MODE_WIFI_PREFERRED
-            ]
-        else:
-            self.dut_wfc_modes = [
-                self.carrier_configs.get(
-                    CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT,
-                    WFC_MODE_CELLULAR_PREFERRED)
-            ]
-        if self.carrier_configs.get(
-                CarrierConfigs.WFC_SUPPORTS_WIFI_ONLY_BOOL,
-                False) and WFC_MODE_WIFI_ONLY not in wfc_modes:
-            self.dut_wfc_modes.append(WFC_MODE_WIFI_ONLY)
+        self.dut_wfc_modes = self.dut.telephony.get("wfc_modes", [])
 
     def check_call_in_wfc(self):
         result = True
diff --git a/acts/tests/google/tel/live/TelLiveStressTest.py b/acts/tests/google/tel/live/TelLiveStressTest.py
index a4fec97..621e120 100644
--- a/acts/tests/google/tel/live/TelLiveStressTest.py
+++ b/acts/tests/google/tel/live/TelLiveStressTest.py
@@ -23,10 +23,13 @@
 import random
 import time
 
+from acts import signals
 from acts import utils
 from acts.libs.proc import job
 from acts.test_decorators import test_tracker_info
 from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+from acts.test_utils.tel.tel_defines import CAPABILITY_VOLTE
+from acts.test_utils.tel.tel_defines import CAPABILITY_WFC
 from acts.test_utils.tel.tel_defines import INCALL_UI_DISPLAY_BACKGROUND
 from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_SMS_RECEIVE
 from acts.test_utils.tel.tel_defines import NETWORK_MODE_WCDMA_ONLY
@@ -36,7 +39,9 @@
 from acts.test_utils.tel.tel_defines import NETWORK_MODE_TDSCDMA_GSM_WCDMA
 from acts.test_utils.tel.tel_defines import NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA
 from acts.test_utils.tel.tel_defines import WAIT_TIME_AFTER_MODE_CHANGE
+from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
 from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
+from acts.test_utils.tel.tel_lookup_tables import is_rat_svd_capable
 from acts.test_utils.tel.tel_test_utils import STORY_LINE
 from acts.test_utils.tel.tel_test_utils import active_file_download_test
 from acts.test_utils.tel.tel_test_utils import is_phone_in_call
@@ -113,6 +118,9 @@
             self.user_params.get("min_phone_call_duration", 10))
         self.crash_check_interval = int(
             self.user_params.get("crash_check_interval", 300))
+        self.dut_incall = False
+        self.dut_capabilities = self.dut.telephony.get("capabilities", [])
+        self.dut_wfc_modes = self.dut.telephony.get("wfc_modes", [])
         return True
 
     def setup_test(self):
@@ -147,7 +155,7 @@
     def _setup_wfc_apm(self):
         for ad in self.android_devices:
             if not phone_setup_iwlan(
-                    self.log, ad, True, WFC_MODE_WIFI_PREFERRED,
+                    self.log, ad, True, WFC_MODE_CELLULAR_PREFERRED,
                     self.wifi_network_ssid, self.wifi_network_pass):
                 ad.log.error("Failed to setup WFC.")
                 return False
@@ -201,6 +209,11 @@
             0: sms_send_receive_verify,
             1: mms_send_receive_verify
         }
+        rat = self.dut.adb.getprop("gsm.network.type")
+        self.dut.log.info("Network in RAT %s", rat)
+        if self.dut_incall and not is_rat_svd_capable(rat.upper()):
+            self.dut.log.info("In call data not supported, test SMS only")
+            selection = 0
         message_type = message_type_map[selection]
         the_number = self.result_info["%s Total" % message_type] + 1
         begin_time = get_current_epoch_time()
@@ -231,12 +244,6 @@
         else:
             text += rand_ascii_str(length - text_length)
         message_content_map = {0: [text], 1: [(test_name, text, None)]}
-        incall_non_ims = False
-        for ad in self.android_devices:
-            if ad.droid.telecomIsInCall() and (
-                    not ad.droid.telephonyIsImsRegistered()):
-                incall_non_ims = True
-                break
 
         result = message_func_map[selection](self.log, ads[0], ads[1],
                                              message_content_map[selection],
@@ -250,9 +257,11 @@
                 self.log.error("%s fails", log_msg)
                 self.result_info["%s Failure" % message_type] += 1
             else:
-                if incall_non_ims:
-                    self.log.info(
-                        "Device not in IMS, MMS in call is not support")
+                rat = self.dut.adb.getprop("gsm.network.type")
+                self.dut.log.info("Network in RAT %s", rat)
+                if self.dut_incall and not is_rat_svd_capable(rat.upper()):
+                    self.dut.log.info(
+                        "In call data not supported, MMS failure expected")
                     self.result_info["Expected In-call MMS failure"] += 1
                     return True
                 else:
@@ -306,6 +315,7 @@
                 mask=None)
         start_qxdm_loggers(self.log, self.android_devices, begin_time)
         failure_reasons = set()
+        self.dut_incall = True
         if self.single_phone_test:
             call_setup_result = initiate_call(
                 self.log,
@@ -374,6 +384,7 @@
             except:
                 pass
         self.log.info("%s end", log_msg)
+        self.dut_incall = False
         if not result:
             self.log.info("%s failed", log_msg)
             if self.user_params.get("gps_log_file", None):
@@ -459,8 +470,10 @@
     def _init_perf_json(self):
         self.perf_file = os.path.join(self.log_path, "%s_perf_data_%s.json" %
                                       (self.test_name, self.begin_time))
-        self.perf_data = self.android_devices[0].build_info.copy()
-        self.perf_data["model"] = self.android_devices[0].model
+        self.perf_data = self.dut.build_info.copy()
+        self.perf_data["model"] = self.dut.model
+        self.perf_data["carrier"] = self.dut.adb.getprop(
+            "gsm.sim.operator.alpha")
         self._write_perf_json()
 
     def _update_perf_json(self):
@@ -557,16 +570,23 @@
         file_name = file_names[selection]
         self.result_info["Internet Connection Check Total"] += 1
         if not verify_internet_connection(self.log, self.dut):
-            self.result_info["Internet Connection Check Failure"] += 1
-            test_name = "%s_internet_connection_No_%s_failure" % (
-                self.test_name,
-                self.result_info["Internet Connection Check Failure"])
-            try:
-                self._ad_take_extra_logs(self.dut, test_name, begin_time)
-                self._ad_take_bugreport(self.dut, test_name, begin_time)
-            except Exception as e:
-                self.log.exception(e)
-            return False
+            rat = self.dut.adb.getprop("gsm.network.type")
+            self.dut.log.info("Network in RAT %s", rat)
+            if self.dut_incall and not is_rat_svd_capable(rat.upper()):
+                self.result.info[
+                    "Expected Incall Internet Connection Check Failure"] += 1
+                return True
+            else:
+                self.result_info["Internet Connection Check Failure"] += 1
+                test_name = "%s_internet_connection_No_%s_failure" % (
+                    self.test_name,
+                    self.result_info["Internet Connection Check Failure"])
+                try:
+                    self._ad_take_extra_logs(self.dut, test_name, begin_time)
+                    self._ad_take_bugreport(self.dut, test_name, begin_time)
+                except Exception as e:
+                    self.log.exception(e)
+                return False
         else:
             self.result_info["Internet Connection Check Success"] += 1
 
@@ -610,21 +630,34 @@
 
     def check_incall_data(self):
         if self.single_phone_test:
-            call_setup_result = initiate_call(
-                self.log, self.dut,
-                self.call_server_number) and wait_for_in_call_active(
-                    self.dut, 60, 3)
-            incall_data = verify_internet_connection(self.log, self.dut)
+            if not initiate_call(
+                    self.log, self.dut,
+                    self.call_server_number) and wait_for_in_call_active(
+                        self.dut, 60, 3):
+                raise signals.TestAbort("Unable to make phone call")
         else:
-            ads = self.android_devices
-            call_setup_result = call_setup_teardown(
-                self.log, ads[0], ads[1], ad_hangup=None)
-            incall_data = verify_internet_connection(
-                self.log, ads[0]) and verify_internet_connection(
-                    self.log, ads[1])
-        self.log.info("***** Incall data capability is %s *****", incall_data)
-        hangup_call_by_adb(self.dut)
-        return call_setup_result and incall_data
+            if not call_setup_teardown(
+                    self.log, self.dut, self.android_devices[1],
+                    ad_hangup=None):
+                raise signals.TestAbort("Unable to make phone call")
+        voice_rat = self.dut.droid.telephonyGetCurrentVoiceNetworkType()
+        data_rat = self.dut.droid.telephonyGetCurrentDataNetworkType()
+        self.dut.log.info("Voice in RAT %s, Data in RAT %s", voice_rat,
+                          data_rat)
+        try:
+            if is_rat_svd_capable(voice_rat.upper()):
+                self.dut.log.info("Capable for simultaneous voice and data")
+                if not verify_internet_connection(self.log, self.dut):
+                    self.dut.log.error("Incall data check failed")
+                    raise signals.TestAbort("Incall data check failed")
+                else:
+                    return True
+            else:
+                self.dut.log.info(
+                    "Not capable for simultaneous voice and data")
+                return False
+        finally:
+            hangup_call_by_adb(self.dut)
 
     def parallel_tests(self, setup_func=None, call_verification_func=None):
         self.log.info(self._get_result_message())
@@ -635,16 +668,21 @@
                                             setup_func.__name__),
                                   self.begin_time)
             return False
-        in_call_data = self.check_incall_data()
         if not call_verification_func:
             call_verification_func = is_phone_in_call
         self.finishing_time = time.time() + self.max_run_time
-        if in_call_data:
+        if self.check_incall_data():
+            self.log.info(
+                "==== Start parallel voice/message/data stress test ====")
+            self.perf_data["testing method"] = "parallel"
             results = run_multithread_func(
                 self.log, [(self.call_test, [call_verification_func]),
                            (self.message_test, []), (self.data_test, []),
                            (self.crash_check_test, [])])
         else:
+            self.log.info(
+                "==== Start sequential voice/message/data stress test ====")
+            self.perf_data["testing method"] = "sequential"
             results = run_multithread_func(
                 self.log, [(self.sequential_tests, [call_verification_func]),
                            (self.crash_check_test, [])])
@@ -729,6 +767,8 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_lte_volte_parallel_stress(self):
         """ VoLTE on stress test"""
+        if CAPABILITY_VOLTE not in self.dut_capabilities:
+            raise signals.TestSkipClass("VoLTE is not supported")
         return self.parallel_tests(
             setup_func=self._setup_lte_volte_enabled,
             call_verification_func=is_phone_in_call_volte)
@@ -745,6 +785,10 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_wfc_parallel_stress(self):
         """ Wifi calling APM mode off stress test"""
+        if CAPABILITY_WFC not in self.dut_capabilities:
+            raise signals.TestSkipClass("WFC is not supported")
+        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
+            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
         return self.parallel_tests(
             setup_func=self._setup_wfc,
             call_verification_func=is_phone_in_call_iwlan)
@@ -753,6 +797,8 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_wfc_apm_parallel_stress(self):
         """ Wifi calling in APM mode on stress test"""
+        if CAPABILITY_WFC not in self.dut_capabilities:
+            raise signals.TestSkipClass("WFC is not supported")
         return self.parallel_tests(
             setup_func=self._setup_wfc_apm,
             call_verification_func=is_phone_in_call_iwlan)
@@ -767,7 +813,7 @@
 
     @test_tracker_info(uuid="f34f1a31-3948-4675-8698-372a83b8088d")
     @TelephonyBaseTest.tel_test_wrap
-    def test_call_2g_parallel_stress(self):
+    def test_2g_parallel_stress(self):
         """ 2G call stress test"""
         return self.parallel_tests(
             setup_func=self._setup_2g,
@@ -777,6 +823,8 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_volte_modeprefchange_parallel_stress(self):
         """ VoLTE Mode Pref call stress test"""
+        if CAPABILITY_VOLTE not in self.dut_capabilities:
+            raise signals.TestSkipClass("VoLTE is not supported")
         return self.parallel_with_network_change_tests(
             setup_func=self._setup_lte_volte_enabled)