[vlc-commits] https: robustify HTTP/2 connection test
Rémi Denis-Courmont
git at videolan.org
Fri Dec 18 21:07:45 CET 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Dec 18 21:19:55 2015 +0200| [a69bc2cb8ee0f042ea914c265f1514be5073e258] | committer: Rémi Denis-Courmont
https: robustify HTTP/2 connection test
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a69bc2cb8ee0f042ea914c265f1514be5073e258
---
modules/access/http/h2conn_test.c | 67 +++++++++++++++++++++++++++++++++++--
1 file changed, 65 insertions(+), 2 deletions(-)
diff --git a/modules/access/http/h2conn_test.c b/modules/access/http/h2conn_test.c
index fec5fcc..2d9c117 100644
--- a/modules/access/http/h2conn_test.c
+++ b/modules/access/http/h2conn_test.c
@@ -55,9 +55,44 @@ static void conn_send(struct vlc_h2_frame *f)
free(f);
}
+enum {
+ DATA, HEADERS, PRIORITY, RST_STREAM, SETTINGS, PUSH_PROMISE, PING, GOAWAY,
+ WINDOW_UPDATE, CONTINUATION,
+};
+
+static void conn_expect(uint_fast8_t wanted)
+{
+ size_t len;
+ ssize_t val;
+ uint8_t hdr[9];
+ uint8_t got;
+
+ do {
+ val = recv(external_fd, hdr, 9, MSG_WAITALL);
+ assert(val == 9);
+ assert(hdr[0] == 0);
+
+ /* Check type. We do not currently validate WINDOW_UPDATE. */
+ got = hdr[3];
+ assert(wanted == got || WINDOW_UPDATE == got);
+
+ len = (hdr[1] << 8) | hdr[2];
+ if (len > 0)
+ {
+ char buf[len];
+
+ val = recv(external_fd, buf, len, MSG_WAITALL);
+ assert(val == (ssize_t)len);
+ }
+ }
+ while (got != wanted);
+}
+
static void conn_create(void)
{
+ ssize_t val;
int fds[2];
+ char hello[24];
if (socketpair(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0, fds))
assert(!"socketpair");
@@ -70,6 +105,12 @@ static void conn_create(void)
conn = vlc_h2_conn_create(tls);
assert(conn != NULL);
conn_send(vlc_h2_frame_settings());
+
+ val = recv(external_fd, hello, 24, MSG_WAITALL);
+ assert(val == 24);
+ assert(!memcmp(hello, "PRI * HTTP/2.0\r\n", 16));
+ conn_expect(SETTINGS);
+ conn_expect(SETTINGS);
}
static void conn_destroy(void)
@@ -128,17 +169,20 @@ int main(void)
conn_create();
conn_send(vlc_h2_frame_ping(42));
+ conn_expect(PING);
/* Test rejected stream */
sid += 2;
s = stream_open();
assert(s != NULL);
+ conn_expect(HEADERS);
conn_send(vlc_h2_frame_rst_stream(sid, VLC_H2_REFUSED_STREAM));
m = vlc_http_stream_read_headers(s);
assert(m == NULL);
b = vlc_http_stream_read(s);
assert(b == NULL);
vlc_http_stream_close(s, false);
+ conn_expect(RST_STREAM);
/* Test accepted stream */
sid += 2;
@@ -149,10 +193,14 @@ int main(void)
assert(m != NULL);
vlc_http_msg_destroy(m);
- /* Test late data */
- stream_data(3, "Hello ", false);
+ stream_data(3, "Hello ", false); /* late data */
stream_data(3, "world!", true);
+ conn_expect(HEADERS);
+ conn_expect(RST_STREAM);
+ conn_expect(RST_STREAM);
+ conn_expect(RST_STREAM);
+
/* Test continuation then accepted stream */
sid += 2;
s = stream_open();
@@ -177,6 +225,10 @@ int main(void)
assert(b == NULL);
vlc_http_msg_destroy(m);
+ conn_expect(HEADERS);
+ conn_expect(RST_STREAM);
+ conn_expect(RST_STREAM);
+
/* Test accepted stream after continuation */
sid += 2;
s = stream_open();
@@ -197,6 +249,11 @@ int main(void)
assert(b == NULL);
vlc_http_msg_destroy(m);
+ conn_expect(HEADERS);
+ conn_expect(HEADERS);
+ conn_expect(RST_STREAM);
+ conn_expect(RST_STREAM);
+
/* Test multiple streams in non-LIFO order */
sid += 2;
s = stream_open();
@@ -214,6 +271,12 @@ int main(void)
assert(m != NULL);
vlc_http_msg_destroy(m);
+ conn_expect(HEADERS);
+ conn_expect(HEADERS);
+ conn_expect(RST_STREAM);
+ conn_expect(RST_STREAM);
+ /* might or might not seen one or two extra RST_STREAM now */
+
/* Test graceful connection termination */
sid += 2;
s = stream_open();
More information about the vlc-commits
mailing list