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:
@@ -11,7 +11,6 @@ They also have some dependencies, listed below.
|
||||
The tests depend on the following things being installed on the system (listed
|
||||
as Debian package, for consistency):
|
||||
|
||||
- netcat (nc)
|
||||
- msmtp
|
||||
- util-linux (for /usr/bin/setsid)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ wait_until_ready 1025
|
||||
|
||||
|
||||
# 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
|
||||
mail_diff content .mail/user@testserver
|
||||
rm -f .mail/user@testserver
|
||||
|
||||
@@ -61,6 +61,10 @@ function smtpc.py() {
|
||||
${UTILDIR}/smtpc.py "$@"
|
||||
}
|
||||
|
||||
function nc.py() {
|
||||
${UTILDIR}/nc.py "$@"
|
||||
}
|
||||
|
||||
function mail_diff() {
|
||||
${UTILDIR}/mail_diff "$@"
|
||||
}
|
||||
@@ -83,7 +87,7 @@ function fail() {
|
||||
function wait_until_ready() {
|
||||
PORT=$1
|
||||
|
||||
while ! nc -z localhost $PORT; do
|
||||
while ! nc.py -z localhost $PORT; do
|
||||
sleep 0.1
|
||||
done
|
||||
}
|
||||
|
||||
50
test/util/nc.py
Executable file
50
test/util/nc.py
Executable 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()
|
||||
|
||||
Reference in New Issue
Block a user