--- /dev/null
+#ifndef TEST_SUITE_H_6XEHCUS5
+#define TEST_SUITE_H_6XEHCUS5
+
+#ifdef TEST
+
+typedef struct test {
+ const char * const test_name;
+ int (* const test_fn)(void *test_data, void *suite_data);
+ int (* const test_pre_fn)(void *test_data, void *suite_data);
+ int (* const test_post_fn)(void *test_data, void *suite_data);
+ void *test_data;
+} test_t;
+
+/* define all of these within module to test */
+extern test_t test_suite[];
+extern int test_suite_pre(void *suite_data);
+extern int test_suite_post(void *suite_data);
+extern void *test_suite_data;
+
+/* use these in tests */
+void test_verbose(const char *fmt, ...) __attribute__((format(printf, 1, 2))); /* stdout only with -v flag */
+void test_info(const char *fmt, ...) __attribute__((format(printf, 1, 2))); /* stdout */
+void test_error(const char *fmt, ...) __attribute__((format(printf, 1, 2))); /* stderr */
+
+#define TEST_VERBOSE(fmt,...) do { test_verbose("%s@%s:%d/%s/" fmt "\n", "verbose", __FILE__, __LINE__, __func__, ##__VA_ARGS__); } while (0)
+#define TEST_INFO(fmt,...) do { test_info("%s@%s:%d/%s/" fmt "\n", "info", __FILE__, __LINE__, __func__, ##__VA_ARGS__); } while (0)
+#define TEST_ERROR(fmt,...) do { test_error("%s@%s:%d/%s/" fmt "\n", "error", __FILE__, __LINE__, __func__, ##__VA_ARGS__); } while (0)
+
+#else /* TEST */
+#define TEST_VERBOSE(...)
+#define TEST_INFO(...)
+#define TEST_ERROR(...)
+#endif /* TEST */
+
+#endif /* TEST_SUITE_H_6XEHCUS5 */