def test_txtrecord(self): txt = TXTRecord() self.assertEqual(len(txt), 0) self.assertTrue(not txt) self.assertEqual(str(txt), '\0') txt = TXTRecord({ 'foo': 'bar', 'baz': u'buzz', 'none': None, 'empty': '' }) self.assertEqual(txt['foo'], 'bar') self.assertEqual(txt['BaZ'], 'buzz') self.assertTrue(txt['none'] is None) self.assertEqual(txt['empty'], '') self.assertEqual(len(txt), 4) self.assertTrue(txt) self.assertEqual(str(txt), str(TXTRecord.parse(str(txt)))) txt['baZ'] = 'fuzz' self.assertEqual(txt['baz'], 'fuzz') self.assertEqual(len(txt), 4) self.assertTrue('foo' in txt) del txt['foo'] self.assertTrue('foo' not in txt) self.assertRaises(KeyError, txt.__getitem__, 'not_a_key') self.assertRaises(KeyError, txt.__delitem__, 'not_a_key') self.assertRaises(ValueError, txt.__setitem__, 'foo\0', 'bar') self.assertRaises(ValueError, txt.__setitem__, '', 'bar') self.assertRaises(ValueError, txt.__setitem__, 'foo', 252 * 'b') # Example from # http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt data = '\x0Aname=value\x08paper=A4\x0EDNS-SD Is Cool' txt = TXTRecord.parse(data) self.assertEqual(str(txt), data) self.assertTrue(txt['DNS-SD Is Cool'] is None) data = '\x04bar=\nfoo=foobar\nfoo=barfoo\n=foofoobar' txt = TXTRecord.parse(data) self.assertEqual(len(txt), 2) self.assertEqual(txt['bar'], '') self.assertEqual(str(txt), '\x04bar=\nfoo=foobar') value = 254 * 'y' self.assertRaises(ValueError, TXTRecord().__setitem__, 'x', value) txt = TXTRecord(strict=False) txt['x'] = value self.assertEqual(len(str(txt)), 256)
def resolve_cb(sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord): self.assertEqual(errorCode, pybonjour.kDNSServiceErr_NoError) self.assertEqual(sdRef, resolve_sdRef) self.assert_(isinstance(fullname, unicode)) self.assertEqual(fullname, self.fullname) self.assert_(isinstance(hosttarget, unicode)) self.assertEqual(port, self.port) self.assert_(isinstance(txtRecord, bytes)) txt = TXTRecord.parse(txtRecord) self.assertEqual(txt['foo'], u'foobar') self.assert_(len(txtRecord) > 0) resolve_done.set()
def resolve_cb(sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord): self.assertEqual(errorCode, kDNSServiceErr_NoError) self.assertEqual(sdRef, resolve_sdRef) self.assertTrue(isinstance(fullname, str)) self.assertEqual(fullname, self.fullname) self.assertTrue(isinstance(hosttarget, str)) self.assertEqual(port, self.port) self.assertTrue(isinstance(txtRecord, str)) txt = TXTRecord.parse(txtRecord) self.assertEqual(txt['foo'], 'foobar') self.assertTrue(len(txtRecord) > 0) resolve_done.set()
def _getaddrinfo_callback(self, _sdref, _flags, interface, error_code, hosttarget, address, _ttl): if error_code != kDNSServiceErr_NoError: log.error('Error in getaddrinfo_callback: %s', str(error_code)) return fullname, port, txt_record = self._resolved_hosts[hosttarget] txt = TXTRecord.parse(txt_record) ip = address[1] name, bare_name, protocol, domain = self._parse_name(fullname) log.info('Service data for service %s on %i:', fullname, interface) log.info('Host %s, ip %s, port %i, TXT data: %s', hosttarget, ip, port, txt) if not self.connected: return # we don't want to see ourselves in the list if name != self.name: resolved_info = [(interface, protocol, hosttarget, fullname, ip, port)] self._contacts[name] = (name, domain, resolved_info, bare_name, txt_record) self._new_service_cb(name) else: # remember data # In case this is not our own record but of another # gajim instance on the same machine, # it will be used when we get a new name. self._invalid_self_contact[name] = \ (name, domain, (interface, protocol, hosttarget, fullname, ip, port), bare_name, txt_record) self._queried.append(True)
def txt_array_to_dict(txt): if not isinstance(txt, TXTRecord): txt = TXTRecord.parse(txt) return dict((v[0], v[1]) for v in txt)
def test_txtrecord(self): txt = TXTRecord() self.assertEqual(len(txt), 0) self.assert_(not txt) self.assertEqual(bytes(txt), b'\x00') txt = TXTRecord({u'foo': u'bar', u'baz': u'buzz', u'none': None, u'empty': u''}) self.assertEqual(txt[u'foo'], u'bar') self.assertEqual(txt[u'BaZ'], u'buzz') self.assert_(txt[u'none'] is None) self.assertEqual(txt[u'empty'], u'') self.assertEqual(len(txt), 4) self.assert_(txt) self.assertEqual(bytes(txt), bytes(TXTRecord.parse(bytes(txt)))) txt[u'baZ'] = u'fuzz' self.assertEqual(txt[u'baz'], u'fuzz') self.assertEqual(len(txt), 4) self.assert_(u'foo' in txt) del txt[u'foo'] self.assert_(u'foo' not in txt) self.assertRaises(KeyError, txt.__getitem__, u'not_a_key') self.assertRaises(KeyError, txt.__delitem__, u'not_a_key') self.assertRaises(KeyError, txt.__getitem__, b'not_a_key') # bytes self.assertRaises(KeyError, txt.__delitem__, b'not_a_key') # bytes self.assertRaises(ValueError, txt.__setitem__, u'foo\x00', u'bar') self.assertRaises(ValueError, txt.__setitem__, b'foo\x00', u'bar') # bytes self.assertRaises(ValueError, txt.__setitem__, u'', u'bar') self.assertRaises(ValueError, txt.__setitem__, u'foo', 252 * u'b') # Example from # http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt data = b'\x0Aname=value\x08paper=A4\x0EDNS-SD Is Cool' txt = TXTRecord.parse(data) self.assertEqual(bytes(txt), data) self.assert_(txt[u'DNS-SD Is Cool'] is None) data = b'\x04bar=\nfoo=foobar\nfoo=barfoo\n=foofoobar' txt = TXTRecord.parse(data) self.assertEqual(len(txt), 2) self.assertEqual(txt[u'bar'], u'') self.assertEqual(bytes(txt), b'\x04bar=\nfoo=foobar') value = 254 * u'y' self.assertRaises(ValueError, TXTRecord().__setitem__, u'x', value) txt = TXTRecord(strict=False) txt[u'x'] = value self.assertEqual(len(bytes(txt)), 256) ## Testing utf-8 strings in TXTRecord ... txt = TXTRecord(strict=False) txt[u'genshiken'] = u'げんしけん' self.assertEqual(bytes(txt), ( b'\x19genshiken=' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93')) txt[u'genshiken'] = u'げんしけん' * 17 self.assertEqual(bytes(txt), ( b'\xfdgenshiken=' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93' b'\xe3\x81\x92')) self.assertEqual(len(bytes(txt)), 254)