Blame tests/test_expr.c

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
}