Blame tests/test_dict.c

Packit 6bd9ab
/*
Packit 6bd9ab
   test_dict.c - simple test for the dict module
Packit 6bd9ab
   This file is part of the nss-pam-ldapd library.
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2007, 2008, 2009, 2010, 2012 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
#include <stdlib.h>
Packit 6bd9ab
Packit 6bd9ab
#include "common/dict.h"
Packit 6bd9ab
#include "compat/attrs.h"
Packit 6bd9ab
Packit 6bd9ab
/* Simple test that adds a few key/value pairs to the dict and the does
Packit 6bd9ab
   most operations. */
Packit 6bd9ab
static void test_simple(void)
Packit 6bd9ab
{
Packit 6bd9ab
  DICT *dict;
Packit 6bd9ab
  void *val;
Packit 6bd9ab
  static char *value1 = "value1";
Packit 6bd9ab
  static char *value2 = "value2";
Packit 6bd9ab
  static char *replace2 = "replace2";
Packit 6bd9ab
  const char **keys;
Packit 6bd9ab
  int i;
Packit 6bd9ab
  /* initialize */
Packit 6bd9ab
  dict = dict_new();
Packit 6bd9ab
  /* store some entries */
Packit 6bd9ab
  dict_put(dict, "key1", value1);
Packit 6bd9ab
  dict_put(dict, "key2", value2);
Packit 6bd9ab
  dict_put(dict, "key3", dict);
Packit 6bd9ab
  dict_put(dict, "key2", replace2);
Packit 6bd9ab
  /* check dictionary contents */
Packit 6bd9ab
  val = dict_get(dict, "key1");
Packit 6bd9ab
  assert(val == value1);
Packit 6bd9ab
  val = dict_get(dict, "key2");
Packit 6bd9ab
  assert(val == replace2);
Packit 6bd9ab
  val = dict_get(dict, "key3");
Packit 6bd9ab
  assert(val == dict);
Packit 6bd9ab
  val = dict_get(dict, "key4");
Packit 6bd9ab
  assert(val == NULL);
Packit 6bd9ab
  val = dict_get(dict, "KEY1");
Packit 6bd9ab
  assert(val == NULL);
Packit 6bd9ab
  /* remove a key */
Packit 6bd9ab
  dict_put(dict, "key3", NULL);
Packit 6bd9ab
  val = dict_get(dict, "key3");
Packit 6bd9ab
  assert(val == NULL);
Packit 6bd9ab
  /* loop over dictionary contents */
Packit 6bd9ab
  keys = dict_keys(dict);
Packit 6bd9ab
  for (i = 0; keys[i] != NULL; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    val = dict_get(dict, keys[i]);
Packit 6bd9ab
    assert(((val == value1) || (val == replace2)));
Packit 6bd9ab
  }
Packit 6bd9ab
  /* free stuff */
Packit 6bd9ab
  dict_free(dict);
Packit 6bd9ab
  free(keys);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* Test to insert a large number of elements in the dict. */
Packit 6bd9ab
static void test_lotsofelements(void)
Packit 6bd9ab
{
Packit 6bd9ab
  DICT *dict;
Packit 6bd9ab
  char buf[80];
Packit 6bd9ab
  int i, r;
Packit 6bd9ab
  void *val;
Packit 6bd9ab
  const char **keys;
Packit 6bd9ab
  /* initialize */
Packit 6bd9ab
  dict = dict_new();
Packit 6bd9ab
  /* insert a number of entries */
Packit 6bd9ab
  for (i = 0; i < 1024; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    r = 1 + (int)(10000.0 * (rand() / (RAND_MAX + 1.0)));
Packit 6bd9ab
    sprintf(buf, "test%04d", r);
Packit 6bd9ab
    dict_put(dict, buf, &buf;;
Packit 6bd9ab
  }
Packit 6bd9ab
  /* remove a number of entries */
Packit 6bd9ab
  for (i = 0; i < 100; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    r = 1 + (int)(10000.0 * (rand() / (RAND_MAX + 1.0)));
Packit 6bd9ab
    sprintf(buf, "test%04d", r);
Packit 6bd9ab
    dict_put(dict, buf, NULL);
Packit 6bd9ab
  }
Packit 6bd9ab
  /* add some more entries */
Packit 6bd9ab
  for (i = 0; i < 1024; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    r = 1 + (int)(10000.0 * (rand() / (RAND_MAX + 1.0)));
Packit 6bd9ab
    sprintf(buf, "test%04d", r);
Packit 6bd9ab
    dict_put(dict, buf, &buf;;
Packit 6bd9ab
  }
Packit 6bd9ab
  /* loop over dictionary contents */
Packit 6bd9ab
  keys = dict_keys(dict);
Packit 6bd9ab
  for (i = 0; keys[i] != NULL; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    val = dict_get(dict, keys[i]);
Packit 6bd9ab
    assert(val == buf);
Packit 6bd9ab
  }
Packit 6bd9ab
  /* free stuff */
Packit 6bd9ab
  dict_free(dict);
Packit 6bd9ab
  free(keys);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* Test to insert a large number of elements in the dict. */
Packit 6bd9ab
static void test_readelements(const char *fname)
Packit 6bd9ab
{
Packit 6bd9ab
  DICT *dict;
Packit 6bd9ab
  char buf[80];
Packit 6bd9ab
  FILE *fp;
Packit 6bd9ab
  void *val;
Packit 6bd9ab
  const char **keys;
Packit 6bd9ab
  int i;
Packit 6bd9ab
  /* initialize */
Packit 6bd9ab
  dict = dict_new();
Packit 6bd9ab
  /* read file and insert all entries */
Packit 6bd9ab
  fp = fopen(fname, "r");
Packit 6bd9ab
  assert(fp != NULL);
Packit 6bd9ab
  while (fgets(buf, sizeof(buf), fp) != NULL)
Packit 6bd9ab
  {
Packit 6bd9ab
    /* strip newline */
Packit 6bd9ab
    buf[strlen(buf) - 1] = '\0';
Packit 6bd9ab
    dict_put(dict, buf, &buf;;
Packit 6bd9ab
  }
Packit 6bd9ab
  fclose(fp);
Packit 6bd9ab
  /* loop over dictionary contents */
Packit 6bd9ab
  keys = dict_keys(dict);
Packit 6bd9ab
  for (i = 0; keys[i] != NULL; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    val = dict_get(dict, keys[i]);
Packit 6bd9ab
    assert(val == buf);
Packit 6bd9ab
  }
Packit 6bd9ab
  /* free stuff */
Packit 6bd9ab
  dict_free(dict);
Packit 6bd9ab
  free(keys);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
static void test_countelements(int num)
Packit 6bd9ab
{
Packit 6bd9ab
  DICT *dict;
Packit 6bd9ab
  char buf[80];
Packit 6bd9ab
  int i, r;
Packit 6bd9ab
  const char **keys;
Packit 6bd9ab
  /* initialize */
Packit 6bd9ab
  dict = dict_new();
Packit 6bd9ab
  /* insert a number of entries */
Packit 6bd9ab
  for (i = 0; i < num; i++)
Packit 6bd9ab
  {
Packit 6bd9ab
    r = 1 + (int)(10000.0 * (rand() / (RAND_MAX + 1.0)));
Packit 6bd9ab
    sprintf(buf, "%04dx%04d", i, r);
Packit 6bd9ab
    dict_put(dict, buf, &buf;;
Packit 6bd9ab
  }
Packit 6bd9ab
  /* loop over dictionary contents */
Packit 6bd9ab
  keys = dict_keys(dict);
Packit 6bd9ab
  for (i = 0; keys[i] != NULL; i++)
Packit 6bd9ab
    /* nothing */ ;
Packit 6bd9ab
  /* we should have num elements */
Packit 6bd9ab
  assert(i == num);
Packit 6bd9ab
  /* free stuff */
Packit 6bd9ab
  dict_free(dict);
Packit 6bd9ab
  free(keys);
Packit 6bd9ab
}
Packit 6bd9ab
Packit 6bd9ab
/* the main program... */
Packit 6bd9ab
int main(int UNUSED(argc), char UNUSED(*argv[]))
Packit 6bd9ab
{
Packit 6bd9ab
  char *srcdir;
Packit 6bd9ab
  char fname[100];
Packit 6bd9ab
  /* build the name of the file */
Packit 6bd9ab
  srcdir = getenv("srcdir");
Packit 6bd9ab
  if (srcdir == NULL)
Packit 6bd9ab
    strcpy(fname, "usernames.txt");
Packit 6bd9ab
  else
Packit 6bd9ab
    snprintf(fname, sizeof(fname), "%s/usernames.txt", srcdir);
Packit 6bd9ab
  fname[sizeof(fname) - 1] = '\0';
Packit 6bd9ab
  /* run the tests */
Packit 6bd9ab
  test_simple();
Packit 6bd9ab
  test_lotsofelements();
Packit 6bd9ab
  test_readelements(fname);
Packit 6bd9ab
  test_countelements(0);
Packit 6bd9ab
  test_countelements(1);
Packit 6bd9ab
  test_countelements(2);
Packit 6bd9ab
  test_countelements(3);
Packit 6bd9ab
  test_countelements(4);
Packit 6bd9ab
  test_countelements(10);
Packit 6bd9ab
  test_countelements(20);
Packit 6bd9ab
  return 0;
Packit 6bd9ab
}