Add plugable locking backend support. Add threadsafe file lock backend.
This commit is contained in:
+21
-12
@@ -3,48 +3,53 @@ from __future__ import unicode_literals
|
||||
import time
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils.module_loading import import_string
|
||||
|
||||
from ..exceptions import LockError
|
||||
from ..models import Lock
|
||||
|
||||
|
||||
class LockTestCase(TestCase):
|
||||
class FileLockTestCase(TestCase):
|
||||
backend_string = 'lock_manager.backends.file_lock.FileLock'
|
||||
|
||||
def setUp(self):
|
||||
self.locking_backend = import_string(self.backend_string)
|
||||
|
||||
def test_exclusive(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_1 = self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
with self.assertRaises(LockError):
|
||||
Lock.objects.acquire_lock(name='test_lock_1')
|
||||
self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
|
||||
# Cleanup
|
||||
lock_1.release()
|
||||
|
||||
def test_release(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_1 = self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
lock_1.release()
|
||||
lock_2 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_2 = self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
|
||||
# Cleanup
|
||||
lock_2.release()
|
||||
|
||||
def test_timeout_expired(self):
|
||||
Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
self.locking_backend.acquire_lock(name='test_lock_1', timeout=1)
|
||||
|
||||
# lock_1 not release and not expired, should raise LockError
|
||||
with self.assertRaises(LockError):
|
||||
Lock.objects.acquire_lock(name='test_lock_1')
|
||||
self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
|
||||
time.sleep(2)
|
||||
# lock_1 not release but has expired, should not raise LockError
|
||||
lock_2 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_2 = self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
|
||||
# Cleanup
|
||||
lock_2.release()
|
||||
|
||||
def test_double_release(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1')
|
||||
lock_1 = self.locking_backend.acquire_lock(name='test_lock_1')
|
||||
lock_1.release()
|
||||
|
||||
def test_release_expired(self):
|
||||
lock_1 = Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
lock_1 = self.locking_backend.acquire_lock(name='test_lock_1', timeout=1)
|
||||
time.sleep(2)
|
||||
lock_1.release()
|
||||
# No exception is raised even though the lock has expired.
|
||||
@@ -54,7 +59,11 @@ class LockTestCase(TestCase):
|
||||
|
||||
def test_release_expired_reaquired(self):
|
||||
time.sleep(2)
|
||||
lock_2 = Lock.objects.acquire_lock(name='test_lock_1', timeout=1)
|
||||
lock_2 = self.locking_backend.acquire_lock(name='test_lock_1', timeout=1)
|
||||
|
||||
# Cleanup
|
||||
lock_2.release()
|
||||
|
||||
|
||||
class ModelLockTestCase(FileLockTestCase):
|
||||
backend_string = 'lock_manager.backends.model_lock.ModelLock'
|
||||
Reference in New Issue
Block a user