]> git.meshlink.io Git - meshlink/blob - test/channels.c
Refactor the non-blackbox test suite.
[meshlink] / test / channels.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/time.h>
6 #include <assert.h>
7
8 #include "utils.h"
9 #include "../src/meshlink.h"
10
11 static struct sync_flag b_responded;
12
13 static void a_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
14         (void)mesh;
15         (void)channel;
16
17         printf("a_receive_cb %zu: ", len);
18         fwrite(data, 1, len, stdout);
19         printf("\n");
20
21         if(len == 5 && !memcmp(data, "Hello", 5)) {
22                 set_sync_flag(&b_responded, true);
23         }
24 }
25
26 static void b_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
27         printf("b_receive_cb %zu: ", len);
28         fwrite(data, 1, len, stdout);
29         printf("\n");
30         // Echo the data back.
31         meshlink_channel_send(mesh, channel, data, len);
32 }
33
34 static bool reject_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
35         (void)mesh;
36         (void)channel;
37         (void)port;
38         (void)data;
39         (void)len;
40
41         return false;
42 }
43
44 static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
45         printf("accept_cb: (from %s on port %u) ", channel->node->name, (unsigned int)port);
46
47         if(data) {
48                 fwrite(data, 1, len, stdout);
49         }
50
51         printf("\n");
52
53         if(port != 7) {
54                 return false;
55         }
56
57         meshlink_set_channel_receive_cb(mesh, channel, b_receive_cb);
58
59         if(data) {
60                 b_receive_cb(mesh, channel, data, len);
61         }
62
63         return true;
64 }
65
66 static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len) {
67         (void)len;
68
69         meshlink_set_channel_poll_cb(mesh, channel, NULL);
70
71         assert(meshlink_channel_send(mesh, channel, "Hello", 5) == 5);
72 }
73
74 int main() {
75         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
76
77         // Open two new meshlink instance.
78
79         meshlink_handle_t *mesh_a, *mesh_b;
80         open_meshlink_pair(&mesh_a, &mesh_b, "channels");
81
82         // Set the callbacks.
83
84         meshlink_set_channel_accept_cb(mesh_a, reject_cb);
85         meshlink_set_channel_accept_cb(mesh_b, accept_cb);
86
87         // Start both instances
88
89         start_meshlink_pair(mesh_a, mesh_b);
90
91         // Open a channel from a to b.
92
93         meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
94         assert(b);
95
96         meshlink_channel_t *channel = meshlink_channel_open(mesh_a, b, 7, a_receive_cb, NULL, 0);
97         assert(channel);
98
99         meshlink_set_channel_poll_cb(mesh_a, channel, poll_cb);
100         assert(wait_sync_flag(&b_responded, 20));
101
102         meshlink_channel_close(mesh_a, channel);
103
104         // Clean up.
105
106         close_meshlink_pair(mesh_a, mesh_b);
107 }