mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-22 15:27:02 +00:00
test: Add a test for DSN and null address deliveries
This patch adds a test for delivery status notifications and null address deliveries, that check that chasquid can both receive and send DSNs. To do this, we extend the mail_diff utility to support wildcards in the comparisons, to skip over variable parts of the messages (like dates).
This commit is contained in:
13
test/t-05-null_address/config/chasquid.conf
Normal file
13
test/t-05-null_address/config/chasquid.conf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
hostname: "testserver"
|
||||||
|
|
||||||
|
smtp_address: ":1025"
|
||||||
|
submission_address: ":1587"
|
||||||
|
monitoring_address: ":1099"
|
||||||
|
|
||||||
|
mail_delivery_agent_bin: "test-mda"
|
||||||
|
mail_delivery_agent_args: "%to%"
|
||||||
|
|
||||||
|
data_dir: "../.data"
|
||||||
|
|
||||||
|
suffix_separators: "+-"
|
||||||
|
drop_characters: "._"
|
||||||
3
test/t-05-null_address/config/domains/testserver/aliases
Normal file
3
test/t-05-null_address/config/domains/testserver/aliases
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
fail: | false
|
||||||
|
|
||||||
5
test/t-05-null_address/content
Normal file
5
test/t-05-null_address/content
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
From: Mailer daemon <somewhere@horns.com>
|
||||||
|
Subject: I've come to haunt you
|
||||||
|
|
||||||
|
Muahahahaha
|
||||||
|
|
||||||
33
test/t-05-null_address/expected_dsr
Normal file
33
test/t-05-null_address/expected_dsr
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
From user@testserver
|
||||||
|
From: Mail Delivery System <postmaster-dsn@testserver>
|
||||||
|
To: <user@testserver>
|
||||||
|
Subject: Mail delivery failed: returning message to sender
|
||||||
|
Message-ID: *
|
||||||
|
Date: *
|
||||||
|
X-Failed-Recipients: fail@testserver,
|
||||||
|
Auto-Submitted: auto-replied
|
||||||
|
|
||||||
|
Delivery to the following recipient(s) failed permanently:
|
||||||
|
|
||||||
|
- fail@testserver
|
||||||
|
|
||||||
|
|
||||||
|
----- Technical details -----
|
||||||
|
|
||||||
|
- "false" (PIPE) failed with error:
|
||||||
|
exit status 1
|
||||||
|
|
||||||
|
|
||||||
|
----- Original message -----
|
||||||
|
|
||||||
|
Received: from user user@testserver
|
||||||
|
by *
|
||||||
|
(envelope from "user@testserver")
|
||||||
|
on ; *
|
||||||
|
Date: *
|
||||||
|
From: Mailer daemon <somewhere@horns.com>
|
||||||
|
Subject: I've come to haunt you
|
||||||
|
|
||||||
|
Muahahahaha
|
||||||
|
|
||||||
|
|
||||||
1
test/t-05-null_address/hosts
Normal file
1
test/t-05-null_address/hosts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
testserver localhost
|
||||||
13
test/t-05-null_address/msmtprc
Normal file
13
test/t-05-null_address/msmtprc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
account default
|
||||||
|
|
||||||
|
host testserver
|
||||||
|
port 1587
|
||||||
|
|
||||||
|
tls on
|
||||||
|
tls_trust_file config/domains/testserver/cert.pem
|
||||||
|
|
||||||
|
from user@testserver
|
||||||
|
|
||||||
|
auth on
|
||||||
|
user user@testserver
|
||||||
|
password secretpassword
|
||||||
29
test/t-05-null_address/run.sh
Executable file
29
test/t-05-null_address/run.sh
Executable file
@@ -0,0 +1,29 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. $(dirname ${0})/../util/lib.sh
|
||||||
|
|
||||||
|
init
|
||||||
|
|
||||||
|
generate_certs_for testserver
|
||||||
|
add_user testserver user secretpassword
|
||||||
|
|
||||||
|
mkdir -p .logs
|
||||||
|
chasquid -v=2 --log_dir=.logs --config_dir=config &
|
||||||
|
wait_until_ready 1025
|
||||||
|
|
||||||
|
|
||||||
|
# Send mail with an empty address (directly, unauthenticated).
|
||||||
|
nc localhost 1025 < sendmail > /dev/null
|
||||||
|
wait_for_file .mail/user@testserver
|
||||||
|
mail_diff content .mail/user@testserver
|
||||||
|
rm -f .mail/user@testserver
|
||||||
|
|
||||||
|
|
||||||
|
# Test that we get mail back for a failed delivery
|
||||||
|
run_msmtp fail@testserver < content
|
||||||
|
wait_for_file .mail/user@testserver
|
||||||
|
mail_diff expected_dsr .mail/user@testserver
|
||||||
|
|
||||||
|
|
||||||
|
success
|
||||||
13
test/t-05-null_address/sendmail
Normal file
13
test/t-05-null_address/sendmail
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
EHLO
|
||||||
|
MAIL FROM: <>
|
||||||
|
RCPT TO: user@testserver
|
||||||
|
DATA
|
||||||
|
From: Mailer daemon <somewhere@horns.com>
|
||||||
|
Subject: I've come to haunt you
|
||||||
|
|
||||||
|
Muahahahaha
|
||||||
|
|
||||||
|
|
||||||
|
.
|
||||||
|
QUIT
|
||||||
|
|
||||||
@@ -19,11 +19,49 @@ for h, val in expected.items():
|
|||||||
print("Header missing: %r" % h)
|
print("Header missing: %r" % h)
|
||||||
diff = True
|
diff = True
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if expected[h] == '*':
|
||||||
|
continue
|
||||||
|
|
||||||
if msg[h] != val:
|
if msg[h] != val:
|
||||||
print("Header %r differs: %r != %r" % (h, val, msg[h]))
|
print("Header %r differs: %r != %r" % (h, val, msg[h]))
|
||||||
diff = True
|
diff = True
|
||||||
|
|
||||||
if expected.get_payload() != msg.get_payload():
|
|
||||||
|
def flexible_eq(expected, got):
|
||||||
|
"""Compare two strings, supporting wildcards.
|
||||||
|
|
||||||
|
This functions compares two strings, but supports wildcards on the
|
||||||
|
expected string. The following characters have special meaning:
|
||||||
|
|
||||||
|
- ? matches any character.
|
||||||
|
- * matches anything until the end of the line.
|
||||||
|
|
||||||
|
Returns True if equal (considering wildcards), False otherwise.
|
||||||
|
"""
|
||||||
|
posG = 0
|
||||||
|
for c in expected:
|
||||||
|
if posG >= len(got):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if c == '?':
|
||||||
|
posG += 1
|
||||||
|
continue
|
||||||
|
if c == '*':
|
||||||
|
while got[posG] != '\n':
|
||||||
|
posG += 1
|
||||||
|
continue
|
||||||
|
continue
|
||||||
|
|
||||||
|
if c != got[posG]:
|
||||||
|
return False
|
||||||
|
|
||||||
|
posG += 1
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
if not flexible_eq(expected.get_payload(), msg.get_payload()):
|
||||||
diff = True
|
diff = True
|
||||||
|
|
||||||
if expected.is_multipart() != msg.is_multipart():
|
if expected.is_multipart() != msg.is_multipart():
|
||||||
|
|||||||
Reference in New Issue
Block a user