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