]> git.meshlink.io Git - meshlink/blob - test/channels-no-partial.c
Fix retransmission timeout calculation in UTCP.
[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         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
26
27         // Start two new meshlink instance.
28
29         meshlink_handle_t *mesh_a;
30         meshlink_handle_t *mesh_b;
31
32         open_meshlink_pair(&mesh_a, &mesh_b, "channels_no_partial");
33         meshlink_set_channel_accept_cb(mesh_b, accept_cb);
34         start_meshlink_pair(mesh_a, mesh_b);
35
36         // Open a channel
37
38         meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
39         assert(b);
40
41         meshlink_channel_t *channel = meshlink_channel_open_ex(mesh_a, b, 1, NULL, NULL, 0, MESHLINK_CHANNEL_TCP | MESHLINK_CHANNEL_NO_PARTIAL);
42         assert(channel);
43
44         // Stop a to ensure we get deterministic behaviour for the channel send queue.
45
46         meshlink_stop(mesh_a);
47
48         // Verify that no partial sends succeed.
49         // If rejected sends would fit an empty send buffer, 0 should be returned, otherwise -1.
50
51         char buf[512] = "data";
52
53         meshlink_set_channel_sndbuf(mesh_a, channel, 256);
54         assert(meshlink_channel_send(mesh_a, channel, buf, 257) == -1);
55         assert(meshlink_channel_send(mesh_a, channel, buf, 256) == 256);
56
57         meshlink_set_channel_sndbuf(mesh_a, channel, 512);
58         assert(meshlink_channel_send(mesh_a, channel, buf, 257) == 0);
59         assert(meshlink_channel_send(mesh_a, channel, buf, 128) == 128);
60         assert(meshlink_channel_send(mesh_a, channel, buf, 129) == 0);
61         assert(meshlink_channel_send(mesh_a, channel, buf, 100) == 100);
62         assert(meshlink_channel_send(mesh_a, channel, buf, 29) == 0);
63         assert(meshlink_channel_send(mesh_a, channel, buf, 513) == -1);
64
65         // Restart a to ensure it gets to flush the channel send queue.
66
67         meshlink_start(mesh_a);
68
69         assert_after(!meshlink_channel_get_sendq(mesh_a, channel), 30);
70         assert(meshlink_channel_send(mesh_a, channel, buf, 512) == 512);
71
72         // Clean up.
73
74         close_meshlink_pair(mesh_a, mesh_b);
75 }