[ccan] [PATCH 5/6] aga: Testcase for attempt to run concurrent algorithms

David Gibson david at gibson.dropbear.id.au
Wed May 27 21:21:27 AEST 2015


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 at gibson.dropbear.id.au>
---
 ccan/aga/test/api-concurrent.c | 52 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 ccan/aga/test/api-concurrent.c

diff --git a/ccan/aga/test/api-concurrent.c b/ccan/aga/test/api-concurrent.c
new file mode 100644
index 0000000..690b7bc
--- /dev/null
+++ b/ccan/aga/test/api-concurrent.c
@@ -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, &tg.sg.nodes[1]) == -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, &tg.sg.nodes[1]) == 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();
+}
-- 
2.1.0



More information about the ccan mailing list