[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