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)
|
||||
diff = True
|
||||
continue
|
||||
|
||||
if expected[h] == '*':
|
||||
continue
|
||||
|
||||
if msg[h] != val:
|
||||
print("Header %r differs: %r != %r" % (h, val, msg[h]))
|
||||
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
|
||||
|
||||
if expected.is_multipart() != msg.is_multipart():
|
||||
|
||||
Reference in New Issue
Block a user