1# Copyright 2010 Google Inc. All Rights Reserved.
2"""lock_machine.py related unit-tests.
3
4MachineManagerTest tests MachineManager.
5"""
6
7from __future__ import print_function
8
9__author__ = 'asharif@google.com (Ahmad Sharif)'
10
11from multiprocessing import Process
12import time
13import unittest
14
15import file_lock_machine
16
17
18def LockAndSleep(machine):
19  file_lock_machine.Machine(machine, auto=True).Lock(exclusive=True)
20  time.sleep(1)
21
22
23class MachineTest(unittest.TestCase):
24  """Class for testing machine locking."""
25
26  def setUp(self):
27    pass
28
29  def testRepeatedUnlock(self):
30    mach = file_lock_machine.Machine('qqqraymes.mtv')
31    for _ in range(10):
32      self.assertFalse(mach.Unlock())
33    mach = file_lock_machine.Machine('qqqraymes.mtv', auto=True)
34    for _ in range(10):
35      self.assertFalse(mach.Unlock())
36
37  def testLockUnlock(self):
38    mach = file_lock_machine.Machine('otter.mtv', '/tmp')
39    for _ in range(10):
40      self.assertTrue(mach.Lock(exclusive=True))
41      self.assertTrue(mach.Unlock(exclusive=True))
42
43    mach = file_lock_machine.Machine('otter.mtv', '/tmp', True)
44    for _ in range(10):
45      self.assertTrue(mach.Lock(exclusive=True))
46      self.assertTrue(mach.Unlock(exclusive=True))
47
48  def testSharedLock(self):
49    mach = file_lock_machine.Machine('chrotomation.mtv')
50    for _ in range(10):
51      self.assertTrue(mach.Lock(exclusive=False))
52    for _ in range(10):
53      self.assertTrue(mach.Unlock(exclusive=False))
54    self.assertTrue(mach.Lock(exclusive=True))
55    self.assertTrue(mach.Unlock(exclusive=True))
56
57    mach = file_lock_machine.Machine('chrotomation.mtv', auto=True)
58    for _ in range(10):
59      self.assertTrue(mach.Lock(exclusive=False))
60    for _ in range(10):
61      self.assertTrue(mach.Unlock(exclusive=False))
62    self.assertTrue(mach.Lock(exclusive=True))
63    self.assertTrue(mach.Unlock(exclusive=True))
64
65  def testExclusiveLock(self):
66    mach = file_lock_machine.Machine('atree.mtv')
67    self.assertTrue(mach.Lock(exclusive=True))
68    for _ in range(10):
69      self.assertFalse(mach.Lock(exclusive=True))
70      self.assertFalse(mach.Lock(exclusive=False))
71    self.assertTrue(mach.Unlock(exclusive=True))
72
73    mach = file_lock_machine.Machine('atree.mtv', auto=True)
74    self.assertTrue(mach.Lock(exclusive=True))
75    for _ in range(10):
76      self.assertFalse(mach.Lock(exclusive=True))
77      self.assertFalse(mach.Lock(exclusive=False))
78    self.assertTrue(mach.Unlock(exclusive=True))
79
80  def testExclusiveState(self):
81    mach = file_lock_machine.Machine('testExclusiveState')
82    self.assertTrue(mach.Lock(exclusive=True))
83    for _ in range(10):
84      self.assertFalse(mach.Lock(exclusive=False))
85    self.assertTrue(mach.Unlock(exclusive=True))
86
87    mach = file_lock_machine.Machine('testExclusiveState', auto=True)
88    self.assertTrue(mach.Lock(exclusive=True))
89    for _ in range(10):
90      self.assertFalse(mach.Lock(exclusive=False))
91    self.assertTrue(mach.Unlock(exclusive=True))
92
93  def testAutoLockGone(self):
94    mach = file_lock_machine.Machine('lockgone', auto=True)
95    p = Process(target=LockAndSleep, args=('lockgone',))
96    p.start()
97    time.sleep(1.1)
98    p.join()
99    self.assertTrue(mach.Lock(exclusive=True))
100
101  def testAutoLockFromOther(self):
102    mach = file_lock_machine.Machine('other_lock', auto=True)
103    p = Process(target=LockAndSleep, args=('other_lock',))
104    p.start()
105    time.sleep(0.5)
106    self.assertFalse(mach.Lock(exclusive=True))
107    p.join()
108    time.sleep(0.6)
109    self.assertTrue(mach.Lock(exclusive=True))
110
111  def testUnlockByOthers(self):
112    mach = file_lock_machine.Machine('other_unlock', auto=True)
113    p = Process(target=LockAndSleep, args=('other_unlock',))
114    p.start()
115    time.sleep(0.5)
116    self.assertTrue(mach.Unlock(exclusive=True))
117    self.assertTrue(mach.Lock(exclusive=True))
118
119
120if __name__ == '__main__':
121  unittest.main()
122