|
Packit |
6bd9ab |
/*
|
|
Packit |
6bd9ab |
test_expr.c - simple tests for the expr module
|
|
Packit |
6bd9ab |
This file is part of the nss-pam-ldapd library.
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
Copyright (C) 2009, 2011, 2012, 2013 Arthur de Jong
|
|
Packit |
6bd9ab |
Copyright (c) 2016 Giovanni Mascellani
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
This library is free software; you can redistribute it and/or
|
|
Packit |
6bd9ab |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
6bd9ab |
License as published by the Free Software Foundation; either
|
|
Packit |
6bd9ab |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
This library is distributed in the hope that it will be useful,
|
|
Packit |
6bd9ab |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6bd9ab |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
6bd9ab |
Lesser General Public License for more details.
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
6bd9ab |
License along with this library; if not, write to the Free Software
|
|
Packit |
6bd9ab |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit |
6bd9ab |
02110-1301 USA
|
|
Packit |
6bd9ab |
*/
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
#include "config.h"
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
#include <stdio.h>
|
|
Packit |
6bd9ab |
#include <string.h>
|
|
Packit |
6bd9ab |
#include <assert.h>
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
#include "common.h"
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
/* we include expr.c because we want to test the static methods */
|
|
Packit |
6bd9ab |
#include "common/expr.c"
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
static void test_parse_name(void)
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
char buffer[20];
|
|
Packit |
6bd9ab |
int i;
|
|
Packit |
6bd9ab |
i = 0;
|
|
Packit |
6bd9ab |
assert(parse_name("fooBar", &i, buffer, sizeof(buffer)) != NULL);
|
|
Packit |
6bd9ab |
assert(i == 6);
|
|
Packit |
6bd9ab |
i = 0;
|
|
Packit |
6bd9ab |
assert(parse_name("nameThatWillNotFitInBuffer", &i, buffer, sizeof(buffer)) == NULL);
|
|
Packit |
6bd9ab |
i = 0;
|
|
Packit |
6bd9ab |
assert(parse_name("foo Bar", &i, buffer, sizeof(buffer)) != NULL);
|
|
Packit |
6bd9ab |
assert(i == 3);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foo");
|
|
Packit |
6bd9ab |
}
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
static const char *expanderfn(const char *name, void UNUSED(*expander_attr))
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
if (strcmp(name, "empty") == 0)
|
|
Packit |
6bd9ab |
return "";
|
|
Packit |
6bd9ab |
if (strcmp(name, "null") == 0)
|
|
Packit |
6bd9ab |
return NULL;
|
|
Packit |
6bd9ab |
if (strcmp(name, "userPassword") == 0)
|
|
Packit |
6bd9ab |
return "{crypt}HASH";
|
|
Packit |
6bd9ab |
else
|
|
Packit |
6bd9ab |
return "foobar";
|
|
Packit |
6bd9ab |
}
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
static void test_expr_parse(void)
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
char buffer[1024];
|
|
Packit |
6bd9ab |
assert(expr_parse("$test1", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("\\$test1", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "$test1");
|
|
Packit |
6bd9ab |
assert(expr_parse("$empty", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "");
|
|
Packit |
6bd9ab |
assert(expr_parse("$foo1$empty-$foo2", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar-foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("$foo1+$null+$foo2", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar++foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1}\\$", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar$");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:-default}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${empty:-default}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "default");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:+setset}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "setset");
|
|
Packit |
6bd9ab |
assert(expr_parse("${empty:+setset}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "");
|
|
Packit |
6bd9ab |
assert(expr_parse("${empty:-$test1}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("a/$test1/b", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "a/foobar/b");
|
|
Packit |
6bd9ab |
assert(expr_parse("a/$empty/b", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "a//b");
|
|
Packit |
6bd9ab |
assert(expr_parse("a${test1}b", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "afoobarb");
|
|
Packit |
6bd9ab |
assert(expr_parse("a${test1}b${test2:+${test3:-d$test4}e}c", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "afoobarbfoobarec");
|
|
Packit |
6bd9ab |
assert(expr_parse("a${test1}b${test2:+${empty:-d$test4}e}c", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "afoobarbdfoobarec");
|
|
Packit |
6bd9ab |
/* test ${var#trim} functions */
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1#foo}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "bar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1#zoo}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1#?oo}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "bar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1#f\\?o}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${userPassword#{crypt\\}}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "HASH");
|
|
Packit |
6bd9ab |
/* test ${var:offset:length} */
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:0:6}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:0:10}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foobar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:0:3}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "foo");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:3:0}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:3:6}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "bar");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:7:0}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "");
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:7:3}", buffer, sizeof(buffer), expanderfn, NULL) != NULL);
|
|
Packit |
6bd9ab |
assertstreq(buffer, "");
|
|
Packit |
6bd9ab |
/* these are errors */
|
|
Packit |
6bd9ab |
assert(expr_parse("$&", buffer, sizeof(buffer), expanderfn, NULL) == NULL);
|
|
Packit |
6bd9ab |
assert(expr_parse("${a", buffer, sizeof(buffer), expanderfn, NULL) == NULL);
|
|
Packit |
6bd9ab |
}
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
static void test_buffer_overflow(void)
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
char buffer[10];
|
|
Packit |
6bd9ab |
assert(expr_parse("$test1$empty$test1", buffer, sizeof(buffer), expanderfn, NULL) == NULL);
|
|
Packit |
6bd9ab |
assert(expr_parse("long test value", buffer, sizeof(buffer), expanderfn, NULL) == NULL);
|
|
Packit |
6bd9ab |
assert(expr_parse("${test1:-long test value}", buffer, sizeof(buffer), expanderfn, NULL) == NULL);
|
|
Packit |
6bd9ab |
}
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
static void test_expr_vars(void)
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
SET *set;
|
|
Packit |
6bd9ab |
/* simple test */
|
|
Packit |
6bd9ab |
set = set_new();
|
|
Packit |
6bd9ab |
assert(expr_vars("$a", set) != NULL);
|
|
Packit |
6bd9ab |
assert(set_contains(set, "a"));
|
|
Packit |
6bd9ab |
assert(!set_contains(set, "$a"));
|
|
Packit |
6bd9ab |
set_free(set);
|
|
Packit |
6bd9ab |
/* more elaborate test */
|
|
Packit |
6bd9ab |
set = set_new();
|
|
Packit |
6bd9ab |
assert(expr_vars("\"${gecos:-$cn}\"", set) != NULL);
|
|
Packit |
6bd9ab |
assert(set_contains(set, "gecos"));
|
|
Packit |
6bd9ab |
assert(set_contains(set, "cn"));
|
|
Packit |
6bd9ab |
set_free(set);
|
|
Packit |
6bd9ab |
/* more elaborate test */
|
|
Packit |
6bd9ab |
set = set_new();
|
|
Packit |
6bd9ab |
assert(expr_vars("\"${homeDirectory:-/home/$uidNumber/$uid}\"", set) != NULL);
|
|
Packit |
6bd9ab |
assert(set_contains(set, "homeDirectory"));
|
|
Packit |
6bd9ab |
assert(set_contains(set, "uidNumber"));
|
|
Packit |
6bd9ab |
assert(set_contains(set, "uid"));
|
|
Packit |
6bd9ab |
set_free(set);
|
|
Packit |
6bd9ab |
/* a test with attribute options */
|
|
Packit |
6bd9ab |
set = set_new();
|
|
Packit |
6bd9ab |
assert(expr_vars("\"${homeDirectory;foo:-/home/something}\"", set) != NULL);
|
|
Packit |
6bd9ab |
assert(set_contains(set, "homeDirectory;foo"));
|
|
Packit |
6bd9ab |
set_free(set);
|
|
Packit |
6bd9ab |
}
|
|
Packit |
6bd9ab |
|
|
Packit |
6bd9ab |
/* the main program... */
|
|
Packit |
6bd9ab |
int main(int UNUSED(argc), char UNUSED(*argv[]))
|
|
Packit |
6bd9ab |
{
|
|
Packit |
6bd9ab |
test_parse_name();
|
|
Packit |
6bd9ab |
test_expr_parse();
|
|
Packit |
6bd9ab |
test_buffer_overflow();
|
|
Packit |
6bd9ab |
test_expr_vars();
|
|
Packit |
6bd9ab |
return EXIT_SUCCESS;
|
|
Packit |
6bd9ab |
}
|