/*
 * conf-unittest.c - config parser unit tests
 * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "config.h"

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "src/conf.h"
#include "src/test_harness.h"

#ifndef HAVE_FMEMOPEN
#include "src/common/fmemopen.h"
#endif

FILE *fopenstr (const char *str)
{
  /* strlen(str) instead of strlen(str) + 1 because files shouldn't appear
   * null-terminated. Cast away constness because we're in read mode, but the
   * fmemopen prototype has no way to express that. */
  return fmemopen ( (char *) str, strlen (str), "r");
}

TEST (parse_empty)
{
  /* can't do a truly empty file - fmemopen() combusts */
  FILE *f = fopenstr ("\n");
  ASSERT_NE (NULL, f);
  struct conf_entry *e = conf_parse (f);
  EXPECT_NULL (e);
  conf_free (e);
}

TEST (parse_basic)
{
  FILE *f = fopenstr ("foo bar\nbaz quxx\n");
  ASSERT_NE (NULL, f);
  struct conf_entry *e = conf_parse (f);
  ASSERT_NE (NULL, e);
  EXPECT_STREQ (e->key, "foo");
  EXPECT_STREQ (e->value, "bar");
  ASSERT_NE (NULL, e->next);
  EXPECT_STREQ (e->next->key, "baz");
  EXPECT_STREQ (e->next->value, "quxx");
  ASSERT_NULL (e->next->next);
  conf_free (e);
}

TEST (parse_novalue)
{
  FILE *f = fopenstr ("abcdef\n");
  ASSERT_NE (NULL, f);
  struct conf_entry *e = conf_parse (f);
  ASSERT_NE (NULL, e);
  EXPECT_STREQ (e->key, "abcdef");
  EXPECT_NULL (e->value);
  EXPECT_NULL (e->next);
  conf_free (e);
}

TEST (parse_whitespace)
{
  FILE *f = fopenstr ("         fribble		  grotz  \n");
  ASSERT_NE (NULL, f);
  struct conf_entry *e = conf_parse (f);
  ASSERT_NE (NULL, e);
  EXPECT_STREQ (e->key, "fribble");
  EXPECT_STREQ (e->value, "grotz  ");
  EXPECT_NULL (e->next);
  conf_free (e);
}

TEST (parse_comment)
{
  FILE *f = fopenstr ("#foo bar\nbaz quxx\n");
  ASSERT_NE (NULL, f);
  struct conf_entry *e = conf_parse (f);
  ASSERT_NE (NULL, e);
  EXPECT_STREQ (e->key, "baz");
  EXPECT_STREQ (e->value, "quxx");
  EXPECT_NULL (e->next);
  conf_free (e);
}

TEST_HARNESS_MAIN
