Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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
Beispiel #14
0
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
Beispiel #16
0
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
Beispiel #17
0
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)
Beispiel #18
0
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
Beispiel #19
0
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
Beispiel #20
0
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
Beispiel #21
0
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
Beispiel #22
0
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
Beispiel #23
0
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
Beispiel #24
0
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