Mercurial > dovecot > core-2.2
changeset 22540:47f3f4d58b17
var-expand: Add tests for var_expand conditionals
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Mon, 24 Jul 2017 13:31:49 +0300 |
parents | 3bae5694a7a5 |
children | 1fc29e34ee3d |
files | src/lib/test-var-expand.c |
diffstat | 1 files changed, 104 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/test-var-expand.c Mon Jul 24 13:31:02 2017 +0300 +++ b/src/lib/test-var-expand.c Mon Jul 24 13:31:49 2017 +0300 @@ -273,6 +273,109 @@ test_end(); } +static void test_var_expand_if(void) +{ + static const struct var_expand_table table[] = { + { 'a', "alpha", "alpha" }, + { 'b', "beta", "beta" }, + { 'o', "1", "one" }, + { 't', "2", "two" }, + { '\0', ";:", "evil1" }, + { '\0', ";test;", "evil2" }, + { '\0', NULL, NULL } + }; + string_t *dest = t_str_new(64); + test_begin("var_expand_if"); + + static const struct var_expand_test tests[] = { + /* basic numeric operand test */ + { "%{if;1;==;1;yes;no}", "yes"}, + { "%{if;1;==;2;yes;no}", "no"}, + { "%{if;1;<;1;yes;no}", "no"}, + { "%{if;1;<;2;yes;no}", "yes"}, + { "%{if;1;<=;1;yes;no}", "yes"}, + { "%{if;1;<=;2;yes;no}", "yes"}, + { "%{if;1;>;1;yes;no}", "no"}, + { "%{if;1;>;2;yes;no}", "no"}, + { "%{if;1;>=;1;yes;no}", "yes"}, + { "%{if;1;>=;2;yes;no}", "no"}, + { "%{if;1;!=;1;yes;no}", "no"}, + { "%{if;1;!=;2;yes;no}", "yes"}, + /* basic string operand test */ + { "%{if;a;eq;a;yes;no}", "yes"}, + { "%{if;a;eq;b;yes;no}", "no"}, + { "%{if;a;lt;a;yes;no}", "no"}, + { "%{if;a;lt;b;yes;no}", "yes"}, + { "%{if;a;le;a;yes;no}", "yes"}, + { "%{if;a;le;b;yes;no}", "yes"}, + { "%{if;a;gt;a;yes;no}", "no"}, + { "%{if;a;gt;b;yes;no}", "no"}, + { "%{if;a;ge;a;yes;no}", "yes"}, + { "%{if;a;ge;b;yes;no}", "no"}, + { "%{if;a;ne;a;yes;no}", "no"}, + { "%{if;a;ne;b;yes;no}", "yes"}, + { "%{if;a;*;a;yes;no}", "yes"}, + { "%{if;a;*;b;yes;no}", "no"}, + { "%{if;a;*;*a*;yes;no}", "yes"}, + { "%{if;a;*;*b*;yes;no}", "no"}, + { "%{if;a;*;*;yes;no}", "yes"}, + { "%{if;a;!*;a;yes;no}", "no"}, + { "%{if;a;!*;b;yes;no}", "yes"}, + { "%{if;a;!*;*a*;yes;no}", "no"}, + { "%{if;a;!*;*b*;yes;no}", "yes"}, + { "%{if;a;!*;*;yes;no}", "no"}, + { "%{if;a;~;a;yes;no}", "yes"}, + { "%{if;a;~;b;yes;no}", "no"}, + { "%{if;a;~;.*a.*;yes;no}", "yes"}, + { "%{if;a;~;.*b.*;yes;no}", "no"}, + { "%{if;a;~;.*;yes;no}", "yes"}, + { "%{if;a;!~;a;yes;no}", "no"}, + { "%{if;a;!~;b;yes;no}", "yes"}, + { "%{if;a;!~;.*a.*;yes;no}", "no"}, + { "%{if;a;!~;.*b.*;yes;no}", "yes"}, + { "%{if;a;!~;.*;yes;no}", "no"}, + { "%{if;this is test;~;^test;yes;no}", "no"}, + { "%{if;this is test;~;.*test;yes;no}", "yes"}, + /* variable expansion */ + { "%{if;%a;eq;%a;yes;no}", "yes"}, + { "%{if;%a;eq;%b;yes;no}", "no"}, + { "%{if;%{alpha};eq;%{alpha};yes;no}", "yes"}, + { "%{if;%{alpha};eq;%{beta};yes;no}", "no"}, + { "%{if;%o;eq;%o;yes;no}", "yes"}, + { "%{if;%o;eq;%t;yes;no}", "no"}, + { "%{if;%{one};eq;%{one};yes;no}", "yes"}, + { "%{if;%{one};eq;%{two};yes;no}", "no"}, + { "%{if;%{one};eq;%{one};%{one};%{two}}", "1"}, + { "%{if;%{one};gt;%{two};%{one};%{two}}", "2"}, + { "%{if;%{evil1};eq;\\;\\:;%{evil2};no}", ";test;"}, + /* inner if */ + { "%{if;%{if;%{one};eq;1;1;0};eq;%{if;%{two};eq;2;2;3};yes;no}", "no"}, + /* no false */ + { "%{if;1;==;1;yes}", "yes"}, + { "%{if;1;==;2;yes}", ""}, + /* invalid input */ + { "%{if;}", ""}, + { "%{if;1;}", ""}, + { "%{if;1;==;}", ""}, + { "%{if;1;==;2;}", ""}, + { "%{if;1;fu;2;yes;no}", ""}, + /* missing variables */ + { "%{if;%{missing1};==;%{missing2};yes;no}", ""}, + }; + + test_expect_errors(6); + + for(size_t i = 0; i < N_ELEMENTS(tests); i++) { + str_truncate(dest, 0); + var_expand(dest, tests[i].in, table); + test_assert_idx(strcmp(tests[i].out, str_c(dest)) == 0, i); + } + + test_expect_no_more_errors(); + + test_end(); +} + void test_var_expand(void) { test_var_expand_ranges(); @@ -282,4 +385,5 @@ test_var_get_key(); test_var_has_key(); test_var_expand_extensions(); + test_var_expand_if(); }