]> git.meshlink.io Git - meshlink/blob - test/channels-no-partial.c
Allow meshlink_open() to be called with a NULL name.
[meshlink] / test / channels-no-partial.c
1 #ifdef NDEBUG
2 #undef NDEBUG
3 #endif
4
5 #include <assert.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/time.h>
11
12 #include "meshlink.h"
13 #include "utils.h"
14
15 static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
16         (void)mesh;
17         (void)channel;
18         (void)port;
19         (void)data;
20         (void)len;
21
22         return true;
23 }
24
25 int main(int argc, char *argv[]) {
26         (void)argc;
27         (void)argv;
28
29         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
30
31         // Start two new meshlink instance.
32
33         meshlink_handle_t *mesh_a;
34         meshlink_handle_t *mesh_b;
35
36         open_meshlink_pair(&mesh_a, &mesh_b, "channels_no_partial");
37         meshlink_set_channel_accept_cb(mesh_b, accept_cb);
38         start_meshlink_pair(mesh_a, mesh_b);
39
40         // Open a channel
41
42         meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
43         assert(b);
44
45         meshlink_channel_t *channel = meshlink_channel_open_ex(mesh_a, b, 1, NULL, NULL, 0, MESHLINK_CHANNEL_TCP | MESHLINK_CHANNEL_NO_PARTIAL);
46         assert(channel);
47
48         // Stop a to ensure we get deterministic behaviour for the channel send queue.
49
50         meshlink_stop(mesh_a);
51
52         // Verify that no partial sends succeed.
53         // If rejected sends would fit an empty send buffer, 0 should be returned, otherwise -1.
54
55         char buf[512] = "data";
56
57         meshlink_set_channel_sndbuf(mesh_a, channel, 256);
58         assert(meshlink_channel_send(mesh_a, channel, buf, 257) == -1);
59         assert(meshlink_channel_send(mesh_a, channel, buf, 256) == 256);
60
61         meshlink_set_channel_sndbuf(mesh_a, channel, 512);
62         assert(meshlink_channel_send(mesh_a, channel, buf, 257) == 0);
63         assert(meshlink_channel_send(mesh_a, channel, buf, 128) == 128);
64         assert(meshlink_channel_send(mesh_a, channel, buf, 129) == 0);
65         assert(meshlink_channel_send(mesh_a, channel, buf, 100) == 100);
66         assert(meshlink_channel_send(mesh_a, channel, buf, 29) == 0);
67         assert(meshlink_channel_send(mesh_a, channel, buf, 513) == -1);
68
69         // Restart a to ensure it gets to flush the channel send queue.
70
71         assert(meshlink_start(mesh_a));
72
73         assert_after(!meshlink_channel_get_sendq(mesh_a, channel), 30);
74         assert(meshlink_channel_send(mesh_a, channel, buf, 512) == 512);
75
76         // Clean up.
77
78         close_meshlink_pair(mesh_a, mesh_b);
79 }