about summary refs log tree commit diff
path: root/tst/test_listen.py
diff options
context:
space:
mode:
Diffstat (limited to 'tst/test_listen.py')
-rw-r--r--tst/test_listen.py79
1 files changed, 14 insertions, 65 deletions
diff --git a/tst/test_listen.py b/tst/test_listen.py
index e204d4f..cc6a9a1 100644
--- a/tst/test_listen.py
+++ b/tst/test_listen.py
@@ -22,21 +22,18 @@ from copy import deepcopy
 from email.parser import BytesHeaderParser
 from functools import partial
 from pathlib import Path
-from string import ascii_letters
 from tempfile import mkstemp
 from urllib.parse import urljoin, urlsplit
 from xml.etree.ElementTree import (XML, XMLParser, indent,
                                    tostring as str_from_xml)
-from xml.sax.saxutils import escape
 
 from hypothesis import HealthCheck, given, settings
-from hypothesis.strategies import (builds, composite, data,
+from hypothesis.strategies import (booleans, builds, composite, data,
                                    datetimes, integers, lists, text)
 from hypothesis.provisional import domains, urls
 
 from scadere.check import base64_from_str
-from scadere.listen import (body, entry, handle, is_subdomain, path,
-                            str_from_base64, with_trailing_slash, xml)
+from scadere.listen import handle, is_subdomain, path, with_trailing_slash
 
 ATOM_NAMESPACES = {'': 'http://www.w3.org/2005/Atom'}
 XHTML_NAMESPACES = {'': 'http://www.w3.org/1999/xhtml'}
@@ -52,13 +49,13 @@ def serials():
     return builds(lambda n: hex(n).removeprefix('0x'), integers(0, 256**20-1))
 
 
-def ca_names():
+def base64s():
     """Return a Hypothesis strategy for CA names."""
-    return text().map(lambda name: base64_from_str(name))
+    return text().map(base64_from_str)
 
 
-@given(domains(), ports(), ca_names(), serials())
-def test_path(hostname, port, issuer, serial):
+@given(domains(), ports(), base64s(), serials())
+def test_path_with_cert(hostname, port, issuer, serial):
     r = path(hostname, port, issuer, serial).split('/')
     assert r[0] == hostname
     assert int(r[1]) == port
@@ -66,57 +63,9 @@ def test_path(hostname, port, issuer, serial):
     assert r[3] == serial
 
 
-@given(domains(), ports(), ca_names(), serials(), datetimes(), datetimes())
-def test_body(hostname, port, issuer, serial, not_before, not_after):
-    r = body(not_before, not_after, hostname, port, serial, issuer)
-    assert r[-1][0] == 'dl'
-    d = dict(zip((v for k, v in r[-1][1:] if k == 'dt'),
-                 (v for k, v in r[-1][1:] if k == 'dd')))
-    assert d['Domain'] == hostname
-    assert d['Port'] == port
-    assert d['Issuer'] == str_from_base64(issuer)
-    assert d['Serial number'] == serial
-    assert d['Valid from'] == not_before
-    assert d['Valid until'] == not_after
-
-
-@given(urls(), domains(), ports(),
-       ca_names(), serials(), datetimes(), datetimes())
-def test_atom_entry(base_url, hostname, port,
-                    issuer, serial, not_before, not_after):
-    cert = not_before, not_after, hostname, port, serial, issuer
-    r = str_from_xml(xml(entry(base_url, cert)),
-                     'unicode', short_empty_elements=False)
-    issuer_str = str_from_base64(issuer)
-    url = urljoin(base_url, path(hostname, port, issuer, serial))
-    assert r == f'''<entry>
-  <author>
-    <name>{escape(issuer_str)}</name>
-  </author>
-  <content type="xhtml">
-    <div xmlns="http://www.w3.org/1999/xhtml">
-      <h1>TLS certificate information</h1>
-      <dl>
-        <dt>Domain</dt>
-        <dd>{hostname}</dd>
-        <dt>Port</dt>
-        <dd>{port}</dd>
-        <dt>Issuer</dt>
-        <dd>{escape(issuer_str)}</dd>
-        <dt>Serial number</dt>
-        <dd>{serial}</dd>
-        <dt>Valid from</dt>
-        <dd>{not_before.isoformat()}</dd>
-        <dt>Valid until</dt>
-        <dd>{not_after.isoformat()}</dd>
-      </dl>
-    </div>
-  </content>
-  <id>{url}</id>
-  <link rel="alternate" type="application/xhtml+xml" href="{url}"></link>
-  <title>TLS cert for {hostname} will expire at {not_after}</title>
-  <updated>{not_before.isoformat()}</updated>
-</entry>'''
+@given(domains(), ports(), base64s())
+def test_path_without_cert(hostname, port, error):
+    assert path(hostname, port, error, 'N/A') == f'{hostname}/{port}'
 
 
 @given(domains(), lists(domains()))
@@ -135,13 +84,13 @@ def test_is_subdomain(subject, objects):
 @composite
 def certificates(draw):
     """Return a Hypothesis strategy for certificate summaries."""
+    valid = draw(booleans())
     not_before = draw(datetimes()).isoformat()
-    not_after = draw(datetimes()).isoformat()
+    not_after = draw(datetimes()).isoformat() if valid else 'N/A'
     hostname = draw(domains())
     port = draw(ports())
-    serial = draw(serials())
-    # Free-formed UTF-8 could easily creates malformed XML.
-    issuer = base64_from_str(draw(text(ascii_letters)))
+    serial = draw(serials()) if valid else 'N/A'
+    issuer = draw(base64s())
     return f'{not_before} {not_after} {hostname} {port} {serial} {issuer}'
 
 
@@ -245,7 +194,7 @@ async def check_server(sockets, func, *args):
 @given(urls().filter(is_base_url).filter(has_usual_path),
        lists(certificates(), min_size=1))
 @settings(deadline=None)
-async def test_http_200(base_url, certs):
+async def test_content(base_url, certs):
     base_path = urlsplit(base_url).path
     with tmp_cert_file(certs) as cert_file:
         handler = partial(handle, cert_file, base_url)