From 07641830aefe1d26cfd2c820403e1c81eadbeb50 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 2 Aug 2015 20:12:10 +0200 Subject: [PATCH] Add hypothesis tests for http/rfc6266. See #830. --- tests/browser/http/test_http_hypothesis.py | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tests/browser/http/test_http_hypothesis.py diff --git a/tests/browser/http/test_http_hypothesis.py b/tests/browser/http/test_http_hypothesis.py new file mode 100644 index 000000000..e296b2ff2 --- /dev/null +++ b/tests/browser/http/test_http_hypothesis.py @@ -0,0 +1,62 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2015 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser 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 General Public License +# along with qutebrowser. If not, see . + +"""Hypothesis tests for qutebrowser.browser.http.""" + +import pytest +import hypothesis +from hypothesis import strategies + +from qutebrowser.browser import http, rfc6266 + + +@hypothesis.given(strategies.text(alphabet=[chr(x) for x in range(255)])) +def test_parse_content_disposition(stubs, s): + reply = stubs.FakeNetworkReply(headers={'Content-Disposition': s}) + http.parse_content_disposition(reply) + + +@pytest.mark.parametrize('template', [ + 'attachment; filename="{}"', + 'inline; {}', + 'attachment; {}="foo"', + 'attachment; filename*=iso-8859-1''{}', + 'attachment; filename*={}', +]) +@hypothesis.given(strategies.text(alphabet=[chr(x) for x in range(255)])) +def test_parse_content_disposition_template(template, stubs, s): + header = template.format(s) + reply = stubs.FakeNetworkReply(headers={'Content-Disposition': header}) + http.parse_content_disposition(reply) + + +@hypothesis.given(strategies.binary()) +def test_content_disposition_directly(s): + """Test rfc6266.parse_headers directly with binary data.""" + try: + cd = rfc6266.parse_headers(s) + cd.filename() + except (SyntaxError, UnicodeDecodeError, rfc6266.Error): + pass + + +@hypothesis.given(strategies.text()) +def test_parse_content_type(stubs, s): + reply = stubs.FakeNetworkReply(headers={'Content-Type': s}) + http.parse_content_type(reply)