Commit b277307e authored by Barry Warsaw's avatar Barry Warsaw

* When --sort is used, watch out for continuation lines, which shouldn't get

   sorted.

 * Fix stderr output in sub-runners, and move the -e test option to -E.
parent 66440232
......@@ -19,3 +19,4 @@ eggs
diff.txt
distribute-*.egg
distribute-*.tar.gz
.coverage
......@@ -110,4 +110,9 @@ class TestConf(unittest.TestCase):
self.command.process(self.args)
last_line = ''
for line in output.getvalue().splitlines():
self.assertTrue(line > last_line)
if not line.startswith('['):
# This is a continuation line. --sort doesn't sort these.
continue
self.assertTrue(line > last_line,
'{} !> {}'.format(line, last_line))
last_line = line
......@@ -117,8 +117,7 @@ def initialize(propagate=None):
# sublogs. The root logger should log to stderr.
logging.basicConfig(format=config.logging.root.format,
datefmt=config.logging.root.datefmt,
level=as_log_level(config.logging.root.level),
stream=sys.stderr)
level=as_log_level(config.logging.root.level))
# Create the sub-loggers. Note that we'll redirect flufl.lock to
# mailman.locks.
for logger_config in config.logger_configs:
......
......@@ -16,7 +16,8 @@ Development
-----------
* Mailman 3 no longer uses ``zc.buildout`` and tests are now run by the
``nose2`` test runner. See ``src/mailman/docs/START.rst`` for details on
how to build Mailman and run the test suite.
how to build Mailman and run the test suite. Also, use ``-P`` to select a
test pattern and ``-E`` to enable stderr debugging in runners.
* Use the ``enum34`` package instead of ``flufl.enum``.
REST
......
......@@ -143,7 +143,6 @@ class ConfigLayer(MockAndMonkeyLayer):
if cls.stderr:
test_config += dedent("""
[logging.root]
propagate: yes
level: debug
""")
# Enable log message propagation and reset the log paths so that the
......@@ -154,7 +153,7 @@ class ConfigLayer(MockAndMonkeyLayer):
continue
logger_name = 'mailman.' + sub_name
log = logging.getLogger(logger_name)
#log.propagate = True
log.propagate = cls.stderr
# Reopen the file to a new path that tests can get at. Instead of
# using the configuration file path though, use a path that's
# specific to the logger so that tests can find expected output
......@@ -170,15 +169,16 @@ class ConfigLayer(MockAndMonkeyLayer):
propagate: yes
level: debug
"""), dict(name=sub_name, path=path))
# zope.testing sets up logging before we get to our own initialization
# function. This messes with the root logger, so explicitly set it to
# go to stderr.
# The root logger will already have a handler, but it's not the right
# handler. Remove that and set our own.
if cls.stderr:
console = logging.StreamHandler(sys.stderr)
formatter = logging.Formatter(config.logging.root.format,
config.logging.root.datefmt)
console.setFormatter(formatter)
logging.getLogger().addHandler(console)
root = logging.getLogger()
del root.handlers[:]
root.addHandler(console)
# Write the configuration file for subprocesses and set up the config
# object to pass that properly on the -C option.
config_file = os.path.join(cls.var_dir, 'test.cfg')
......@@ -209,27 +209,6 @@ class ConfigLayer(MockAndMonkeyLayer):
# Flag to indicate that loggers should propagate to the console.
stderr = False
@classmethod
def enable_stderr(cls):
"""Enable stderr logging if -e/--stderr is given.
We used to hack our way into the zc.testing framework, but that was
undocumented and way too fragile. Well, this probably is too, but now
we just scan sys.argv for -e/--stderr and enable logging if found.
Then we remove the option from sys.argv. This works because this
method is called before zope.testrunner sees the options.
As a bonus, we'll check an environment variable too.
"""
if '-e' in sys.argv:
cls.stderr = True
sys.argv.remove('-e')
if '--stderr' in sys.argv:
cls.stderr = True
sys.argv.remove('--stderr')
if len(os.environ.get('MM_VERBOSE_TESTLOG', '').strip()) > 0:
cls.stderr = True
# The top of our source tree, for tests that care (e.g. hooks.txt).
root_directory = None
......
......@@ -47,12 +47,19 @@ class NosePlugin(Plugin):
def __init__(self):
super(NosePlugin, self).__init__()
self.patterns = []
self.stderr = False
def set_stderr(ignore):
self.stderr = True
self.addArgument(self.patterns, 'P', 'pattern',
'Add a test matching pattern')
self.addFlag(set_stderr, 'E', 'stderr',
'Enable stderr logging to sub-runners')
def startTestRun(self, event):
MockAndMonkeyLayer.testing_mode = True
ConfigLayer.enable_stderr()
if ( self.stderr or
len(os.environ.get('MM_VERBOSE_TESTLOG', '').strip()) > 0):
ConfigLayer.stderr = True
def getTestCaseNames(self, event):
if len(self.patterns) == 0:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment