##// END OF EJS Templates
typing: add stub functions for `cext/charencoding`...
typing: add stub functions for `cext/charencoding` I'm not sure if it's better to have a separate file, and currently pytype doesn't really know how to handle these, so it's no help in figuring that out. Technically, these methods are part of the `mercurial.cext.parsers` module, so put them into the existing stub until there's a reason to split it out.

File last commit:

r49801:642e31cb default
r52834:e58f02e2 default
Show More
test-lock.py
208 lines | 5.9 KiB | text/x-python | PythonLexer
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 import copy
FUJIWARA Katsunori
lock: avoid unintentional lock acquisition at failure of readlock...
r32089 import errno
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 import tempfile
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 import types
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 import unittest
FUJIWARA Katsunori
tests: fix style issue of importing order in test-lock.py...
r40240 import silenttestrunner
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 from mercurial import (
Matt Harbison
py3: byteify test-lock.py...
r39984 encoding,
Siddharth Agarwal
lock: add a way to prevent locks from being inherited...
r26498 error,
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock,
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-lock'...
r31249 vfs as vfsmod,
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 )
Matt Harbison
py3: byteify test-lock.py...
r39984 testlockname = b'testlock'
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 # work around http://bugs.python.org/issue1515
if types.MethodType not in copy._deepcopy_dispatch:
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 def _deepcopy_method(x, memo):
Augie Fackler
python3: replace im_{self,func} with __{self,func}__ globally...
r34727 return type(x)(x.__func__, copy.deepcopy(x.__self__, memo), x.im_class)
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 copy._deepcopy_dispatch[types.MethodType] = _deepcopy_method
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
test-lock.py: add a lock wrapper that allows faking the PID...
r26384 class lockwrapper(lock.lock):
def __init__(self, pidoffset, *args, **kwargs):
# lock.lock.__init__() calls lock(), so the pidoffset assignment needs
# to be earlier
self._pidoffset = pidoffset
super(lockwrapper, self).__init__(*args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
test-lock.py: add a lock wrapper that allows faking the PID...
r26384 def _getpid(self):
timeless
util: enable getpid to be replaced...
r28027 return super(lockwrapper, self)._getpid() + self._pidoffset
Siddharth Agarwal
test-lock.py: add a lock wrapper that allows faking the PID...
r26384
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class teststate:
Siddharth Agarwal
test-lock.py: allow PID to be changed in test state...
r26385 def __init__(self, testcase, dir, pidoffset=0):
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 self._testcase = testcase
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 self._acquirecalled = False
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 self._releasecalled = False
self._postreleasecalled = False
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-lock'...
r31249 self.vfs = vfsmod.vfs(dir, audit=False)
Siddharth Agarwal
test-lock.py: allow PID to be changed in test state...
r26385 self._pidoffset = pidoffset
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
def makelock(self, *args, **kwargs):
Augie Fackler
formatting: blacken the codebase...
r43346 l = lockwrapper(
self._pidoffset,
self.vfs,
testlockname,
releasefn=self.releasefn,
acquirefn=self.acquirefn,
*args,
**kwargs
)
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 l.postrelease.append(self.postreleasefn)
return l
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 def acquirefn(self):
self._acquirecalled = True
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 def releasefn(self):
self._releasecalled = True
Kyle Lippincott
lock: pass "success" boolean to _afterlock callbacks...
r44217 def postreleasefn(self, success):
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 self._postreleasecalled = True
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 def assertacquirecalled(self, called):
self._testcase.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 self._acquirecalled,
called,
'expected acquire to be %s but was actually %s'
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 % (
self._tocalled(called),
self._tocalled(self._acquirecalled),
),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321
def resetacquirefn(self):
self._acquirecalled = False
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 def assertreleasecalled(self, called):
self._testcase.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 self._releasecalled,
called,
'expected release to be %s but was actually %s'
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 % (
self._tocalled(called),
self._tocalled(self._releasecalled),
),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
def assertpostreleasecalled(self, called):
self._testcase.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 self._postreleasecalled,
called,
'expected postrelease to be %s but was actually %s'
% (
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 self._tocalled(called),
self._tocalled(self._postreleasecalled),
Augie Fackler
formatting: blacken the codebase...
r43346 ),
)
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
def assertlockexists(self, exists):
actual = self.vfs.lexists(testlockname)
self._testcase.assertEqual(
Augie Fackler
formatting: blacken the codebase...
r43346 actual,
exists,
'expected lock to %s but actually did %s'
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 % (
self._toexists(exists),
self._toexists(actual),
),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
def _tocalled(self, called):
if called:
return 'called'
else:
return 'not called'
def _toexists(self, exists):
if exists:
Siddharth Agarwal
test-lock.py: copy-edit assertions about file existing...
r26381 return 'exist'
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 else:
Siddharth Agarwal
test-lock.py: copy-edit assertions about file existing...
r26381 return 'not exist'
Siddharth Agarwal
tests: add unit tests for locking code...
r26289
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 class testlock(unittest.TestCase):
def testlock(self):
Matt Harbison
py3: byteify test-lock.py...
r39984 state = teststate(self, tempfile.mkdtemp(dir=encoding.getcwd()))
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock = state.makelock()
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 state.assertacquirecalled(True)
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock.release()
state.assertreleasecalled(True)
state.assertpostreleasecalled(True)
state.assertlockexists(False)
def testrecursivelock(self):
Matt Harbison
py3: byteify test-lock.py...
r39984 state = teststate(self, tempfile.mkdtemp(dir=encoding.getcwd()))
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock = state.makelock()
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 state.assertacquirecalled(True)
state.resetacquirefn()
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock.lock()
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 # recursive lock should not call acquirefn again
state.assertacquirecalled(False)
Augie Fackler
formatting: blacken the codebase...
r43346 lock.release() # brings lock refcount down from 2 to 1
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 state.assertreleasecalled(False)
state.assertpostreleasecalled(False)
state.assertlockexists(True)
Augie Fackler
formatting: blacken the codebase...
r43346 lock.release() # releases the lock
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 state.assertreleasecalled(True)
state.assertpostreleasecalled(True)
state.assertlockexists(False)
def testlockfork(self):
Matt Harbison
py3: byteify test-lock.py...
r39984 state = teststate(self, tempfile.mkdtemp(dir=encoding.getcwd()))
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 lock = state.makelock()
Siddharth Agarwal
lock: move acquirefn call to inside the lock...
r26321 state.assertacquirecalled(True)
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 # fake a fork
Gregory Szorc
tests: perform a shallow copy instead of a deep copy...
r41622 forklock = copy.copy(lock)
Siddharth Agarwal
test-lock.py: fix testing for forks...
r26386 forklock._pidoffset = 1
forklock.release()
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 state.assertreleasecalled(False)
state.assertpostreleasecalled(False)
state.assertlockexists(True)
# release the actual lock
lock.release()
state.assertreleasecalled(True)
state.assertpostreleasecalled(True)
state.assertlockexists(False)
FUJIWARA Katsunori
lock: avoid unintentional lock acquisition at failure of readlock...
r32089 def testfrequentlockunlock(self):
"""This tests whether lock acquisition fails as expected, even if
(1) lock can't be acquired (makelock fails by EEXIST), and
(2) locker info can't be read in (readlock fails by ENOENT) while
retrying 5 times.
"""
Matt Harbison
py3: byteify test-lock.py...
r39984 d = tempfile.mkdtemp(dir=encoding.getcwd())
FUJIWARA Katsunori
lock: avoid unintentional lock acquisition at failure of readlock...
r32089 state = teststate(self, d)
def emulatefrequentlock(*args):
raise OSError(errno.EEXIST, "File exists")
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
lock: avoid unintentional lock acquisition at failure of readlock...
r32089 def emulatefrequentunlock(*args):
raise OSError(errno.ENOENT, "No such file or directory")
state.vfs.makelock = emulatefrequentlock
state.vfs.readlock = emulatefrequentunlock
try:
state.makelock(timeout=0)
self.fail("unexpected lock acquisition")
except error.LockHeld as why:
self.assertTrue(why.errno == errno.ETIMEDOUT)
Gregory Szorc
tests: compare against a bytes in test-lock.py...
r41623 self.assertTrue(why.locker == b"")
FUJIWARA Katsunori
lock: avoid unintentional lock acquisition at failure of readlock...
r32089 state.assertlockexists(False)
Augie Fackler
formatting: blacken the codebase...
r43346
Siddharth Agarwal
tests: add unit tests for locking code...
r26289 if __name__ == '__main__':
silenttestrunner.main(__name__)