/* Copyright (c) 2011 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.
 *
 * test_harness.h: simple C unit test helper.
 *
 * Usage:
 *   #include "test_harness.h"
 *   TEST(standalone_test) {
 *     do_some_stuff;
 *     EXPECT_GT(10, stuff) {
 *        stuff_state_t state;
 *        enumerate_stuff_state(&state);
 *        TH_LOG("expectation failed with state: %s", state.msg);
 *     }
 *     more_stuff;
 *     ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!");
 *     last_stuff;
 *     EXPECT_EQ(0, last_stuff);
 *   }
 *
 *   FIXTURE(my_fixture) {
 *     mytype_t *data;
 *     int awesomeness_level;
 *   };
 *   FIXTURE_SETUP(my_fixture) {
 *     self->data = mytype_new();
 *     ASSERT_NE(NULL, self->data);
 *   }
 *   FIXTURE_TEARDOWN(my_fixture) {
 *     mytype_free(self->data);
 *   }
 *   TEST_F(my_fixture, data_is_good) {
 *     EXPECT_EQ(1, is_my_data_good(self->data));
 *   }
 *
 *   TEST_HARNESS_MAIN
 *
 * API inspired by code.google.com/p/googletest
 */
#ifndef TEST_HARNESS_H_
#define TEST_HARNESS_H_

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

/* All exported functionality should be declared through this macro. */
#define TEST_API(x) _##x

/*
 * Exported APIs
 */

/* TEST(name) { implementation }
 * Defines a test by name.
 * Names must be unique and tests must not be run in parallel.  The
 * implementation containing block is a function and scoping should be treated
 * as such.  Returning early may be performed with a bare "return;" statement.
 *
 * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
 */
#define TEST TEST_API(TEST)

/* FIXTURE(datatype name) {
 *   type property1;
 *   ...
 * };
 * Defines the data provided to TEST_F()-defined tests as |self|.  It should be
 * populated and cleaned up using FIXTURE_SETUP and FIXTURE_TEARDOWN.
 */
#define FIXTURE TEST_API(FIXTURE)

/* FIXTURE_DATA(datatype name)
 * This call may be used when the type of the fixture data
 * is needed.  In general, this should not be needed unless
 * the |self| is being passed to a helper directly.
 */
#define FIXTURE_DATA TEST_API(FIXTURE_DATA)

/* FIXTURE_SETUP(fixture name) { implementation }
 * Populates the required "setup" function for a fixture.  An instance of the
 * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
 * implementation.
 *
 * ASSERT_* are valid for use in this context and will prempt the execution
 * of any dependent fixture tests.
 *
 * A bare "return;" statement may be used to return early.
 */
#define FIXTURE_SETUP TEST_API(FIXTURE_SETUP)

/* FIXTURE_TEARDOWN(fixture name) { implementation }
 * Populates the required "teardown" function for a fixture.  An instance of the
 * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
 * implementation to clean up.
 *
 * A bare "return;" statement may be used to return early.
 */
#define FIXTURE_TEARDOWN TEST_API(FIXTURE_TEARDOWN)

/* TEST_F(fixture, name) { implementation }
 * Defines a test that depends on a fixture (e.g., is part of a test case).
 * Very similar to TEST() except that |self| is the setup instance of fixture's
 * datatype exposed for use by the implementation.
 */
#define TEST_F TEST_API(TEST_F)

/* Use once to append a main() to the test file. E.g.,
 *   TEST_HARNESS_MAIN
 */
#define TEST_HARNESS_MAIN TEST_API(TEST_HARNESS_MAIN)

/*
 * Operators for use in TEST and TEST_F.
 * ASSERT_* calls will stop test execution immediately.
 * EXPECT_* calls will emit a failure warning, note it, and continue.
 */

