def test_ttl(self): # instantiate a zeroconf instance zc = Zeroconf(interfaces=['127.0.0.1']) # service definition type_ = "_test-srvc-type._tcp.local." name = "xxxyyy" registration_name = "%s.%s" % (name, type_) desc = {'path': '/~paulsm/'} info = ServiceInfo( type_, registration_name, 80, 0, 0, desc, "ash-2.local.", addresses=[socket.inet_aton("10.0.1.2")], ) nbr_answers = nbr_additionals = nbr_authorities = 0 def get_ttl(record_type): if expected_ttl is not None: return expected_ttl elif record_type in [const._TYPE_A, const._TYPE_SRV]: return const._DNS_HOST_TTL else: return const._DNS_OTHER_TTL def _process_outgoing_packet(out): """Sends an outgoing packet.""" nonlocal nbr_answers, nbr_additionals, nbr_authorities for answer, time_ in out.answers: nbr_answers += 1 assert answer.ttl == get_ttl(answer.type) for answer in out.additionals: nbr_additionals += 1 assert answer.ttl == get_ttl(answer.type) for answer in out.authorities: nbr_authorities += 1 assert answer.ttl == get_ttl(answer.type) # register service with default TTL expected_ttl = None for _ in range(3): _process_outgoing_packet(zc.generate_service_query(info)) zc.registry.add(info) for _ in range(3): _process_outgoing_packet(zc.generate_service_broadcast(info, None)) assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 3 nbr_answers = nbr_additionals = nbr_authorities = 0 # query query = r.DNSOutgoing(const._FLAGS_QR_QUERY | const._FLAGS_AA) assert query.is_query() is True query.add_question( r.DNSQuestion(info.type, const._TYPE_PTR, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.name, const._TYPE_SRV, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.name, const._TYPE_TXT, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.server, const._TYPE_A, const._CLASS_IN)) multicast_out = zc.query_handler.response( r.DNSIncoming(query.packets()[0]), None, const._MDNS_PORT)[1] _process_outgoing_packet(multicast_out) # The additonals should all be suppresed since they are all in the answers section # assert nbr_answers == 4 and nbr_additionals == 0 and nbr_authorities == 0 nbr_answers = nbr_additionals = nbr_authorities = 0 # unregister expected_ttl = 0 zc.registry.remove(info) for _ in range(3): _process_outgoing_packet(zc.generate_service_broadcast(info, 0)) assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 0 nbr_answers = nbr_additionals = nbr_authorities = 0 expected_ttl = None for _ in range(3): _process_outgoing_packet(zc.generate_service_query(info)) zc.registry.add(info) # register service with custom TTL expected_ttl = const._DNS_HOST_TTL * 2 assert expected_ttl != const._DNS_HOST_TTL for _ in range(3): _process_outgoing_packet( zc.generate_service_broadcast(info, expected_ttl)) assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 3 nbr_answers = nbr_additionals = nbr_authorities = 0 # query expected_ttl = None query = r.DNSOutgoing(const._FLAGS_QR_QUERY | const._FLAGS_AA) query.add_question( r.DNSQuestion(info.type, const._TYPE_PTR, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.name, const._TYPE_SRV, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.name, const._TYPE_TXT, const._CLASS_IN)) query.add_question( r.DNSQuestion(info.server, const._TYPE_A, const._CLASS_IN)) _process_outgoing_packet( zc.query_handler.response(r.DNSIncoming(query.packets()[0]), None, const._MDNS_PORT)[1]) assert nbr_answers == 4 and nbr_additionals == 0 and nbr_authorities == 0 nbr_answers = nbr_additionals = nbr_authorities = 0 # unregister expected_ttl = 0 zc.registry.remove(info) for _ in range(3): _process_outgoing_packet(zc.generate_service_broadcast(info, 0)) assert nbr_answers == 12 and nbr_additionals == 0 and nbr_authorities == 0 nbr_answers = nbr_additionals = nbr_authorities = 0 zc.close()