Home | History | Annotate | Download | only in bluetooth_Sanity_Discoverable
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import cgi
      6 import logging
      7 
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib.cros.bluetooth import bluetooth_socket
     10 from autotest_lib.server.cros.bluetooth import bluetooth_test
     11 
     12 
     13 class bluetooth_Sanity_Discoverable(bluetooth_test.BluetoothTest):
     14     """
     15     Verify that the client is discoverable from the tester.
     16     """
     17     version = 1
     18 
     19 
     20     def discover_device(self):
     21         """Discover the Bluetooth Device using the Tester.
     22 
     23         @return True if found with expected name, False if not found,
     24           Exception if found device did not have expected name.
     25 
     26         """
     27         devices = self.tester.discover_devices()
     28         if devices == False:
     29             raise error.TestFail('Tester could not discover devices')
     30 
     31         # Iterate the devices we received in the discovery phase and
     32         # look for the DUT.
     33         for address, address_type, rssi, flags, eirdata in devices:
     34             if address == self.adapter['Address']:
     35                 logging.info('Found device with RSSI %d', rssi)
     36                 found_device = True
     37 
     38                 # Make sure we picked up a name for the device along
     39                 # the way.
     40                 eir = bluetooth_socket.parse_eir(eirdata)
     41                 try:
     42                     eir_name = eir[bluetooth_socket.EIR_NAME_COMPLETE]
     43                     if eir_name != self.adapter['Alias']:
     44                         raise error.TestFail(
     45                                 'Device did not have expected name ' +
     46                                 '"%s" != "%s"' %
     47                                 (eir_name, self.adapter['Alias']))
     48 
     49                     # Write out the RSSI now we've found it.
     50                     self.write_perf_keyval({'rssi': int(rssi)})
     51                     self.output_perf_value('rssi', int(rssi), 'dBm')
     52                     return True
     53                 except KeyError:
     54                     logging.warning('Device did not have a name')
     55         else:
     56             logging.warning('Failed to find device')
     57 
     58         return False
     59 
     60     def run_once(self):
     61         # Reset the adapter to the powered on, discoverable state.
     62         if not (self.device.reset_on() and
     63                 self.device.set_discoverable(True)):
     64             raise error.TestFail('DUT could not be reset to initial state')
     65 
     66         self.adapter = self.device.get_adapter_properties()
     67 
     68         if self.interactive:
     69             self.interactive.login()
     70             self.interactive.append_output(
     71                     '<p>The DUT is in the discoverable state. '
     72                     '<p>Please verify that you can discover the device ' +
     73                     ('<b>%s</b> with address <b>%s</b> from the tester.' %
     74                      (cgi.escape(self.adapter['Alias']),
     75                       cgi.escape(self.adapter['Address']))))
     76 
     77         if self.tester:
     78             # Setup the tester as a generic computer.
     79             if not self.tester.setup('computer'):
     80                 raise error.TestFail('Tester could not be initialized')
     81 
     82             # Since radio is involved, this test is not 100% reliable; instead
     83             # we repeat a few times until it succeeds.
     84             for failed_attempts in range(0, 5):
     85                 if self.discover_device():
     86                     break
     87             else:
     88                 raise error.TestFail('Expected device was not found')
     89 
     90             # Record how many attempts this took, hopefully we'll one day figure
     91             # out a way to reduce this to zero and then the loop above can go
     92             # away.
     93             self.write_perf_keyval({'failed_attempts': failed_attempts })
     94             self.output_perf_value('failed_attempts', failed_attempts,
     95                                    'attempts')
     96 
     97         if self.interactive:
     98             self.interactive.append_buttons('Device Found', 'Device Not Found')
     99             result = self.interactive.wait_for_button(timeout=600)
    100             if result != 0:
    101                 raise error.TestFail('User indicated test failed')
    102