/* ASSERT_EQ(expected, measured): expected == measured */
#define ASSERT_EQ TEST_API(ASSERT_EQ)
/* ASSERT_NE(expected, measured): expected != measured */
#define ASSERT_NE TEST_API(ASSERT_NE)
/* ASSERT_LT(expected, measured): expected < measured */
#define ASSERT_LT TEST_API(ASSERT_LT)
/* ASSERT_LE(expected, measured): expected <= measured */
#define ASSERT_LE TEST_API(ASSERT_LE)
/* ASSERT_GT(expected, measured): expected > measured */
#define ASSERT_GT TEST_API(ASSERT_GT)
/* ASSERT_GE(expected, measured): expected >= measured */
#define ASSERT_GE TEST_API(ASSERT_GE)
/* ASSERT_NULL(measured): NULL == measured */
#define ASSERT_NULL TEST_API(ASSERT_NULL)
/* ASSERT_TRUE(measured): measured != 0 */
#define ASSERT_TRUE TEST_API(ASSERT_TRUE)
/* ASSERT_FALSE(measured): measured == 0 */
#define ASSERT_FALSE TEST_API(ASSERT_FALSE)
/* ASSERT_STREQ(expected, measured): !strcmp(expected, measured) */
#define ASSERT_STREQ TEST_API(ASSERT_STREQ)
/* ASSERT_STRNE(expected, measured): strcmp(expected, measured) */
#define ASSERT_STRNE TEST_API(ASSERT_STRNE)
/* EXPECT_EQ(expected, measured): expected == measured */
#define EXPECT_EQ TEST_API(EXPECT_EQ)
/* EXPECT_NE(expected, measured): expected != measured */
#define EXPECT_NE TEST_API(EXPECT_NE)
/* EXPECT_LT(expected, measured): expected < measured */
#define EXPECT_LT TEST_API(EXPECT_LT)
/* EXPECT_LE(expected, measured): expected <= measured */
#define EXPECT_LE TEST_API(EXPECT_LE)
/* EXPECT_GT(expected, measured): expected > measured */
#define EXPECT_GT TEST_API(EXPECT_GT)
/* EXPECT_GE(expected, measured): expected >= measured */
#define EXPECT_GE TEST_API(EXPECT_GE)
/* EXPECT_NULL(measured): NULL == measured */
#define EXPECT_NULL TEST_API(EXPECT_NULL)
/* EXPECT_TRUE(measured): 0 != measured */
#define EXPECT_TRUE TEST_API(EXPECT_TRUE)
/* EXPECT_FALSE(measured): 0 == measured */
#define EXPECT_FALSE TEST_API(EXPECT_FALSE)
/* EXPECT_STREQ(expected, measured): !strcmp(expected, measured) */
#define EXPECT_STREQ TEST_API(EXPECT_STREQ)
/* EXPECT_STRNE(expected, measured): strcmp(expected, measured) */
#define EXPECT_STRNE TEST_API(EXPECT_STRNE)

/* TH_LOG(format, ...)
 * Optional debug logging function available for use in tests.
 * Logging may be enabled or disabled by defining TH_LOG_ENABLED.
 * E.g., #define TH_LOG_ENABLED 1
 * If no definition is provided, logging is enabled by default.
 */
#define TH_LOG  TEST_API(TH_LOG)

/*
 * Internal implementation.
 *
 */

/* Utilities exposed to the test definitions */
#ifndef TH_LOG_STREAM
#  define TH_LOG_STREAM stderr
#endif

#ifndef TH_LOG_ENABLED
#  define TH_LOG_ENABLED 1
#endif

#define _TH_LOG(fmt, ...) do { \
  if (TH_LOG_ENABLED) \
    __TH_LOG(fmt, ##__VA_ARGS__); \
} while (0)

/* Unconditional logger for internal use. */
#define __TH_LOG(fmt, ...) \
    fprintf(TH_LOG_STREAM, "%s:%d:%s:" fmt "\n", \
            __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)

/* Defines the test function and creates the registration stub. */
#define _TEST(test_name) \
  static void test_name(struct __test_metadata *_metadata); \
  static struct __test_metadata _##test_name##_object = \
    { .name= "global." #test_name, .fn= &test_name }; \
  static void __attribute__((constructor)) _register_##test_name(void) { \
    __register_test(&_##test_name##_object); \
  } \
  static void test_name( \
    struct __test_metadata __attribute__((unused)) *_metadata)

/* Wraps the struct name so we have one less argument to pass around. */
#define _FIXTURE_DATA(fixture_name) struct _test_data_##fixture_name

/* Called once per fixture to setup the data and register. */
#define _FIXTURE(fixture_name) \
  static void __attribute__((constructor)) \
      _register_##fixture_name##_data(void) { \
    __fixture_count++; \
  } \
  _FIXTURE_DATA(fixture_name)

/* Prepares the setup function for the fixture.  |_metadata| is included
 * so that ASSERT_* work as a convenience.
 */
