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
5import logging
6
7from autotest_lib.client.common_lib import error
8from autotest_lib.server.cros.bluetooth import bluetooth_test
9
10
11class bluetooth_Sanity_ValidAddress(bluetooth_test.BluetoothTest):
12    """
13    Verify that the client Bluetooth adapter has a valid address.
14    """
15    version = 1
16
17    def run_once(self):
18        # Reset the adapter to the powered off state.
19        if not self.device.reset_off():
20            raise error.TestFail('DUT could not be reset to initial state')
21
22        # Read the address both via BlueZ and via the kernel mgmt_ops interface.
23        # Compare the two, they should not differ.
24        bluez_properties = self.device.get_adapter_properties()
25        controller_info = self.device.read_info()
26
27        if bluez_properties['Address'] != controller_info[0]:
28            raise error.TestFail(
29                    'BlueZ and Kernel adapter address differ: %s != %s' %
30                    (bluez_properties['Address'], controller_info[0]))
31
32        address = controller_info[0]
33        logging.debug('Bluetooth address of adapter is %s', address)
34
35        # Sanity check the address
36        if address == '00:00:00:00:00:00':
37            raise error.TestFail('Adapter address is all zeros')
38        if address.startswith('00:00:00:'):
39            raise error.TestFail('Vendor portion of address is all zeros')
40        if address.endswith(':00:00:00'):
41            raise error.TestFail('Device portion of address is all zeros')
42
43        if address == 'FF:FF:FF:FF:FF:FF':
44            raise error.TestFail('Adapter address is all ones')
45        if address.startswith('FF:FF:FF:'):
46            raise error.TestFail('Vendor portion of address is all ones')
47        if address.endswith(':FF:FF:FF'):
48            raise error.TestFail('Device portion of address is all ones')
49
50        # Verify that the address is still the same after powering on the radio.
51        self.device.set_powered(True)
52        bluez_properties = self.device.get_adapter_properties()
53        controller_info = self.device.read_info()
54
55        if bluez_properties['Address'] != address:
56            raise error.TestFail(
57                    'BlueZ adapter address changed after power on: %s != %s' %
58                    (bluez_properties['Address'], address))
59        if controller_info[0] != address:
60            raise error.TestFail(
61                    'Kernel adapter address changed after power on: %s != %s' %
62                    (controller_info[0], address))
63