summaryrefslogtreecommitdiffstats
path: root/pigeonhole/tests/extensions/variables/match.svtest
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/tests/extensions/variables/match.svtest')
-rw-r--r--pigeonhole/tests/extensions/variables/match.svtest365
1 files changed, 365 insertions, 0 deletions
diff --git a/pigeonhole/tests/extensions/variables/match.svtest b/pigeonhole/tests/extensions/variables/match.svtest
new file mode 100644
index 0000000..11c0701
--- /dev/null
+++ b/pigeonhole/tests/extensions/variables/match.svtest
@@ -0,0 +1,365 @@
+require "vnd.dovecot.testsuite";
+
+require "variables";
+
+/*
+ * RFC compliance
+ */
+
+# Test acceptance of leading zeroes
+test "RFC - leading zeroes" {
+ if not string :matches "frop:frup:frop" "*:*:*" {
+ test_fail "failed to match";
+ }
+
+ if not string :is "${0000002}" "frup" {
+ test_fail "incorrect match value (0000002): ${0000002}";
+ }
+}
+
+# Test non-greedyness
+test "RFC - not greedy" {
+ if not string :matches "frop.......frop.........frop...." "?*frop*" {
+ test_fail "failed to match";
+ }
+
+ if not string :is "${1}${2}${3}" "frop................frop...." {
+ test_fail "incorrect match values: ${1}${2}${3}";
+ }
+}
+
+# Index out of range
+test "RFC - index out of range" {
+ if not string :matches "test" "*" {
+ test_fail "failed to match (impossible)";
+ }
+
+ if not string :is "${2}" "" {
+ test_fail "incorrect match value: '${2}'";
+ }
+}
+
+# Index 0
+test "RFC - index 0" {
+ if not string :matches "a b c d e f g" "? ? ? ? ? ? ?" {
+ test_fail "failed to match";
+ }
+
+ if not string :is "${0}" "a b c d e f g" {
+ test_fail "incorrect match value: ${0}";
+ }
+}
+
+# Test short-circuit
+test "RFC - test short-circuit" {
+ if not anyof (
+ string :matches "a b c d e f g" "? ?",
+ string :matches "puk pok puk pok" "pu*ok",
+ string :matches "snot kip snot" "snot*snot"
+ ) {
+ test_fail "failed to match any";
+ }
+
+ if string :is "${1}" " kip " {
+ test_fail "did not short-circuit test execution or intented test failed.";
+ }
+
+ if not string :is "${1}" "k pok puk p" {
+ test_fail "incorrect match value: ${1}";
+ }
+}
+
+# Test overwriting only on match
+test "RFC - values overwrite" {
+ set "sentence1" "the cat jumps off the table";
+ set "sentence2" "the dog barks at the cat in the alley";
+
+ if not string :matches "${sentence1}" "the * jumps off the *" {
+ test_fail "failed to match first sentence";
+ }
+
+ if not string :is "${1}:${2}" "cat:table" {
+ test_fail "invalid match values";
+ }
+
+ if string :matches "${sentence2}" "the * barks at the * in the store" {
+ test_fail "should not have matched second sentence";
+ }
+
+ if not string :is "${1}:${2}" "cat:table" {
+ test_fail "should have preserved match values";
+ }
+
+ if not string :matches "${sentence2}" "the * barks at the * in the alley" {
+ test_fail "failed to match the second sentence (second time)";
+ }
+
+ if not string :is "${1}:${2}" "dog:cat" {
+ test_fail "should have overwritten match values";
+ }
+}
+
+test "RFC - example" {
+ test_set "message" text:
+Subject: [acme-users] [fwd] version 1.0 is out
+List-Id: Dovecot Mailing List <dovecot@dovecot.example.net>
+To: coyote@ACME.Example.COM
+Fom: stephan@example.org
+
+Test message.
+.
+;
+ if header :matches "List-ID" "*<*@*" {
+ if not string "INBOX.lists.${2}" "INBOX.lists.dovecot" {
+ test_fail "incorrect match value: INBOX.lists.${2}";
+ }
+ } else {
+ test_fail "failed to match list header";
+ }
+
+ # Imagine the header
+ # Subject: [acme-users] [fwd] version 1.0 is out
+ if header :matches "Subject" "[*] *" {
+ # ${1} will hold "acme-users",
+ # ${2} will hold "[fwd] version 1.0 is out"
+
+ if anyof (
+ not string "${1}" "acme-users",
+ not string "${2}" "[fwd] version 1.0 is out"
+ ) {
+ test_fail "invalid match values: ${1} ${2}";
+ }
+ } else {
+ test_fail "failed to match subject";
+ }
+
+ # Imagine the header
+ # To: coyote@ACME.Example.COM
+ if address :matches ["To", "Cc"] ["coyote@**.com",
+ "wile@**.com"] {
+ # ${0} is the matching address
+ # ${1} is always the empty string
+ # ${2} is part of the domain name ("ACME.Example")
+
+ if anyof (
+ not string "${0}" "coyote@ACME.Example.COM",
+ not string "${1}" "",
+ not string "${2}" "ACME.Example"
+ ) {
+ test_fail "invalid match values: ${0}, ${1}, ${2}";
+ }
+ } else {
+ # Control wouldn't reach this block if any match was
+ # successful, so no match variables are set at this
+ # point.
+
+ test_fail "failed to match to address";
+ }
+
+ if anyof (true, address :domain :matches "To" "*.com") {
+ # The second test is never evaluated, so there are
+ # still no match variables set.
+
+ /* FIXME: not compliant */
+ }
+}
+
+/*
+ * Generic tests
+ */
+
+set "match1" "Test of general stupidity";
+
+test "Begin" {
+ if not string :matches "${match1}" "Test of *" {
+ test_fail "should have matched";
+ }
+
+ if not string :is "${1}" "general stupidity" {
+ test_fail "match value incorrect";
+ }
+}
+
+test "Begin no match" {
+ if string :matches "${match1}" "of *" {
+ test_fail "should not have matched";
+ }
+}
+
+set "match2" "toptoptop";
+
+test "End" {
+ if not string :matches "${match2}" "*top" {
+ test_fail "should have matched";
+ }
+
+ if not string :is "${1}" "toptop" {
+ test_fail "match value incorrect";
+ }
+}
+
+set "match3" "ik ben een tukker met grote oren en een lelijke broek.";
+
+test "Multiple" {
+ if not string :matches "${match3}" "ik ben * met * en *." {
+ test_fail "should have matched";
+ }
+
+ set "line" "Hij is ${1} met ${2} en ${3}!";
+
+ if not string :is "${line}"
+ "Hij is een tukker met grote oren en een lelijke broek!" {
+ test_fail "match values incorrect: ${line}";
+ }
+}
+
+set "match4" "beter van niet?";
+
+test "Escape" {
+ if not string :matches "${match4}" "*\\?" {
+ test_fail "should have matched";
+ }
+
+ if not string :is "${1}" "beter van niet" {
+ test_fail "match value incorrect: ${1}";
+ }
+}
+
+set "match5" "The quick brown fox jumps over the lazy dog.";
+
+test "Alphabet ?" {
+ if not string :matches "${match5}" "T?? ????? ????? ?o? ?u??? o?er ?he ???? ?o?." {
+ test_fail "should have matched";
+ }
+
+ set "alphabet" "${22}${8}${6}${25}${2}${13}${26}${1}${5}${15}${7}${21}${16}${12}${10}${17}${3}${9}${18}${20}${4}${19}${11}${14}${24}${23}";
+
+ if not string :is "${alphabet}" "abcdefghijklmnopqrstuvwxyz" {
+ test_fail "match values incorrect: ${alphabet}";
+ }
+
+ if string :matches "${match5}" "T?? ????? ?w??? ?o? ?u??? o?er ?he ???? ?o?." {
+ test_fail "should not have matched";
+ }
+}
+
+set "match6" "zero:one:zero|three;one;zero/five";
+
+test "Words sep ?" {
+
+ if not string :matches "${match6}" "*one?zero?five" {
+ test_fail "should have matched";
+ }
+
+ if not string :is "${1}${2}${3}" "zero:one:zero|three;;/" {
+ test_fail "incorrect match values: ${1} ${2} ${3}";
+ }
+}
+
+set "match7" "frop";
+
+test "Letters begin ?" {
+ if not string :matches "${match7}" "??op" {
+ test_fail "should have matched";
+ }
+
+ set "val" "${0}:${1}:${2}:${3}:";
+
+ if not string :is "${val}" "frop:f:r::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+test "Letters end ?" {
+ if not string :matches "${match7}" "fr??" {
+ test_fail "should have matched";
+ }
+
+ set "val" "${0}:${1}:${2}:${3}:";
+
+ if not string :is "${val}" "frop:o:p::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+set "match8" "klopfropstroptop";
+
+test "Letters words *? - 1" {
+ if not string :matches "${match8}" "*fr??*top" {
+ test_fail "should have matched";
+ }
+
+ set "val" ":${0}:${1}:${2}:${3}:${4}:${5}:";
+
+ if not string :is "${val}" ":klopfropstroptop:klop:o:p:strop::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+test "Letters words *? - 2" {
+ if not string :matches "${match8}" "?*fr??*top" {
+ test_fail "should have matched";
+ }
+
+ set "val" ":${0}:${1}:${2}:${3}:${4}:${5}:${6}:";
+
+ if not string :is "${val}" ":klopfropstroptop:k:lop:o:p:strop::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+test "Letters words *? backtrack" {
+ if not string :matches "${match8}" "*?op" {
+ test_fail "should have matched";
+ }
+
+ set "val" ":${0}:${1}:${2}:${3}:${4}:";
+
+ if not string :is "${val}" ":klopfropstroptop:klopfropstrop:t:::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+test "Letters words *? first" {
+ if not string :matches "${match8}" "*?op*" {
+ test_fail "failed to match";
+ }
+
+ set "val" ":${0}:${1}:${2}:${3}:${4}:";
+
+ if not string :is "${val}" ":klopfropstroptop:k:l:fropstroptop::" {
+ test_fail "incorrect match values: ${val}";
+ }
+}
+
+/*
+ * Specific tests
+ */
+
+test_set "message" text:
+Return-path: <stephan@xi.example.org>
+Envelope-to: stephan@xi.example.org
+Delivery-date: Sun, 01 Feb 2009 11:29:57 +0100
+Received: from stephan by xi.example.org with local (Exim 4.69)
+ (envelope-from <stephan@xi.example.org>)
+ id 1LTZaP-0007h3-2e
+ for stephan@xi.example.org; Sun, 01 Feb 2009 11:29:57 +0100
+From: Dovecot Debian Builder <stephan.example.org@xi.example.org>
+To: stephan@xi.example.org
+Subject: Log for failed build of dovecot_2:1.2.alpha5-0~auto+159 (dist=hardy)
+Message-Id: <E1LTZaP-0007h3-2e@xi.example.org>
+Date: Sun, 01 Feb 2009 11:29:57 +0100
+
+Automatic build of dovecot_1.2.alpha5-0~auto+159 on xi by sbuild/i386 0.57.7
+.
+;
+
+test "Match combined" {
+ if not header :matches "subject" "Log for ?* build of *" {
+ test_fail "failed to match";
+ }
+
+ if not string "${1}${2}" "failed" {
+ test_fail "incorrect match values: ${1}${2}";
+ }
+}