Log message for revision 73185: Merged r73183:73184 from 2.10 branch. Use a decorator to save and restore thread-local state.
Changed: U Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py U Zope/trunk/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py -=- Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py =================================================================== --- Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py 2007-03-15 09:58:25 UTC (rev 73184) +++ Zope/trunk/lib/python/Testing/ZopeTestCase/functional.py 2007-03-15 10:04:04 UTC (rev 73185) @@ -25,6 +25,25 @@ from zope.interface import implements +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): '''Derive from this class and an xTestCase to get functional testing support:: @@ -35,25 +54,15 @@ implements(interfaces.IFunctional) + @savestate def publish(self, path, basic=None, env=None, extra=None, request_method='GET', stdin=None, handle_errors=True): '''Publishes the object at 'path' returning a response object.''' - from zope.app.component.hooks import setSite, getSite from StringIO import StringIO from ZPublisher.Response import Response 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 transaction.commit() @@ -93,12 +102,6 @@ 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) Modified: Zope/trunk/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py =================================================================== --- Zope/trunk/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py 2007-03-15 09:58:25 UTC (rev 73184) +++ Zope/trunk/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py 2007-03-15 10:04:04 UTC (rev 73185) @@ -31,6 +31,7 @@ from Testing.ZopeTestCase import standard_permissions from Testing.ZopeTestCase.sandbox import AppZapper from Testing.ZopeTestCase.functional import ResponseWrapper +from Testing.ZopeTestCase.functional import savestate class HTTPHeaderOutput: @@ -110,6 +111,7 @@ getRootFolder()._p_jar.sync() [EMAIL PROTECTED] def http(request_string, handle_errors=True): """Execute an HTTP request string via the publisher @@ -117,20 +119,10 @@ """ import urllib import rfc822 - from zope.app.component.hooks import setSite, getSite from cStringIO import StringIO from ZPublisher.Response import Response 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. transaction.commit() @@ -194,14 +186,6 @@ header_output.appendResponseHeaders(response._cookie_list()) 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() return DocResponseWrapper(response, outstream, path, header_output) _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins