diff options
| author | Marten Kenbeek <marten.knbk@gmail.com> | 2016-07-14 20:41:52 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-07-14 14:41:52 -0400 |
| commit | 389a5318a06e7e4d8f8aba14af88c4cc4ea0db47 (patch) | |
| tree | f9ffdc02fc1571b04d8a395f38fe96eb6fa55b5b /tests/urlpatterns_reverse | |
| parent | 3e71f6544feca490211e88db4f449dfdb7acce39 (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.py | 13 |
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): |
