#!/usr/bin/env python3 # Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) import unittest from threading import Condition, Event, Lock from test_support import pyro_only class LockTests(unittest.TestCase): def test_lock_acquire_and_release_locks_and_releases(self): lock = Lock() self.assertFalse(lock.locked()) self.assertTrue(lock.acquire()) self.assertTrue(lock.locked()) lock.release() self.assertFalse(lock.locked()) def test_lock_as_context_manager_locks_and_releases(self): lock = Lock() self.assertFalse(lock.locked()) with lock: self.assertTrue(lock.locked()) self.assertFalse(lock.locked()) def test_lock_acquire_nonblocking_locks(self): lock = Lock() self.assertFalse(lock.locked()) self.assertTrue(lock.acquire(False)) self.assertTrue(lock.locked()) lock.release() def test_lock_acquire_nonblocking_does_not_lock(self): lock = Lock() self.assertTrue(lock.acquire()) self.assertTrue(lock.locked()) self.assertFalse(lock.acquire(False)) self.assertTrue(lock.locked()) lock.release() self.assertTrue(lock.acquire(False)) self.assertTrue(lock.locked()) self.assertFalse(lock.acquire(False)) self.assertTrue(lock.locked()) lock.release() class ConditionTests(unittest.TestCase): def test_dunder_init_creates_lock(self): c = Condition() self.assertIsNotNone(c._lock) @pyro_only def test_enter_exit_functionality(self): c = Condition() lock_count = c._lock._count with c: self.assertEqual(lock_count + 1, c._lock._count) self.assertEqual(lock_count, c._lock._count) class EventTests(unittest.TestCase): def test_dunder_init_clears_flag(self): e = Event() self.assertFalse(e.is_set()) def test_clear_clears_flag(self): e = Event() e.set() self.assertTrue(e.is_set()) e.clear() self.assertFalse(e.is_set()) def test_set_sets_flag(self): e = Event() self.assertFalse(e.is_set()) e.set() self.assertTrue(e.is_set()) def test_wait_on_set_flag_returns(self): e = Event() e.set() e.wait() val = e.wait(5) self.assertTrue(val) if __name__ == "__main__": unittest.main()