]> git.meshlink.io Git - meshlink/blob - test/blackbox/test_case_optimal_pmtu_07/node_sim_peer.c
Ensure NDEBUG is not set in the test suite.
[meshlink] / test / blackbox / test_case_optimal_pmtu_07 / node_sim_peer.c
1 /*
2     node_sim_peer.c -- Implementation of Node Simulation for Meshlink Testing
3                     for meta connection test case 01 - re-connection of
4                     two nodes when relay node goes down
5     Copyright (C) 2018  Guus Sliepen <guus@meshlink.io>
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License along
18     with this program; if not, write to the Free Software Foundation, Inc.,
19     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22 #ifdef NDEBUG
23 #undef NDEBUG
24 #endif
25
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <pthread.h>
30 #include <assert.h>
31 #include <signal.h>
32 #include "../common/common_handlers.h"
33 #include "../common/test_step.h"
34 #include "../common/mesh_event_handler.h"
35 #include "../../utils.h"
36
37 #define CMD_LINE_ARG_NODENAME   1
38 #define CMD_LINE_ARG_DEVCLASS   2
39 #define CMD_LINE_ARG_CLIENTID   3
40 #define CMD_LINE_ARG_IMPORTSTR  4
41 #define CMD_LINE_ARG_INVITEURL  5
42 #define CHANNEL_PORT 1234
43
44 static struct sync_flag nut_reachable = {.mutex  = PTHREAD_MUTEX_INITIALIZER, .cond = PTHREAD_COND_INITIALIZER};
45 static struct sync_flag channel_opened = {.mutex  = PTHREAD_MUTEX_INITIALIZER, .cond = PTHREAD_COND_INITIALIZER};
46
47 static void channel_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *dat, size_t len);
48 static bool channel_accept(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *dat, size_t len);
49
50 static int client_id = -1;
51
52 static void node_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node,
53                            bool reachable) {
54         if(!strcasecmp(node->name, "nut") && reachable) {
55                 //set_sync_flag(&nut_reachable, true);
56                 mesh_event_sock_send(client_id, reachable ? NODE_JOINED : NODE_LEFT, node->name, 100);
57         }
58
59         return;
60 }
61
62 static bool channel_accept(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *dat, size_t len) {
63         (void)dat;
64         (void)len;
65
66         assert(port == CHANNEL_PORT);
67
68         if(!strcmp(channel->node->name, "nut")) {
69                 meshlink_set_channel_receive_cb(mesh, channel, channel_receive_cb);
70                 //channel->node->priv = channel;
71
72                 return true;
73         }
74
75         return false;
76 }
77
78 static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len) {
79         (void)len;
80         meshlink_set_channel_poll_cb(mesh, channel, NULL);
81         assert(meshlink_channel_send(mesh, channel, "test", 5) >= 0);
82         return;
83 }
84
85 /* channel receive callback */
86 static void channel_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *dat, size_t len) {
87         if(len == 0) {
88                 mesh_event_sock_send(client_id, ERR_NETWORK, channel->node->name, 100);
89                 return;
90         }
91
92         if(!strcmp(channel->node->name, "nut")) {
93                 if(!memcmp(dat, "reply", 5)) {
94                         set_sync_flag(&channel_opened, true);
95                 } else if(!memcmp(dat, "test", 5)) {
96                         assert(meshlink_channel_send(mesh, channel, "reply", 5) >= 0);
97                 }
98         }
99
100         return;
101 }
102
103 int main(int argc, char *argv[]) {
104         struct timeval main_loop_wait = { 2, 0 };
105
106         // Import mesh event handler
107
108         if((argv[CMD_LINE_ARG_CLIENTID]) && (argv[CMD_LINE_ARG_IMPORTSTR])) {
109                 client_id = atoi(argv[CMD_LINE_ARG_CLIENTID]);
110                 mesh_event_sock_connect(argv[CMD_LINE_ARG_IMPORTSTR]);
111         }
112
113         // Setup required signals
114
115         setup_signals();
116
117         // Run peer node instance
118
119         meshlink_handle_t *mesh = meshlink_open("testconf", argv[CMD_LINE_ARG_NODENAME],
120                                                 "test_channel_conn", atoi(argv[CMD_LINE_ARG_DEVCLASS]));
121         assert(mesh);
122         meshlink_set_log_cb(mesh, MESHLINK_DEBUG, meshlink_callback_logger);
123         meshlink_set_channel_accept_cb(mesh, channel_accept);
124         meshlink_enable_discovery(mesh, false);
125
126         if(argv[CMD_LINE_ARG_INVITEURL]) {
127                 int attempts;
128                 bool join_ret;
129
130                 for(attempts = 0; attempts < 10; attempts++) {
131                         join_ret = meshlink_join(mesh, argv[CMD_LINE_ARG_INVITEURL]);
132
133                         if(join_ret) {
134                                 break;
135                         }
136
137                         sleep(1);
138                 }
139
140                 if(attempts == 10) {
141                         abort();
142                 }
143         }
144
145         assert(meshlink_start(mesh));
146         mesh_event_sock_send(client_id, NODE_STARTED, NULL, 0);
147
148         //assert(wait_sync_flag(&nut_reachable, 10));
149
150         /*meshlink_node_t *nut_node = meshlink_get_node(mesh, "nut");
151         assert(nut_node);
152         meshlink_channel_t *channel = meshlink_channel_open(mesh, nut_node, CHANNEL_PORT,
153                                       channel_receive_cb, NULL, 0);
154         meshlink_set_channel_poll_cb(mesh, channel, poll_cb);
155
156         assert(wait_sync_flag(&channel_opened, 20));
157         mesh_event_sock_send(client_id, NODE_STARTED, NULL, 0);*/
158
159         // All test steps executed - wait for signals to stop/start or close the mesh
160
161         while(test_running) {
162                 select(1, NULL, NULL, NULL, &main_loop_wait);
163         }
164
165         meshlink_close(mesh);
166
167         return EXIT_SUCCESS;
168 }