2014-10-24 01:01:34 +00:00
|
|
|
import tempfile
|
|
|
|
import os
|
2014-10-25 02:30:54 +00:00
|
|
|
import re
|
2014-10-24 01:01:34 +00:00
|
|
|
import shutil
|
2015-05-03 01:54:52 +00:00
|
|
|
import cStringIO
|
2012-06-09 03:08:51 +00:00
|
|
|
from contextlib import contextmanager
|
2014-10-25 02:30:54 +00:00
|
|
|
from libpathod import utils, test, pathoc, pathod, language
|
2012-07-23 04:18:47 +00:00
|
|
|
import requests
|
|
|
|
|
2014-10-25 02:30:54 +00:00
|
|
|
|
2015-04-19 20:56:47 +00:00
|
|
|
class DaemonTests(object):
|
2012-07-23 07:55:33 +00:00
|
|
|
noweb = False
|
2012-07-24 22:34:57 +00:00
|
|
|
noapi = False
|
2012-07-26 08:01:51 +00:00
|
|
|
nohang = False
|
2012-07-23 07:55:33 +00:00
|
|
|
ssl = False
|
2012-09-30 23:01:02 +00:00
|
|
|
timeout = None
|
2012-10-24 21:59:18 +00:00
|
|
|
hexdump = False
|
2014-03-02 00:45:35 +00:00
|
|
|
ssloptions = None
|
2014-10-24 01:01:34 +00:00
|
|
|
|
2012-07-23 04:18:47 +00:00
|
|
|
@classmethod
|
2015-04-19 20:56:47 +00:00
|
|
|
def setUpAll(klass):
|
|
|
|
opts = klass.ssloptions or {}
|
|
|
|
klass.confdir = tempfile.mkdtemp()
|
|
|
|
opts["confdir"] = klass.confdir
|
2014-03-02 00:45:35 +00:00
|
|
|
so = pathod.SSLOptions(**opts)
|
2015-04-19 20:56:47 +00:00
|
|
|
klass.d = test.Daemon(
|
2012-07-23 04:18:47 +00:00
|
|
|
staticdir=test_data.path("data"),
|
2014-10-25 02:30:54 +00:00
|
|
|
anchors=[
|
|
|
|
(re.compile("/anchor/.*"), language.parse_response("202:da"))
|
|
|
|
],
|
2015-04-19 20:56:47 +00:00
|
|
|
ssl = klass.ssl,
|
2013-01-05 07:36:06 +00:00
|
|
|
ssloptions = so,
|
2015-05-30 00:03:13 +00:00
|
|
|
sizelimit = 1 * 1024 * 1024,
|
2015-04-19 20:56:47 +00:00
|
|
|
noweb = klass.noweb,
|
|
|
|
noapi = klass.noapi,
|
|
|
|
nohang = klass.nohang,
|
|
|
|
timeout = klass.timeout,
|
|
|
|
hexdump = klass.hexdump,
|
2012-09-30 23:48:26 +00:00
|
|
|
logreq = True,
|
2012-10-30 22:23:53 +00:00
|
|
|
logresp = True,
|
|
|
|
explain = True
|
2012-07-23 04:18:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def tearDownAll(self):
|
|
|
|
self.d.shutdown()
|
2014-03-02 00:45:35 +00:00
|
|
|
shutil.rmtree(self.confdir)
|
2012-07-23 04:18:47 +00:00
|
|
|
|
|
|
|
def setUp(self):
|
2012-07-24 22:34:57 +00:00
|
|
|
if not (self.noweb or self.noapi):
|
|
|
|
self.d.clear_log()
|
2012-07-23 04:18:47 +00:00
|
|
|
|
2012-07-23 04:28:34 +00:00
|
|
|
def getpath(self, path, params=None):
|
2012-07-23 07:55:33 +00:00
|
|
|
scheme = "https" if self.ssl else "http"
|
2012-07-23 04:28:34 +00:00
|
|
|
return requests.get(
|
2015-05-30 00:03:13 +00:00
|
|
|
"%s://localhost:%s/%s" % (
|
2014-10-24 01:01:34 +00:00
|
|
|
scheme,
|
|
|
|
self.d.port,
|
|
|
|
path
|
|
|
|
),
|
|
|
|
verify=False,
|
|
|
|
params=params
|
2012-07-23 04:28:34 +00:00
|
|
|
)
|
2012-07-23 04:18:47 +00:00
|
|
|
|
|
|
|
def get(self, spec):
|
2012-07-30 05:29:36 +00:00
|
|
|
return requests.get(self.d.p(spec), verify=False)
|
2012-07-23 04:18:47 +00:00
|
|
|
|
2015-04-29 20:03:26 +00:00
|
|
|
def pathoc(
|
|
|
|
self,
|
|
|
|
spec,
|
|
|
|
timeout=None,
|
|
|
|
connect_to=None,
|
|
|
|
ssl=None,
|
|
|
|
ws_read_limit=None
|
|
|
|
):
|
2013-01-05 07:29:46 +00:00
|
|
|
if ssl is None:
|
|
|
|
ssl = self.ssl
|
2015-04-29 20:03:26 +00:00
|
|
|
c = pathoc.Pathoc(
|
|
|
|
("localhost", self.d.port),
|
|
|
|
ssl=ssl,
|
2015-04-30 01:59:10 +00:00
|
|
|
ws_read_limit=ws_read_limit,
|
|
|
|
fp = None
|
2015-04-29 20:03:26 +00:00
|
|
|
)
|
2013-01-05 07:29:46 +00:00
|
|
|
c.connect(connect_to)
|
2012-07-23 04:18:47 +00:00
|
|
|
if timeout:
|
|
|
|
c.settimeout(timeout)
|
|
|
|
return c.request(spec)
|
2012-06-09 03:08:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
def tmpdir(*args, **kwargs):
|
|
|
|
orig_workdir = os.getcwd()
|
|
|
|
temp_workdir = tempfile.mkdtemp(*args, **kwargs)
|
|
|
|
os.chdir(temp_workdir)
|
|
|
|
|
|
|
|
yield temp_workdir
|
|
|
|
|
|
|
|
os.chdir(orig_workdir)
|
|
|
|
shutil.rmtree(temp_workdir)
|
|
|
|
|
|
|
|
|
|
|
|
def raises(exc, obj, *args, **kwargs):
|
|
|
|
"""
|
|
|
|
Assert that a callable raises a specified exception.
|
|
|
|
|
|
|
|
:exc An exception class or a string. If a class, assert that an
|
|
|
|
exception of this type is raised. If a string, assert that the string
|
|
|
|
occurs in the string representation of the exception, based on a
|
|
|
|
case-insenstivie match.
|
|
|
|
|
|
|
|
:obj A callable object.
|
|
|
|
|
|
|
|
:args Arguments to be passsed to the callable.
|
|
|
|
|
|
|
|
:kwargs Arguments to be passed to the callable.
|
|
|
|
"""
|
|
|
|
try:
|
2015-05-30 00:03:13 +00:00
|
|
|
obj(*args, **kwargs)
|
|
|
|
except (Exception, SystemExit) as v:
|
2012-06-09 03:08:51 +00:00
|
|
|
if isinstance(exc, basestring):
|
|
|
|
if exc.lower() in str(v).lower():
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
raise AssertionError(
|
2015-05-30 00:03:13 +00:00
|
|
|
"Expected %s, but caught %s" % (
|
2012-06-09 03:08:51 +00:00
|
|
|
repr(str(exc)), v
|
|
|
|
)
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
if isinstance(v, exc):
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
raise AssertionError(
|
2015-05-30 00:03:13 +00:00
|
|
|
"Expected %s, but caught %s %s" % (
|
2012-06-09 03:08:51 +00:00
|
|
|
exc.__name__, v.__class__.__name__, str(v)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
raise AssertionError("No exception raised.")
|
|
|
|
|
|
|
|
test_data = utils.Data(__name__)
|
2015-05-03 01:54:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
def render(r, settings=language.Settings()):
|
2015-05-15 23:31:53 +00:00
|
|
|
r = r.resolve(settings)
|
2015-05-03 01:54:52 +00:00
|
|
|
s = cStringIO.StringIO()
|
|
|
|
assert language.serve(r, s, settings)
|
|
|
|
return s.getvalue()
|