##// END OF EJS Templates
chgserver: invalidate the server if extensions fail to load...
chgserver: invalidate the server if extensions fail to load Previously, if extensions fail to load, chg server will just keep working without those extensions. It will print a warning message but only if a new server starts. This patch invalidates the server if any extension failed to load, but still serve the client (hopefully just) once. It will help chg pass some test cases of test-bad-extension.t.

File last commit:

r27786:4a7dc29b default
r28536:a979f5b0 default
Show More
test-ctxmanager.py
79 lines | 2.4 KiB | text/x-python | PythonLexer
/ tests / test-ctxmanager.py
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 from __future__ import absolute_import
import silenttestrunner
import unittest
from mercurial.util import ctxmanager
class contextmanager(object):
def __init__(self, name, trace):
self.name = name
self.entered = False
self.exited = False
self.trace = trace
def __enter__(self):
self.entered = True
self.trace(('enter', self.name))
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.exited = exc_type, exc_val, exc_tb
self.trace(('exit', self.name))
def __repr__(self):
return '<ctx %r>' % self.name
class ctxerror(Exception):
pass
class raise_on_enter(contextmanager):
def __enter__(self):
self.trace(('raise', self.name))
raise ctxerror(self.name)
class raise_on_exit(contextmanager):
def __exit__(self, exc_type, exc_val, exc_tb):
self.trace(('raise', self.name))
raise ctxerror(self.name)
def ctxmgr(name, trace):
return lambda: contextmanager(name, trace)
class test_ctxmanager(unittest.TestCase):
def test_basics(self):
trace = []
addtrace = trace.append
with ctxmanager(ctxmgr('a', addtrace), ctxmgr('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 a, b = c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 c.atexit(addtrace, ('atexit', 'x'))
c.atexit(addtrace, ('atexit', 'y'))
self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'),
('atexit', 'y'), ('atexit', 'x'),
('exit', 'b'), ('exit', 'a')])
def test_raise_on_enter(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 with ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_enter('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('unreachable')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('raise', 'b'), ('exit', 'a')])
def test_raise_on_exit(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 with ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_exit('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('running')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'), 'running',
('raise', 'b'), ('exit', 'a')])
if __name__ == '__main__':
silenttestrunner.main(__name__)