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 update_txt(self, show=None): if show: self.txt['status'] = self._replace_show(show) txt = TXTRecord(self.txt, strict=True) try: DNSServiceUpdateRecord(self._service_sdref, None, 0, txt) except BonjourError as error: log.error('Error when updating TXT Record: %s', error) return False return True
def _create_service(self): txt = {} # remove empty keys for key, val in self.txt.items(): if val: txt[key] = val txt['port.p2pj'] = self.port txt['version'] = 1 txt['txtvers'] = 1 # replace gajim's show messages with compatible ones if 'status' in self.txt: txt['status'] = self._replace_show(self.txt['status']) else: txt['status'] = 'avail' self.txt = txt try: self._service_sdref = DNSServiceRegister( flags=kDNSServiceFlagsNoAutoRename, name=self.name, regtype=self.stype, port=self.port, txtRecord=TXTRecord(self.txt, strict=True), callBack=self.service_added_callback) log.info('Publishing service %s of type %s', self.name, self.stype) ready = select.select([self._service_sdref], [], []) if self._service_sdref in ready[0]: DNSServiceProcessResult(self._service_sdref) except BonjourError as error: if error.errorCode == kDNSServiceErr_ServiceNotRunning: log.info('Service not running') else: self._error_cb(_('Error while adding service. %s') % error) self.disconnect()
def register_record(self): done = threading.Event() def cb(_sdRef, flags, errorCode, name, regtype, domain): self.assertEqual(errorCode, kDNSServiceErr_NoError) self.assertEqual(_sdRef, sdRef) self.assertTrue(isinstance(name, str)) self.assertEqual(name, self.service_name) self.assertTrue(isinstance(regtype, str)) self.assertEqual(regtype, self.regtype) self.assertTrue(isinstance(domain, str)) done.set() txt = TXTRecord() txt['foo'] = 'foobar' sdRef = DNSServiceRegister(name=self.service_name, regtype=self.regtype, port=self.port, txtRecord=txt, callBack=cb) return done, sdRef