Ejemplo n.º 1
0
def log_transferred_value(text: str, aid: int,
                          characteristic: AbstractCharacteristic, value,
                          filtered_value):
    """
    Logs the transfer of a value between controller and acccessory or vice versa. For characteristics
    of type TLV8, a decoder is used if available else a deep decode is done.

    :param text: a `str` to express which direction of transfer takes place
    :param aid: the accessory id
    :param characteristic: the characteristic for which the transfer takes place
    :param value: the value that was transferred
    """
    iid = int(characteristic.iid)
    debug_value = value
    filtered_debug_value = filtered_value
    characteristic_name = CharacteristicsTypes.get_short(characteristic.type)
    if characteristic.format == CharacteristicFormats.tlv8:
        bytes_value = base64.b64decode(value)
        filtered_bytes_value = base64.b64decode(filtered_value)
        decoder = decoder_loader.load(characteristic.type)
        if decoder:
            try:
                debug_value = tlv8.format_string(decoder(bytes_value))
                filtered_debug_value = tlv8.format_string(
                    decoder(filtered_bytes_value))
            except Exception as e:
                logging.error('problem decoding', e)
        else:
            debug_value = tlv8.format_string(tlv8.deep_decode(bytes_value))
            filtered_debug_value = tlv8.format_string(
                tlv8.deep_decode(filtered_bytes_value))
    logging.info(
        '%s %s.%s (type %s / %s): \n\toriginal value: %s\n\tfiltered value: %s'
        % (text, aid, iid, characteristic.type, characteristic_name,
           debug_value, filtered_debug_value))
Ejemplo n.º 2
0
 def test_decode_example_2(self):
     input_data = b'\x01\x01\x00'
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'\x00'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 3
0
 def test_decode_int4(self):
     input_data = b'\x01\x08' + pack('<q', 4611686018427387904)
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'\x00\x00\x00\x00\x00\x00\x00@'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 4
0
 def test_decode_int1(self):
     input_data = b'\x01\x01' + pack('<b', -123)
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'\x85'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 5
0
 def test_decode_int2(self):
     input_data = b'\x01\x02' + pack('<h', 12345)
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'90'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 6
0
 def test_decode_missing_separator_nonstrict(self):
     data = b'\x01\x01\x02\x01\x01\x02'
     result = tlv8.deep_decode(data, strict_mode=False)
     self.assertEqual(
         result,
         tlv8.EntryList([tlv8.Entry(1, b'\x02'),
                         tlv8.Entry(1, b'\x02')]))
Ejemplo n.º 7
0
 def test_decode_float(self):
     input_data = b'\x01\x04' + pack('<f', 3.141)
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'%\x06I@'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 8
0
 def test_decode_misinterpretation(self):
     """This show how data may be misinterpreted by deep_decode"""
     data = tlv8.encode([tlv8.Entry(1, 16843330), tlv8.Entry(2, b'\x01')])
     result = tlv8.deep_decode(data)
     expected_data = tlv8.EntryList([
         tlv8.Entry(1, tlv8.EntryList([tlv8.Entry(66, b'\x01\x01')])),
         tlv8.Entry(2, b'\x01')
     ])
     self.assertEqual(result, expected_data)
Ejemplo n.º 9
0
 def test_decode_4(self):
     input_data = b'\x01\x01\x23\x02\x03\x04\x01\x42\x01\x01\x23'
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(1, b'#'),
         tlv8.Entry(2, tlv8.EntryList([
             tlv8.Entry(4, b'B'),
         ])),
         tlv8.Entry(1, b'#'),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 10
0
    def test_decode_257bytes(self):
        data = b''
        for i in range(0, 257):
            data += pack('<B', i % 256)

        input_data = b'\x17\xff' + data[0:255] + b'\x17\x02' + data[255:]

        result = tlv8.deep_decode(input_data)

        expected = tlv8.EntryList([tlv8.Entry(23, data)])
        self.assertEqual(result, expected)
Ejemplo n.º 11
0
 def write_http(request, expected):
     body = tlv8.encode(request)
     logging.debug('write message: %s',
                   tlv8.format_string(tlv8.deep_decode(body)))
     connection.putrequest('POST', '/pair-setup', skip_accept_encoding=True)
     connection.putheader('Content-Type', 'application/pairing+tlv8')
     connection.putheader('Content-Length', len(body))
     connection.endheaders(body)
     resp = connection.getresponse()
     response_tlv = tlv8.decode(resp.read(), expected)
     logging.debug('response: %s', tlv8.format_string(response_tlv))
     return response_tlv
Ejemplo n.º 12
0
 def test_decode_supported_rtp_configs(self):
     data = \
         b'\x02\x01\x00' + \
         b'\x00\x00' + \
         b'\x02\x01\x01'
     result = tlv8.deep_decode(data, )
     expected_data = tlv8.EntryList([
         tlv8.Entry(2, b'\x00'),
         tlv8.Entry(0, tlv8.EntryList()),
         tlv8.Entry(2, b'\x01')
     ])
     self.assertEqual(result, expected_data)
Ejemplo n.º 13
0
 def test_decode_example_3(self):
     input_data = b'\x01\x15\x01\x10e\xad\x8b\xe8\xb3fD\xcb\xbde#\xccc\n\xb8\xef\x02\x01\x01'
     result = tlv8.deep_decode(input_data)
     expected = tlv8.EntryList([
         tlv8.Entry(
             1,
             tlv8.EntryList([
                 tlv8.Entry(
                     1, b'e\xad\x8b\xe8\xb3fD\xcb\xbde#\xccc\n\xb8\xef'),
                 tlv8.Entry(2, b'\x01'),
             ])),
     ])
     self.assertEqual(expected, result)
