|
12 | 12 | import unittest.mock |
13 | 13 |
|
14 | 14 | import zeroconf as r |
15 | | -from zeroconf import ServiceInfo, Zeroconf |
| 15 | +from zeroconf import ServiceInfo, Zeroconf, current_time_millis |
16 | 16 | from zeroconf import const |
17 | 17 |
|
18 | 18 | from . import _clear_cache |
@@ -292,3 +292,113 @@ def test_unicast_response(): |
292 | 292 | # unregister |
293 | 293 | zc.unregister_service(info) |
294 | 294 | zc.close() |
| 295 | + |
| 296 | + |
| 297 | +def test_known_answer_supression(): |
| 298 | + zc = Zeroconf(interfaces=['127.0.0.1']) |
| 299 | + type_ = "_knownservice._tcp.local." |
| 300 | + name = "knownname" |
| 301 | + registration_name = "%s.%s" % (name, type_) |
| 302 | + desc = {'path': '/~paulsm/'} |
| 303 | + server_name = "ash-2.local." |
| 304 | + info = ServiceInfo( |
| 305 | + type_, registration_name, 80, 0, 0, desc, server_name, addresses=[socket.inet_aton("10.0.1.2")] |
| 306 | + ) |
| 307 | + zc.register_service(info) |
| 308 | + |
| 309 | + now = current_time_millis() |
| 310 | + |
| 311 | + # Test PTR supression |
| 312 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 313 | + question = r.DNSQuestion(type_, const._TYPE_PTR, const._CLASS_IN) |
| 314 | + generated.add_question(question) |
| 315 | + packets = generated.packets() |
| 316 | + unicast_out, multicast_out = zc.query_handler.response( |
| 317 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 318 | + ) |
| 319 | + assert unicast_out is None |
| 320 | + assert multicast_out is not None and multicast_out.answers |
| 321 | + |
| 322 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 323 | + question = r.DNSQuestion(type_, const._TYPE_PTR, const._CLASS_IN) |
| 324 | + generated.add_question(question) |
| 325 | + generated.add_answer_at_time(info.dns_pointer(), now) |
| 326 | + packets = generated.packets() |
| 327 | + unicast_out, multicast_out = zc.query_handler.response( |
| 328 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 329 | + ) |
| 330 | + assert unicast_out is None |
| 331 | + # If the answer is suppressed, the additional should be suppresed as well |
| 332 | + assert not multicast_out or not multicast_out.answers |
| 333 | + |
| 334 | + # Test A supression |
| 335 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 336 | + question = r.DNSQuestion(server_name, const._TYPE_A, const._CLASS_IN) |
| 337 | + generated.add_question(question) |
| 338 | + packets = generated.packets() |
| 339 | + unicast_out, multicast_out = zc.query_handler.response( |
| 340 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 341 | + ) |
| 342 | + assert unicast_out is None |
| 343 | + assert multicast_out is not None and multicast_out.answers |
| 344 | + |
| 345 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 346 | + question = r.DNSQuestion(server_name, const._TYPE_A, const._CLASS_IN) |
| 347 | + generated.add_question(question) |
| 348 | + for dns_address in info.dns_addresses(): |
| 349 | + generated.add_answer_at_time(dns_address, now) |
| 350 | + packets = generated.packets() |
| 351 | + unicast_out, multicast_out = zc.query_handler.response( |
| 352 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 353 | + ) |
| 354 | + assert unicast_out is None |
| 355 | + assert not multicast_out or not multicast_out.answers |
| 356 | + |
| 357 | + # Test SRV supression |
| 358 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 359 | + question = r.DNSQuestion(registration_name, const._TYPE_SRV, const._CLASS_IN) |
| 360 | + generated.add_question(question) |
| 361 | + packets = generated.packets() |
| 362 | + unicast_out, multicast_out = zc.query_handler.response( |
| 363 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 364 | + ) |
| 365 | + assert unicast_out is None |
| 366 | + assert multicast_out is not None and multicast_out.answers |
| 367 | + |
| 368 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 369 | + question = r.DNSQuestion(registration_name, const._TYPE_SRV, const._CLASS_IN) |
| 370 | + generated.add_question(question) |
| 371 | + generated.add_answer_at_time(info.dns_service(), now) |
| 372 | + packets = generated.packets() |
| 373 | + unicast_out, multicast_out = zc.query_handler.response( |
| 374 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 375 | + ) |
| 376 | + assert unicast_out is None |
| 377 | + # If the answer is suppressed, the additional should be suppresed as well |
| 378 | + assert not multicast_out or not multicast_out.answers |
| 379 | + |
| 380 | + # Test TXT supression |
| 381 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 382 | + question = r.DNSQuestion(registration_name, const._TYPE_TXT, const._CLASS_IN) |
| 383 | + generated.add_question(question) |
| 384 | + packets = generated.packets() |
| 385 | + unicast_out, multicast_out = zc.query_handler.response( |
| 386 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 387 | + ) |
| 388 | + assert unicast_out is None |
| 389 | + assert multicast_out is not None and multicast_out.answers |
| 390 | + |
| 391 | + generated = r.DNSOutgoing(const._FLAGS_QR_QUERY) |
| 392 | + question = r.DNSQuestion(registration_name, const._TYPE_TXT, const._CLASS_IN) |
| 393 | + generated.add_question(question) |
| 394 | + generated.add_answer_at_time(info.dns_text(), now) |
| 395 | + packets = generated.packets() |
| 396 | + unicast_out, multicast_out = zc.query_handler.response( |
| 397 | + r.DNSIncoming(packets[0]), "1.2.3.4", const._MDNS_PORT |
| 398 | + ) |
| 399 | + assert unicast_out is None |
| 400 | + assert not multicast_out or not multicast_out.answers |
| 401 | + |
| 402 | + # unregister |
| 403 | + zc.unregister_service(info) |
| 404 | + zc.close() |
0 commit comments