This is an automated email from the git hooks/post-receive script.

daube-guest pushed a commit to branch master
in repository axe-demultiplexer.

commit 1b0541617d71df43e644cc53ce9834ea68483ec6
Author: Kevin Murray <[email protected]>
Date:   Thu Jul 30 20:57:01 2015 +1000

    Imported Upstream version 0.2.8
---
 tests/tinytest/.gitignore        |   7 +
 tests/tinytest/Makefile          |  30 +++
 tests/tinytest/README            |  18 ++
 tests/tinytest/TODO              |  12 +
 tests/tinytest/tinytest.c        | 493 +++++++++++++++++++++++++++++++++++++++
 tests/tinytest/tinytest.h        | 100 ++++++++
 tests/tinytest/tinytest_demo.c   | 264 +++++++++++++++++++++
 tests/tinytest/tinytest_macros.h | 199 ++++++++++++++++
 utils/make-tarball.sh            |   3 +-
 9 files changed, 1125 insertions(+), 1 deletion(-)

diff --git a/tests/tinytest/.gitignore b/tests/tinytest/.gitignore
new file mode 100644
index 0000000..d4c2a4b
--- /dev/null
+++ b/tests/tinytest/.gitignore
@@ -0,0 +1,7 @@
+*~
+*.o
+\#*\#
+.\#*
+
+/tt-demo
+/tt-demo.exe
diff --git a/tests/tinytest/Makefile b/tests/tinytest/Makefile
new file mode 100644
index 0000000..4d24ccc
--- /dev/null
+++ b/tests/tinytest/Makefile
@@ -0,0 +1,30 @@
+VERSION=1.0.1
+
+all: tt-demo
+
+.c.o:
+       gcc -Wall -g -O2 -c $<
+
+tinytest.o: tinytest.h
+
+tinytest_demo.o: tinytest_macros.h tinytest.h
+
+OBJS=tinytest.o tinytest_demo.o
+
+tt-demo: $(OBJS)
+       gcc -Wall -g -O2 $(OBJS) -o tt-demo
+
+lines:
+       wc -l tinytest.c tinytest_macros.h tinytest.h
+
+clean:
+       rm -f *.o *~ tt-demo
+
+DISTFILES=tinytest.c tinytest_demo.c tinytest.h tinytest_macros.h Makefile \
+       README
+
+dist:
+       rm -rf tinytest-$(VERSION)
+       mkdir tinytest-$(VERSION)
+       cp $(DISTFILES) tinytest-$(VERSION)
+       tar cf - tinytest-$(VERSION) | gzip -c -9 > tinytest-$(VERSION).tar.gz
diff --git a/tests/tinytest/README b/tests/tinytest/README
new file mode 100644
index 0000000..902c4a2
--- /dev/null
+++ b/tests/tinytest/README
@@ -0,0 +1,18 @@
+Tinytest is a tiny little test framework written in C by Nick Mathewson.
+
+It is distributed under the 3-clause BSD license.  You can use it in
+your own programs so long as you follow the license's conditions.
+
+It's been tested on Windows, Mac, and many of the free Unixes.
+
+It knows how to fork before running certain tests, and it makes
+text-mode output in a format I like.
+
+For info on how to use it, check out tinytest_demo.c.
+
+You can get the latest version using Git, by pulling from
+   git://github.com/nmathewson/tinytest.git
+
+Patches are welcome. Patches that turn this from tinytest to hugetest
+will not be applied.  If you want a huge test framework, use CUnit.
+
diff --git a/tests/tinytest/TODO b/tests/tinytest/TODO
new file mode 100644
index 0000000..8d73b85
--- /dev/null
+++ b/tests/tinytest/TODO
@@ -0,0 +1,12 @@
+Things to do to tinytest
+
+o Replace the license with something recognizeable
+o Test forking on win32.
+o Write minimalist libevent-legacy thing.
+o port libevent tests; move libevent test main into a new regress_main
+o allow per-group forks.
+o See where we're at.
+
+- Allow groups to nest, perhaps.
+- Port Tor to use tinytest
+- Warn when running multiple tests with --no-fork
diff --git a/tests/tinytest/tinytest.c b/tests/tinytest/tinytest.c
new file mode 100644
index 0000000..faa85ac
--- /dev/null
+++ b/tests/tinytest/tinytest.c
@@ -0,0 +1,493 @@
+/* tinytest.c -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifdef TINYTEST_LOCAL
+#include "tinytest_local.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifndef NO_FORKING
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#endif
+
+#if defined(__APPLE__) && 
defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
+    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+/* Workaround for a stupid bug in OSX 10.6 */
+#define FORK_BREAKS_GCOV
+#include <vproc.h>
+#endif
+#endif
+
+#endif /* !NO_FORKING */
+
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
+#include "tinytest.h"
+#include "tinytest_macros.h"
+
+#define LONGEST_TEST_NAME 16384
+
+static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/
+static int n_ok = 0; /**< Number of tests that have passed */
+static int n_bad = 0; /**< Number of tests that have failed. */
+static int n_skipped = 0; /**< Number of tests that have been skipped. */
+
+static int opt_forked = 0; /**< True iff we're called from inside a win32 
fork*/
+static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */
+static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */
+const char *verbosity_flag = "";
+
+const struct testlist_alias_t *cfg_aliases=NULL;
+
+enum outcome { SKIP=2, OK=1, FAIL=0 };
+static enum outcome cur_test_outcome = FAIL;
+const char *cur_test_prefix = NULL; /**< prefix of the current test group */
+/** Name of the current test, if we haven't logged is yet. Used for --quiet */
+const char *cur_test_name = NULL;
+
+#ifdef _WIN32
+/* Copy of argv[0] for win32. */
+static char commandname[MAX_PATH+1];
+#endif
+
+static void usage(struct testgroup_t *groups, int list_groups)
+  __attribute__((noreturn));
+static int process_test_option(struct testgroup_t *groups, const char *test);
+
+static enum outcome
+testcase_run_bare_(const struct testcase_t *testcase)
+{
+       void *env = NULL;
+       enum outcome outcome;
+       if (testcase->setup) {
+               env = testcase->setup->setup_fn(testcase);
+               if (!env)
+                       return FAIL;
+               else if (env == (void*)TT_SKIP)
+                       return SKIP;
+       }
+
+       cur_test_outcome = OK;
+       testcase->fn(env);
+       outcome = cur_test_outcome;
+
+       if (testcase->setup) {
+               if (testcase->setup->cleanup_fn(testcase, env) == 0)
+                       outcome = FAIL;
+       }
+
+       return outcome;
+}
+
+#define MAGIC_EXITCODE 42
+
+#ifndef NO_FORKING
+
+static enum outcome
+testcase_run_forked_(const struct testgroup_t *group,
+                    const struct testcase_t *testcase)
+{
+#ifdef _WIN32
+       /* Fork? On Win32?  How primitive!  We'll do what the smart kids do:
+          we'll invoke our own exe (whose name we recall from the command
+          line) with a command line that tells it to run just the test we
+          want, and this time without forking.
+
+          (No, threads aren't an option.  The whole point of forking is to
+          share no state between tests.)
+        */
+       int ok;
+       char buffer[LONGEST_TEST_NAME+256];
+       STARTUPINFOA si;
+       PROCESS_INFORMATION info;
+       DWORD exitcode;
+
+       if (!in_tinytest_main) {
+               printf("\nERROR.  On Windows, testcase_run_forked_ must be"
+                      " called from within tinytest_main.\n");
+               abort();
+       }
+       if (opt_verbosity>0)
+               printf("[forking] ");
+
+       snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s",
+                commandname, verbosity_flag, group->prefix, testcase->name);
+
+       memset(&si, 0, sizeof(si));
+       memset(&info, 0, sizeof(info));
+       si.cb = sizeof(si);
+
+       ok = CreateProcessA(commandname, buffer, NULL, NULL, 0,
+                          0, NULL, NULL, &si, &info);
+       if (!ok) {
+               printf("CreateProcess failed!\n");
+               return 0;
+       }
+       WaitForSingleObject(info.hProcess, INFINITE);
+       GetExitCodeProcess(info.hProcess, &exitcode);
+       CloseHandle(info.hProcess);
+       CloseHandle(info.hThread);
+       if (exitcode == 0)
+               return OK;
+       else if (exitcode == MAGIC_EXITCODE)
+               return SKIP;
+       else
+               return FAIL;
+#else
+       int outcome_pipe[2];
+       pid_t pid;
+       (void)group;
+
+       if (pipe(outcome_pipe))
+               perror("opening pipe");
+
+       if (opt_verbosity>0)
+               printf("[forking] ");
+       pid = fork();
+#ifdef FORK_BREAKS_GCOV
+       vproc_transaction_begin(0);
+#endif
+       if (!pid) {
+               /* child. */
+               int test_r, write_r;
+               char b[1];
+               close(outcome_pipe[0]);
+               test_r = testcase_run_bare_(testcase);
+               assert(0<=(int)test_r && (int)test_r<=2);
+               b[0] = "NYS"[test_r];
+               write_r = (int)write(outcome_pipe[1], b, 1);
+               if (write_r != 1) {
+                       perror("write outcome to pipe");
+                       exit(1);
+               }
+               exit(0);
+               return FAIL; /* unreachable */
+       } else {
+               /* parent */
+               int status, r;
+               char b[1];
+               /* Close this now, so that if the other side closes it,
+                * our read fails. */
+               close(outcome_pipe[1]);
+               r = (int)read(outcome_pipe[0], b, 1);
+               if (r == 0) {
+                       printf("[Lost connection!] ");
+                       return FAIL;
+               } else if (r != 1) {
+                       perror("read outcome from pipe");
+               }
+               waitpid(pid, &status, 0);
+               close(outcome_pipe[0]);
+               return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL);
+       }
+#endif
+}
+
+#endif /* !NO_FORKING */
+
+int
+testcase_run_one(const struct testgroup_t *group,
+                const struct testcase_t *testcase)
+{
+       enum outcome outcome;
+
+       if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) {
+               if (opt_verbosity>0)
+                       printf("%s%s: %s\n",
+                          group->prefix, testcase->name,
+                          (testcase->flags & TT_SKIP) ? "SKIPPED" : 
"DISABLED");
+               ++n_skipped;
+               return SKIP;
+       }
+
+       if (opt_verbosity>0 && !opt_forked) {
+               printf("%s%s: ", group->prefix, testcase->name);
+       } else {
+               if (opt_verbosity==0) printf(".");
+               cur_test_prefix = group->prefix;
+               cur_test_name = testcase->name;
+       }
+
+#ifndef NO_FORKING
+       if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) {
+               outcome = testcase_run_forked_(group, testcase);
+       } else {
+#else
+       {
+#endif
+               outcome = testcase_run_bare_(testcase);
+       }
+
+       if (outcome == OK) {
+               ++n_ok;
+               if (opt_verbosity>0 && !opt_forked)
+                       puts(opt_verbosity==1?"OK":"");
+       } else if (outcome == SKIP) {
+               ++n_skipped;
+               if (opt_verbosity>0 && !opt_forked)
+                       puts("SKIPPED");
+       } else {
+               ++n_bad;
+               if (!opt_forked)
+                       printf("\n  [%s FAILED]\n", testcase->name);
+       }
+
+       if (opt_forked) {
+               exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1));
+               return 1; /* unreachable */
+       } else {
+               return (int)outcome;
+       }
+}
+
+int
+tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, 
unsigned long flag)
+{
+       int i, j;
+       size_t length = LONGEST_TEST_NAME;
+       char fullname[LONGEST_TEST_NAME];
+       int found=0;
+       if (strstr(arg, ".."))
+               length = strstr(arg,"..")-arg;
+       for (i=0; groups[i].prefix; ++i) {
+               for (j=0; groups[i].cases[j].name; ++j) {
+                       struct testcase_t *testcase = &groups[i].cases[j];
+                       snprintf(fullname, sizeof(fullname), "%s%s",
+                                groups[i].prefix, testcase->name);
+                       if (!flag) { /* Hack! */
+                               printf("    %s", fullname);
+                               if (testcase->flags & TT_OFF_BY_DEFAULT)
+                                       puts("   (Off by default)");
+                               else if (testcase->flags & TT_SKIP)
+                                       puts("  (DISABLED)");
+                               else
+                                       puts("");
+                       }
+                       if (!strncmp(fullname, arg, length)) {
+                               if (set)
+                                       testcase->flags |= flag;
+                               else
+                                       testcase->flags &= ~flag;
+                               ++found;
+                       }
+               }
+       }
+       return found;
+}
+
+static void
+usage(struct testgroup_t *groups, int list_groups)
+{
+       puts("Options are: [--verbose|--quiet|--terse] [--no-fork]");
+       puts("  Specify tests by name, or using a prefix ending with '..'");
+       puts("  To skip a test, prefix its name with a colon.");
+       puts("  To enable a disabled test, prefix its name with a plus.");
+       puts("  Use --list-tests for a list of tests.");
+       if (list_groups) {
+               puts("Known tests are:");
+               tinytest_set_flag_(groups, "..", 1, 0);
+       }
+       exit(0);
+}
+
+static int
+process_test_alias(struct testgroup_t *groups, const char *test)
+{
+       int i, j, n, r;
+       for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) {
+               if (!strcmp(cfg_aliases[i].name, test)) {
+                       n = 0;
+                       for (j = 0; cfg_aliases[i].tests[j]; ++j) {
+                               r = process_test_option(groups, 
cfg_aliases[i].tests[j]);
+                               if (r<0)
+                                       return -1;
+                               n += r;
+                       }
+                       return n;
+               }
+       }
+       printf("No such test alias as @%s!",test);
+       return -1;
+}
+
+static int
+process_test_option(struct testgroup_t *groups, const char *test)
+{
+       int flag = TT_ENABLED_;
+       int n = 0;
+       if (test[0] == '@') {
+               return process_test_alias(groups, test + 1);
+       } else if (test[0] == ':') {
+               ++test;
+               flag = TT_SKIP;
+       } else if (test[0] == '+') {
+               ++test;
+               ++n;
+               if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) {
+                       printf("No such test as %s!\n", test);
+                       return -1;
+               }
+       } else {
+               ++n;
+       }
+       if (!tinytest_set_flag_(groups, test, 1, flag)) {
+               printf("No such test as %s!\n", test);
+               return -1;
+       }
+       return n;
+}
+
+void
+tinytest_set_aliases(const struct testlist_alias_t *aliases)
+{
+       cfg_aliases = aliases;
+}
+
+int
+tinytest_main(int c, const char **v, struct testgroup_t *groups)
+{
+       int i, j, n=0;
+
+#ifdef _WIN32
+       const char *sp = strrchr(v[0], '.');
+       const char *extension = "";
+       if (!sp || stricmp(sp, ".exe"))
+               extension = ".exe"; /* Add an exe so CreateProcess will work */
+       snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension);
+       commandname[MAX_PATH]='\0';
+#endif
+       for (i=1; i<c; ++i) {
+               if (v[i][0] == '-') {
+                       if (!strcmp(v[i], "--RUNNING-FORKED")) {
+                               opt_forked = 1;
+                       } else if (!strcmp(v[i], "--no-fork")) {
+                               opt_nofork = 1;
+                       } else if (!strcmp(v[i], "--quiet")) {
+                               opt_verbosity = -1;
+                               verbosity_flag = "--quiet";
+                       } else if (!strcmp(v[i], "--verbose")) {
+                               opt_verbosity = 2;
+                               verbosity_flag = "--verbose";
+                       } else if (!strcmp(v[i], "--terse")) {
+                               opt_verbosity = 0;
+                               verbosity_flag = "--terse";
+                       } else if (!strcmp(v[i], "--help")) {
+                               usage(groups, 0);
+                       } else if (!strcmp(v[i], "--list-tests")) {
+                               usage(groups, 1);
+                       } else {
+                               printf("Unknown option %s.  Try --help\n",v[i]);
+                               return -1;
+                       }
+               } else {
+                       int r = process_test_option(groups, v[i]);
+                       if (r<0)
+                               return -1;
+                       n += r;
+               }
+       }
+       if (!n)
+               tinytest_set_flag_(groups, "..", 1, TT_ENABLED_);
+
+#ifdef _IONBF
+       setvbuf(stdout, NULL, _IONBF, 0);
+#endif
+
+       ++in_tinytest_main;
+       for (i=0; groups[i].prefix; ++i)
+               for (j=0; groups[i].cases[j].name; ++j)
+                       if (groups[i].cases[j].flags & TT_ENABLED_)
+                               testcase_run_one(&groups[i],
+                                                &groups[i].cases[j]);
+
+       --in_tinytest_main;
+
+       if (opt_verbosity==0)
+               puts("");
+
+       if (n_bad)
+               printf("%d/%d TESTS FAILED. (%d skipped)\n", n_bad,
+                      n_bad+n_ok,n_skipped);
+       else if (opt_verbosity >= 1)
+               printf("%d tests ok.  (%d skipped)\n", n_ok, n_skipped);
+
+       return (n_bad == 0) ? 0 : 1;
+}
+
+int
+tinytest_get_verbosity_(void)
+{
+       return opt_verbosity;
+}
+
+void
+tinytest_set_test_failed_(void)
+{
+       if (opt_verbosity <= 0 && cur_test_name) {
+               if (opt_verbosity==0) puts("");
+               printf("%s%s: ", cur_test_prefix, cur_test_name);
+               cur_test_name = NULL;
+       }
+       cur_test_outcome = FAIL;
+}
+
+void
+tinytest_set_test_skipped_(void)
+{
+       if (cur_test_outcome==OK)
+               cur_test_outcome = SKIP;
+}
+
+char *
+tinytest_format_hex_(const void *val_, unsigned long len)
+{
+       const unsigned char *val = (unsigned char *) val_;
+       char *result, *cp;
+       size_t i;
+
+       if (!val)
+               return strdup("null");
+       if (!(result = (char *) malloc(len*2+1)))
+               return strdup("<allocation failure>");
+       cp = result;
+       for (i=0;i<len;++i) {
+               *cp++ = "0123456789ABCDEF"[val[i] >> 4];
+               *cp++ = "0123456789ABCDEF"[val[i] & 0x0f];
+       }
+       *cp = 0;
+       return result;
+}
diff --git a/tests/tinytest/tinytest.h b/tests/tinytest/tinytest.h
new file mode 100644
index 0000000..ed07b26
--- /dev/null
+++ b/tests/tinytest/tinytest.h
@@ -0,0 +1,100 @@
+/* tinytest.h -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TINYTEST_H_INCLUDED_
+#define TINYTEST_H_INCLUDED_
+
+/** Flag for a test that needs to run in a subprocess. */
+#define TT_FORK  (1<<0)
+/** Runtime flag for a test we've decided to skip. */
+#define TT_SKIP  (1<<1)
+/** Internal runtime flag for a test we've decided to run. */
+#define TT_ENABLED_  (1<<2)
+/** Flag for a test that's off by default. */
+#define TT_OFF_BY_DEFAULT  (1<<3)
+/** If you add your own flags, make them start at this point. */
+#define TT_FIRST_USER_FLAG (1<<4)
+
+typedef void (*testcase_fn)(void *);
+
+struct testcase_t;
+
+/** Functions to initialize/teardown a structure for a testcase. */
+struct testcase_setup_t {
+       /** Return a new structure for use by a given testcase. */
+       void *(*setup_fn)(const struct testcase_t *);
+       /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */
+       int (*cleanup_fn)(const struct testcase_t *, void *);
+};
+
+/** A single test-case that you can run. */
+struct testcase_t {
+       const char *name; /**< An identifier for this case. */
+       testcase_fn fn; /**< The function to run to implement this case. */
+       unsigned long flags; /**< Bitfield of TT_* flags. */
+       const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/
+       void *setup_data; /**< Extra data usable by setup function */
+};
+#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL }
+
+/** A group of tests that are selectable together. */
+struct testgroup_t {
+       const char *prefix; /**< Prefix to prepend to testnames. */
+       struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */
+};
+#define END_OF_GROUPS { NULL, NULL}
+
+struct testlist_alias_t {
+       const char *name;
+       const char **tests;
+};
+#define END_OF_ALIASES { NULL, NULL }
+
+/** Implementation: called from a test to indicate failure, before logging. */
+void tinytest_set_test_failed_(void);
+/** Implementation: called from a test to indicate that we're skipping. */
+void tinytest_set_test_skipped_(void);
+/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */
+int tinytest_get_verbosity_(void);
+/** Implementation: Set a flag on tests matching a name; returns number
+ * of tests that matched. */
+int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned 
long);
+/** Implementation: Put a chunk of memory into hex. */
+char *tinytest_format_hex_(const void *, unsigned long);
+
+/** Set all tests in 'groups' matching the name 'named' to be skipped. */
+#define tinytest_skip(groups, named) \
+       tinytest_set_flag_(groups, named, 1, TT_SKIP)
+
+/** Run a single testcase in a single group. */
+int testcase_run_one(const struct testgroup_t *,const struct testcase_t *);
+
+void tinytest_set_aliases(const struct testlist_alias_t *aliases);
+
+/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups,
+    as selected from the command line. */
+int tinytest_main(int argc, const char **argv, struct testgroup_t *groups);
+
+#endif
diff --git a/tests/tinytest/tinytest_demo.c b/tests/tinytest/tinytest_demo.c
new file mode 100644
index 0000000..634e112
--- /dev/null
+++ b/tests/tinytest/tinytest_demo.c
@@ -0,0 +1,264 @@
+/* tinytest_demo.c -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/* Welcome to the example file for tinytest!  I'll show you how to set up
+ * some simple and not-so-simple testcases. */
+
+/* Make sure you include these headers. */
+#include "tinytest.h"
+#include "tinytest_macros.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
+/* ============================================================ */
+
+/* First, let's see if strcmp is working.  (All your test cases should be
+ * functions declared to take a single void * as an argument.) */
+void
+test_strcmp(void *data)
+{
+       (void)data; /* This testcase takes no data. */
+
+       /* Let's make sure the empty string is equal to itself */
+       if (strcmp("","")) {
+               /* This macro tells tinytest to stop the current test
+                * and go straight to the "end" label. */
+               tt_abort_msg("The empty string was not equal to itself");
+       }
+
+       /* Pretty often, calling tt_abort_msg to indicate failure is more
+          heavy-weight than you want.  Instead, just say: */
+       tt_assert(strcmp("testcase", "testcase") == 0);
+
+       /* Occasionally, you don't want to stop the current testcase just
+          because a single assertion has failed.  In that case, use
+          tt_want: */
+       tt_want(strcmp("tinytest", "testcase") > 0);
+
+       /* You can use the tt_*_op family of macros to compare values and to
+          fail unless they have the relationship you want.  They produce
+          more useful output than tt_assert, since they display the actual
+          values of the failing things.
+
+          Fail unless strcmp("abc, "abc") == 0 */
+       tt_int_op(strcmp("abc", "abc"), ==, 0);
+
+       /* Fail unless strcmp("abc, "abcd") is less than 0 */
+       tt_int_op(strcmp("abc", "abcd"), < , 0);
+
+       /* Incidentally, there's a test_str_op that uses strcmp internally. */
+       tt_str_op("abc", <, "abcd");
+
+
+       /* Every test-case function needs to finish with an "end:"
+          label and (optionally) code to clean up local variables. */
+ end:
+       ;
+}
+
+/* ============================================================ */
+
+/* Now let's mess with setup and teardown functions!  These are handy if
+   you have a bunch of tests that all need a similar environment, and you
+   want to reconstruct that environment freshly for each one. */
+
+/* First you declare a type to hold the environment info, and functions to
+   set it up and tear it down. */
+struct data_buffer {
+       /* We're just going to have couple of character buffer.  Using
+          setup/teardown functions is probably overkill for this case.
+
+          You could also do file descriptors, complicated handles, temporary
+          files, etc. */
+       char buffer1[512];
+       char buffer2[512];
+};
+/* The setup function needs to take a const struct testcase_t and return
+   void* */
+void *
+setup_data_buffer(const struct testcase_t *testcase)
+{
+       struct data_buffer *db = malloc(sizeof(struct data_buffer));
+
+       /* If you had a complicated set of setup rules, you might behave
+          differently here depending on testcase->flags or
+          testcase->setup_data or even or testcase->name. */
+
+       /* Returning a NULL here would mean that we couldn't set up for this
+          test, so we don't need to test db for null. */
+       return db;
+}
+/* The clean function deallocates storage carefully and returns true on
+   success. */
+int
+clean_data_buffer(const struct testcase_t *testcase, void *ptr)
+{
+       struct data_buffer *db = ptr;
+
+       if (db) {
+               free(db);
+               return 1;
+       }
+       return 0;
+}
+/* Finally, declare a testcase_setup_t with these functions. */
+struct testcase_setup_t data_buffer_setup = {
+       setup_data_buffer, clean_data_buffer
+};
+
+
+/* Now let's write our test. */
+void
+test_memcpy(void *ptr)
+{
+       /* This time, we use the argument. */
+       struct data_buffer *db = ptr;
+
+       /* We'll also introduce a local variable that might need cleaning up. */
+       char *mem = NULL;
+
+       /* Let's make sure that memcpy does what we'd like. */
+       strcpy(db->buffer1, "String 0");
+       memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1));
+       tt_str_op(db->buffer1, ==, db->buffer2);
+
+        /* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() 
*/
+        db->buffer2[100] = 3; /* Make the buffers unequal */
+        tt_mem_op(db->buffer1, <, db->buffer2, sizeof(db->buffer1));
+
+       /* Now we've allocated memory that's referenced by a local variable.
+          The end block of the function will clean it up. */
+       mem = strdup("Hello world.");
+       tt_assert(mem);
+
+       /* Another rather trivial test. */
+       tt_str_op(db->buffer1, !=, mem);
+
+ end:
+       /* This time our end block has something to do. */
+       if (mem)
+               free(mem);
+}
+
+void
+test_timeout(void *ptr)
+{
+       time_t t1, t2;
+       (void)ptr;
+       t1 = time(NULL);
+#ifdef _WIN32
+       Sleep(5000);
+#else
+       sleep(5);
+#endif
+       t2 = time(NULL);
+
+       tt_int_op(t2-t1, >=, 4);
+
+       tt_int_op(t2-t1, <=, 6);
+
+ end:
+       ;
+}
+
+/* ============================================================ */
+
+/* Now we need to make sure that our tests get invoked.          First, you 
take
+   a bunch of related tests and put them into an array of struct testcase_t.
+*/
+
+struct testcase_t demo_tests[] = {
+       /* Here's a really simple test: it has a name you can refer to it
+          with, and a function to invoke it. */
+       { "strcmp", test_strcmp, },
+
+       /* The second test has a flag, "TT_FORK", to make it run in a
+          subprocess, and a pointer to the testcase_setup_t that configures
+          its environment. */
+       { "memcpy", test_memcpy, TT_FORK, &data_buffer_setup },
+
+       /* This flag is off-by-default, since it takes a while to run.  You
+        * can enable it manually by passing +demo/timeout at the command 
line.*/
+       { "timeout", test_timeout, TT_OFF_BY_DEFAULT },
+
+       /* The array has to end with END_OF_TESTCASES. */
+       END_OF_TESTCASES
+};
+
+/* Next, we make an array of testgroups.  This is mandatory.  Unlike more
+   heavy-duty testing frameworks, groups can't nest. */
+struct testgroup_t groups[] = {
+
+       /* Every group has a 'prefix', and an array of tests.  That's it. */
+       { "demo/", demo_tests },
+
+       END_OF_GROUPS
+};
+
+/* We can also define test aliases. These can be used for types of tests that
+ * cut across groups. */
+const char *alltests[] = { "+..", NULL };
+const char *slowtests[] = { "+demo/timeout", NULL };
+struct testlist_alias_t aliases[] = {
+
+       { "ALL", alltests },
+       { "SLOW", slowtests },
+
+       END_OF_ALIASES
+};
+
+
+int
+main(int c, const char **v)
+{
+       /* Finally, just call tinytest_main().  It lets you specify verbose
+          or quiet output with --verbose and --quiet.  You can list
+          specific tests:
+
+              tinytest-demo demo/memcpy
+
+          or use a ..-wildcard to select multiple tests with a common
+          prefix:
+
+              tinytest-demo demo/..
+
+          If you list no tests, you get them all by default, so that
+          "tinytest-demo" and "tinytest-demo .." mean the same thing.
+
+       */
+       tinytest_set_aliases(aliases);
+       return tinytest_main(c, v, groups);
+}
diff --git a/tests/tinytest/tinytest_macros.h b/tests/tinytest/tinytest_macros.h
new file mode 100644
index 0000000..f28af12
--- /dev/null
+++ b/tests/tinytest/tinytest_macros.h
@@ -0,0 +1,199 @@
+/* tinytest_macros.h -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TINYTEST_MACROS_H_INCLUDED_
+#define TINYTEST_MACROS_H_INCLUDED_
+
+/* Helpers for defining statement-like macros */
+#define TT_STMT_BEGIN do {
+#define TT_STMT_END } while (0)
+
+/* Redefine this if your test functions want to abort with something besides
+ * "goto end;" */
+#ifndef TT_EXIT_TEST_FUNCTION
+#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END
+#endif
+
+/* Redefine this if you want to note success/failure in some different way. */
+#ifndef TT_DECLARE
+#define TT_DECLARE(prefix, args)                               \
+       TT_STMT_BEGIN                                           \
+       printf("\n  %s %s:%d: ",prefix,__FILE__,__LINE__);      \
+       printf args ;                                           \
+       TT_STMT_END
+#endif
+
+/* Announce a failure. Args are parenthesized printf args. */
+#define TT_GRIPE(args) TT_DECLARE("FAIL", args)
+
+/* Announce a non-failure if we're verbose. */
+#define TT_BLATHER(args)                                               \
+       TT_STMT_BEGIN                                                   \
+       if (tinytest_get_verbosity_()>1) TT_DECLARE("  OK", args);      \
+       TT_STMT_END
+
+#define TT_DIE(args)                                           \
+       TT_STMT_BEGIN                                           \
+       tinytest_set_test_failed_();                            \
+       TT_GRIPE(args);                                         \
+       TT_EXIT_TEST_FUNCTION;                                  \
+       TT_STMT_END
+
+#define TT_FAIL(args)                          \
+       TT_STMT_BEGIN                                           \
+       tinytest_set_test_failed_();                            \
+       TT_GRIPE(args);                                         \
+       TT_STMT_END
+
+/* Fail and abort the current test for the reason in msg */
+#define tt_abort_printf(msg) TT_DIE(msg)
+#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno))
+#define tt_abort_msg(msg) TT_DIE(("%s", msg))
+#define tt_abort() TT_DIE(("%s", "(Failed.)"))
+
+/* Fail but do not abort the current test for the reason in msg. */
+#define tt_failprint_f(msg) TT_FAIL(msg)
+#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno))
+#define tt_fail_msg(msg) TT_FAIL(("%s", msg))
+#define tt_fail() TT_FAIL(("%s", "(Failed.)"))
+
+/* End the current test, and indicate we are skipping it. */
+#define tt_skip()                                              \
+       TT_STMT_BEGIN                                           \
+       tinytest_set_test_skipped_();                           \
+       TT_EXIT_TEST_FUNCTION;                                  \
+       TT_STMT_END
+
+#define tt_want_(b, msg, fail)                         \
+       TT_STMT_BEGIN                                   \
+       if (!(b)) {                                     \
+               tinytest_set_test_failed_();            \
+               TT_GRIPE(("%s",msg));                   \
+               fail;                                   \
+       } else {                                        \
+               TT_BLATHER(("%s",msg));                 \
+       }                                               \
+       TT_STMT_END
+
+/* Assert b, but do not stop the test if b fails.  Log msg on failure. */
+#define tt_want_msg(b, msg)                    \
+       tt_want_(b, msg, );
+
+/* Assert b and stop the test if b fails.  Log msg on failure. */
+#define tt_assert_msg(b, msg)                  \
+       tt_want_(b, msg, TT_EXIT_TEST_FUNCTION);
+
+/* Assert b, but do not stop the test if b fails. */
+#define tt_want(b)   tt_want_msg( (b), "want("#b")")
+/* Assert b, and stop the test if b fails. */
+#define tt_assert(b) tt_assert_msg((b), "assert("#b")")
+
+#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, 
\
+    setup_block,cleanup_block,die_on_fail)                             \
+       TT_STMT_BEGIN                                                   \
+       type val1_ = (a);                                               \
+       type val2_ = (b);                                               \
+       int tt_status_ = (test);                                        \
+       if (!tt_status_ || tinytest_get_verbosity_()>1) {               \
+               printf_type print_;                                     \
+               printf_type print1_;                                    \
+               printf_type print2_;                                    \
+               type value_ = val1_;                                    \
+               setup_block;                                            \
+               print1_ = print_;                                       \
+               value_ = val2_;                                         \
+               setup_block;                                            \
+               print2_ = print_;                                       \
+               TT_DECLARE(tt_status_?"  OK":"FAIL",                    \
+                          ("assert(%s): " printf_fmt " vs " printf_fmt,\
+                           str_test, print1_, print2_));               \
+               print_ = print1_;                                       \
+               cleanup_block;                                          \
+               print_ = print2_;                                       \
+               cleanup_block;                                          \
+               if (!tt_status_) {                                      \
+                       tinytest_set_test_failed_();                    \
+                       die_on_fail ;                                   \
+               }                                                       \
+       }                                                               \
+       TT_STMT_END
+
+#define tt_assert_test_type(a,b,str_test,type,test,fmt,die_on_fail)    \
+       tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt,        \
+           {print_=value_;},{},die_on_fail)
+
+#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail)        
\
+       tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt,        \
+            {print_=value_?value_:"<NULL>";},{},die_on_fail)
+
+/* Helper: assert that a op b, when cast to type.  Format the values with
+ * printf format fmt on failure. */
+#define tt_assert_op_type(a,op,b,type,fmt)                             \
+       tt_assert_test_type(a,b,#a" "#op" "#b,type,(val1_ op val2_),fmt, \
+           TT_EXIT_TEST_FUNCTION)
+
+#define tt_int_op(a,op,b)                      \
+       tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_), \
+           "%ld",TT_EXIT_TEST_FUNCTION)
+
+#define tt_uint_op(a,op,b)                                             \
+       tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long,            \
+           (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION)
+
+#define tt_ptr_op(a,op,b)                                              \
+       tt_assert_test_type(a,b,#a" "#op" "#b,const void*,              \
+           (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION)
+
+#define tt_str_op(a,op,b)                                              \
+       tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *,         \
+           (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>",        \
+           TT_EXIT_TEST_FUNCTION)
+
+#define tt_mem_op(expr1, op, expr2, len)                                \
+  tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2,            \
+                         const void *,                                 \
+                         (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \
+                         char *, "%s",                                 \
+                         { print_ = tinytest_format_hex_(value_, (len)); }, \
+                         { if (print_) free(print_); },                \
+                         TT_EXIT_TEST_FUNCTION                         \
+                          );
+
+#define tt_want_int_op(a,op,b)                                         \
+       tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op 
val2_),"%ld",(void)0)
+
+#define tt_want_uint_op(a,op,b)                                                
\
+       tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long,            \
+           (val1_ op val2_),"%lu",(void)0)
+
+#define tt_want_ptr_op(a,op,b)                                         \
+  tt_assert_test_type(a,b,#a" "#op" "#b,const void*,                   \
+           (val1_ op val2_),"%p",(void)0)
+
+#define tt_want_str_op(a,op,b)                                         \
+       tt_assert_test_type(a,b,#a" "#op" "#b,const char *,             \
+           (strcmp(val1_,val2_) op 0),"<%s>",(void)0)
+
+#endif
diff --git a/utils/make-tarball.sh b/utils/make-tarball.sh
index a23f4a9..4eef872 100644
--- a/utils/make-tarball.sh
+++ b/utils/make-tarball.sh
@@ -14,5 +14,6 @@ set -xe
 
 rm -f ../axe_${version}.orig.tar*
 git archive -o ../axe_${version}.orig.tar $version
-tar -rvf ../axe_${version}.orig.tar --owner=0 --group=0 src/libqes/
+tar -rf ../axe_${version}.orig.tar --owner=0 --group=0 src/libqes/
+tar --delete -vf ../axe_${version}.orig.tar .gitmodules src/libqes/.gitmodules 
src/libqes/.git
 xz ../axe_${version}.orig.tar

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/debian-med/axe-demultiplexer.git

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to