#define _FIXTURE_SETUP(fixture_name) \
  void fixture_name##_setup( \
    struct __test_metadata __attribute__((unused)) *_metadata, \
    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
#define _FIXTURE_TEARDOWN(fixture_name) \
  void fixture_name##_teardown( \
    struct __test_metadata __attribute__((unused)) *_metadata, \
    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)

/* Emits test registration and helpers for fixture-based test
 * cases.
 * TODO(wad) register fixtures on dedicated test lists.
 */
#define _TEST_F(fixture_name, test_name) \
  static void fixture_name##_##test_name( \
    struct __test_metadata *_metadata, \
    _FIXTURE_DATA(fixture_name) *self); \
  static inline void wrapper_##fixture_name##_##test_name( \
    struct __test_metadata *_metadata) { \
    /* fixture data is allocated, setup, and torn down per call. */ \
    _FIXTURE_DATA(fixture_name) self; \
    memset(&self, 0, sizeof(_FIXTURE_DATA(fixture_name))); \
    fixture_name##_setup(_metadata, &self); \
    /* Let setup failure terminate early. */ \
    if (!_metadata->passed) return; \
    fixture_name##_##test_name(_metadata, &self); \
    fixture_name##_teardown(_metadata, &self); \
  } \
  static struct __test_metadata _##fixture_name##_##test_name##_object = { \
    .name= #fixture_name "." #test_name, \
    .fn= &wrapper_##fixture_name##_##test_name, \
   }; \
  static void __attribute__((constructor)) \
      _register_##fixture_name##_##test_name(void) { \
    __register_test(&_##fixture_name##_##test_name##_object); \
  } \
  static void fixture_name##_##test_name( \
    struct __test_metadata __attribute__((unused)) *_metadata, \
    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)

/* Exports a simple wrapper to run the test harness. */
#define _TEST_HARNESS_MAIN \
  int main(int argc, char **argv) { return test_harness_run(argc, argv); }

#define _ASSERT_EQ(_expected, _seen) \
  __EXPECT(_expected, _seen, ==, 1)
#define _ASSERT_NE(_expected, _seen) \
  __EXPECT(_expected, _seen, !=, 1)
#define _ASSERT_LT(_expected, _seen) \
  __EXPECT(_expected, _seen, <, 1)
#define _ASSERT_LE(_expected, _seen) \
  __EXPECT(_expected, _seen, <=, 1)
#define _ASSERT_GT(_expected, _seen) \
  __EXPECT(_expected, _seen, >, 1)
#define _ASSERT_GE(_expected, _seen) \
  __EXPECT(_expected, _seen, >=, 1)
#define _ASSERT_NULL(_seen) \
  __EXPECT(NULL, _seen, ==, 1)

#define _ASSERT_TRUE(_seen) \
  _ASSERT_NE(0, _seen)
#define _ASSERT_FALSE(_seen) \
  _ASSERT_EQ(0, _seen)
#define _ASSERT_STREQ(_expected, _seen) \
  __EXPECT_STR(_expected, _seen, ==, 1)
#define _ASSERT_STRNE(_expected, _seen) \
  __EXPECT_STR(_expected, _seen, !=, 1)

#define _EXPECT_EQ(_expected, _seen) \
  __EXPECT(_expected, _seen, ==, 0)
#define _EXPECT_NE(_expected, _seen) \
  __EXPECT(_expected, _seen, !=, 0)
#define _EXPECT_LT(_expected, _seen) \
  __EXPECT(_expected, _seen, <, 0)
#define _EXPECT_LE(_expected, _seen) \
  __EXPECT(_expected, _seen, <=, 0)
#define _EXPECT_GT(_expected, _seen) \
  __EXPECT(_expected, _seen, >, 0)
#define _EXPECT_GE(_expected, _seen) \
  __EXPECT(_expected, _seen, >=, 0)

#define _EXPECT_NULL(_seen) \
  __EXPECT(NULL, _seen, ==, 0)
#define _EXPECT_TRUE(_seen) \
  _EXPECT_NE(0, _seen)
#define _EXPECT_FALSE(_seen) \
  _EXPECT_EQ(0, _seen)

#define _EXPECT_STREQ(_expected, _seen) \
  __EXPECT_STR(_expected, _seen, ==, 0)
#define _EXPECT_STRNE(_expected, _seen) \
  __EXPECT_STR(_expected, _seen, !=, 0)

