Home | History | Annotate | Download | only in wifi
      1 #
      2 #   Copyright 2017 - 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 logging
     17 import time
     18 import socket
     19 
     20 from acts import asserts
     21 from acts import base_test
     22 from acts import test_runner
     23 from acts.controllers import adb
     24 from acts.test_utils.tel import tel_data_utils
     25 from acts.test_utils.tel import tel_test_utils
     26 from acts.test_utils.tel import tel_defines
     27 from acts.test_utils.wifi import wifi_test_utils
     28 
     29 
     30 class WifiTetheringTest(base_test.BaseTestClass):
     31     """ Tests for Wifi Tethering """
     32 
     33     def setup_class(self):
     34         """ Setup devices for tethering and unpack params """
     35         self.hotspot_device, self.tethered_device = self.android_devices[:2]
     36         req_params = ("ssid", "password", "url")
     37         self.unpack_userparams(req_params)
     38         asserts.assert_true(
     39             tel_data_utils.toggle_airplane_mode(self.log, self.hotspot_device, False),
     40             "Could not disable airplane mode")
     41         wifi_test_utils.wifi_toggle_state(self.hotspot_device, False)
     42         self.hotspot_device.droid.telephonyToggleDataConnection(True)
     43         tel_data_utils.wait_for_cell_data_connection(self.log, self.hotspot_device, True)
     44         asserts.assert_true(
     45             tel_data_utils.verify_http_connection(self.log, self.hotspot_device),
     46             "HTTP verification failed on cell data connection")
     47         asserts.assert_true(
     48             self.hotspot_device.droid.connectivityIsTetheringSupported(),
     49             "Tethering is not supported for the provider")
     50         wifi_test_utils.wifi_test_device_init(self.tethered_device)
     51         self.tethered_device.droid.telephonyToggleDataConnection(False)
     52 
     53     def teardown_class(self):
     54         """ Reset devices """
     55         wifi_test_utils.wifi_toggle_state(self.hotspot_device, True)
     56         self.hotspot_device.droid.telephonyToggleDataConnection(True)
     57         self.tethered_device.droid.telephonyToggleDataConnection(True)
     58 
     59     """ Helper functions """
     60 
     61     def _is_ipaddress_ipv6(self,ip_address):
     62         """ Verify if the given string is a valid IPv6 address
     63 
     64         Args:
     65             1. string which contains the IP address
     66 
     67         Returns:
     68             True: if valid ipv6 address
     69             False: if not
     70         """
     71         try:
     72             socket.inet_pton(socket.AF_INET6, ip_address)
     73             return True
     74         except socket.error:
     75             return False
     76 
     77     def _supports_ipv6_tethering(self, dut):
     78         """ Check if provider supports IPv6 tethering.
     79             Currently, only Verizon supports IPv6 tethering
     80 
     81         Returns:
     82             True: if provider supports IPv6 tethering
     83             False: if not
     84         """
     85         # Currently only Verizon support IPv6 tethering
     86         carrier_supports_tethering = ["vzw"]
     87         operator = tel_test_utils.get_operator_name(self.log, dut)
     88         return operator in carrier_supports_tethering
     89 
     90     def _find_ipv6_default_route(self, dut):
     91         """ Checks if IPv6 default route exists in the link properites
     92 
     93         Returns:
     94             True: if default route found
     95             False: if not
     96         """
     97         default_route_substr = "::/0 -> "
     98         link_properties = dut.droid.connectivityGetActiveLinkProperties()
     99         return link_properties and default_route_substr in link_properties
    100 
    101     def _verify_ipv6_tethering(self,dut):
    102         """ Verify IPv6 tethering """
    103         http_response = dut.droid.httpRequestString(self.url)
    104         link_properties = dut.droid.connectivityGetActiveLinkProperties()
    105         self.log.info("IP address %s " % http_response)
    106         if dut==self.hotspot_device or self._supports_ipv6_tethering(self.hotspot_device):
    107             asserts.assert_true(self._is_ipaddress_ipv6(http_response),
    108                                 "The http response did not return IPv6 address")
    109             asserts.assert_true(link_properties and http_response in link_properties,
    110                                 "Could not find IPv6 address in link properties")
    111             asserts.assert_true(self._find_ipv6_default_route(dut),
    112                                 "Could not find IPv6 default route in link properties")
    113         else:
    114             asserts.assert_true(not self._find_ipv6_default_route(dut),
    115                                 "Found IPv6 default route in link properties")
    116 
    117 
    118     """ Test Cases """
    119 
    120     def test_ipv6_tethering(self):
    121         """ IPv6 tethering test
    122 
    123         Steps:
    124             1. Start wifi tethering on provider
    125             2. Client connects to wifi tethering SSID
    126             3. Verify IPv6 address on the client's link properties
    127             4. Verify ping on client using ping6 which should pass
    128             5. Disable mobile data on provider and verify that link properties
    129                does not have IPv6 address and default route
    130         """
    131         # Start wifi tethering on the hotspot device
    132         self.log.info("Start tethering on provider: {}"
    133                       .format(self.hotspot_device.serial))
    134         wifi_test_utils.start_wifi_tethering(self.hotspot_device,
    135                                              self.ssid,
    136                                              self.password)
    137         time.sleep(tel_defines.WAIT_TIME_ANDROID_STATE_SETTLING)
    138         asserts.assert_true(
    139             tel_data_utils.verify_http_connection(self.log,self.hotspot_device),
    140             "Could not verify http connection on the provider")
    141 
    142         # Verify link properties on hotspot device
    143         self.log.info("Check IPv6 properties on the hotspot device")
    144         self._verify_ipv6_tethering(self.hotspot_device)
    145 
    146         # Connect the client to the SSID
    147         asserts.assert_true(
    148             tel_test_utils.WifiUtils.wifi_connect(self.log,
    149                                                   self.tethered_device,
    150                                                   self.ssid,
    151                                                   self.password),
    152             "Unable to connect to the hotspot SSID")
    153 
    154         # Need to wait atleast 2 seconds for IPv6 address to
    155         # show up in the link properties
    156         time.sleep(2)
    157 
    158         # Verify link properties on tethered device
    159         self.log.info("Check IPv6 properties on the tethered device")
    160         self._verify_ipv6_tethering(self.tethered_device)
    161 
    162         # Verify ping6 on tethered device
    163         ping_result = self.tethered_device.droid.pingHost("www.google.com",
    164                                                           5,
    165                                                           "ping6")
    166         if self._supports_ipv6_tethering(self.hotspot_device):
    167             asserts.assert_true(ping_result, "Ping6 failed on the client")
    168         else:
    169             asserts.assert_true(not ping_result, "Ping6 failed as expected")
    170 
    171         # Disable mobile data on hotspot device
    172         # and verify the link properties on tethered device
    173         self.log.info("Disabling mobile data on hotspot device")
    174         self.hotspot_device.droid.telephonyToggleDataConnection(False)
    175         asserts.assert_equal(self.hotspot_device.droid.telephonyGetDataConnectionState(),
    176                              tel_defines.DATA_STATE_CONNECTED,
    177                              "Could not disable cell data")
    178         time.sleep(2) # wait until the IPv6 is removed from link properties
    179         asserts.assert_true(not self._find_ipv6_default_route(self.tethered_device),
    180                             "Found IPv6 default route in link properties - Data off")
    181