Fix bug in previous patch: following data is permitted after '.' so it
[users/heiko/exim.git] / test / scripts / 0000-Basic / 0002
index eaa0dd82a07254e3fb5c6dc07a1a5ee9e48ea08e..fd332afa46e2ece74109afadc2df8f685682e20d 100644 (file)
@@ -40,12 +40,49 @@ x\
 +$11111111111111111111111111111111111
 +${11111111111111111111111111111111111}
 
+# List operations
+
+filter: "${filter{a:b:c}{eq{1}{1}}}"
+filter: ${filter{a:b:c}{!eq{$item}{b}}}
+filter: ${filter{<' a'b'c}{!eq{$item}{b}}}
+filter: ${filter{<' ''a'b' ''c}{!eq{$item}{b}}}
+filter: "${filter{}{!eq{$item}{b}}}"
+
+map: "${map{}{$item}}"
+map: ${map{a:b:c}{$item}}
+map: ${map{a:b:c}{:$item:}}
+map: ${if eq{1}{0}{${map{a:b:c}{:$item:}}}{fail string}}
+map: ${map{:b:c}{[$item]}}
+
+reduce: "${reduce{}{+}{$value$item}}"
+reduce: ${reduce{a:b:c}{+}{$value$item}}
+reduce: ${reduce {<, 1,2,3}{0}{${eval:$value+$item}}}
+reduce: ${reduce {3:0:9:4:6}{0}{${if >{$item}{$value}{$item}{$value}}}}
+
+# Tests with iscntrl() and illegal separators
+
+map: ${map{<\n a\n\nb\nc}{'$item'}}
+
+reduce: ${reduce {<n 1\n2\n3}{0}{${eval:$value+$item}}}
+reduce: ${reduce {<\n 1\n2\n3}{0}{${eval:$value+$item}}}
+reduce: ${reduce { <\n 1\n 2 \n 3 }{0}{${eval:$value+$item}}}
+reduce: ${reduce {<\x7f 1\x7f2\177 3}{0}{${eval:$value+$item}}}
+
 # Operators
 
 addrss: ${address:local-part@dom.ain}
 addrss: ${address:Exim Person <local-part@dom.ain> (that's me)}
 domain: ${domain:local-part@dom.ain}
 domain: ${domain:Exim Person <local-part@dom.ain> (that's me)}
+
+addresses: ${addresses:>' 'abc@xyz, 'pqr@xyz}
+addresses: ${addresses:Exim Person <local-part@dom.ain> (that's me)}
+addresses: ${addresses:>+ Exim Person <local-part@dom.ain> (that's me),\
+           xyz@abc}
+addresses: ${addresses:Exim Person <local-part@dom.ain> (that's me), \
+           xyz@abc, nullgroupname:;, group: p@q, r@s; }
+addresses: ${addresses:local-part@dom.ain <local-part@dom.ain>}
+
 escape: ${escape:B7·F2ò}
 eval:   ${eval:1+1}
 eval:   ${eval:1+2*3}
@@ -67,6 +104,20 @@ eval:   ${eval:077}
 eval:   ${eval:08}
 eval10: ${eval10:077}
 eval10: ${eval10:08}
+eval10: ${eval10:0x1234}
+eval:   ${eval:2+42%5}
+eval:   ${eval:0xc&5}
+eval:   ${eval:0xc & 5 }
+eval:   ${eval:0x0c|5}
+eval:   ${eval:0xc^5}
+eval:   ${eval:0xc>>1}
+eval:   ${eval:0xc >> 2}
+eval:   ${eval:0xc >> 4 }
+eval:   ${eval:0xc<<1}
+eval:   ${eval:~255&0x1234}
+eval:   ${eval:~ 255&0x1234}
+eval:   ${eval: -(~255&0x1234)}
+
 expand: \$primary_hostname ${expand:\$primary_hostname}
 hash:   ${hash_3:monty} ${hash_5:monty} ${hash_4_62:monty python}
 hash:   ${hash_3:abc}X ${hash_3:ab}X ${hash_3:a}X ${hash_3:}X
@@ -86,15 +137,15 @@ while doing a reasonable check.
 base62:  ${if or {\
                  {eq {${base62:12345}}{0003D7}}\
                  {eq {${base62:12345}}{0009IX}}\
-                 }{OK}{NOT OK}} 
+                 }{OK}{NOT OK}}
 base62d: ${if or {\
                  {eq {${base62d:0003D7}}{12345}}\
                  {eq {${base62d:0009IX}}{12345}}\
-                 }{OK}{NOT OK}} 
+                 }{OK}{NOT OK}}
 base62d: ${if or {\
                  {eq {${base62d:3D7}}{12345}}\
                  {eq {${base62d:9IX}}{12345}}\
-                 }{OK}{NOT OK}} 
+                 }{OK}{NOT OK}}
 base62 error: ${base62:12345x}
 base62d error:${base62d:0003D7.}
 
@@ -142,6 +193,12 @@ str2b64:${str2b64:The quick brown \n fox}
 strlen: ${strlen:}
 strlen: ${strlen:a}
 strlen: ${strlen:abcdefgh}
+time_eval:     ${time_eval:10s}
+time_eval:     ${time_eval:2h}
+time_eval:     ${time_eval:1d5m}
+time_eval:     ${time_eval:1w2d3h4m5s}
+time_eval:     ${time_eval:14}
+time_eval:     ${time_eval:rhubarb}
 time_interval: ${time_interval:0}
 time_interval: ${time_interval:44}
 time_interval: ${time_interval:999999}
@@ -181,6 +238,11 @@ hash:   ${if eq {1}{2}{${hash_3:invalid}}{NO}}
 md5:    ${if eq {1}{2}{${md5:invalid}}{NO}}
 mask:   ${if eq {1}{2}{${mask:invalid}}{NO}}
 
+# Numeric overflow
+
+4096M      ${if >{1}{4096M}{y}{n}}
+4096000000 ${if >{1}{4096000000}{y}{n}}
+
 # Conditions
 
 2=2:    ${if ={2}{2}{y}{n}}
@@ -194,6 +256,7 @@ mask:   ${if eq {1}{2}{${mask:invalid}}{NO}}
 2>3:    ${if >{2}{3}{y}{n}}
 3>3:    ${if >{3}{3}{y}{n}}
 4>3:    ${if >{4}{3}{y}{n}}
+1>-1:   ${if >{1}{-1}{y}{n}}
 2>=3:   ${if >={2}{3}{y}{n}}
 3>=3:   ${if >={3}{3}{y}{n}}
 4>=3:   ${if >={4}{3}{y}{n}}
@@ -204,12 +267,19 @@ mask:   ${if eq {1}{2}{${mask:invalid}}{NO}}
 3<=3:   ${if <={3}{3}{y}{n}}
 4<=3:   ${if <={4}{3}{y}{n}}
 5<=3:   ${if <={ 5 } { 3 } {y}{n}}
+-3<=1:  ${if <={-3}{1}{y}{n}}
 
 5>3k:   ${if >{5 } {3k }{y}{n}}
 5>3m:   ${if >{5 } {3m }{y}{n}}
 5>3z:   ${if >{5 } {3z }{y}{n}}
 5>a:    ${if >{ 5 } {a}{y}{n}}
 
+>0:     ${if > {}{0}{y}{n}}
+=:      ${if = {}{}{y}{n}}
+-2<:    ${if < {-2}{}{y}{n}}
+08>07:  ${if > {08}{07}{y}{n}}
+011=11: ${if = {011}{11}{y}{n}}
+
 def:y   ${if def:tod_log{y}{n}}
 def:n   ${if def:host{y}{n}}
 def:f   ${if def:post{y}{n}}
@@ -269,6 +339,22 @@ match_domain:    ${if match_domain{5.aa.bb}{+dlist}{yes}{no}}
 match_domain:    ${if match_domain{xxxyz}{+dlist}{yes}{no}}
 match_domain:    ${if match_domain{xyz}{+dlist}{yes}{no}}
 
+${if match{x@zz.aa.bb}{^(.*)} \
+  { \
+  >$1< \
+  ${if match_domain{${domain:$1}}{+dlist}{[$1]}} \
+  >$1< \
+  } \
+  { CAN'T HAPPEN}}
+
+${if match{x@xxxabc}{^(.*)} \
+  { \
+  >$1< \
+  ${if match_domain{${domain:$1}}{^\Nxxx(.*)\N}{[$1]}} \
+  >$1< \
+  } \
+  { CAN'T HAPPEN}}
+
 match_address:   ${if match_address{x@y.z}{p@q:*@y.z}{yes}{no}}
 match_address:   ${if match_address{x@y.z}{p@q:x@*.z}{yes}{no}}
 
@@ -365,6 +451,13 @@ a99b:  ${lookup{a99b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}}
 a\\:b:  ${lookup{a\\:b}nwildlsearch{DIR/aux-var/0002.wild}}
 a\\:Xb: ${lookup{a\\:Xb}nwildlsearch{DIR/aux-var/0002.wild}}
 
+# Some tests of case-(in)dependence
+
+MiXeD-CD:  ${lookup{MiXeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MixeD-CD:  ${lookup{MixeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MiXeD-Ncd: ${lookup{MiXeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MixeD-Ncd: ${lookup{MixeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+
 # IP address (CIDR) lookups
 
 1.2.3.4:      ${lookup{1.2.3.4}iplsearch{DIR/aux-fixed/0002.iplsearch}}
@@ -446,6 +539,13 @@ abcd      ${rfc2047:abcd}
 Long:     ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit}
 Long:     ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit by a long way; in fact this one will go over the 150 character limit}
 
+# RFC 2047 decode
+
+${rfc2047d:abcd      abcd}
+${rfc2047d:<:abcd:>  =?iso-8859-8?Q?=3C=3Aabcd=3A=3E?=}
+${rfc2047d:<:ab cd:> =?iso-8859-8?Q?=3C=3Aab_cd=3A=3E?=}
+${rfc2047d:Long:     =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit?=}
+${rfc2047d:Long:     =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit_by_a_long_way=3B_in_fac?= =?iso-8859-8?Q?t_this_one_will_go_over_the_150_character_limit?=}
 
 # UTF-8
 
@@ -506,7 +606,7 @@ ${prvs{userx@test.ex}{secret}{rhubarb}}
 ${prvs{userx@test.ex}{secret}{}}
 
 # Correct checks; can't put explicit addresses in the tests, because they
-# will change over time. 
+# will change over time.
 
 ${prvscheck{${prvs{userx@test.ex}{secret}}}{secret}}
 result=$prvscheck_result
@@ -542,12 +642,67 @@ ${if and {xyz}{a}{b}}
 ${if and {{xya}}{a}{b}}
 ${if and {{${lookup{x}lsearch{/a/b}}}}{a}{b}}
 ${if eq {$h_xyz}{1}{y}{n}}
+${if eq {$h_xyz:}{1}{y}{n}
+${if def:h_xyz}{y}{n}}
 ${if or {eq {}{}{yes}{no}}
 ${if or {{eq {}{}{yes}{no}}
 ${if or {{eq {}{}}{yes}{no}}
 ${substr_1_:12345}
 ${substr__3:12345}
 
+# Iterations: forany and forall
+
+${if forany{a:b:c}{eq{$item}{a}}{yes}{no}}
+${if forany{a:b:c}{eq{$item}{b}}{yes}{no}}
+${if forany{a:b:c}{eq{$item}{c}}{yes}{no}}
+${if forany {a:b:c} {eq {$item} {z}} {yes} {no}}
+${if !forany{a:b:c}{eq{$item}{z}}{yes}{no}}
+${if !forany{a:b:c}{eq{$item}{a}}{yes}{no}}
+${if forany{}{eq{$item}{a}}{yes}{no}}
+${if !forany{}{eq{$item}{a}}{yes}{no}}
+${if forany{<, $primary_hostname,foo,bar}{eq{$item}{$primary_hostname}}{yes}{no}}
+
+${if forany{}{yes}{no}}
+${if forany{a:b:c}{gt{$item}{a}{yes}{no}}
+
+${if forall{a:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{q:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{a:b:z}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{}{match{$item}{^[a-c]\$}}{yes}{no}}
+
+${if !forall{a:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{q:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{a:b:z}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{}{match{$item}{^[a-c]\$}}{yes}{no}}
+
+# Expect yes
+${if forany{a:b:c}\
+  {\
+  eq\
+    {$item: ${if forall{x:y:z}{match{$item}{^[x-z]\$}}{true}{false}}}\
+    {$item: true}\
+  }\
+{outer=yes}{outer=no}} item='$item' (unset)
+
+# Expect no
+${if forany{a:b:c}\
+  {\
+  eq\
+    {$item: ${if !forall{x:y:z}{match{$item}{^[x-z]\$}}{true}{false}}}\
+    {$item: true}\
+  }\
+{outer=yes}{outer=no}}
+
+# Error inside nest - check message is helpful
+${if forany{a:b:c}\
+  {\
+  eq\
+    {$item: ${if forall{x:y:z}{match{$item}{^[x-z]\$}{true}{false}}}\
+    {$item: true}\
+  }\
+{outer=yes}{outer=no}}
+
+
 # Miscellaneous (for bug fixes, etc)
 
 ${if ={1}{1} {true}{${if ={1}{1} {true}{${if ={1}{1}{true}fail}}}}}
@@ -676,3 +831,8 @@ Subject: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i
 .
 quit
 ****
+# Certain kind of error
+exim -d -be
+match_ip:        15 ${if match_ip{1.2.3.4}{1.2.3}}
+match_ip:        16 ${if match_ip{1.2.3.4}{1.2.3.4/abc}}
+****