13 #include "meshlink-tiny.h"
16 static struct sync_flag bar_reachable;
18 static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
21 if(reachable && !strcmp(node->name, "bar")) {
22 set_sync_flag(&bar_reachable, true);
27 init_sync_flag(&bar_reachable);
29 struct meshlink_node **nodes = NULL;
32 meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
34 // Open new meshlink instances.
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"));
40 meshlink_handle_t *mesh[3];
41 mesh[0] = meshlink_open("get_all_nodes_conf.1", "foo", "get-all-nodes", DEV_CLASS_BACKBONE);
44 mesh[1] = meshlink_open("get_all_nodes_conf.2", "bar", "get-all-nodes", DEV_CLASS_STATIONARY);
47 mesh[2] = meshlink_open("get_all_nodes_conf.3", "baz", "get-all-nodes", DEV_CLASS_STATIONARY);
50 // Check that we only know about ourself.
52 nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
54 assert(nodes[0] == meshlink_get_self(mesh[0]));
56 // Let nodes know about each other.
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]);
63 for(int j = 0; j < 3; j++) {
68 assert(meshlink_import(mesh[j], data));
74 // We should know about all nodes now, and their device class.
76 nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
79 nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_BACKBONE, nodes, &nnodes);
81 assert(nodes[0] == meshlink_get_self(mesh[0]));
83 nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_STATIONARY, nodes, &nnodes);
88 time_t foo_started = time(NULL);
89 assert(meshlink_start(mesh[0]));
91 // Start bar and wait for it to connect.
93 meshlink_set_node_status_cb(mesh[0], status_cb);
96 assert(meshlink_start(mesh[1]));
97 assert(wait_sync_flag(&bar_reachable, 20));
98 time_t bar_started = time(NULL);
102 meshlink_stop(mesh[1]);
105 // Close and restart foo, check that it remembers correctly.
107 meshlink_close(mesh[0]);
109 mesh[0] = meshlink_open("get_all_nodes_conf.1", "foo", "get-all_nodes", DEV_CLASS_BACKBONE);
112 nodes = meshlink_get_all_nodes(mesh[0], nodes, &nnodes);
115 nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_BACKBONE, nodes, &nnodes);
117 assert(nodes[0] == meshlink_get_self(mesh[0]));
119 nodes = meshlink_get_all_nodes_by_dev_class(mesh[0], DEV_CLASS_STATIONARY, nodes, &nnodes);
124 for(int i = 0; i < 3; i++) {
125 meshlink_close(mesh[i]);