]> git.meshlink.io Git - utcp/blob - selftest.c
Various small fixes, clarifications.
[utcp] / selftest.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5 #include <errno.h>
6
7 #include "utcp.h"
8
9 struct utcp *a;
10 struct utcp *b;
11 struct utcp_connection *c;
12
13 ssize_t do_recv(struct utcp_connection *x, const void *data, size_t len) {
14         if(!len) {
15                 if(errno)
16                         fprintf(stderr, "%p Error: %s\n", x->utcp, strerror(errno));
17                 else
18                         fprintf(stderr, "%p Connection closed by peer\n", x->utcp);
19                 if(x != c) {
20                         fprintf(stderr, "closing my side too...\n");
21                         utcp_close(x);
22                 }
23                 return -1;
24         }
25
26         if(x == c)
27                 return write(0, data, len);
28         else
29                 return utcp_send(x, data, len);
30 }
31
32 bool do_pre_accept(struct utcp *utcp, uint16_t port) {
33         fprintf(stderr, "pre-accept\n");
34         if(port != 7)
35                 return false;
36         return true;
37 }
38
39 void do_accept(struct utcp_connection *c, uint16_t port) {
40         fprintf(stderr, "accept\n");
41         utcp_accept(c, do_recv, NULL);
42 }
43
44 ssize_t do_send(struct utcp *utcp, const void *data, size_t len) {
45         static int count = 0;
46         if(++count > 1000) {
47                 fprintf(stderr, "Too many packets!\n");
48                 abort();
49         }
50
51         if(utcp == a)
52                 return utcp_recv(b, data, len);
53         else
54                 return utcp_recv(a, data, len);
55 }
56
57 int main(int argc, char *argv[]) {
58         srand(time(NULL));
59
60         a = utcp_init(do_accept, do_pre_accept, do_send, NULL);
61         b = utcp_init(NULL, NULL, do_send, NULL);
62
63         fprintf(stderr, "Testing connection to closed port\n\n");
64         c = utcp_connect(b, 6, do_recv, NULL);
65
66         fprintf(stderr, "\nTesting conection to non-listening side\n\n");
67         c = utcp_connect(a, 7, do_recv, NULL);
68
69         fprintf(stderr, "\nTesting connection to open port, close\n\n");
70         c = utcp_connect(b, 7, do_recv, NULL);
71         fprintf(stderr, "closing...\n");
72         utcp_close(c);
73
74         fprintf(stderr, "\nTesting connection to open port, abort\n\n");
75         c = utcp_connect(b, 7, do_recv, NULL);
76         fprintf(stderr, "aborting...\n");
77         utcp_abort(c);
78
79         fprintf(stderr, "\nTesting connection with data transfer\n\n");
80
81         c = utcp_connect(b, 7, do_recv, NULL);
82         ssize_t len = utcp_send(c, "Hello world!\n", 13);
83
84         if(len != 13) {
85                 if(len < 0)
86                         fprintf(stderr, "Error: %s\n", strerror(errno));
87                 else
88                         fprintf(stderr, "Short write %zd!\n", len);
89         }
90         len = utcp_send(c, "This is a test.\n", 16);
91
92         if(len != 16) {
93                 if(len < 0)
94                         fprintf(stderr, "Error: %s\n", strerror(errno));
95                 else
96                         fprintf(stderr, "Short write %zd!\n", len);
97         }
98
99         fprintf(stderr, "closing...\n");
100         utcp_close(c);
101
102         fprintf(stderr, "\nTesting connection with huge data transfer\n\n");
103
104         c = utcp_connect(b, 7, do_recv, NULL);
105         utcp_set_sndbuf(c, 10240);
106         char buf[20480] = "buf";
107
108         len = utcp_send(c, buf, sizeof buf);
109         if(len != 10240)
110                 fprintf(stderr, "Error: utcp_send() returned %zd, expected 10240\n", len);
111
112         fprintf(stderr, "closing...\n");
113         utcp_close(c);
114
115         utcp_exit(a);
116         utcp_exit(b);
117
118         return 0;
119 }