]> git.meshlink.io Git - meshlink/blob - test/meta-connections.c
Never automatically try to bind to ports >= 32768.
[meshlink] / test / meta-connections.c
1 #ifdef NDEBUG
2 #undef NDEBUG
3 #endif
4
5 #include <assert.h>
6 #include <stdio.h>
7 #include <string.h>
8
9 #include "meshlink.h"
10 #include "devtools.h"
11 #include "netns_utils.h"
12 #include "utils.h"
13
14 static struct sync_flag peer_reachable;
15 static struct sync_flag peer_unreachable;
16
17 static void nut_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
18         (void)mesh;
19
20         if(!strcmp(node->name, "peer")) {
21                 set_sync_flag(reachable ? &peer_reachable : &peer_unreachable, true);
22         }
23 }
24
25 int main(void) {
26         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
27
28         init_sync_flag(&peer_reachable);
29         init_sync_flag(&peer_unreachable);
30
31         // Set up relay, peer and NUT
32         peer_config_t *peers = setup_relay_peer_nut("metaconn");
33
34         // Wait for peer to connect to NUT
35         devtool_set_meta_status_cb(peers[2].mesh, nut_status_cb);
36
37         for(int i = 0; i < 3; i++) {
38                 assert(meshlink_start(peers[i].mesh));
39         }
40
41         assert(wait_sync_flag(&peer_reachable, 5));
42
43         // Test case #1: re-connection to peer after disconnection when connected to the relay node
44
45         // Stop the peer and wait for it to become unreachable
46         reset_sync_flag(&peer_unreachable);
47         meshlink_stop(peers[1].mesh);
48         assert(wait_sync_flag(&peer_unreachable, 5));
49
50         // Restart the peer and wait for it to become reachable
51         reset_sync_flag(&peer_reachable);
52         assert(meshlink_start(peers[1].mesh));
53         assert(wait_sync_flag(&peer_reachable, 5));
54
55         // Test case #2: re-connection to peer after changing peer and NUT's IP address simultaneously,
56         //               while connected to the relay
57
58         reset_sync_flag(&peer_reachable);
59         reset_sync_flag(&peer_unreachable);
60
61         for(int i = 1; i < 3; i++) {
62                 change_peer_ip(&peers[i]);
63         }
64
65         for(int i = 1; i < 3; i++) {
66                 meshlink_reset_timers(peers[i].mesh);
67         }
68
69         assert(wait_sync_flag(&peer_unreachable, 75));
70         assert(wait_sync_flag(&peer_reachable, 15));
71
72         // Test case #3: re-connect to peer after stopping NUT and changing peer's IP address, no relay
73         reset_sync_flag(&peer_unreachable);
74
75         for(int i = 0; i < 2; i++) {
76                 meshlink_stop(peers[i].mesh);
77         }
78
79         change_peer_ip(&peers[1]);
80         assert(wait_sync_flag(&peer_unreachable, 15));
81
82         reset_sync_flag(&peer_reachable);
83         assert(meshlink_start(peers[1].mesh));
84         assert(wait_sync_flag(&peer_reachable, 60));
85
86         // Done.
87
88         close_relay_peer_nut(peers);
89 }