[vlc-commits] HTTP messages test cases
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> | Thu Dec 3 21:05:34 2015 +0200| [38440a0e4ef159367f3f763f3ea602eddef7d22a] | committer: Rémi Denis-Courmont
HTTP messages test cases
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=38440a0e4ef159367f3f763f3ea602eddef7d22a
---
modules/access/http/Makefile.am | 7 +-
modules/access/http/message_test.c | 261 ++++++++++++++++++++++++++++++++++++
2 files changed, 266 insertions(+), 2 deletions(-)
diff --git a/modules/access/http/Makefile.am b/modules/access/http/Makefile.am
index 5ada7db..e143449 100644
--- a/modules/access/http/Makefile.am
+++ b/modules/access/http/Makefile.am
@@ -10,5 +10,8 @@ h2output_test_SOURCES = access/http/h2output_test.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
+http_msg_test_SOURCES = access/http/message_test.c \
+ access/http/message.c access/http/message.h
+check_PROGRAMS += hpack_test hpackenc_test h2frame_test h2output_test \
+ http_msg_test
+TESTS += hpack_test hpackenc_test h2frame_test h2output_test http_msg_test
diff --git a/modules/access/http/message_test.c b/modules/access/http/message_test.c
new file mode 100644
index 0000000..daa6a02
--- /dev/null
+++ b/modules/access/http/message_test.c
@@ -0,0 +1,261 @@
+/*****************************************************************************
+ * message.c: HTTP request/response
+ *****************************************************************************
+ * 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 <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <vlc_common.h>
+#include "message.h"
+#include "h2frame.h"
+
+static void check_req(const struct vlc_http_msg *m)
+{
+ const char *str;
+
+ assert(vlc_http_msg_get_status(m) < 0);
+ str = vlc_http_msg_get_method(m);
+ assert(str != NULL && !strcmp(str, "GET"));
+ str = vlc_http_msg_get_scheme(m);
+ assert(str != NULL && !strcmp(str, "http"));
+ str = vlc_http_msg_get_authority(m);
+ assert(str != NULL && !strcmp(str, "www.example.com"));
+ str = vlc_http_msg_get_path(m);
+ assert(str != NULL && !strcmp(str, "/"));
+
+ str = vlc_http_msg_get_header(m, "Cache-Control");
+ assert(str != NULL && !strcmp(str, "no-cache"));
+ str = vlc_http_msg_get_header(m, "Custom-Key");
+ assert(str != NULL && !strcmp(str, "custom-value"));
+
+ str = vlc_http_msg_get_header(m, "Date");
+ assert(str == NULL);
+}
+
+static void check_resp(const struct vlc_http_msg *m)
+{
+ const char *str;
+
+ assert(vlc_http_msg_get_status(m) == 200);
+ str = vlc_http_msg_get_method(m);
+ assert(str == NULL);
+ str = vlc_http_msg_get_scheme(m);
+ assert(str == NULL);
+ str = vlc_http_msg_get_authority(m);
+ assert(str == NULL);
+ str = vlc_http_msg_get_path(m);
+ assert(str == NULL);
+
+ str = vlc_http_msg_get_header(m, "Cache-Control");
+ assert(str != NULL && !strcmp(str, "private"));
+ str = vlc_http_msg_get_header(m, "Date");
+ assert(str != NULL && !strcmp(str, "Mon, 21 Oct 2013 20:13:22 GMT"));
+ str = vlc_http_msg_get_header(m, "Location");
+ assert(str != NULL && !strcmp(str, "https://www.example.com"));
+ str = vlc_http_msg_get_header(m, "Content-Encoding");
+ assert(str != NULL && !strcmp(str, "gzip"));
+ str = vlc_http_msg_get_header(m, "Set-Cookie");
+ assert(str != NULL && !strcmp(str, "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; "
+ "max-age=3600; version=1"));
+
+ str = vlc_http_msg_get_header(m, "Custom-Key");
+ assert(str == NULL);
+}
+
+static void check_connect(const struct vlc_http_msg *m)
+{
+ const char *str;
+
+ assert(vlc_http_msg_get_status(m) < 0);
+ str = vlc_http_msg_get_method(m);
+ assert(str != NULL && !strcmp(str, "CONNECT"));
+ str = vlc_http_msg_get_scheme(m);
+ assert(str == NULL);
+ str = vlc_http_msg_get_authority(m);
+ assert(str != NULL && !strcmp(str, "www.example.com"));
+ str = vlc_http_msg_get_path(m);
+ assert(str == NULL);
+
+ str = vlc_http_msg_get_header(m, "Custom-Key");
+ assert(str == NULL);
+}
+
+static void check_msg(struct vlc_http_msg *in,
+ void (*cb)(const struct vlc_http_msg *))
+{
+ struct vlc_http_msg *out;
+ char *m1;
+ size_t len;
+
+ cb(in);
+
+ m1 = vlc_http_msg_format(in, &len);
+ assert(m1 != NULL);
+ assert(strlen(m1) == len);
+ out = vlc_http_msg_headers(m1);
+ fprintf(stderr, "%s", m1);
+ free(m1);
+ /* XXX: request parsing not implemented/needed yet */
+ if (vlc_http_msg_get_status(in) >= 0)
+ {
+ assert(out != NULL);
+ cb(out);
+ vlc_http_msg_destroy(out);
+ }
+
+ out = (struct vlc_http_msg *)vlc_http_msg_h2_frame(in, 1, true);
+ assert(out != NULL);
+ cb(out);
+ assert(vlc_http_msg_read(out) == NULL);
+ vlc_http_msg_destroy(out);
+
+ cb(in);
+ vlc_http_msg_destroy(in);
+}
+
+static time_t parse_date(const char *str)
+{
+ struct vlc_http_msg *m;
+ time_t t1, t2;
+
+ m = vlc_http_req_create("GET", "http", "www.example.com", "/");
+ assert(m != NULL);
+ assert(vlc_http_msg_add_header(m, "Date", "%s", str) == 0);
+ t1 = vlc_http_msg_get_atime(m);
+ assert(vlc_http_msg_add_header(m, "Last-Modified", "%s", str) == 0);
+ t2 = vlc_http_msg_get_mtime(m);
+ assert(vlc_http_msg_add_header(m, "Retry-After", "%s", str) == 0);
+ vlc_http_msg_get_retry_after(m);
+ vlc_http_msg_destroy(m);
+
+ assert(t1 == t2);
+ return t1;
+}
+
+int main(void)
+{
+ struct vlc_http_msg *m;
+ int ret;
+
+ /* Formatting and parsing */
+ m = vlc_http_req_create("GET", "http", "www.example.com", "/");
+ assert(m != NULL);
+ ret = vlc_http_msg_add_header(m, "Cache-Control", "no-cache");
+ assert(ret == 0);
+ vlc_http_msg_add_header(m, "Custom-Key", "%s", "custom-value");
+ assert(ret == 0);
+ check_msg(m, check_req);
+
+ m = vlc_http_resp_create(200);
+ assert(m != NULL);
+ ret = vlc_http_msg_add_header(m, "cache-control", "private");
+ assert(ret == 0);
+ ret = vlc_http_msg_add_header(m, "date", "Mon, 21 Oct 2013 20:13:22 GMT");
+ assert(ret == 0);
+ ret = vlc_http_msg_add_header(m, "location", "https://www.example.com");
+ assert(ret == 0);
+ ret = vlc_http_msg_add_header(m, "content-encoding", "gzip");
+ assert(ret == 0);
+ ret = vlc_http_msg_add_header(m, "set-cookie", "foo=%s; max-age=%u; "
+ "version=%u", "ASDJKHQKBZXOQWEOPIUAXQWEOIU",
+ 3600, 1);
+ assert(ret == 0);
+ check_msg(m, check_resp);
+
+ m = vlc_http_req_create("CONNECT", NULL, "www.example.com", NULL);
+ assert(m != NULL);
+ check_msg(m, check_connect);
+
+ /* Helpers */
+ assert(parse_date("Sun, 06 Nov 1994 08:49:37 GMT") == 784111777);
+ assert(parse_date("Sunday, 06-Nov-94 08:49:37 GMT") == 784111777);
+ assert(parse_date("Sun Nov 6 08:49:37 1994") == 784111777);
+ assert(parse_date("Sunday, 06-Nov-14 08:49:37 GMT") == 1415263777);
+ assert(parse_date("Sun, 06 Bug 1994 08:49:37 GMT") == -1);
+ assert(parse_date("bogus") == -1);
+
+ m = vlc_http_req_create("PRI", "https", "*", NULL);
+ assert(m != NULL);
+
+ assert(vlc_http_msg_add_agent(m, "Foo") == 0);
+ assert(vlc_http_msg_add_agent(m, "Foo/1.0") == 0);
+ assert(vlc_http_msg_add_agent(m, "Foo/1.0 (Hello world) Bar/2.3") == 0);
+ assert(vlc_http_msg_add_agent(m, "Foo/1.0 (compatible (\\(!))") == 0);
+
+ assert(vlc_http_msg_add_atime(m) == 0);
+ time_t t = vlc_http_msg_get_atime(m);
+ assert(t != (time_t)-1);
+
+ vlc_http_msg_add_header(m, "Content-Length", "1234");
+ assert(vlc_http_msg_get_size(m) == 1234);
+
+ /* Error cases */
+ assert(vlc_http_msg_add_agent(m, "") != 0);
+ assert(vlc_http_msg_add_agent(m, "/1.0") != 0);
+ assert(vlc_http_msg_add_agent(m, "Bad/1.0\"") != 0);
+ assert(vlc_http_msg_add_agent(m, "Bad/1.0 (\\)") != 0);
+ assert(vlc_http_msg_add_agent(m, "Bad/1.0 (\\\x08)") != 0);
+ assert(vlc_http_msg_add_agent(m, "Bad/1.0 \"Evil\"") != 0);
+ assert(vlc_http_msg_add_agent(m, "(Hello world)") != 0);
+
+ vlc_http_msg_destroy(m);
+
+ char *bad1[][2] = {
+ { strdup(":status"), strdup("200") },
+ { strdup(":status"), strdup("200") },
+ { strdup("Server"), strdup("BigBad/1.0") },
+ };
+
+ m = vlc_http_msg_h2_headers(3, bad1);
+ assert(m == NULL);
+
+ return 0;
+}
+
+/* Callback for vlc_http_msg_h2_frame */
+struct vlc_h2_frame *
+vlc_h2_frame_headers(uint_fast32_t id, uint_fast32_t mtu, bool eos,
+ unsigned count, const char *const tab[][2])
+{
+ struct vlc_http_msg *m;
+
+ assert(id == 1);
+ assert(mtu == VLC_H2_DEFAULT_MAX_FRAME);
+ assert(eos);
+
+ char *headers[VLC_H2_MAX_HEADERS][2];
+
+ for (unsigned i = 0; i < count; i++)
+ {
+ headers[i][0] = strdup(tab[i][0]);
+ headers[i][1] = strdup(tab[i][1]);
+ }
+
+ m = vlc_http_msg_h2_headers(count, headers);
+ return (struct vlc_h2_frame *)m; /* gruik */
+}
More information about the vlc-commits
mailing list