blob: f5f44d95249b09dde630ac3a1a7ca773a57b69a8 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2022 The Fuchsia Authors
#
# 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.
from mobly import signals, test_runner
from antlion.test_utils.wifi import base_test
class RegulatoryRecoveryTest(base_test.WifiBaseTest):
"""Tests the policy layer's response to setting country code.
Test Bed Requirements:
* One Fuchsia device that is capable of operating as a WLAN client and AP.
Example Config:
"regulatory_recovery_test_params": {
"country_code": "US"
}
If no configuration information is provided, the test will default to
toggling between WW and US.
"""
def setup_class(self):
super().setup_class()
if len(self.fuchsia_devices) < 1:
raise EnvironmentError("No Fuchsia devices found.")
self.config_test_params = self.user_params.get(
"regulatory_recovery_test_params", {}
)
self.country_code = self.config_test_params.get("country_code", "US")
self.negative_test = self.config_test_params.get("negative_test", False)
for fd in self.fuchsia_devices:
fd.configure_wlan(association_mechanism="policy")
def teardown_class(self):
if not self.negative_test:
for fd in self.fuchsia_devices:
fd.wlan_controller.set_country_code(self.country_code)
super().teardown_class()
def setup_test(self):
for fd in self.fuchsia_devices:
# Remove all network configs. These tests do not require
# connecting to a network, they merely verify whether or not client
# mode is functional.
if not fd.wlan_policy_controller.remove_all_networks():
raise EnvironmentError("Failed to remove all networks in setup")
# To ensure that DUTs are initially in a known state, set all of
# their PHYs to world-wide mode. Also disable client and AP
# functionality so that there is no automated WLAN behavior.
fd.wlan_controller.set_country_code("WW")
fd.wlan_policy_controller.stop_client_connections()
fd.sl4f.wlan_ap_policy_lib.wlanStopAllAccessPoint()
def set_country_code(self, fd):
try:
fd.wlan_controller.set_country_code(self.country_code)
except EnvironmentError as e:
if self.negative_test:
# In the negative case, setting the country code for an
# invalid country should fail.
pass
else:
# If this is not a negative test case, re-raise the
# exception.
raise e
else:
# The negative test case should have failed to set the country
# code and the positive test case should succeed.
if self.negative_test:
raise EnvironmentError("Setting invalid country code succeeded.")
else:
pass
def test_interfaces_not_recreated_when_initially_disabled(self):
"""This test ensures that after a new regulatory region is applied
while client connections and access points are disabled, no new
interfaces are automatically recreated.
"""
for fd in self.fuchsia_devices:
# Set the region code.
self.set_country_code(fd)
# Reset the listeners and verify the current state.
fd.sl4f.wlan_policy_lib.wlanSetNewListener()
fd.sl4f.wlan_ap_policy_lib.wlanSetNewListener()
# Verify that the client and AP are still stopped.
client_state = fd.sl4f.wlan_policy_lib.wlanGetUpdate()
if client_state["error"]:
raise signals.TestFailure(
"error querying client state: {}".format(client_state["error"])
)
elif client_state["result"]["state"] != "ConnectionsDisabled":
raise signals.TestFailure(
"client connections in unexpected state: {}".format(
client_state["result"]["state"]
)
)
ap_state = fd.sl4f.wlan_ap_policy_lib.wlanGetUpdate()
if ap_state["error"]:
raise signals.TestFailure(
"error querying AP state: {}".format(ap_state["error"])
)
ap_updates = ap_state["result"]
if ap_updates:
raise signals.TestFailure(
"AP in unexpected state: {}".format(ap_updates)
)
def test_interfaces_recreated_when_initially_enabled(self):
"""This test ensures that after a new regulatory region is applied
while client connections and access points are enabled, all
interfaces are recreated.
"""
test_ssid = "test_ssid"
test_security_type = "none"
for fd in self.fuchsia_devices:
# Start client connections and start an AP before setting the
# country code.
fd.wlan_policy_controller.start_client_connections()
fd.sl4f.wlan_ap_policy_lib.wlanStartAccessPoint(
test_ssid, test_security_type, "", "local_only", "any"
)
# Set the country code.
self.set_country_code(fd)
# Reset the listeners and verify the current state.
fd.sl4f.wlan_policy_lib.wlanSetNewListener()
fd.sl4f.wlan_ap_policy_lib.wlanSetNewListener()
# Verify that client connections are enabled and the AP is brought
# up again.
client_state = fd.sl4f.wlan_policy_lib.wlanGetUpdate()
if client_state["error"]:
raise signals.TestFailure(
"error querying client state: {}".format(client_state["error"])
)
elif client_state["result"]["state"] != "ConnectionsEnabled":
raise signals.TestFailure(
"client connections in unexpected state: {}".format(
client_state["result"]["state"]
)
)
ap_state = fd.sl4f.wlan_ap_policy_lib.wlanGetUpdate()
if ap_state["error"]:
raise signals.TestFailure(
"error querying AP state: {}".format(ap_state["error"])
)
ap_updates = ap_state["result"]
if len(ap_updates) != 1:
raise signals.TestFailure("No APs are running: {}".format(ap_updates))
else:
if (
ap_updates[0]["id"]["ssid"] != test_ssid
or ap_updates[0]["id"]["type_"].lower() != test_security_type
):
raise signals.TestFailure(
"AP in unexpected state: {}".format(ap_updates[0])
)
if __name__ == "__main__":
test_runner.main()