Home | History | Annotate | Download | only in functional
      1 #!/usr/bin/python3.4
      2 #
      3 #   Copyright 2017 - 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 from acts import asserts
     18 from acts.test_decorators import test_tracker_info
     19 from acts.test_utils.net import nsd_const as nconsts
     20 from acts.test_utils.wifi.aware import aware_const as aconsts
     21 from acts.test_utils.wifi.aware import aware_test_utils as autils
     22 from acts.test_utils.wifi.aware.AwareBaseTest import AwareBaseTest
     23 
     24 
     25 class ProtocolsTest(AwareBaseTest):
     26   """Set of tests for Wi-Fi Aware data-paths: validating protocols running on
     27   top of a data-path"""
     28 
     29   SERVICE_NAME = "GoogleTestServiceXY"
     30 
     31   def __init__(self, controllers):
     32     AwareBaseTest.__init__(self, controllers)
     33 
     34   def run_ping6(self, dut, peer_ipv6, dut_if):
     35     """Run a ping6 over the specified device/link
     36 
     37     Args:
     38       dut: Device on which to execute ping6
     39       peer_ipv6: IPv6 address of the peer to ping
     40       dut_if: interface name on the dut
     41     """
     42     cmd = "ping6 -c 3 -W 5 %s%%%s" % (peer_ipv6, dut_if)
     43     results = dut.adb.shell(cmd)
     44     self.log.info("cmd='%s' -> '%s'", cmd, results)
     45     if results == "":
     46       asserts.fail("ping6 empty results - seems like a failure")
     47 
     48   ########################################################################
     49 
     50   @test_tracker_info(uuid="ce103067-7fdd-4379-9a2b-d238959f1d53")
     51   def test_ping6_oob(self):
     52     """Validate that ping6 works correctly on an NDP created using OOB (out-of
     53     band) discovery"""
     54     init_dut = self.android_devices[0]
     55     resp_dut = self.android_devices[1]
     56 
     57     # create NDP
     58     (init_req_key, resp_req_key, init_aware_if, resp_aware_if, init_ipv6,
     59      resp_ipv6) = autils.create_oob_ndp(init_dut, resp_dut)
     60     self.log.info("Interface names: I=%s, R=%s", init_aware_if, resp_aware_if)
     61     self.log.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6,
     62                   resp_ipv6)
     63 
     64     # run ping6
     65     self.run_ping6(init_dut, resp_ipv6, init_aware_if)
     66     self.run_ping6(resp_dut, init_ipv6, resp_aware_if)
     67 
     68     # clean-up
     69     resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
     70     init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)
     71 
     72   @test_tracker_info(uuid="fef86a48-0e05-464b-8c66-64316275c5ba")
     73   def test_ping6_ib_unsolicited_passive(self):
     74     """Validate that ping6 works correctly on an NDP created using Aware
     75     discovery with UNSOLICITED/PASSIVE sessions."""
     76     p_dut = self.android_devices[0]
     77     s_dut = self.android_devices[1]
     78 
     79     # create NDP
     80     (p_req_key, s_req_key, p_aware_if, s_aware_if, p_ipv6,
     81      s_ipv6) = autils.create_ib_ndp(
     82          p_dut,
     83          s_dut,
     84          p_config=autils.create_discovery_config(
     85              self.SERVICE_NAME, aconsts.PUBLISH_TYPE_UNSOLICITED),
     86          s_config=autils.create_discovery_config(
     87              self.SERVICE_NAME, aconsts.SUBSCRIBE_TYPE_PASSIVE),
     88          device_startup_offset=self.device_startup_offset)
     89     self.log.info("Interface names: P=%s, S=%s", p_aware_if, s_aware_if)
     90     self.log.info("Interface addresses (IPv6): P=%s, S=%s", p_ipv6, s_ipv6)
     91 
     92     # run ping6
     93     self.run_ping6(p_dut, s_ipv6, p_aware_if)
     94     self.run_ping6(s_dut, p_ipv6, s_aware_if)
     95 
     96     # clean-up
     97     p_dut.droid.connectivityUnregisterNetworkCallback(p_req_key)
     98     s_dut.droid.connectivityUnregisterNetworkCallback(s_req_key)
     99 
    100   @test_tracker_info(uuid="5bbd68a9-994b-4c26-88cd-43388cec280b")
    101   def test_ping6_ib_solicited_active(self):
    102     """Validate that ping6 works correctly on an NDP created using Aware
    103     discovery with SOLICITED/ACTIVE sessions."""
    104     p_dut = self.android_devices[0]
    105     s_dut = self.android_devices[1]
    106 
    107     # create NDP
    108     (p_req_key, s_req_key, p_aware_if, s_aware_if, p_ipv6,
    109      s_ipv6) = autils.create_ib_ndp(
    110          p_dut,
    111          s_dut,
    112          p_config=autils.create_discovery_config(
    113              self.SERVICE_NAME, aconsts.PUBLISH_TYPE_SOLICITED),
    114          s_config=autils.create_discovery_config(self.SERVICE_NAME,
    115                                                  aconsts.SUBSCRIBE_TYPE_ACTIVE),
    116          device_startup_offset=self.device_startup_offset)
    117     self.log.info("Interface names: P=%s, S=%s", p_aware_if, s_aware_if)
    118     self.log.info("Interface addresses (IPv6): P=%s, S=%s", p_ipv6, s_ipv6)
    119 
    120     # run ping6
    121     self.run_ping6(p_dut, s_ipv6, p_aware_if)
    122     self.run_ping6(s_dut, p_ipv6, s_aware_if)
    123 
    124     # clean-up
    125     p_dut.droid.connectivityUnregisterNetworkCallback(p_req_key)
    126     s_dut.droid.connectivityUnregisterNetworkCallback(s_req_key)
    127 
    128   def test_ping6_oob_max_ndp(self):
    129     """Validate that ping6 works correctly on multiple NDPs brought up
    130     concurrently. Uses the capability of the device to determine the max
    131     number of NDPs to set up.
    132 
    133     Note: the test requires MAX_NDP + 1 devices to be validated. If these are
    134     not available the test will fail."""
    135     dut = self.android_devices[0]
    136 
    137     # get max NDP: using first available device (assumes all devices are the
    138     # same)
    139     max_ndp = dut.aware_capabilities[aconsts.CAP_MAX_NDP_SESSIONS]
    140     asserts.assert_true(len(self.android_devices) > max_ndp,
    141                         'Needed %d devices to run the test, have %d' %
    142                         (max_ndp + 1, len(self.android_devices)))
    143 
    144     # create all NDPs
    145     dut_aware_if = None
    146     dut_ipv6 = None
    147     peers_aware_ifs = []
    148     peers_ipv6s = []
    149     dut_requests = []
    150     peers_requests = []
    151     for i in range(max_ndp):
    152       (init_req_key, resp_req_key, init_aware_if, resp_aware_if, init_ipv6,
    153        resp_ipv6) = autils.create_oob_ndp(dut, self.android_devices[i + 1])
    154       self.log.info("Interface names: I=%s, R=%s", init_aware_if, resp_aware_if)
    155       self.log.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6,
    156                     resp_ipv6)
    157 
    158       dut_requests.append(init_req_key)
    159       peers_requests.append(resp_req_key)
    160       if dut_aware_if is None:
    161         dut_aware_if = init_aware_if
    162       else:
    163         asserts.assert_equal(
    164             dut_aware_if, init_aware_if,
    165             "DUT (Initiator) interface changed on subsequent NDPs!?")
    166       if dut_ipv6 is None:
    167         dut_ipv6 = init_ipv6
    168       else:
    169         asserts.assert_equal(
    170             dut_ipv6, init_ipv6,
    171             "DUT (Initiator) IPv6 changed on subsequent NDPs!?")
    172       peers_aware_ifs.append(resp_aware_if)
    173       peers_ipv6s.append(resp_ipv6)
    174 
    175     # run ping6
    176     for i in range(max_ndp):
    177       self.run_ping6(dut, peers_ipv6s[i], dut_aware_if)
    178       self.run_ping6(self.android_devices[i + 1], dut_ipv6, peers_aware_ifs[i])
    179 
    180     # cleanup
    181     for i in range(max_ndp):
    182       dut.droid.connectivityUnregisterNetworkCallback(dut_requests[i])
    183       self.android_devices[i + 1].droid.connectivityUnregisterNetworkCallback(
    184           peers_requests[i])
    185 
    186   def test_nsd_oob(self):
    187     """Validate that NSD (mDNS) works correctly on an NDP created using OOB
    188     (out-of band) discovery"""
    189     init_dut = self.android_devices[0]
    190     resp_dut = self.android_devices[1]
    191 
    192     # create NDP
    193     (init_req_key, resp_req_key, init_aware_if, resp_aware_if, init_ipv6,
    194      resp_ipv6) = autils.create_oob_ndp(init_dut, resp_dut)
    195     self.log.info("Interface names: I=%s, R=%s", init_aware_if, resp_aware_if)
    196     self.log.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6,
    197                   resp_ipv6)
    198 
    199     # run NSD
    200     nsd_service_info = {
    201         "serviceInfoServiceName": "sl4aTestAwareNsd",
    202         "serviceInfoServiceType": "_simple-tx-rx._tcp.",
    203         "serviceInfoPort": 2257
    204     }
    205     nsd_reg = None
    206     nsd_discovery = None
    207     try:
    208       # Initiator registers an NSD service
    209       nsd_reg = init_dut.droid.nsdRegisterService(nsd_service_info)
    210       event_nsd = autils.wait_for_event_with_keys(
    211           init_dut, nconsts.REG_LISTENER_EVENT, autils.EVENT_TIMEOUT,
    212           (nconsts.REG_LISTENER_CALLBACK,
    213            nconsts.REG_LISTENER_EVENT_ON_SERVICE_REGISTERED))
    214       self.log.info("Initiator %s: %s",
    215                     nconsts.REG_LISTENER_EVENT_ON_SERVICE_REGISTERED,
    216                     event_nsd["data"])
    217 
    218       # Responder starts an NSD discovery
    219       nsd_discovery = resp_dut.droid.nsdDiscoverServices(
    220           nsd_service_info[nconsts.NSD_SERVICE_INFO_SERVICE_TYPE])
    221       event_nsd = autils.wait_for_event_with_keys(
    222           resp_dut, nconsts.DISCOVERY_LISTENER_EVENT, autils.EVENT_TIMEOUT,
    223           (nconsts.DISCOVERY_LISTENER_DATA_CALLBACK,
    224            nconsts.DISCOVERY_LISTENER_EVENT_ON_SERVICE_FOUND))
    225       self.log.info("Responder %s: %s",
    226                     nconsts.DISCOVERY_LISTENER_EVENT_ON_SERVICE_FOUND,
    227                     event_nsd["data"])
    228 
    229       # Responder resolves IP address of Initiator from NSD service discovery
    230       resp_dut.droid.nsdResolveService(event_nsd["data"])
    231       event_nsd = autils.wait_for_event_with_keys(
    232           resp_dut, nconsts.RESOLVE_LISTENER_EVENT, autils.EVENT_TIMEOUT,
    233           (nconsts.RESOLVE_LISTENER_DATA_CALLBACK,
    234            nconsts.RESOLVE_LISTENER_EVENT_ON_SERVICE_RESOLVED))
    235       self.log.info("Responder %s: %s",
    236                     nconsts.RESOLVE_LISTENER_EVENT_ON_SERVICE_RESOLVED,
    237                     event_nsd["data"])
    238 
    239       # mDNS returns first character as '/' - strip
    240       # out to get clean IPv6
    241       init_ipv6_nsd = event_nsd["data"][nconsts.NSD_SERVICE_INFO_HOST][1:]
    242 
    243       asserts.assert_equal(
    244           init_ipv6, init_ipv6_nsd,
    245           "Initiator's IPv6 address obtained through NSD doesn't match!?")
    246     finally:
    247       # Stop NSD
    248       if nsd_reg is not None:
    249         init_dut.droid.nsdUnregisterService(nsd_reg)
    250       if nsd_discovery is not None:
    251         resp_dut.droid.nsdStopServiceDiscovery(nsd_discovery)
    252 
    253     # clean-up
    254     resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
    255     init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)
    256