1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-17 14:37:02 +00:00

test: Use our own netcat implementation :(

Netcat's behaviour after seeing EOF from stdin seems to not be very
portable or consistent, even under the same platform.

This has caused t-05-null_address to break recently under some
conditions, for example depending on the particular Debian version of
netcat-openbsd used, and the current situation is unclear.
See https://bugs.debian.org/854292 and https://bugs.debian.org/849192
for more details.

To stop depending on this brittle behaviour, this patch unfortunately
introduces a simple python3-based netcat for our tests to use.
This commit is contained in:
Alberto Bertogli
2017-02-26 01:13:33 +00:00
parent 700539876b
commit c2ea8a8ef0
4 changed files with 56 additions and 3 deletions

View File

@@ -11,7 +11,6 @@ They also have some dependencies, listed below.
The tests depend on the following things being installed on the system (listed The tests depend on the following things being installed on the system (listed
as Debian package, for consistency): as Debian package, for consistency):
- netcat (nc)
- msmtp - msmtp
- util-linux (for /usr/bin/setsid) - util-linux (for /usr/bin/setsid)

View File

@@ -14,7 +14,7 @@ wait_until_ready 1025
# Send mail with an empty address (directly, unauthenticated). # Send mail with an empty address (directly, unauthenticated).
nc localhost 1025 < sendmail > /dev/null nc.py localhost 1025 < sendmail > /dev/null
wait_for_file .mail/user@testserver wait_for_file .mail/user@testserver
mail_diff content .mail/user@testserver mail_diff content .mail/user@testserver
rm -f .mail/user@testserver rm -f .mail/user@testserver

View File

@@ -61,6 +61,10 @@ function smtpc.py() {
${UTILDIR}/smtpc.py "$@" ${UTILDIR}/smtpc.py "$@"
} }
function nc.py() {
${UTILDIR}/nc.py "$@"
}
function mail_diff() { function mail_diff() {
${UTILDIR}/mail_diff "$@" ${UTILDIR}/mail_diff "$@"
} }
@@ -83,7 +87,7 @@ function fail() {
function wait_until_ready() { function wait_until_ready() {
PORT=$1 PORT=$1
while ! nc -z localhost $PORT; do while ! nc.py -z localhost $PORT; do
sleep 0.1 sleep 0.1
done done
} }

50
test/util/nc.py Executable file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env python3
#
# Simple "netcat" implementation.
# Unfortunately netcat/nc is not that portable, so this contains a simple
# implementation which fits our needs.
import argparse
import threading
import smtplib
import socket
import sys
ap = argparse.ArgumentParser()
ap.add_argument("-z", action='store_true', help="scan for listening daemons")
ap.add_argument("host", help="host to connect to")
ap.add_argument("port", type=int, help="port to connect to")
args = ap.parse_args()
address = (args.host, args.port)
try:
sock = socket.create_connection(address)
fd = sock.makefile('rw', buffering=1, encoding="utf-8")
except OSError:
# Exit quietly, like nc does.
sys.exit(1)
if args.z:
sys.exit(0)
# stdin -> socket in the background. Do a partial shutdown when done.
def stdin_to_sock():
for line in sys.stdin:
fd.write(line)
fd.flush()
try:
sock.shutdown(socket.SHUT_WR)
except OSError:
pass
t1 = threading.Thread(target=stdin_to_sock, daemon=True)
t1.start()
# socket -> stdout in the foreground; if the socket closes, exit.
for line in fd:
sys.stdout.write(line)
sys.stdout.flush()