2020-04-14 11:02:21 -04:00
|
|
|
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
|
|
|
#
|
|
|
|
|
# SPDX-License-Identifier: MPL-2.0
|
2021-06-03 02:37:05 -04:00
|
|
|
#
|
2020-04-14 11:02:21 -04:00
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
|
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
|
#
|
|
|
|
|
# See the COPYRIGHT file distributed with this work for additional
|
|
|
|
|
# information regarding copyright ownership.
|
|
|
|
|
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
from datetime import datetime, timedelta
|
2023-11-24 09:44:32 -05:00
|
|
|
from collections import defaultdict
|
2023-12-12 09:54:40 -05:00
|
|
|
from time import sleep
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
import os
|
|
|
|
|
|
2023-11-24 09:44:32 -05:00
|
|
|
import dns.message
|
|
|
|
|
import dns.query
|
|
|
|
|
import dns.rcode
|
|
|
|
|
|
2023-12-04 12:10:42 -05:00
|
|
|
import isctest
|
|
|
|
|
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
|
|
|
|
|
# ISO datetime format without msec
|
2022-06-07 10:27:23 -04:00
|
|
|
fmt = "%Y-%m-%dT%H:%M:%SZ"
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
|
|
|
|
|
# The constants were taken from BIND 9 source code (lib/dns/zone.c)
|
|
|
|
|
max_refresh = timedelta(seconds=2419200) # 4 weeks
|
|
|
|
|
max_expires = timedelta(seconds=14515200) # 24 weeks
|
|
|
|
|
dayzero = datetime.utcfromtimestamp(0).replace(microsecond=0)
|
|
|
|
|
|
2023-12-12 09:54:40 -05:00
|
|
|
# Wait for the secondary zone files to appear to extract their mtime
|
|
|
|
|
max_secondary_zone_waittime_sec = 5
|
|
|
|
|
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
|
|
|
|
|
# Generic helper functions
|
|
|
|
|
def check_expires(expires, min_time, max_time):
|
|
|
|
|
assert expires >= min_time
|
|
|
|
|
assert expires <= max_time
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_refresh(refresh, min_time, max_time):
|
|
|
|
|
assert refresh >= min_time
|
|
|
|
|
assert refresh <= max_time
|
|
|
|
|
|
|
|
|
|
|
2023-11-11 16:15:27 -05:00
|
|
|
def check_loaded(loaded, expected, now):
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
# Sanity check the zone timers values
|
2023-12-12 09:54:40 -05:00
|
|
|
assert (loaded - expected).total_seconds() < max_secondary_zone_waittime_sec
|
2023-11-11 16:15:27 -05:00
|
|
|
assert loaded <= now
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_zone_timers(loaded, expires, refresh, loaded_exp):
|
2023-11-11 16:15:27 -05:00
|
|
|
now = datetime.utcnow().replace(microsecond=0)
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
# Sanity checks the zone timers values
|
|
|
|
|
if expires is not None:
|
|
|
|
|
check_expires(expires, now, now + max_expires)
|
|
|
|
|
if refresh is not None:
|
|
|
|
|
check_refresh(refresh, now, now + max_refresh)
|
2023-11-11 16:15:27 -05:00
|
|
|
check_loaded(loaded, loaded_exp, now)
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# The output is gibberish, but at least make sure it does not crash.
|
|
|
|
|
#
|
|
|
|
|
def check_manykeys(name, zone=None):
|
|
|
|
|
# pylint: disable=unused-argument
|
|
|
|
|
assert name == "manykeys"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def zone_mtime(zonedir, name):
|
|
|
|
|
try:
|
|
|
|
|
si = os.stat(os.path.join(zonedir, "{}.db".format(name)))
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
return dayzero
|
|
|
|
|
|
|
|
|
|
mtime = datetime.utcfromtimestamp(si.st_mtime).replace(microsecond=0)
|
|
|
|
|
|
|
|
|
|
return mtime
|
2020-04-14 11:02:21 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_zone_timers_primary(fetch_zones, load_timers, **kwargs):
|
2022-06-07 10:27:23 -04:00
|
|
|
statsip = kwargs["statsip"]
|
|
|
|
|
statsport = kwargs["statsport"]
|
|
|
|
|
zonedir = kwargs["zonedir"]
|
2020-04-14 11:02:21 -04:00
|
|
|
|
|
|
|
|
zones = fetch_zones(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
for zone in zones:
|
|
|
|
|
(name, loaded, expires, refresh) = load_timers(zone, True)
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
mtime = zone_mtime(zonedir, name)
|
|
|
|
|
check_zone_timers(loaded, expires, refresh, mtime)
|
2020-04-14 11:02:21 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_zone_timers_secondary(fetch_zones, load_timers, **kwargs):
|
2022-06-07 10:27:23 -04:00
|
|
|
statsip = kwargs["statsip"]
|
|
|
|
|
statsport = kwargs["statsport"]
|
|
|
|
|
zonedir = kwargs["zonedir"]
|
2020-04-14 11:02:21 -04:00
|
|
|
|
2023-12-12 09:54:40 -05:00
|
|
|
# If any one of the zone files isn't ready, then retry until timeout.
|
|
|
|
|
tries = max_secondary_zone_waittime_sec
|
|
|
|
|
while tries >= 0:
|
|
|
|
|
zones = fetch_zones(statsip, statsport)
|
|
|
|
|
again = False
|
|
|
|
|
for zone in zones:
|
|
|
|
|
(name, loaded, expires, refresh) = load_timers(zone, False)
|
|
|
|
|
mtime = zone_mtime(zonedir, name)
|
|
|
|
|
if (mtime != dayzero) or (tries == 0):
|
|
|
|
|
# mtime was either retrieved successfully or no tries were
|
|
|
|
|
# left, run the check anyway.
|
|
|
|
|
check_zone_timers(loaded, expires, refresh, mtime)
|
|
|
|
|
else:
|
|
|
|
|
tries = tries - 1
|
|
|
|
|
again = True
|
|
|
|
|
break
|
|
|
|
|
if again:
|
|
|
|
|
sleep(1)
|
|
|
|
|
else:
|
|
|
|
|
break
|
2020-04-14 11:02:21 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_zone_with_many_keys(fetch_zones, load_zone, **kwargs):
|
2022-06-07 10:27:23 -04:00
|
|
|
statsip = kwargs["statsip"]
|
|
|
|
|
statsport = kwargs["statsport"]
|
2020-04-14 11:02:21 -04:00
|
|
|
|
|
|
|
|
zones = fetch_zones(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
for zone in zones:
|
|
|
|
|
name = load_zone(zone)
|
2022-06-07 10:27:23 -04:00
|
|
|
if name == "manykeys":
|
Refactor "statschannel" test's helper modules
The "statschannel" system test contains two Python helper modules:
- generic.py: test functions directly invoked by both tests-json.py
and test-xml.py,
- helper.py: helper functions invoked by test functions in generic.py.
The above logic for splitting helper functions into Python modules
prevents selective test skipping from working due to unconditional
import statements being present in both helper modules. For example, if
dnspython is not available on the test host, tests-json.py imports
generic.py, which in turn imports helper.py, which in turn attempts to
import various dnspython modules, triggering ImportError exceptions
during test initialization. Various decorators used for some tests
(like @pytest.mark.dnspython) suggest that such a scenario should be
handled gracefully, but that is not the case - modifying the test
collection in conftest.py does not prevent pytest from failing due to
import errors.
Fix by moving helper functions around to achieve a different split:
- generic.py: helper functions only relying on the Python standard
library,
- generic_dnspython.py: helper functions requiring dnspython.
Only two tests in tests-{json,xml}.py need dnspython to work
(test_traffic_json(), test_traffic_xml()). Since all
dnspython-dependent code is now present in generic_dnspython.py, employ
pytest.importorskip() in those two tests to ensure they can be
selectively skipped when dnspython is not available. Adjust other code
to account for the revised Python helper module layout. Remove all
occurrences of the @pytest.mark.dnspython decorator (and all associated
code) from the "statschannel" system test to prevent confusion.
2022-03-14 03:59:32 -04:00
|
|
|
check_manykeys(name)
|
2023-11-24 09:44:32 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_msg(qname, qtype):
|
|
|
|
|
msg = dns.message.make_query(
|
|
|
|
|
qname, qtype, want_dnssec=True, use_edns=0, payload=4096
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return msg
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_expected(data):
|
|
|
|
|
expected = {
|
|
|
|
|
"dns-tcp-requests-sizes-received-ipv4": defaultdict(int),
|
|
|
|
|
"dns-tcp-responses-sizes-sent-ipv4": defaultdict(int),
|
|
|
|
|
"dns-tcp-requests-sizes-received-ipv6": defaultdict(int),
|
|
|
|
|
"dns-tcp-responses-sizes-sent-ipv6": defaultdict(int),
|
|
|
|
|
"dns-udp-requests-sizes-received-ipv4": defaultdict(int),
|
|
|
|
|
"dns-udp-requests-sizes-received-ipv6": defaultdict(int),
|
|
|
|
|
"dns-udp-responses-sizes-sent-ipv4": defaultdict(int),
|
|
|
|
|
"dns-udp-responses-sizes-sent-ipv6": defaultdict(int),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for k, v in data.items():
|
|
|
|
|
for kk, vv in v.items():
|
|
|
|
|
expected[k][kk] += vv
|
|
|
|
|
|
|
|
|
|
return expected
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def update_expected(expected, key, msg):
|
|
|
|
|
msg_len = len(msg.to_wire())
|
|
|
|
|
bucket_num = (msg_len // 16) * 16
|
|
|
|
|
bucket = "{}-{}".format(bucket_num, bucket_num + 15)
|
|
|
|
|
|
|
|
|
|
expected[key][bucket] += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_traffic(data, expected):
|
|
|
|
|
def ordered(obj):
|
|
|
|
|
if isinstance(obj, dict):
|
|
|
|
|
return sorted((k, ordered(v)) for k, v in obj.items())
|
|
|
|
|
if isinstance(obj, list):
|
|
|
|
|
return sorted(ordered(x) for x in obj)
|
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
ordered_data = ordered(data)
|
|
|
|
|
ordered_expected = ordered(expected)
|
|
|
|
|
|
|
|
|
|
assert len(ordered_data) == 8
|
|
|
|
|
assert len(ordered_expected) == 8
|
|
|
|
|
assert len(data) == len(ordered_data)
|
|
|
|
|
assert len(expected) == len(ordered_expected)
|
|
|
|
|
|
|
|
|
|
assert ordered_data == ordered_expected
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_traffic(fetch_traffic, **kwargs):
|
|
|
|
|
statsip = kwargs["statsip"]
|
|
|
|
|
statsport = kwargs["statsport"]
|
|
|
|
|
|
|
|
|
|
data = fetch_traffic(statsip, statsport)
|
|
|
|
|
exp = create_expected(data)
|
|
|
|
|
|
|
|
|
|
msg = create_msg("short.example.", "TXT")
|
|
|
|
|
update_expected(exp, "dns-udp-requests-sizes-received-ipv4", msg)
|
2024-07-16 14:06:06 -04:00
|
|
|
ans = isctest.query.udp(msg, statsip, attempts=1)
|
2023-12-04 12:10:42 -05:00
|
|
|
isctest.check.noerror(ans)
|
2023-11-24 09:44:32 -05:00
|
|
|
update_expected(exp, "dns-udp-responses-sizes-sent-ipv4", ans)
|
|
|
|
|
data = fetch_traffic(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
check_traffic(data, exp)
|
|
|
|
|
|
|
|
|
|
msg = create_msg("long.example.", "TXT")
|
|
|
|
|
update_expected(exp, "dns-udp-requests-sizes-received-ipv4", msg)
|
2024-07-16 14:06:06 -04:00
|
|
|
ans = isctest.query.udp(msg, statsip, attempts=1)
|
2023-12-04 12:10:42 -05:00
|
|
|
isctest.check.noerror(ans)
|
2023-11-24 09:44:32 -05:00
|
|
|
update_expected(exp, "dns-udp-responses-sizes-sent-ipv4", ans)
|
|
|
|
|
data = fetch_traffic(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
check_traffic(data, exp)
|
|
|
|
|
|
|
|
|
|
msg = create_msg("short.example.", "TXT")
|
|
|
|
|
update_expected(exp, "dns-tcp-requests-sizes-received-ipv4", msg)
|
2024-07-16 14:06:06 -04:00
|
|
|
ans = isctest.query.tcp(msg, statsip, attempts=1)
|
2023-12-04 12:10:42 -05:00
|
|
|
isctest.check.noerror(ans)
|
2023-11-24 09:44:32 -05:00
|
|
|
update_expected(exp, "dns-tcp-responses-sizes-sent-ipv4", ans)
|
|
|
|
|
data = fetch_traffic(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
check_traffic(data, exp)
|
|
|
|
|
|
|
|
|
|
msg = create_msg("long.example.", "TXT")
|
|
|
|
|
update_expected(exp, "dns-tcp-requests-sizes-received-ipv4", msg)
|
2024-07-16 14:06:06 -04:00
|
|
|
ans = isctest.query.tcp(msg, statsip, attempts=1)
|
2023-12-04 12:10:42 -05:00
|
|
|
isctest.check.noerror(ans)
|
2023-11-24 09:44:32 -05:00
|
|
|
update_expected(exp, "dns-tcp-responses-sizes-sent-ipv4", ans)
|
|
|
|
|
data = fetch_traffic(statsip, statsport)
|
|
|
|
|
|
|
|
|
|
check_traffic(data, exp)
|