git » chasquid » commit 469cbd5

test: Add a test for DSN and null address deliveries

author Alberto Bertogli
2016-09-25 19:05:21 UTC
committer Alberto Bertogli
2016-10-09 23:51:04 UTC
parent 1d3675a13393e95df466d4be5ef4bc0092ba36dc

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).

test/t-05-null_address/config/chasquid.conf +13 -0
test/t-05-null_address/config/domains/testserver/aliases +3 -0
test/t-05-null_address/content +5 -0
test/t-05-null_address/expected_dsr +33 -0
test/t-05-null_address/hosts +1 -0
test/t-05-null_address/msmtprc +13 -0
test/t-05-null_address/run.sh +29 -0
test/t-05-null_address/sendmail +13 -0
test/util/mail_diff +39 -1

diff --git a/test/t-05-null_address/config/chasquid.conf b/test/t-05-null_address/config/chasquid.conf
new file mode 100644
index 0000000..f994c10
--- /dev/null
+++ b/test/t-05-null_address/config/chasquid.conf
@@ -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: "._"
diff --git a/test/t-05-null_address/config/domains/testserver/aliases b/test/t-05-null_address/config/domains/testserver/aliases
new file mode 100644
index 0000000..0c85b2c
--- /dev/null
+++ b/test/t-05-null_address/config/domains/testserver/aliases
@@ -0,0 +1,3 @@
+
+fail: | false
+
diff --git a/test/t-05-null_address/content b/test/t-05-null_address/content
new file mode 100644
index 0000000..911f0dc
--- /dev/null
+++ b/test/t-05-null_address/content
@@ -0,0 +1,5 @@
+From: Mailer daemon <somewhere@horns.com>
+Subject: I've come to haunt you
+
+Muahahahaha
+
diff --git a/test/t-05-null_address/expected_dsr b/test/t-05-null_address/expected_dsr
new file mode 100644
index 0000000..b2c473b
--- /dev/null
+++ b/test/t-05-null_address/expected_dsr
@@ -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
+
+
diff --git a/test/t-05-null_address/hosts b/test/t-05-null_address/hosts
new file mode 100644
index 0000000..2b9b623
--- /dev/null
+++ b/test/t-05-null_address/hosts
@@ -0,0 +1 @@
+testserver localhost
diff --git a/test/t-05-null_address/msmtprc b/test/t-05-null_address/msmtprc
new file mode 100644
index 0000000..91fab60
--- /dev/null
+++ b/test/t-05-null_address/msmtprc
@@ -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
diff --git a/test/t-05-null_address/run.sh b/test/t-05-null_address/run.sh
new file mode 100755
index 0000000..23c28ca
--- /dev/null
+++ b/test/t-05-null_address/run.sh
@@ -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
diff --git a/test/t-05-null_address/sendmail b/test/t-05-null_address/sendmail
new file mode 100644
index 0000000..4b7c677
--- /dev/null
+++ b/test/t-05-null_address/sendmail
@@ -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
+
diff --git a/test/util/mail_diff b/test/util/mail_diff
index da87547..761073d 100755
--- a/test/util/mail_diff
+++ b/test/util/mail_diff
@@ -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():