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