require "vnd.stalwart.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 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: 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 ) id 1LTZaP-0007h3-2e for stephan@xi.example.org; Sun, 01 Feb 2009 11:29:57 +0100 From: Dovecot Debian Builder To: stephan@xi.example.org Subject: Log for failed build of dovecot_2:1.2.alpha5-0~auto+159 (dist=hardy) Message-Id: 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}"; } }