knot-dns/tests-extra/tests/catalog/generate/test.py

113 lines
2.6 KiB
Python

#!/usr/bin/env python3
'''Test of Catalog zone generation.'''
from dnstest.test import Test
from dnstest.utils import set_err, detail_log
import os
import random
import time
t = Test()
def wait_for_zonefile(server, role, zonename, max_age, timeout):
fn = os.path.join(server.dir, role, zonename + "zone")
while timeout > 0:
if os.path.exists(fn):
age = time.time() - os.path.getmtime(fn)
else:
age = max_age + 1
if age <= max_age:
break
timeout -= 1
t.sleep(1)
t.sleep(max_age)
master = t.server("knot")
slave = t.server("knot")
catz = t.zone("example.")
zone = t.zone("example.com.")
t.link(catz, master, slave)
t.link(zone, master, slave)
master.cat_generate(catz)
slave.cat_interpret(catz)
master.cat_member(zone, catz)
slave.cat_hidden(zone)
slave.dnssec(catz[0]).enable = True
slave.dnssec(catz[0]).single_type_signing = True
t.start()
# testcase 1: initial catalog zone with 1 member
slave.zones_wait(zone)
# testcase 2: adding member zones online/offline
add_online = random.choice([True, False])
zone_add = t.zone("flags.") + t.zone("records.")
t.link(zone_add, master, slave)
for z in zone_add:
master.cat_member(z, catz)
slave.cat_hidden(z)
master.gen_confile()
if add_online:
master.reload()
else:
master.stop()
t.sleep(1)
master.start()
slave.zones_wait(zone + zone_add)
# testcase 3: removing member zone online/offline
rem_online = random.choice([True, False])
serial_bef_rem = slave.zone_wait(catz, tsig=True)
master.ctl("-f zone-purge example.com")
master.zones.pop("example.com.")
master.gen_confile()
if rem_online:
master.reload()
else:
master.stop()
t.sleep(1)
master.start()
slave.zone_wait(catz, serial_bef_rem, tsig=True)
t.sleep(2) # allow the member zone to actually be purged
resp = slave.dig("example.com.", "SOA")
resp.check(rcode="REFUSED")
#testcase 4: remove/add same member zone while slave offline, with purge
resp0 = slave.dig("records.", "DNSKEY")
resp0.check_count(1, "DNSKEY")
dnskey0 = resp0.resp.answer[0].to_rdataset()
slave.stop()
temp_rem = master.zones.pop("records.")
master.gen_confile()
master.reload()
t.sleep(7)
master.ctl("-f zone-purge +orphan records.")
master.zones["records."] = temp_rem
master.gen_confile()
master.reload()
slave.start()
wait_for_zonefile(slave, "master", "records.", 3, 30)
slave.ctl("zone-refresh")
wait_for_zonefile(slave, "master", "records.", 3, 30)
resp1 = slave.dig("records.", "DNSKEY")
resp1.check_count(1, "DNSKEY")
dnskey1 = resp1.resp.answer[0].to_rdataset()
if dnskey0 == dnskey1:
set_err("ZONE NOT PURGED")
t.end()