Ejemplo n.º 14
0
 def test_decode_single_entry_bytearry(self):
     input_data = bytearray(b'\x02\x01\x23')
     result = tlv8.deep_decode(input_data)
     self.assertEqual(tlv8.EntryList([tlv8.Entry(2, b'\x23')]), result)
Ejemplo n.º 15
0
 def test_decode_2_entries(self):
     input_data = b'\x02\x01\x23\x03\x01\x42'
     result = tlv8.deep_decode(input_data)
     self.assertEqual(
         tlv8.EntryList([tlv8.Entry(2, b'\x23'),
                         tlv8.Entry(3, b'\x42')]), result)
Ejemplo n.º 16
0
 def test_decode_error_4(self):
     data = b'\x01\x02Hi'
     result = tlv8.deep_decode(data)
     expected_data = tlv8.EntryList([tlv8.Entry(1, b'Hi')])
     self.assertEqual(result, expected_data)
Ejemplo n.º 17
0
 def test_zero_input(self):
     input_data = b''
     result = tlv8.deep_decode(input_data)
     self.assertEqual(tlv8.EntryList(), result)
Ejemplo n.º 18
0
    def test_encode_supported_video_stream_configuration(self):
        data = \
            b'\x01\x30' \
                b'\x01\x01\x00' \
                b'\x02\x0f' \
                    b'\x01\x01\x00' \
                    b'\x02\x01\x00' \
                    b'\x03\x01\x00' \
                    b'\x04\x01\x01' \
                    b'\x05\x01\n' \
                b'\x03\x0b' \
                    b'\x01\x02\x00\x05' \
                    b'\x02\x02 \x03' \
                    b'\x03\x01\x1e' \
                b'\xff\x00' \
                b'\x03\x0b' \
                    b'\x01\x02\x80\x02' \
                    b'\x02\x02\xe0\x01' \
                    b'\x03\x01\x1e' \
            b'\xff\x00' \
            b'\x01\x2d' \
                b'\x01\x01\x00' \
                b'\x02\x0c' \
                    b'\x01\x01\x00' \
                    b'\x02\x01\x00' \
                    b'\x03\x01\x00' \
                    b'\x04\x01\x00' \
                b'\x03\x0b' \
                    b'\x01\x02\x00\x05' \
                    b'\x02\x02 \x03' \
                    b'\x03\x01\x1e' \
                b'\xff\x00' \
                b'\x03\x0b' \
                    b'\x01\x02\x80\x02' \
                    b'\x02\x02\xe0\x01' \
                    b'\x03\x01\x1e'
        result = tlv8.deep_decode(data)
        expected_data = tlv8.EntryList([
            tlv8.Entry(
                1,
                tlv8.EntryList([  # video codec config
                    tlv8.Entry(1, b'\x00'),  # h.264
                    tlv8.Entry(
                        2,
                        tlv8.EntryList([  # video codec param
                            tlv8.Entry(
                                1, b'\x00'),  # Constrained Baseline Profile
                            tlv8.Entry(2, b'\x00'),  # Level 3.1
                            tlv8.Entry(
                                3, b'\x00'
                            ),  # Packetization mode: Non-interleaved mode
                            tlv8.Entry(4, b'\x01'),  # CVO not enabled
                            tlv8.Entry(5, b'\n'),  # CVO ID
                        ])),
                    tlv8.Entry(
                        3,
                        tlv8.EntryList([  # video attributes
                            tlv8.Entry(1, b'\x00\x05'),  # width
                            tlv8.Entry(2, b' \x03'),  # height
                            tlv8.Entry(3, b'\x1e')  # fps
                        ])),
                    tlv8.Entry(255, tlv8.EntryList()),
                    tlv8.Entry(
                        3,
                        tlv8.EntryList([  # video attributes
                            tlv8.Entry(1, b'\x80\x02'),  # width
                            tlv8.Entry(2, b'\xe0\x01'),  # height
                            tlv8.Entry(3, b'\x1e')  # fps
                        ]))
                ])),
            tlv8.Entry(255, tlv8.EntryList()),
            tlv8.Entry(
                1,
                tlv8.EntryList([
                    tlv8.Entry(1, b'\x00'),  # h.264
                    tlv8.Entry(
                        2,
                        tlv8.EntryList([  # video codec param
                            tlv8.Entry(
                                1, b'\x00'),  # Constrained Baseline Profile
                            tlv8.Entry(2, b'\x00'),  # Level 3.1
                            tlv8.Entry(
                                3, b'\x00'
                            ),  # Packetization mode: Non-interleaved mode
                            tlv8.Entry(4, b'\x00'),  # CVO not enabled
                        ])),
                    tlv8.Entry(
                        3,
                        tlv8.EntryList([  # video attributes
                            tlv8.Entry(1, b'\x00\x05'),  # width
                            tlv8.Entry(2, b' \x03'),  # height
                            tlv8.Entry(3, b'\x1e')  # fps
                        ])),
                    tlv8.Entry(255, tlv8.EntryList()),
                    tlv8.Entry(
                        3,
                        tlv8.EntryList([  # video attributes
                            tlv8.Entry(1, b'\x80\x02'),  # width
                            tlv8.Entry(2, b'\xe0\x01'),  # height
                            tlv8.Entry(3, b'\x1e')  # fps
                        ]))
                ]))
        ])

        self.assertEqual(result, expected_data)