/* Support an optional handler after and ASSERT_* or EXPECT_*.  The approach is
 * not thread-safe, but it should be fine in most sane test scenarios.
 *
 * Using __bail(), which optionally abort()s, is the easiest way to early
 * return while still providing an optional block to the API consumer.
 */
#define OPTIONAL_HANDLER(_assert) \
  for (; _metadata->trigger;  _metadata->trigger = __bail(_assert))

#define __EXPECT(_expected, _seen, _t, _assert) do { \
  /* Avoid multiple evaluation of the cases */ \
  __typeof__(_expected) __exp = (_expected); \
  __typeof__(_seen) __seen = (_seen); \
  if (!(__exp _t __seen)) { \
    unsigned long long __exp_print = 0; \
    unsigned long long __seen_print = 0; \
    /* Avoid casting complaints the scariest way we can. */ \
    memcpy(&__exp_print, &__exp, sizeof(__exp)); \
    memcpy(&__seen_print, &__seen, sizeof(__seen)); \
    __TH_LOG("Expected %s (%llu) %s %s (%llu)", \
            #_expected, __exp_print, #_t, \
            #_seen, __seen_print); \
    _metadata->passed = 0; \
    /* Ensure the optional handler is triggered */ \
    _metadata->trigger = 1; \
  } \
} while (0); OPTIONAL_HANDLER(_assert)

#define __EXPECT_STR(_expected, _seen, _t, _assert) do { \
  const char *__exp = (_expected); \
  const char *__seen = (_seen); \
  if (!(strcmp(__exp, __seen) _t 0))  { \
    __TH_LOG("Expected '%s' %s '%s'.", __exp, #_t, __seen); \
    _metadata->passed = 0; \
    _metadata->trigger = 1; \
  } \
} while (0); OPTIONAL_HANDLER(_assert)

/* Contains all the information for test execution and status checking. */
struct __test_metadata {
  const char *name;
  void (*fn)(struct __test_metadata *);
  int passed;
  int trigger; /* extra handler after the evaluation */
  struct __test_metadata *prev, *next;
};

/* Storage for the (global) tests to be run. */
static struct __test_metadata *__test_list = NULL;
static unsigned int __test_count = 0;
static unsigned int __fixture_count = 0;

static inline void __register_test(struct __test_metadata *t) {
  __test_count++;
  /* Circular linked list where only prev is circular. */
  if (__test_list == NULL) {
    __test_list = t;
    t->next = NULL;
    t->prev = t;
    return;
  }
  t->next = NULL;
  t->prev = __test_list->prev;
  t->prev->next = t;
  __test_list->prev = t;
}

static inline int __bail(int for_realz) {
  if (for_realz)
    abort();
  return 0;
}

static int test_harness_run(int __attribute__((unused)) argc,
                            char __attribute__((unused)) **argv) {
  struct __test_metadata *t;
  int ret = 0;
  unsigned int count = 0;

  /* TODO(wad) add optional arguments similar to gtest. */
  printf("[==========] Running %u tests from %u test cases.\n",
          __test_count, __fixture_count + 1);
  for (t = __test_list; t; t = t->next) {
    pid_t child_pid;
    int status;
    count++;
    t->passed = 1;
    t->trigger = 0;
    printf("[ RUN      ] %s\n", t->name);
    child_pid = fork();
    if (child_pid < 0) {
      printf("ERROR SPAWNING TEST CHILD\n");
      t->passed = 0;
    } else if (child_pid == 0) {
      t->fn(t);
      _exit(t->passed);
    } else {
      /* TODO(wad) add timeout support. */
      waitpid(child_pid, &status, 0);
      if (WIFEXITED(status))
        t->passed = WEXITSTATUS(status);
      if (WIFSIGNALED(status)) {
        t->passed = 0;
        fprintf(TH_LOG_STREAM,
                "%s: Test terminated unexpectedly by signal %d\n",
               t->name,
               WTERMSIG(status));
      }
    }
    printf("[     %4s ] %s\n", (t->passed ? "OK" : "FAIL"), t->name);
    if (!t->passed)
      ret = 1;
  }
  /* TODO(wad) organize by fixtures since ordering is not guaranteed now. */
  printf("[==========] %u tests ran.\n", count);
  printf("[  %s  ]\n", (ret ? "FAILED" : "PASSED"));
  return ret;
}

#endif  /* TEST_HARNESS_H_ */
