summaryrefslogtreecommitdiff
path: root/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
diff options
context:
space:
mode:
Diffstat (limited to 'oslo_concurrency/tests/unit/test_lockutils_eventlet.py')
-rw-r--r--oslo_concurrency/tests/unit/test_lockutils_eventlet.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/oslo_concurrency/tests/unit/test_lockutils_eventlet.py b/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
index cb09298..24fd7f6 100644
--- a/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
+++ b/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
@@ -51,3 +51,66 @@ class TestFileLocks(test_base.BaseTestCase):
pool.waitall()
self.assertTrue(self.completed)
+
+
+class TestInternalLock(test_base.BaseTestCase):
+ def _test_internal_lock_with_two_threads(self, fair, spawn):
+ self.other_started = eventlet.event.Event()
+ self.other_finished = eventlet.event.Event()
+
+ def other():
+ self.other_started.send('started')
+ with lockutils.lock("my-lock", fair=fair):
+ pass
+ self.other_finished.send('finished')
+
+ with lockutils.lock("my-lock", fair=fair):
+ # holding the lock and starting another thread that also wants to
+ # take it before finishes
+ spawn(other)
+ # let the other thread start
+ self.other_started.wait()
+ eventlet.sleep(0)
+ # the other thread should not have finished as it would need the
+ # lock we are holding
+ self.assertIsNone(
+ self.other_finished.wait(0.5),
+ "Two threads was able to take the same lock",
+ )
+
+ # we released the lock, let the other thread take it and run to
+ # completion
+ result = self.other_finished.wait()
+ self.assertEqual('finished', result)
+
+ def test_lock_with_spawn(self):
+ self._test_internal_lock_with_two_threads(
+ fair=False, spawn=eventlet.spawn
+ )
+
+ def test_lock_with_spawn_n(self):
+ self._test_internal_lock_with_two_threads(
+ fair=False, spawn=eventlet.spawn_n
+ )
+
+ def test_fair_lock_with_spawn(self):
+ self._test_internal_lock_with_two_threads(
+ fair=True, spawn=eventlet.spawn
+ )
+
+ def test_fair_lock_with_spawn_n(self):
+ # This is bug 1988311 where spawn_n does not work with fair locks
+ ex = self.assertRaises(
+ AssertionError,
+ self._test_internal_lock_with_two_threads,
+ fair=True,
+ spawn=eventlet.spawn_n,
+ )
+ self.assertEqual(
+ "'finished' is not None: "
+ "Two threads was able to take the same lock",
+ str(ex),
+ )
+ # self._test_internal_lock_with_two_threads(
+ # fair=True, spawn=eventlet.spawn_n
+ # )