]> git.meshlink.io Git - meshlink/blobdiff - test/duplicate.c
Don't use assert() to check the results of pthread_*() calls.
[meshlink] / test / duplicate.c
index fdb4c12e78203c2660abf9e447d119fc1fec6a6c..df9f86be1afd704fe16c45b36b07f53df34f7fc5 100644 (file)
@@ -1,21 +1,28 @@
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <errno.h>
+#include <assert.h>
 
 #include "meshlink.h"
+#include "utils.h"
 
-static volatile bool duplicate_detected;
+static struct sync_flag duplicate_detected;
 
 static void handle_duplicate(meshlink_handle_t *mesh, meshlink_node_t *node) {
-       meshlink_node_t *self = meshlink_get_self(mesh);
-       fprintf(stderr, "%s: detected duplicate node %s\n", self->name, node->name);
-       duplicate_detected = true;
-       meshlink_blacklist(mesh, node);
+       set_sync_flag(&duplicate_detected, true);
+       assert(meshlink_blacklist(mesh, node));
 }
 
-int main() {
+int main(void) {
+       init_sync_flag(&duplicate_detected);
+
+       meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
+
        // Open meshlink instances
 
        static const char *name[4] = {"foo", "bar", "baz", "foo"};
@@ -25,14 +32,11 @@ int main() {
                char dirname[100];
                snprintf(dirname, sizeof dirname, "duplicate_conf.%d", i);
 
+               assert(meshlink_destroy(dirname));
                mesh[i] = meshlink_open(dirname, name[i], "duplicate", DEV_CLASS_BACKBONE);
+               assert(mesh[i]);
 
-               if(!mesh[i]) {
-                       fprintf(stderr, "Could not initialize configuration for node %d\n", i);
-                       return 1;
-               }
-
-               meshlink_add_address(mesh[i], "localhost");
+               assert(meshlink_set_canonical_address(mesh[i], meshlink_get_self(mesh[i]), "localhost", NULL));
                meshlink_enable_discovery(mesh[i], false);
 
                meshlink_set_node_duplicate_cb(mesh[i], handle_duplicate);
@@ -44,11 +48,12 @@ int main() {
 
        for(int i = 0; i < 4; i++) {
                data[i] = meshlink_export(mesh[i]);
+               assert(data[i]);
        }
 
        for(int i = 0; i < 3; i++) {
-               meshlink_import(mesh[i], data[i + 1]);
-               meshlink_import(mesh[i + 1], data[i]);
+               assert(meshlink_import(mesh[i], data[i + 1]));
+               assert(meshlink_import(mesh[i + 1], data[i]));
        }
 
        for(int i = 0; i < 4; i++) {
@@ -58,32 +63,16 @@ int main() {
        // Start the meshes
 
        for(int i = 0; i < 4; i++) {
-               if(!meshlink_start(mesh[i])) {
-                       fprintf(stderr, "Could not start mesh %d\n", i);
-                       return 1;
-               }
+               assert(meshlink_start(mesh[i]));
        }
 
        // Wait for the duplicate node to be detected
 
-       for(int i = 0; i < 20; i++) {
-               sleep(1);
-
-               if(duplicate_detected) {
-                       break;
-               }
-       }
-
-       if(!duplicate_detected) {
-               fprintf(stderr, "Failed to detect duplicate node after 20 seconds\n");
-               return 1;
-       }
+       assert(wait_sync_flag(&duplicate_detected, 20));
 
        // Clean up
 
        for(int i = 0; i < 4; i++) {
                meshlink_close(mesh[i]);
        }
-
-       return 0;
 }