Commit 9859c56b authored by Stefan H. Holek's avatar Stefan H. Holek

Use a decorator to save and restore thread-local state.

parent a9c80461
...@@ -23,6 +23,25 @@ import sandbox ...@@ -23,6 +23,25 @@ import sandbox
import interfaces import interfaces
def savestate(func):
'''Decorator saving thread local state before executing func
and restoring it afterwards.
'''
from AccessControl.SecurityManagement import getSecurityManager
from AccessControl.SecurityManagement import setSecurityManager
from zope.app.component.hooks import getSite
from zope.app.component.hooks import setSite
def wrapped_func(*args, **kw):
sm, site = getSecurityManager(), getSite()
try:
return func(*args, **kw)
finally:
setSecurityManager(sm)
setSite(site)
return wrapped_func
class Functional(sandbox.Sandboxed): class Functional(sandbox.Sandboxed):
'''Derive from this class and an xTestCase to get functional '''Derive from this class and an xTestCase to get functional
testing support:: testing support::
...@@ -33,25 +52,15 @@ class Functional(sandbox.Sandboxed): ...@@ -33,25 +52,15 @@ class Functional(sandbox.Sandboxed):
__implements__ = (interfaces.IFunctional,) __implements__ = (interfaces.IFunctional,)
@savestate
def publish(self, path, basic=None, env=None, extra=None, def publish(self, path, basic=None, env=None, extra=None,
request_method='GET', stdin=None, handle_errors=True): request_method='GET', stdin=None, handle_errors=True):
'''Publishes the object at 'path' returning a response object.''' '''Publishes the object at 'path' returning a response object.'''
from zope.app.component.hooks import setSite, getSite
from StringIO import StringIO from StringIO import StringIO
from ZPublisher.Response import Response from ZPublisher.Response import Response
from ZPublisher.Test import publish_module from ZPublisher.Test import publish_module
from AccessControl.SecurityManagement import getSecurityManager
from AccessControl.SecurityManagement import setSecurityManager
# Save current security manager
sm = getSecurityManager()
# And we need to store the old site
old_site = getSite()
setSite(None)
# Commit the sandbox for good measure # Commit the sandbox for good measure
transaction.commit() transaction.commit()
...@@ -91,12 +100,6 @@ class Functional(sandbox.Sandboxed): ...@@ -91,12 +100,6 @@ class Functional(sandbox.Sandboxed):
debug=not handle_errors, debug=not handle_errors,
) )
# Restore security manager
setSecurityManager(sm)
# And we need to restore the site again
setSite(old_site)
return ResponseWrapper(response, outstream, path) return ResponseWrapper(response, outstream, path)
......
...@@ -31,6 +31,7 @@ from Testing.ZopeTestCase import user_role ...@@ -31,6 +31,7 @@ from Testing.ZopeTestCase import user_role
from Testing.ZopeTestCase import standard_permissions from Testing.ZopeTestCase import standard_permissions
from Testing.ZopeTestCase.sandbox import AppZapper from Testing.ZopeTestCase.sandbox import AppZapper
from Testing.ZopeTestCase.functional import ResponseWrapper from Testing.ZopeTestCase.functional import ResponseWrapper
from Testing.ZopeTestCase.functional import savestate
class HTTPHeaderOutput: class HTTPHeaderOutput:
...@@ -110,6 +111,7 @@ def sync(): ...@@ -110,6 +111,7 @@ def sync():
getRootFolder()._p_jar.sync() getRootFolder()._p_jar.sync()
@savestate
def http(request_string, handle_errors=True): def http(request_string, handle_errors=True):
"""Execute an HTTP request string via the publisher """Execute an HTTP request string via the publisher
...@@ -117,19 +119,9 @@ def http(request_string, handle_errors=True): ...@@ -117,19 +119,9 @@ def http(request_string, handle_errors=True):
""" """
import urllib import urllib
import rfc822 import rfc822
from zope.app.component.hooks import setSite, getSite
from cStringIO import StringIO from cStringIO import StringIO
from ZPublisher.Response import Response from ZPublisher.Response import Response
from ZPublisher.Test import publish_module from ZPublisher.Test import publish_module
from AccessControl.SecurityManagement import getSecurityManager
from AccessControl.SecurityManagement import setSecurityManager
# Save current Security Manager
old_sm = getSecurityManager()
# And we need to store the old site
old_site = getSite()
setSite(None)
# Commit work done by previous python code. # Commit work done by previous python code.
transaction.commit() transaction.commit()
...@@ -194,14 +186,6 @@ def http(request_string, handle_errors=True): ...@@ -194,14 +186,6 @@ def http(request_string, handle_errors=True):
header_output.appendResponseHeaders(response._cookie_list()) header_output.appendResponseHeaders(response._cookie_list())
header_output.appendResponseHeaders(response.accumulated_headers.splitlines()) header_output.appendResponseHeaders(response.accumulated_headers.splitlines())
# Restore previous security manager, which may have been changed
# by calling the publish method above
setSecurityManager(old_sm)
# And we need to restore the site again
setSite(old_site)
# Sync connection
sync() sync()
return DocResponseWrapper(response, outstream, path, header_output) return DocResponseWrapper(response, outstream, path, header_output)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment