Rev 5445: (jameinel) Remove 'log' information from "successful" tests (John A Meinel) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Sun Sep 26 15:39:53 BST 2010
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5445 [merge]
revision-id: pqm at pqm.ubuntu.com-20100926143952-qdatcpmr3xkus9h2
parent: pqm at pqm.ubuntu.com-20100924163738-had2t815v98b262p
parent: john at arbash-meinel.com-20100925203633-y0ipdyceuupti08w
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Sun 2010-09-26 15:39:52 +0100
message:
(jameinel) Remove 'log' information from "successful" tests (John A Meinel)
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/lazy_import.py lazy_import.py-20060910203832-f77c54gf3n232za0-1
bzrlib/shelf.py prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
bzrlib/strace.py strace.py-20070323001526-6zquhhw8leb9m6j8-1
bzrlib/tests/__init__.py selftest.py-20050531073622-8d0e3c8845c97a64
bzrlib/tests/per_bzrdir/__init__.py __init__.py-20100829134954-ax1jw4f3g61xgkfw-2
bzrlib/tests/per_bzrdir/test_bzrdir.py test_bzrdir.py-20100829143338-2uachgod1c3liktl-1
bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
bzrlib/tests/test_lazy_import.py test_lazy_import.py-20060910203832-f77c54gf3n232za0-2
bzrlib/tests/test_rio.py test_rio.py-20051128032247-dcd1082dfc86d3d3
bzrlib/tests/test_selftest.py test_selftest.py-20051202044319-c110a115d8c0456a
bzrlib/tests/test_setup.py test_setup.py-20051208073730-4a59a6368c4efa04
bzrlib/tests/test_status.py test_status.py-20060516190614-fbf6432e4a6e8aa5
bzrlib/tests/test_strace.py test_strace.py-20070323001526-6zquhhw8leb9m6j8-2
bzrlib/tests/test_tuned_gzip.py test_tuned_gzip.py-20060418042056-c576dfc708984968
bzrlib/tests/testui.py testsupport.py-20100914040736-dpw8sndzy6dxk8s1-1
bzrlib/tuned_gzip.py tuned_gzip.py-20060407014720-5aadc518e928e8d2
=== modified file 'NEWS'
--- a/NEWS 2010-09-24 12:53:00 +0000
+++ b/NEWS 2010-09-25 20:18:07 +0000
@@ -42,6 +42,10 @@
Internals
*********
+* When running ``bzr selftest --subunit`` the subunit stream will no
+ longer include the "log" information for tests which are considered to
+ be 'successes' (success, xfail, skip, etc) (John Arbash Meinel)
+
Testing
*******
=== modified file 'bzrlib/lazy_import.py'
--- a/bzrlib/lazy_import.py 2010-09-05 17:15:46 +0000
+++ b/bzrlib/lazy_import.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Canonical Ltd
+# Copyright (C) 2006-2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/shelf.py'
--- a/bzrlib/shelf.py 2010-09-24 15:11:57 +0000
+++ b/bzrlib/shelf.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 Canonical Ltd
+# Copyright (C) 2008, 2009, 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/strace.py'
--- a/bzrlib/strace.py 2010-09-01 19:38:55 +0000
+++ b/bzrlib/strace.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2007 Canonical Ltd
+# Copyright (C) 2007, 2009, 2010 Canonical Ltd
# Authors: Robert Collins <robert.collins at canonical.com>
#
# This program is free software; you can redistribute it and/or modify
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2010-09-17 14:27:27 +0000
+++ b/bzrlib/tests/__init__.py 2010-09-25 20:36:33 +0000
@@ -846,6 +846,22 @@
import pdb
pdb.Pdb().set_trace(sys._getframe().f_back)
+ def discardDetail(self, name):
+ """Extend the addDetail, getDetails api so we can remove a detail.
+
+ eg. bzr always adds the 'log' detail at startup, but we don't want to
+ include it for skipped, xfail, etc tests.
+
+ It is safe to call this for a detail that doesn't exist, in case this
+ gets called multiple times.
+ """
+ # We cheat. details is stored in __details which means we shouldn't
+ # touch it. but getDetails() returns the dict directly, so we can
+ # mutate it.
+ details = self.getDetails()
+ if name in details:
+ del details[name]
+
def _clear_debug_flags(self):
"""Prevent externally set debug flags affecting tests.
@@ -1569,7 +1585,12 @@
"""This test has failed for some known reason."""
raise KnownFailure(reason)
+ def _suppress_log(self):
+ """Remove the log info from details."""
+ self.discardDetail('log')
+
def _do_skip(self, result, reason):
+ self._suppress_log()
addSkip = getattr(result, 'addSkip', None)
if not callable(addSkip):
result.addSuccess(result)
@@ -1578,6 +1599,7 @@
@staticmethod
def _do_known_failure(self, result, e):
+ self._suppress_log()
err = sys.exc_info()
addExpectedFailure = getattr(result, 'addExpectedFailure', None)
if addExpectedFailure is not None:
@@ -1591,6 +1613,7 @@
reason = 'No reason given'
else:
reason = e.args[0]
+ self._suppress_log ()
addNotApplicable = getattr(result, 'addNotApplicable', None)
if addNotApplicable is not None:
result.addNotApplicable(self, reason)
@@ -1598,8 +1621,29 @@
self._do_skip(result, reason)
@staticmethod
+ def _report_skip(self, result, err):
+ """Override the default _report_skip.
+
+ We want to strip the 'log' detail. If we waint until _do_skip, it has
+ already been formatted into the 'reason' string, and we can't pull it
+ out again.
+ """
+ self._suppress_log()
+ super(TestCase, self)._report_skip(self, result, err)
+
+ @staticmethod
+ def _report_expected_failure(self, result, err):
+ """Strip the log.
+
+ See _report_skip for motivation.
+ """
+ self._suppress_log()
+ super(TestCase, self)._report_expected_failure(self, result, err)
+
+ @staticmethod
def _do_unsupported_or_skip(self, result, e):
reason = e.args[0]
+ self._suppress_log()
addNotSupported = getattr(result, 'addNotSupported', None)
if addNotSupported is not None:
result.addNotSupported(self, reason)
@@ -4459,10 +4503,20 @@
try:
from subunit import TestProtocolClient
from subunit.test_results import AutoTimingTestResultDecorator
+ class SubUnitBzrProtocolClient(TestProtocolClient):
+
+ def addSuccess(self, test, details=None):
+ # The subunit client always includes the details in the subunit
+ # stream, but we don't want to include it in ours.
+ if details is not None and 'log' in details:
+ del details['log']
+ return super(SubUnitBzrProtocolClient, self).addSuccess(
+ test, details)
+
class SubUnitBzrRunner(TextTestRunner):
def run(self, test):
result = AutoTimingTestResultDecorator(
- TestProtocolClient(self.stream))
+ SubUnitBzrProtocolClient(self.stream))
test.run(result)
return result
except ImportError:
=== modified file 'bzrlib/tests/per_bzrdir/__init__.py'
--- a/bzrlib/tests/per_bzrdir/__init__.py 2010-08-29 14:37:51 +0000
+++ b/bzrlib/tests/per_bzrdir/__init__.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2010 Canonical Ltd
+# Copyright (C) 2010 Canonical Ltd
# Authors: Robert Collins <robert.collins at canonical.com>
# Jelmer Vernooij <jelmer.vernooij at canonical.com>
# -*- coding: utf-8 -*-
=== modified file 'bzrlib/tests/per_bzrdir/test_bzrdir.py'
--- a/bzrlib/tests/per_bzrdir/test_bzrdir.py 2010-08-29 15:03:22 +0000
+++ b/bzrlib/tests/per_bzrdir/test_bzrdir.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2010 Canonical Ltd
+# Copyright (C) 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_bugtracker.py'
--- a/bzrlib/tests/test_bugtracker.py 2010-09-06 19:12:52 +0000
+++ b/bzrlib/tests/test_bugtracker.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2007 Canonical Ltd
+# Copyright (C) 2007-2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_lazy_import.py'
--- a/bzrlib/tests/test_lazy_import.py 2010-09-05 17:15:46 +0000
+++ b/bzrlib/tests/test_lazy_import.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Canonical Ltd
+# Copyright (C) 2006-2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_rio.py'
--- a/bzrlib/tests/test_rio.py 2010-09-06 06:13:52 +0000
+++ b/bzrlib/tests/test_rio.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007, 2009, 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2010-09-17 14:27:27 +0000
+++ b/bzrlib/tests/test_selftest.py 2010-09-25 20:08:01 +0000
@@ -68,7 +68,7 @@
test_sftp_transport,
TestUtil,
)
-from bzrlib.trace import note
+from bzrlib.trace import note, mutter
from bzrlib.transport import memory
from bzrlib.version import _get_bzr_source_tree
@@ -1690,6 +1690,108 @@
self.assertEqual('original', obj.test_attr)
+class _MissingFeature(tests.Feature):
+ def _probe(self):
+ return False
+missing_feature = _MissingFeature()
+
+
+def _get_test(name):
+ """Get an instance of a specific example test.
+
+ We protect this in a function so that they don't auto-run in the test
+ suite.
+ """
+
+ class ExampleTests(tests.TestCase):
+
+ def test_fail(self):
+ mutter('this was a failing test')
+ self.fail('this test will fail')
+
+ def test_error(self):
+ mutter('this test errored')
+ raise RuntimeError('gotcha')
+
+ def test_missing_feature(self):
+ mutter('missing the feature')
+ self.requireFeature(missing_feature)
+
+ def test_skip(self):
+ mutter('this test will be skipped')
+ raise tests.TestSkipped('reason')
+
+ def test_success(self):
+ mutter('this test succeeds')
+
+ def test_xfail(self):
+ mutter('test with expected failure')
+ self.knownFailure('this_fails')
+
+ def test_unexpected_success(self):
+ mutter('test with unexpected success')
+ self.expectFailure('should_fail', lambda: None)
+
+ return ExampleTests(name)
+
+
+class TestTestCaseLogDetails(tests.TestCase):
+
+ def _run_test(self, test_name):
+ test = _get_test(test_name)
+ result = testtools.TestResult()
+ test.run(result)
+ return result
+
+ def test_fail_has_log(self):
+ result = self._run_test('test_fail')
+ self.assertEqual(1, len(result.failures))
+ result_content = result.failures[0][1]
+ self.assertContainsRe(result_content, 'Text attachment: log')
+ self.assertContainsRe(result_content, 'this was a failing test')
+
+ def test_error_has_log(self):
+ result = self._run_test('test_error')
+ self.assertEqual(1, len(result.errors))
+ result_content = result.errors[0][1]
+ self.assertContainsRe(result_content, 'Text attachment: log')
+ self.assertContainsRe(result_content, 'this test errored')
+
+ def test_skip_has_no_log(self):
+ result = self._run_test('test_skip')
+ self.assertEqual(['reason'], result.skip_reasons.keys())
+ skips = result.skip_reasons['reason']
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ self.assertFalse('log' in test.getDetails())
+
+ def test_missing_feature_has_no_log(self):
+ # testtools doesn't know about addNotSupported, so it just gets
+ # considered as a skip
+ result = self._run_test('test_missing_feature')
+ self.assertEqual([missing_feature], result.skip_reasons.keys())
+ skips = result.skip_reasons[missing_feature]
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ self.assertFalse('log' in test.getDetails())
+
+ def test_xfail_has_no_log(self):
+ result = self._run_test('test_xfail')
+ self.assertEqual(1, len(result.expectedFailures))
+ result_content = result.expectedFailures[0][1]
+ self.assertNotContainsRe(result_content, 'Text attachment: log')
+ self.assertNotContainsRe(result_content, 'test with expected failure')
+
+ def test_unexpected_success_has_log(self):
+ result = self._run_test('test_unexpected_success')
+ self.assertEqual(1, len(result.unexpectedSuccesses))
+ # Inconsistency, unexpectedSuccesses is a list of tests,
+ # expectedFailures is a list of reasons?
+ test = result.unexpectedSuccesses[0]
+ details = test.getDetails()
+ self.assertTrue('log' in details)
+
+
class TestTestCloning(tests.TestCase):
"""Tests that test cloning of TestCases (as used by multiply_tests)."""
@@ -1883,7 +1985,7 @@
tree.branch.repository.bzrdir.root_transport)
-class SelfTestHelper:
+class SelfTestHelper(object):
def run_selftest(self, **kwargs):
"""Run selftest returning its output."""
@@ -2040,6 +2142,83 @@
load_list='missing file name', list_only=True)
+class TestSubunitLogDetails(tests.TestCase, SelfTestHelper):
+
+ _test_needs_features = [features.subunit]
+
+ def run_subunit_stream(self, test_name):
+ from subunit import ProtocolTestCase
+ def factory():
+ return TestUtil.TestSuite([_get_test(test_name)])
+ stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
+ test_suite_factory=factory)
+ test = ProtocolTestCase(stream)
+ result = testtools.TestResult()
+ test.run(result)
+ content = stream.getvalue()
+ return content, result
+
+ def test_fail_has_log(self):
+ content, result = self.run_subunit_stream('test_fail')
+ self.assertEqual(1, len(result.failures))
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'this test will fail')
+
+ def test_error_has_log(self):
+ content, result = self.run_subunit_stream('test_error')
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'this test errored')
+
+ def test_skip_has_no_log(self):
+ content, result = self.run_subunit_stream('test_skip')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'this test will be skipped')
+ self.assertEqual(['reason'], result.skip_reasons.keys())
+ skips = result.skip_reasons['reason']
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertFalse('log' in test.getDetails())
+
+ def test_missing_feature_has_no_log(self):
+ content, result = self.run_subunit_stream('test_missing_feature')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'missing the feature')
+ self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
+ skips = result.skip_reasons['_MissingFeature\n']
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertFalse('log' in test.getDetails())
+
+ def test_xfail_has_no_log(self):
+ content, result = self.run_subunit_stream('test_xfail')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'test with expected failure')
+ self.assertEqual(1, len(result.expectedFailures))
+ result_content = result.expectedFailures[0][1]
+ self.assertNotContainsRe(result_content, 'Text attachment: log')
+ self.assertNotContainsRe(result_content, 'test with expected failure')
+
+ def test_unexpected_success_has_log(self):
+ content, result = self.run_subunit_stream('test_unexpected_success')
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'test with unexpected success')
+ self.expectFailure('subunit treats "unexpectedSuccess"'
+ ' as a plain success',
+ self.assertEqual, 1, len(result.unexpectedSuccesses))
+ self.assertEqual(1, len(result.unexpectedSuccesses))
+ test = result.unexpectedSuccesses[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertTrue('log' in test.getDetails())
+
+ def test_success_has_no_log(self):
+ content, result = self.run_subunit_stream('test_success')
+ self.assertEqual(1, result.testsRun)
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'this test succeeds')
+
+
class TestRunBzr(tests.TestCase):
out = ''
=== modified file 'bzrlib/tests/test_setup.py'
--- a/bzrlib/tests/test_setup.py 2010-09-02 00:49:06 +0000
+++ b/bzrlib/tests/test_setup.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2008, 2009, 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_status.py'
--- a/bzrlib/tests/test_status.py 2010-08-31 13:49:48 +0000
+++ b/bzrlib/tests/test_status.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005 Canonical Ltd
+# Copyright (C) 2006-2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_strace.py'
--- a/bzrlib/tests/test_strace.py 2010-09-01 19:38:55 +0000
+++ b/bzrlib/tests/test_strace.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, 2010 Canonical Ltd
+# Copyright (C) 2007-2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/test_tuned_gzip.py'
--- a/bzrlib/tests/test_tuned_gzip.py 2010-08-29 18:29:22 +0000
+++ b/bzrlib/tests/test_tuned_gzip.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Canonical Ltd
+# Copyright (C) 2006, 2009, 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tests/testui.py'
--- a/bzrlib/tests/testui.py 2010-09-14 08:14:22 +0000
+++ b/bzrlib/tests/testui.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2010 Canonical Ltd
+# Copyright (C) 2010 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
=== modified file 'bzrlib/tuned_gzip.py'
--- a/bzrlib/tuned_gzip.py 2010-08-29 18:30:45 +0000
+++ b/bzrlib/tuned_gzip.py 2010-09-25 20:08:01 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2006-2010 Canonical Ltd
# Written by Robert Collins <robert.collins at canonical.com>
#
# This program is free software; you can redistribute it and/or modify
More information about the bazaar-commits
mailing list