diff --git a/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone b/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone new file mode 100644 index 0000000000000000000000000000000000000000..1d497600d45da1b377adbc675268766e4a28f857 --- /dev/null +++ b/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone @@ -0,0 +1,7 @@ +$ORIGIN catalog1. +$TTL 0 + +@ SOA ns admin 1 25 25 80 600 + NS ns +ns AAAA ::0 +version TXT "2" diff --git a/tests-extra/tests/catalog/rapid_updates/data/generic.zone b/tests-extra/tests/catalog/rapid_updates/data/generic.zone new file mode 100644 index 0000000000000000000000000000000000000000..b9c65e2de2cc0bd0daacc4879514f1d8b513cd23 --- /dev/null +++ b/tests-extra/tests/catalog/rapid_updates/data/generic.zone @@ -0,0 +1,15 @@ +$TTL 3600 + +@ SOA dns1 hostmaster 2010111201 10800 3600 1209600 7200 + NS dns1 + NS dns2 + MX 10 mail + +dns1 A 192.0.2.1 + AAAA 2001:DB8::1 + +dns2 A 192.0.2.2 + AAAA 2001:DB8::2 + +mail A 192.0.2.3 + AAAA 2001:DB8::3 diff --git a/tests-extra/tests/catalog/rapid_updates/test.py b/tests-extra/tests/catalog/rapid_updates/test.py new file mode 100644 index 0000000000000000000000000000000000000000..2cf23c08f80492ca32ae8d740e599a71af9d21cc --- /dev/null +++ b/tests-extra/tests/catalog/rapid_updates/test.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 + +'''Test of frequent updates to catalog, processed in batches.''' + +from dnstest.test import Test +from dnstest.utils import set_err, detail_log + +import os +import random +import time +import hashlib +import threading +import shutil + +UPDATES = 132 + +t = Test(stress=False) + +knot = t.server("knot") + +catz = t.zone("catalog1.", storage=".") + +t.link(catz, knot) +knot.zones[catz[0].name].catalog = True + +t.start() + +knot.zone_wait(catz, udp=False, tsig=True) + +check_names = list() + +def send_update(up): + try: + up.try_send() + except: + pass + +def send_up_bg(up): + threading.Thread(target=send_update, args=[up]).start() + +for i in range(UPDATES): + zone_add = "member%d." % i + name_hash = hashlib.md5(zone_add.encode()).hexdigest() + + shutil.copyfile(t.data_dir + "generic.zone" , knot.dir + "/master/" + zone_add + "zone") + + up = knot.update(catz) + up.add(name_hash + ".zones", 0, "PTR", zone_add) + send_up_bg(up) + + if i % 2 == 1: + t.sleep(random.choice([1.5, 2, 2.5])) + else: + t.sleep(random.choice([0.1, 0.15, 0.25])) + + check_names += [ zone_add ] + +t.sleep(4) + +for n in check_names: + resp = knot.dig(n, "SOA", udp=False, tsig=True) + resp.check(rcode="NOERROR") # not REFUSED + +if knot.log_search("catalog, interpreting 2 updates"): + set_err("LOST UPD SIGNAL") + +t.end()