def test_parse_bool(self): in_data = tags.bool_tag('bola', True) + \ tags.bool_tag('bolb', False) parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(2, len(parsed)) self.assertTrue(dmap.first(parsed, 'bola')) self.assertFalse(dmap.first(parsed, 'bolb'))
def test_parse_strings(self): in_data = tags.string_tag('stra', '') + \ tags.string_tag('strb', 'test string') parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(2, len(parsed)) self.assertEqual('', dmap.first(parsed, 'stra')) self.assertEqual('test string', dmap.first(parsed, 'strb'))
def handle_remote_button(self, request): """Handler for remote control buttons.""" self._verify_auth_parameters(request) content = yield from request.content.read() parsed = dmap.parse(content, tag_definitions.lookup_tag) self.last_button_pressed = dmap.first(parsed, 'cmbe') return web.Response(status=200)
def test_extract_multiple_with_same_name(self): in_data = tags.uint8_tag('uuu8', 1) + \ tags.uint8_tag('uuu8', 2) + \ tags.uint8_tag('uuu8', 3) parsed = dmap.parse(in_data, lookup_tag) iter = dmap.matches(parsed, 'uuu8') self.assertEqual(1, next(iter)) self.assertEqual(2, next(iter)) self.assertEqual(3, next(iter))
def test_parse_uint_of_various_lengths(self): in_data = tags.uint8_tag('uuu8', 12) + \ tags.uint16_tag('uu16', 37888) + \ tags.uint32_tag('uu32', 305419896) parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(3, len(parsed)) self.assertEqual(12, dmap.first(parsed, 'uuu8')) self.assertEqual(37888, dmap.first(parsed, 'uu16')) self.assertEqual(305419896, dmap.first(parsed, 'uu32'))
def test_simple_pprint(self): elem = tags.uint8_tag('uuu8', 12) inner = tags.container_tag('conb', elem) in_data = tags.container_tag('cona', inner) parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(dmap.pprint(parsed, lookup_tag), 'cona: [container, container]\n' + ' conb: [container, container 2]\n' + ' uuu8: 12 [uint, uint8]\n')
def _extract_data(data, should_parse): if _LOGGER.isEnabledFor(logging.DEBUG): output = data[0:128] _LOGGER.debug('Data[%d]: %s%s', len(data), binascii.hexlify(output), '...' if len(output) != len(data) else '') if should_parse: return dmap.parse(data, lookup_tag) else: return data
def test_parse_value_in_container(self): in_data = tags.container_tag('cona', tags.uint8_tag('uuu8', 36) + tags.uint16_tag('uu16', 13000)) parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(1, len(parsed)) inner = dmap.first(parsed, 'cona') self.assertEqual(2, len(inner)) self.assertEqual(36, dmap.first(inner, 'uuu8')) self.assertEqual(13000, dmap.first(inner, 'uu16'))
def test_succesful_pairing(self): yield from self.pairing.start(self.zeroconf) url = self._pairing_url(PAIRING_CODE) data, _ = yield from utils.simple_get(url, self.loop) # Verify content returned in pairingresponse parsed = dmap.parse(data, tag_definitions.lookup_tag) self.assertEqual(dmap.first(parsed, 'cmpa', 'cmpg'), 1) self.assertEqual(dmap.first(parsed, 'cmpa', 'cmnm'), REMOTE_NAME) self.assertEqual(dmap.first(parsed, 'cmpa', 'cmty'), 'ipod')
def test_pair_custom_pairing_guid(self): self.pairing.pin_code = PIN_CODE2 self.pairing.pairing_guid = PAIRING_GUID2 yield from self.pairing.start(self.zeroconf) url = self._pairing_url(PAIRING_CODE2) data, _ = yield from utils.simple_get(url, self.loop) # Verify content returned in pairingresponse parsed = dmap.parse(data, tag_definitions.lookup_tag) self.assertEqual(dmap.first(parsed, 'cmpa', 'cmpg'), int(PAIRING_GUID2, 16))
def perform_pairing(self, pairing_response, port): """Pair with a remote client. This will perform a GET-request to the specified port and hand over information to the client (pyatv) so that the pairing process can be completed. """ server = 'http://127.0.0.1:{}'.format(port) url = '{}/pairing?pairingcode={}&servicename=test'.format( server, pairing_response.pairing_code) data, _ = yield from utils.simple_get(url, self.loop) # Verify content returned in pairingresponse parsed = dmap.parse(data, tag_definitions.lookup_tag) self.tc.assertEqual(dmap.first(parsed, 'cmpa', 'cmpg'), 1) self.tc.assertEqual(dmap.first(parsed, 'cmpa', 'cmnm'), pairing_response.remote_name) self.tc.assertEqual(dmap.first(parsed, 'cmpa', 'cmty'), 'ipod')
def _do(self, action, retry=True, is_login=False, is_daap=True): resp, status = yield from action() if is_daap: resp = dmap.parse(resp, lookup_tag) self._log_response(str(action.__name__) + ': %s', resp, is_daap) if status >= 200 and status < 300: return resp elif not is_login: # If a request fails, try to login again before retrying _LOGGER.info('implicitly logged out, logging in again') yield from self.login() # Retry once if we got a bad response, otherwise bail out if retry: return (yield from self._do(action, False, is_login=is_login, is_daap=is_daap)) else: raise exceptions.AuthenticationError('failed to login: ' + str(status))
def _do(self, action, retry=True, is_login=False, is_daap=True): resp, status = yield from action() if is_daap: resp = dmap.parse(resp, lookup_tag) self._log_response(str(action.__name__) + ': %s', resp, is_daap) if status >= 200 and status < 300: return resp # When a 403 is received we are likely logged out, so a new # login must be performed to get a new session id if status == 403: _LOGGER.info('implicitly logged out, logging in again') yield from self.login() # Retry once if we got a bad response, otherwise bail out if retry: return (yield from self._do( action, False, is_login=is_login, is_daap=is_daap)) else: raise exceptions.AuthenticationError( 'failed to login: ' + str(status))
def test_parse_raw_data(self): in_data = tags.raw_tag('rawa', b'\x01\x02\x03') parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(1, len(parsed)) self.assertEqual(b'\x01\x02\x03', dmap.first(parsed, 'rawa'))
def _extract_data(data, should_parse): if should_parse: return dmap.parse(data, lookup_tag) return data
def test_ignore_value(self): elem = tags.uint8_tag('igno', 44) parsed = dmap.parse(elem, lookup_tag) self.assertEqual(dmap.first(parsed, 'igno'), None)
def test_extract_simplified_container(self): elem = tags.uint8_tag('uuu8', 12) inner = tags.container_tag('conb', elem) in_data = tags.container_tag('cona', inner) parsed = dmap.parse(in_data, lookup_tag) self.assertEqual(12, dmap.first(parsed, 'cona', 'conb', 'uuu8'))