blob: 2f628dd8311c2dcfcff70a8c70e3c08544463322 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2022 - Google
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import time
from acts_contrib.test_utils.net import ui_utils
from acts_contrib.test_utils.tel.tel_defines import CHIPSET_MODELS_LIST
from acts_contrib.test_utils.tel.tel_defines import GEN_4G
from acts_contrib.test_utils.tel.tel_defines import GEN_5G
from acts_contrib.test_utils.tel.tel_defines import KEYEVENT_DEL
from acts_contrib.test_utils.tel.tel_defines import MOBILE_DATA
from acts_contrib.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
from acts_contrib.test_utils.tel.tel_defines import SCROLL_DOWN
from acts_contrib.test_utils.tel.tel_defines import SCROLL_UP
from acts_contrib.test_utils.tel.tel_defines import SLOW_SCROLL_DOWN
from acts_contrib.test_utils.tel.tel_defines import USE_SIM
from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_BETWEEN_STATE_CHECK
from acts_contrib.test_utils.tel.tel_5g_test_utils import provision_device_for_5g
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_volte
from acts_contrib.test_utils.tel.tel_test_utils import get_current_override_network_type
from acts_contrib.test_utils.tel.tel_test_utils import is_droid_in_network_generation
ATT_APN = {
'Name': 'NXTGENPHONE',
'APN': 'NXTGENPHONE',
'MMSC': 'http://mmsc.mobile.att.net',
'MMS proxy': 'proxy.mobile.att.net',
'MMS port': '80',
'MCC': '310',
'MNC': '410',
'APN type': 'default,mms,supi,hipri',
'APN protocol': 'IPv4',
'APN roaming protocol': 'IPv4',
'MVNO type': 'None'
}
TMO_APN = {
'Name': 'TMOUS',
'APN': 'fast.t-mobile.com',
'MMSC': 'https://mms.msg.eng.t-mobile.com/mms/wapenc',
'MCC': '310',
'MNC': '260',
'APN type': 'default,supi,ia,mms,xcap',
'APN protocol': 'IPv6',
'APN roaming protocol': 'IPv4',
'MVNO type': 'None'
}
TMO_BEARER = ['HSPA', 'EVDO_B', 'eHRPD', 'LTE', 'HSPAP', 'GPRS', 'EDGE', 'UMTS', '1xRTT', 'EVDO_0',
'EVDO_A', 'HSDPA', 'HSUPA', 'IS95A', 'IS95B','NR']
def is_current_build_s(ad):
"""Verify current build is S
Args:
ad: android device object.
Returns:
True: If Build is S
False: If Build is not S
"""
build_id = ad.adb.shell('getprop ro.product.build.id')
s_build = False
if build_id[0] == 'S':
s_build = True
return s_build
def launch_SIMs_settings(ad):
"""Launch SIMs settings page
Args:
ad: android device object.
"""
ad.adb.shell('am start -a android.settings.WIRELESS_SETTINGS')
ui_utils.wait_and_click(ad, text='SIMs')
def get_resource_value(ad, label_text= None):
"""Get current resource value
Args:
ad: android device object.
label_text: Enter text to be detected
Return:
node attribute value
"""
if label_text == USE_SIM:
resource_id = 'android:id/switch_widget'
label_resource_id = 'com.android.settings:id/switch_text'
node_attribute = 'checked'
elif label_text == MOBILE_DATA:
resource_id = 'android:id/switch_widget'
label_resource_id = 'android:id/widget_frame'
label_text = ''
node_attribute = 'checked'
elif label_text == 'MCC' or label_text == 'MNC':
resource_id = 'android:id/summary'
label_resource_id = 'android:id/title'
node_attribute = 'text'
else:
ad.log.error(
'Missing arguments, resource_id, label_text and node_attribute'
)
resource = {
'resource_id': resource_id,
}
node = ui_utils.wait_and_get_xml_node(ad,
timeout=30,
sibling=resource,
text=label_text,
resource_id=label_resource_id)
return node.attributes[node_attribute].value
def toggle_sim_test(ad, nw_gen, nr_type=None):
"""Disable and Enable SIM settings
Args:
ad: android device object.
nw_gen: network generation the phone should be camped on.
nr_type: check NR network.
"""
s_build = is_current_build_s(ad)
if nw_gen == GEN_5G:
if not provision_device_for_5g(ad.log, ad, nr_type=nr_type):
return False
elif nw_gen == GEN_4G:
if not phone_setup_volte(ad.log, ad):
ad.log.error('Phone failed to enable LTE')
return False
launch_SIMs_settings(ad)
switch_value = get_resource_value(ad, USE_SIM)
if switch_value == 'true':
ad.log.info('SIM is enabled as expected')
else:
ad.log.error('SIM should be enabled but SIM is disabled')
return False
label_text = USE_SIM
label_resource_id = 'com.android.settings:id/switch_text'
ad.log.info('Start Disabling SIM')
ui_utils.wait_and_click(ad,
text=label_text,
resource_id=label_resource_id)
button_resource_id = 'android:id/button1'
if any(model in ad.model for model in CHIPSET_MODELS_LIST) and s_build:
ui_utils.wait_and_click(ad, text='YES', resource_id=button_resource_id)
else:
ui_utils.wait_and_click(ad, text='Yes', resource_id=button_resource_id)
switch_value = get_resource_value(ad, USE_SIM)
if switch_value == 'false':
ad.log.info('SIM is disabled as expected')
else:
ad.log.error('SIM should be disabled but SIM is enabled')
return False
ad.log.info('Start Enabling SIM')
ui_utils.wait_and_click(ad,
text=label_text,
resource_id=label_resource_id)
if any(model in ad.model for model in CHIPSET_MODELS_LIST) and s_build:
ui_utils.wait_and_click(ad, text='YES', resource_id=button_resource_id)
elif any(model in ad.model for model in CHIPSET_MODELS_LIST) and not s_build:
pass
else:
ui_utils.wait_and_click(ad, text='Yes', resource_id=button_resource_id)
switch_value = get_resource_value(ad, USE_SIM)
if switch_value == 'true':
ad.log.info('SIM is enabled as expected')
else:
ad.log.error('SIM should be enabled but SIM is disabled')
return False
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
if nw_gen == GEN_5G:
if not is_current_network_5g(ad, nr_type=nr_type, timeout=60):
ad.log.error('Unable to connect on 5G network')
return False
ad.log.info('Success! attached on 5G')
elif nw_gen == GEN_4G:
if not is_droid_in_network_generation(self.log, ad, GEN_4G,
NETWORK_SERVICE_DATA):
ad.log.error('Failure - expected LTE, current %s',
get_current_override_network_type(ad))
return False
ad.log.info('Success! attached on LTE')
return True
def toggle_mobile_data_test(ad, nw_gen, nr_type=None):
"""Disable and Enable SIM settings
Args:
ad: android device object.
nw_gen: network generation the phone should be camped on.
nr_type: check NR network.
"""
if nw_gen == GEN_5G:
if not provision_device_for_5g(ad.log, ad, nr_type=nr_type):
return False
elif nw_gen == GEN_4G:
if not phone_setup_volte(ad.log, ad):
ad.log.error('Phone failed to enable LTE')
return False
launch_SIMs_settings(ad)
switch_value = get_resource_value(ad, MOBILE_DATA)
if switch_value != 'true':
ad.log.error('Mobile data should be enabled but it is disabled')
return False
ad.log.info('Mobile data is enabled as expected')
ad.log.info('Start Disabling mobile data')
ad.droid.telephonyToggleDataConnection(False)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
switch_value = get_resource_value(ad, MOBILE_DATA)
if switch_value != 'false':
ad.log.error('Mobile data should be disabled but it is enabled')
return False
ad.log.info('Mobile data is disabled as expected')
ad.log.info('Start Enabling mobile data')
ad.droid.telephonyToggleDataConnection(True)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
switch_value = get_resource_value(ad, MOBILE_DATA)
if switch_value == 'true':
ad.log.error('Mobile data should be enabled but it is disabled')
return False
ad.log.info('Mobile data is enabled as expected')
if nw_gen == GEN_5G:
if not is_current_network_5g(ad, nr_type=nr_type, timeout=60):
ad.log.error('Failure - expected NR_NSA, current %s',
get_current_override_network_type(ad))
ad.log.info('Success! attached on 5g NSA')
elif nw_gen == GEN_4G:
if not is_droid_in_network_generation(self.log, ad, GEN_4G,
NETWORK_SERVICE_DATA):
ad.log.error('Failure - expected LTE, current %s',
get_current_override_network_type(ad))
return False
ad.log.info('Success! attached on LTE')
return True
def verify_mcc_mnc_value(ad, current_value, expected_value, key):
"""Verify MCC and MNC value
Args:
ad: Android device object.
current_value: Current value of property.
expected_value: Expected value of property.
key: Properties for APN settings either MCC or MNC.
"""
if current_value != expected_value:
ad.log.info('Current %s value is %s, change it to %s'
% (key, current_mcc_value, expected_value))
ui_utils.wait_and_click(ad, text=key)
for _ in range(len(current_value)):
caller.adb.shell(KEYEVENT_DEL)
ui_utils.wait_and_input_text(ad, expected_value)
ui_utils.wait_and_click(caller, text='OK', resource_id='android:id/button1')
ad.log.info('Verified Current %s value matched with required value', key)
def wait_and_input_value(ad, key, value):
"""Enter input value to the key using UI
Args:
ad: Android device object.
key: Properties for APN settings.
value: Value to be entered for corresponding key.
"""
ui_utils.wait_and_click(ad, text=key)
ad.log.info('Enter %s: %s' % (key, value))
ui_utils.wait_and_input_text(ad, value)
if key not in ['APN roaming protocol', 'APN protocol', 'MVNO type']:
ui_utils.wait_and_click(ad, text='OK', resource_id='android:id/button1')
def att_apn_test(log, caller, callee, nw_gen, nr_type=None, msg_type=None):
"""ATT APN Test
Args:
log: Log object.
caller: android device object as caller.
callee: android device object as callee.
nw_gen: network generation the phone should be camped on.
nr_type: check NR network.
msg_type: messaging type sms or mms
"""
if nw_gen == GEN_5G:
mo_rat='5g'
if not provision_device_for_5g(caller.log, caller, nr_type=nr_type):
return False
elif nw_gen == GEN_4G:
mo_rat='volte'
if not phone_setup_volte(caller.log, caller):
caller.log.error('Phone failed to enable LTE')
return False
else:
mo_rat='general'
launch_SIMs_settings(caller)
# Scroll down
if not ui_utils.has_element(caller, text='Access Point Names'):
for _ in range(3):
caller.adb.shell(SCROLL_DOWN)
ui_utils.wait_and_click(caller, text='Access Point Names')
ui_utils.wait_and_click(caller, content_desc='New APN')
wait_and_input_value(caller, 'Name', ATT_APN['Name'])
wait_and_input_value(caller, 'APN', ATT_APN['APN'])
wait_and_input_value(caller, 'MMSC', ATT_APN['MMSC'])
# Scroll down
caller.adb.shell(SCROLL_DOWN)
wait_and_input_value(caller, 'MMS proxy', ATT_APN['MMS proxy'])
wait_and_input_value(caller, 'MMS port', ATT_APN['MMS port'])
caller.log.info('Enter MCC value: %s', ATT_APN['MCC'])
current_mcc_value = get_resource_value(caller,'MCC')
verify_mcc_mnc_value(caller, current_mcc_value, ATT_APN['MCC'], 'MCC')
# Scroll down
caller.adb.shell(SCROLL_DOWN)
caller.log.info('Enter MNC value: %s', ATT_APN['MNC'])
current_mnc_value = get_resource_value(caller,'MNC')
verify_mcc_mnc_value(caller, current_mnc_value, ATT_APN['MNC'], 'MNC')
# Scroll down
caller.adb.shell(SCROLL_DOWN)
wait_and_input_value(caller, 'APN type', ATT_APN['APN type'])
# Scroll down
caller.adb.shell(SCROLL_DOWN)
wait_and_input_value(caller, 'APN protocol', ATT_APN['APN protocol'])
wait_and_input_value(caller, 'APN roaming protocol', ATT_APN['APN roaming protocol'])
# Scroll down
caller.adb.shell(SCROLL_DOWN)
wait_and_input_value(caller, 'MVNO type', ATT_APN['MVNO type'])
ui_utils.wait_and_click(caller, content_desc='More options')
ui_utils.wait_and_click(caller, text='Save', resource_id='android:id/title')
node = ui_utils.wait_and_get_xml_node(caller, timeout=30, text=ATT_APN['Name'])
bounds = node.parentNode.nextSibling.attributes['bounds'].value
ui_utils.wait_and_click(caller,
text='',
resource_id='com.android.settings:id/apn_radiobutton',
bounds= bounds)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
if msg_type is not None:
message_test(
log,
caller,
callee,
mo_rat=mo_rat,
mt_rat='general',
msg_type=msg_type)
def tmo_apn_test(log, caller, callee, nw_gen, nr_type=None, msg_type=None):
"""TMO APN Test
Args:
log: Log object.
caller: android device object as caller.
callee: android device object as callee.
nw_gen: network generation the phone should be camped on.
nr_type: check NR network.
msg_type: messaging type sms or mms
"""
if nw_gen == GEN_5G:
mo_rat='5g'
if not provision_device_for_5g(caller.log, caller, nr_type=nr_type):
return False
elif nw_gen == GEN_4G:
mo_rat='volte'
if not phone_setup_volte(caller.log, caller):
caller.log.error('Phone failed to enable LTE')
return False
else:
mo_rat='general'
launch_SIMs_settings(caller)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
if not ui_utils.has_element(caller, text='Access Point Names'):
for _ in range(5):
caller.adb.shell(SCROLL_DOWN)
ui_utils.wait_and_click(caller, text='Access Point Names')
ui_utils.wait_and_click(caller, content_desc='New APN')
wait_and_input_value(caller, 'Name', TMO_APN['Name'])
wait_and_input_value(caller, 'APN', TMO_APN['APN'])
wait_and_input_value(caller, 'MMSC', TMO_APN['MMSC'])
# Scroll down
caller.adb.shell(SLOW_SCROLL_DOWN)
caller.log.info('Enter MCC value: %s', TMO_APN['MCC'])
current_mcc_value = get_resource_value(caller,'MCC')
verify_mcc_mnc_value(caller, current_mcc_value, TMO_APN['MCC'], 'MCC')
# Scroll down
caller.adb.shell(SLOW_SCROLL_DOWN)
caller.log.info('Enter MNC value: %s', TMO_APN['MNC'])
current_mnc_value = get_resource_value(caller,'MNC')
verify_mcc_mnc_value(caller, current_mnc_value, TMO_APN['MNC'], 'MNC')
wait_and_input_value(caller, 'APN type', TMO_APN['APN type'])
# Scroll down
caller.adb.shell(SLOW_SCROLL_DOWN)
wait_and_input_value(caller, 'APN protocol', TMO_APN['APN protocol'])
wait_and_input_value(caller, 'APN roaming protocol', TMO_APN['APN roaming protocol'])
wait_and_input_value(caller, 'MVNO type', TMO_APN['MVNO type'])
caller.log.info('Click following supported network: %s', TMO_BEARER)
ui_utils.wait_and_click(caller, text='Bearer')
for network in TMO_BEARER:
if ((network == 'NR') or
(network == 'IS95B') or
(network == 'IS95A') or
(network == 'EVDO_0') or
(network == '1xRTT')):
# Scroll down
caller.adb.shell(SLOW_SCROLL_DOWN)
ui_utils.wait_and_click(caller, text=network)
caller.log.info('Enabled %s', network)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
# Scroll up
caller.adb.shell(SCROLL_UP)
else:
ui_utils.wait_and_click(caller, text=network)
caller.log.info('Enabled %s', network)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
ui_utils.wait_and_click(caller, text='OK', resource_id='android:id/button1')
ui_utils.wait_and_click(caller, content_desc='More options')
ui_utils.wait_and_click(caller, text='Save', resource_id='android:id/title')
node = ui_utils.wait_and_get_xml_node(caller, timeout=30, text=TMO_APN['Name'])
bounds = node.parentNode.nextSibling.attributes['bounds'].value
caller.log.info('Bounds: %s', bounds)
ui_utils.wait_and_click(caller,
text='',
resource_id='com.android.settings:id/apn_radiobutton',
bounds= bounds)
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
if msg_type is not None:
message_test(
log,
caller,
callee,
mo_rat=mo_rat,
mt_rat='general',
msg_type=msg_type)