[vlc-commits] HTTP file reader tests
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> | Wed Dec 9 23:23:25 2015 +0200| [053c00fdd6fdfb2ad09793c7fe4e46a7db1e8305] | committer: Rémi Denis-Courmont
HTTP file reader tests
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=053c00fdd6fdfb2ad09793c7fe4e46a7db1e8305
---
modules/access/http/Makefile.am | 8 +-
modules/access/http/file_test.c | 247 +++++++++++++++++++++++++++++++++++++++
2 files changed, 253 insertions(+), 2 deletions(-)
diff --git a/modules/access/http/Makefile.am b/modules/access/http/Makefile.am
index e143449..731f72b 100644
--- a/modules/access/http/Makefile.am
+++ b/modules/access/http/Makefile.am
@@ -12,6 +12,10 @@ h2output_test_SOURCES = access/http/h2output_test.c \
h2output_test_LDADD = $(LIBPTHREAD)
http_msg_test_SOURCES = access/http/message_test.c \
access/http/message.c access/http/message.h
+http_file_test_SOURCES = access/http/file_test.c \
+ access/http/message.c access/http/message.h \
+ access/http/file.c access/http/file.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
+ http_msg_test http_file_test
+TESTS += hpack_test hpackenc_test h2frame_test h2output_test \
+ http_msg_test http_file_test
diff --git a/modules/access/http/file_test.c b/modules/access/http/file_test.c
new file mode 100644
index 0000000..23ae470
--- /dev/null
+++ b/modules/access/http/file_test.c
@@ -0,0 +1,247 @@
+/*****************************************************************************
+ * 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 <inttypes.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <vlc_common.h>
+#include "file.h"
+#include "message.h"
+
+static const char url[] = "https://www.example.com:8443/dir/file.ext?a=b";
+static const char ua[] = PACKAGE_NAME "/" PACKAGE_VERSION " (test suite)";
+
+static const char *replies[2] = { NULL, NULL };
+static uint64_t offset = 0;
+
+int main(void)
+{
+ struct vlc_http_file *f;
+ char *str;
+
+ /* Request failure test */
+ f = vlc_http_file_create(NULL, url, ua, NULL);
+ assert(f != NULL);
+ vlc_http_file_seek(f, 0);
+ assert(vlc_http_file_get_status(f) < 0);
+ assert(vlc_http_file_get_redirect(f) == NULL);
+ assert(vlc_http_file_get_size(f) == UINT64_MAX);
+ assert(!vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_type(f) == NULL);
+ assert(vlc_http_file_read(f) == NULL);
+ vlc_http_file_destroy(f);
+
+ /* Non-seekable stream test */
+ replies[0] = "HTTP/1.1 200 OK\r\n"
+ "ETag: \"foobar42\"\r\n"
+ "Content-Type: video/mpeg\r\n"
+ "\r\n";
+
+ offset = 0;
+ f = vlc_http_file_create(NULL, url, ua, NULL);
+ assert(f != NULL);
+ assert(vlc_http_file_get_status(f) == 200);
+ assert(!vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_size(f) == UINT64_MAX);
+ str = vlc_http_file_get_type(f);
+ assert(str != NULL && !strcmp(str, "video/mpeg"));
+ free(str);
+
+ /* Seek failure */
+ replies[0] = "HTTP/1.1 200 OK\r\nETag: \"foobar42\"\r\n\r\n";
+
+ assert(vlc_http_file_seek(f, offset = 1234) < 0);
+ vlc_http_file_destroy(f);
+
+ /* Seekable file test */
+ replies[0] = "HTTP/1.1 206 Partial Content\r\n"
+ "Content-Range: bytes 0-2344/2345\r\n"
+ "ETag: W/\"foobar42\"\r\n"
+ "\r\n";
+
+ offset = 0;
+ f = vlc_http_file_create(NULL, url, ua, NULL);
+ assert(f != NULL);
+ assert(vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_size(f) == 2345);
+
+ /* Seek success */
+ replies[0] = "HTTP/1.1 206 Partial Content\r\n"
+ "Content-Range: bytes 1234-3455/3456\r\n"
+ "ETag: W/\"foobar42\"\r\n"
+ "\r\n";
+ assert(vlc_http_file_seek(f, offset = 1234) == 0);
+ assert(vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_size(f) == 3456);
+
+ /* Seek too far */
+ replies[0] = "HTTP/1.1 416 Range Not Satisfiable\r\n"
+ "Content-Range: bytes */4567\r\n"
+ "ETag: W/\"foobar42\"\r\n"
+ "\r\n";
+ vlc_http_file_seek(f, offset = 5678);
+ assert(vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_size(f) == 4567);
+ assert(vlc_http_file_read(f) == NULL);
+ vlc_http_file_destroy(f);
+
+ /* Redirect */
+ replies[0] = "HTTP/1.1 301 Permanent Redirect\r\n"
+ "Location: /somewhere/else/#here\r\n"
+ "\r\n";
+
+ offset = 0;
+ f = vlc_http_file_create(NULL, url, ua, NULL);
+ assert(f != NULL);
+ assert(!vlc_http_file_can_seek(f));
+ assert(vlc_http_file_get_size(f) == UINT64_MAX);
+ str = vlc_http_file_get_redirect(f);
+ assert(str != NULL
+ && !strcmp(str, "https://www.example.com:8443/somewhere/else/"));
+ free(str);
+ vlc_http_file_destroy(f);
+
+ /* Continuation */
+ replies[0] = "HTTP/1.1 100 Standby\r\n"
+ "\r\n";
+ replies[1] = "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 9999\r\n"
+ "\r\n";
+ offset = 0;
+ f = vlc_http_file_create(NULL, url, ua, NULL);
+ assert(f != NULL);
+ assert(vlc_http_file_get_size(f) == 9999);
+ assert(vlc_http_file_get_redirect(f) == NULL);
+ vlc_http_file_destroy(f);
+
+
+ /* Dummy API calls */
+ f = vlc_http_file_create(NULL, "ftp://localhost/foo", NULL, NULL);
+ assert(f == NULL);
+
+ return 0;
+}
+
+/* Callback for vlc_http_msg_h2_frame */
+#include "h2frame.h"
+
+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])
+{
+ (void) id; (void) mtu; (void) count, (void) tab;
+ assert(!eos);
+ return NULL;
+}
+
+/* Callback for the HTTP request */
+#include "connmgr.h"
+
+static struct vlc_http_stream stream;
+
+static struct vlc_http_msg *stream_read_headers(struct vlc_http_stream *s)
+{
+ assert(s == &stream);
+
+ /* return next reply */
+ struct vlc_http_msg *m = NULL;
+ const char *answer = replies[0];
+
+ if (answer != NULL)
+ {
+ m = vlc_http_msg_headers(answer);
+ assert(m != NULL);
+ vlc_http_msg_attach(m, s);
+ }
+
+ memmove(replies, replies + 1, sizeof (replies) - sizeof (replies[0]));
+ replies[(sizeof (replies) / sizeof (replies[0])) - 1] = NULL;
+
+ return m;
+}
+
+static struct block_t *stream_read(struct vlc_http_stream *s)
+{
+ assert(s == &stream);
+ return NULL;
+}
+
+static void stream_close(struct vlc_http_stream *s)
+{
+ assert(s == &stream);
+}
+
+static const struct vlc_http_stream_cbs stream_callbacks =
+{
+ stream_read_headers,
+ stream_read,
+ stream_close,
+};
+
+static struct vlc_http_stream stream = { &stream_callbacks };
+
+struct vlc_http_msg *vlc_https_request(struct vlc_http_mgr *mgr,
+ const char *host, unsigned port,
+ const struct vlc_http_msg *req)
+{
+ const char *str;
+ char *end;
+
+ assert(mgr == NULL);
+ assert(!strcmp(host, "www.example.com"));
+ assert(port == 8443);
+
+ str = vlc_http_msg_get_method(req);
+ assert(!strcmp(str, "GET"));
+ str = vlc_http_msg_get_scheme(req);
+ assert(!strcmp(str, "https"));
+ str = vlc_http_msg_get_authority(req);
+ assert(!strcmp(str, "www.example.com:8443"));
+ str = vlc_http_msg_get_path(req);
+ assert(!strcmp(str, "/dir/file.ext?a=b"));
+ str = vlc_http_msg_get_agent(req);
+ assert(!strcmp(str, ua));
+ str = vlc_http_msg_get_header(req, "Referer");
+ assert(str == NULL);
+ str = vlc_http_msg_get_header(req, "Accept");
+ assert(str == NULL || strstr(str, "*/*") != NULL);
+ str = vlc_http_msg_get_header(req, "Accept-Language");
+ assert(str == NULL || strstr(str, "*") != NULL);
+
+ str = vlc_http_msg_get_header(req, "Range");
+ assert(str != NULL && !strncmp(str, "bytes=", 6)
+ && strtoul(str + 6, &end, 10) == offset && *end == '-');
+
+ str = vlc_http_msg_get_header(req, "If-Match");
+ if (offset != 0)
+ assert(str != NULL && !strcmp(str, "\"foobar42\""));
+ else
+ assert(str == NULL || strcmp(str, "*") || strcmp(str, "\"foobar42\""));
+
+ return vlc_http_stream_read_headers(&stream);
+}
More information about the vlc-commits
mailing list