summaryrefslogtreecommitdiff
path: root/tests/urlpatterns_reverse
diff options
context:
space:
mode:
authorMarten Kenbeek <marten.knbk@gmail.com>2016-07-14 20:41:52 +0200
committerTim Graham <timograham@gmail.com>2016-07-14 14:41:52 -0400
commit389a5318a06e7e4d8f8aba14af88c4cc4ea0db47 (patch)
treef9ffdc02fc1571b04d8a395f38fe96eb6fa55b5b /tests/urlpatterns_reverse
parent3e71f6544feca490211e88db4f449dfdb7acce39 (diff)
Fixed #26888 -- Fixed concurrency issue in URL resolver.
Fixed a regression in 625b8e9295d79650208bfb3fca8bf9e6aaf578e4: improper short-circuiting could lead to a KeyError when threads concurrently call RegexURLResolver._populate().
Diffstat (limited to 'tests/urlpatterns_reverse')
-rw-r--r--tests/urlpatterns_reverse/tests.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py
index 0201e28bf8..67a4370e78 100644
--- a/tests/urlpatterns_reverse/tests.py
+++ b/tests/urlpatterns_reverse/tests.py
@@ -5,6 +5,7 @@ Unit tests for reverse URL lookups.
from __future__ import unicode_literals
import sys
+import threading
from admin_scripts.tests import AdminScriptTestCase
@@ -429,6 +430,18 @@ class ResolverTests(SimpleTestCase):
self.assertTrue(resolver._is_callback('urlpatterns_reverse.nested_urls.View3'))
self.assertFalse(resolver._is_callback('urlpatterns_reverse.nested_urls.blub'))
+ def test_populate_concurrency(self):
+ """
+ RegexURLResolver._populate() can be called concurrently, but not more
+ than once per thread (#26888).
+ """
+ resolver = RegexURLResolver(r'^/', 'urlpatterns_reverse.urls')
+ resolver._local.populating = True
+ thread = threading.Thread(target=resolver._populate)
+ thread.start()
+ thread.join()
+ self.assertNotEqual(resolver._reverse_dict, {})
+
@override_settings(ROOT_URLCONF='urlpatterns_reverse.reverse_lazy_urls')
class ReverseLazyTest(TestCase):