blob: 997b77b3f10539f42e6db2a77fec79e8267253a7 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2021 - 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.tel.tel_defines import TYPE_WIFI
from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_BETWEEN_STATE_CHECK
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.tel_test_utils import verify_internet_connection
from acts_contrib.test_utils.wifi import wifi_test_utils
WIFI_SSID_KEY = wifi_test_utils.WifiEnums.SSID_KEY
WIFI_PWD_KEY = wifi_test_utils.WifiEnums.PWD_KEY
WIFI_CONFIG_APBAND_2G = 1
WIFI_CONFIG_APBAND_5G = 2
WIFI_CONFIG_APBAND_AUTO = wifi_test_utils.WifiEnums.WIFI_CONFIG_APBAND_AUTO
def get_wifi_signal_strength(ad):
signal_strength = ad.droid.wifiGetConnectionInfo()['rssi']
ad.log.info("WiFi Signal Strength is %s" % signal_strength)
return signal_strength
def get_wifi_usage(ad, sid=None, apk=None):
if not sid:
sid = ad.droid.subscriptionGetDefaultDataSubId()
current_time = int(time.time() * 1000)
begin_time = current_time - 10 * 24 * 60 * 60 * 1000
end_time = current_time + 10 * 24 * 60 * 60 * 1000
if apk:
uid = ad.get_apk_uid(apk)
ad.log.debug("apk %s uid = %s", apk, uid)
try:
return ad.droid.connectivityQueryDetailsForUid(
TYPE_WIFI,
ad.droid.telephonyGetSubscriberIdForSubscription(sid),
begin_time, end_time, uid)
except:
return ad.droid.connectivityQueryDetailsForUid(
ad.droid.telephonyGetSubscriberIdForSubscription(sid),
begin_time, end_time, uid)
else:
try:
return ad.droid.connectivityQuerySummaryForDevice(
TYPE_WIFI,
ad.droid.telephonyGetSubscriberIdForSubscription(sid),
begin_time, end_time)
except:
return ad.droid.connectivityQuerySummaryForDevice(
ad.droid.telephonyGetSubscriberIdForSubscription(sid),
begin_time, end_time)
def check_is_wifi_connected(log, ad, wifi_ssid):
"""Check if ad is connected to wifi wifi_ssid.
Args:
log: Log object.
ad: Android device object.
wifi_ssid: WiFi network SSID.
Returns:
True if wifi is connected to wifi_ssid
False if wifi is not connected to wifi_ssid
"""
wifi_info = ad.droid.wifiGetConnectionInfo()
if wifi_info["supplicant_state"] == "completed" and wifi_info["SSID"] == wifi_ssid:
ad.log.info("Wifi is connected to %s", wifi_ssid)
ad.on_mobile_data = False
return True
else:
ad.log.info("Wifi is not connected to %s", wifi_ssid)
ad.log.debug("Wifi connection_info=%s", wifi_info)
ad.on_mobile_data = True
return False
def ensure_wifi_connected(log, ad, wifi_ssid, wifi_pwd=None, retries=3, apm=False):
"""Ensure ad connected to wifi on network wifi_ssid.
Args:
log: Log object.
ad: Android device object.
wifi_ssid: WiFi network SSID.
wifi_pwd: optional secure network password.
retries: the number of retries.
Returns:
True if wifi is connected to wifi_ssid
False if wifi is not connected to wifi_ssid
"""
if not toggle_airplane_mode(log, ad, apm, strict_checking=False):
return False
network = {WIFI_SSID_KEY: wifi_ssid}
if wifi_pwd:
network[WIFI_PWD_KEY] = wifi_pwd
for i in range(retries):
if not ad.droid.wifiCheckState():
ad.log.info("Wifi state is down. Turn on Wifi")
ad.droid.wifiToggleState(True)
if check_is_wifi_connected(log, ad, wifi_ssid):
ad.log.info("Wifi is connected to %s", wifi_ssid)
return verify_internet_connection(log, ad, retries=3)
else:
ad.log.info("Connecting to wifi %s", wifi_ssid)
try:
ad.droid.wifiConnectByConfig(network)
except Exception:
ad.log.info("Connecting to wifi by wifiConnect instead")
ad.droid.wifiConnect(network)
time.sleep(20)
if check_is_wifi_connected(log, ad, wifi_ssid):
ad.log.info("Connected to Wifi %s", wifi_ssid)
return verify_internet_connection(log, ad, retries=3)
ad.log.info("Fail to connected to wifi %s", wifi_ssid)
return False
def forget_all_wifi_networks(log, ad):
"""Forget all stored wifi network information
Args:
log: log object
ad: AndroidDevice object
Returns:
boolean success (True) or failure (False)
"""
if not ad.droid.wifiGetConfiguredNetworks():
ad.on_mobile_data = True
return True
try:
old_state = ad.droid.wifiCheckState()
wifi_test_utils.reset_wifi(ad)
wifi_toggle_state(log, ad, old_state)
except Exception as e:
log.error("forget_all_wifi_networks with exception: %s", e)
return False
ad.on_mobile_data = True
return True
def wifi_reset(log, ad, disable_wifi=True):
"""Forget all stored wifi networks and (optionally) disable WiFi
Args:
log: log object
ad: AndroidDevice object
disable_wifi: boolean to disable wifi, defaults to True
Returns:
boolean success (True) or failure (False)
"""
if not forget_all_wifi_networks(log, ad):
ad.log.error("Unable to forget all networks")
return False
if not wifi_toggle_state(log, ad, not disable_wifi):
ad.log.error("Failed to toggle WiFi state to %s!", not disable_wifi)
return False
return True
def set_wifi_to_default(log, ad):
"""Set wifi to default state (Wifi disabled and no configured network)
Args:
log: log object
ad: AndroidDevice object
Returns:
boolean success (True) or failure (False)
"""
ad.droid.wifiFactoryReset()
ad.droid.wifiToggleState(False)
ad.on_mobile_data = True
def wifi_toggle_state(log, ad, state, retries=3):
"""Toggle the WiFi State
Args:
log: log object
ad: AndroidDevice object
state: True, False, or None
Returns:
boolean success (True) or failure (False)
"""
for i in range(retries):
if wifi_test_utils.wifi_toggle_state(ad, state, assert_on_fail=False):
ad.on_mobile_data = not state
return True
time.sleep(WAIT_TIME_BETWEEN_STATE_CHECK)
return False
def start_wifi_tethering(log, ad, ssid, password, ap_band=None):
"""Start a Tethering Session
Args:
log: log object
ad: AndroidDevice object
ssid: the name of the WiFi network
password: optional password, used for secure networks.
ap_band=DEPRECATED specification of 2G or 5G tethering
Returns:
boolean success (True) or failure (False)
"""
return wifi_test_utils._assert_on_fail_handler(
wifi_test_utils.start_wifi_tethering,
False,
ad,
ssid,
password,
band=ap_band)
def stop_wifi_tethering(log, ad):
"""Stop a Tethering Session
Args:
log: log object
ad: AndroidDevice object
Returns:
boolean success (True) or failure (False)
"""
return wifi_test_utils._assert_on_fail_handler(
wifi_test_utils.stop_wifi_tethering, False, ad)