blob: 329ead4a4ea377fa85d70940742f3dbf551a730f [file] [log] [blame]
#!/usr/bin/python3.4
#
# Copyright 2017 - The Android Open Source Project
#
# 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.
import time
from acts import asserts
from acts.test_decorators import test_tracker_info
from acts.test_utils.net import connectivity_const as cconsts
from acts.test_utils.wifi.aware import aware_const as aconsts
from acts.test_utils.wifi.aware import aware_test_utils as autils
from acts.test_utils.wifi.aware.AwareBaseTest import AwareBaseTest
class MacRandomTest(AwareBaseTest):
"""Set of tests for Wi-Fi Aware MAC address randomization of NMI (NAN
management interface) and NDI (NAN data interface)."""
NUM_ITERATIONS = 10
# number of second to 'reasonably' wait to make sure that devices synchronize
# with each other - useful for OOB test cases, where the OOB discovery would
# take some time
WAIT_FOR_CLUSTER = 5
def __init__(self, controllers):
AwareBaseTest.__init__(self, controllers)
def request_network(self, dut, ns):
"""Request a Wi-Fi Aware network.
Args:
dut: Device
ns: Network specifier
Returns: the request key
"""
network_req = {"TransportType": 5, "NetworkSpecifier": ns}
return dut.droid.connectivityRequestWifiAwareNetwork(network_req)
##########################################################################
@test_tracker_info(uuid="09964368-146a-48e4-9f33-6a319f9eeadc")
def test_nmi_ndi_randomization_on_enable(self):
"""Validate randomization of the NMI (NAN management interface) and all NDIs
(NAN data-interface) on each enable/disable cycle"""
dut = self.android_devices[0]
# DUT: attach and wait for confirmation & identity 10 times
mac_addresses = {}
for i in range(self.NUM_ITERATIONS):
id = dut.droid.wifiAwareAttach(True)
autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED)
ident_event = autils.wait_for_event(dut,
aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
# process NMI
mac = ident_event["data"]["mac"]
dut.log.info("NMI=%s", mac)
if mac in mac_addresses:
mac_addresses[mac] = mac_addresses[mac] + 1
else:
mac_addresses[mac] = 1
# process NDIs
time.sleep(5) # wait for NDI creation to complete
for j in range(dut.aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES]):
ndi_interface = "%s%d" % (aconsts.AWARE_NDI_PREFIX, j)
ndi_mac = autils.get_mac_addr(dut, ndi_interface)
dut.log.info("NDI %s=%s", ndi_interface, ndi_mac)
if ndi_mac in mac_addresses:
mac_addresses[ndi_mac] = mac_addresses[ndi_mac] + 1
else:
mac_addresses[ndi_mac] = 1
dut.droid.wifiAwareDestroy(id)
# Test for uniqueness
for mac in mac_addresses.keys():
if mac_addresses[mac] != 1:
asserts.fail("MAC address %s repeated %d times (all=%s)" % (mac,
mac_addresses[mac], mac_addresses))
# Verify that infra interface (e.g. wlan0) MAC address is not used for NMI
infra_mac = autils.get_wifi_mac_address(dut)
asserts.assert_false(
infra_mac in mac_addresses,
"Infrastructure MAC address (%s) is used for Aware NMI (all=%s)" %
(infra_mac, mac_addresses))
@test_tracker_info(uuid="0fb0b5d8-d9cb-4e37-b9af-51811be5670d")
def test_nmi_randomization_on_interval(self):
"""Validate randomization of the NMI (NAN management interface) on a set
interval. Default value is 30 minutes - change to a small value to allow
testing in real-time"""
RANDOM_INTERVAL = 120 # minimal value in current implementation
dut = self.android_devices[0]
# set randomization interval to 5 seconds
dut.adb.shell("cmd wifiaware native_api set mac_random_interval_sec %d" %
RANDOM_INTERVAL)
# attach and wait for first identity
id = dut.droid.wifiAwareAttach(True)
autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED)
ident_event = autils.wait_for_event(dut,
aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
mac1 = ident_event["data"]["mac"]
# wait for second identity callback
# Note: exact randomization interval is not critical, just approximate,
# hence giving a few more seconds.
ident_event = autils.wait_for_event(dut,
aconsts.EVENT_CB_ON_IDENTITY_CHANGED,
timeout=RANDOM_INTERVAL + 5)
mac2 = ident_event["data"]["mac"]
# validate MAC address is randomized
asserts.assert_false(
mac1 == mac2,
"Randomized MAC addresses (%s, %s) should be different" % (mac1, mac2))
# clean-up
dut.droid.wifiAwareDestroy(id)