comparison tests/test-lock.py @ 26321:db4c192cb9b3

lock: move acquirefn call to inside the lock We're going to need to call it again as part of reinitialization after a subprocess inherits the lock.
author Siddharth Agarwal <sid0@fb.com>
date Tue, 22 Sep 2015 14:09:42 -0700
parents c4b667a7a51d
children 94dc10834b79
comparison
equal deleted inserted replaced
26320:3ac7acb99b04 26321:db4c192cb9b3
13 testlockname = 'testlock' 13 testlockname = 'testlock'
14 14
15 class teststate(object): 15 class teststate(object):
16 def __init__(self, testcase): 16 def __init__(self, testcase):
17 self._testcase = testcase 17 self._testcase = testcase
18 self._acquirecalled = False
18 self._releasecalled = False 19 self._releasecalled = False
19 self._postreleasecalled = False 20 self._postreleasecalled = False
20 d = tempfile.mkdtemp(dir=os.getcwd()) 21 d = tempfile.mkdtemp(dir=os.getcwd())
21 self.vfs = scmutil.vfs(d, audit=False) 22 self.vfs = scmutil.vfs(d, audit=False)
22 23
23 def makelock(self, *args, **kwargs): 24 def makelock(self, *args, **kwargs):
24 l = lock.lock(self.vfs, testlockname, releasefn=self.releasefn, *args, 25 l = lock.lock(self.vfs, testlockname, releasefn=self.releasefn,
25 **kwargs) 26 acquirefn=self.acquirefn, *args, **kwargs)
26 l.postrelease.append(self.postreleasefn) 27 l.postrelease.append(self.postreleasefn)
27 return l 28 return l
29
30 def acquirefn(self):
31 self._acquirecalled = True
28 32
29 def releasefn(self): 33 def releasefn(self):
30 self._releasecalled = True 34 self._releasecalled = True
31 35
32 def postreleasefn(self): 36 def postreleasefn(self):
33 self._postreleasecalled = True 37 self._postreleasecalled = True
38
39 def assertacquirecalled(self, called):
40 self._testcase.assertEqual(
41 self._acquirecalled, called,
42 'expected acquire to be %s but was actually %s' % (
43 self._tocalled(called),
44 self._tocalled(self._acquirecalled),
45 ))
46
47 def resetacquirefn(self):
48 self._acquirecalled = False
34 49
35 def assertreleasecalled(self, called): 50 def assertreleasecalled(self, called):
36 self._testcase.assertEqual( 51 self._testcase.assertEqual(
37 self._releasecalled, called, 52 self._releasecalled, called,
38 'expected release to be %s but was actually %s' % ( 53 'expected release to be %s but was actually %s' % (
71 86
72 class testlock(unittest.TestCase): 87 class testlock(unittest.TestCase):
73 def testlock(self): 88 def testlock(self):
74 state = teststate(self) 89 state = teststate(self)
75 lock = state.makelock() 90 lock = state.makelock()
91 state.assertacquirecalled(True)
76 lock.release() 92 lock.release()
77 state.assertreleasecalled(True) 93 state.assertreleasecalled(True)
78 state.assertpostreleasecalled(True) 94 state.assertpostreleasecalled(True)
79 state.assertlockexists(False) 95 state.assertlockexists(False)
80 96
81 def testrecursivelock(self): 97 def testrecursivelock(self):
82 state = teststate(self) 98 state = teststate(self)
83 lock = state.makelock() 99 lock = state.makelock()
100 state.assertacquirecalled(True)
101
102 state.resetacquirefn()
84 lock.lock() 103 lock.lock()
104 # recursive lock should not call acquirefn again
105 state.assertacquirecalled(False)
106
85 lock.release() # brings lock refcount down from 2 to 1 107 lock.release() # brings lock refcount down from 2 to 1
86 state.assertreleasecalled(False) 108 state.assertreleasecalled(False)
87 state.assertpostreleasecalled(False) 109 state.assertpostreleasecalled(False)
88 state.assertlockexists(True) 110 state.assertlockexists(True)
89 111
93 state.assertlockexists(False) 115 state.assertlockexists(False)
94 116
95 def testlockfork(self): 117 def testlockfork(self):
96 state = teststate(self) 118 state = teststate(self)
97 lock = state.makelock() 119 lock = state.makelock()
120 state.assertacquirecalled(True)
98 lock.lock() 121 lock.lock()
99 # fake a fork 122 # fake a fork
100 lock.pid += 1 123 lock.pid += 1
101 lock.release() 124 lock.release()
102 state.assertreleasecalled(False) 125 state.assertreleasecalled(False)