[vlc-commits] HTTP/2 output queue test

Rémi Denis-Courmont git at videolan.org
Sun Dec 13 17:20:29 CET 2015


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Dec  7 22:25:22 2015 +0200| [56c2ee0c098a2ab866ef9e16170b2b0dace04813] | committer: Rémi Denis-Courmont

HTTP/2 output queue test

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=56c2ee0c098a2ab866ef9e16170b2b0dace04813
---

 modules/access/http/Makefile.am     |    9 +-
 modules/access/http/h2output_test.c |  165 +++++++++++++++++++++++++++++++++++
 2 files changed, 172 insertions(+), 2 deletions(-)

diff --git a/modules/access/http/Makefile.am b/modules/access/http/Makefile.am
index 9b242c1..5ada7db 100644
--- a/modules/access/http/Makefile.am
+++ b/modules/access/http/Makefile.am
@@ -5,5 +5,10 @@ hpackenc_test_CFLAGS = -DENC_TEST
 h2frame_test_SOURCES = access/http/h2frame_test.c \
 	access/http/hpack.c access/http/hpack.h access/http/hpackenc.c \
 	access/http/h2frame.c access/http/h2frame.h
-check_PROGRAMS += hpack_test hpackenc_test h2frame_test
-TESTS += hpack_test hpackenc_test h2frame_test
+h2output_test_SOURCES = access/http/h2output_test.c \
+	access/http/hpack.c access/http/hpack.h access/http/hpackenc.c \
+	access/http/h2frame.c access/http/h2frame.h \
+	access/http/h2output.c access/http/h2output.h
+h2output_test_LDADD = $(LIBPTHREAD)
+check_PROGRAMS += hpack_test hpackenc_test h2frame_test h2output_test
+TESTS += hpack_test hpackenc_test h2frame_test h2output_test
diff --git a/modules/access/http/h2output_test.c b/modules/access/http/h2output_test.c
new file mode 100644
index 0000000..6577801
--- /dev/null
+++ b/modules/access/http/h2output_test.c
@@ -0,0 +1,165 @@
+/*****************************************************************************
+ * h2output_test.c: HTTP/2 send queue test
+ *****************************************************************************
+ * Copyright (C) 2015 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#undef NDEBUG
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <vlc_common.h>
+#include "h2frame.h"
+#include "h2output.h"
+#include "transport.h"
+
+#undef msleep
+
+static unsigned char counter = 0;
+static bool send_failure = false;
+static bool expect_hello = true;
+static vlc_sem_t rx;
+
+/* Callback for sent frames */
+ssize_t vlc_https_send(struct vlc_tls *tls, const void *buf, size_t len)
+{
+    const uint8_t *p = buf;
+
+    assert(tls == NULL);
+
+    if (expect_hello)
+    {
+        assert(len >= 24);
+        assert(!memcmp(p, "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n", 24));
+
+        expect_hello = false;
+        vlc_sem_post(&rx);
+
+        if (len == 24)
+            return send_failure ? -1 : (ssize_t)len;
+
+        p += 24;
+        len -= 24;
+    }
+
+    assert(len == 9 + 1);
+    assert(p[9] == counter);
+
+    counter++;
+    vlc_sem_post(&rx);
+    return send_failure ? -1 : (ssize_t)len;
+}
+
+static struct vlc_h2_frame *frame(unsigned char c)
+{
+    struct vlc_h2_frame *f = vlc_h2_frame_data(1, &c, 1, false);
+    assert(f != NULL);
+    return f;
+}
+
+static struct vlc_h2_frame *frame_list(struct vlc_h2_frame *first, ...)
+{
+    struct vlc_h2_frame **pp = &first;
+    va_list ap;
+
+    va_start(ap, first);
+    for (struct vlc_h2_frame *f = first;
+         f != NULL;
+         f = va_arg(ap, struct vlc_h2_frame *))
+    {
+        *pp = f;
+        pp = &f->next;
+    }
+    va_end(ap);
+    return first;
+}
+
+int main(void)
+{
+    struct vlc_h2_output *out;
+
+    /* Dummy */
+    out = vlc_h2_output_create(NULL, false);
+    assert(out != NULL);
+    vlc_h2_output_destroy(out);
+
+    vlc_sem_init(&rx, 0);
+    out = vlc_h2_output_create(NULL, expect_hello = true);
+    assert(out != NULL);
+    vlc_h2_output_destroy(out);
+    vlc_sem_destroy(&rx);
+
+    /* Success */
+    vlc_sem_init(&rx, 0);
+    out = vlc_h2_output_create(NULL, false);
+    assert(out != NULL);
+    assert(vlc_h2_output_send_prio(out, NULL) == -1);
+    assert(vlc_h2_output_send_prio(out, frame(0)) == 0);
+    assert(vlc_h2_output_send_prio(out, frame(1)) == 0);
+    assert(vlc_h2_output_send(out, NULL) == -1);
+    assert(vlc_h2_output_send(out, frame(2)) == 0);
+    assert(vlc_h2_output_send(out, frame(3)) == 0);
+    assert(vlc_h2_output_send(out, frame_list(frame(4), frame(5),
+                                              frame(6), NULL)) == 0);
+    assert(vlc_h2_output_send(out, frame(7)) == 0);
+    for (unsigned i = 0; i < 8; i++)
+        vlc_sem_wait(&rx);
+
+    assert(vlc_h2_output_send_prio(out, frame(8)) == 0);
+    assert(vlc_h2_output_send(out, frame(9)) == 0);
+
+    vlc_h2_output_destroy(out);
+    vlc_sem_destroy(&rx);
+
+    /* Failure */
+    send_failure = true;
+
+    vlc_sem_init(&rx, 0);
+    counter = 10;
+    out = vlc_h2_output_create(NULL, false);
+    assert(out != NULL);
+
+    assert(vlc_h2_output_send(out, frame(10)) == 0);
+    for (unsigned char i = 11; vlc_h2_output_send(out, frame(i)) == 0; i++)
+        msleep(CLOCK_FREQ/10); /* eventually, it should start failing */
+    assert(vlc_h2_output_send(out, frame(0)) == -1);
+    assert(vlc_h2_output_send_prio(out, frame(0)) == -1);
+    vlc_h2_output_destroy(out);
+    vlc_sem_destroy(&rx);
+
+    /* Failure during hello */
+    vlc_sem_init(&rx, 0);
+    counter = 0;
+    out = vlc_h2_output_create(NULL, expect_hello = true);
+    assert(out != NULL);
+    vlc_sem_wait(&rx);
+
+    for (unsigned char i = 1; vlc_h2_output_send_prio(out, frame(i)) == 0; i++)
+        msleep(CLOCK_FREQ/10);
+    assert(vlc_h2_output_send(out, frame(0)) == -1);
+    assert(vlc_h2_output_send_prio(out, frame(0)) == -1);
+    vlc_h2_output_destroy(out);
+    vlc_sem_destroy(&rx);
+
+    return 0;
+}



More information about the vlc-commits mailing list