]> git.meshlink.io Git - meshlink/blobdiff - test/port.c
Add a test for changing ports and handling of port conflicts.
[meshlink] / test / port.c
diff --git a/test/port.c b/test/port.c
new file mode 100644 (file)
index 0000000..cd24f34
--- /dev/null
@@ -0,0 +1,67 @@
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "meshlink.h"
+#include "devtools.h"
+#include "utils.h"
+
+
+int main(void) {
+       meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
+
+       meshlink_handle_t *mesh1;
+       meshlink_handle_t *mesh2;
+
+       // Open two instances
+
+       assert(meshlink_destroy("port_conf.1"));
+       assert(meshlink_destroy("port_conf.2"));
+
+       mesh1 = meshlink_open("port_conf.1", "foo", "port", DEV_CLASS_BACKBONE);
+       mesh2 = meshlink_open("port_conf.2", "bar", "port", DEV_CLASS_BACKBONE);
+
+       assert(mesh1);
+       assert(mesh2);
+
+       meshlink_enable_discovery(mesh1, false);
+       meshlink_enable_discovery(mesh2, false);
+
+       int port1 = meshlink_get_port(mesh1);
+       int port2 = meshlink_get_port(mesh2);
+       assert(port1);
+       assert(port2);
+       assert(port1 != port2);
+
+       // bar cannot take foo's port if foo is still open
+       assert(!meshlink_set_port(mesh2, port1));
+
+       // bar can take foo's port of foo is closed
+       meshlink_close(mesh1);
+
+       assert(meshlink_set_port(mesh2, port1));
+       assert(meshlink_get_port(mesh2) == port1);
+
+       // foo can open but will now use a different port
+       mesh1 = meshlink_open("port_conf.1", "foo", "port", DEV_CLASS_BACKBONE);
+       assert(mesh1);
+       int port1b = meshlink_get_port(mesh1);
+       assert(port1b);
+       assert(port1b != port1);
+
+       assert(!meshlink_set_port(mesh1, port1));
+
+       // foo can take over bar's old port
+       assert(meshlink_set_port(mesh1, port2));
+
+       meshlink_close(mesh1);
+       meshlink_close(mesh2);
+}