1228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov# Use of this source code is governed by a BSD-style license that can be
3228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov# found in the LICENSE file.
4228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
5c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeldimport logging
6b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhovimport uuid
7b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhovimport xml.etree.ElementTree as ET
8228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
9c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeldfrom autotest_lib.client.common_lib import error
10c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeldfrom autotest_lib.server.cros.bluetooth import bluetooth_test
11c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
12228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhovclass bluetooth_SDP_ServiceSearchAttributeRequest(bluetooth_test.BluetoothTest):
13228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    """
14228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    Verify the correct behaviour of the device when searching for services and
15228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    attributes.
16228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    """
17228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    version = 1
18228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
19af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov    MIN_ATTR_BYTE_CNT                = 7
20549094a83e986926189571ab96d486906057d9f7Artem Rakhov    MAX_ATTR_BYTE_CNT                = 300
21549094a83e986926189571ab96d486906057d9f7Artem Rakhov
22b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    BLUETOOTH_BASE_UUID              = 0x0000000000001000800000805F9B34FB
23b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
24549094a83e986926189571ab96d486906057d9f7Artem Rakhov    NON_EXISTING_SERVICE_CLASS_ID    = 0x9875
25549094a83e986926189571ab96d486906057d9f7Artem Rakhov    SDP_SERVER_CLASS_ID              = 0x1000
26549094a83e986926189571ab96d486906057d9f7Artem Rakhov    PUBLIC_BROWSE_GROUP_CLASS_ID     = 0x1002
27549094a83e986926189571ab96d486906057d9f7Artem Rakhov    GAP_CLASS_ID                     = 0x1800
28549094a83e986926189571ab96d486906057d9f7Artem Rakhov    PNP_INFORMATION_CLASS_ID         = 0x1200
29549094a83e986926189571ab96d486906057d9f7Artem Rakhov    PUBLIC_BROWSE_ROOT               = 0x1002
30549094a83e986926189571ab96d486906057d9f7Artem Rakhov    AVRCP_TG_CLASS_ID                = 0x110C
31549094a83e986926189571ab96d486906057d9f7Artem Rakhov
32549094a83e986926189571ab96d486906057d9f7Artem Rakhov    NON_EXISTING_ATTRIBUTE_ID        = 0xABCD
33549094a83e986926189571ab96d486906057d9f7Artem Rakhov    SERVICE_CLASS_ID_ATTRIBUTE_ID    = 0x0001
34549094a83e986926189571ab96d486906057d9f7Artem Rakhov    SERVICE_DATABASE_STATE_ATTR_ID   = 0x0201
35549094a83e986926189571ab96d486906057d9f7Artem Rakhov    PROTOCOL_DESCRIPTOR_LIST_ATTR_ID = 0x0004
36549094a83e986926189571ab96d486906057d9f7Artem Rakhov    ICON_URL_ATTR_ID                 = 0x000C
37549094a83e986926189571ab96d486906057d9f7Artem Rakhov    VERSION_NUMBER_LIST_ATTR_ID      = 0x0200
38549094a83e986926189571ab96d486906057d9f7Artem Rakhov    PROFILE_DESCRIPTOR_LIST_ATTR_ID  = 0x0009
39549094a83e986926189571ab96d486906057d9f7Artem Rakhov    BROWSE_GROUP_LIST_ATTR_ID        = 0x0005
40549094a83e986926189571ab96d486906057d9f7Artem Rakhov    DOCUMENTATION_URL_ATTR_ID        = 0x000A
41549094a83e986926189571ab96d486906057d9f7Artem Rakhov    CLIENT_EXECUTABLE_URL_ATTR_ID    = 0x000B
42549094a83e986926189571ab96d486906057d9f7Artem Rakhov    ADDITIONAL_PROTOCOLLIST_ATTR_ID  = 0x000D
43549094a83e986926189571ab96d486906057d9f7Artem Rakhov
44549094a83e986926189571ab96d486906057d9f7Artem Rakhov    L2CAP_UUID                       = 0x0100
45549094a83e986926189571ab96d486906057d9f7Artem Rakhov    ATT_UUID                         = 0x0007
46549094a83e986926189571ab96d486906057d9f7Artem Rakhov
474d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal    ATT_PSM                          = 0x001F
484d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal
49549094a83e986926189571ab96d486906057d9f7Artem Rakhov    BLUEZ_URL                        = 'http://www.bluez.org/'
50228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
51b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    FAKE_SERVICE_PATH                = '/autotest/fake_service'
52b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    FAKE_SERVICE_CLASS_ID            = 0xCDEF
53b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    FAKE_ATTRIBUTE_VALUE             = 42
54b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    LANGUAGE_BASE_ATTRIBUTE_ID       = 0x0006
55b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    FAKE_GENERAL_ATTRIBUTE_IDS       = [
56b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0002, # TP/SERVER/SSA/BV-07-C
57b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0007, # TP/SERVER/SSA/BV-09-C
58b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0003, # TP/SERVER/SSA/BV-10-C
59b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0008, # TP/SERVER/SSA/BV-14-C
60b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        # TP/SERVER/SSA/BV-13-C:
61b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        LANGUAGE_BASE_ATTRIBUTE_ID
62b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                       ]
63b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    FAKE_LANGUAGE_ATTRIBUTE_OFFSETS  = [
64b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0000, # TP/SERVER/SSA/BV-16-C
65b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0001, # TP/SERVER/SSA/BV-17-C
66b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                        0x0002  # TP/SERVER/SSA/BV-18-C
67b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                       ]
68b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
69ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov    ERROR_CODE_INVALID_SYNTAX        = 0x0003
70ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov    ERROR_CODE_INVALID_PDU_SIZE      = 0x0004
71ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
72b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
73c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld    def fail_test(self, testname, value):
74c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        """Raise an error for a particular SDP test.
75c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
76c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @param testname: a string representation of the test name.
77c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @param value: the value that did not pass muster.
78c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
79c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        """
80c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        raise error.TestFail('SDP test %s failed: got %s.' % (testname, value))
81c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
82c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
83b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    def build_service_record(self):
84b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        """Build SDP record manually for the fake service.
85b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
86b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        @return resulting record as string
87b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
88b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        """
89b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        value = ET.Element('uint16', {'value': str(self.FAKE_ATTRIBUTE_VALUE)})
90b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
91b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        sdp_record = ET.Element('record')
92b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
93b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        service_id_attr = ET.Element(
94b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            'attribute', {'id': str(self.SERVICE_CLASS_ID_ATTRIBUTE_ID)})
95b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        service_id_attr.append(
96b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            ET.Element('uuid', {'value': '0x%X' % self.FAKE_SERVICE_CLASS_ID}))
97b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        sdp_record.append(service_id_attr)
98b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
99b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        for attr_id in self.FAKE_GENERAL_ATTRIBUTE_IDS:
100b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr = ET.Element('attribute', {'id': str(attr_id)})
101b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr.append(value)
102b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            sdp_record.append(attr)
103b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
104b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        for offset in self.FAKE_LANGUAGE_ATTRIBUTE_OFFSETS:
105b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr_id = self.FAKE_ATTRIBUTE_VALUE + offset
106b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr = ET.Element('attribute', {'id': str(attr_id)})
107b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr.append(value)
108b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            sdp_record.append(attr)
109b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
110b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        sdp_record_str = ('<?xml version="1.0" encoding="UTF-8"?>' +
111b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                          ET.tostring(sdp_record))
112b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        return sdp_record_str
113b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
114b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
115228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def test_non_existing(self, class_id, attr_id):
116228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Check that a single attribute of a single service does not exist
117228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
118228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        @param class_id: Class ID of service to check.
119228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        @param attr_id: ID of attribute to check.
120228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
121c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if service or attribute does exists.
122228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
123228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
124228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        for size in 16, 32, 128:
125228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov            result = self.tester.service_search_attribute_request(
126228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov                         [class_id],
127228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov                         self.MAX_ATTR_BYTE_CNT,
128228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov                         [attr_id],
129228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov                         size)
130228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov            if result != []:
131c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                raise error.TestFail('Attribute %s of class %s exists when it '
132c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                                     'should not!' % (class_id, attr_id))
133228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
134228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
135549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def get_attribute(self, class_id, attr_id, size):
136549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Get a single attribute of a single service using Service Search
137549094a83e986926189571ab96d486906057d9f7Artem Rakhov        Attribute Request.
138549094a83e986926189571ab96d486906057d9f7Artem Rakhov
139549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @param class_id: Class ID of service to check.
140549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @param attr_id: ID of attribute to check.
141549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @param size: Preferred size of UUID.
142549094a83e986926189571ab96d486906057d9f7Artem Rakhov
143c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @return attribute value if attribute exists
144c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
145c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if attribute does not exist
146549094a83e986926189571ab96d486906057d9f7Artem Rakhov
147549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
148549094a83e986926189571ab96d486906057d9f7Artem Rakhov        res = self.tester.service_search_attribute_request(
149549094a83e986926189571ab96d486906057d9f7Artem Rakhov                  [class_id], self.MAX_ATTR_BYTE_CNT, [attr_id], size)
150549094a83e986926189571ab96d486906057d9f7Artem Rakhov
151549094a83e986926189571ab96d486906057d9f7Artem Rakhov        if (isinstance(res, list) and len(res) == 1 and
152549094a83e986926189571ab96d486906057d9f7Artem Rakhov            isinstance(res[0], list) and len(res[0]) == 2 and
153549094a83e986926189571ab96d486906057d9f7Artem Rakhov            res[0][0] == attr_id):
154549094a83e986926189571ab96d486906057d9f7Artem Rakhov            return res[0][1]
155549094a83e986926189571ab96d486906057d9f7Artem Rakhov
156c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        raise error.TestFail('Attribute %s of class %s does not exist! (size '
157c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                             '%s)' % (class_id, attr_id, size))
158549094a83e986926189571ab96d486906057d9f7Artem Rakhov
159549094a83e986926189571ab96d486906057d9f7Artem Rakhov
160549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_attribute(self, class_id, attr_id):
161549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Test a single attribute of a single service using 16-bit, 32-bit and
162549094a83e986926189571ab96d486906057d9f7Artem Rakhov        128-bit size of UUID.
163549094a83e986926189571ab96d486906057d9f7Artem Rakhov
164549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @param class_id: Class ID of service to check.
165549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @param attr_id: ID of attribute to check.
166549094a83e986926189571ab96d486906057d9f7Artem Rakhov
167549094a83e986926189571ab96d486906057d9f7Artem Rakhov        @return attribute value if attribute exists and values from three tests
168c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        are equal
169c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld
170c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if attribute doesn't exist or values not equal
171549094a83e986926189571ab96d486906057d9f7Artem Rakhov
172549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
173549094a83e986926189571ab96d486906057d9f7Artem Rakhov        result_16 = self.get_attribute(class_id, attr_id, 16)
174549094a83e986926189571ab96d486906057d9f7Artem Rakhov        for size in 32, 128:
175549094a83e986926189571ab96d486906057d9f7Artem Rakhov            result_cur = self.get_attribute(class_id, attr_id, size)
176549094a83e986926189571ab96d486906057d9f7Artem Rakhov            if result_16 != result_cur:
177c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                raise error.TestFail('Attribute test failed %s: expected %s, '
178c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                                     'got %s' % (size, result_16, result_cur))
179549094a83e986926189571ab96d486906057d9f7Artem Rakhov
180549094a83e986926189571ab96d486906057d9f7Artem Rakhov        return result_16
181549094a83e986926189571ab96d486906057d9f7Artem Rakhov
182549094a83e986926189571ab96d486906057d9f7Artem Rakhov
183228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def test_non_existing_service(self):
184228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BV-01-C from SDP Specification.
185228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
186c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
187228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
188228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
189c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing(self.NON_EXISTING_SERVICE_CLASS_ID,
190c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                               self.SERVICE_CLASS_ID_ATTRIBUTE_ID)
191228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
192228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
193228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def test_non_existing_attribute(self):
194228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BV-02-C from SDP Specification.
195228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
196c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
197228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
198228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
199c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing(self.PUBLIC_BROWSE_GROUP_CLASS_ID,
200c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                               self.NON_EXISTING_ATTRIBUTE_ID)
201228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
202228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
203228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def test_non_existing_service_attribute(self):
204228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BV-03-C from SDP Specification.
205228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
206c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
207228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
208228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
209c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing(self.NON_EXISTING_SERVICE_CLASS_ID,
210c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                               self.NON_EXISTING_ATTRIBUTE_ID)
211228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
212228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
213228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def test_existing_service_attribute(self):
214228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BV-04-C from SDP Specification.
215228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
216c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
217228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
218228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
219549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.SDP_SERVER_CLASS_ID,
220549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.SERVICE_CLASS_ID_ATTRIBUTE_ID)
221c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not value == [self.SDP_SERVER_CLASS_ID]:
222c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-04-C', value)
223228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
224549094a83e986926189571ab96d486906057d9f7Artem Rakhov
225549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_service_database_state_attribute(self):
226549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-08-C from SDP Specification.
227549094a83e986926189571ab96d486906057d9f7Artem Rakhov
228c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
229549094a83e986926189571ab96d486906057d9f7Artem Rakhov
230549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
231549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.SDP_SERVER_CLASS_ID,
232549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.SERVICE_DATABASE_STATE_ATTR_ID)
233c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not isinstance(value, int):
234c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-08-C', value)
235549094a83e986926189571ab96d486906057d9f7Artem Rakhov
236549094a83e986926189571ab96d486906057d9f7Artem Rakhov
237549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_protocol_descriptor_list_attribute(self):
238549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-11-C from SDP Specification.
239549094a83e986926189571ab96d486906057d9f7Artem Rakhov
240c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
241549094a83e986926189571ab96d486906057d9f7Artem Rakhov
242549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
243549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.GAP_CLASS_ID,
244549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.PROTOCOL_DESCRIPTOR_LIST_ATTR_ID)
2454d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal
2464d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal        # The first-layer protocol is L2CAP, using the PSM for ATT protocol.
2474d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal        if value[0] != [self.L2CAP_UUID, self.ATT_PSM]:
248c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-11-C', value)
2494d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal
2504d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal        # The second-layer protocol is ATT. The additional parameters are
2514d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal        # ignored, since they may reasonably vary between implementations.
2524d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal        if value[1][0] != self.ATT_UUID:
253c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-11-C', value)
2544d0fee319d3f914cfd87aca3fb00928a1d258c64mukesh agrawal
255549094a83e986926189571ab96d486906057d9f7Artem Rakhov
256549094a83e986926189571ab96d486906057d9f7Artem Rakhov
257549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_browse_group_attribute(self):
258549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-12-C from SDP Specification.
259549094a83e986926189571ab96d486906057d9f7Artem Rakhov
260c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
261549094a83e986926189571ab96d486906057d9f7Artem Rakhov
262549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
263549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.GAP_CLASS_ID,
264549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.BROWSE_GROUP_LIST_ATTR_ID)
265c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not value == [self.PUBLIC_BROWSE_ROOT]:
266c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-12-C', value)
267549094a83e986926189571ab96d486906057d9f7Artem Rakhov
268549094a83e986926189571ab96d486906057d9f7Artem Rakhov
269549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_icon_url_attribute(self):
270549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-15-C from SDP Specification.
271549094a83e986926189571ab96d486906057d9f7Artem Rakhov
272c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
273549094a83e986926189571ab96d486906057d9f7Artem Rakhov
274549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
275549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.GAP_CLASS_ID,
276549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.ICON_URL_ATTR_ID)
277c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not value == self.BLUEZ_URL:
278c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-15-C', value)
279549094a83e986926189571ab96d486906057d9f7Artem Rakhov
280549094a83e986926189571ab96d486906057d9f7Artem Rakhov
281549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_version_list_attribute(self):
282549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-19-C from SDP Specification.
283549094a83e986926189571ab96d486906057d9f7Artem Rakhov
284c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
285549094a83e986926189571ab96d486906057d9f7Artem Rakhov
286549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
287549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.SDP_SERVER_CLASS_ID,
288549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.VERSION_NUMBER_LIST_ATTR_ID)
289c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not isinstance(value, list) and value != []:
290c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-19-C', value)
291549094a83e986926189571ab96d486906057d9f7Artem Rakhov
292549094a83e986926189571ab96d486906057d9f7Artem Rakhov
293549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_profile_descriptor_list_attribute(self):
294549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-20-C from SDP Specification.
295549094a83e986926189571ab96d486906057d9f7Artem Rakhov
296c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
297549094a83e986926189571ab96d486906057d9f7Artem Rakhov
298549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
299549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.PNP_INFORMATION_CLASS_ID,
300549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.PROFILE_DESCRIPTOR_LIST_ATTR_ID)
301c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not (isinstance(value, list) and len(value) == 1 and
302549094a83e986926189571ab96d486906057d9f7Artem Rakhov                isinstance(value[0], list) and len(value[0]) == 2 and
303c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                value[0][0] == self.PNP_INFORMATION_CLASS_ID):
304c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-20-C', value)
305549094a83e986926189571ab96d486906057d9f7Artem Rakhov
306549094a83e986926189571ab96d486906057d9f7Artem Rakhov
307549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_documentation_url_attribute(self):
308549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-21-C from SDP Specification.
309549094a83e986926189571ab96d486906057d9f7Artem Rakhov
310c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
311549094a83e986926189571ab96d486906057d9f7Artem Rakhov
312549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
313549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.GAP_CLASS_ID,
314549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.DOCUMENTATION_URL_ATTR_ID)
315c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not value == self.BLUEZ_URL:
316c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-21-C', value)
317549094a83e986926189571ab96d486906057d9f7Artem Rakhov
318549094a83e986926189571ab96d486906057d9f7Artem Rakhov
319549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_client_executable_url_attribute(self):
320549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-22-C from SDP Specification.
321549094a83e986926189571ab96d486906057d9f7Artem Rakhov
322c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
323549094a83e986926189571ab96d486906057d9f7Artem Rakhov
324549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
325549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.GAP_CLASS_ID,
326549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.CLIENT_EXECUTABLE_URL_ATTR_ID)
327c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not value == self.BLUEZ_URL:
328c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-22-C', value)
329549094a83e986926189571ab96d486906057d9f7Artem Rakhov
330549094a83e986926189571ab96d486906057d9f7Artem Rakhov
331549094a83e986926189571ab96d486906057d9f7Artem Rakhov    def test_additional_protocol_descriptor_list_attribute(self):
332549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """Implementation of test TP/SERVER/SSA/BV-23-C from SDP Specification.
333549094a83e986926189571ab96d486906057d9f7Artem Rakhov
334c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
335549094a83e986926189571ab96d486906057d9f7Artem Rakhov
336549094a83e986926189571ab96d486906057d9f7Artem Rakhov        """
337d751d486a46ee14b8599eeb24f5e6288ce4d4468Pavan Savoy
338d751d486a46ee14b8599eeb24f5e6288ce4d4468Pavan Savoy        """AVRCP is not supported by Chromebook and no need to run this test
339549094a83e986926189571ab96d486906057d9f7Artem Rakhov        value = self.test_attribute(self.AVRCP_TG_CLASS_ID,
340549094a83e986926189571ab96d486906057d9f7Artem Rakhov                                    self.ADDITIONAL_PROTOCOLLIST_ATTR_ID)
341c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not isinstance(value, list) and value != []:
342c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.fail_test('TP/SERVER/SSA/BV-23-C', value)
343d751d486a46ee14b8599eeb24f5e6288ce4d4468Pavan Savoy        """
344228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
345b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov    def test_fake_attributes(self):
346b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        """Test values of attributes of the fake service record.
347b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
348c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
349b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
350b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        """
351b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        for attr_id in self.FAKE_GENERAL_ATTRIBUTE_IDS:
352b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            value = self.test_attribute(self.FAKE_SERVICE_CLASS_ID, attr_id)
353b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            if value != self.FAKE_ATTRIBUTE_VALUE:
354c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.fail_test('fake service attributes', value)
355b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
356b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        for offset in self.FAKE_LANGUAGE_ATTRIBUTE_OFFSETS:
357b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            lang_base = self.test_attribute(self.FAKE_SERVICE_CLASS_ID,
358b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                            self.LANGUAGE_BASE_ATTRIBUTE_ID)
359b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            attr_id = lang_base + offset
360b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            value = self.test_attribute(self.FAKE_SERVICE_CLASS_ID, attr_id)
361b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov            if value != self.FAKE_ATTRIBUTE_VALUE:
362c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.fail_test('fake service attributes', value)
363b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
364b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
365af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov    def test_continuation_state(self):
366af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov        """Implementation of test TP/SERVER/SSA/BV-06-C from SDP Specification.
367af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov
368c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
369af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov
370af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov        """
371af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov        for size in 16, 32, 128:
372af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov            # This request should generate a long response, which will be
373af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov            # split into 98 chunks.
374af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov            value = self.tester.service_search_attribute_request(
375af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov                        [self.PUBLIC_BROWSE_GROUP_CLASS_ID],
376af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov                        self.MIN_ATTR_BYTE_CNT,
377af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov                        [[0, 0xFFFF]], size)
378af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov            if not isinstance(value, list) or value == []:
379c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.fail_test('TP/SERVER/SSA/BV-06-C', value)
380af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov
381af4b0249ad8791325aa5583e8aaaa549d189c83eArtem Rakhov
382ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov    def test_invalid_request_syntax(self):
383ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BI-01-C from SDP Specification.
384ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
385c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
386ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
387ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        """
388ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        for size in 16, 32, 128:
389ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov            value = self.tester.service_search_attribute_request(
390ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        [self.SDP_SERVER_CLASS_ID],
391ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        self.MAX_ATTR_BYTE_CNT,
392ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        [self.SERVICE_CLASS_ID_ATTRIBUTE_ID],
393ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        size,
394ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        invalid_request='9875')
395ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov            if value != self.ERROR_CODE_INVALID_SYNTAX:
396c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.fail_test('TP/SERVER/SSA/BI-01-C', value)
397ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
398ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
399ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov    def test_invalid_pdu_size(self):
400ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        """Implementation of test TP/SERVER/SSA/BI-02-C from SDP Specification.
401ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
402c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if test fails
403ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
404ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        """
405ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov        for size in 16, 32, 128:
406ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov            value = self.tester.service_search_attribute_request(
407ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        [self.SDP_SERVER_CLASS_ID],
408ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        self.MAX_ATTR_BYTE_CNT,
409ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        [self.SERVICE_CLASS_ID_ATTRIBUTE_ID],
410ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        size,
411ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov                        forced_pdu_size=100)
412ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov            if value != self.ERROR_CODE_INVALID_PDU_SIZE:
413c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.fail_test('TP/SERVER/SSA/BI-02-C', value)
414ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
415ef5a458439a763afa1937837cdf5b6d7065be74dArtem Rakhov
416228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def correct_request(self):
417228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """Run tests for Service Search Attribute request.
418228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
419c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        @raises error.TestFail if any test fails
420228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
421228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        """
422228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # connect to the DUT via L2CAP using SDP socket
423228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        self.tester.connect(self.adapter['Address'])
424228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
425c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing_service()
426c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing_attribute()
427c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_non_existing_service_attribute()
428c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        #self.test_existing_service_attribute()
429c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_service_database_state_attribute()
430c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_protocol_descriptor_list_attribute()
431c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_browse_group_attribute()
432c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_icon_url_attribute()
433c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_version_list_attribute()
434c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_profile_descriptor_list_attribute()
435c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_documentation_url_attribute()
436c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_client_executable_url_attribute()
437c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_additional_protocol_descriptor_list_attribute()
438c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_fake_attributes()
439c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_continuation_state()
440c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_invalid_request_syntax()
441c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        self.test_invalid_pdu_size()
442c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        logging.info('correct_request finished successfully!')
443228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
444228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
445228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov    def run_once(self):
446228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # Reset the adapter to the powered on, discoverable state.
447c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not self.device.reset_on():
448c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            raise error.TestFail('DUT adapter could not be powered on')
449c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        if not self.device.set_discoverable(True):
450c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            raise error.TestFail('DUT could not be set as discoverable')
451228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
452228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        self.adapter = self.device.get_adapter_properties()
453228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
454b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        # Create a fake service record in order to test attributes,
455b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        # that are not present in any of existing services.
456b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        uuid128 = ((self.FAKE_SERVICE_CLASS_ID << 96) +
457b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                   self.BLUETOOTH_BASE_UUID)
458b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        uuid_str = str(uuid.UUID(int=uuid128))
459b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        sdp_record = self.build_service_record()
460b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov        self.device.register_profile(self.FAKE_SERVICE_PATH,
461b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                     uuid_str,
462b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov                                     {"ServiceRecord": sdp_record})
463b0323401ac095b7bd993c53350ca990e7f869b72Artem Rakhov
464228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # Setup the tester as a generic computer.
465228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        if not self.tester.setup('computer'):
466228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov            raise error.TestFail('Tester could not be initialized')
467228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
468228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # Since radio is involved, this test is not 100% reliable; instead we
469228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # repeat a few times until it succeeds.
470c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        passing = False
471c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld        for failed_attempts in range(0, 4):
472c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            try:
473c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                self.correct_request()
474c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                passing = True
475c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            except error.TestFail as e:
476c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld                logging.warning('Ignoring error: %s', e)
477c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            if passing:
478228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov                break
479228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        else:
480c026987fe3ef3f5d16f956176d4f52c464b46856Katherine Threlkeld            self.correct_request()
481228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov
482228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # Record how many attempts this took, hopefully we'll one day figure out
483228220686315aa6082f000ee869cd036e2e2c23dArtem Rakhov        # a way to reduce this to zero and then the loop above can go away.
484549094a83e986926189571ab96d486906057d9f7Artem Rakhov        self.write_perf_keyval({'failed_attempts': failed_attempts})
485