diff --git a/magnum/tests/base.py b/magnum/tests/base.py index dbd4db222e..92cae3790b 100644 --- a/magnum/tests/base.py +++ b/magnum/tests/base.py @@ -30,6 +30,7 @@ from magnum.common import keystone as magnum_keystone from magnum.objects import base as objects_base from magnum.tests import conf_fixture from magnum.tests import fake_notifier +from magnum.tests import output_fixture from magnum.tests import policy_fixture @@ -79,6 +80,8 @@ class TestCase(base.BaseTestCase): self.policy = self.useFixture(policy_fixture.PolicyFixture()) + self.output = self.useFixture(output_fixture.OutputStreamCapture()) + self.useFixture(fixtures.MockPatchObject( oslo_messaging, 'Notifier', fake_notifier.FakeNotifier)) diff --git a/magnum/tests/output_fixture.py b/magnum/tests/output_fixture.py new file mode 100644 index 0000000000..0b22485704 --- /dev/null +++ b/magnum/tests/output_fixture.py @@ -0,0 +1,48 @@ +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import fixtures +import os + +_TRUE_VALUES = ('True', 'true', '1', 'yes') + + +class OutputStreamCapture(fixtures.Fixture): + """Capture output streams during tests. + + This fixture captures errant printing to stderr / stdout during + the tests and lets us see those streams at the end of the test + runs instead. Useful to see what was happening during failed + tests. + """ + def setUp(self): + super(OutputStreamCapture, self).setUp() + if os.environ.get('OS_STDOUT_CAPTURE') in _TRUE_VALUES: + self.out = self.useFixture(fixtures.StringStream('stdout')) + self.useFixture( + fixtures.MonkeyPatch('sys.stdout', self.out.stream)) + if os.environ.get('OS_STDERR_CAPTURE') in _TRUE_VALUES: + self.err = self.useFixture(fixtures.StringStream('stderr')) + self.useFixture( + fixtures.MonkeyPatch('sys.stderr', self.err.stream)) + + @property + def stderr(self): + return self.err._details["stderr"].as_text() + + @property + def stdout(self): + return self.out._details["stdout"].as_text() diff --git a/tox.ini b/tox.ini index edbe30371e..64e6add054 100644 --- a/tox.ini +++ b/tox.ini @@ -13,6 +13,8 @@ whitelist_externals = bash setenv = VIRTUAL_ENV={envdir} PYTHONWARNINGS=default::DeprecationWarning + OS_STDOUT_CAPTURE=1 + OS_STDERR_CAPTURE=1 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt passenv = TEMPEST_* OS_TEST_*