Home | History | Annotate | Download | only in wifi
      1 #
      2 #   Copyright 2014 - The Android Open Source Project
      3 #
      4 #   Licensed under the Apache License, Version 2.0 (the "License");
      5 #   you may not use this file except in compliance with the License.
      6 #   You may obtain a copy of the License at
      7 #
      8 #       http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 #   Unless required by applicable law or agreed to in writing, software
     11 #   distributed under the License is distributed on an "AS IS" BASIS,
     12 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 #   See the License for the specific language governing permissions and
     14 #   limitations under the License.
     15 
     16 import time
     17 
     18 import acts.base_test
     19 import acts.test_utils.wifi.wifi_test_utils as wutils
     20 
     21 from acts import asserts
     22 
     23 WifiEnums = wutils.WifiEnums
     24 WifiEventNames = wutils.WifiEventNames
     25 
     26 class WifiPnoTest(acts.base_test.BaseTestClass):
     27 
     28     def __init__(self, controllers):
     29         acts.base_test.BaseTestClass.__init__(self, controllers)
     30         self.tests = (
     31             "test_simple_pno_connection",
     32             "test_pno_connection_with_multiple_saved_networks",
     33         )
     34 
     35     def setup_class(self):
     36         self.dut = self.android_devices[0]
     37         wutils.wifi_test_device_init(self.dut)
     38         req_params = (
     39             "attn_vals",
     40             "pno_network_a",
     41             "pno_network_b",
     42             "pno_interval"
     43         )
     44         self.unpack_userparams(req_params)
     45         self.attn_a = self.attenuators[0]
     46         self.attn_b = self.attenuators[1]
     47         self.set_attns("default")
     48 
     49     def setup_test(self):
     50         self.dut.droid.wifiStartTrackingStateChange()
     51         self.dut.droid.wakeLockAcquireBright()
     52         self.dut.droid.wakeUpNow()
     53         wutils.reset_wifi(self.dut)
     54         self.dut.ed.clear_all_events()
     55 
     56     def teardown_test(self):
     57         self.dut.droid.wifiStopTrackingStateChange()
     58         self.dut.droid.wakeLockRelease()
     59         self.dut.droid.goToSleepNow()
     60         wutils.reset_wifi(self.dut)
     61         self.dut.ed.clear_all_events()
     62         self.set_attns("default")
     63 
     64     def on_fail(self, test_name, begin_time):
     65         self.dut.take_bug_report(test_name, begin_time)
     66         self.dut.cat_adb_log(test_name, begin_time)
     67 
     68     """Helper Functions"""
     69     def set_attns(self, attn_val_name):
     70         """Sets attenuation values on attenuators used in this test.
     71 
     72         Args:
     73             attn_val_name: Name of the attenuation value pair to use.
     74         """
     75         msg = "Set attenuation values to %s" % self.attn_vals[attn_val_name]
     76         self.log.info(msg)
     77         try:
     78             self.attn_a.set_atten(self.attn_vals[attn_val_name][0])
     79             self.attn_b.set_atten(self.attn_vals[attn_val_name][1])
     80         except:
     81             msg = "Failed to set attenuation values %s." % attn_val_name
     82             self.log.error(msg)
     83             raise
     84 
     85     def trigger_pno_and_assert_connect(self, attn_val_name, expected_con):
     86         """Sets attenuators to disconnect current connection and power-off the
     87         screen to trigger PNO. Validate that the DUT connected to the new SSID
     88         as expected after PNO.
     89 
     90         Args:
     91             attn_val_name: Name of the attenuation value pair to use.
     92             expected_con: The expected info of the network to we expect the DUT
     93                 to roam to.
     94         """
     95         connection_info = self.dut.droid.wifiGetConnectionInfo()
     96         self.log.info("Triggering PNO connect from %s to %s" %
     97             (connection_info[WifiEnums.SSID_KEY],
     98                 expected_con[WifiEnums.SSID_KEY]))
     99         self.dut.droid.goToSleepNow()
    100         self.set_attns(attn_val_name)
    101         self.log.info("Wait %ss for PNO to trigger." % self.pno_interval)
    102         time.sleep(self.pno_interval)
    103         try:
    104             self.dut.droid.wakeLockAcquireBright()
    105             self.dut.droid.wakeUpNow()
    106             expected_ssid = expected_con[WifiEnums.SSID_KEY]
    107             verify_con = { WifiEnums.SSID_KEY : expected_ssid }
    108             wutils.verify_wifi_connection_info(self.dut, verify_con)
    109             self.log.info("Connected to %s successfully after PNO" %
    110                 expected_ssid)
    111         finally:
    112             self.dut.droid.wifiLockRelease()
    113             self.dut.droid.goToSleepNow()
    114 
    115     def add_dummy_networks(self, num_networks):
    116         """Add some dummy networks to the device.
    117 
    118         Args:
    119             num_networks: Number of networks to add.
    120         """
    121         ssid_name_base = "pno_dummy_network_"
    122         for i in range(0, num_networks) :
    123             network = {}
    124             network[WifiEnums.SSID_KEY] = ssid_name_base + str(i)
    125             network[WifiEnums.PWD_KEY] = "pno_dummy";
    126             asserts.assert_true(self.dut.droid.wifiAddNetwork(network) != -1,
    127                 "Add network %r failed" % network)
    128 
    129     """ Tests Begin """
    130     def test_simple_pno_connection(self):
    131         """Test PNO triggered autoconnect to a network.
    132 
    133         Steps:
    134         1. Save 2 valid network configurations (a & b) in the device.
    135         2. Attenuate network b.
    136         3. Connect the device to network a.
    137         4. Switch off the screen on the device.
    138         5. Attenuate network a and remove attenuation on network b and wait for
    139            a few seconds to trigger PNO.
    140         6. Check the device connected to network b automatically.
    141         7. Switch off the screen on the device.
    142         8. Attenuate network b and remove attenuation on network a and wait for
    143            a few seconds to trigger PNO.
    144         9. Check the device connected to network a automatically.
    145         """
    146         asserts.assert_true(
    147             self.dut.droid.wifiAddNetwork(self.pno_network_a) != -1,
    148             "Add network %r failed" % self.pno_network_a)
    149         asserts.assert_true(
    150             self.dut.droid.wifiAddNetwork(self.pno_network_b) != -1,
    151             "Add network %r failed" % self.pno_network_b)
    152         self.set_attns("a_on_b_off")
    153         wutils.wifi_connect(self.dut, self.pno_network_a),
    154         self.trigger_pno_and_assert_connect("b_on_a_off", self.pno_network_b)
    155         self.trigger_pno_and_assert_connect("a_on_b_off", self.pno_network_a)
    156 
    157     def test_pno_connection_with_multiple_saved_networks(self):
    158         """Test PNO triggered autoconnect to a network when there are more
    159         than 16 networks saved in the device.
    160 
    161         16 is the max list size of PNO watch list for most devices. The device
    162         should automatically pick the 16 latest added networks in the list.
    163         So add 16 dummy networks and then add 2 valid networks.
    164 
    165         Steps:
    166         1. Save 16 dummy network configurations in the device.
    167         2. Run the simple pno test.
    168         """
    169         self.add_dummy_networks(16)
    170         self.test_simple_pno_connection()
    171     """ Tests End """
    172