]> git.meshlink.io Git - meshlink-tiny/blob - test/get-all-nodes.c
Add a metering test.
[meshlink-tiny] / test / get-all-nodes.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 <time.h>
11 #include <assert.h>
12
13 #include "meshlink-tiny.h"
14 #include "utils.h"
15
16 static struct sync_flag bar_reachable;
17
18 static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
19         (void)mesh;
20
21         if(reachable && !strcmp(node->name, "bar")) {
22                 set_sync_flag(&bar_reachable, true);
23         }
24 }
25
26 int main(void) {
27         init_sync_flag(&bar_reachable);
28
29         struct meshlink_node **nodes = NULL;
30         size_t nnodes = 0;
31
32         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
33
34         // Open new meshlink instances.
35
36         assert(meshlink_destroy("get_all_nodes_conf.1"));
37         assert(meshlink_destroy("get_all_nodes_conf.2"));
38         assert(meshlink_destroy("get_all_nodes_conf.3"));
39
40         meshlink_handle_t *mesh[3];
41         mesh[0] = meshlink_open("get_all_nodes_conf.1", "foo", "get-all-nodes", DEV_CLASS_BACKBONE);
42         assert(mesh[0]);
43
44         mesh[1] = meshlink_open("get_all_nodes_conf.2", "bar", "get-all-nodes", DEV_CLASS_STATIONARY);
45         assert(mesh[1]);
46
47         mesh[2] = meshlink_open("get_all_nodes_conf.3", "baz", "get-all-nodes", DEV_CLASS_STATIONARY);
48         assert(mesh[2]);
49
50         // Check that we only know about ourself.
51
52         nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
53         assert(nnodes == 1);
54         assert(nodes[0] == meshlink_get_self(mesh[0]));
55
56         // Let nodes know about each other.
57
58         for(int i = 0; i < 3; i++) {
59                 assert(meshlink_set_canonical_address(mesh[i], meshlink_get_self(mesh[i]), "localhost", NULL));
60                 char *data = meshlink_export(mesh[i]);
61                 assert(data);
62
63                 for(int j = 0; j < 3; j++) {
64                         if(i == j) {
65                                 continue;
66                         }
67
68                         assert(meshlink_import(mesh[j], data));
69                 }
70
71                 free(data);
72         }
73
74         // We should know about all nodes now, and their device class.
75
76         nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
77         assert(nnodes == 3);
78
79         nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_BACKBONE, nodes, &nnodes);
80         assert(nnodes == 1);
81         assert(nodes[0] == meshlink_get_self(mesh[0]));
82
83         nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_STATIONARY, nodes, &nnodes);
84         assert(nnodes == 2);
85
86         // Start foo.
87
88         time_t foo_started = time(NULL);
89         assert(meshlink_start(mesh[0]));
90
91         // Start bar and wait for it to connect.
92
93         meshlink_set_node_status_cb(mesh[0], status_cb);
94
95         sleep(2);
96         assert(meshlink_start(mesh[1]));
97         assert(wait_sync_flag(&bar_reachable, 20));
98         time_t bar_started = time(NULL);
99
100         // Stop bar.
101
102         meshlink_stop(mesh[1]);
103         sleep(2);
104
105         // Close and restart foo, check that it remembers correctly.
106
107         meshlink_close(mesh[0]);
108         sleep(2);
109         mesh[0] = meshlink_open("get_all_nodes_conf.1", "foo", "get-all_nodes", DEV_CLASS_BACKBONE);
110         assert(mesh[0]);
111
112         nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
113         assert(nnodes == 3);
114
115         nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_BACKBONE, nodes, &nnodes);
116         assert(nnodes == 1);
117         assert(nodes[0] == meshlink_get_self(mesh[0]));
118
119         nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_STATIONARY, nodes, &nnodes);
120         assert(nnodes == 2);
121
122         // Clean up.
123
124         for(int i = 0; i < 3; i++) {
125                 meshlink_close(mesh[i]);
126         }
127 }