#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2019 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """lock_machine.py related unit-tests. MachineManagerTest tests MachineManager. """ __author__ = "asharif@google.com (Ahmad Sharif)" from multiprocessing import Process import time import unittest import file_lock_machine def LockAndSleep(machine): file_lock_machine.Machine(machine, "/tmp", auto=True).Lock(exclusive=True) time.sleep(1) class MachineTest(unittest.TestCase): """Class for testing machine locking.""" def setUp(self): pass def testRepeatedUnlock(self): mach = file_lock_machine.Machine("qqqraymes.mtv", "/tmp") for _ in range(10): self.assertTrue(mach.Unlock()) mach = file_lock_machine.Machine("qqqraymes.mtv", "/tmp", auto=True) for _ in range(10): self.assertTrue(mach.Unlock()) def testLockUnlock(self): mach = file_lock_machine.Machine("otter.mtv", "/tmp") for _ in range(10): self.assertTrue(mach.Lock(exclusive=True)) self.assertTrue(mach.Unlock(exclusive=True)) mach = file_lock_machine.Machine("otter.mtv", "/tmp", True) for _ in range(10): self.assertTrue(mach.Lock(exclusive=True)) self.assertTrue(mach.Unlock(exclusive=True)) def testSharedLock(self): mach = file_lock_machine.Machine("chrotomation.mtv", "/tmp") for _ in range(10): self.assertTrue(mach.Lock(exclusive=False)) for _ in range(10): self.assertTrue(mach.Unlock(exclusive=False)) self.assertTrue(mach.Lock(exclusive=True)) self.assertTrue(mach.Unlock(exclusive=True)) mach = file_lock_machine.Machine("chrotomation.mtv", "/tmp", auto=True) for _ in range(10): self.assertTrue(mach.Lock(exclusive=False)) for _ in range(10): self.assertTrue(mach.Unlock(exclusive=False)) self.assertTrue(mach.Lock(exclusive=True)) self.assertTrue(mach.Unlock(exclusive=True)) def testExclusiveLock(self): mach = file_lock_machine.Machine("atree.mtv", "/tmp") self.assertTrue(mach.Lock(exclusive=True)) for _ in range(10): self.assertFalse(mach.Lock(exclusive=True)) self.assertFalse(mach.Lock(exclusive=False)) self.assertTrue(mach.Unlock(exclusive=True)) mach = file_lock_machine.Machine("atree.mtv", "/tmp", auto=True) self.assertTrue(mach.Lock(exclusive=True)) for _ in range(10): self.assertFalse(mach.Lock(exclusive=True)) self.assertFalse(mach.Lock(exclusive=False)) self.assertTrue(mach.Unlock(exclusive=True)) def testExclusiveState(self): mach = file_lock_machine.Machine("testExclusiveState", "/tmp") self.assertTrue(mach.Lock(exclusive=True)) for _ in range(10): self.assertFalse(mach.Lock(exclusive=False)) self.assertTrue(mach.Unlock(exclusive=True)) mach = file_lock_machine.Machine( "testExclusiveState", "/tmp", auto=True ) self.assertTrue(mach.Lock(exclusive=True)) for _ in range(10): self.assertFalse(mach.Lock(exclusive=False)) self.assertTrue(mach.Unlock(exclusive=True)) def testAutoLockGone(self): mach = file_lock_machine.Machine("lockgone", "/tmp", auto=True) p = Process(target=LockAndSleep, args=("lockgone",)) p.start() time.sleep(1.1) p.join() self.assertTrue(mach.Lock(exclusive=True)) def testAutoLockFromOther(self): mach = file_lock_machine.Machine("other_lock", "/tmp", auto=True) p = Process(target=LockAndSleep, args=("other_lock",)) p.start() time.sleep(0.5) self.assertFalse(mach.Lock(exclusive=True)) p.join() time.sleep(0.6) self.assertTrue(mach.Lock(exclusive=True)) def testUnlockByOthers(self): mach = file_lock_machine.Machine("other_unlock", "/tmp", auto=True) p = Process(target=LockAndSleep, args=("other_unlock",)) p.start() time.sleep(0.5) self.assertTrue(mach.Unlock(exclusive=True)) self.assertTrue(mach.Lock(exclusive=True)) if __name__ == "__main__": unittest.main()