Test updates.
[m6w6/libmemcached] / tests / test.h
index 7c0e49daef93e2ce0b05027f04df4d97767b7b21..9f0f47e355968931ac384b520ae365e7c66f2277 100644 (file)
@@ -1,12 +1,21 @@
+/* uTest
+ * Copyright (C) 2006-2009 Brian Aker
+ * All rights reserved.
+ *
+ * Use and distribution licensed under the BSD license.  See
+ * the COPYING file in the parent directory for full text.
+ */
+
 /*
   Structures for generic tests.
 */
+
 #ifdef __cplusplus
 extern "C" {
-
 #endif
+
 #include <libmemcached/memcached.h>
-#include "../libmemcached/common.h"
+#include <stdio.h>
 
 typedef struct world_st world_st;
 typedef struct collection_st collection_st;
@@ -16,31 +25,139 @@ typedef enum {
   TEST_SUCCESS= 0, /* Backwards compatibility */
   TEST_FAILURE,
   TEST_MEMORY_ALLOCATION_FAILURE,
-  TEST_MAXIMUM_RETURN, /* Always add new error code before */
-} test_return;
+  TEST_SKIPPED,
+  TEST_MAXIMUM_RETURN /* Always add new error code before */
+} test_return_t;
 
+typedef void *(*test_callback_create_fn)(test_return_t *error);
+typedef test_return_t (*test_callback_fn)(void *);
+typedef test_return_t (*test_callback_runner_fn)(test_callback_fn, void *);
+typedef test_return_t (*test_callback_error_fn)(test_return_t, void *);
+
+
+/**
+  A structure describing the test case.
+*/
 struct test_st {
-  char *name;
-  unsigned int requires_flush;
-  test_return (*function)(memcached_st *memc);
+  const char *name;
+  bool requires_flush;
+  test_callback_fn test_fn;
 };
 
+
+/**
+  A structure which describes a collection of test cases.
+*/
 struct collection_st {
-  char *name;
-  memcached_return (*pre)(memcached_st *memc);
-  memcached_return (*post)(memcached_st *memc);
+  const char *name;
+  test_callback_fn pre;
+  test_callback_fn post;
   test_st *tests;
 };
 
+
+/**
+  Structure which houses the actual callers for the test cases contained in
+  the collections.
+*/
+typedef struct {
+  test_callback_runner_fn pre;
+  test_callback_runner_fn run;
+  test_callback_runner_fn post;
+} world_runner_st;
+
+
+/**
+  world_st is the structure which is passed to the test implementation to be filled.
+  This must be implemented in order for the test framework to load the tests. We call
+  get_world() in order to fill this structure.
+*/
+
 struct world_st {
   collection_st *collections;
-  void *(*create)(void);
-  void (*destroy)(void *collection_object);
+
+  /* These methods are called outside of any collection call. */
+  test_callback_create_fn create;
+  test_callback_fn destroy;
+
+  /* This is called a the beginning of any collection run. */
+  test_callback_fn collection_startup;
+
+  /* This called on a test if the test requires a flush call (the bool is from test_st) */
+  test_callback_fn flush;
+
+  /**
+    These are run before/after the test. If implemented. Their execution is not controlled
+    by the test.
+  */
+  test_callback_fn pre_run;
+  test_callback_fn post_run;
+
+  /**
+    If an error occurs during the test, this is called.
+  */
+  test_callback_error_fn on_error;
+
+  /**
+    Runner represents the callers for the tests. If not implemented we will use
+    a set of default implementations.
+  */
+  world_runner_st *runner;
 };
 
+
+
+/**
+  @note world_stats_st is a simple structure for tracking test successes.
+*/
+typedef struct {
+  uint32_t success;
+  uint32_t skipped;
+  uint32_t failed;
+  uint32_t total;
+} world_stats_st;
+
 /* How we make all of this work :) */
 void get_world(world_st *world);
 
+void create_core(void);
+
+/**
+  @note Friendly print function for errors.
+*/
+const char *test_strerror(test_return_t code);
+
+#define test_truth(A) \
+do \
+{ \
+  if (! (A)) { \
+    fprintf(stderr, "\nAssertion failed in %s:%d: %s\n", __FILE__, __LINE__, #A);\
+    create_core(); \
+    return TEST_FAILURE; \
+  } \
+} while (0)
+
+#define test_false(A) \
+do \
+{ \
+  if ((A)) { \
+    fprintf(stderr, "\nAssertion failed in %s:%d: %s\n", __FILE__, __LINE__, #A);\
+    create_core(); \
+    return TEST_FAILURE; \
+  } \
+} while (0)
+
+#define test_strcmp(A,B) \
+do \
+{ \
+  if (strcmp((A), (B))) \
+  { \
+    fprintf(stderr, "\n%s:%d: %s -> %s\n", __FILE__, __LINE__, (A), (B)); \
+    create_core(); \
+    return TEST_FAILURE; \
+  } \
+} while (0)
+
 #ifdef __cplusplus
 }
 #endif