Blame tests/test_cfg.c

Packit 6bd9ab
/*
Packit 6bd9ab
   test_cfg.c - simple test for the cfg module
Packit 6bd9ab
   This file is part of the nss-pam-ldapd library.
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2007, 2009, 2011, 2012, 2013 Arthur de Jong
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 cfg.c because we want to test the static methods */
Packit 6bd9ab
#include "nslcd/cfg.c"
Packit 6bd9ab
Packit 6bd9ab
static void test_xstrdup(void)
Packit 6bd9ab
{
Packit 6bd9ab
  static const char *foo = "testString123";
Packit 6bd9ab
  char *bar;
Packit 6bd9ab
  bar = xstrdup(foo);
Packit 6bd9ab
  /* we should have a new value */
Packit 6bd9ab
  assert(bar != NULL);
Packit 6bd9ab
  /* the contents should be the same */
Packit 6bd9ab
  assertstreq(foo, bar);
Packit 6bd9ab
  /* but the pointer should be different */
Packit 6bd9ab
  assert(foo != bar);
Packit 6bd9ab
  /* free memory */
Packit 6bd9ab
  free(bar);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_add_uris(void)
Packit 6bd9ab
{
Packit 6bd9ab
  static struct ldap_config cfg;
Packit 6bd9ab
  int i;
Packit 6bd9ab
  /* set up config */
Packit 6bd9ab
  cfg_defaults(&cfg;;
Packit 6bd9ab
  assert(cfg.uris[0].uri == NULL);
Packit 6bd9ab
  /* add a uri */
Packit 6bd9ab
  add_uri(__FILE__, __LINE__, &cfg, "ldap://localhost");
Packit 6bd9ab
  assert(cfg.uris[0].uri != NULL);
Packit 6bd9ab
  assert(cfg.uris[1].uri == NULL);
Packit 6bd9ab
  /* add some more uris */
Packit 6bd9ab
  for (i = 1; i < NSS_LDAP_CONFIG_MAX_URIS; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    add_uri(__FILE__, __LINE__, &cfg, "ldap://localhost");
Packit 6bd9ab
    assert(cfg.uris[i].uri != NULL);
Packit 6bd9ab
    assert(cfg.uris[i + 1].uri == NULL);
Packit 6bd9ab
  }
Packit 6bd9ab
  /* inserting one more entry should call exit():
Packit 6bd9ab
     add_uri(__FILE__, __LINE__, &cfg, "ldap://localhost");
Packit 6bd9ab
     assert(cfg.uris[i] != NULL);
Packit 6bd9ab
     assert(cfg.uris[i + 1] == NULL); */
Packit 6bd9ab
  /* there is no cfg_free() so we have a memory leak here */
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_parse_boolean(void)
Packit 6bd9ab
{
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "True") == 1);
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "faLSe") == 0);
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "1") == 1);
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "oFF") == 0);
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "Yes") == 1);
Packit 6bd9ab
  assert(parse_boolean(__FILE__, __LINE__, "No") == 0);
