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 import random
     18 import time
     19 
     20 from acts import asserts
     21 from acts.test_decorators import test_tracker_info
     22 from acts.test_utils.wifi.rtt import rtt_const as rconsts
     23 from acts.test_utils.wifi.rtt import rtt_test_utils as rutils
     24 from acts.test_utils.wifi.rtt.RttBaseTest import RttBaseTest
     25 
     26 
     27 class RttRequestManagementTest(RttBaseTest):
     28   """Test class for RTT request management flows."""
     29 
     30   SPAMMING_LIMIT = 20
     31 
     32   def __init__(self, controllers):
     33     RttBaseTest.__init__(self, controllers)
     34 
     35   #############################################################################
     36 
     37   @test_tracker_info(uuid="29ff4a02-2952-47df-bf56-64f30c963093")
     38   def test_cancel_ranging(self):
     39     """Request a 'large' number of range operations with various UIDs (using the
     40     work-source API), then cancel some of them.
     41 
     42     We can't guarantee a reaction time - it is possible that a cancelled test
     43     was already finished and it's results dispatched back. The test therefore
     44     stacks the request queue. The sequence is:
     45 
     46     - Request:
     47       - 50 tests @ UIDs = {uid1, uid2, uid3}
     48       - 2 tests @ UIDs = {uid2, uid3}
     49       - 1 test2 @ UIDs = {uid1, uid2, uid3}
     50     - Cancel UIDs = {uid2, uid3}
     51 
     52     Expect to receive only 51 results.
     53     """
     54     dut = self.android_devices[0]
     55     max_peers = dut.droid.wifiRttMaxPeersInRequest()
     56 
     57     all_uids = [1000, 20, 30] # 1000 = System Server (makes requests foreground)
     58     some_uids = [20, 30]
     59 
     60     aps = rutils.select_best_scan_results(
     61       rutils.scan_with_rtt_support_constraint(dut, True, repeat=10),
     62       select_count=1)
     63     dut.log.info("RTT Supporting APs=%s", aps)
     64 
     65     asserts.assert_true(
     66         len(aps) > 0,
     67         "Need at least one AP which supports 802.11mc!")
     68     if len(aps) > max_peers:
     69       aps = aps[0:max_peers]
     70 
     71     group1_ids = []
     72     group2_ids = []
     73     group3_ids = []
     74 
     75     # step 1: request <spam_limit> ranging operations on [uid1, uid2, uid3]
     76     for i in range(self.SPAMMING_LIMIT):
     77       group1_ids.append(
     78         dut.droid.wifiRttStartRangingToAccessPoints(aps, all_uids))
     79 
     80     # step 2: request 2 ranging operations on [uid2, uid3]
     81     for i in range(2):
     82       group2_ids.append(
     83         dut.droid.wifiRttStartRangingToAccessPoints(aps, some_uids))
     84 
     85     # step 3: request 1 ranging operation on [uid1, uid2, uid3]
     86     for i in range(1):
     87       group3_ids.append(
     88           dut.droid.wifiRttStartRangingToAccessPoints(aps, all_uids))
     89 
     90     # step 4: cancel ranging requests on [uid2, uid3]
     91     dut.droid.wifiRttCancelRanging(some_uids)
     92 
     93     # collect results
     94     for i in range(len(group1_ids)):
     95       rutils.wait_for_event(dut, rutils.decorate_event(
     96         rconsts.EVENT_CB_RANGING_ON_RESULT, group1_ids[i]))
     97     time.sleep(rutils.EVENT_TIMEOUT) # optimize time-outs below to single one
     98     for i in range(len(group2_ids)):
     99       rutils.fail_on_event(dut, rutils.decorate_event(
    100           rconsts.EVENT_CB_RANGING_ON_RESULT, group2_ids[i]), 0)
    101     for i in range(len(group3_ids)):
    102       rutils.wait_for_event(dut, rutils.decorate_event(
    103           rconsts.EVENT_CB_RANGING_ON_RESULT, group3_ids[i]))
    104 
    105   @test_tracker_info(uuid="48297480-c026-4780-8c13-476e7bea440c")
    106   def test_throttling(self):
    107     """Request sequential range operations using a bogus UID (which will
    108     translate as a throttled process) and similarly using the ACTS/sl4a as
    109     the source (a foreground/unthrottled process)."""
    110     dut = self.android_devices[0]
    111     max_peers = dut.droid.wifiRttMaxPeersInRequest()
    112 
    113     # Need to use a random number since the system keeps states and so the
    114     # background uid will be throttled on the next run of this script
    115     fake_uid = [random.randint(10, 9999)]
    116 
    117     aps = rutils.select_best_scan_results(
    118       rutils.scan_with_rtt_support_constraint(dut, True, repeat=10),
    119       select_count=1)
    120     dut.log.info("RTT Supporting APs=%s", aps)
    121 
    122     asserts.assert_true(
    123         len(aps) > 0,
    124         "Need at least one AP which supports 802.11mc!")
    125     if len(aps) > max_peers:
    126       aps = aps[0:max_peers]
    127 
    128     id1 = dut.droid.wifiRttStartRangingToAccessPoints(aps) # as ACTS/sl4a
    129     id2 = dut.droid.wifiRttStartRangingToAccessPoints(aps, fake_uid)
    130     id3 = dut.droid.wifiRttStartRangingToAccessPoints(aps, fake_uid)
    131     id4 = dut.droid.wifiRttStartRangingToAccessPoints(aps) # as ACTS/sl4a
    132 
    133     rutils.wait_for_event(dut, rutils.decorate_event(
    134       rconsts.EVENT_CB_RANGING_ON_RESULT, id1))
    135     rutils.wait_for_event(dut, rutils.decorate_event(
    136         rconsts.EVENT_CB_RANGING_ON_RESULT, id2))
    137     rutils.wait_for_event(dut, rutils.decorate_event(
    138         rconsts.EVENT_CB_RANGING_ON_FAIL, id3))
    139     rutils.wait_for_event(dut, rutils.decorate_event(
    140         rconsts.EVENT_CB_RANGING_ON_RESULT, id4))
    141