aga: Testcase for attempt to run concurrent algorithms
authorDavid Gibson <david@gibson.dropbear.id.au>
Thu, 7 May 2015 11:29:19 +0000 (21:29 +1000)
committerDavid Gibson <david@gibson.dropbear.id.au>
Sat, 1 Aug 2015 14:29:25 +0000 (00:29 +1000)
The aga algorithms can't be run concurrently, because they store state
information in the aga_node structures.  However, they are supposed to
detect an attempt to re-enter and safely report an error.  This adds a
testcase for this.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
ccan/aga/test/api-concurrent.c [new file with mode: 0644]

diff --git a/ccan/aga/test/api-concurrent.c b/ccan/aga/test/api-concurrent.c
new file mode 100644 (file)
index 0000000..19d0eab
--- /dev/null
@@ -0,0 +1,52 @@
+#include "config.h"
+
+#include <stddef.h>
+#include <assert.h>
+
+#include <ccan/aga/aga.h>
+
+#include <ccan/tap/tap.h>
+
+#include "simple-graph.h"
+
+
+#define NUM_ALGOS      2
+
+#define check_one_inner(algo) \
+       ok1(aga_##algo##_start(&tg.sg.g) == -1);
+
+#define check_all_inner()                      \
+       do {                                    \
+               check_one_inner(dfs);           \
+               check_one_inner(bfs);           \
+       } while (0)
+
+#define check_one_outer(algo)                                  \
+       do {                                                    \
+               ok1(aga_##algo##_start(&tg.sg.g) == 0);         \
+               check_all_inner();                              \
+               aga_finish(&tg.sg.g);                           \
+       } while (0)
+
+#define check_all_outer()                      \
+       do {                                    \
+               check_one_outer(dfs);           \
+               check_one_outer(bfs);           \
+       } while (0)
+
+int main(void)
+{
+       struct trivial_graph tg;
+
+       if (NUM_ALGOS)
+               plan_tests(NUM_ALGOS + NUM_ALGOS * NUM_ALGOS);
+       else
+               plan_skip_all("Nothing to test");
+
+       trivial_graph_init(&tg);
+
+       check_all_outer();
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}