def assert_dns_record(node: IPNode, dns_server_address: str, record: DNSRecord, port=53, timeout=60): require_cmd("dig", help_str="dig is required to run tests") server_cmd = "dig @{address} -p {port} -t {rtype} {domain_name}"\ .format(address=dns_server_address, rtype=record.rtype, domain_name=record.domain_name, port=port) out_regex = re.compile(r" *{name}[ \t]+{ttl}[ \t]+IN[ \t]+{rtype}[ \t]+" r"{rdata}" .format(rtype=record.rtype, ttl=record.ttl, name=record.domain_name, rdata=record.rdata)) t = 0 out = node.cmd(server_cmd.split(" ")) got_answer, match = search_dns_reply(out, out_regex) while t < timeout * 2 and match is None: t += 1 time.sleep(.5) out = node.cmd(server_cmd.split(" ")) got_answer, match = search_dns_reply(out, out_regex) assert got_answer, "No answer was received in %s" \ " from server %s in the reply of '%s':\n%s" \ % (node.name, dns_server_address, server_cmd, out) assert match is not None, "The expected data '%s' cannot be found " \ "in the DNS reply of '%s' received by %s from " \ "%s:\n%s" % (out_regex.pattern, server_cmd, node.name, dns_server_address, out)
def assert_routing_table(router: IPNode, expected_prefixes: List[str], timeout=120): """ :param router: The router to test :param expected_prefixes: The list of prefixes to be in the routing table :param timeout: Time to wait for the routing convergence :return: """ cmd = "ip -%d route" % ip_network(str(expected_prefixes[0])).version out = router.cmd(cmd) prefixes = re.findall(r"|".join(expected_prefixes), out) count = 0 while any(item in prefixes for item in expected_prefixes): if count == timeout: pytest.fail("Cannot get all expected prefixes (%s) from routing " "table (%s)" % (expected_prefixes, prefixes)) time.sleep(1) count += 1 out = router.cmd(cmd) prefixes = re.findall(r"|".join(expected_prefixes), out) assert len(prefixes) == 0