1
0
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:
Alberto Bertogli
2016-09-25 20:05:21 +01:00
parent 1d3675a133
commit 469cbd5d76
9 changed files with 149 additions and 1 deletions

View 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: "._"

View File

@@ -0,0 +1,3 @@
fail: | false

View File

@@ -0,0 +1,5 @@
From: Mailer daemon <somewhere@horns.com>
Subject: I've come to haunt you
Muahahahaha

View 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

View File

@@ -0,0 +1 @@
testserver localhost

View 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
View 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

View 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

View File

@@ -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():