blob: efd872988123805ed4bb2d1f87cb6da7eeb60f76 [file] [log] [blame]
#!/usr/bin/env python3.4
#
# Copyright (C) 2020 The Android Open Source Project
#
# 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.
#
"""This test exercises the Scan functionality for the WLAN Policy API."""
from datetime import datetime
from acts import signals, utils
from acts.controllers.ap_lib import (hostapd_ap_preset, hostapd_bss_settings,
hostapd_constants, hostapd_security)
from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest
class PolicyScanTest(WifiBaseTest):
"""WLAN policy scan test class.
Test Bed Requirement:
* One or more Fuchsia devices
* One Whirlwind Access Point
"""
def setup_class(self):
super().setup_class()
if len(self.fuchsia_devices) < 1:
raise signals.TestFailure("No fuchsia devices found.")
for fd in self.fuchsia_devices:
fd.configure_wlan(association_mechanism='policy',
preserve_saved_networks=True)
if len(self.access_points) < 1:
raise signals.TestFailure("No access points found.")
# Prepare the AP
self.access_point = self.access_points[0]
self.access_point.stop_all_aps()
# Generate network params.
bss_settings_2g = []
bss_settings_5g = []
open_network = self.get_open_network(False, [])
self.open_network_2g = open_network["2g"]
self.open_network_5g = open_network["5g"]
wpa2_settings = self.get_psk_network(False, [])
self.wpa2_network_2g = wpa2_settings["2g"]
self.wpa2_network_5g = wpa2_settings["5g"]
bss_settings_2g.append(
hostapd_bss_settings.BssSettings(
name=self.wpa2_network_2g["SSID"],
ssid=self.wpa2_network_2g["SSID"],
security=hostapd_security.Security(
security_mode=self.wpa2_network_2g["security"],
password=self.wpa2_network_2g["password"])))
bss_settings_5g.append(
hostapd_bss_settings.BssSettings(
name=self.wpa2_network_5g["SSID"],
ssid=self.wpa2_network_5g["SSID"],
security=hostapd_security.Security(
security_mode=self.wpa2_network_5g["security"],
password=self.wpa2_network_5g["password"])))
self.ap_2g = hostapd_ap_preset.create_ap_preset(
iface_wlan_2g=self.access_points[0].wlan_2g,
iface_wlan_5g=self.access_points[0].wlan_5g,
channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
ssid=self.open_network_2g["SSID"],
bss_settings=bss_settings_2g)
self.ap_5g = hostapd_ap_preset.create_ap_preset(
iface_wlan_2g=self.access_points[0].wlan_2g,
iface_wlan_5g=self.access_points[0].wlan_5g,
channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
ssid=self.open_network_5g["SSID"],
bss_settings=bss_settings_5g)
# Start the networks
self.access_point.start_ap(hostapd_config=self.ap_2g)
self.access_point.start_ap(hostapd_config=self.ap_5g)
# Save the SSIDs
self.all_ssids = [
self.open_network_2g["SSID"],
self.wpa2_network_2g["SSID"],
self.open_network_5g["SSID"],
self.wpa2_network_5g["SSID"],
]
def setup_test(self):
for fd in self.fuchsia_devices:
# stub for setting up all the fuchsia devices in the testbed.
return fd.wlan_policy_controller.remove_all_networks_and_wait_for_no_connections(
)
def teardown_test(self):
for fd in self.fuchsia_devices:
# stub until policy layer has something useful to use here.
pass
def teardown_class(self):
pass
def on_fail(self, test_name, begin_time):
for fd in self.fuchsia_devices:
try:
fd.take_bug_report(test_name, begin_time)
fd.get_log(test_name, begin_time)
except Exception:
pass
try:
if fd.device.hard_reboot_on_fail:
fd.hard_power_cycle(self.pdu_devices)
except AttributeError:
pass
"""Helper Functions"""
def perform_scan(self, fd):
""" Initiates scan on a Fuchsia device and returns results
Args:
fd: A fuchsia device
Raises:
signals.TestFailure: if an error is reported by the device during
the scan
Returns:
A list of scan results
"""
start_time = datetime.now()
scan_response = fd.wlan_policy_lib.wlanScanForNetworks()
# first check if we received an error
if scan_response.get("error") is not None:
# the response indicates an error - log and raise failure
raise signals.TestFailure("Aborting test - scan failed with "
"error: %s" % scan_response.get("error"))
# the scan command did not get an error response - go ahead
# and check for scan results
scan_results = scan_response["result"]
total_time_ms = (datetime.now() - start_time).total_seconds() * 1000
self.log.info("scan contained %d results", len(scan_results))
self.log.info("scan time: %d ms", total_time_ms)
return scan_results
def connect_to_network(self, wlan_network_params, fd):
""" Connects the Fuchsia device to the specified network
Args:
wlan_network_params: A dictionary containing wlan information.
fd: A fuchsia device
Raises:
signals.TestFailure: if the device fails to connect
"""
target_ssid = wlan_network_params["SSID"]
target_pwd = wlan_network_params.get("password")
target_security = wlan_network_params.get("security")
# TODO(mnck): use the Policy version of this call, when it is available.
connection_response = fd.wlan_policy_controller.save_and_connect(
target_ssid, target_security, password=target_pwd)
if not connection_response:
raise signals.TestFailure("Aborting test - Connect call failed")
self.log.info("Network connection successful.")
def assert_network_is_in_results(self, scan_results, *, ssid):
""" Verified scan results contain a specified network
Args:
scan_results: Scan results from a fuchsia Policy API scan
ssid: SSID for network that should be in the results
Raises:
signals.TestFailure: if the network is not present in the scan
results
"""
if ssid not in scan_results:
raise signals.TestFailure(
'Network "%s" was not found in scan results: %s', ssid,
scan_results)
"""Tests"""
def test_basic_scan_request(self):
"""Verify a scan returns all expected networks"""
for fd in self.fuchsia_devices:
scan_results = self.perform_scan(fd)
if len(scan_results) == 0:
raise signals.TestFailure("Scan failed or did not "
"find any networks")
for ssid in self.all_ssids:
self.assert_network_is_in_results(scan_results, ssid=ssid)
def test_scan_while_connected_open_network_2g(self):
"""Connect to an open 2g network and perform a scan"""
for fd in self.fuchsia_devices:
self.connect_to_network(self.open_network_2g, fd)
scan_results = self.perform_scan(fd)
for ssid in self.all_ssids:
self.assert_network_is_in_results(scan_results, ssid=ssid)
def test_scan_while_connected_wpa2_network_2g(self):
"""Connect to a WPA2 2g network and perform a scan"""
for fd in self.fuchsia_devices:
self.connect_to_network(self.wpa2_network_2g, fd)
scan_results = self.perform_scan(fd)
for ssid in self.all_ssids:
self.assert_network_is_in_results(scan_results, ssid=ssid)
def test_scan_while_connected_open_network_5g(self):
"""Connect to an open 5g network and perform a scan"""
for fd in self.fuchsia_devices:
self.connect_to_network(self.open_network_5g, fd)
scan_results = self.perform_scan(fd)
for ssid in self.all_ssids:
self.assert_network_is_in_results(scan_results, ssid=ssid)
def test_scan_while_connected_wpa2_network_5g(self):
"""Connect to a WPA2 5g network and perform a scan"""
for fd in self.fuchsia_devices:
self.connect_to_network(self.wpa2_network_5g, fd)
scan_results = self.perform_scan(fd)
for ssid in self.all_ssids:
self.assert_network_is_in_results(scan_results, ssid=ssid)