|
@@ -16,6 +16,7 @@
|
|
|
# limitations under the License.
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
import sys
|
|
import sys
|
|
|
|
|
+import threading
|
|
|
|
|
|
|
|
from django.conf import settings
|
|
from django.conf import settings
|
|
|
from django.core.management.base import BaseCommand
|
|
from django.core.management.base import BaseCommand
|
|
@@ -28,25 +29,33 @@ from mako.template import Template
|
|
|
|
|
|
|
|
__all__ = ['HueTestRunner']
|
|
__all__ = ['HueTestRunner']
|
|
|
|
|
|
|
|
|
|
+# Capturing the mako context is not thread safe, so we wrap rendering in a mutex.
|
|
|
|
|
+_MAKO_LOCK = threading.RLock()
|
|
|
|
|
+
|
|
|
|
|
|
|
|
def _instrumented_test_render(self, *args, **data):
|
|
def _instrumented_test_render(self, *args, **data):
|
|
|
"""
|
|
"""
|
|
|
An instrumented Template render method, providing a signal
|
|
An instrumented Template render method, providing a signal
|
|
|
that can be intercepted by the test system Client
|
|
that can be intercepted by the test system Client
|
|
|
"""
|
|
"""
|
|
|
- def mako_callable_(context, *args, **kwargs):
|
|
|
|
|
- template_rendered.send(sender=self, template=self, context=context)
|
|
|
|
|
- return self.original_callable_[-1](context, *args, **kwargs)
|
|
|
|
|
- if hasattr(self, 'original_callable_'):
|
|
|
|
|
- self.original_callable_.append(self.callable_)
|
|
|
|
|
- else:
|
|
|
|
|
- self.original_callable_ = [self.callable_]
|
|
|
|
|
- self.callable_ = mako_callable_
|
|
|
|
|
- try:
|
|
|
|
|
- response = runtime._render(self, self.original_callable_[-1], args, data)
|
|
|
|
|
- finally:
|
|
|
|
|
- self.callable_ = self.original_callable_.pop()
|
|
|
|
|
- return response
|
|
|
|
|
|
|
+
|
|
|
|
|
+ with _MAKO_LOCK:
|
|
|
|
|
+ def mako_callable_(context, *args, **kwargs):
|
|
|
|
|
+ template_rendered.send(sender=self, template=self, context=context)
|
|
|
|
|
+ return self.original_callable_[-1](context, *args, **kwargs)
|
|
|
|
|
+
|
|
|
|
|
+ if hasattr(self, 'original_callable_'):
|
|
|
|
|
+ self.original_callable_.append(self.callable_)
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.original_callable_ = [self.callable_]
|
|
|
|
|
+
|
|
|
|
|
+ self.callable_ = mako_callable_
|
|
|
|
|
+ try:
|
|
|
|
|
+ response = runtime._render(self, self.original_callable_[-1], args, data)
|
|
|
|
|
+ finally:
|
|
|
|
|
+ self.callable_ = self.original_callable_.pop()
|
|
|
|
|
+
|
|
|
|
|
+ return response
|
|
|
|
|
|
|
|
|
|
|
|
|
class HueTestRunner(NoseTestSuiteRunner):
|
|
class HueTestRunner(NoseTestSuiteRunner):
|