Home | History | Annotate | Download | only in live
      1 #!/usr/bin/env python3.4
      2 #
      3 #   Copyright 2016 - Google
      4 #
      5 #   Licensed under the Apache License, Version 2.0 (the "License");
      6 #   you may not use this file except in compliance with the License.
      7 #   You may obtain a copy of the License at
      8 #
      9 #       http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 #   Unless required by applicable law or agreed to in writing, software
     12 #   distributed under the License is distributed on an "AS IS" BASIS,
     13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 #   See the License for the specific language governing permissions and
     15 #   limitations under the License.
     16 """
     17     Test Script for VT live call test
     18 """
     19 
     20 import time
     21 from queue import Empty
     22 from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
     23 from acts.test_utils.tel.tel_defines import AUDIO_ROUTE_EARPIECE
     24 from acts.test_utils.tel.tel_defines import AUDIO_ROUTE_SPEAKER
     25 from acts.test_utils.tel.tel_defines import CALL_STATE_ACTIVE
     26 from acts.test_utils.tel.tel_defines import CALL_STATE_HOLDING
     27 from acts.test_utils.tel.tel_defines import CALL_CAPABILITY_MANAGE_CONFERENCE
     28 from acts.test_utils.tel.tel_defines import CALL_CAPABILITY_MERGE_CONFERENCE
     29 from acts.test_utils.tel.tel_defines import CALL_CAPABILITY_SWAP_CONFERENCE
     30 from acts.test_utils.tel.tel_defines import CALL_PROPERTY_CONFERENCE
     31 from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_VIDEO_SESSION_EVENT
     32 from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_VOLTE_ENABLED
     33 from acts.test_utils.tel.tel_defines import VT_STATE_AUDIO_ONLY
     34 from acts.test_utils.tel.tel_defines import VT_STATE_BIDIRECTIONAL
     35 from acts.test_utils.tel.tel_defines import VT_STATE_BIDIRECTIONAL_PAUSED
     36 from acts.test_utils.tel.tel_defines import VT_VIDEO_QUALITY_DEFAULT
     37 from acts.test_utils.tel.tel_defines import VT_STATE_RX_ENABLED
     38 from acts.test_utils.tel.tel_defines import VT_STATE_TX_ENABLED
     39 from acts.test_utils.tel.tel_defines import WAIT_TIME_ANDROID_STATE_SETTLING
     40 from acts.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
     41 from acts.test_utils.tel.tel_defines import EVENT_VIDEO_SESSION_EVENT
     42 from acts.test_utils.tel.tel_defines import EventTelecomVideoCallSessionEvent
     43 from acts.test_utils.tel.tel_defines import SESSION_EVENT_RX_PAUSE
     44 from acts.test_utils.tel.tel_defines import SESSION_EVENT_RX_RESUME
     45 from acts.test_utils.tel.tel_test_utils import call_setup_teardown
     46 from acts.test_utils.tel.tel_test_utils import disconnect_call_by_id
     47 from acts.test_utils.tel.tel_test_utils import hangup_call
     48 from acts.test_utils.tel.tel_test_utils import multithread_func
     49 from acts.test_utils.tel.tel_test_utils import num_active_calls
     50 from acts.test_utils.tel.tel_test_utils import verify_http_connection
     51 from acts.test_utils.tel.tel_test_utils import verify_incall_state
     52 from acts.test_utils.tel.tel_test_utils import wait_for_video_enabled
     53 from acts.test_utils.tel.tel_video_utils import get_call_id_in_video_state
     54 from acts.test_utils.tel.tel_video_utils import \
     55     is_phone_in_call_video_bidirectional
     56 from acts.test_utils.tel.tel_video_utils import is_phone_in_call_voice_hd
     57 from acts.test_utils.tel.tel_video_utils import phone_setup_video
     58 from acts.test_utils.tel.tel_video_utils import \
     59     verify_video_call_in_expected_state
     60 from acts.test_utils.tel.tel_video_utils import video_call_downgrade
     61 from acts.test_utils.tel.tel_video_utils import video_call_modify_video
     62 from acts.test_utils.tel.tel_video_utils import video_call_setup_teardown
     63 from acts.test_utils.tel.tel_voice_utils import get_audio_route
     64 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
     65 from acts.test_utils.tel.tel_voice_utils import phone_setup_volte
     66 from acts.test_utils.tel.tel_voice_utils import set_audio_route
     67 from acts.test_utils.tel.tel_voice_utils import get_cep_conference_call_id
     68 
     69 
     70 class TelLiveVideoTest(TelephonyBaseTest):
     71     def __init__(self, controllers):
     72         TelephonyBaseTest.__init__(self, controllers)
     73         self.tests = (
     74             "test_call_video_to_video",
     75             "test_call_video_accept_as_voice",
     76             "test_call_video_to_video_mo_disable_camera",
     77             "test_call_video_to_video_mt_disable_camera",
     78             "test_call_video_to_video_mo_mt_disable_camera",
     79             "test_call_video_to_video_mt_mo_disable_camera",
     80             "test_call_volte_to_volte_mo_upgrade_bidirectional",
     81             "test_call_video_accept_as_voice_mo_upgrade_bidirectional",
     82             "test_call_volte_to_volte_mo_upgrade_reject",
     83             "test_call_video_accept_as_voice_mo_upgrade_reject",
     84             "test_call_video_to_video_mo_to_backgroundpause_foregroundresume",
     85             "test_call_video_to_video_mt_to_backgroundpause_foregroundresume",
     86 
     87             # Video Call + Voice Call
     88             "test_call_video_add_mo_voice",
     89             "test_call_video_add_mt_voice",
     90             "test_call_volte_add_mo_video",
     91             "test_call_volte_add_mt_video",
     92             "test_call_video_add_mt_voice_swap_once_local_drop",
     93             "test_call_video_add_mt_voice_swap_twice_remote_drop_voice_unhold_video",
     94 
     95             # Video + Video
     96             "test_call_video_add_mo_video",
     97             "test_call_video_add_mt_video",
     98             "test_call_mt_video_add_mt_video",
     99             "test_call_mt_video_add_mo_video",
    100 
    101             # VT conference
    102             "test_call_volte_add_mo_video_accept_as_voice_merge_drop",
    103             "test_call_volte_add_mt_video_accept_as_voice_merge_drop",
    104             "test_call_video_add_mo_voice_swap_downgrade_merge_drop",
    105             "test_call_video_add_mt_voice_swap_downgrade_merge_drop",
    106             "test_call_volte_add_mo_video_downgrade_merge_drop",
    107             "test_call_volte_add_mt_video_downgrade_merge_drop",
    108 
    109             # VT conference - Conference Event Package
    110             "test_call_volte_add_mo_video_accept_as_voice_merge_drop_cep",
    111             "test_call_volte_add_mt_video_accept_as_voice_merge_drop_cep",
    112             "test_call_video_add_mo_voice_swap_downgrade_merge_drop_cep",
    113             "test_call_video_add_mt_voice_swap_downgrade_merge_drop_cep",
    114             "test_call_volte_add_mo_video_downgrade_merge_drop_cep",
    115             "test_call_volte_add_mt_video_downgrade_merge_drop_cep",
    116 
    117             # Disable Data, VT not available
    118             "test_disable_data_vt_unavailable", )
    119 
    120         self.stress_test_number = int(self.user_params["stress_test_number"])
    121         self.wifi_network_ssid = self.user_params["wifi_network_ssid"]
    122 
    123         try:
    124             self.wifi_network_pass = self.user_params["wifi_network_pass"]
    125         except KeyError:
    126             self.wifi_network_pass = None
    127 
    128     """ Tests Begin """
    129 
    130     @TelephonyBaseTest.tel_test_wrap
    131     def test_call_video_to_video(self):
    132         """ Test VT<->VT call functionality.
    133 
    134         Make Sure PhoneA is in LTE mode (with Video Calling).
    135         Make Sure PhoneB is in LTE mode (with Video Calling).
    136         Call from PhoneA to PhoneB as Bi-Directional Video,
    137         Accept on PhoneB as video call, hang up on PhoneA.
    138 
    139         Returns:
    140             True if pass; False if fail.
    141         """
    142         ads = self.android_devices
    143         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    144                                                            (self.log, ads[1]))]
    145         if not multithread_func(self.log, tasks):
    146             self.log.error("Phone Failed to Set Up Properly.")
    147             return False
    148 
    149         if not video_call_setup_teardown(
    150                 self.log,
    151                 ads[0],
    152                 ads[1],
    153                 ads[0],
    154                 video_state=VT_STATE_BIDIRECTIONAL,
    155                 verify_caller_func=is_phone_in_call_video_bidirectional,
    156                 verify_callee_func=is_phone_in_call_video_bidirectional):
    157             self.log.error("Failed to setup+teardown a call")
    158             return False
    159 
    160         return True
    161 
    162     @TelephonyBaseTest.tel_test_wrap
    163     def test_call_video_accept_as_voice(self):
    164         """ Test VT<->VT call functionality.
    165 
    166         Make Sure PhoneA is in LTE mode (with Video Calling).
    167         Make Sure PhoneB is in LTE mode (with Video Calling).
    168         Call from PhoneA to PhoneB as Bi-Directional Video,
    169         Accept on PhoneB as audio only, hang up on PhoneA.
    170 
    171         Returns:
    172             True if pass; False if fail.
    173         """
    174         ads = self.android_devices
    175         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    176                                                            (self.log, ads[1]))]
    177         if not multithread_func(self.log, tasks):
    178             self.log.error("Phone Failed to Set Up Properly.")
    179             return False
    180 
    181         if not video_call_setup_teardown(
    182                 self.log,
    183                 ads[0],
    184                 ads[1],
    185                 ads[0],
    186                 video_state=VT_STATE_AUDIO_ONLY,
    187                 verify_caller_func=is_phone_in_call_voice_hd,
    188                 verify_callee_func=is_phone_in_call_voice_hd):
    189             self.log.error("Failed to setup+teardown a call")
    190             return False
    191         return True
    192 
    193     @TelephonyBaseTest.tel_test_wrap
    194     def test_call_video_to_video_mo_disable_camera(self):
    195         """ Test VT<->VT call functionality.
    196 
    197         Make Sure PhoneA is in LTE mode (with Video Calling).
    198         Make Sure PhoneB is in LTE mode (with Video Calling).
    199         Call from PhoneA to PhoneB as Bi-Directional Video,
    200         Accept on PhoneB as video call.
    201         On PhoneA disabled video transmission.
    202         Verify PhoneA as RX_ENABLED and PhoneB as TX_ENABLED.
    203         Hangup on PhoneA.
    204 
    205         Returns:
    206             True if pass; False if fail.
    207         """
    208         ads = self.android_devices
    209         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    210                                                            (self.log, ads[1]))]
    211         if not multithread_func(self.log, tasks):
    212             self.log.error("Phone Failed to Set Up Properly.")
    213             return False
    214 
    215         if not video_call_setup_teardown(
    216                 self.log,
    217                 ads[0],
    218                 ads[1],
    219                 None,
    220                 video_state=VT_STATE_BIDIRECTIONAL,
    221                 verify_caller_func=is_phone_in_call_video_bidirectional,
    222                 verify_callee_func=is_phone_in_call_video_bidirectional):
    223             self.log.error("Failed to setup a call")
    224             return False
    225 
    226         self.log.info("Disable video on PhoneA:{}".format(ads[0].serial))
    227         if not video_call_downgrade(
    228                 self.log, ads[0], get_call_id_in_video_state(
    229                     self.log, ads[0], VT_STATE_BIDIRECTIONAL), ads[1],
    230                 get_call_id_in_video_state(self.log, ads[1],
    231                                            VT_STATE_BIDIRECTIONAL)):
    232             self.log.error("Failed to disable video on PhoneA.")
    233             return False
    234         return hangup_call(self.log, ads[0])
    235 
    236     @TelephonyBaseTest.tel_test_wrap
    237     def test_call_video_to_video_mt_disable_camera(self):
    238         """ Test VT<->VT call functionality.
    239 
    240         Make Sure PhoneA is in LTE mode (with Video Calling).
    241         Make Sure PhoneB is in LTE mode (with Video Calling).
    242         Call from PhoneA to PhoneB as Bi-Directional Video,
    243         Accept on PhoneB as video call.
    244         On PhoneB disabled video transmission.
    245         Verify PhoneB as RX_ENABLED and PhoneA as TX_ENABLED.
    246         Hangup on PhoneA.
    247 
    248         Returns:
    249             True if pass; False if fail.
    250         """
    251         ads = self.android_devices
    252         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    253                                                            (self.log, ads[1]))]
    254         if not multithread_func(self.log, tasks):
    255             self.log.error("Phone Failed to Set Up Properly.")
    256             return False
    257 
    258         if not video_call_setup_teardown(
    259                 self.log,
    260                 ads[0],
    261                 ads[1],
    262                 None,
    263                 video_state=VT_STATE_BIDIRECTIONAL,
    264                 verify_caller_func=is_phone_in_call_video_bidirectional,
    265                 verify_callee_func=is_phone_in_call_video_bidirectional):
    266             self.log.error("Failed to setup a call")
    267             return False
    268 
    269         self.log.info("Disable video on PhoneB:{}".format(ads[1].serial))
    270         if not video_call_downgrade(
    271                 self.log, ads[1], get_call_id_in_video_state(
    272                     self.log, ads[1], VT_STATE_BIDIRECTIONAL), ads[0],
    273                 get_call_id_in_video_state(self.log, ads[0],
    274                                            VT_STATE_BIDIRECTIONAL)):
    275             self.log.error("Failed to disable video on PhoneB.")
    276             return False
    277         return hangup_call(self.log, ads[0])
    278 
    279     @TelephonyBaseTest.tel_test_wrap
    280     def test_call_video_to_video_mo_mt_disable_camera(self):
    281         """ Test VT<->VT call functionality.
    282 
    283         Make Sure PhoneA is in LTE mode (with Video Calling).
    284         Make Sure PhoneB is in LTE mode (with Video Calling).
    285         Call from PhoneA to PhoneB as Bi-Directional Video,
    286         Accept on PhoneB as video call.
    287         On PhoneA disabled video transmission.
    288         Verify PhoneA as RX_ENABLED and PhoneB as TX_ENABLED.
    289         On PhoneB disabled video transmission.
    290         Verify PhoneA as AUDIO_ONLY and PhoneB as AUDIO_ONLY.
    291         Hangup on PhoneA.
    292 
    293         Returns:
    294             True if pass; False if fail.
    295         """
    296         ads = self.android_devices
    297         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    298                                                            (self.log, ads[1]))]
    299         if not multithread_func(self.log, tasks):
    300             self.log.error("Phone Failed to Set Up Properly.")
    301             return False
    302 
    303         if not video_call_setup_teardown(
    304                 self.log,
    305                 ads[0],
    306                 ads[1],
    307                 None,
    308                 video_state=VT_STATE_BIDIRECTIONAL,
    309                 verify_caller_func=is_phone_in_call_video_bidirectional,
    310                 verify_callee_func=is_phone_in_call_video_bidirectional):
    311             self.log.error("Failed to setup a call")
    312             return False
    313 
    314         self.log.info("Disable video on PhoneA:{}".format(ads[0].serial))
    315         if not video_call_downgrade(
    316                 self.log, ads[0], get_call_id_in_video_state(
    317                     self.log, ads[0], VT_STATE_BIDIRECTIONAL), ads[1],
    318                 get_call_id_in_video_state(self.log, ads[1],
    319                                            VT_STATE_BIDIRECTIONAL)):
    320             self.log.error("Failed to disable video on PhoneA.")
    321             return False
    322 
    323         self.log.info("Disable video on PhoneB:{}".format(ads[1].serial))
    324         if not video_call_downgrade(
    325                 self.log, ads[1], get_call_id_in_video_state(
    326                     self.log, ads[1], VT_STATE_TX_ENABLED), ads[0],
    327                 get_call_id_in_video_state(self.log, ads[0],
    328                                            VT_STATE_RX_ENABLED)):
    329             self.log.error("Failed to disable video on PhoneB.")
    330             return False
    331         return hangup_call(self.log, ads[0])
    332 
    333     @TelephonyBaseTest.tel_test_wrap
    334     def test_call_video_to_video_mt_mo_disable_camera(self):
    335         """ Test VT<->VT call functionality.
    336 
    337         Make Sure PhoneA is in LTE mode (with Video Calling).
    338         Make Sure PhoneB is in LTE mode (with Video Calling).
    339         Call from PhoneA to PhoneB as Bi-Directional Video,
    340         Accept on PhoneB as video call.
    341         On PhoneB disabled video transmission.
    342         Verify PhoneB as RX_ENABLED and PhoneA as TX_ENABLED.
    343         On PhoneA disabled video transmission.
    344         Verify PhoneA as AUDIO_ONLY and PhoneB as AUDIO_ONLY.
    345         Hangup on PhoneA.
    346 
    347         Returns:
    348             True if pass; False if fail.
    349         """
    350         ads = self.android_devices
    351         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    352                                                            (self.log, ads[1]))]
    353         if not multithread_func(self.log, tasks):
    354             self.log.error("Phone Failed to Set Up Properly.")
    355             return False
    356 
    357         if not video_call_setup_teardown(
    358                 self.log,
    359                 ads[0],
    360                 ads[1],
    361                 None,
    362                 video_state=VT_STATE_BIDIRECTIONAL,
    363                 verify_caller_func=is_phone_in_call_video_bidirectional,
    364                 verify_callee_func=is_phone_in_call_video_bidirectional):
    365             self.log.error("Failed to setup a call")
    366             return False
    367 
    368         self.log.info("Disable video on PhoneB:{}".format(ads[1].serial))
    369         if not video_call_downgrade(
    370                 self.log, ads[1], get_call_id_in_video_state(
    371                     self.log, ads[1], VT_STATE_BIDIRECTIONAL), ads[0],
    372                 get_call_id_in_video_state(self.log, ads[0],
    373                                            VT_STATE_BIDIRECTIONAL)):
    374             self.log.error("Failed to disable video on PhoneB.")
    375             return False
    376 
    377         self.log.info("Disable video on PhoneA:{}".format(ads[0].serial))
    378         if not video_call_downgrade(
    379                 self.log, ads[0], get_call_id_in_video_state(
    380                     self.log, ads[0], VT_STATE_TX_ENABLED), ads[1],
    381                 get_call_id_in_video_state(self.log, ads[1],
    382                                            VT_STATE_RX_ENABLED)):
    383             self.log.error("Failed to disable video on PhoneB.")
    384             return False
    385         return hangup_call(self.log, ads[0])
    386 
    387     def _mo_upgrade_bidirectional(self, ads):
    388         """Send + accept an upgrade request from Phone A to B.
    389 
    390         Returns:
    391             True if pass; False if fail.
    392         """
    393         call_id_requester = get_call_id_in_video_state(self.log, ads[0],
    394                                                        VT_STATE_AUDIO_ONLY)
    395 
    396         call_id_responder = get_call_id_in_video_state(self.log, ads[1],
    397                                                        VT_STATE_AUDIO_ONLY)
    398 
    399         if not call_id_requester or not call_id_responder:
    400             self.log.error("Couldn't find a candidate call id {}:{}, {}:{}"
    401                            .format(ads[0].serial, call_id_requester, ads[
    402                                1].serial, call_id_responder))
    403             return False
    404 
    405         if not video_call_modify_video(self.log, ads[0], call_id_requester,
    406                                        ads[1], call_id_responder,
    407                                        VT_STATE_BIDIRECTIONAL):
    408             self.log.error("Failed to upgrade video call!")
    409             return False
    410 
    411         #Wait for a completed upgrade and ensure the call is stable
    412         time.sleep(WAIT_TIME_IN_CALL)
    413 
    414         if not verify_incall_state(self.log, [ads[0], ads[1]], True):
    415             self.log.error("_mo_upgrade_bidirectional: Call Drop!")
    416             return False
    417 
    418         if (get_call_id_in_video_state(self.log, ads[0],
    419                                        VT_STATE_BIDIRECTIONAL) !=
    420                 call_id_requester):
    421             self.log.error("Caller not in correct state: {}".format(
    422                 VT_STATE_BIDIRECTIONAL))
    423             return False
    424 
    425         if (get_call_id_in_video_state(self.log, ads[1],
    426                                        VT_STATE_BIDIRECTIONAL) !=
    427                 call_id_responder):
    428             self.log.error("Callee not in correct state: {}".format(
    429                 VT_STATE_BIDIRECTIONAL))
    430             return False
    431 
    432         return hangup_call(self.log, ads[0])
    433 
    434     @TelephonyBaseTest.tel_test_wrap
    435     def test_call_video_accept_as_voice_mo_upgrade_bidirectional(self):
    436         """ Test Upgrading from VoLTE to Bi-Directional VT.
    437 
    438         Make Sure PhoneA is in LTE mode (with Video Calling).
    439         Make Sure PhoneB is in LTE mode (with Video Calling).
    440         Call from PhoneA to PhoneB as Video, accept on PhoneB as audio only.
    441         Send + accept an upgrade request from Phone A to B.
    442 
    443         Returns:
    444             True if pass; False if fail.
    445         """
    446 
    447         ads = self.android_devices
    448         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    449                                                            (self.log, ads[1]))]
    450         if not multithread_func(self.log, tasks):
    451             self.log.error("Phone Failed to Set Up Properly.")
    452             return False
    453         if not video_call_setup_teardown(
    454                 self.log,
    455                 ads[0],
    456                 ads[1],
    457                 None,
    458                 video_state=VT_STATE_AUDIO_ONLY,
    459                 verify_caller_func=is_phone_in_call_volte,
    460                 verify_callee_func=is_phone_in_call_volte):
    461             self.log.error("Failed to setup a call")
    462             return False
    463 
    464         return self._mo_upgrade_bidirectional(ads)
    465 
    466     @TelephonyBaseTest.tel_test_wrap
    467     def test_call_volte_to_volte_mo_upgrade_bidirectional(self):
    468         """ Test Upgrading from VoLTE to Bi-Directional VT.
    469 
    470         Make Sure PhoneA is in LTE mode (with Video Calling).
    471         Make Sure PhoneB is in LTE mode (with Video Calling).
    472         Call from PhoneA to PhoneB as VoLTE, accept on PhoneB.
    473         Send + accept an upgrade request from Phone A to B.
    474 
    475         Returns:
    476             True if pass; False if fail.
    477         """
    478 
    479         ads = self.android_devices
    480         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    481                                                            (self.log, ads[1]))]
    482         if not multithread_func(self.log, tasks):
    483             self.log.error("Phone Failed to Set Up Properly.")
    484             return False
    485         if not call_setup_teardown(self.log, ads[0], ads[1], None,
    486                                    is_phone_in_call_volte,
    487                                    is_phone_in_call_volte):
    488             self.log.error("Failed to setup a call")
    489             return False
    490 
    491         return self._mo_upgrade_bidirectional(ads)
    492 
    493     def _mo_upgrade_reject(self, ads):
    494         """Send + reject an upgrade request from Phone A to B.
    495 
    496         Returns:
    497             True if pass; False if fail.
    498         """
    499         call_id_requester = get_call_id_in_video_state(self.log, ads[0],
    500                                                        VT_STATE_AUDIO_ONLY)
    501 
    502         call_id_responder = get_call_id_in_video_state(self.log, ads[1],
    503                                                        VT_STATE_AUDIO_ONLY)
    504 
    505         if not call_id_requester or not call_id_responder:
    506             self.log.error("Couldn't find a candidate call id {}:{}, {}:{}"
    507                            .format(ads[0].serial, call_id_requester, ads[
    508                                1].serial, call_id_responder))
    509             return False
    510 
    511         if not video_call_modify_video(
    512                 self.log, ads[0], call_id_requester, ads[1], call_id_responder,
    513                 VT_STATE_BIDIRECTIONAL, VT_VIDEO_QUALITY_DEFAULT,
    514                 VT_STATE_AUDIO_ONLY, VT_VIDEO_QUALITY_DEFAULT):
    515             self.log.error("Failed to upgrade video call!")
    516             return False
    517 
    518         time.sleep(WAIT_TIME_IN_CALL)
    519 
    520         if not is_phone_in_call_voice_hd(self.log, ads[0]):
    521             self.log.error("PhoneA not in correct state.")
    522             return False
    523         if not is_phone_in_call_voice_hd(self.log, ads[1]):
    524             self.log.error("PhoneB not in correct state.")
    525             return False
    526 
    527         return hangup_call(self.log, ads[0])
    528 
    529     @TelephonyBaseTest.tel_test_wrap
    530     def test_call_volte_to_volte_mo_upgrade_reject(self):
    531         """ Test Upgrading from VoLTE to Bi-Directional VT and reject.
    532 
    533         Make Sure PhoneA is in LTE mode (with Video Calling).
    534         Make Sure PhoneB is in LTE mode (with Video Calling).
    535         Call from PhoneA to PhoneB as VoLTE, accept on PhoneB.
    536         Send an upgrade request from Phone A to PhoneB.
    537         Reject on PhoneB. Verify PhoneA and PhoneB ad AUDIO_ONLY.
    538         Verify call continues.
    539         Hangup on PhoneA.
    540 
    541         Returns:
    542             True if pass; False if fail.
    543         """
    544         ads = self.android_devices
    545         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    546                                                            (self.log, ads[1]))]
    547         if not multithread_func(self.log, tasks):
    548             self.log.error("Phone Failed to Set Up Properly.")
    549             return False
    550         if not call_setup_teardown(self.log, ads[0], ads[1], None,
    551                                    is_phone_in_call_volte,
    552                                    is_phone_in_call_volte):
    553             self.log.error("Failed to setup a call")
    554             return False
    555 
    556         return self._mo_upgrade_reject(ads)
    557 
    558     @TelephonyBaseTest.tel_test_wrap
    559     def test_call_video_accept_as_voice_mo_upgrade_reject(self):
    560         """ Test Upgrading from VoLTE to Bi-Directional VT and reject.
    561 
    562         Make Sure PhoneA is in LTE mode (with Video Calling).
    563         Make Sure PhoneB is in LTE mode (with Video Calling).
    564         Call from PhoneA to PhoneB as Video, accept on PhoneB as audio only.
    565         Send an upgrade request from Phone A to PhoneB.
    566         Reject on PhoneB. Verify PhoneA and PhoneB ad AUDIO_ONLY.
    567         Verify call continues.
    568         Hangup on PhoneA.
    569 
    570         Returns:
    571             True if pass; False if fail.
    572         """
    573         ads = self.android_devices
    574         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    575                                                            (self.log, ads[1]))]
    576         if not multithread_func(self.log, tasks):
    577             self.log.error("Phone Failed to Set Up Properly.")
    578             return False
    579         if not video_call_setup_teardown(
    580                 self.log,
    581                 ads[0],
    582                 ads[1],
    583                 None,
    584                 video_state=VT_STATE_AUDIO_ONLY,
    585                 verify_caller_func=is_phone_in_call_volte,
    586                 verify_callee_func=is_phone_in_call_volte):
    587             self.log.error("Failed to setup a call")
    588             return False
    589 
    590         return self._mo_upgrade_reject(ads)
    591 
    592     def _test_put_call_to_backgroundpause_and_foregroundresume(
    593             self, ad_requester, ad_responder):
    594         call_id_requester = get_call_id_in_video_state(self.log, ad_requester,
    595                                                        VT_STATE_BIDIRECTIONAL)
    596         call_id_responder = get_call_id_in_video_state(self.log, ad_responder,
    597                                                        VT_STATE_BIDIRECTIONAL)
    598         ad_requester.droid.telecomCallVideoStartListeningForEvent(
    599             call_id_requester, EVENT_VIDEO_SESSION_EVENT)
    600         ad_responder.droid.telecomCallVideoStartListeningForEvent(
    601             call_id_responder, EVENT_VIDEO_SESSION_EVENT)
    602         self.log.info("Put In-Call UI on {} to background.".format(
    603             ad_requester.serial))
    604         ad_requester.droid.showHomeScreen()
    605         try:
    606             event_on_responder = ad_responder.ed.pop_event(
    607                 EventTelecomVideoCallSessionEvent,
    608                 MAX_WAIT_TIME_VIDEO_SESSION_EVENT)
    609             event_on_requester = ad_requester.ed.pop_event(
    610                 EventTelecomVideoCallSessionEvent,
    611                 MAX_WAIT_TIME_VIDEO_SESSION_EVENT)
    612             if event_on_responder['data']['Event'] != SESSION_EVENT_RX_PAUSE:
    613                 self.log.error(
    614                     "Event not correct. event_on_responder: {}. Expected :{}".format(
    615                         event_on_responder, SESSION_EVENT_RX_PAUSE))
    616                 return False
    617             if event_on_requester['data']['Event'] != SESSION_EVENT_RX_PAUSE:
    618                 self.log.error(
    619                     "Event not correct. event_on_requester: {}. Expected :{}".format(
    620                         event_on_requester, SESSION_EVENT_RX_PAUSE))
    621                 return False
    622         except Empty:
    623             self.log.error("Expected event not received.")
    624             return False
    625         finally:
    626             ad_requester.droid.telecomCallVideoStopListeningForEvent(
    627                 call_id_requester, EVENT_VIDEO_SESSION_EVENT)
    628             ad_responder.droid.telecomCallVideoStopListeningForEvent(
    629                 call_id_responder, EVENT_VIDEO_SESSION_EVENT)
    630         time.sleep(WAIT_TIME_IN_CALL)
    631 
    632         if not verify_video_call_in_expected_state(
    633                 self.log, ad_requester, call_id_requester,
    634                 VT_STATE_BIDIRECTIONAL_PAUSED, CALL_STATE_ACTIVE):
    635             return False
    636         if not verify_video_call_in_expected_state(
    637                 self.log, ad_responder, call_id_responder,
    638                 VT_STATE_BIDIRECTIONAL_PAUSED, CALL_STATE_ACTIVE):
    639             return False
    640 
    641         self.log.info("Put In-Call UI on {} to foreground.".format(
    642             ad_requester.serial))
    643         ad_requester.droid.telecomCallVideoStartListeningForEvent(
    644             call_id_requester, EVENT_VIDEO_SESSION_EVENT)
    645         ad_responder.droid.telecomCallVideoStartListeningForEvent(
    646             call_id_responder, EVENT_VIDEO_SESSION_EVENT)
    647         ad_requester.droid.telecomShowInCallScreen()
    648         try:
    649             event_on_responder = ad_responder.ed.pop_event(
    650                 EventTelecomVideoCallSessionEvent,
    651                 MAX_WAIT_TIME_VIDEO_SESSION_EVENT)
    652             event_on_requester = ad_requester.ed.pop_event(
    653                 EventTelecomVideoCallSessionEvent,
    654                 MAX_WAIT_TIME_VIDEO_SESSION_EVENT)
    655             if event_on_responder['data']['Event'] != SESSION_EVENT_RX_RESUME:
    656                 self.log.error(
    657                     "Event not correct. event_on_responder: {}. Expected :{}".format(
    658                         event_on_responder, SESSION_EVENT_RX_RESUME))
    659                 return False
    660             if event_on_requester['data']['Event'] != SESSION_EVENT_RX_RESUME:
    661                 self.log.error(
    662                     "Event not correct. event_on_requester: {}. Expected :{}".format(
    663                         event_on_requester, SESSION_EVENT_RX_RESUME))
    664                 return False
    665         except Empty:
    666             self.log.error("Expected event not received.")
    667             return False
    668         finally:
    669             ad_requester.droid.telecomCallVideoStopListeningForEvent(
    670                 call_id_requester, EVENT_VIDEO_SESSION_EVENT)
    671             ad_responder.droid.telecomCallVideoStopListeningForEvent(
    672                 call_id_responder, EVENT_VIDEO_SESSION_EVENT)
    673         time.sleep(WAIT_TIME_IN_CALL)
    674         self.log.info("Verify both calls are in bi-directional/active state.")
    675         if not verify_video_call_in_expected_state(
    676                 self.log, ad_requester, call_id_requester,
    677                 VT_STATE_BIDIRECTIONAL, CALL_STATE_ACTIVE):
    678             return False
    679         if not verify_video_call_in_expected_state(
    680                 self.log, ad_responder, call_id_responder,
    681                 VT_STATE_BIDIRECTIONAL, CALL_STATE_ACTIVE):
    682             return False
    683 
    684         return True
    685 
    686     @TelephonyBaseTest.tel_test_wrap
    687     def test_call_video_to_video_mo_to_backgroundpause_foregroundresume(self):
    688         ads = self.android_devices
    689         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    690                                                            (self.log, ads[1]))]
    691         if not multithread_func(self.log, tasks):
    692             self.log.error("Phone Failed to Set Up Properly.")
    693             return False
    694 
    695         if not video_call_setup_teardown(
    696                 self.log,
    697                 ads[0],
    698                 ads[1],
    699                 None,
    700                 video_state=VT_STATE_BIDIRECTIONAL,
    701                 verify_caller_func=is_phone_in_call_video_bidirectional,
    702                 verify_callee_func=is_phone_in_call_video_bidirectional):
    703             self.log.error("Failed to setup a call")
    704             return False
    705 
    706         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
    707 
    708         return self._test_put_call_to_backgroundpause_and_foregroundresume(
    709             ads[0], ads[1])
    710 
    711     @TelephonyBaseTest.tel_test_wrap
    712     def test_call_video_to_video_mt_to_backgroundpause_foregroundresume(self):
    713         ads = self.android_devices
    714         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
    715                                                            (self.log, ads[1]))]
    716         if not multithread_func(self.log, tasks):
    717             self.log.error("Phone Failed to Set Up Properly.")
    718             return False
    719 
    720         if not video_call_setup_teardown(
    721                 self.log,
    722                 ads[0],
    723                 ads[1],
    724                 None,
    725                 video_state=VT_STATE_BIDIRECTIONAL,
    726                 verify_caller_func=is_phone_in_call_video_bidirectional,
    727                 verify_callee_func=is_phone_in_call_video_bidirectional):
    728             self.log.error("Failed to setup a call")
    729             return False
    730 
    731         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
    732 
    733         return self._test_put_call_to_backgroundpause_and_foregroundresume(
    734             ads[1], ads[0])
    735 
    736     def _vt_test_multi_call_hangup(self, ads):
    737         """private function to hangup calls for VT tests.
    738 
    739         Hangup on PhoneB.
    740         Verify PhoneA and PhoneC still in call.
    741         Hangup on PhoneC.
    742         Verify all phones not in call.
    743         """
    744         if not hangup_call(self.log, ads[1]):
    745             return False
    746         time.sleep(WAIT_TIME_IN_CALL)
    747         if not verify_incall_state(self.log, [ads[0], ads[2]], True):
    748             return False
    749         if not hangup_call(self.log, ads[2]):
    750             return False
    751         time.sleep(WAIT_TIME_IN_CALL)
    752         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
    753             return False
    754         return True
    755 
    756     @TelephonyBaseTest.tel_test_wrap
    757     def test_call_video_add_mo_voice(self):
    758         """
    759         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
    760         Accept the call on Phone_B as Bi-Directional Video
    761         From Phone_A, add a voice call to Phone_C
    762         Accept the call on Phone_C
    763         Verify both calls remain active.
    764         """
    765         # This test case is not supported by VZW.
    766         ads = self.android_devices
    767         tasks = [(phone_setup_video, (self.log, ads[0])),
    768                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
    769                                                            (self.log, ads[2]))]
    770         if not multithread_func(self.log, tasks):
    771             self.log.error("Phone Failed to Set Up Properly.")
    772             return False
    773 
    774         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
    775         if not video_call_setup_teardown(
    776                 self.log,
    777                 ads[0],
    778                 ads[1],
    779                 None,
    780                 video_state=VT_STATE_BIDIRECTIONAL,
    781                 verify_caller_func=is_phone_in_call_video_bidirectional,
    782                 verify_callee_func=is_phone_in_call_video_bidirectional):
    783             self.log.error("Failed to setup a call")
    784             return False
    785         call_id_video = get_call_id_in_video_state(self.log, ads[0],
    786                                                    VT_STATE_BIDIRECTIONAL)
    787         if call_id_video is None:
    788             self.log.error("No active video call in PhoneA.")
    789             return False
    790 
    791         self.log.info("Step2: Initiate Voice Call PhoneA->PhoneC.")
    792         if not call_setup_teardown(self.log,
    793                                    ads[0],
    794                                    ads[2],
    795                                    None,
    796                                    verify_caller_func=None,
    797                                    verify_callee_func=is_phone_in_call_volte):
    798             self.log.error("Failed to setup a call")
    799             return False
    800 
    801         self.log.info(
    802             "Step3: Verify PhoneA's video/voice call in correct state.")
    803         calls = ads[0].droid.telecomCallGetCallIds()
    804         self.log.info("Calls in PhoneA{}".format(calls))
    805         if num_active_calls(self.log, ads[0]) != 2:
    806             self.log.error("Active call numbers in PhoneA is not 2.")
    807             return False
    808         for call in calls:
    809             if call != call_id_video:
    810                 call_id_voice = call
    811 
    812         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
    813             return False
    814         if not verify_video_call_in_expected_state(
    815                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
    816                 CALL_STATE_HOLDING):
    817             return False
    818         if not verify_video_call_in_expected_state(
    819                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
    820                 CALL_STATE_ACTIVE):
    821             return False
    822 
    823         return self._vt_test_multi_call_hangup(ads)
    824 
    825     @TelephonyBaseTest.tel_test_wrap
    826     def test_call_video_add_mt_voice(self):
    827         """
    828         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
    829         Accept the call on Phone_B as Bi-Directional Video
    830         From Phone_C, add a voice call to Phone_A
    831         Accept the call on Phone_A
    832         Verify both calls remain active.
    833         """
    834         ads = self.android_devices
    835         tasks = [(phone_setup_video, (self.log, ads[0])),
    836                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
    837                                                            (self.log, ads[2]))]
    838         if not multithread_func(self.log, tasks):
    839             self.log.error("Phone Failed to Set Up Properly.")
    840             return False
    841 
    842         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
    843         if not video_call_setup_teardown(
    844                 self.log,
    845                 ads[0],
    846                 ads[1],
    847                 None,
    848                 video_state=VT_STATE_BIDIRECTIONAL,
    849                 verify_caller_func=is_phone_in_call_video_bidirectional,
    850                 verify_callee_func=is_phone_in_call_video_bidirectional):
    851             self.log.error("Failed to setup a call")
    852             return False
    853         call_id_video = get_call_id_in_video_state(self.log, ads[0],
    854                                                    VT_STATE_BIDIRECTIONAL)
    855         if call_id_video is None:
    856             self.log.error("No active video call in PhoneA.")
    857             return False
    858 
    859         self.log.info("Step2: Initiate Voice Call PhoneC->PhoneA.")
    860         if not call_setup_teardown(self.log,
    861                                    ads[2],
    862                                    ads[0],
    863                                    None,
    864                                    verify_caller_func=is_phone_in_call_volte,
    865                                    verify_callee_func=None):
    866             self.log.error("Failed to setup a call")
    867             return False
    868 
    869         self.log.info(
    870             "Step3: Verify PhoneA's video/voice call in correct state.")
    871         calls = ads[0].droid.telecomCallGetCallIds()
    872         self.log.info("Calls in PhoneA{}".format(calls))
    873         if num_active_calls(self.log, ads[0]) != 2:
    874             self.log.error("Active call numbers in PhoneA is not 2.")
    875             return False
    876         for call in calls:
    877             if call != call_id_video:
    878                 call_id_voice = call
    879 
    880         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
    881             return False
    882         if not verify_video_call_in_expected_state(
    883                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL_PAUSED,
    884                 CALL_STATE_HOLDING):
    885             return False
    886 
    887         if not verify_video_call_in_expected_state(
    888                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
    889                 CALL_STATE_ACTIVE):
    890             return False
    891 
    892         return self._vt_test_multi_call_hangup(ads)
    893 
    894     @TelephonyBaseTest.tel_test_wrap
    895     def test_call_volte_add_mo_video(self):
    896         """
    897         From Phone_A, Initiate a VoLTE Call to Phone_B
    898         Accept the call on Phone_B
    899         From Phone_A, add a Video call to Phone_C
    900         Accept the call on Phone_C as Video
    901         Verify both calls remain active.
    902         """
    903         # This test case is not supported by VZW.
    904         ads = self.android_devices
    905         tasks = [(phone_setup_video, (self.log, ads[0])),
    906                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
    907                                                            (self.log, ads[2]))]
    908         if not multithread_func(self.log, tasks):
    909             self.log.error("Phone Failed to Set Up Properly.")
    910             return False
    911 
    912         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
    913         if not call_setup_teardown(self.log,
    914                                    ads[0],
    915                                    ads[1],
    916                                    None,
    917                                    verify_caller_func=is_phone_in_call_volte,
    918                                    verify_callee_func=is_phone_in_call_volte):
    919             self.log.error("Failed to setup a call")
    920             return False
    921         calls = ads[0].droid.telecomCallGetCallIds()
    922         self.log.info("Calls in PhoneA{}".format(calls))
    923         if num_active_calls(self.log, ads[0]) != 1:
    924             self.log.error("Active call numbers in PhoneA is not 1.")
    925             return False
    926         call_id_voice = calls[0]
    927 
    928         self.log.info("Step2: Initiate Video Call PhoneA->PhoneC.")
    929         if not video_call_setup_teardown(
    930                 self.log,
    931                 ads[0],
    932                 ads[2],
    933                 None,
    934                 video_state=VT_STATE_BIDIRECTIONAL,
    935                 verify_caller_func=is_phone_in_call_video_bidirectional,
    936                 verify_callee_func=is_phone_in_call_video_bidirectional):
    937             self.log.error("Failed to setup a call")
    938             return False
    939         call_id_video = get_call_id_in_video_state(self.log, ads[0],
    940                                                    VT_STATE_BIDIRECTIONAL)
    941         if call_id_video is None:
    942             self.log.error("No active video call in PhoneA.")
    943             return False
    944 
    945         self.log.info(
    946             "Step3: Verify PhoneA's video/voice call in correct state.")
    947         calls = ads[0].droid.telecomCallGetCallIds()
    948         self.log.info("Calls in PhoneA{}".format(calls))
    949         if num_active_calls(self.log, ads[0]) != 2:
    950             self.log.error("Active call numbers in PhoneA is not 2.")
    951             return False
    952 
    953         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
    954             return False
    955         if not verify_video_call_in_expected_state(
    956                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
    957                 CALL_STATE_ACTIVE):
    958             return False
    959         if not verify_video_call_in_expected_state(
    960                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
    961                 CALL_STATE_HOLDING):
    962             return False
    963 
    964         return self._vt_test_multi_call_hangup(ads)
    965 
    966     @TelephonyBaseTest.tel_test_wrap
    967     def test_call_volte_add_mt_video(self):
    968         """
    969         From Phone_A, Initiate a VoLTE Call to Phone_B
    970         Accept the call on Phone_B
    971         From Phone_C, add a Video call to Phone_A
    972         Accept the call on Phone_A as Video
    973         Verify both calls remain active.
    974         """
    975         # TODO (b/21437650):
    976         # Test will fail. After established 2nd call ~15s, Phone C will drop call.
    977         ads = self.android_devices
    978         tasks = [(phone_setup_video, (self.log, ads[0])),
    979                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
    980                                                            (self.log, ads[2]))]
    981         if not multithread_func(self.log, tasks):
    982             self.log.error("Phone Failed to Set Up Properly.")
    983             return False
    984 
    985         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
    986         if not call_setup_teardown(self.log,
    987                                    ads[0],
    988                                    ads[1],
    989                                    None,
    990                                    verify_caller_func=is_phone_in_call_volte,
    991                                    verify_callee_func=is_phone_in_call_volte):
    992             self.log.error("Failed to setup a call")
    993             return False
    994         calls = ads[0].droid.telecomCallGetCallIds()
    995         self.log.info("Calls in PhoneA{}".format(calls))
    996         if num_active_calls(self.log, ads[0]) != 1:
    997             self.log.error("Active call numbers in PhoneA is not 1.")
    998             return False
    999         call_id_voice = calls[0]
   1000 
   1001         self.log.info("Step2: Initiate Video Call PhoneC->PhoneA.")
   1002         if not video_call_setup_teardown(
   1003                 self.log,
   1004                 ads[2],
   1005                 ads[0],
   1006                 None,
   1007                 video_state=VT_STATE_BIDIRECTIONAL,
   1008                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1009                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1010             self.log.error("Failed to setup a call")
   1011             return False
   1012 
   1013         call_id_video = get_call_id_in_video_state(self.log, ads[0],
   1014                                                    VT_STATE_BIDIRECTIONAL)
   1015         if call_id_video is None:
   1016             self.log.error("No active video call in PhoneA.")
   1017             return False
   1018 
   1019         self.log.info(
   1020             "Step3: Verify PhoneA's video/voice call in correct state.")
   1021         calls = ads[0].droid.telecomCallGetCallIds()
   1022         self.log.info("Calls in PhoneA{}".format(calls))
   1023         if num_active_calls(self.log, ads[0]) != 2:
   1024             self.log.error("Active call numbers in PhoneA is not 2.")
   1025             return False
   1026 
   1027         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1028             return False
   1029         if not verify_video_call_in_expected_state(
   1030                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
   1031                 CALL_STATE_ACTIVE):
   1032             return False
   1033         if not verify_video_call_in_expected_state(
   1034                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1035                 CALL_STATE_HOLDING):
   1036             return False
   1037 
   1038         return self._vt_test_multi_call_hangup(ads)
   1039 
   1040     @TelephonyBaseTest.tel_test_wrap
   1041     def test_call_video_add_mt_voice_swap_once_local_drop(self):
   1042         """
   1043         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
   1044         Accept the call on Phone_B as Bi-Directional Video
   1045         From Phone_C, add a voice call to Phone_A
   1046         Accept the call on Phone_A
   1047         Verify both calls remain active.
   1048         Swap calls on PhoneA.
   1049         End Video call on PhoneA.
   1050         End Voice call on PhoneA.
   1051         """
   1052         ads = self.android_devices
   1053         tasks = [(phone_setup_video, (self.log, ads[0])),
   1054                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
   1055                                                            (self.log, ads[2]))]
   1056         if not multithread_func(self.log, tasks):
   1057             self.log.error("Phone Failed to Set Up Properly.")
   1058             return False
   1059 
   1060         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   1061         if not video_call_setup_teardown(
   1062                 self.log,
   1063                 ads[0],
   1064                 ads[1],
   1065                 None,
   1066                 video_state=VT_STATE_BIDIRECTIONAL,
   1067                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1068                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1069             self.log.error("Failed to setup a call")
   1070             return False
   1071         call_id_video = get_call_id_in_video_state(self.log, ads[0],
   1072                                                    VT_STATE_BIDIRECTIONAL)
   1073         if call_id_video is None:
   1074             self.log.error("No active video call in PhoneA.")
   1075             return False
   1076 
   1077         self.log.info("Step2: Initiate Voice Call PhoneC->PhoneA.")
   1078         if not call_setup_teardown(self.log,
   1079                                    ads[2],
   1080                                    ads[0],
   1081                                    None,
   1082                                    verify_caller_func=is_phone_in_call_volte,
   1083                                    verify_callee_func=None):
   1084             self.log.error("Failed to setup a call")
   1085             return False
   1086 
   1087         self.log.info(
   1088             "Step3: Verify PhoneA's video/voice call in correct state.")
   1089         calls = ads[0].droid.telecomCallGetCallIds()
   1090         self.log.info("Calls in PhoneA{}".format(calls))
   1091         if num_active_calls(self.log, ads[0]) != 2:
   1092             self.log.error("Active call numbers in PhoneA is not 2.")
   1093             return False
   1094         for call in calls:
   1095             if call != call_id_video:
   1096                 call_id_voice = call
   1097 
   1098         if not verify_video_call_in_expected_state(
   1099                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL_PAUSED,
   1100                 CALL_STATE_HOLDING):
   1101             return False
   1102 
   1103         if not verify_video_call_in_expected_state(
   1104                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1105                 CALL_STATE_ACTIVE):
   1106             return False
   1107         self.log.info("Step4: Verify all phones remain in-call.")
   1108         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1109             return False
   1110 
   1111         self.log.info(
   1112             "Step5: Swap calls on PhoneA and verify call state correct.")
   1113         ads[0].droid.telecomCallHold(call_id_voice)
   1114         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   1115         for ad in [ads[0], ads[1]]:
   1116             if get_audio_route(self.log, ad) != AUDIO_ROUTE_SPEAKER:
   1117                 self.log.error("{} Audio is not on speaker.".format(ad.serial))
   1118                 # TODO: b/26337892 Define expected audio route behavior.
   1119 
   1120             set_audio_route(self.log, ad, AUDIO_ROUTE_EARPIECE)
   1121 
   1122         time.sleep(WAIT_TIME_IN_CALL)
   1123         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1124             return False
   1125         if not verify_video_call_in_expected_state(
   1126                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
   1127                 CALL_STATE_ACTIVE):
   1128             return False
   1129         if not verify_video_call_in_expected_state(
   1130                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1131                 CALL_STATE_HOLDING):
   1132             return False
   1133 
   1134         self.log.info("Step6: Drop Video Call on PhoneA.")
   1135         disconnect_call_by_id(self.log, ads[0], call_id_video)
   1136         time.sleep(WAIT_TIME_IN_CALL)
   1137         if not verify_incall_state(self.log, [ads[0], ads[2]], True):
   1138             return False
   1139         disconnect_call_by_id(self.log, ads[0], call_id_voice)
   1140         time.sleep(WAIT_TIME_IN_CALL)
   1141         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
   1142             return False
   1143         return True
   1144 
   1145     @TelephonyBaseTest.tel_test_wrap
   1146     def test_call_video_add_mt_voice_swap_twice_remote_drop_voice_unhold_video(
   1147             self):
   1148         """
   1149         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
   1150         Accept the call on Phone_B as Bi-Directional Video
   1151         From Phone_C, add a voice call to Phone_A
   1152         Accept the call on Phone_A
   1153         Verify both calls remain active.
   1154         Swap calls on PhoneA.
   1155         Swap calls on PhoneA.
   1156         End Voice call on PhoneC.
   1157         Unhold Video call on PhoneA.
   1158         End Video call on PhoneA.
   1159         """
   1160 
   1161         ads = self.android_devices
   1162         tasks = [(phone_setup_video, (self.log, ads[0])),
   1163                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
   1164                                                            (self.log, ads[2]))]
   1165         if not multithread_func(self.log, tasks):
   1166             self.log.error("Phone Failed to Set Up Properly.")
   1167             return False
   1168 
   1169         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   1170         if not video_call_setup_teardown(
   1171                 self.log,
   1172                 ads[0],
   1173                 ads[1],
   1174                 None,
   1175                 video_state=VT_STATE_BIDIRECTIONAL,
   1176                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1177                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1178             self.log.error("Failed to setup a call")
   1179             return False
   1180         call_id_video = get_call_id_in_video_state(self.log, ads[0],
   1181                                                    VT_STATE_BIDIRECTIONAL)
   1182         if call_id_video is None:
   1183             self.log.error("No active video call in PhoneA.")
   1184             return False
   1185 
   1186         self.log.info("Step2: Initiate Voice Call PhoneC->PhoneA.")
   1187         if not call_setup_teardown(self.log,
   1188                                    ads[2],
   1189                                    ads[0],
   1190                                    None,
   1191                                    verify_caller_func=is_phone_in_call_volte,
   1192                                    verify_callee_func=None):
   1193             self.log.error("Failed to setup a call")
   1194             return False
   1195 
   1196         self.log.info(
   1197             "Step3: Verify PhoneA's video/voice call in correct state.")
   1198         calls = ads[0].droid.telecomCallGetCallIds()
   1199         self.log.info("Calls in PhoneA{}".format(calls))
   1200         if num_active_calls(self.log, ads[0]) != 2:
   1201             self.log.error("Active call numbers in PhoneA is not 2.")
   1202             return False
   1203         for call in calls:
   1204             if call != call_id_video:
   1205                 call_id_voice = call
   1206 
   1207         if not verify_video_call_in_expected_state(
   1208                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL_PAUSED,
   1209                 CALL_STATE_HOLDING):
   1210             return False
   1211 
   1212         if not verify_video_call_in_expected_state(
   1213                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1214                 CALL_STATE_ACTIVE):
   1215             return False
   1216         self.log.info("Step4: Verify all phones remain in-call.")
   1217         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1218             return False
   1219 
   1220         self.log.info(
   1221             "Step5: Swap calls on PhoneA and verify call state correct.")
   1222         ads[0].droid.telecomCallHold(call_id_voice)
   1223         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   1224         for ad in [ads[0], ads[1]]:
   1225             if get_audio_route(self.log, ad) != AUDIO_ROUTE_SPEAKER:
   1226                 self.log.error("{} Audio is not on speaker.".format(ad.serial))
   1227                 # TODO: b/26337892 Define expected audio route behavior.
   1228             set_audio_route(self.log, ad, AUDIO_ROUTE_EARPIECE)
   1229 
   1230         time.sleep(WAIT_TIME_IN_CALL)
   1231         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1232             return False
   1233         if not verify_video_call_in_expected_state(
   1234                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
   1235                 CALL_STATE_ACTIVE):
   1236             return False
   1237         if not verify_video_call_in_expected_state(
   1238                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1239                 CALL_STATE_HOLDING):
   1240             return False
   1241 
   1242         self.log.info(
   1243             "Step6: Swap calls on PhoneA and verify call state correct.")
   1244         ads[0].droid.telecomCallHold(call_id_video)
   1245         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   1246         # Audio will goto earpiece in here
   1247         for ad in [ads[0], ads[1]]:
   1248             if get_audio_route(self.log, ad) != AUDIO_ROUTE_EARPIECE:
   1249                 self.log.error("{} Audio is not on EARPIECE.".format(
   1250                     ad.serial))
   1251                 # TODO: b/26337892 Define expected audio route behavior.
   1252 
   1253         time.sleep(WAIT_TIME_IN_CALL)
   1254         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1255             return False
   1256         if not verify_video_call_in_expected_state(
   1257                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
   1258                 CALL_STATE_HOLDING):
   1259             return False
   1260         if not verify_video_call_in_expected_state(
   1261                 self.log, ads[0], call_id_voice, VT_STATE_AUDIO_ONLY,
   1262                 CALL_STATE_ACTIVE):
   1263             return False
   1264 
   1265         self.log.info("Step7: Drop Voice Call on PhoneC.")
   1266         hangup_call(self.log, ads[2])
   1267         time.sleep(WAIT_TIME_IN_CALL)
   1268         if not verify_incall_state(self.log, [ads[0], ads[1]], True):
   1269             return False
   1270 
   1271         self.log.info(
   1272             "Step8: Unhold Video call on PhoneA and verify call state.")
   1273         ads[0].droid.telecomCallUnhold(call_id_video)
   1274         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   1275         # Audio will goto earpiece in here
   1276         for ad in [ads[0], ads[1]]:
   1277             if get_audio_route(self.log, ad) != AUDIO_ROUTE_EARPIECE:
   1278                 self.log.error("{} Audio is not on EARPIECE.".format(
   1279                     ad.serial))
   1280                 # TODO: b/26337892 Define expected audio route behavior.
   1281 
   1282         time.sleep(WAIT_TIME_IN_CALL)
   1283         if not verify_video_call_in_expected_state(
   1284                 self.log, ads[0], call_id_video, VT_STATE_BIDIRECTIONAL,
   1285                 CALL_STATE_ACTIVE):
   1286             return False
   1287 
   1288         self.log.info("Step9: Drop Video Call on PhoneA.")
   1289         disconnect_call_by_id(self.log, ads[0], call_id_video)
   1290         time.sleep(WAIT_TIME_IN_CALL)
   1291         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
   1292             return False
   1293         return True
   1294 
   1295     @TelephonyBaseTest.tel_test_wrap
   1296     def test_call_video_add_mo_video(self):
   1297         """
   1298         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
   1299         Accept the call on Phone_B as Bi-Directional Video
   1300         From Phone_A, add a Bi-Directional Video Call to Phone_C
   1301         Accept the call on Phone_C
   1302         Verify both calls remain active.
   1303         """
   1304         # This test case is not supported by VZW.
   1305         ads = self.android_devices
   1306         tasks = [(phone_setup_video, (self.log, ads[0])),
   1307                  (phone_setup_video, (self.log, ads[1])), (phone_setup_video,
   1308                                                            (self.log, ads[2]))]
   1309         if not multithread_func(self.log, tasks):
   1310             self.log.error("Phone Failed to Set Up Properly.")
   1311             return False
   1312 
   1313         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   1314         if not video_call_setup_teardown(
   1315                 self.log,
   1316                 ads[0],
   1317                 ads[1],
   1318                 None,
   1319                 video_state=VT_STATE_BIDIRECTIONAL,
   1320                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1321                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1322             self.log.error("Failed to setup a call")
   1323             return False
   1324         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   1325                                                       VT_STATE_BIDIRECTIONAL)
   1326         if call_id_video_ab is None:
   1327             self.log.error("No active video call in PhoneA.")
   1328             return False
   1329 
   1330         self.log.info("Step2: Initiate Video Call PhoneA->PhoneC.")
   1331         if not video_call_setup_teardown(
   1332                 self.log,
   1333                 ads[0],
   1334                 ads[2],
   1335                 None,
   1336                 video_state=VT_STATE_BIDIRECTIONAL,
   1337                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1338                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1339             self.log.error("Failed to setup a call")
   1340             return False
   1341 
   1342         self.log.info("Step3: Verify PhoneA's video calls in correct state.")
   1343         calls = ads[0].droid.telecomCallGetCallIds()
   1344         self.log.info("Calls in PhoneA{}".format(calls))
   1345         if num_active_calls(self.log, ads[0]) != 2:
   1346             self.log.error("Active call numbers in PhoneA is not 2.")
   1347             return False
   1348         for call in calls:
   1349             if call != call_id_video_ab:
   1350                 call_id_video_ac = call
   1351 
   1352         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1353             return False
   1354         if not verify_video_call_in_expected_state(
   1355                 self.log, ads[0], call_id_video_ab, VT_STATE_BIDIRECTIONAL,
   1356                 CALL_STATE_HOLDING):
   1357             return False
   1358         if not verify_video_call_in_expected_state(
   1359                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   1360                 CALL_STATE_ACTIVE):
   1361             return False
   1362 
   1363         return self._vt_test_multi_call_hangup(ads)
   1364 
   1365     @TelephonyBaseTest.tel_test_wrap
   1366     def test_call_video_add_mt_video(self):
   1367         """
   1368         From Phone_A, Initiate a Bi-Directional Video Call to Phone_B
   1369         Accept the call on Phone_B as Bi-Directional Video
   1370         From Phone_C, add a Bi-Directional Video Call to Phone_A
   1371         Accept the call on Phone_A
   1372         Verify both calls remain active.
   1373         Hang up on PhoneC.
   1374         Hang up on PhoneA.
   1375         """
   1376         # TODO: b/21437650 Test will fail. After established 2nd call ~15s,
   1377         # Phone C will drop call.
   1378         ads = self.android_devices
   1379         tasks = [(phone_setup_video, (self.log, ads[0])),
   1380                  (phone_setup_video, (self.log, ads[1])), (phone_setup_video,
   1381                                                            (self.log, ads[2]))]
   1382         if not multithread_func(self.log, tasks):
   1383             self.log.error("Phone Failed to Set Up Properly.")
   1384             return False
   1385 
   1386         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   1387         if not video_call_setup_teardown(
   1388                 self.log,
   1389                 ads[0],
   1390                 ads[1],
   1391                 None,
   1392                 video_state=VT_STATE_BIDIRECTIONAL,
   1393                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1394                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1395             self.log.error("Failed to setup a call")
   1396             return False
   1397         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   1398                                                       VT_STATE_BIDIRECTIONAL)
   1399         if call_id_video_ab is None:
   1400             self.log.error("No active video call in PhoneA.")
   1401             return False
   1402 
   1403         self.log.info("Step2: Initiate Video Call PhoneC->PhoneA.")
   1404         if not video_call_setup_teardown(
   1405                 self.log,
   1406                 ads[2],
   1407                 ads[0],
   1408                 None,
   1409                 video_state=VT_STATE_BIDIRECTIONAL,
   1410                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1411                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1412             self.log.error("Failed to setup a call")
   1413             return False
   1414 
   1415         self.log.info("Step3: Verify PhoneA's video calls in correct state.")
   1416         calls = ads[0].droid.telecomCallGetCallIds()
   1417         self.log.info("Calls in PhoneA{}".format(calls))
   1418         if num_active_calls(self.log, ads[0]) != 2:
   1419             self.log.error("Active call numbers in PhoneA is not 2.")
   1420             return False
   1421         for call in calls:
   1422             if call != call_id_video_ab:
   1423                 call_id_video_ac = call
   1424 
   1425         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1426             return False
   1427         if not verify_video_call_in_expected_state(
   1428                 self.log, ads[0], call_id_video_ab,
   1429                 VT_STATE_BIDIRECTIONAL_PAUSED, CALL_STATE_HOLDING):
   1430             return False
   1431         if not verify_video_call_in_expected_state(
   1432                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   1433                 CALL_STATE_ACTIVE):
   1434             return False
   1435 
   1436         self.log.info("Step4: Hangup on PhoneC.")
   1437         if not hangup_call(self.log, ads[2]):
   1438             return False
   1439         time.sleep(WAIT_TIME_IN_CALL)
   1440         if not verify_incall_state(self.log, [ads[0], ads[1]], True):
   1441             return False
   1442         self.log.info("Step4: Hangup on PhoneA.")
   1443         if not hangup_call(self.log, ads[0]):
   1444             return False
   1445         time.sleep(WAIT_TIME_IN_CALL)
   1446         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
   1447             return False
   1448         return True
   1449 
   1450     @TelephonyBaseTest.tel_test_wrap
   1451     def test_call_mt_video_add_mt_video(self):
   1452         """
   1453         From Phone_B, Initiate a Bi-Directional Video Call to Phone_A
   1454         Accept the call on Phone_A as Bi-Directional Video
   1455         From Phone_C, add a Bi-Directional Video Call to Phone_A
   1456         Accept the call on Phone_A
   1457         Verify both calls remain active.
   1458         Hang up on PhoneC.
   1459         Hang up on PhoneA.
   1460         """
   1461         # TODO: b/21437650 Test will fail. After established 2nd call ~15s,
   1462         # Phone C will drop call.
   1463         ads = self.android_devices
   1464         tasks = [(phone_setup_video, (self.log, ads[0])),
   1465                  (phone_setup_video, (self.log, ads[1])), (phone_setup_video,
   1466                                                            (self.log, ads[2]))]
   1467         if not multithread_func(self.log, tasks):
   1468             self.log.error("Phone Failed to Set Up Properly.")
   1469             return False
   1470 
   1471         self.log.info("Step1: Initiate Video Call PhoneB->PhoneA.")
   1472         if not video_call_setup_teardown(
   1473                 self.log,
   1474                 ads[1],
   1475                 ads[0],
   1476                 None,
   1477                 video_state=VT_STATE_BIDIRECTIONAL,
   1478                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1479                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1480             self.log.error("Failed to setup a call")
   1481             return False
   1482         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   1483                                                       VT_STATE_BIDIRECTIONAL)
   1484         if call_id_video_ab is None:
   1485             self.log.error("No active video call in PhoneA.")
   1486             return False
   1487 
   1488         self.log.info("Step2: Initiate Video Call PhoneC->PhoneA.")
   1489         if not video_call_setup_teardown(
   1490                 self.log,
   1491                 ads[2],
   1492                 ads[0],
   1493                 None,
   1494                 video_state=VT_STATE_BIDIRECTIONAL,
   1495                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1496                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1497             self.log.error("Failed to setup a call")
   1498             return False
   1499 
   1500         self.log.info("Step3: Verify PhoneA's video calls in correct state.")
   1501         calls = ads[0].droid.telecomCallGetCallIds()
   1502         self.log.info("Calls in PhoneA{}".format(calls))
   1503         if num_active_calls(self.log, ads[0]) != 2:
   1504             self.log.error("Active call numbers in PhoneA is not 2.")
   1505             return False
   1506         for call in calls:
   1507             if call != call_id_video_ab:
   1508                 call_id_video_ac = call
   1509 
   1510         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1511             return False
   1512         if not verify_video_call_in_expected_state(
   1513                 self.log, ads[0], call_id_video_ab,
   1514                 VT_STATE_BIDIRECTIONAL_PAUSED, CALL_STATE_HOLDING):
   1515             return False
   1516         if not verify_video_call_in_expected_state(
   1517                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   1518                 CALL_STATE_ACTIVE):
   1519             return False
   1520 
   1521         self.log.info("Step4: Hangup on PhoneC.")
   1522         if not hangup_call(self.log, ads[2]):
   1523             return False
   1524         time.sleep(WAIT_TIME_IN_CALL)
   1525         if not verify_incall_state(self.log, [ads[0], ads[1]], True):
   1526             return False
   1527         self.log.info("Step4: Hangup on PhoneA.")
   1528         if not hangup_call(self.log, ads[0]):
   1529             return False
   1530         time.sleep(WAIT_TIME_IN_CALL)
   1531         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
   1532             return False
   1533         return True
   1534 
   1535     @TelephonyBaseTest.tel_test_wrap
   1536     def test_call_mt_video_add_mo_video(self):
   1537         """
   1538         From Phone_B, Initiate a Bi-Directional Video Call to Phone_A
   1539         Accept the call on Phone_A as Bi-Directional Video
   1540         From Phone_A, add a Bi-Directional Video Call to Phone_C
   1541         Accept the call on Phone_C
   1542         Verify both calls remain active.
   1543         """
   1544         # This test case is not supported by VZW.
   1545         ads = self.android_devices
   1546         tasks = [(phone_setup_video, (self.log, ads[0])),
   1547                  (phone_setup_video, (self.log, ads[1])), (phone_setup_video,
   1548                                                            (self.log, ads[2]))]
   1549         if not multithread_func(self.log, tasks):
   1550             self.log.error("Phone Failed to Set Up Properly.")
   1551             return False
   1552 
   1553         self.log.info("Step1: Initiate Video Call PhoneB->PhoneA.")
   1554         if not video_call_setup_teardown(
   1555                 self.log,
   1556                 ads[1],
   1557                 ads[0],
   1558                 None,
   1559                 video_state=VT_STATE_BIDIRECTIONAL,
   1560                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1561                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1562             self.log.error("Failed to setup a call")
   1563             return False
   1564         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   1565                                                       VT_STATE_BIDIRECTIONAL)
   1566         if call_id_video_ab is None:
   1567             self.log.error("No active video call in PhoneA.")
   1568             return False
   1569 
   1570         self.log.info("Step2: Initiate Video Call PhoneA->PhoneC.")
   1571         if not video_call_setup_teardown(
   1572                 self.log,
   1573                 ads[0],
   1574                 ads[2],
   1575                 None,
   1576                 video_state=VT_STATE_BIDIRECTIONAL,
   1577                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1578                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1579             self.log.error("Failed to setup a call")
   1580             return False
   1581 
   1582         self.log.info("Step3: Verify PhoneA's video calls in correct state.")
   1583         calls = ads[0].droid.telecomCallGetCallIds()
   1584         self.log.info("Calls in PhoneA{}".format(calls))
   1585         if num_active_calls(self.log, ads[0]) != 2:
   1586             self.log.error("Active call numbers in PhoneA is not 2.")
   1587             return False
   1588         for call in calls:
   1589             if call != call_id_video_ab:
   1590                 call_id_video_ac = call
   1591 
   1592         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1593             return False
   1594         if not verify_video_call_in_expected_state(
   1595                 self.log, ads[0], call_id_video_ab, VT_STATE_BIDIRECTIONAL,
   1596                 CALL_STATE_HOLDING):
   1597             return False
   1598         if not verify_video_call_in_expected_state(
   1599                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   1600                 CALL_STATE_ACTIVE):
   1601             return False
   1602 
   1603         return self._vt_test_multi_call_hangup(ads)
   1604 
   1605     def _test_vt_conference_merge_drop(self, ads, call_ab_id, call_ac_id):
   1606         """Test conference merge and drop for VT call test.
   1607 
   1608         PhoneA in call with PhoneB.
   1609         PhoneA in call with PhoneC.
   1610         Merge calls to conference on PhoneA.
   1611         Hangup on PhoneB, check call continues between AC.
   1612         Hangup on PhoneC.
   1613         Hangup on PhoneA.
   1614 
   1615         Args:
   1616             call_ab_id: call id for call_AB on PhoneA.
   1617             call_ac_id: call id for call_AC on PhoneA.
   1618 
   1619         Returns:
   1620             True if succeed;
   1621             False if failed.
   1622         """
   1623         self.log.info(
   1624             "Merge - Step1: Merge to Conf Call and verify Conf Call.")
   1625         ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id)
   1626         time.sleep(WAIT_TIME_IN_CALL)
   1627         calls = ads[0].droid.telecomCallGetCallIds()
   1628         self.log.info("Calls in PhoneA{}".format(calls))
   1629         if num_active_calls(self.log, ads[0]) != 1:
   1630             self.log.error("Total number of call ids in {} is not 1.".format(
   1631                 ads[0].serial))
   1632             return False
   1633         call_conf_id = None
   1634         for call_id in calls:
   1635             if call_id != call_ab_id and call_id != call_ac_id:
   1636                 call_conf_id = call_id
   1637         if not call_conf_id:
   1638             self.log.error("Merge call fail, no new conference call id.")
   1639             return False
   1640         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1641             return False
   1642 
   1643         # Check if Conf Call is currently active
   1644         if ads[0].droid.telecomCallGetCallState(
   1645                 call_conf_id) != CALL_STATE_ACTIVE:
   1646             self.log.error(
   1647                 "Call_id:{}, state:{}, expected: STATE_ACTIVE".format(
   1648                     call_conf_id, ads[0].droid.telecomCallGetCallState(
   1649                         call_conf_id)))
   1650             return False
   1651 
   1652         self.log.info(
   1653             "Merge - Step2: End call on PhoneB and verify call continues.")
   1654         ads[1].droid.telecomEndCall()
   1655         time.sleep(WAIT_TIME_IN_CALL)
   1656         calls = ads[0].droid.telecomCallGetCallIds()
   1657         self.log.info("Calls in PhoneA{}".format(calls))
   1658         if not verify_incall_state(self.log, [ads[0], ads[2]], True):
   1659             return False
   1660         if not verify_incall_state(self.log, [ads[1]], False):
   1661             return False
   1662 
   1663         ads[1].droid.telecomEndCall()
   1664         ads[0].droid.telecomEndCall()
   1665         return True
   1666 
   1667     def _test_vt_conference_merge_drop_cep(self, ads, call_ab_id, call_ac_id):
   1668         """Merge CEP conference call.
   1669 
   1670         PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneB.
   1671         PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneC.
   1672         Merge calls to conference on PhoneA (CEP enabled IMS conference).
   1673 
   1674         Args:
   1675             call_ab_id: call id for call_AB on PhoneA.
   1676             call_ac_id: call id for call_AC on PhoneA.
   1677 
   1678         Returns:
   1679             call_id for conference
   1680         """
   1681 
   1682         self.log.info("Step4: Merge to Conf Call and verify Conf Call.")
   1683         ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id)
   1684         time.sleep(WAIT_TIME_IN_CALL)
   1685         calls = ads[0].droid.telecomCallGetCallIds()
   1686         self.log.info("Calls in PhoneA{}".format(calls))
   1687 
   1688         call_conf_id = get_cep_conference_call_id(ads[0])
   1689         if call_conf_id is None:
   1690             self.log.error(
   1691                 "No call with children. Probably CEP not enabled or merge failed.")
   1692             return False
   1693         calls.remove(call_conf_id)
   1694         if (set(ads[0].droid.telecomCallGetCallChildren(call_conf_id)) !=
   1695                 set(calls)):
   1696             self.log.error(
   1697                 "Children list<{}> for conference call is not correct.".format(
   1698                     ads[0].droid.telecomCallGetCallChildren(call_conf_id)))
   1699             return False
   1700 
   1701         if (CALL_PROPERTY_CONFERENCE not in
   1702                 ads[0].droid.telecomCallGetProperties(call_conf_id)):
   1703             self.log.error("Conf call id properties wrong: {}".format(ads[
   1704                 0].droid.telecomCallGetProperties(call_conf_id)))
   1705             return False
   1706 
   1707         if (CALL_CAPABILITY_MANAGE_CONFERENCE not in
   1708                 ads[0].droid.telecomCallGetCapabilities(call_conf_id)):
   1709             self.log.error("Conf call id capabilities wrong: {}".format(ads[
   1710                 0].droid.telecomCallGetCapabilities(call_conf_id)))
   1711             return False
   1712 
   1713         if (call_ab_id in calls) or (call_ac_id in calls):
   1714             self.log.error(
   1715                 "Previous call ids should not in new call list after merge.")
   1716             return False
   1717 
   1718         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1719             return False
   1720 
   1721         # Check if Conf Call is currently active
   1722         if ads[0].droid.telecomCallGetCallState(
   1723                 call_conf_id) != CALL_STATE_ACTIVE:
   1724             self.log.error(
   1725                 "Call_id:{}, state:{}, expected: STATE_ACTIVE".format(
   1726                     call_conf_id, ads[0].droid.telecomCallGetCallState(
   1727                         call_conf_id)))
   1728             return False
   1729 
   1730         self.log.info(
   1731             "End call on PhoneB and verify call continues.")
   1732         ads[1].droid.telecomEndCall()
   1733         time.sleep(WAIT_TIME_IN_CALL)
   1734         calls = ads[0].droid.telecomCallGetCallIds()
   1735         self.log.info("Calls in PhoneA{}".format(calls))
   1736         if not verify_incall_state(self.log, [ads[0], ads[2]], True):
   1737             return False
   1738         if not verify_incall_state(self.log, [ads[1]], False):
   1739             return False
   1740 
   1741         ads[1].droid.telecomEndCall()
   1742         ads[0].droid.telecomEndCall()
   1743 
   1744         return True
   1745 
   1746     @TelephonyBaseTest.tel_test_wrap
   1747     def test_call_volte_add_mo_video_accept_as_voice_merge_drop(self):
   1748         """Conference call
   1749 
   1750         Make Sure PhoneA is in LTE mode (with Video Calling).
   1751         Make Sure PhoneB is in LTE mode (with VoLTE).
   1752         Make Sure PhoneC is in LTE mode (with Video Calling).
   1753         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   1754         PhoneA add a Bi-Directional Video call to PhoneC.
   1755         PhoneC accept as voice.
   1756         Merge call on PhoneA.
   1757         Hang up on PhoneB.
   1758         Hang up on PhoneC.
   1759         """
   1760         return self._test_call_volte_add_mo_video_accept_as_voice_merge_drop(
   1761             False)
   1762 
   1763     @TelephonyBaseTest.tel_test_wrap
   1764     def test_call_volte_add_mo_video_accept_as_voice_merge_drop_cep(self):
   1765         """Conference call
   1766 
   1767         Make Sure PhoneA is in LTE mode (with Video Calling).
   1768         Make Sure PhoneB is in LTE mode (with VoLTE).
   1769         Make Sure PhoneC is in LTE mode (with Video Calling).
   1770         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   1771         PhoneA add a Bi-Directional Video call to PhoneC.
   1772         PhoneC accept as voice.
   1773         Merge call on PhoneA.
   1774         Hang up on PhoneB.
   1775         Hang up on PhoneC.
   1776         """
   1777         return self._test_call_volte_add_mo_video_accept_as_voice_merge_drop(
   1778             True)
   1779 
   1780     def _test_call_volte_add_mo_video_accept_as_voice_merge_drop(
   1781             self,
   1782             use_cep=False):
   1783         # This test case is not supported by VZW.
   1784         ads = self.android_devices
   1785         tasks = [(phone_setup_video, (self.log, ads[0])),
   1786                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
   1787                                                            (self.log, ads[2]))]
   1788         if not multithread_func(self.log, tasks):
   1789             self.log.error("Phone Failed to Set Up Properly.")
   1790             return False
   1791         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
   1792         if not call_setup_teardown(self.log, ads[0], ads[1], None,
   1793                                    is_phone_in_call_volte,
   1794                                    is_phone_in_call_volte):
   1795             self.log.error("Failed to setup a call")
   1796             return False
   1797         calls = ads[0].droid.telecomCallGetCallIds()
   1798         self.log.info("Calls in PhoneA{}".format(calls))
   1799         if num_active_calls(self.log, ads[0]) != 1:
   1800             self.log.error("Active call numbers in PhoneA is not 1.")
   1801             return False
   1802         call_ab_id = calls[0]
   1803 
   1804         self.log.info(
   1805             "Step2: Initiate Video Call PhoneA->PhoneC and accept as voice.")
   1806         if not video_call_setup_teardown(
   1807                 self.log,
   1808                 ads[0],
   1809                 ads[2],
   1810                 None,
   1811                 video_state=VT_STATE_AUDIO_ONLY,
   1812                 verify_caller_func=is_phone_in_call_voice_hd,
   1813                 verify_callee_func=is_phone_in_call_voice_hd):
   1814             self.log.error("Failed to setup a call")
   1815             return False
   1816         calls = ads[0].droid.telecomCallGetCallIds()
   1817         self.log.info("Calls in PhoneA{}".format(calls))
   1818         if num_active_calls(self.log, ads[0]) != 2:
   1819             self.log.error("Active call numbers in PhoneA is not 2.")
   1820             return False
   1821         for call in calls:
   1822             if call != call_ab_id:
   1823                 call_ac_id = call
   1824 
   1825         self.log.info("Step3: Verify calls in correct state.")
   1826         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1827             return False
   1828         if not verify_video_call_in_expected_state(
   1829                 self.log, ads[0], call_ab_id, VT_STATE_AUDIO_ONLY,
   1830                 CALL_STATE_HOLDING):
   1831             return False
   1832         if not verify_video_call_in_expected_state(
   1833                 self.log, ads[0], call_ac_id, VT_STATE_AUDIO_ONLY,
   1834                 CALL_STATE_ACTIVE):
   1835             return False
   1836 
   1837         return {False: self._test_vt_conference_merge_drop,
   1838                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   1839                     ads, call_ab_id, call_ac_id)
   1840 
   1841     @TelephonyBaseTest.tel_test_wrap
   1842     def test_call_volte_add_mt_video_accept_as_voice_merge_drop(self):
   1843         """Conference call
   1844 
   1845         Make Sure PhoneA is in LTE mode (with Video Calling).
   1846         Make Sure PhoneB is in LTE mode (with VoLTE).
   1847         Make Sure PhoneC is in LTE mode (with Video Calling).
   1848         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   1849         PhoneC add a Bi-Directional Video call to PhoneA.
   1850         PhoneA accept as voice.
   1851         Merge call on PhoneA.
   1852         Hang up on PhoneB.
   1853         Hang up on PhoneC.
   1854         """
   1855         return self._test_call_volte_add_mt_video_accept_as_voice_merge_drop(
   1856             False)
   1857 
   1858     @TelephonyBaseTest.tel_test_wrap
   1859     def test_call_volte_add_mt_video_accept_as_voice_merge_drop_cep(self):
   1860         """Conference call
   1861 
   1862         Make Sure PhoneA is in LTE mode (with Video Calling).
   1863         Make Sure PhoneB is in LTE mode (with VoLTE).
   1864         Make Sure PhoneC is in LTE mode (with Video Calling).
   1865         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   1866         PhoneC add a Bi-Directional Video call to PhoneA.
   1867         PhoneA accept as voice.
   1868         Merge call on PhoneA.
   1869         Hang up on PhoneB.
   1870         Hang up on PhoneC.
   1871         """
   1872         return self._test_call_volte_add_mt_video_accept_as_voice_merge_drop(
   1873             True)
   1874 
   1875     def _test_call_volte_add_mt_video_accept_as_voice_merge_drop(
   1876             self,
   1877             use_cep=False):
   1878         ads = self.android_devices
   1879         tasks = [(phone_setup_video, (self.log, ads[0])),
   1880                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
   1881                                                            (self.log, ads[2]))]
   1882         if not multithread_func(self.log, tasks):
   1883             self.log.error("Phone Failed to Set Up Properly.")
   1884             return False
   1885         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
   1886         if not call_setup_teardown(self.log, ads[0], ads[1], None,
   1887                                    is_phone_in_call_volte,
   1888                                    is_phone_in_call_volte):
   1889             self.log.error("Failed to setup a call")
   1890             return False
   1891         calls = ads[0].droid.telecomCallGetCallIds()
   1892         self.log.info("Calls in PhoneA{}".format(calls))
   1893         if num_active_calls(self.log, ads[0]) != 1:
   1894             self.log.error("Active call numbers in PhoneA is not 1.")
   1895             return False
   1896         call_ab_id = calls[0]
   1897 
   1898         self.log.info(
   1899             "Step2: Initiate Video Call PhoneC->PhoneA and accept as voice.")
   1900         if not video_call_setup_teardown(
   1901                 self.log,
   1902                 ads[2],
   1903                 ads[0],
   1904                 None,
   1905                 video_state=VT_STATE_AUDIO_ONLY,
   1906                 verify_caller_func=is_phone_in_call_voice_hd,
   1907                 verify_callee_func=is_phone_in_call_voice_hd):
   1908             self.log.error("Failed to setup a call")
   1909             return False
   1910         calls = ads[0].droid.telecomCallGetCallIds()
   1911         self.log.info("Calls in PhoneA{}".format(calls))
   1912         if num_active_calls(self.log, ads[0]) != 2:
   1913             self.log.error("Active call numbers in PhoneA is not 2.")
   1914             return False
   1915         for call in calls:
   1916             if call != call_ab_id:
   1917                 call_ac_id = call
   1918 
   1919         self.log.info("Step3: Verify calls in correct state.")
   1920         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   1921             return False
   1922         if not verify_video_call_in_expected_state(
   1923                 self.log, ads[0], call_ab_id, VT_STATE_AUDIO_ONLY,
   1924                 CALL_STATE_HOLDING):
   1925             return False
   1926         if not verify_video_call_in_expected_state(
   1927                 self.log, ads[0], call_ac_id, VT_STATE_AUDIO_ONLY,
   1928                 CALL_STATE_ACTIVE):
   1929             return False
   1930 
   1931         return {False: self._test_vt_conference_merge_drop,
   1932                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   1933                     ads, call_ab_id, call_ac_id)
   1934 
   1935     @TelephonyBaseTest.tel_test_wrap
   1936     def test_call_video_add_mo_voice_swap_downgrade_merge_drop(self):
   1937         """Conference call
   1938 
   1939         Make Sure PhoneA is in LTE mode (with Video Calling).
   1940         Make Sure PhoneB is in LTE mode (with Video Calling).
   1941         Make Sure PhoneC is in LTE mode (with VoLTE).
   1942         PhoneA add a Bi-Directional Video call to PhoneB.
   1943         PhoneB accept as Video.
   1944         PhoneA VoLTE call to PhoneC. Accept on PhoneC.
   1945         Swap Active call on PhoneA.
   1946         Downgrade Video call on PhoneA and PhoneB to audio only.
   1947         Merge call on PhoneA.
   1948         Hang up on PhoneB.
   1949         Hang up on PhoneC.
   1950         """
   1951         return self._test_call_video_add_mo_voice_swap_downgrade_merge_drop(
   1952             False)
   1953 
   1954     @TelephonyBaseTest.tel_test_wrap
   1955     def test_call_video_add_mo_voice_swap_downgrade_merge_drop_cep(self):
   1956         """Conference call
   1957 
   1958         Make Sure PhoneA is in LTE mode (with Video Calling).
   1959         Make Sure PhoneB is in LTE mode (with Video Calling).
   1960         Make Sure PhoneC is in LTE mode (with VoLTE).
   1961         PhoneA add a Bi-Directional Video call to PhoneB.
   1962         PhoneB accept as Video.
   1963         PhoneA VoLTE call to PhoneC. Accept on PhoneC.
   1964         Swap Active call on PhoneA.
   1965         Downgrade Video call on PhoneA and PhoneB to audio only.
   1966         Merge call on PhoneA.
   1967         Hang up on PhoneB.
   1968         Hang up on PhoneC.
   1969         """
   1970         return self._test_call_video_add_mo_voice_swap_downgrade_merge_drop(
   1971             True)
   1972 
   1973     def _test_call_video_add_mo_voice_swap_downgrade_merge_drop(self, use_cep):
   1974         ads = self.android_devices
   1975         tasks = [(phone_setup_video, (self.log, ads[0])),
   1976                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
   1977                                                            (self.log, ads[2]))]
   1978         if not multithread_func(self.log, tasks):
   1979             self.log.error("Phone Failed to Set Up Properly.")
   1980             return False
   1981 
   1982         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   1983         if not video_call_setup_teardown(
   1984                 self.log,
   1985                 ads[0],
   1986                 ads[1],
   1987                 None,
   1988                 video_state=VT_STATE_BIDIRECTIONAL,
   1989                 verify_caller_func=is_phone_in_call_video_bidirectional,
   1990                 verify_callee_func=is_phone_in_call_video_bidirectional):
   1991             self.log.error("Failed to setup a call")
   1992             return False
   1993         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   1994                                                       VT_STATE_BIDIRECTIONAL)
   1995         if call_id_video_ab is None:
   1996             self.log.error("No active video call in PhoneA.")
   1997             return False
   1998 
   1999         self.log.info("Step2: Initiate Voice Call PhoneA->PhoneC.")
   2000         if not call_setup_teardown(self.log,
   2001                                    ads[0],
   2002                                    ads[2],
   2003                                    None,
   2004                                    verify_caller_func=None,
   2005                                    verify_callee_func=is_phone_in_call_volte):
   2006             self.log.error("Failed to setup a call")
   2007             return False
   2008 
   2009         self.log.info(
   2010             "Step3: Verify PhoneA's video/voice call in correct state.")
   2011         calls = ads[0].droid.telecomCallGetCallIds()
   2012         self.log.info("Calls in PhoneA{}".format(calls))
   2013         if num_active_calls(self.log, ads[0]) != 2:
   2014             self.log.error("Active call numbers in PhoneA is not 2.")
   2015             return False
   2016         for call in calls:
   2017             if call != call_id_video_ab:
   2018                 call_id_voice_ac = call
   2019 
   2020         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2021             return False
   2022         if not verify_video_call_in_expected_state(
   2023                 self.log, ads[0], call_id_video_ab, VT_STATE_BIDIRECTIONAL,
   2024                 CALL_STATE_HOLDING):
   2025             return False
   2026         if not verify_video_call_in_expected_state(
   2027                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2028                 CALL_STATE_ACTIVE):
   2029             return False
   2030 
   2031         self.log.info(
   2032             "Step4: Swap calls on PhoneA and verify call state correct.")
   2033         ads[0].droid.telecomCallHold(call_id_voice_ac)
   2034         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   2035         for ad in [ads[0], ads[1]]:
   2036             self.log.info("{} audio: {}".format(ad.serial, get_audio_route(
   2037                 self.log, ad)))
   2038             set_audio_route(self.log, ad, AUDIO_ROUTE_EARPIECE)
   2039 
   2040         time.sleep(WAIT_TIME_IN_CALL)
   2041         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2042             return False
   2043         if not verify_video_call_in_expected_state(
   2044                 self.log, ads[0], call_id_video_ab, VT_STATE_BIDIRECTIONAL,
   2045                 CALL_STATE_ACTIVE):
   2046             return False
   2047         if not verify_video_call_in_expected_state(
   2048                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2049                 CALL_STATE_HOLDING):
   2050             return False
   2051 
   2052         self.log.info("Step5: Disable camera on PhoneA and PhoneB.")
   2053         if not video_call_downgrade(self.log, ads[0], call_id_video_ab, ads[1],
   2054                                     get_call_id_in_video_state(
   2055                                         self.log, ads[1],
   2056                                         VT_STATE_BIDIRECTIONAL)):
   2057             self.log.error("Failed to disable video on PhoneA.")
   2058             return False
   2059         if not video_call_downgrade(
   2060                 self.log, ads[1], get_call_id_in_video_state(
   2061                     self.log, ads[1], VT_STATE_TX_ENABLED), ads[0],
   2062                 call_id_video_ab):
   2063             self.log.error("Failed to disable video on PhoneB.")
   2064             return False
   2065 
   2066         self.log.info("Step6: Verify calls in correct state.")
   2067         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2068             return False
   2069         if not verify_video_call_in_expected_state(
   2070                 self.log, ads[0], call_id_video_ab, VT_STATE_AUDIO_ONLY,
   2071                 CALL_STATE_ACTIVE):
   2072             return False
   2073         if not verify_video_call_in_expected_state(
   2074                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2075                 CALL_STATE_HOLDING):
   2076             return False
   2077 
   2078         return {False: self._test_vt_conference_merge_drop,
   2079                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   2080                     ads, call_id_video_ab, call_id_voice_ac)
   2081 
   2082     @TelephonyBaseTest.tel_test_wrap
   2083     def test_call_video_add_mt_voice_swap_downgrade_merge_drop(self):
   2084         """Conference call
   2085 
   2086         Make Sure PhoneA is in LTE mode (with Video Calling).
   2087         Make Sure PhoneB is in LTE mode (with Video Calling).
   2088         Make Sure PhoneC is in LTE mode (with VoLTE).
   2089         PhoneA add a Bi-Directional Video call to PhoneB.
   2090         PhoneB accept as Video.
   2091         PhoneC VoLTE call to PhoneA. Accept on PhoneA.
   2092         Swap Active call on PhoneA.
   2093         Downgrade Video call on PhoneA and PhoneB to audio only.
   2094         Merge call on PhoneA.
   2095         Hang up on PhoneB.
   2096         Hang up on PhoneC.
   2097         """
   2098         return self._test_call_video_add_mt_voice_swap_downgrade_merge_drop(
   2099             False)
   2100 
   2101     @TelephonyBaseTest.tel_test_wrap
   2102     def test_call_video_add_mt_voice_swap_downgrade_merge_drop_cep(self):
   2103         """Conference call
   2104 
   2105         Make Sure PhoneA is in LTE mode (with Video Calling).
   2106         Make Sure PhoneB is in LTE mode (with Video Calling).
   2107         Make Sure PhoneC is in LTE mode (with VoLTE).
   2108         PhoneA add a Bi-Directional Video call to PhoneB.
   2109         PhoneB accept as Video.
   2110         PhoneC VoLTE call to PhoneA. Accept on PhoneA.
   2111         Swap Active call on PhoneA.
   2112         Downgrade Video call on PhoneA and PhoneB to audio only.
   2113         Merge call on PhoneA.
   2114         Hang up on PhoneB.
   2115         Hang up on PhoneC.
   2116         """
   2117         return self._test_call_video_add_mt_voice_swap_downgrade_merge_drop(
   2118             True)
   2119 
   2120     def _test_call_video_add_mt_voice_swap_downgrade_merge_drop(self,
   2121                                                                 use_cep=False):
   2122         ads = self.android_devices
   2123         tasks = [(phone_setup_video, (self.log, ads[0])),
   2124                  (phone_setup_video, (self.log, ads[1])), (phone_setup_volte,
   2125                                                            (self.log, ads[2]))]
   2126         if not multithread_func(self.log, tasks):
   2127             self.log.error("Phone Failed to Set Up Properly.")
   2128             return False
   2129 
   2130         self.log.info("Step1: Initiate Video Call PhoneA->PhoneB.")
   2131         if not video_call_setup_teardown(
   2132                 self.log,
   2133                 ads[0],
   2134                 ads[1],
   2135                 None,
   2136                 video_state=VT_STATE_BIDIRECTIONAL,
   2137                 verify_caller_func=is_phone_in_call_video_bidirectional,
   2138                 verify_callee_func=is_phone_in_call_video_bidirectional):
   2139             self.log.error("Failed to setup a call")
   2140             return False
   2141         call_id_video_ab = get_call_id_in_video_state(self.log, ads[0],
   2142                                                       VT_STATE_BIDIRECTIONAL)
   2143         if call_id_video_ab is None:
   2144             self.log.error("No active video call in PhoneA.")
   2145             return False
   2146 
   2147         self.log.info("Step2: Initiate Voice Call PhoneC->PhoneA.")
   2148         if not call_setup_teardown(self.log,
   2149                                    ads[2],
   2150                                    ads[0],
   2151                                    None,
   2152                                    verify_caller_func=is_phone_in_call_volte,
   2153                                    verify_callee_func=None):
   2154             self.log.error("Failed to setup a call")
   2155             return False
   2156 
   2157         self.log.info(
   2158             "Step3: Verify PhoneA's video/voice call in correct state.")
   2159         calls = ads[0].droid.telecomCallGetCallIds()
   2160         self.log.info("Calls in PhoneA{}".format(calls))
   2161         if num_active_calls(self.log, ads[0]) != 2:
   2162             self.log.error("Active call numbers in PhoneA is not 2.")
   2163             return False
   2164         for call in calls:
   2165             if call != call_id_video_ab:
   2166                 call_id_voice_ac = call
   2167 
   2168         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2169             return False
   2170         if not verify_video_call_in_expected_state(
   2171                 self.log, ads[0], call_id_video_ab,
   2172                 VT_STATE_BIDIRECTIONAL_PAUSED, CALL_STATE_HOLDING):
   2173             return False
   2174         if not verify_video_call_in_expected_state(
   2175                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2176                 CALL_STATE_ACTIVE):
   2177             return False
   2178 
   2179         self.log.info(
   2180             "Step4: Swap calls on PhoneA and verify call state correct.")
   2181         ads[0].droid.telecomCallHold(call_id_voice_ac)
   2182         time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
   2183         for ad in [ads[0], ads[1]]:
   2184             if get_audio_route(self.log, ad) != AUDIO_ROUTE_SPEAKER:
   2185                 self.log.error("{} Audio is not on speaker.".format(ad.serial))
   2186                 # TODO: b/26337892 Define expected audio route behavior.
   2187             set_audio_route(self.log, ad, AUDIO_ROUTE_EARPIECE)
   2188 
   2189         time.sleep(WAIT_TIME_IN_CALL)
   2190         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2191             return False
   2192         if not verify_video_call_in_expected_state(
   2193                 self.log, ads[0], call_id_video_ab, VT_STATE_BIDIRECTIONAL,
   2194                 CALL_STATE_ACTIVE):
   2195             return False
   2196         if not verify_video_call_in_expected_state(
   2197                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2198                 CALL_STATE_HOLDING):
   2199             return False
   2200 
   2201         self.log.info("Step5: Disable camera on PhoneA and PhoneB.")
   2202         if not video_call_downgrade(self.log, ads[0], call_id_video_ab, ads[1],
   2203                                     get_call_id_in_video_state(
   2204                                         self.log, ads[1],
   2205                                         VT_STATE_BIDIRECTIONAL)):
   2206             self.log.error("Failed to disable video on PhoneA.")
   2207             return False
   2208         if not video_call_downgrade(
   2209                 self.log, ads[1], get_call_id_in_video_state(
   2210                     self.log, ads[1], VT_STATE_TX_ENABLED), ads[0],
   2211                 call_id_video_ab):
   2212             self.log.error("Failed to disable video on PhoneB.")
   2213             return False
   2214 
   2215         self.log.info("Step6: Verify calls in correct state.")
   2216         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2217             return False
   2218         if not verify_video_call_in_expected_state(
   2219                 self.log, ads[0], call_id_video_ab, VT_STATE_AUDIO_ONLY,
   2220                 CALL_STATE_ACTIVE):
   2221             return False
   2222         if not verify_video_call_in_expected_state(
   2223                 self.log, ads[0], call_id_voice_ac, VT_STATE_AUDIO_ONLY,
   2224                 CALL_STATE_HOLDING):
   2225             return False
   2226 
   2227         return {False: self._test_vt_conference_merge_drop,
   2228                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   2229                     ads, call_id_video_ab, call_id_voice_ac)
   2230 
   2231     @TelephonyBaseTest.tel_test_wrap
   2232     def test_call_volte_add_mo_video_downgrade_merge_drop(self):
   2233         """Conference call
   2234 
   2235         Make Sure PhoneA is in LTE mode (with Video Calling).
   2236         Make Sure PhoneB is in LTE mode (with VoLTE).
   2237         Make Sure PhoneC is in LTE mode (with Video Calling).
   2238         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   2239         PhoneA add a Bi-Directional Video call to PhoneC.
   2240         PhoneC accept as Video.
   2241         Downgrade Video call on PhoneA and PhoneC to audio only.
   2242         Merge call on PhoneA.
   2243         Hang up on PhoneB.
   2244         Hang up on PhoneC.
   2245         """
   2246         return self._test_call_volte_add_mo_video_downgrade_merge_drop(False)
   2247 
   2248     @TelephonyBaseTest.tel_test_wrap
   2249     def test_call_volte_add_mo_video_downgrade_merge_drop_cep(self):
   2250         """Conference call
   2251 
   2252         Make Sure PhoneA is in LTE mode (with Video Calling).
   2253         Make Sure PhoneB is in LTE mode (with VoLTE).
   2254         Make Sure PhoneC is in LTE mode (with Video Calling).
   2255         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   2256         PhoneA add a Bi-Directional Video call to PhoneC.
   2257         PhoneC accept as Video.
   2258         Downgrade Video call on PhoneA and PhoneC to audio only.
   2259         Merge call on PhoneA.
   2260         Hang up on PhoneB.
   2261         Hang up on PhoneC.
   2262         """
   2263         return self._test_call_volte_add_mo_video_downgrade_merge_drop(True)
   2264 
   2265     def _test_call_volte_add_mo_video_downgrade_merge_drop(self, use_cep):
   2266         ads = self.android_devices
   2267         tasks = [(phone_setup_video, (self.log, ads[0])),
   2268                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
   2269                                                            (self.log, ads[2]))]
   2270         if not multithread_func(self.log, tasks):
   2271             self.log.error("Phone Failed to Set Up Properly.")
   2272             return False
   2273 
   2274         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
   2275         if not call_setup_teardown(self.log,
   2276                                    ads[0],
   2277                                    ads[1],
   2278                                    None,
   2279                                    verify_caller_func=is_phone_in_call_volte,
   2280                                    verify_callee_func=is_phone_in_call_volte):
   2281             self.log.error("Failed to setup a call")
   2282             return False
   2283         calls = ads[0].droid.telecomCallGetCallIds()
   2284         self.log.info("Calls in PhoneA{}".format(calls))
   2285         if num_active_calls(self.log, ads[0]) != 1:
   2286             self.log.error("Active call numbers in PhoneA is not 1.")
   2287             return False
   2288         call_id_voice_ab = calls[0]
   2289 
   2290         self.log.info("Step2: Initiate Video Call PhoneA->PhoneC.")
   2291         if not video_call_setup_teardown(
   2292                 self.log,
   2293                 ads[0],
   2294                 ads[2],
   2295                 None,
   2296                 video_state=VT_STATE_BIDIRECTIONAL,
   2297                 verify_caller_func=is_phone_in_call_video_bidirectional,
   2298                 verify_callee_func=is_phone_in_call_video_bidirectional):
   2299             self.log.error("Failed to setup a call")
   2300             return False
   2301         call_id_video_ac = get_call_id_in_video_state(self.log, ads[0],
   2302                                                       VT_STATE_BIDIRECTIONAL)
   2303         if call_id_video_ac is None:
   2304             self.log.error("No active video call in PhoneA.")
   2305             return False
   2306 
   2307         self.log.info(
   2308             "Step3: Verify PhoneA's video/voice call in correct state.")
   2309         calls = ads[0].droid.telecomCallGetCallIds()
   2310         self.log.info("Calls in PhoneA{}".format(calls))
   2311         if num_active_calls(self.log, ads[0]) != 2:
   2312             self.log.error("Active call numbers in PhoneA is not 2.")
   2313             return False
   2314 
   2315         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2316             return False
   2317         if not verify_video_call_in_expected_state(
   2318                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   2319                 CALL_STATE_ACTIVE):
   2320             return False
   2321         if not verify_video_call_in_expected_state(
   2322                 self.log, ads[0], call_id_voice_ab, VT_STATE_AUDIO_ONLY,
   2323                 CALL_STATE_HOLDING):
   2324             return False
   2325 
   2326         self.log.info("Step4: Disable camera on PhoneA and PhoneC.")
   2327         if not video_call_downgrade(self.log, ads[0], call_id_video_ac, ads[2],
   2328                                     get_call_id_in_video_state(
   2329                                         self.log, ads[2],
   2330                                         VT_STATE_BIDIRECTIONAL)):
   2331             self.log.error("Failed to disable video on PhoneA.")
   2332             return False
   2333         if not video_call_downgrade(
   2334                 self.log, ads[2], get_call_id_in_video_state(
   2335                     self.log, ads[2], VT_STATE_TX_ENABLED), ads[0],
   2336                 call_id_video_ac):
   2337             self.log.error("Failed to disable video on PhoneB.")
   2338             return False
   2339 
   2340         self.log.info("Step6: Verify calls in correct state.")
   2341         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2342             return False
   2343         if not verify_video_call_in_expected_state(
   2344                 self.log, ads[0], call_id_video_ac, VT_STATE_AUDIO_ONLY,
   2345                 CALL_STATE_ACTIVE):
   2346             return False
   2347         if not verify_video_call_in_expected_state(
   2348                 self.log, ads[0], call_id_voice_ab, VT_STATE_AUDIO_ONLY,
   2349                 CALL_STATE_HOLDING):
   2350             return False
   2351 
   2352         return {False: self._test_vt_conference_merge_drop,
   2353                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   2354                     ads, call_id_video_ac, call_id_voice_ab)
   2355 
   2356     @TelephonyBaseTest.tel_test_wrap
   2357     def test_call_volte_add_mt_video_downgrade_merge_drop(self):
   2358         """Conference call
   2359 
   2360         Make Sure PhoneA is in LTE mode (with Video Calling).
   2361         Make Sure PhoneB is in LTE mode (with VoLTE).
   2362         Make Sure PhoneC is in LTE mode (with Video Calling).
   2363         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   2364         PhoneC add a Bi-Directional Video call to PhoneA.
   2365         PhoneA accept as Video.
   2366         Downgrade Video call on PhoneA and PhoneC to audio only.
   2367         Merge call on PhoneA.
   2368         Hang up on PhoneB.
   2369         Hang up on PhoneC.
   2370         """
   2371         return self._test_call_volte_add_mt_video_downgrade_merge_drop(False)
   2372 
   2373     @TelephonyBaseTest.tel_test_wrap
   2374     def test_call_volte_add_mt_video_downgrade_merge_drop_cep(self):
   2375         """Conference call
   2376 
   2377         Make Sure PhoneA is in LTE mode (with Video Calling).
   2378         Make Sure PhoneB is in LTE mode (with VoLTE).
   2379         Make Sure PhoneC is in LTE mode (with Video Calling).
   2380         PhoneA VoLTE call to PhoneB. Accept on PhoneB.
   2381         PhoneC add a Bi-Directional Video call to PhoneA.
   2382         PhoneA accept as Video.
   2383         Downgrade Video call on PhoneA and PhoneC to audio only.
   2384         Merge call on PhoneA.
   2385         Hang up on PhoneB.
   2386         Hang up on PhoneC.
   2387         """
   2388         return self._test_call_volte_add_mt_video_downgrade_merge_drop(True)
   2389 
   2390     def _test_call_volte_add_mt_video_downgrade_merge_drop(self, use_cep):
   2391         # TODO: b/21437650 Test will fail. After established 2nd call ~15s,
   2392         # Phone C will drop call.
   2393         ads = self.android_devices
   2394         tasks = [(phone_setup_video, (self.log, ads[0])),
   2395                  (phone_setup_volte, (self.log, ads[1])), (phone_setup_video,
   2396                                                            (self.log, ads[2]))]
   2397         if not multithread_func(self.log, tasks):
   2398             self.log.error("Phone Failed to Set Up Properly.")
   2399             return False
   2400 
   2401         self.log.info("Step1: Initiate VoLTE Call PhoneA->PhoneB.")
   2402         if not call_setup_teardown(self.log,
   2403                                    ads[0],
   2404                                    ads[1],
   2405                                    None,
   2406                                    verify_caller_func=is_phone_in_call_volte,
   2407                                    verify_callee_func=is_phone_in_call_volte):
   2408             self.log.error("Failed to setup a call")
   2409             return False
   2410         calls = ads[0].droid.telecomCallGetCallIds()
   2411         self.log.info("Calls in PhoneA{}".format(calls))
   2412         if num_active_calls(self.log, ads[0]) != 1:
   2413             self.log.error("Active call numbers in PhoneA is not 1.")
   2414             return False
   2415         call_id_voice_ab = calls[0]
   2416 
   2417         self.log.info("Step2: Initiate Video Call PhoneC->PhoneA.")
   2418         if not video_call_setup_teardown(
   2419                 self.log,
   2420                 ads[2],
   2421                 ads[0],
   2422                 None,
   2423                 video_state=VT_STATE_BIDIRECTIONAL,
   2424                 verify_caller_func=is_phone_in_call_video_bidirectional,
   2425                 verify_callee_func=is_phone_in_call_video_bidirectional):
   2426             self.log.error("Failed to setup a call")
   2427             return False
   2428         call_id_video_ac = get_call_id_in_video_state(self.log, ads[0],
   2429                                                       VT_STATE_BIDIRECTIONAL)
   2430         if call_id_video_ac is None:
   2431             self.log.error("No active video call in PhoneA.")
   2432             return False
   2433 
   2434         self.log.info(
   2435             "Step3: Verify PhoneA's video/voice call in correct state.")
   2436         calls = ads[0].droid.telecomCallGetCallIds()
   2437         self.log.info("Calls in PhoneA{}".format(calls))
   2438         if num_active_calls(self.log, ads[0]) != 2:
   2439             self.log.error("Active call numbers in PhoneA is not 2.")
   2440             return False
   2441 
   2442         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2443             return False
   2444         if not verify_video_call_in_expected_state(
   2445                 self.log, ads[0], call_id_video_ac, VT_STATE_BIDIRECTIONAL,
   2446                 CALL_STATE_ACTIVE):
   2447             return False
   2448         if not verify_video_call_in_expected_state(
   2449                 self.log, ads[0], call_id_voice_ab, VT_STATE_AUDIO_ONLY,
   2450                 CALL_STATE_HOLDING):
   2451             return False
   2452 
   2453         self.log.info("Step4: Disable camera on PhoneA and PhoneC.")
   2454         if not video_call_downgrade(self.log, ads[0], call_id_video_ac, ads[2],
   2455                                     get_call_id_in_video_state(
   2456                                         self.log, ads[2],
   2457                                         VT_STATE_BIDIRECTIONAL)):
   2458             self.log.error("Failed to disable video on PhoneA.")
   2459             return False
   2460         if not video_call_downgrade(
   2461                 self.log, ads[2], get_call_id_in_video_state(
   2462                     self.log, ads[2], VT_STATE_TX_ENABLED), ads[0],
   2463                 call_id_video_ac):
   2464             self.log.error("Failed to disable video on PhoneB.")
   2465             return False
   2466 
   2467         self.log.info("Step6: Verify calls in correct state.")
   2468         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
   2469             return False
   2470         if not verify_video_call_in_expected_state(
   2471                 self.log, ads[0], call_id_video_ac, VT_STATE_AUDIO_ONLY,
   2472                 CALL_STATE_ACTIVE):
   2473             return False
   2474         if not verify_video_call_in_expected_state(
   2475                 self.log, ads[0], call_id_voice_ab, VT_STATE_AUDIO_ONLY,
   2476                 CALL_STATE_HOLDING):
   2477             return False
   2478 
   2479         return {False: self._test_vt_conference_merge_drop,
   2480                 True: self._test_vt_conference_merge_drop_cep}[use_cep](
   2481                     ads, call_id_video_ac, call_id_voice_ab)
   2482 
   2483     @TelephonyBaseTest.tel_test_wrap
   2484     def test_disable_data_vt_unavailable(self):
   2485         """Disable Data, phone should no be able to make VT call.
   2486 
   2487         Make sure PhoneA and PhoneB can make VT call.
   2488         Disable Data on PhoneA.
   2489         Make sure phoneA report vt_enabled as false.
   2490         Attempt to make a VT call from PhoneA to PhoneB,
   2491         Verify the call succeed as Voice call.
   2492         """
   2493 
   2494         self.log.info("Step1 Make sure Phones are able make VT call")
   2495         ads = self.android_devices
   2496         ads[0], ads[1] = ads[1], ads[0]
   2497         tasks = [(phone_setup_video, (self.log, ads[0])), (phone_setup_video,
   2498                                                            (self.log, ads[1]))]
   2499         if not multithread_func(self.log, tasks):
   2500             self.log.error("Phone Failed to Set Up Properly.")
   2501             return False
   2502 
   2503         try:
   2504             self.log.info("Step2 Turn off data and verify not connected.")
   2505             ads[0].droid.telephonyToggleDataConnection(False)
   2506             if verify_http_connection(self.log, ads[0]):
   2507                 self.log.error("Internet Accessible when Disabled")
   2508                 return False
   2509 
   2510             self.log.info("Step3 Verify vt_enabled return false.")
   2511             if wait_for_video_enabled(self.log, ads[0],
   2512                                       MAX_WAIT_TIME_VOLTE_ENABLED):
   2513                 self.log.error(
   2514                     "{} failed to <report vt enabled false> for {}s."
   2515                     .format(ads[0].serial, MAX_WAIT_TIME_VOLTE_ENABLED))
   2516                 return False
   2517             self.log.info(
   2518                 "Step4 Attempt to make VT call, verify call is AUDIO_ONLY.")
   2519             if not video_call_setup_teardown(
   2520                     self.log,
   2521                     ads[0],
   2522                     ads[1],
   2523                     ads[0],
   2524                     video_state=VT_STATE_BIDIRECTIONAL,
   2525                     verify_caller_func=is_phone_in_call_voice_hd,
   2526                     verify_callee_func=is_phone_in_call_voice_hd):
   2527                 self.log.error("Call failed or is not AUDIO_ONLY")
   2528                 return False
   2529 
   2530         finally:
   2531             ads[0].droid.telephonyToggleDataConnection(True)
   2532 
   2533         return True
   2534 
   2535 
   2536 """ Tests End """
   2537