Packit 6bd9ab
  /* most other values should call exit():
Packit 6bd9ab
     assert(parse_boolean(__FILE__, __LINE__, "Foo") == 0); */
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_parse_scope(void)
Packit 6bd9ab
{
Packit 6bd9ab
  struct ldap_config cfg;
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "sUb", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_SUBTREE);
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "subtree", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_SUBTREE);
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "ONE", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_ONELEVEL);
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "oneLevel", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_ONELEVEL);
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "base", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_BASE);
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "bASe", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_BASE);
Packit 6bd9ab
#ifdef LDAP_SCOPE_CHILDREN
Packit 6bd9ab
  handle_scope(__FILE__, __LINE__, "scope", "children", &cfg;;
Packit 6bd9ab
  assert(cfg.scope == LDAP_SCOPE_CHILDREN);
Packit 6bd9ab
#endif /* LDAP_SCOPE_CHILDREN */
Packit 6bd9ab
  /* most other values should call exit():
Packit 6bd9ab
     handle_scope(__FILE__, __LINE__, "scope", "BSAE", &cfg;; */
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_parse_map(void)
Packit 6bd9ab
{
Packit 6bd9ab
  char *line;
Packit 6bd9ab
  /* some general assertions */
Packit 6bd9ab
  assert((LM_ALIASES != LM_ETHERS) && (LM_ALIASES != LM_GROUP) &&
Packit 6bd9ab
         (LM_ALIASES != LM_HOSTS) && (LM_ALIASES != LM_NETGROUP) &&
Packit 6bd9ab
         (LM_ALIASES != LM_NETWORKS) && (LM_ALIASES != LM_PASSWD) &&
Packit 6bd9ab
         (LM_ALIASES != LM_PROTOCOLS) && (LM_ALIASES != LM_RPC) &&
Packit 6bd9ab
         (LM_ALIASES != LM_SERVICES) && (LM_ALIASES != LM_SHADOW));
Packit 6bd9ab
  assert((LM_ETHERS != LM_GROUP) && (LM_ETHERS != LM_HOSTS) &&
Packit 6bd9ab
         (LM_ETHERS != LM_NETGROUP) && (LM_ETHERS != LM_NETWORKS) &&
Packit 6bd9ab
         (LM_ETHERS != LM_PASSWD) && (LM_ETHERS != LM_PROTOCOLS) &&
Packit 6bd9ab
         (LM_ETHERS != LM_RPC) && (LM_ETHERS != LM_SERVICES) &&
Packit 6bd9ab
         (LM_ETHERS != LM_SHADOW));
Packit 6bd9ab
  assert((LM_GROUP != LM_HOSTS) && (LM_GROUP != LM_NETGROUP) &&
Packit 6bd9ab
         (LM_GROUP != LM_NETWORKS) && (LM_GROUP != LM_PASSWD) &&
Packit 6bd9ab
         (LM_GROUP != LM_PROTOCOLS) && (LM_GROUP != LM_RPC) &&
Packit 6bd9ab
         (LM_GROUP != LM_SERVICES) && (LM_GROUP != LM_SHADOW));
Packit 6bd9ab
  assert((LM_HOSTS != LM_NETGROUP) && (LM_HOSTS != LM_NETWORKS) &&
Packit 6bd9ab
         (LM_HOSTS != LM_PASSWD) && (LM_HOSTS != LM_PROTOCOLS) &&
Packit 6bd9ab
         (LM_HOSTS != LM_RPC) && (LM_HOSTS != LM_SERVICES) &&
Packit 6bd9ab
         (LM_HOSTS != LM_SHADOW));
Packit 6bd9ab
  assert((LM_NETGROUP != LM_NETWORKS) && (LM_NETGROUP != LM_PASSWD) &&
Packit 6bd9ab
         (LM_NETGROUP != LM_PROTOCOLS) && (LM_NETGROUP != LM_RPC) &&
Packit 6bd9ab
         (LM_NETGROUP != LM_SERVICES) && (LM_NETGROUP != LM_SHADOW));
Packit 6bd9ab
  assert((LM_NETWORKS != LM_PASSWD) && (LM_NETWORKS != LM_PROTOCOLS) &&
Packit 6bd9ab
         (LM_NETWORKS != LM_RPC) && (LM_NETWORKS != LM_SERVICES) &&
Packit 6bd9ab
         (LM_NETWORKS != LM_SHADOW));
Packit 6bd9ab
  assert((LM_PASSWD != LM_PROTOCOLS) && (LM_PASSWD != LM_RPC) &&
Packit 6bd9ab
         (LM_PASSWD != LM_SERVICES) && (LM_PASSWD != LM_SHADOW));
Packit 6bd9ab
  assert((LM_PROTOCOLS != LM_RPC) && (LM_PROTOCOLS != LM_SERVICES) &&
Packit 6bd9ab
         (LM_PROTOCOLS != LM_SHADOW));
Packit 6bd9ab
  assert((LM_RPC != LM_SERVICES) && (LM_RPC != LM_SHADOW));
Packit 6bd9ab
  assert((LM_SERVICES != LM_SHADOW));
Packit 6bd9ab
  /* test supported names */
Packit 6bd9ab
  line = "alIas"; assert(get_map(&line) == LM_ALIASES);
Packit 6bd9ab
  line = "AliasES"; assert(get_map(&line) == LM_ALIASES);
Packit 6bd9ab
  line = "ether"; assert(get_map(&line) == LM_ETHERS);
Packit 6bd9ab
  line = "ethers"; assert(get_map(&line) == LM_ETHERS);
Packit 6bd9ab
  line = "group"; assert(get_map(&line) == LM_GROUP);
Packit 6bd9ab
  line = "host"; assert(get_map(&line) == LM_HOSTS);
Packit 6bd9ab
  line = "hosts"; assert(get_map(&line) == LM_HOSTS);
Packit 6bd9ab
  line = "netgroup"; assert(get_map(&line) == LM_NETGROUP);
Packit 6bd9ab
  line = "network"; assert(get_map(&line) == LM_NETWORKS);
Packit 6bd9ab
  line = "networks"; assert(get_map(&line) == LM_NETWORKS);
Packit 6bd9ab
  line = "passwd"; assert(get_map(&line) == LM_PASSWD);
Packit 6bd9ab
  line = "protocol"; assert(get_map(&line) == LM_PROTOCOLS);
Packit 6bd9ab
  line = "protocols"; assert(get_map(&line) == LM_PROTOCOLS);
Packit 6bd9ab
  line = "rpc"; assert(get_map(&line) == LM_RPC);
Packit 6bd9ab
  line = "service"; assert(get_map(&line) == LM_SERVICES);
Packit 6bd9ab
  line = "services"; assert(get_map(&line) == LM_SERVICES);
Packit 6bd9ab
  line = "shadow"; assert(get_map(&line) == LM_SHADOW);
Packit 6bd9ab
  line = "unknown"; assert(get_map(&line) == LM_NONE);
Packit 6bd9ab
  line = "x"; assert(get_map(&line) == LM_NONE);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_parse_map_statement(void)
Packit 6bd9ab
{
Packit 6bd9ab
  /* TODO: implement */
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_tokenize(void)
Packit 6bd9ab
{
Packit 6bd9ab
  /* this leaks memory all over the place */
Packit 6bd9ab
  char *line = strdup("yes  this is 1 simple line");
Packit 6bd9ab
  char *str;
Packit 6bd9ab
  int i;
Packit 6bd9ab
  i = get_boolean(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
  assert(i == 1);
Packit 6bd9ab
  str = get_strdup(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
  assertstreq(str, "this");
Packit 6bd9ab
  str = get_strdup(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
  assertstreq(str, "is");
Packit 6bd9ab
  i = get_int(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
  assert(i == 1);
Packit 6bd9ab
  str = get_linedup(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
  assertstreq(str, "simple line");
Packit 6bd9ab
  get_eol(__FILE__, __LINE__, __PRETTY_FUNCTION__, &line);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
extern const char *passwd_bases[];
Packit 6bd9ab
extern const char *group_filter;
Packit 6bd9ab
extern int passwd_scope;
Packit 6bd9ab
Packit 6bd9ab
static void test_read(void)
Packit 6bd9ab
{
Packit 6bd9ab
  FILE *fp;
Packit 6bd9ab
  struct ldap_config cfg;
Packit 6bd9ab
  /* write some stuff to a temporary file */
Packit 6bd9ab
  fp = fopen("temp.cfg", "w");
Packit 6bd9ab
  assert(fp != NULL);
Packit 6bd9ab
  fprintf(fp, "# a line of comments\n"
Packit 6bd9ab
          "uri ldap://127.0.0.1/\n"
Packit 6bd9ab
          "uri ldap:/// ldaps://127.0.0.1/\n"
Packit 6bd9ab
          "base dc=test, dc=tld\n"
Packit 6bd9ab
          "base passwd ou=Some People,dc=test,dc=tld\n"
Packit 6bd9ab
          "map\tpasswd uid\t\tsAMAccountName\n"
Packit 6bd9ab
          "map passwd homeDirectory \"${homeDirectory:-/home/$uid}\"  \n"
Packit 6bd9ab
          "map    passwd gecos            \"${givenName}. ${sn}\"\n"
Packit 6bd9ab
          "filter group (&(objeclClass=posixGroup)(gid=1*))\n"
Packit 6bd9ab
          "\n"
Packit 6bd9ab
          "scope passwd one\n"
Packit 6bd9ab
          "cache dn2uid 10m 1s\n");
Packit 6bd9ab
  fclose(fp);
Packit 6bd9ab
  /* parse the file */
Packit 6bd9ab
  cfg_defaults(&cfg;;
Packit 6bd9ab
  cfg_read("temp.cfg", &cfg;;
Packit 6bd9ab
  /* check results */
Packit 6bd9ab
  assert(cfg.uris[0].uri != NULL);
Packit 6bd9ab
  assert(cfg.uris[1].uri != NULL);
Packit 6bd9ab
  assert(cfg.uris[2].uri != NULL);
Packit 6bd9ab
  assertstreq(cfg.uris[0].uri, "ldap://127.0.0.1/");
Packit 6bd9ab
  assertstreq(cfg.uris[1].uri, "ldap:///");
Packit 6bd9ab
  assertstreq(cfg.uris[2].uri, "ldaps://127.0.0.1/");
Packit 6bd9ab
  assert(cfg.uris[3].uri == NULL);
Packit 6bd9ab
  assertstreq(cfg.bases[0], "dc=test, dc=tld");
Packit 6bd9ab
  assertstreq(passwd_bases[0], "ou=Some People,dc=test,dc=tld");
Packit 6bd9ab
  assertstreq(attmap_passwd_uid, "sAMAccountName");
Packit 6bd9ab
  assertstreq(attmap_passwd_homeDirectory, "\"${homeDirectory:-/home/$uid}\"");
Packit 6bd9ab
  assertstreq(attmap_passwd_gecos, "\"${givenName}. ${sn}\"");
Packit 6bd9ab
  assertstreq(group_filter, "(&(objeclClass=posixGroup)(gid=1*))");
Packit 6bd9ab
  assert(passwd_scope == LDAP_SCOPE_ONELEVEL);
Packit 6bd9ab
  assert(cfg.cache_dn2uid_positive == 10 * 60);
Packit 6bd9ab
  assert(cfg.cache_dn2uid_negative == 1);
Packit 6bd9ab
  /* remove temporary file */
Packit 6bd9ab
  remove("temp.cfg");
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* the main program... */
Packit 6bd9ab
int main(int UNUSED(argc), char UNUSED(*argv[]))
Packit 6bd9ab
{
Packit 6bd9ab
  test_xstrdup();
Packit 6bd9ab
  test_add_uris();
Packit 6bd9ab
  test_parse_boolean();
Packit 6bd9ab
  test_parse_scope();
Packit 6bd9ab
  test_parse_map();
Packit 6bd9ab
  test_parse_map_statement();
Packit 6bd9ab
  test_tokenize();
Packit 6bd9ab
  test_read();
Packit 6bd9ab
  return EXIT_SUCCESS;
Packit 6bd9ab
}