tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_serve.py (5326B)


      1 # mypy: allow-untyped-defs
      2 
      3 import logging
      4 import os
      5 import pickle
      6 import platform
      7 
      8 import pytest
      9 
     10 import localpaths  # type: ignore
     11 from . import serve
     12 from .serve import ConfigBuilder, inject_script
     13 
     14 
     15 logger = logging.getLogger()
     16 
     17 @pytest.mark.skipif(platform.uname()[0] == "Windows",
     18                    reason="Expected contents are platform-dependent")
     19 def test_make_hosts_file_nix():
     20    with ConfigBuilder(logger,
     21                       ports={"http": [8000]},
     22                       browser_host="foo.bar",
     23                       alternate_hosts={"alt": "foo2.bar"},
     24                       subdomains={"a", "b"},
     25                       not_subdomains={"x, y"}) as c:
     26        hosts = serve.make_hosts_file(c, "192.168.42.42")
     27        lines = hosts.split("\n")
     28        assert lines == [
     29            "# Start web-platform-tests hosts",
     30            "192.168.42.42\tfoo.bar",
     31            "192.168.42.42\ta.foo.bar",
     32            "192.168.42.42\tb.foo.bar",
     33            "192.168.42.42\tfoo2.bar",
     34            "192.168.42.42\ta.foo2.bar",
     35            "192.168.42.42\tb.foo2.bar",
     36            "# End web-platform-tests hosts",
     37            "",
     38        ]
     39 
     40 
     41 @pytest.mark.skipif(platform.uname()[0] != "Windows",
     42                    reason="Expected contents are platform-dependent")
     43 def test_make_hosts_file_windows():
     44    with ConfigBuilder(logger,
     45                       ports={"http": [8000]},
     46                       browser_host="foo.bar",
     47                       alternate_hosts={"alt": "foo2.bar"},
     48                       subdomains={"a", "b"},
     49                       not_subdomains={"x", "y"}) as c:
     50        hosts = serve.make_hosts_file(c, "192.168.42.42")
     51        lines = hosts.split("\n")
     52        assert lines == [
     53            "# Start web-platform-tests hosts",
     54            "192.168.42.42\tfoo.bar",
     55            "192.168.42.42\ta.foo.bar",
     56            "192.168.42.42\tb.foo.bar",
     57            "192.168.42.42\tfoo2.bar",
     58            "192.168.42.42\ta.foo2.bar",
     59            "192.168.42.42\tb.foo2.bar",
     60            "0.0.0.0\tx.foo.bar",
     61            "0.0.0.0\ty.foo.bar",
     62            "0.0.0.0\tx.foo2.bar",
     63            "0.0.0.0\ty.foo2.bar",
     64            "# End web-platform-tests hosts",
     65            "",
     66        ]
     67 
     68 
     69 def test_ws_doc_root_default():
     70    with ConfigBuilder(logger) as c:
     71        assert c.doc_root == localpaths.repo_root
     72        assert c.ws_doc_root == os.path.join(localpaths.repo_root, "websockets", "handlers")
     73        assert c.paths["ws_doc_root"] == c.ws_doc_root
     74 
     75 
     76 def test_init_ws_doc_root():
     77    with ConfigBuilder(logger, ws_doc_root="/") as c:
     78        assert c.doc_root == localpaths.repo_root  # check this hasn't changed
     79        assert c.ws_doc_root == "/"
     80        assert c.paths["ws_doc_root"] == c.ws_doc_root
     81 
     82 
     83 def test_set_ws_doc_root():
     84    cb = ConfigBuilder(logger)
     85    cb.ws_doc_root = "/"
     86    with cb as c:
     87        assert c.doc_root == localpaths.repo_root  # check this hasn't changed
     88        assert c.ws_doc_root == "/"
     89        assert c.paths["ws_doc_root"] == c.ws_doc_root
     90 
     91 
     92 def test_pickle():
     93    # Ensure that the config object can be pickled
     94    with ConfigBuilder(logger) as c:
     95        pickle.dumps(c)
     96 
     97 
     98 def test_alternate_host_unspecified():
     99    ConfigBuilder(logger, browser_host="web-platform.test")
    100 
    101 
    102 @pytest.mark.parametrize("primary, alternate", [
    103    ("web-platform.test", "web-platform.test"),
    104    ("a.web-platform.test", "web-platform.test"),
    105    ("web-platform.test", "a.web-platform.test"),
    106    ("a.web-platform.test", "a.web-platform.test"),
    107 ])
    108 def test_alternate_host_invalid(primary, alternate):
    109    with pytest.raises(ValueError):
    110        ConfigBuilder(logger, browser_host=primary, alternate_hosts={"alt": alternate})
    111 
    112 @pytest.mark.parametrize("primary, alternate", [
    113    ("web-platform.test", "not-web-platform.test"),
    114    ("a.web-platform.test", "b.web-platform.test"),
    115    ("web-platform-tests.dev", "web-platform-tests.live"),
    116 ])
    117 def test_alternate_host_valid(primary, alternate):
    118    ConfigBuilder(logger, browser_host=primary, alternate_hosts={"alt": alternate})
    119 
    120 
    121 # A token marking the location of expected script injection.
    122 INJECT_SCRIPT_MARKER = b"<!-- inject here -->"
    123 
    124 
    125 def test_inject_script_after_head():
    126    html = b"""<!DOCTYPE html>
    127    <html>
    128        <head>
    129        <!-- inject here --><script src="test.js"></script>
    130        </head>
    131        <body>
    132        </body>
    133    </html>"""
    134    assert INJECT_SCRIPT_MARKER in html
    135    assert inject_script(html.replace(INJECT_SCRIPT_MARKER, b""), INJECT_SCRIPT_MARKER) == html
    136 
    137 
    138 def test_inject_script_no_html_head():
    139    html = b"""<!DOCTYPE html>
    140    <!-- inject here --><div></div>"""
    141    assert INJECT_SCRIPT_MARKER in html
    142    assert inject_script(html.replace(INJECT_SCRIPT_MARKER, b""), INJECT_SCRIPT_MARKER) == html
    143 
    144 
    145 def test_inject_script_no_doctype():
    146    html = b"""<!-- inject here --><div></div>"""
    147    assert INJECT_SCRIPT_MARKER in html
    148    assert inject_script(html.replace(INJECT_SCRIPT_MARKER, b""), INJECT_SCRIPT_MARKER) == html
    149 
    150 
    151 def test_inject_script_parse_error():
    152    html = b"""<!--<!-- inject here --><div></div>"""
    153    assert INJECT_SCRIPT_MARKER in html
    154    # On a parse error, the script should not be injected and the original content should be
    155    # returned.
    156    assert INJECT_SCRIPT_MARKER not in inject_script(html.replace(INJECT_SCRIPT_MARKER, b""), INJECT_SCRIPT_MARKER)