]> git.meshlink.io Git - meshlink/commitdiff
Port the blackbox status_cb test.
authorGuus Sliepen <guus@meshlink.io>
Wed, 22 Jul 2020 19:07:02 +0000 (21:07 +0200)
committerGuus Sliepen <guus@meshlink.io>
Wed, 22 Jul 2020 19:07:02 +0000 (21:07 +0200)
Use ephemeral MeshLink instances to speed up the test.

test/Makefile.am
test/api_set_node_status_cb.c [new file with mode: 0644]
test/utils.c
test/utils.h

index 4d6d93683ce47925c772254324bf01452b6c36da..6dcfc61030336872ffe88417fea6d6b49035312e 100644 (file)
@@ -24,6 +24,9 @@ TESTS = \
        utcp-benchmark \
        utcp-benchmark-stream
 
+TESTS += \
+       api_set_node_status_cb
+
 if BLACKBOX_TESTS
 SUBDIRS = blackbox
 endif
@@ -34,6 +37,7 @@ AM_CPPFLAGS = $(PTHREAD_CFLAGS) -I${top_srcdir}/src -iquote. -Wall
 AM_LDFLAGS = $(PTHREAD_LIBS)
 
 check_PROGRAMS = \
+       api_set_node_status_cb \
        basic \
        basicpp \
        blacklist \
@@ -63,6 +67,9 @@ if INSTALL_TESTS
 bin_PROGRAMS = $(check_PROGRAMS)
 endif
 
+api_set_node_status_cb_SOURCES = api_set_node_status_cb.c utils.c utils.h
+api_set_node_status_cb_LDADD = $(top_builddir)/src/libmeshlink.la
+
 basic_SOURCES = basic.c utils.c utils.h
 basic_LDADD = $(top_builddir)/src/libmeshlink.la
 
diff --git a/test/api_set_node_status_cb.c b/test/api_set_node_status_cb.c
new file mode 100644 (file)
index 0000000..7e5da19
--- /dev/null
@@ -0,0 +1,58 @@
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+
+#include <assert.h>
+#include <string.h>
+
+#include "meshlink.h"
+#include "utils.h"
+
+static struct sync_flag a_reachable;
+static struct sync_flag b_reachable;
+
+static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
+       (void)mesh;
+
+       if(!reachable) {
+               return;
+       }
+
+       if(!strcmp(node->name, "a")) {
+               set_sync_flag(&a_reachable, true);
+       } else if(!strcmp(node->name, "b")) {
+               set_sync_flag(&b_reachable, true);
+       }
+}
+
+int main(void) {
+       meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
+
+       init_sync_flag(&a_reachable);
+       init_sync_flag(&b_reachable);
+
+       meshlink_handle_t *mesh1, *mesh2;
+       open_meshlink_pair_ephemeral(&mesh1, &mesh2, "api_set_node_status_cb");
+
+       // Test case #1: check that setting a valid status callback will cause it to be called
+       //               when the node itself is started or stopped
+
+       meshlink_set_node_status_cb(mesh1, status_cb);
+       assert(meshlink_start(mesh1));
+       assert(wait_sync_flag(&a_reachable, 5));
+
+       // Test case #2: check that the status callback will be called when another peer is started
+
+       assert(meshlink_start(mesh2));
+       assert(wait_sync_flag(&b_reachable, 5));
+
+       // Test case #3: check that passing a NULL pointer for the mesh returns an error
+
+       meshlink_errno = MESHLINK_OK;
+       meshlink_set_node_status_cb(NULL, status_cb);
+       assert(meshlink_errno == MESHLINK_EINVAL);
+
+       // Done.
+
+       close_meshlink_pair(mesh1, mesh2);
+}
index 21b33f5e301d7e50aa9a75b9bc238d14dfe57375..f1f1c7700334e20ba1080b5a2e850c779203bbba 100644 (file)
@@ -108,6 +108,26 @@ void open_meshlink_pair(meshlink_handle_t **pa, meshlink_handle_t **pb, const ch
        *pb = b;
 }
 
+void open_meshlink_pair_ephemeral(meshlink_handle_t **pa, meshlink_handle_t **pb, const char *prefix) {
+       // Create two new MeshLink instances
+
+       *pa = *pb = NULL;
+
+       meshlink_handle_t *a = meshlink_open_ephemeral("a", prefix, DEV_CLASS_BACKBONE);
+       meshlink_handle_t *b = meshlink_open_ephemeral("b", prefix, DEV_CLASS_BACKBONE);
+
+       assert(a);
+       assert(b);
+
+       meshlink_enable_discovery(a, false);
+       meshlink_enable_discovery(b, false);
+
+       link_meshlink_pair(a, b);
+
+       *pa = a;
+       *pb = b;
+}
+
 // Don't poll in the application thread, use a condition variable to signal when the peer is online.
 static void pair_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
        (void)node;
index 2a56ed83a0b24dedaf59340cb66719ef28cbfe91..110c50a6a1a5448d8a0c91a4d69e37e899139225 100644 (file)
@@ -21,6 +21,7 @@ extern bool wait_sync_flag(struct sync_flag *s, int seconds);
 
 /// Create a pair of meshlink instances that are already joined together.
 extern void open_meshlink_pair(meshlink_handle_t **a, meshlink_handle_t **b, const char *prefix);
+extern void open_meshlink_pair_ephemeral(meshlink_handle_t **a, meshlink_handle_t **b, const char *prefix);
 
 /// Start a pair of meshlink instances and wait for them to connect together.
 extern void start_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b);