import threading import unittest from os import path import sys from time import sleep try: import redis except ImportError: print("Redis tests won't be run") pass sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) import LibreNMS class TestLocks(unittest.TestCase): def setUp(self): pass @staticmethod def lock_thread(manager, lock_name, expiration, unlock_sleep=0): manager.lock(lock_name, 'lock_thread', expiration) if unlock_sleep: sleep(unlock_sleep) manager.unlock(lock_name, 'lock_thread') def test_threading_lock(self): lm = LibreNMS.ThreadingLock() thread = threading.Thread(target=self.lock_thread, args=(lm, 'first.lock', 2, 1)) thread.daemon = True thread.start() sleep(0.05) self.assertFalse(lm.lock('first.lock', 'main_thread', 0), "Acquired lock when it is held by thread") self.assertFalse(lm.unlock('first.lock', 'main_thread'), "Unlocked lock main doesn't own") sleep(1.1) self.assertTrue(lm.lock('first.lock', 'main_thread', 1), "Could not acquire lock previously held by thread") self.assertFalse(lm.lock('first.lock', 'main_thread', 1, False), "Was able to re-lock a lock main owns") self.assertTrue(lm.lock('first.lock', 'main_thread', 1, True), "Could not re-lock a lock main owns") self.assertTrue(lm.check_lock('first.lock')) self.assertTrue(lm.unlock('first.lock', 'main_thread'), "Could not unlock lock main holds") self.assertFalse(lm.unlock('first.lock', 'main_thread'), "Unlocked an unlocked lock?") self.assertFalse(lm.check_lock('first.lock')) def test_redis_lock(self): if 'redis' not in sys.modules: self.assertTrue(True, 'Skipped Redis tests') else: rc = redis.Redis() rc.delete('lock:redis.lock') # make sure no previous data exists lm = LibreNMS.RedisLock(namespace='lock') thread = threading.Thread(target=self.lock_thread, args=(lm, 'redis.lock', 2, 1)) thread.daemon = True thread.start() sleep(0.05) self.assertFalse(lm.lock('redis.lock', 'main_thread', 1), "Acquired lock when it is held by thread") self.assertFalse(lm.unlock('redis.lock', 'main_thread'), "Unlocked lock main doesn't own") sleep(1.1) self.assertTrue(lm.lock('redis.lock', 'main_thread', 1), "Could not acquire lock previously held by thread") self.assertFalse(lm.lock('redis.lock', 'main_thread', 1), "Relocked an existing lock") self.assertTrue(lm.lock('redis.lock', 'main_thread', 1, True), "Could not re-lock a lock main owns") self.assertTrue(lm.unlock('redis.lock', 'main_thread'), "Could not unlock lock main holds") self.assertFalse(lm.unlock('redis.lock', 'main_thread'), "Unlocked an unlocked lock?") def queue_thread(self, manager, expect, wait=True): self.assertEqual(expect, manager.get(wait), 'Got unexpected data in thread') def test_redis_queue(self): if 'redis' not in sys.modules: self.assertTrue(True, 'Skipped Redis tests') else: rc = redis.Redis() rc.delete('queue:testing') # make sure no previous data exists qm = LibreNMS.RedisUniqueQueue('testing', namespace='queue') thread = threading.Thread(target=self.queue_thread, args=(qm, None, False)) thread.daemon = True thread.start() thread = threading.Thread(target=self.queue_thread, args=(qm, '2')) thread.daemon = True thread.start() qm.put(2) qm.put(3) qm.put(4) sleep(0.05) self.assertEqual(2, qm.qsize()) self.assertEqual('3', qm.get()) self.assertEqual('4', qm.get(), "Did not get second item in queue") self.assertEqual(None, qm.get_nowait(), "Did not get None when queue should be empty") self.assertTrue(qm.empty(), "Queue should be empty") class TestTimer(unittest.TestCase): def setUp(self): self.counter = 0 def count(self): self.counter += 1 def test_recurring_timer(self): self.assertEqual(0, self.counter) timer = LibreNMS.RecurringTimer(0.5, self.count) timer.start() self.assertEqual(0, self.counter) sleep(0.5) self.assertEqual(1, self.counter) self.assertEqual(1, self.counter) sleep(0.5) self.assertEqual(2, self.counter) timer.stop() self.assertTrue(timer._event.is_set()) sleep(0.5) self.assertEqual(2, self.counter) timer.start() sleep(0.5) self.assertEqual(3, self.counter) timer.stop() if __name__ == '__main__': unittest.main()