+++ /dev/null
-tcp-initial-timeout=300
-tcp-idle-timeout=300
-tcp-keepalive-timeout=300
-tcp-advertised-timeout=200
+++ /dev/null
-#!/bin/sh
-
-# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
-#
-# SPDX-License-Identifier: MPL-2.0
-#
-# 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.
-
-set -e
-
-. ../conf.sh
-
-DIGOPTS="-p ${PORT}"
-RNDCCMD="$RNDC -c ../_common/rndc.conf -s 10.53.0.2 -p ${CONTROLPORT}"
-
-n=0
-status=0
-
-echo_i "checking that dig handles TCP keepalive ($n)"
-ret=0
-n=$((n + 1))
-$DIG $DIGOPTS +qr +keepalive foo.example @10.53.0.2 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE" dig.out.test$n >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking that dig added TCP keepalive ($n)"
-ret=0
-n=$((n + 1))
-$RNDCCMD stats
-grep "EDNS TCP keepalive option received" ns2/named.stats >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking that TCP keepalive is added for TCP responses ($n)"
-ret=0
-n=$((n + 1))
-$DIG $DIGOPTS +vc +keepalive foo.example @10.53.0.2 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE" dig.out.test$n >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking that TCP keepalive requires TCP ($n)"
-ret=0
-n=$((n + 1))
-$DIG $DIGOPTS +keepalive foo.example @10.53.0.2 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE" dig.out.test$n >/dev/null && ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking default value ($n)"
-ret=0
-n=$((n + 1))
-$DIG $DIGOPTS +vc +keepalive foo.example @10.53.0.3 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE: 30.0 secs" dig.out.test$n >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking configured value ($n)"
-ret=0
-n=$((n + 1))
-$DIG $DIGOPTS +vc +keepalive foo.example @10.53.0.2 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE: 15.0 secs" dig.out.test$n >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking re-configured value ($n)"
-ret=0
-n=$((n + 1))
-$RNDCCMD tcp-timeouts 300 300 300 200 >output
-diff -b output expected || ret=1
-$DIG $DIGOPTS +vc +keepalive foo.example @10.53.0.2 >dig.out.test$n || ret=1
-grep "; TCP-KEEPALIVE: 20.0 secs" dig.out.test$n >/dev/null || ret=1
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "checking server config entry ($n)"
-ret=0
-n=$((n + 1))
-$RNDCCMD stats
-oka=$(grep "EDNS TCP keepalive option received" ns2/named.stats \
- | tail -1 | awk '{ print $1}')
-$DIG $DIGOPTS bar.example @10.53.0.3 >dig.out.test$n || ret=1
-$RNDCCMD stats
-nka=$(grep "EDNS TCP keepalive option received" ns2/named.stats \
- | tail -1 | awk '{ print $1}')
-#echo oka ':' $oka
-#echo nka ':' $nka
-if [ "$oka" -eq "$nka" ]; then ret=1; fi
-if [ $ret != 0 ]; then echo_i "failed"; fi
-status=$((status + ret))
-
-echo_i "exit status: $status"
-[ $status -eq 0 ] || exit 1
--- /dev/null
+# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+#
+# SPDX-License-Identifier: MPL-2.0
+#
+# 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.
+
+import isctest
+import pytest
+
+
+pytestmark = pytest.mark.extra_artifacts(
+ ["ns2/named.stats"],
+)
+
+
+def test_dig_tcp_keepalive_handling(named_port, servers):
+ def get_keepalive_options_received():
+ servers["ns2"].rndc("stats", log=False)
+ options_received = 0
+ with open("ns2/named.stats", "r", encoding="utf-8") as ns2_stats_file:
+ for line in ns2_stats_file:
+ if "EDNS TCP keepalive option received" in line:
+ options_received = line.split()[0]
+ return int(options_received)
+
+ dig = isctest.run.Dig(f"-p {str(named_port)}")
+
+ isctest.log.info("check that dig handles TCP keepalive in query")
+ assert "; TCP-KEEPALIVE" in dig("+qr +keepalive foo.example. @10.53.0.2")
+
+ isctest.log.info("check that dig added TCP keepalive was received")
+ assert get_keepalive_options_received() == 1
+
+ isctest.log.info("check that TCP keepalive is added for TCP responses")
+ assert "; TCP-KEEPALIVE" in dig("+tcp +keepalive foo.example. @10.53.0.2")
+
+ isctest.log.info("check that TCP keepalive requires TCP")
+ assert "; TCP-KEEPALIVE" not in dig("+keepalive foo.example. @10.53.0.2")
+
+ isctest.log.info("check the default keepalive value")
+ assert "; TCP-KEEPALIVE: 30.0 secs" in dig(
+ "+tcp +keepalive foo.example. @10.53.0.3"
+ )
+
+ isctest.log.info("check a keepalive configured value")
+ assert "; TCP-KEEPALIVE: 15.0 secs" in dig(
+ "+tcp +keepalive foo.example. @10.53.0.2"
+ )
+
+ isctest.log.info("check a re-configured keepalive value")
+ response = servers["ns2"].rndc("tcp-timeouts 300 300 300 200", log=False)
+ assert "tcp-initial-timeout=300" in response
+ assert "tcp-idle-timeout=300" in response
+ assert "tcp-keepalive-timeout=300" in response
+ assert "tcp-advertised-timeout=200" in response
+ assert "; TCP-KEEPALIVE: 20.0 secs" in dig(
+ "+tcp +keepalive foo.example. @10.53.0.2"
+ )
+
+ isctest.log.info("check server config entry")
+ base_options_received = get_keepalive_options_received()
+ dig("bar.example. @10.53.0.3")
+ next_options_received = get_keepalive_options_received()
+ assert base_options_received < next_options_received
+++ /dev/null
-# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
-#
-# SPDX-License-Identifier: MPL-2.0
-#
-# 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.
-
-import pytest
-
-pytestmark = pytest.mark.extra_artifacts(
- [
- "dig.out.*",
- "output",
- "ns2/named.stats",
- ]
-)
-
-
-def test_keepalive(run_tests_sh):
- run_tests_sh()