def hdl_wid_148(params: WIDParams): """ Please send two Read Multiple Variable Length characteristic requests using these handles: 'XXXX'O 'XXXX'O Required Bearers are "EATT" bearers. Description: Verify that the Implementation Under Test (IUT) can receive multiple characteristics. """ MMI.reset() MMI.parse_description(params.description) hdl1 = MMI.args[0] hdl2 = MMI.args[1] btp.gattc_read_multiple_var(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl1, hdl2) btp.gattc_read_multiple_var(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl1, hdl2) return True
def hdl_wid_81(desc): MMI.reset() MMI.parse_description(desc) hdl = int(MMI.args[0], 16) val_mtp = int(MMI.args[1], 10) + 1 if not hdl or not val_mtp: logging.error("parsing error") return False btp.gattc_write_long(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, 0, '11', val_mtp) btp.gattc_write_long_rsp(True) return True
def hdl_wid_77(desc): MMI.reset() MMI.parse_description(desc) hdl = MMI.args[0] offset = int(MMI.args[1]) if not hdl or not offset: logging.error("parsing error") return False btp.gattc_write_long(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, offset, '12', offset + 2) btp.gattc_write_long_rsp(True) return True
def hdl_wid_80(desc): MMI.reset() MMI.parse_description(desc) hdl = MMI.args[0] val_mtp = MMI.args[1] if not hdl or not val_mtp: logging.error("parsing error") return False btp.gattc_write(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, '1234', val_mtp) btp.gattc_write_rsp(True) return True
def hdl_wid_57(desc): MMI.reset() MMI.parse_description(desc) hdl1 = MMI.args[0] hdl2 = MMI.args[1] if not hdl1 or not hdl2: logging.error("parsing error") return False btp.gattc_read_multiple(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl1, hdl2) btp.gattc_read_multiple_rsp(True, True) return True
def hdl_wid_69(desc): MMI.reset() MMI.parse_description(desc) if not MMI.args: logging.error("parsing error") return False handle = int(MMI.args[0], 16) size = int(MMI.args[1], 10) btp.gattc_write_long(btp.pts_addr_type_get(), btp.pts_addr_get(), handle, 0, '12', size) btp.gattc_write_long_rsp() return True
def hdl_wid_53(desc): MMI.reset() MMI.parse_description(desc) read_hdl = MMI.args[0] offset = MMI.args[1] if not read_hdl or not offset: logging.debug("parsing error") return False btp.gattc_read_long(btp.pts_addr_type_get(), btp.pts_addr_get(), read_hdl, offset, 1) btp.gattc_read_long_rsp(True, False) return True
def hdl_wid_31(desc): MMI.reset() MMI.parse_description(desc) start_hdl = MMI.args[0] end_hdl = MMI.args[1] if not start_hdl or not end_hdl: logging.error("parsing error") return False btp.gattc_disc_all_desc(btp.pts_addr_type_get(), btp.pts_addr_get(), start_hdl, end_hdl) btp.gattc_disc_all_desc_rsp(True) return True
def hdl_wid_23(desc): MMI.reset() MMI.parse_description(desc) pts_services = [[int(MMI.args[1], 16), int(MMI.args[2], 16), MMI.args[0]]] if not pts_services: logging.debug("parsing error") return False iut_services = [] # [start_hdl, end_hdl, uuid] iut_service = None # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: start_handle, perm, type_uuid = attr if iut_service is not None: iut_service[1] = start_handle - 1 iut_services.append(iut_service) iut_service = None val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), start_handle) if not val: continue (_, uuid_len, uuid) = val iut_service = [start_handle, "unknown", btp.btp2uuid(uuid_len, uuid)] iut_services.append(iut_service) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %r found", service) continue else: logging.error("Service %r not found", service) return False return True
def hdl_wid_48_no_long_read(desc): MMI.reset() MMI.parse_description(desc) hdl = MMI.args[0] if not hdl: logging.debug("parsing error") return False btp.gattc_read(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl) try: btp.gattc_read_rsp(True, True) except socket.timeout: pass return True
def hdl_wid_20(desc): MMI.reset() MMI.parse_description(desc) uuid = MMI.args[0] if not uuid: logging.error("%s parsing error", hdl_wid_20.__name__) return False btp.gattc_disc_prim_uuid(btp.pts_addr_type_get(), btp.pts_addr_get(), uuid) btp.gattc_disc_prim_uuid_rsp(True) return True
def hdl_wid_24(desc): MMI.reset() MMI.parse_description(desc) # Include service in description should have 3 parameters: # Attribute Handle, Included Service Attribute Handle and End Group Handle num_includes = len(MMI.args) // 3 pts_services = [] for i in range(num_includes): pts_services.append([int(MMI.args[i + 0], 16), int(MMI.args[i + 1], 16), int(MMI.args[i + 2], 16)]) iut_services = [] # Get all Included services attrs = btp.gatts_get_attrs(type_uuid='2802') for attr in attrs: handle, perm, type_uuid = attr val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not val: continue (_, val_len, attr_value) = val hdr = '<HH' hdr_len = struct.calcsize(hdr) data_len = val_len - hdr_len incl_hdl, end_hdl, _ = struct.unpack(hdr + '%ds' % data_len, attr_value) iut_services.append([handle, incl_hdl, end_hdl]) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %r found", service) continue logging.error("Service %r not found", service) return False return True
def hdl_wid_75(desc): MMI.reset() MMI.parse_description(desc) if not MMI.args: logging.debug("parsing error") handle = int(MMI.args[0], 16) value = int(MMI.args[1], 16) stack = get_stack() val = stack.gatt.wait_attr_value_changed(handle, 10) if val is None: return False val = int(val, 16) return val == value
def hdl_wid_29(desc): MMI.reset() MMI.parse_description(desc) start_hdl = MMI.args[0] end_hdl = MMI.args[1] uuid = MMI.args[2] if not start_hdl or not end_hdl or not uuid: logging.error("parsing error") return False btp.gattc_disc_chrc_uuid(btp.pts_addr_type_get(), btp.pts_addr_get(), start_hdl, end_hdl, uuid) btp.gattc_disc_chrc_uuid_rsp(True) return True
def hdl_wid_17(desc): MMI.reset() MMI.parse_description(desc) iut_services = [] attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: handle, perm, type_uuid = attr (_, uuid_len, uuid) = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) uuid = btp.btp2uuid(uuid_len, uuid) iut_services.append(uuid) if iut_services == MMI.args: return True else: return False
def hdl_wid_109(desc): MMI.reset() MMI.parse_description(desc) uuid = MMI.args[0] if not uuid: logging.debug("parsing error") return False btp.gattc_read_uuid(btp.pts_addr_type_get(), btp.pts_addr_get(), "0001", "FFFF", uuid) try: btp.gattc_read_uuid_rsp(False, True) except socket.timeout: return False return True
def hdl_wid_75(desc): MMI.reset() MMI.parse_description(desc) if not MMI.args: logging.debug("parsing error") handle = int(MMI.args[0], 16) value = MMI.args[1] time.sleep(5) attr = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) _, _, val = attr parsed_val = hexlify(val).decode('utf-8').upper() return bool(value == parsed_val)
def hdl_wid_74(desc): MMI.reset() MMI.parse_description(desc) hdl = MMI.args[0] size = int(MMI.args[1]) if not hdl or size == 0: logging.error("parsing error") return False btp.gattc_write(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, '12', size) try: btp.gattc_write_rsp(True, 40) except socket.timeout: pass return True
def hdl_wid_51(desc): MMI.reset() MMI.parse_description(desc) uuid = MMI.args[0] start_hdl = MMI.args[1] end_hdl = MMI.args[2] if not uuid or not start_hdl or not end_hdl: logging.debug("parsing error") return False btp.gattc_read_uuid(btp.pts_addr_type_get(), btp.pts_addr_get(), start_hdl, end_hdl, uuid) try: btp.gattc_read_uuid_rsp(True, True) except socket.timeout: pass return True
def hdl_wid_98(desc): MMI.reset() MMI.parse_description(desc) if not MMI.args: logging.error("parsing error") return False handle = int(MMI.args[0], 16) att_rsp, value_len, value = btp.gatts_get_attr_val(handle) if att_rsp: logging.debug("cannot read chrc value") return False # delay to let the PTS subscribe for notifications sleep(2) btp.gatts_set_val(handle, hexlify(value)), return True
def hdl_wid_56(desc): MMI.reset() MMI.parse_description(desc) if not MMI.args or len(MMI.args) != 3: logging.error("parsing error") handle1 = MMI.args[0] handle2 = MMI.args[1] values = MMI.args[2] values_read = "" att_rsp, value_len, value = btp.gatts_get_attr_val(handle1) values_read += hexlify(value) att_rsp, value_len, value = btp.gatts_get_attr_val(handle2) values_read += hexlify(value) if values_read.upper() != values.upper(): return False return True
def hdl_wid_48(params: WIDParams): MMI.reset() MMI.parse_description(params.description) hdl = MMI.args[0] if not hdl: logging.debug("parsing error") return False no_read_long_tests = [ "GATT/CL/GAR/BI-01-C", "GATT/CL/GAR/BI-02-C", "GATT/CL/GAR/BI-03-C", "GATT/CL/GAR/BI-04-C", "GATT/CL/GAR/BI-05-C", "GATT/CL/GAR/BI-11-C", "GATT/CL/GAR/BI-35-C", "GATT/CL/GAR/BV-01-C", ] no_btp_reply_tests = [ "GATT/CL/GAT/BV-01-C", ] if params.test_case_name in no_read_long_tests: btp.gattc_read(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl) btp.gattc_read_rsp(False, True) return True if params.test_case_name in no_btp_reply_tests: btp.gattc_read(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl) return True btp.gattc_read_long(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, 0, 1) btp.gattc_read_long_rsp(False, True) return True
def hdl_wid_150(params: WIDParams): """ Please send an ATT_Write_Request to Client Support Features handle = 'XXXX'O to enable Multiple Handle Value Notifications. Discover all characteristics if needed. """ MMI.reset() MMI.parse_description(params.description) hdl = MMI.args[0] # First read the existing value in Client Supported Features. btp.gattc_read(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl) btp.gattc_read_rsp(False, True) client_support_features = int(btp.get_verify_values()[0]) # Set Multiple Handle Value Notifications bit in features. multi_hvn_bit = 4 value = client_support_features | multi_hvn_bit btp.gattc_write(btp.pts_addr_type_get(), btp.pts_addr_get(), hdl, f'{value:02x}') btp.gattc_write_rsp() return True
def hdl_wid_98(params: WIDParams): MMI.reset() MMI.parse_description(params.description) if not MMI.args: logging.error("parsing error") return False handle = int(MMI.args[0], 16) bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() att_rsp, value_len, value = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if att_rsp: logging.debug("cannot read chrc value") return False # delay, to let the PTS subscribe for notifications sleep(2) btp.gatts_set_val(handle, hexlify(value)) return True