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