| 1 | # Common string expansions |
| 2 | # |
| 3 | # This is the main string expansion test that tests those expansions that will |
| 4 | # be present in the basic Exim binary which we require in order to run these |
| 5 | # tests at all. Specialized expansion tests also exist for optional features |
| 6 | # in other test scripts. |
| 7 | munge dnssec |
| 8 | |
| 9 | exim -be |
| 10 | |
| 11 | # These expansions can test variables in the configuration, but as there |
| 12 | # is no message being processed, there is no message-related data. But |
| 13 | # that of course gets tested in plenty of other places. |
| 14 | |
| 15 | # Some fixed variables |
| 16 | |
| 17 | exim_path: $exim_path |
| 18 | exim_version: $exim_version |
| 19 | config_dir: $config_dir |
| 20 | config_file: $config_file |
| 21 | primary_hostname: $primary_hostname |
| 22 | primary_hostname: ${primary_hostname} |
| 23 | qualify_domain: $qualify_domain |
| 24 | bounce_return_size_limit: ${bounce_return_size_limit} |
| 25 | spool_directory: $spool_directory |
| 26 | queue_name: $queue_name |
| 27 | unknown: ${unknown} |
| 28 | h_subject: $h_subject:(should be empty) |
| 29 | h_subject:$h_subject (should be empty) |
| 30 | header in curlies: ${header_subject:} (should fail) |
| 31 | |
| 32 | # \$message_headers should be empty |
| 33 | message_headers: >$message_headers< |
| 34 | |
| 35 | # Continuation |
| 36 | x\ |
| 37 | y |
| 38 | x\ |
| 39 | y |
| 40 | |
| 41 | # Overlong names and overbig numbers |
| 42 | |
| 43 | +$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| 44 | +${aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} |
| 45 | +$11111111111111111111111111111111111 |
| 46 | +${11111111111111111111111111111111111} |
| 47 | |
| 48 | eval: ${eval:0} |
| 49 | eval: ${eval:1} |
| 50 | eval: ${eval:-1} |
| 51 | eval: ${eval:+1} |
| 52 | eval: ${eval:1+1} |
| 53 | eval: ${eval:1+2*3} |
| 54 | eval: ${eval:(1+2)*3} |
| 55 | eval: ${eval:3/2*4} |
| 56 | eval: ${eval:3*4/2} |
| 57 | eval: ${eval:42} |
| 58 | eval: ${eval:} |
| 59 | eval: ${eval:-2} |
| 60 | eval: ${eval:-2 - -3} |
| 61 | eval: ${eval:-2 - (-3)} |
| 62 | eval: ${eval:-2 - (-3} |
| 63 | eval: ${eval:-2 - -3)} |
| 64 | eval: ${eval:-2 --3} |
| 65 | eval: ${eval:-2 -+3} |
| 66 | eval: ${eval:-2 -+-3} |
| 67 | eval: ${eval:(2*(1+1))/2 + 40K} |
| 68 | eval: ${eval:077} |
| 69 | eval: ${eval:08} |
| 70 | eval10: ${eval10:077} |
| 71 | eval10: ${eval10:08} |
| 72 | eval10: ${eval10:0x1234} |
| 73 | eval: ${eval:2+42%5} |
| 74 | eval: ${eval:0xc&5} |
| 75 | eval: ${eval:0xc & 5 } |
| 76 | eval: ${eval:0x0c|5} |
| 77 | eval: ${eval:0xc^5} |
| 78 | eval: ${eval:0xc>>1} |
| 79 | eval: ${eval:0xc >> 2} |
| 80 | eval: ${eval:0xc >> 4 } |
| 81 | eval: ${eval:0xc<<1} |
| 82 | eval: ${eval:~255&0x1234} |
| 83 | eval: ${eval:~ 255&0x1234} |
| 84 | eval: ${eval: -(~255&0x1234)} |
| 85 | |
| 86 | # List operations |
| 87 | |
| 88 | filter: "${filter{a:b:c}{eq{1}{1}}}" |
| 89 | filter: ${filter{a:b:c}{!eq{$item}{b}}} |
| 90 | filter: ${filter{<' a'b'c}{!eq{$item}{b}}} |
| 91 | filter: ${filter{<' ''a'b' ''c}{!eq{$item}{b}}} |
| 92 | filter: "${filter{}{!eq{$item}{b}}}" |
| 93 | |
| 94 | map: "${map{}{$item}}" |
| 95 | map: ${map{a:b:c}{$item}} |
| 96 | map: ${map{a:b:c}{:$item:}} |
| 97 | map: ${if eq{1}{0}{${map{a:b:c}{:$item:}}}{fail string}} |
| 98 | map: ${map{:b:c}{[$item]}} |
| 99 | |
| 100 | reduce: "${reduce{}{+}{$value$item}}" |
| 101 | reduce: ${reduce{a:b:c}{+}{$value$item}} |
| 102 | reduce: ${reduce {<, 1,2,3}{0}{${eval:$value+$item}}} |
| 103 | reduce: ${reduce {3:0:9:4:6}{0}{${if >{$item}{$value}{$item}{$value}}}} |
| 104 | # Check for extract corrupting reduce's $value |
| 105 | reduce: ${reduce {b}{a aaa}{${extract{1}{ }{$value}} , $item}} |
| 106 | |
| 107 | listnamed: ${listnamed:dlist} |
| 108 | listnamed: ${listnamed:+dlist} |
| 109 | listnamed: ${listnamed:hlist} |
| 110 | listnamed: ${listnamed:elist} |
| 111 | listnamed: ${listnamed:flist} |
| 112 | listnamed: ${listnamed:nolist} |
| 113 | listnamed: ${listnamed_d:dlist} |
| 114 | listnamed: ${listnamed_d:hlist} |
| 115 | listnamed: ${listnamed_z:dlist} |
| 116 | |
| 117 | listcount: ${listcount:a:b:c} |
| 118 | listcount: ${listcount:} |
| 119 | listcount: ${listcount:<;a;b;c} |
| 120 | listcount: ${listcount:${listnamed:dlist}} |
| 121 | |
| 122 | listextract: ${listextract{ 2}{a:b:c:d}} |
| 123 | listextract: ${listextract{-2}{<,a,b,c,d}{X${value}X}} |
| 124 | listextract: ${listextract{ 5}{a:b:c:d}} |
| 125 | listextract: ${listextract{-5}{a:b:c:d}} |
| 126 | listextract: ${listextract{ 5}{a:b:c:d}{}{fail}} |
| 127 | listextract: ${listextract{ 5}{a:b:c:d}{}fail} |
| 128 | |
| 129 | sort: ${sort{3:2:1:4}{<}{$item}} |
| 130 | sort: ${sort {<, 3,2,1,4}{>}{$item}} |
| 131 | sort: ${sort{c:B:a:aa}{lti}{$item}} |
| 132 | sort: ${sort{666 r99.ex.com:10 smtp.ex.com:100 r2.ex.com}{<}{${sg {$item}{([0-9]*).*\$}{\$1}}}} |
| 133 | sort: ${sort{666,r99.ex.com:10,smtp.ex.com:100,r2.ex.com}{<}{${listextract{1}{<,$item}}}} |
| 134 | sort: "${sort{}{<}{$item}}" |
| 135 | |
| 136 | # Tests with iscntrl() and illegal separators |
| 137 | |
| 138 | map: ${map{<\n a\n\nb\nc}{'$item'}} |
| 139 | |
| 140 | reduce: ${reduce {<n 1\n2\n3}{0}{${eval:$value+$item}}} |
| 141 | reduce: ${reduce {<\n 1\n2\n3}{0}{${eval:$value+$item}}} |
| 142 | reduce: ${reduce { <\n 1\n 2 \n 3 }{0}{${eval:$value+$item}}} |
| 143 | reduce: ${reduce {<\x7f 1\x7f2\177 3}{0}{${eval:$value+$item}}} |
| 144 | |
| 145 | # Operators |
| 146 | |
| 147 | acl: ${acl |
| 148 | acl: ${acl} |
| 149 | acl: ${acl {a_nosuch}} |
| 150 | acl: ${acl {a_ret}} |
| 151 | acl: ${acl {a_ret}{person@dom.ain}} |
| 152 | acl: ${acl {a_ret}{firstarg}{secondarg}} |
| 153 | acl: ${acl {a_ret}{arg with spaces}} |
| 154 | acl: ${acl {a_none}} |
| 155 | acl: ${acl {a_none}{person@dom.ain}} |
| 156 | acl: ${acl {a_deny}} |
| 157 | acl: ${acl {a_deny}{person@dom.ain}} |
| 158 | acl: ${acl {a_defer}} |
| 159 | acl: ${acl {a_sub}{top_arg_1}{top_arg_2}{top_arg_3}} |
| 160 | acl: ${reduce {1:2:3:4} {} {$value ${acl {a_ret}{$item}}}} |
| 161 | |
| 162 | addrss: ${address:local-part@dom.ain} |
| 163 | addrss: ${address:Exim Person <local-part@dom.ain> (that's me)} |
| 164 | addrss: ${address:Exim Person <local-part(comment)@dom.ain> (that's me)} |
| 165 | addrss: ${address:Exim Person <local-part@dom.ain(comment)> (that's me)} |
| 166 | addrss: ${address:Exim Person <local-part(comment)@dom.ain(comment2)> (that's me)} |
| 167 | addrss: ${address:Exim Person <local-part.(comment)dot-atom@dom.ain(comment2)> (that's me)} |
| 168 | addrss: ${address:Exim Person <(comment)local-part@dom.ain(comment2)> (that's me)} |
| 169 | domain: ${domain:local-part@dom.ain} |
| 170 | domain: ${domain:Exim Person <local-part@dom.ain> (that's me)} |
| 171 | domain: ${domain:Exim Person <local-part(foo)@(bar)dom.ain> (that's me)} |
| 172 | domain: ${domain:a.b.c} |
| 173 | |
| 174 | addresses: ${addresses:>' 'abc@xyz, 'pqr@xyz} |
| 175 | addresses: ${addresses:Exim Person <local-part@dom.ain> (that's me)} |
| 176 | addresses: ${addresses:>+ Exim Person <local-part@dom.ain> (that's me),\ |
| 177 | xyz@abc} |
| 178 | addresses: ${addresses:Exim Person <local-part@dom.ain> (that's me), \ |
| 179 | xyz@abc, nullgroupname:;, group: p@q, r@s; } |
| 180 | addresses: ${addresses:local-part@dom.ain <local-part@dom.ain>} |
| 181 | addresses: ${addresses:>} |
| 182 | |
| 183 |