]> git.meshlink.io Git - utcp/blobdiff - test.c
Add UDP semantics.
[utcp] / test.c
diff --git a/test.c b/test.c
index 3491e296c9a558a6b587d63cec23702f65ec4b21..4e65c1046344ab692d3489ef0f12cd3e763a9715 100644 (file)
--- a/test.c
+++ b/test.c
@@ -25,16 +25,18 @@ long outpktno;
 long dropfrom;
 long dropto;
 double reorder;
-long reorder_dist;
+long reorder_dist = 10;
 double dropin;
 double dropout;
 long total_out;
 long total_in;
+FILE *reference;
 
 char *reorder_data;
 size_t reorder_len;
 int reorder_countdown;
 
+#if UTCP_DEBUG
 void debug(const char *format, ...) {
        struct timeval now;
        gettimeofday(&now, NULL);
@@ -44,6 +46,9 @@ void debug(const char *format, ...) {
        vfprintf(stderr, format, ap);
        va_end(ap);
 }
+#else
+#define debug(...)
+#endif
 
 ssize_t do_recv(struct utcp_connection *c, const void *data, size_t len) {
        if(!data || !len) {
@@ -56,6 +61,17 @@ ssize_t do_recv(struct utcp_connection *c, const void *data, size_t len) {
                }
                return -1;
        }
+       if(reference) {
+               char buf[len];
+               if(fread(buf, len, 1, reference) != 1) {
+                       debug("Error reading reference\n");
+                       abort();
+               }
+               if(memcmp(buf, data, len)) {
+                       debug("Received data differs from reference\n");
+                       abort();
+               }
+       }
        return write(1, data, len);
 }
 
@@ -69,8 +85,10 @@ ssize_t do_send(struct utcp *utcp, const void *data, size_t len) {
        int s = *(int *)utcp->priv;
        outpktno++;
        if(outpktno >= dropfrom && outpktno < dropto) {
-               if(drand48() < dropout)
+               if(drand48() < dropout) {
+                       debug("Dropped outgoing packet\n");
                        return len;
+               }
                if(!reorder_data && drand48() < reorder) {
                        reorder_data = malloc(len);
                        if(!reorder_data) {
@@ -109,13 +127,21 @@ int main(int argc, char *argv[]) {
 
        bool server = argc == 2;
        bool connected = false;
-
-       dropin = atof(getenv("DROPIN") ?: "0");
-       dropout = atof(getenv("DROPOUT") ?: "0");
-       dropfrom = atoi(getenv("DROPFROM") ?: "0");
-       dropto = atoi(getenv("DROPTO") ?: "0");
-       reorder = atof(getenv("REORDER") ?: "0");
-       reorder_dist = atoi(getenv("REORDER_DIST") ?: "10");
+       uint32_t flags = UTCP_TCP;
+       size_t read_size = 102400;
+
+       if(getenv("DROPIN")) dropin = atof(getenv("DROPIN"));
+       if(getenv("DROPOUT")) dropout = atof(getenv("DROPOUT"));
+       if(getenv("DROPFROM")) dropfrom = atoi(getenv("DROPFROM"));
+       if(getenv("DROPTO")) dropto = atoi(getenv("DROPTO"));
+       if(getenv("REORDER")) reorder = atof(getenv("REORDER"));
+       if(getenv("REORDER_DIST")) reorder_dist = atoi(getenv("REORDER_DIST"));
+       if(getenv("FLAGS")) flags = atoi(getenv("FLAGS"));
+       if(getenv("READ_SIZE")) read_size = atoi(getenv("READ_SIZE"));
+
+       char *reference_filename = getenv("REFERENCE");
+       if(reference_filename)
+               reference = fopen(reference_filename, "r");
 
        if(dropto < dropfrom)
                dropto = 1 << 30;
@@ -153,7 +179,7 @@ int main(int argc, char *argv[]) {
        utcp_set_user_timeout(u, 10);
 
        if(!server)
-               c = utcp_connect(u, 1, do_recv, NULL);
+               c = utcp_connect_ex(u, 1, do_recv, NULL, flags);
 
        struct pollfd fds[2] = {
                {.fd = 0, .events = POLLIN | POLLERR | POLLHUP},
@@ -167,6 +193,8 @@ int main(int argc, char *argv[]) {
                size_t max = c ? utcp_get_sndbuf_free(c) : 0;
                if(max > sizeof buf)
                        max = sizeof buf;
+               if(max > read_size)
+                       max = read_size;
 
                int timeout_ms = timeout.tv_sec * 1000 + timeout.tv_usec / 1000 + 1;
 
@@ -213,7 +241,10 @@ int main(int argc, char *argv[]) {
                        inpktno++;
                        if(inpktno >= dropto || inpktno < dropfrom || drand48() >= dropin) {
                                total_in += len;
-                               utcp_recv(u, buf, len);
+                               if(utcp_recv(u, buf, len) == -1)
+                                       debug("Error receiving UTCP packet: %s\n", strerror(errno));
+                       } else {
+                               debug("Dropped incoming packet\n");
                        }
                }