test-var-expand.c revision 2e01cfaa0acc57a7f44478ecf82be8b8521a3fcf
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2009-2013 Dovecot authors, see the included COPYING file */
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen#include "test-lib.h"
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen#include "str.h"
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen#include "env-util.h"
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen#include "hostpid.h"
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen#include "var-expand.h"
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainenstruct var_expand_test {
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen const char *in;
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen const char *out;
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen};
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainenstruct var_get_key_range_test {
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen const char *in;
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen unsigned int idx, size;
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen};
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainenstatic void test_var_expand_builtin(void)
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen{
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen static struct var_expand_test tests[] = {
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen { "%{hostname}", NULL },
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen { "%{pid}", NULL },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { "a%{env:FOO}b", "abaRb" },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { "%50Hv", "1f" },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { "%50Hw", "2e" },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { "%50Nv", "25" },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { "%50Nw", "e" }
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen };
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen static struct var_expand_table table[] = {
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { 'v', "value", NULL },
2e01cfaa0acc57a7f44478ecf82be8b8521a3fcfTimo Sirainen { 'w', "value2", NULL },
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen { '\0', NULL, NULL }
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen };
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen string_t *str = t_str_new(128);
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen unsigned int i;
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen tests[0].out = my_hostname;
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen tests[1].out = my_pid;
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen env_put("FOO=baR");
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen test_begin("var_expand");
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); i++) {
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen str_truncate(str, 0);
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen var_expand(str, tests[i].in, table);
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen test_assert(strcmp(tests[i].out, str_c(str)) == 0);
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen }
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen test_end();
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen}
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainenstatic void test_var_get_key_range(void)
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen{
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen static struct var_get_key_range_test tests[] = {
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "", 0, 0 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "{", 1, 0 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "k", 0, 1 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "{key}", 1, 3 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "5.5Rk", 4, 1 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "5.5R{key}", 5, 3 },
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen { "{key", 1, 3 }
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen };
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen unsigned int i, idx, size;
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_begin("var_get_key_range");
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); i++) {
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen var_get_key_range(tests[i].in, &idx, &size);
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_assert(tests[i].idx == idx);
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_assert(tests[i].size == size);
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen if (tests[i].size == 1)
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_assert(tests[i].in[idx] == var_get_key(tests[i].in));
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen }
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_end();
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen}
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainenvoid test_var_expand(void)
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen{
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen test_var_expand_builtin();
b58cb4b59ccd78ee1c3e0df0bc13c300d1bec380Timo Sirainen test_var_get_key_range();
927d3977d5598f12ae18d4fa3f22b9e913f7dd46Timo Sirainen}