openSUSE-release-tools/tests/obslock_tests.py
2017-05-08 21:47:12 -05:00

145 lines
4.2 KiB
Python

from datetime import datetime
import unittest
from osclib.conf import Config
from osclib.obslock import OBSLock
from obs import APIURL
from obs import PROJECT
from obs import OBS
class TestOBSLock(unittest.TestCase):
def setUp(self):
self.obs = OBS()
Config(PROJECT)
def obs_lock(self, reason='list'):
return OBSLock(APIURL, PROJECT, reason=reason)
def assertLockFail(self, lock):
with self.assertRaises(SystemExit):
with lock:
self.assertFalse(lock.locked)
def test_lock(self):
lock = self.obs_lock()
self.assertFalse(lock.locked)
with lock:
self.assertTrue(lock.locked)
user, reason, reason_sub, ts = lock._parse(lock._read())
self.assertIsNotNone(user)
self.assertEqual(reason, 'list')
self.assertIsNone(reason_sub)
self.assertIsInstance(ts, datetime)
self.assertFalse(lock.locked)
def test_locked_self(self, hold=False):
lock1 = self.obs_lock()
lock2 = self.obs_lock()
self.assertFalse(lock1.locked)
self.assertFalse(lock2.locked)
with lock1:
self.assertTrue(lock1.locked)
self.assertLockFail(lock2)
if not hold:
# A hold will remain locked.
self.assertFalse(lock1.locked)
self.assertFalse(lock2.locked)
def test_hold(self):
lock = self.obs_lock('lock')
self.assertFalse(lock.locked)
with lock:
self.assertTrue(lock.locked)
lock.hold('test')
self.assertTrue(lock.locked)
# Same constraints should apply since same user against hold.
self.test_locked_self(hold=True)
# Hold should remain after subcommands are executed.
user, reason, reason_sub, ts = lock._parse(lock._read())
self.assertIsNotNone(user)
self.assertEqual(reason, 'hold: test')
self.assertIsNone(reason_sub)
self.assertIsInstance(ts, datetime)
# Other users should not bypass hold.
lock_user2 = self.obs_lock()
lock_user2.user = 'other'
self.assertLockFail(lock_user2)
lock.release(force=True)
self.assertFalse(lock.locked)
def test_expire(self):
lock1 = self.obs_lock()
lock2 = self.obs_lock()
lock2.ttl = 0
lock2.user = 'user2'
self.assertFalse(lock1.locked)
self.assertFalse(lock2.locked)
with lock1:
self.assertTrue(lock1.locked)
with lock2:
self.assertTrue(lock2.locked)
user, _, _, _ = lock2._parse(lock2._read())
self.assertEqual(user, lock2.user)
def test_expire_hold(self):
lock1 = self.obs_lock('lock')
lock2 = self.obs_lock('override')
lock2.ttl = 0
lock2.user = 'user2'
self.assertFalse(lock1.locked)
self.assertFalse(lock2.locked)
with lock1:
self.assertTrue(lock1.locked)
lock1.hold('test')
with lock2:
self.assertTrue(lock2.locked)
user, reason, reason_sub, _ = lock2._parse(lock2._read())
self.assertEqual(user, lock2.user)
self.assertEqual(reason, 'override')
self.assertEqual(reason_sub, None, 'does not inherit hold')
def test_reserved_characters(self):
lock = self.obs_lock('some reason @ #night')
with lock:
_, reason, _, _ = lock._parse(lock._read())
self.assertEqual(reason, 'some reason at hashnight')
def test_needed(self):
lock1 = self.obs_lock()
lock2 = self.obs_lock('unlock')
lock2.user = 'user2'
lock2.needed = False
self.assertFalse(lock1.locked)
self.assertFalse(lock2.locked)
with lock1:
self.assertTrue(lock1.locked)
with lock2:
self.assertFalse(lock2.locked)
user, _, _, _ = lock2._parse(lock2._read())
self.assertEqual(user, lock1.user, 'lock1 remains')
lock2.release(force=True)
user, _, _, _ = lock2._parse(lock2._read())
self.assertEqual(user, None, 'unlocked')