<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12837">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add stream client/server test<br><br>Previously stream client and server code were only used in examples<br>which means regressions could be easily introduced unnoticed until they<br>trigger bugs in external code which relies on osmo_stream_*()<br><br>Fix this by adding basic client-server interaction test with single<br>reconnection iteration.<br><br>Change-Id: I336f79970982ed8e1d73b73d54fa4c27ba8bce8e<br>---<br>M tests/Makefile.am<br>A tests/stream/stream_test.c<br>A tests/stream/stream_test.ok<br>M tests/testsuite.at<br>4 files changed, 298 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/37/12837/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 03a7a3c..c85c103 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -1,7 +1,7 @@</span><br><span> AM_CFLAGS = -Wall -I$(top_srcdir)/include $(LIBOSMOCORE_CFLAGS) -g</span><br><span> AM_LDFLAGS = $(LIBOSMOCORE_LDFLAGS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-check_PROGRAMS = osmux/osmux_test osmux/osmux_test2 jibuf/jibuf_test</span><br><span style="color: hsl(120, 100%, 40%);">+check_PROGRAMS = osmux/osmux_test osmux/osmux_test2 stream/stream_test jibuf/jibuf_test</span><br><span> check_HEADERS =</span><br><span> </span><br><span> osmux_osmux_test_SOURCES = osmux/osmux_test.c</span><br><span>@@ -10,6 +10,9 @@</span><br><span> osmux_osmux_test2_SOURCES = osmux/osmux_test2.c</span><br><span> osmux_osmux_test2_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+stream_stream_test_SOURCES = stream/stream_test.c</span><br><span style="color: hsl(120, 100%, 40%);">+stream_stream_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> jibuf_jibuf_test_SOURCES = jibuf/jibuf_test.c</span><br><span> jibuf_jibuf_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la</span><br><span> </span><br><span>diff --git a/tests/stream/stream_test.c b/tests/stream/stream_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ed3e9ea</span><br><span>--- /dev/null</span><br><span>+++ b/tests/stream/stream_test.c</span><br><span>@@ -0,0 +1,232 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by sysmocom - s.f.m.c. GmbH.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Max Suraev</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/netif/stream.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define DSTREAMTEST 0</span><br><span style="color: hsl(120, 100%, 40%);">+struct log_info_cat osmo_stream_test_cat[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  [DSTREAMTEST] = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "DSTREAMTEST",</span><br><span style="color: hsl(120, 100%, 40%);">+              .description = "STREAM test",</span><br><span style="color: hsl(120, 100%, 40%);">+               .color = "\033[1;35m",</span><br><span style="color: hsl(120, 100%, 40%);">+              .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct log_info osmo_stream_test_log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .filter_fn = NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+    .cat = osmo_stream_test_cat,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_cat = ARRAY_SIZE(osmo_stream_test_cat),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void sighandler(int foo)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DSTREAMTEST, LOGL_NOTICE, "Signal received: closing stream.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       exit(EXIT_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *make_msgb(const char *m)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct msgb *msg = msgb_alloc(512, "STREAM test");</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Unable to allocate message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (m)</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_printf(msg, "%s", m);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return msg;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* client callbacks */</span><br><span style="color: hsl(120, 100%, 40%);">+static int connect_cb_cli(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  void *cli_data = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("\nClient's connect() callback triggered [%s]\n", cli_data ? "OK" : "NA");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int read_cb_cli(struct osmo_stream_cli *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+    void *cli_data = osmo_stream_cli_get_data(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg = make_msgb(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Client's read() callback triggered\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bytes = osmo_stream_cli_recv(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (bytes < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Unable to receive message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bytes)</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Client received %d(%d) bytes: %s\n", bytes, msg->len, msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Client received 0 bytes\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* N. B: do not dereference opaque pointer itself as it might be invalid by the time callback is triggered! */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!cli_data) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* we reply to trigger server's read() callback */</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("Client's initial connection, contacting server\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             msgb_reset(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_stream_cli_set_data(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_printf(msg, "%s", "Doh, responding to server :-D");</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Client sent %d bytes message: %s\n", msg->len, msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stream_cli_send(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Client's subsequent connection, closing link\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stream_cli_close(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* server callbacks */</span><br><span style="color: hsl(120, 100%, 40%);">+int read_cb_srv(struct osmo_stream_srv *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg = make_msgb(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Server's read() callback triggered\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bytes = osmo_stream_srv_recv(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (bytes <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bytes < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf("Unable to receive message: %s\n", strerror(-bytes));</span><br><span style="color: hsl(120, 100%, 40%);">+                else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("client have already closed connection\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* if client have already closed the connection, than it must be subsequent (after reconnect)</span><br><span style="color: hsl(120, 100%, 40%);">+                    call - we indicate this to outer loop by clearing opaque pointer */</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_stream_srv_link_set_data(osmo_stream_srv_get_master(conn), NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_stream_srv_destroy(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("Server received %d(%d) bytes: %s\n", bytes, msg->len, msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Server: force client disconnect\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_srv_destroy(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int close_cb_srv(struct osmo_stream_srv *ignored)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Server's close() callback triggered\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int accept_cb_srv(struct osmo_stream_srv_link *srv, int fd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ void *ctx = osmo_stream_srv_link_get_data(srv);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg = make_msgb("Lol, connection accepted :)");</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_stream_srv *conn = osmo_stream_srv_create(ctx, srv, fd, read_cb_srv, close_cb_srv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("error while creating connection\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Server's accept() callback triggered\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* we initiate transmission which will trigger client's read() callback */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Server sent %d bytes message: %s\n", msg->len, msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stream_srv_send(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned steps = 16, port = 1111; /* Make sure to use sufficient number of steps */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_stream_srv_link *srv;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_stream_cli *cli;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *host = "127.0.0.11";</span><br><span style="color: hsl(120, 100%, 40%);">+  void *tall_test = talloc_named_const(NULL, 1, "osmo_stream_test");</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_talloc_ctx_init(tall_test, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_init_logging2(tall_test, &osmo_stream_test_log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_log_level(osmo_stderr_target, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Prepare stream client...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       cli = osmo_stream_cli_create(tall_test);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!cli) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Unable to create client\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return EXIT_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stream_cli_set_addr(cli, host);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stream_cli_set_port(cli, port);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stream_cli_set_connect_cb(cli, connect_cb_cli);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stream_cli_set_read_cb(cli, read_cb_cli);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_cli_set_reconnect_timeout(cli, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (osmo_stream_cli_open(cli) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("Unable to open client\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return EXIT_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Prepare stream server...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       srv = osmo_stream_srv_link_create(tall_test);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!srv) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Unable to create server\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return EXIT_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stream_srv_link_set_addr(srv, host);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stream_srv_link_set_port(srv, port);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stream_srv_link_set_data(srv, tall_test);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stream_srv_link_set_accept_cb(srv, accept_cb_srv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (osmo_stream_srv_link_open(srv) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Unable to open server\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return EXIT_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Entering main test loop...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while(steps--) {</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_select_main(0);</span><br><span style="color: hsl(120, 100%, 40%);">+          void *srv_data = osmo_stream_srv_link_get_data(srv);</span><br><span style="color: hsl(120, 100%, 40%);">+          void *cli_data = osmo_stream_cli_get_data(cli);</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("\nTest step %u [client %s, server %s]\n", steps, cli_data ? "OK" : "NA", srv_data ? "OK" : "NA");</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!srv_data) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf("Server requested test termination\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      steps = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("Test finished\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return EXIT_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/stream/stream_test.ok b/tests/stream/stream_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..9c4ba1f</span><br><span>--- /dev/null</span><br><span>+++ b/tests/stream/stream_test.ok</span><br><span>@@ -0,0 +1,56 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Prepare stream client...</span><br><span style="color: hsl(120, 100%, 40%);">+Prepare stream server...</span><br><span style="color: hsl(120, 100%, 40%);">+Entering main test loop...</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 15 [client NA, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 14 [client NA, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Server's accept() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Server sent 27 bytes message: 4c 6f 6c 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 63 63 65 70 74 65 64 20 3a 29 </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Client's connect() callback triggered [NA]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 13 [client NA, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 12 [client NA, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Client's read() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Client received 27(27) bytes: 4c 6f 6c 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 63 63 65 70 74 65 64 20 3a 29 </span><br><span style="color: hsl(120, 100%, 40%);">+Client's initial connection, contacting server</span><br><span style="color: hsl(120, 100%, 40%);">+Client sent 29 bytes message: 44 6f 68 2c 20 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 73 65 72 76 65 72 20 3a 2d 44 </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 11 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 10 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Server's read() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Server received 29(29) bytes: 44 6f 68 2c 20 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 73 65 72 76 65 72 20 3a 2d 44 </span><br><span style="color: hsl(120, 100%, 40%);">+Server: force client disconnect</span><br><span style="color: hsl(120, 100%, 40%);">+Server's close() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 9 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Client's read() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Client received 0 bytes</span><br><span style="color: hsl(120, 100%, 40%);">+Client's subsequent connection, closing link</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 8 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 7 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Server's accept() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Server sent 27 bytes message: 4c 6f 6c 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 63 63 65 70 74 65 64 20 3a 29 </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Client's connect() callback triggered [OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 6 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 5 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Client's read() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+Client received 27(27) bytes: 4c 6f 6c 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 63 63 65 70 74 65 64 20 3a 29 </span><br><span style="color: hsl(120, 100%, 40%);">+Client's subsequent connection, closing link</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 4 [client OK, server OK]</span><br><span style="color: hsl(120, 100%, 40%);">+Server's read() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+client have already closed connection</span><br><span style="color: hsl(120, 100%, 40%);">+Server's close() callback triggered</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Test step 3 [client OK, server NA]</span><br><span style="color: hsl(120, 100%, 40%);">+Server requested test termination</span><br><span style="color: hsl(120, 100%, 40%);">+Test finished</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 67b91c6..63e2f03 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -7,6 +7,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/osmux/osmux_test], [0], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([stream_test])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([stream_test])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/stream/stream_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/stream/stream_test], [0], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([osmux_test2])</span><br><span> AT_KEYWORDS([osmux_test2])</span><br><span> cat $abs_srcdir/osmux/osmux_test2.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12837">change 12837</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12837"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-netif </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I336f79970982ed8e1d73b73d54fa4c27ba8bce8e </div>
<div style="display:none"> Gerrit-Change-Number: 12837 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>