]> git.meshlink.io Git - meshlink/blob - test/duplicate.c
Use multicast to respond to mDNS requests.
[meshlink] / test / duplicate.c
1 #ifdef NDEBUG
2 #undef NDEBUG
3 #endif
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <assert.h>
10
11 #include "meshlink.h"
12 #include "utils.h"
13
14 static struct sync_flag duplicate_detected;
15
16 static void handle_duplicate(meshlink_handle_t *mesh, meshlink_node_t *node) {
17         set_sync_flag(&duplicate_detected, true);
18         assert(meshlink_blacklist(mesh, node));
19 }
20
21 int main(void) {
22         init_sync_flag(&duplicate_detected);
23
24         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
25
26         // Open meshlink instances
27
28         static const char *name[4] = {"foo", "bar", "baz", "foo"};
29         meshlink_handle_t *mesh[4];
30
31         for(int i = 0; i < 4; i++) {
32                 char dirname[100];
33                 snprintf(dirname, sizeof dirname, "duplicate_conf.%d", i);
34
35                 assert(meshlink_destroy(dirname));
36                 mesh[i] = meshlink_open(dirname, name[i], "duplicate", DEV_CLASS_BACKBONE);
37                 assert(mesh[i]);
38
39                 assert(meshlink_set_canonical_address(mesh[i], meshlink_get_self(mesh[i]), "localhost", NULL));
40                 meshlink_enable_discovery(mesh[i], false);
41
42                 meshlink_set_node_duplicate_cb(mesh[i], handle_duplicate);
43         }
44
45         // Link them in a chain
46
47         char *data[4];
48
49         for(int i = 0; i < 4; i++) {
50                 data[i] = meshlink_export(mesh[i]);
51                 assert(data[i]);
52         }
53
54         for(int i = 0; i < 3; i++) {
55                 assert(meshlink_import(mesh[i], data[i + 1]));
56                 assert(meshlink_import(mesh[i + 1], data[i]));
57         }
58
59         for(int i = 0; i < 4; i++) {
60                 free(data[i]);
61         }
62
63         // Start the meshes
64
65         for(int i = 0; i < 4; i++) {
66                 assert(meshlink_start(mesh[i]));
67         }
68
69         // Wait for the duplicate node to be detected
70
71         assert(wait_sync_flag(&duplicate_detected, 20));
72
73         // Clean up
74
75         for(int i = 0; i < 4; i++) {
76                 meshlink_close(mesh[i]);
77         }
78 }