summaryrefslogtreecommitdiffstats
path: root/lib/dpkg/test.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dpkg/test.h')
-rw-r--r--lib/dpkg/test.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/dpkg/test.h b/lib/dpkg/test.h
new file mode 100644
index 0000000..1e3dce9
--- /dev/null
+++ b/lib/dpkg/test.h
@@ -0,0 +1,177 @@
+/*
+ * libdpkg - Debian packaging suite library routines
+ * test.h - test suite support
+ *
+ * Copyright © 2009-2014 Guillem Jover <guillem@debian.org>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef LIBDPKG_TEST_H
+#define LIBDPKG_TEST_H
+
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <dpkg/macros.h>
+#ifndef TEST_MAIN_CTOR
+#include <dpkg/ehandle.h>
+#define TEST_MAIN_CTOR push_error_context()
+#define TEST_MAIN_DTOR pop_error_context(ehflag_normaltidy)
+#endif
+
+DPKG_BEGIN_DECLS
+
+/**
+ * @defgroup dpkg_test Test suite support
+ * @ingroup dpkg-internal
+ * @{
+ */
+
+#define test_bail(reason) \
+ do { \
+ printf("Bail out! %s\n", (reason)); \
+ exit(255); \
+ } while (0)
+
+#define test_xstringify(str) \
+ #str
+#define test_stringify(str) \
+ test_xstringify(str)
+
+static inline void *
+test_alloc(void *ptr, const char *reason)
+{
+ if (ptr == DPKG_NULL)
+ test_bail(reason);
+ return ptr;
+}
+
+#define test_alloc(ptr) \
+ test_alloc((ptr), "cannot allocate memory for " #ptr " in " __FILE__ ":" test_stringify(__LINE__))
+
+#define test_try(jmp) \
+ push_error_context_jump(&(jmp), DPKG_NULL, "test try"); \
+ if (!setjmp((jmp)))
+#define test_catch \
+ else
+#define test_finally \
+ pop_error_context(ehflag_normaltidy);
+
+static inline const char *
+test_get_envdir(const char *envvar)
+{
+ const char *envdir = getenv(envvar);
+ return envdir ? envdir : ".";
+}
+
+#define test_get_srcdir() \
+ test_get_envdir("srcdir")
+#define test_get_builddir() \
+ test_get_envdir("builddir")
+
+static inline bool
+test_is_verbose(void)
+{
+ const char *verbose = getenv("TEST_VERBOSE");
+ return verbose != DPKG_NULL && strcmp(verbose, "1") == 0;
+}
+
+#ifndef TEST_OMIT_VARIABLES
+static int test_id = 1;
+static int test_skip_code;
+static const char *test_skip_prefix;
+static const char *test_skip_reason;
+#endif
+
+#define test_plan(n) \
+ printf("1..%d\n", n);
+
+#define test_skip_all(reason) \
+ do { \
+ printf("1..0 # SKIP %s\n", (reason)); \
+ exit(0); \
+ } while (0)
+#define test_skip(reason) \
+ printf("ok %d # SKIP %s\n", test_id++, (reason))
+#define test_skip_block(cond) \
+ for (test_skip_prefix = " # SKIP ", \
+ test_skip_reason = cond ? #cond : DPKG_NULL, \
+ test_skip_code = 1; \
+ test_skip_prefix; \
+ test_skip_prefix = test_skip_reason = DPKG_NULL, \
+ test_skip_code = 0)
+
+#define test_todo(a, reason, desc) \
+ do { \
+ test_skip_prefix = " # TODO "; \
+ test_skip_reason = reason; \
+ test_case(a, "%s", desc); \
+ test_skip_prefix = test_skip_reason = DPKG_NULL; \
+ } while(0)
+#define test_todo_block(reason) \
+ for (test_skip_prefix = " # TODO ", test_skip_reason = reason; \
+ test_skip_prefix; \
+ test_skip_prefix = test_skip_reason = DPKG_NULL)
+
+#define test_case(a, fmt, ...) \
+ printf("%sok %d - " fmt "%s%s\n", \
+ test_skip_code || (a) ? "" : "not ", \
+ test_id++, __VA_ARGS__, \
+ test_skip_reason ? test_skip_prefix : "", \
+ test_skip_reason ? test_skip_reason : "")
+
+#define test_pass(a) \
+ test_case((a), "pass %s", #a)
+#define test_fail(a) \
+ test_case(!(a), "fail %s", #a)
+#define test_str(a, op, b) \
+ test_case(strcmp((a), (b)) op 0, "strcmp '%s' %s '%s'", a, #op, b)
+#define test_mem(a, op, b, size) \
+ test_case(memcmp((a), (b), (size)) op 0, "memcmp %p %s %p", a, #op, b)
+
+/* Specific test macros. */
+#define test_warn(e) \
+ do { \
+ test_pass((e).type == DPKG_MSG_WARN); \
+ dpkg_error_destroy(&(e)); \
+ } while (0)
+#define test_error(e) \
+ do { \
+ test_pass((e).type == DPKG_MSG_ERROR); \
+ dpkg_error_destroy(&(e)); \
+ } while (0)
+
+/** @} */
+
+DPKG_END_DECLS
+
+#define TEST_ENTRY(name) \
+static void name(void); \
+int \
+main(int argc, char **argv) \
+{ \
+ setvbuf(stdout, DPKG_NULL, _IOLBF, 0); \
+ \
+ TEST_MAIN_CTOR; \
+ name(); \
+ TEST_MAIN_DTOR; \
+ return 0; \
+} \
+static void \
+name(void)
+
+#endif