Home | History | Annotate | Download | only in wifi
      1 #!/usr/bin/env python3.4
      2 #
      3 #   Copyright 2016 - The Android Open Source Project
      4 #
      5 #   Licensed under the Apache License, Version 2.0 (the "License");
      6 #   you may not use this file except in compliance with the License.
      7 #   You may obtain a copy of the License at
      8 #
      9 #       http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 #   Unless required by applicable law or agreed to in writing, software
     12 #   distributed under the License is distributed on an "AS IS" BASIS,
     13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 #   See the License for the specific language governing permissions and
     15 #   limitations under the License.
     16 
     17 import time
     18 
     19 from acts import asserts
     20 from acts.base_test import BaseTestClass
     21 from acts.test_utils.wifi.wifi_test_utils import wifi_forget_network
     22 from acts.test_utils.wifi.wifi_test_utils import wifi_test_device_init
     23 from acts.test_utils.wifi.wifi_test_utils import WifiEnums
     24 from acts.test_utils.wifi.wifi_test_utils import start_wifi_connection_scan
     25 from acts.test_utils.wifi.wifi_test_utils import check_internet_connection
     26 from acts.test_utils.wifi.wifi_test_utils import track_connection
     27 
     28 NETWORK_ID_ERROR = "Network don't have ID"
     29 NETWORK_ERROR = "Device is not connected to reference network"
     30 
     31 class WifiAutoJoinTest(BaseTestClass):
     32 
     33     def __init__(self, controllers):
     34         BaseTestClass.__init__(self, controllers)
     35         self.tests = (
     36             "test_autojoin_out_of_range",
     37             "test_autojoin_Ap1_2g",
     38             "test_autojoin_Ap1_2gto5g",
     39             "test_autojoin_in_AP1_5gto2g",
     40             "test_autojoin_swtich_AP1toAp2",
     41             "test_autojoin_Ap2_2gto5g",
     42             "test_autojoin_Ap2_5gto2g",
     43             "test_autojoin_out_of_range",
     44             "test_autojoin_Ap2_2g",
     45             "test_autojoin_Ap2_2gto5g",
     46             "test_autojoin_in_Ap2_5gto2g",
     47             "test_autojoin_swtich_AP2toAp1",
     48             "test_autojoin_Ap1_2gto5g",
     49             "test_autojoin_Ap1_5gto2g",
     50             "test_autojoin_swtich_to_blacklist_AP",
     51             "test_autojoin_in_blacklist_AP",
     52             "test_autojoin_back_from_blacklist_AP",
     53             )
     54 
     55     def setup_class(self):
     56         """It will setup the required dependencies from config file and configure
     57            the required networks for auto-join testing. Configured networks will
     58            not be removed. If networks are already configured it will skip
     59            configuring the networks
     60 
     61         Returns:
     62             True if successfully configured the requirements for testing.
     63         """
     64         self.dut = self.android_devices[0]
     65         wifi_test_device_init(self.dut)
     66         req_params = ("reference_networks", "other_network", "atten_val",
     67                       "ping_addr", "max_bugreports" )
     68         self.unpack_userparams(req_params)
     69         self.log.debug("Connect networks :: {}".format(self.other_network))
     70         configured_networks = self.dut.droid.wifiGetConfiguredNetworks()
     71         self.log.debug("Configured networks :: {}".format(configured_networks))
     72         count_confnet = 0
     73         result = False
     74         if self.reference_networks[0]['2g']['ssid'] == self.reference_networks[0]['5g']['ssid']:
     75             self.ref_ssid_count = 1
     76         else:
     77             self.ref_ssid_count = 2 # Different SSID for 2g and 5g
     78         for confnet in configured_networks:
     79             if confnet[WifiEnums.SSID_KEY] == self.reference_networks[0]['2g']['ssid']:
     80                 count_confnet += 1
     81             elif confnet[WifiEnums.SSID_KEY] == self.reference_networks[0]['5g']['ssid']:
     82                 count_confnet += 1
     83         self.log.info("count_confnet {}".format(count_confnet))
     84         if count_confnet == self.ref_ssid_count:
     85             return True
     86         else:
     87             self.log.info("Configured networks for testing")
     88             self.attenuators[0].set_atten(0)
     89             self.attenuators[1].set_atten(90)
     90             self.attenuators[2].set_atten(90)
     91             wait_time = 15
     92             self.dut.droid.wakeLockAcquireBright()
     93             self.dut.droid.wakeUpNow()
     94             try:
     95                 self.dut.droid.wifiPriorityConnect(self.reference_networks[0]['2g'])
     96                 connect_result = self.dut.ed.pop_event("WifiManagerPriorityConnectOnSuccess", 1)
     97                 self.log.info(connect_result)
     98                 time.sleep(wait_time)
     99                 if self.ref_ssid_count == 2: #add 5g network as well
    100                     self.dut.droid.wifiPriorityConnect(self.reference_networks[0]['5g'])
    101                     connect_result = self.dut.ed.pop_event("WifiManagerPriorityConnectOnSuccess", 1)
    102                     self.log.info(connect_result)
    103                     time.sleep(wait_time)
    104                 self.dut.droid.wifiPriorityConnect(self.other_network)
    105                 connect_result = self.dut.ed.pop_event("WifiManagerPriorityConnectOnSuccess")
    106                 self.log.info(connect_result)
    107                 track_connection(self.dut, self.other_network["ssid"], 1)
    108                 wifi_forget_network(self.dut, self.other_network["ssid"])
    109                 time.sleep(wait_time)
    110                 current_network = self.dut.droid.wifiGetConnectionInfo()
    111                 self.log.info("Current network: {}".format(current_network))
    112                 asserts.assert_true('network_id' in current_network, NETWORK_ID_ERROR)
    113                 asserts.assert_true(current_network['network_id'] >= 0, NETWORK_ERROR)
    114                 self.ip_address = self.dut.droid.wifiGetConfigFile();
    115                 self.log.info("IP info: {}".format(self.ip_address))
    116             finally:
    117                 self.dut.droid.wifiLockRelease()
    118                 self.dut.droid.goToSleepNow()
    119 
    120     def check_connection(self, network_bssid):
    121         """Check current wifi connection networks.
    122         Args:
    123             network_bssid: Network bssid to which connection.
    124         Returns:
    125             True if connection to given network happen, else return False.
    126         """
    127         time.sleep(40) #time for connection state to be updated
    128         self.log.info("Check network for {}".format(network_bssid))
    129         current_network = self.dut.droid.wifiGetConnectionInfo()
    130         self.log.debug("Current network:  {}".format(current_network))
    131         if WifiEnums.BSSID_KEY in current_network:
    132             return current_network[WifiEnums.BSSID_KEY] == network_bssid
    133         return False
    134 
    135     def set_attn_and_validate_connection(self, attn_value, bssid):
    136         """Validate wifi connection status on different attenuation setting.
    137 
    138         Args:
    139             attn_value: Attenuation value for different APs signal.
    140             bssid: Bssid of excepted network.
    141 
    142         Returns:
    143             True if bssid of current network match, else false.
    144         """
    145         self.attenuators[0].set_atten(attn_value[0])
    146         self.attenuators[1].set_atten(attn_value[1])
    147         self.attenuators[2].set_atten(attn_value[2])
    148         self.dut.droid.wakeLockAcquireBright()
    149         self.dut.droid.wakeUpNow()
    150         try:
    151             asserts.assert_true(self.check_connection(bssid),
    152                     "Device is not connected to required bssid {}".format(bssid))
    153             time.sleep(10) #wait for connection to be active
    154             asserts.assert_true(check_internet_connection(self.dut, self.ping_addr),
    155                              "Error, No Internet connection for current bssid {}".
    156                              format(bssid))
    157         finally:
    158             self.dut.droid.wifiLockRelease()
    159             self.dut.droid.goToSleepNow()
    160 
    161     def on_fail(self, test_name, begin_time):
    162         if self.max_bugreports > 0:
    163             self.dut.take_bug_report(test_name, begin_time)
    164             self.max_bugreports -= 1
    165         self.dut.cat_adb_log(test_name, begin_time)
    166 
    167     """ Tests Begin """
    168     def test_autojoin_Ap1_2g(self):
    169         """Test wifi auto join functionality move in range of AP1.
    170 
    171          1. Attenuate the signal to low range of AP1 and Ap2 not visible at all.
    172          2. Wake up the device.
    173          3. Check that device is connected to right BSSID and maintain stable
    174             connection to BSSID in range.
    175         """
    176         att0,att1,att2 =  self.atten_val["Ap1_2g"]
    177         variance = 5
    178         attenuations = ([att0+variance*2, att1, att2], [att0+variance, att1, att2],
    179                         [att0, att1, att2], [att0-variance, att1, att2])
    180         name_func = lambda att_value, bssid : ("test_autojoin_Ap1_2g_AP1_{}_AP2"
    181                      "_{}_AP3_{}").format(att_value[0], att_value[1], att_value[2])
    182         failed = self.run_generated_testcases(
    183                         self.set_attn_and_validate_connection,
    184                         attenuations,
    185                         args = (self.reference_networks[0]["2g"]['bssid'],),
    186                         name_func = name_func)
    187         asserts.assert_true(not failed, "Number of test_autojoin_Ap1_2g failed {}".
    188                          format(len(failed)))
    189 
    190     def test_autojoin_Ap1_2gto5g(self):
    191         """Test wifi auto join functionality move to high range.
    192 
    193          1. Attenuate the signal to high range of AP1.
    194          2. Wake up the device.
    195          3. Check that device is connected to right BSSID and maintain stable
    196             connection to BSSID in range.
    197         """
    198         att0,att1,att2 =  self.atten_val["Ap1_2gto5g"]
    199         variance = 5
    200         attenuations = ([att0+variance*2, att1, att2], [att0+variance, att1, att2],
    201                         [att0, att1, att2])
    202         name_func = lambda att_value, bssid : ("test_autojoin_Ap1_2gto5g_AP1_{}_AP2"
    203                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    204         failed = self.run_generated_testcases(
    205                         self.set_attn_and_validate_connection,
    206                         attenuations,
    207                         args = (self.reference_networks[0]["5g"]['bssid'],),
    208                         name_func = name_func)
    209         asserts.assert_true(not failed, "Number of test_autojoin_Ap1_2gto5g failed {}".
    210                          format(len(failed)))
    211 
    212 
    213     def test_autojoin_in_AP1_5gto2g(self):
    214         """Test wifi auto join functionality move to low range toward AP2.
    215 
    216          1. Attenuate the signal to medium range of AP1 and low range of AP2.
    217          2. Wake up the device.
    218          3. Check that device is connected to right BSSID and maintain stable
    219             connection to BSSID in range.
    220         """
    221         att0,att1,att2 =  self.atten_val["In_AP1_5gto2g"]
    222         variance = 5
    223         attenuations = ([att0-variance, att1+variance, att2], [att0, att1, att2],
    224                         [att0+variance, att1-variance, att2])
    225         name_func = lambda att_value, bssid : ("test_autojoin_in_AP1_5gto2g_AP1_{}_AP2"
    226                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    227         failed = self.run_generated_testcases(
    228                         self.set_attn_and_validate_connection,
    229                         attenuations,
    230                         args = (self.reference_networks[0]["2g"]['bssid'],),
    231                         name_func = name_func)
    232         asserts.assert_true(not failed, "Number of test_autojoin_in_AP1_5gto2g failed {}".
    233                          format(len(failed)))
    234 
    235     def test_autojoin_swtich_AP1toAp2(self):
    236         """Test wifi auto join functionality move from low range of AP1 to better
    237            range of AP2.
    238 
    239          1. Attenuate the signal to low range of AP1 and medium range of AP2.
    240          2. Wake up the device.
    241          3. Check that device is connected to right BSSID and maintain stable
    242             connection to BSSID in range.
    243         """
    244         att0,att1,att2 =  self.atten_val["Swtich_AP1toAp2"]
    245         variance = 5
    246         attenuations = ([att0-variance, att1+variance, att2], [att0, att1, att2],
    247                         [att0+variance, att1-variance, att2])
    248         name_func = lambda att_value, bssid : ("test_autojoin_swtich_AP1toAp2_AP1_{}_AP2"
    249                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    250         failed = self.run_generated_testcases(
    251                         self.set_attn_and_validate_connection,
    252                         attenuations,
    253                         args = (self.reference_networks[1]["2g"]['bssid'],),
    254                         name_func = name_func)
    255         asserts.assert_true(not failed, "Number of test_autojoin_swtich_AP1toAp2 failed {}".
    256                          format(len(failed)))
    257 
    258     def test_autojoin_Ap2_2gto5g(self):
    259         """Test wifi auto join functionality move to high range of AP2.
    260 
    261          1. Attenuate the signal to out range of AP1 and high range of AP2.
    262          2. Wake up the device.
    263          3. Check that device is connected to right BSSID and maintain stable
    264             connection to BSSID in range.
    265         """
    266         att0,att1,att2 =  self.atten_val["Ap2_2gto5g"]
    267         variance = 5
    268         attenuations = ([att0-variance, att1+variance*2, att2],
    269                         [att0, att1+variance, att2], [att0, att1, att2])
    270         name_func = lambda att_value, bssid : ("test_autojoin_Ap2_2gto5g_AP1_{}_AP2"
    271                      "_{}_AP3_{}").format(att_value[0], att_value[1], att_value[2])
    272         failed = self.run_generated_testcases(
    273                         self.set_attn_and_validate_connection,
    274                         attenuations,
    275                         args = (self.reference_networks[1]["5g"]['bssid'],),
    276                         name_func = name_func)
    277         asserts.assert_true(not failed, "Number of test_autojoin_Ap2_2gto5g failed {}".
    278                          format(len(failed)))
    279 
    280     def test_autojoin_Ap2_5gto2g(self):
    281         """Test wifi auto join functionality move to low range of AP2.
    282 
    283          1. Attenuate the signal to low range of AP2.
    284          2. Wake up the device.
    285          3. Check that device is connected to right BSSID and maintain stable.
    286         """
    287         att0,att1,att2 =  self.atten_val["Ap2_5gto2g"]
    288         variance = 5
    289         attenuations = ([att0, att1-variance, att2], [att0, att1, att2],
    290                         [att0, att1+variance, att2])
    291         name_func = lambda att_value, bssid : ("test_autojoin_Ap2_5gto2g_AP1_{}_AP2"
    292                      "_{}_AP3_{}").format(att_value[0], att_value[1], att_value[2])
    293         failed = self.run_generated_testcases(
    294                         self.set_attn_and_validate_connection,
    295                         attenuations,
    296                         args = (self.reference_networks[1]["2g"]['bssid'],),
    297                         name_func = name_func)
    298         asserts.assert_true(not failed, "Number of test_autojoin_Ap2_5gto2g failed {}".
    299                          format(len(failed)))
    300 
    301     def test_autojoin_out_of_range(self):
    302         """Test wifi auto join functionality move to low range.
    303 
    304          1. Attenuate the signal to out of range.
    305          2. Wake up the device.
    306          3. Start the scan.
    307          4. Check that device is not connected to any network.
    308         """
    309         self.attenuators[0].set_atten(90)
    310         self.attenuators[1].set_atten(90)
    311         self.attenuators[2].set_atten(90)
    312         self.dut.droid.wakeLockAcquireBright()
    313         self.dut.droid.wakeUpNow()
    314         try:
    315             start_wifi_connection_scan(self.dut)
    316             wifi_results = self.dut.droid.wifiGetScanResults()
    317             self.log.debug("Scan result {}".format(wifi_results))
    318             time.sleep(20)
    319             current_network = self.dut.droid.wifiGetConnectionInfo()
    320             self.log.info("Current network: {}".format(current_network))
    321             asserts.assert_true(('network_id' in current_network and
    322                               current_network['network_id'] == -1),
    323                              "Device is connected to network {}".format(current_network))
    324         finally:
    325             self.dut.droid.wifiLockRelease()
    326             self.dut.droid.goToSleepNow()
    327 
    328     def test_autojoin_Ap2_2g(self):
    329         """Test wifi auto join functionality move in low range of AP2.
    330 
    331          1. Attenuate the signal to move in range of AP2 and Ap1 not visible at all.
    332          2. Wake up the device.
    333          3. Check that device is connected to right BSSID and maintain stable
    334             connection to BSSID in range.
    335         """
    336         att0,att1,att2 =  self.atten_val["Ap2_2g"]
    337         variance = 5
    338         attenuations = ([att0,att1+variance*2,att2],
    339                         [att0,att1+variance,att2],[att0,att1,att2],
    340                         [att0,att1-variance,att2])
    341         name_func = lambda att_value, bssid : ("test_autojoin_Ap2_2g_AP1_{}_AP2"
    342                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    343         failed = self.run_generated_testcases(
    344                         self.set_attn_and_validate_connection,
    345                         attenuations,
    346                         args = (self.reference_networks[1]["2g"]['bssid'],),
    347                         name_func = name_func)
    348         asserts.assert_true(not failed, "Number of test_autojoin_Ap2_2g failed {}".
    349                          format(len(failed)))
    350 
    351     def test_autojoin_in_Ap2_5gto2g(self):
    352         """Test wifi auto join functionality move to medium range of Ap2 and
    353            low range of AP1.
    354 
    355          1. Attenuate the signal to move in medium range of AP2 and low range of AP1.
    356          2. Wake up the device.
    357          3. Check that device is connected to right BSSID and maintain stable
    358             connection to BSSID in range.
    359         """
    360         att0,att1,att2 =  self.atten_val["In_Ap2_5gto2g"]
    361         variance = 5
    362         attenuations = ([att0,att1-variance,att2],[att0,att1,att2],
    363                         [att0,att1+variance,att2])
    364         name_func = lambda att_value, bssid : ("test_autojoin_in_Ap2_5gto2g_AP1_{}_AP2"
    365                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    366         failed = self.run_generated_testcases(
    367                         self.set_attn_and_validate_connection,
    368                         attenuations,
    369                         args = (self.reference_networks[1]["2g"]['bssid'],),
    370                         name_func = name_func)
    371         asserts.assert_true(not failed, "Number of test_autojoin_in_Ap2_5gto2g failed {}".
    372                          format(len(failed)))
    373 
    374     def test_autojoin_swtich_AP2toAp1(self):
    375         """Test wifi auto join functionality move from low range of AP2 to better
    376            range of AP1.
    377 
    378          1. Attenuate the signal to low range of AP2 and medium range of AP1.
    379          2. Wake up the device.
    380          3. Check that device is connected to right BSSID and maintain stable
    381             connection to BSSID in range.
    382         """
    383         att0,att1,att2 =  self.atten_val["Swtich_AP2toAp1"]
    384         variance = 5
    385         attenuations = ([att0+variance,att1-variance,att2],[att0,att1,att2],
    386                         [att0-variance,att1+variance,att2])
    387         name_func = lambda att_value, bssid : ("test_autojoin_swtich_AP2toAp1_AP1_{}_AP2"
    388                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    389         failed = self.run_generated_testcases(
    390                         self.set_attn_and_validate_connection,
    391                         attenuations,
    392                         args = (self.reference_networks[0]["2g"]['bssid'],),
    393                         name_func = name_func)
    394         asserts.assert_true(not failed, "Number of test_autojoin_swtich_AP2toAp1 failed {}".
    395                          format(len(failed)))
    396 
    397     def test_autojoin_Ap1_5gto2g(self):
    398         """Test wifi auto join functionality move to medium range of AP1.
    399 
    400          1. Attenuate the signal to medium range of AP1.
    401          2. Wake up the device.
    402          3. Check that device is connected to right BSSID and maintain stable
    403             connection to BSSID in range.
    404         """
    405         att0,att1,att2 =  self.atten_val["Ap1_5gto2g"]
    406         variance = 5
    407         attenuations = ([att0,att1,att2], [att0+variance,att1,att2],
    408                         [att0+variance*2,att1,att2])
    409         name_func = lambda att_value, bssid : ("test_autojoin_Ap1_5gto2g_AP1_{}_AP2"
    410                      "_{}_AP3_{}").format(att_value[0], att_value[1],att_value[2])
    411         failed = self.run_generated_testcases(
    412                         self.set_attn_and_validate_connection,
    413                         attenuations,
    414                         args = (self.reference_networks[0]["2g"]['bssid'],),
    415                         name_func = name_func)
    416         asserts.assert_true(not failed, "Number of test_autojoin_Ap1_5gto2g failed {}".
    417                          format(len(failed)))
    418 
    419     def test_autojoin_swtich_to_blacklist_AP(self):
    420         """Test wifi auto join functionality in medium range of blacklist BSSID.
    421 
    422          1. Attenuate the signal to low range of AP1 and medium range of AP3.
    423          2. Wake up the device.
    424          3. Check that device is connected to AP1 BSSID and maintain stable
    425             connection to BSSID.
    426         """
    427         self.set_attn_and_validate_connection(self.atten_val["Swtich_to_blacklist"],
    428                                               self.reference_networks[0]["2g"]['bssid'])
    429 
    430     def test_autojoin_in_blacklist_AP(self):
    431         """Test wifi auto join functionality in high range of blacklist BSSID.
    432 
    433          1. Attenuate the signal to out of range of AP1 and full range of AP3.
    434          2. Wake up the device.
    435          3. Check that device is disconnected form all AP.
    436         """
    437         attn0, attn1, attn2 = self.atten_val["In_blacklist"]
    438         self.attenuators[0].set_atten(attn0)
    439         self.attenuators[1].set_atten(attn1)
    440         self.attenuators[2].set_atten(attn2)
    441         self.dut.droid.wakeLockAcquireBright()
    442         self.dut.droid.wakeUpNow()
    443         try:
    444             start_wifi_connection_scan(self.dut)
    445             wifi_results = self.dut.droid.wifiGetScanResults()
    446             self.log.debug("Scan result {}".format(wifi_results))
    447             time.sleep(20)
    448             current_network = self.dut.droid.wifiGetConnectionInfo()
    449             self.log.info("Current network: {}".format(current_network))
    450             asserts.assert_true(('network_id' in current_network and
    451                               current_network['network_id'] == -1),
    452                              "Device is still connected to blacklisted network {}".
    453                              format(current_network))
    454         finally:
    455             self.dut.droid.wifiLockRelease()
    456             self.dut.droid.goToSleepNow()
    457 
    458     def test_autojoin_back_from_blacklist_AP(self):
    459         """Test wifi auto join functionality in medium range of blacklist BSSID.
    460 
    461          1. Attenuate the signal to medium of range of AP1 and low range of AP3.
    462          2. Wake up the device.
    463          3. Check that device is disconnected form all AP.
    464         """
    465         self.set_attn_and_validate_connection(self.atten_val["Back_from_blacklist"],
    466                                               self.reference_networks[0]["2g"]['bssid'])
    467     """ Tests End """
    468 if __name__ == "__main__":
    469     pass
    470