#!/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 queue import time from acts import asserts from acts import utils from acts.test_decorators import test_tracker_info from acts_contrib.test_utils.wifi import wifi_test_utils as wutils from acts_contrib.test_utils.wifi.aware import aware_const as aconsts from acts_contrib.test_utils.wifi.aware import aware_test_utils as autils from acts_contrib.test_utils.wifi.aware.AwareBaseTest import AwareBaseTest class AttachTest(AwareBaseTest): @test_tracker_info(uuid="cdafd1e0-bcf5-4fe8-ae32-f55483db9925") def test_attach(self): """Functional test case / Attach test cases / attach Validates that attaching to the Wi-Fi Aware service works (receive the expected callback). """ dut = self.android_devices[0] dut.droid.wifiAwareAttach(False) autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED) autils.fail_on_event(dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED) @test_tracker_info(uuid="82f2a8bc-a62b-49c2-ac8a-fe8460010ba2") def test_attach_with_identity(self): """Functional test case / Attach test cases / attach with identity callback Validates that attaching to the Wi-Fi Aware service works (receive the expected callbacks). """ dut = self.android_devices[0] dut.droid.wifiAwareAttach(True) autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED) autils.wait_for_event(dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED) @test_tracker_info(uuid="d2714d14-f330-47d4-b8e9-ee4d5e5b7ea0") def test_attach_multiple_sessions(self): """Functional test case / Attach test cases / multiple attach sessions Validates that when creating multiple attach sessions each can be configured independently as to whether or not to receive an identity callback. """ dut = self.android_devices[0] # Create 3 attach sessions: 2 without identity callback, 1 with id1 = dut.droid.wifiAwareAttach(False, None, True) time.sleep(10) # to make sure all calls and callbacks are done id2 = dut.droid.wifiAwareAttach(True, None, True) time.sleep(10) # to make sure all calls and callbacks are done id3 = dut.droid.wifiAwareAttach(False, None, True) dut.log.info('id1=%d, id2=%d, id3=%d', id1, id2, id3) # Attach session 1: wait for attach, should not get identity autils.wait_for_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_ATTACHED, id1)) autils.fail_on_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_IDENTITY_CHANGED, id1)) # Attach session 2: wait for attach and for identity callback autils.wait_for_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_ATTACHED, id2)) autils.wait_for_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_IDENTITY_CHANGED, id2)) # Attach session 3: wait for attach, should not get identity autils.wait_for_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_ATTACHED, id3)) autils.fail_on_event( dut, autils.decorate_event(aconsts.EVENT_CB_ON_IDENTITY_CHANGED, id3)) @test_tracker_info(uuid="b8ea4d02-ae23-42a7-a85e-def52932c858") def test_attach_with_no_wifi(self): """Function test case / Attach test cases / attempt to attach with wifi off Validates that if trying to attach with Wi-Fi disabled will receive the expected failure callback. As a side-effect also validates that the broadcast for Aware unavailable is received. """ dut = self.android_devices[0] wutils.wifi_toggle_state(dut, False) autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_NOT_AVAILABLE) dut.droid.wifiAwareAttach() autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACH_FAILED) @test_tracker_info(uuid="7dcc4530-c936-4447-9d22-a7c5b315e2ce") def test_attach_with_doze(self): """Function test case / Attach test cases / attempt to attach with doze on Validates that if trying to attach with device in doze mode will receive the expected failure callback. As a side-effect also validates that the broadcast for Aware unavailable is received. """ dut = self.android_devices[0] asserts.assert_true(utils.enable_doze(dut), "Can't enable doze") autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_NOT_AVAILABLE) dut.droid.wifiAwareAttach() autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACH_FAILED) asserts.assert_true(utils.disable_doze(dut), "Can't disable doze") autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_AVAILABLE) @test_tracker_info(uuid="2574fd01-8974-4dd0-aeb8-a7194461140e") def test_attach_with_location_off(self): """Function test case / Attach test cases / attempt to attach with location mode off. Validates that if trying to attach with device location mode off will receive the expected failure callback. As a side-effect also validates that the broadcast for Aware unavailable is received. """ dut = self.android_devices[0] asserts.skip_if(dut.droid.isSdkAtLeastT(), "From T build Aware will not be disabled due to location off") utils.set_location_service(dut, False) autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_NOT_AVAILABLE) dut.droid.wifiAwareAttach() autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACH_FAILED) utils.set_location_service(dut, True) autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_AVAILABLE) @test_tracker_info(uuid="7ffde8e7-a010-4b77-97f5-959f263b5249") def test_attach_apm_toggle_attach_again(self): """Validates that enabling Airplane mode while Aware is on resets it correctly, and allows it to be re-enabled when Airplane mode is then disabled.""" dut = self.android_devices[0] # enable Aware (attach) dut.droid.wifiAwareAttach() autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED) # enable airplane mode utils.force_airplane_mode(dut, True) # APM has a race condition between tear down the NAN Iface and change the Wifi State. try: dut.ed.pop_event(aconsts.BROADCAST_WIFI_AWARE_AVAILABLE, autils.EVENT_TIMEOUT) except queue.Empty: dut.log.info('Wifi State changes before Interface is torn down') autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_NOT_AVAILABLE) # wait a few seconds and disable airplane mode time.sleep(10) utils.force_airplane_mode(dut, False) autils.wait_for_event(dut, aconsts.BROADCAST_WIFI_AWARE_AVAILABLE) # try enabling Aware again (attach) dut.droid.wifiAwareAttach() autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED)