summaryrefslogtreecommitdiffstats
path: root/pigeonhole/tests/extensions/envelope.svtest
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/tests/extensions/envelope.svtest')
-rw-r--r--pigeonhole/tests/extensions/envelope.svtest244
1 files changed, 244 insertions, 0 deletions
diff --git a/pigeonhole/tests/extensions/envelope.svtest b/pigeonhole/tests/extensions/envelope.svtest
new file mode 100644
index 0000000..9cf3b8b
--- /dev/null
+++ b/pigeonhole/tests/extensions/envelope.svtest
@@ -0,0 +1,244 @@
+require "vnd.dovecot.testsuite";
+
+require "envelope";
+
+/*
+ * Empty envelope addresses
+ */
+
+/* RFC 5228, Section 5.4: The null reverse-path is matched against as the empty
+ * string, regardless of the ADDRESS-PART argument specified.
+ */
+
+test "Envelope - from empty" {
+ /* Return_path: "" */
+
+ test_set "envelope.from" "";
+
+ if not envelope :all :is "from" "" {
+ test_fail "failed to (:all :is)-match a \"\" return path";
+ }
+
+ if not envelope :all :contains "from" "" {
+ test_fail "failed to (:all :contains)-match a \"\" return path";
+ }
+
+ if not envelope :domain :is "from" "" {
+ test_fail "failed to (:domain :is)-match a \"\" return path";
+ }
+
+ if not envelope :domain :contains "from" "" {
+ test_fail "failed to (:domain :contains)-match a \"\" return path";
+ }
+
+ /* Return path: <> */
+
+ test_set "envelope.from" "<>";
+
+ if not envelope :all :is "from" "" {
+ test_fail "failed to (:all :is)-match a <> return path";
+ }
+
+ if not envelope :all :contains "from" "" {
+ test_fail "failed to (:all :contains)-match a <> return path";
+ }
+
+ if not envelope :domain :is "from" "" {
+ test_fail "failed to (:domain :is)-match a <> return path";
+ }
+
+ if not envelope :domain :contains "from" "" {
+ test_fail "failed to (:domain :contains)-match a <> return path";
+ }
+
+ if envelope :all :is "from" "nico@frop.example.org" {
+ test_fail "envelope test matches nonsense";
+ }
+}
+
+/*
+ * Invalid envelope addresses
+ */
+
+test "Envelope - invalid paths" {
+ /* Return_path: "hutsefluts" */
+
+ test_set "envelope.from" "hutsefluts@";
+ test_set "envelope.to" "knurft@";
+
+ if envelope :all :is "from" "hutsefluts@" {
+ test_fail ":all address part matched syntactically incorrect reverse path";
+ }
+ if envelope :all :is "to" "knurft@" {
+ test_fail ":all address part matched syntactically incorrect forward path";
+ }
+}
+
+/*
+ * Syntax errors
+ */
+
+test "Envelope - syntax errors" {
+ /* Control */
+ test_set "envelope.from" "<stephan@example.org>";
+ if not envelope :all :is "from" "stephan@example.org" {
+ test_fail "correct control test failed";
+ }
+
+ # Duplicate <
+ test_set "envelope.from" "<<stephan@example.org>";
+ if envelope :all :is "from" "stephan@example.org" {
+ test_fail "failed to recognize syntax error (1)";
+ }
+
+ # Spurious >
+ test_set "envelope.from" "stephan@example.org>";
+ if envelope :all :is "from" "stephan@example.org" {
+ test_fail "failed to recognize syntax error (2)";
+ }
+
+ # Missing >
+ test_set "envelope.from" "<stephan@example.org";
+ if envelope :all :is "from" "stephan@example.org" {
+ test_fail "failed to recognize syntax error (3)";
+ }
+
+ # No @
+ test_set "envelope.from" "<stephan example.org>";
+ if envelope :domain :contains "from" "example" {
+ test_fail "failed to recognize syntax error (4)";
+ }
+
+ # Duplicate @
+ test_set "envelope.from" "<stephan@@example.org>";
+ if envelope :domain :contains "from" "example" {
+ test_fail "failed to recognize syntax error (5)";
+ }
+}
+
+/*
+ * Ignoring source routes
+ */
+
+test "Envelope - source route" {
+ /* Single */
+ test_set "envelope.from" "<@cola.example.org:stephan@example.org>";
+ if not envelope :localpart :is "from" "stephan" {
+ test_fail "parsing path with source route (single) failed";
+ }
+
+ /* Dual */
+ test_set "envelope.from" "<@cola.example.org,@mx.utwente.nl:stephan@example.org>";
+ if not envelope :localpart :is "from" "stephan" {
+ test_fail "parsing path with source route (dual) failed";
+ }
+
+ /* Multiple */
+ test_set "envelope.from" "<@cola.example.org,@mx.utwente.nl,@smtp.example.net:stephan@example.org>";
+ if not envelope :localpart :is "from" "stephan" {
+ test_fail "parsing path with source route (multiple) failed";
+ }
+}
+
+test "Envelope - source route errors" {
+ test_set "envelope.to" "<cola.example.org:stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (1)";
+ }
+
+ test_set "envelope.to" "<@.example.org:stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (2)";
+ }
+
+ test_set "envelope.to" "<@cola..nl:stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (3)";
+ }
+
+ test_set "envelope.to" "<@cola.example.orgstephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (4)";
+ }
+
+ test_set "envelope.to" "<@cola.example.org@mx.utwente.nl:stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (5)";
+ }
+
+ test_set "envelope.to" "<@cola.example.org,mx.utwente.nl:stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (6)";
+ }
+
+ test_set "envelope.to" "<@cola.example.org,@mx.utwente.nl,stephan@example.org>";
+ if envelope :domain :contains "to" "" {
+ test_fail "parsing syntactically incorrect path should have failed (7)";
+ }
+}
+
+test "Envelope - local part only" {
+ test_set "envelope.to" "<MAILER-DAEMON>";
+ if not envelope :is "to" "MAILER-DAEMON" {
+ test_fail "failed to parse local_part only path";
+ }
+
+ test_set "envelope.to" "MAILER-DAEMON@";
+ if envelope :is "to" "MAILER-DAEMON" {
+ test_fail "parsing syntactically incorrect path with missing domain";
+ }
+
+ test_set "envelope.to" "<MAILER-DAEMON>";
+ if not envelope :is "to" "MAILER-DAEMON" {
+ test_fail "failed to parse local_part only path with angle brackets";
+ }
+}
+
+test "Envelope - Japanese localpart" {
+ test_set "envelope.to" ".japanese@example.com";
+ if not envelope :localpart :is "to" ".japanese" {
+ test_fail "failed to parse japanese local_part (1)";
+ }
+
+ test_set "envelope.to" "japanese.@example.com";
+ if not envelope :localpart :is "to" "japanese." {
+ test_fail "failed to parse japanese local_part (2)";
+ }
+
+ test_set "envelope.to" "japanese...localpart@example.com";
+ if not envelope :localpart :is "to" "japanese...localpart" {
+ test_fail "failed to parse japanese local_part (3)";
+ }
+
+ test_set "envelope.to" "..japanese...localpart..@example.com";
+ if not envelope :localpart :is "to" "..japanese...localpart.." {
+ test_fail "failed to parse japanese local_part (4)";
+ }
+}
+
+test "Envelope - Non-standard hostnames" {
+ test_set "envelope.to" "japanese@_example.com";
+ if not envelope :domain :is "to" "_example.com" {
+ test_fail "failed to parse non-standard domain (1)";
+ }
+
+ test_set "envelope.to" "japanese@ex_ample.com";
+ if not envelope :domain :is "to" "ex_ample.com" {
+ test_fail "failed to parse non-standard domain (2)";
+ }
+
+ test_set "envelope.to" "japanese@example_.com";
+ if not envelope :domain :is "to" "example_.com" {
+ test_fail "failed to parse non-standard domain (3)";
+ }
+
+ test_set "envelope.to" "japanese@-example.com";
+ if not envelope :domain :is "to" "-example.com" {
+ test_fail "failed to parse non-standard domain (4)";
+ }
+
+ test_set "envelope.to" "japanese@example-.com";
+ if not envelope :domain :is "to" "example-.com" {
+ test_fail "failed to parse non-standard domain (5)";
+ }
+}