Mercurial > hg
comparison tests/test-lock.py @ 26386:146cccdb282b
test-lock.py: fix testing for forks
The earlier test worked only because the held count went up to 2, so the first
release brought it down to 1. Making a copy of the lock fixes that issue.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Thu, 24 Sep 2015 22:00:51 -0700 |
parents | fb1a424e8bff |
children | e16f80f89a29 |
comparison
equal
deleted
inserted
replaced
26385:fb1a424e8bff | 26386:146cccdb282b |
---|---|
1 from __future__ import absolute_import | 1 from __future__ import absolute_import |
2 | 2 |
3 import copy | |
3 import os | 4 import os |
4 import silenttestrunner | 5 import silenttestrunner |
5 import tempfile | 6 import tempfile |
7 import types | |
6 import unittest | 8 import unittest |
7 | 9 |
8 from mercurial import ( | 10 from mercurial import ( |
9 lock, | 11 lock, |
10 scmutil, | 12 scmutil, |
11 ) | 13 ) |
12 | 14 |
13 testlockname = 'testlock' | 15 testlockname = 'testlock' |
16 | |
17 # work around http://bugs.python.org/issue1515 | |
18 if types.MethodType not in copy._deepcopy_dispatch: | |
19 def _deepcopy_method(x, memo): | |
20 return type(x)(x.im_func, copy.deepcopy(x.im_self, memo), x.im_class) | |
21 copy._deepcopy_dispatch[types.MethodType] = _deepcopy_method | |
14 | 22 |
15 class lockwrapper(lock.lock): | 23 class lockwrapper(lock.lock): |
16 def __init__(self, pidoffset, *args, **kwargs): | 24 def __init__(self, pidoffset, *args, **kwargs): |
17 # lock.lock.__init__() calls lock(), so the pidoffset assignment needs | 25 # lock.lock.__init__() calls lock(), so the pidoffset assignment needs |
18 # to be earlier | 26 # to be earlier |
126 | 134 |
127 def testlockfork(self): | 135 def testlockfork(self): |
128 state = teststate(self, tempfile.mkdtemp(dir=os.getcwd())) | 136 state = teststate(self, tempfile.mkdtemp(dir=os.getcwd())) |
129 lock = state.makelock() | 137 lock = state.makelock() |
130 state.assertacquirecalled(True) | 138 state.assertacquirecalled(True) |
131 lock.lock() | 139 |
132 # fake a fork | 140 # fake a fork |
133 lock.pid += 1 | 141 forklock = copy.deepcopy(lock) |
134 lock.release() | 142 forklock._pidoffset = 1 |
143 forklock.release() | |
135 state.assertreleasecalled(False) | 144 state.assertreleasecalled(False) |
136 state.assertpostreleasecalled(False) | 145 state.assertpostreleasecalled(False) |
137 state.assertlockexists(True) | 146 state.assertlockexists(True) |
138 | 147 |
139 # release the actual lock | 148 # release the actual lock |
140 lock.pid -= 1 | |
141 lock.release() | 149 lock.release() |
142 state.assertreleasecalled(True) | 150 state.assertreleasecalled(True) |
143 state.assertpostreleasecalled(True) | 151 state.assertpostreleasecalled(True) |
144 state.assertlockexists(False) | 152 state.assertlockexists(False) |
145 | 153 |