]> git.meshlink.io Git - meshlink/blob - test/import-export.c
Reduce how often we have to poll the packet queue.
[meshlink] / test / import-export.c
1 #ifdef NDEBUG
2 #undef NDEBUG
3 #endif
4
5 #include <stdio.h>
6 #include <unistd.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/time.h>
10 #include <assert.h>
11
12 #include "meshlink.h"
13 #include "utils.h"
14
15 struct sync_flag bar_reachable;
16
17 void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
18         (void)mesh;
19
20         if(reachable && !strcmp(node->name, "bar")) {
21                 set_sync_flag(&bar_reachable, true);
22         }
23 }
24
25 int main() {
26         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
27
28         // Open two new meshlink instance.
29
30         assert(meshlink_destroy("import_export_conf.1"));
31         assert(meshlink_destroy("import_export_conf.2"));
32
33         meshlink_handle_t *mesh1 = meshlink_open("import_export_conf.1", "foo", "import-export", DEV_CLASS_BACKBONE);
34         assert(mesh1);
35
36         meshlink_handle_t *mesh2 = meshlink_open("import_export_conf.2", "bar", "import-export", DEV_CLASS_BACKBONE);
37         assert(mesh2);
38
39         // Disable local discovery
40
41         meshlink_enable_discovery(mesh1, false);
42         meshlink_enable_discovery(mesh2, false);
43
44         // Import and export both side's data
45
46         assert(meshlink_set_canonical_address(mesh1, meshlink_get_self(mesh1), "localhost", NULL));
47         assert(meshlink_set_canonical_address(mesh2, meshlink_get_self(mesh2), "localhost", NULL));
48
49         char *data = meshlink_export(mesh1);
50         assert(data);
51
52         assert(meshlink_import(mesh2, data));
53         free(data);
54
55         data = meshlink_export(mesh2);
56         assert(data);
57
58         assert(meshlink_import(mesh1, data));
59
60         // Check that importing twice is fine
61         assert(meshlink_import(mesh1, data));
62         free(data);
63
64         // Check that importing garbage is not fine
65         assert(!meshlink_import(mesh1, "Garbage\n"));
66
67         // Check that foo knows bar, but that it is not reachable.
68
69         time_t last_reachable;
70         time_t last_unreachable;
71         meshlink_node_t *bar = meshlink_get_node(mesh1, "bar");
72         assert(bar);
73         assert(!meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable));
74         assert(!last_reachable);
75         assert(!last_unreachable);
76
77         // Start both instances
78
79         meshlink_set_node_status_cb(mesh1, status_cb);
80
81         assert(meshlink_start(mesh1));
82         assert(meshlink_start(mesh2));
83
84         // Wait for the two to connect.
85
86         assert(wait_sync_flag(&bar_reachable, 20));
87
88         // Wait for UDP communication to become possible.
89
90         int pmtu = meshlink_get_pmtu(mesh2, meshlink_get_node(mesh2, "bar"));
91
92         for(int i = 0; i < 10 && !pmtu; i++) {
93                 sleep(1);
94                 pmtu = meshlink_get_pmtu(mesh2, meshlink_get_node(mesh2, "bar"));
95         }
96
97         assert(pmtu);
98
99         // Check that we now have reachability information
100
101         assert(meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable));
102         assert(last_reachable);
103         assert(!last_unreachable);
104
105         // Stop the meshes.
106
107         meshlink_stop(mesh1);
108         meshlink_stop(mesh2);
109
110         // Check that bar is no longer reachable
111
112         assert(!meshlink_get_node_reachability(mesh1, bar, &last_reachable, &last_unreachable));
113         assert(last_reachable);
114         assert(last_unreachable);
115         assert(last_reachable <= last_unreachable);
116
117         // Clean up.
118
119         meshlink_close(mesh2);
120         meshlink_close(mesh1);
121 }