| # Copyright 2012 OpenStack Foundation |
| # 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 os |
| import sys |
| |
| import fixtures |
| import pkg_resources |
| import testtools |
| |
| |
| def _handle_skip_exception(): |
| try: |
| stestr_version = pkg_resources.parse_version( |
| pkg_resources.get_distribution("stestr").version) |
| stestr_min = pkg_resources.parse_version('2.5.0') |
| new_stestr = (stestr_version >= stestr_min) |
| import unittest |
| import unittest2 |
| if sys.version_info >= (3, 5) and new_stestr: |
| testtools.TestCase.skipException = unittest.case.SkipTest |
| else: |
| testtools.TestCase.skipException = unittest2.case.SkipTest |
| except Exception: |
| pass |
| |
| |
| class BaseTestCase(testtools.testcase.WithAttributes, testtools.TestCase): |
| setUpClassCalled = False |
| |
| # NOTE(sdague): log_format is defined inline here instead of using the oslo |
| # default because going through the config path recouples config to the |
| # stress tests too early, and depending on testr order will fail unit tests |
| log_format = ('%(asctime)s %(process)d %(levelname)-8s ' |
| '[%(name)s] %(message)s') |
| |
| @classmethod |
| def setUpClass(cls): |
| if hasattr(super(BaseTestCase, cls), 'setUpClass'): |
| super(BaseTestCase, cls).setUpClass() |
| cls.setUpClassCalled = True |
| # TODO(gmann): cls.handle_skip_exception is really workaround for |
| # testtools bug- https://github.com/testing-cabal/testtools/issues/272 |
| # stestr which is used by Tempest internally to run the test switch |
| # the customize test runner(which use stdlib unittest) for >=py3.5 |
| # else testtools.run.- https://github.com/mtreinish/stestr/pull/265 |
| # These two test runner are not compatible due to skip exception |
| # handling(due to unittest2). testtools.run treat unittestt.SkipTest |
| # as error and stdlib unittest treat unittest2.case.SkipTest raised |
| # by testtools.TestCase.skipException. |
| # The below workaround can be removed once testtools fix issue# 272. |
| cls.orig_skip_exception = testtools.TestCase.skipException |
| _handle_skip_exception() |
| |
| @classmethod |
| def tearDownClass(cls): |
| if hasattr(super(BaseTestCase, cls), 'tearDownClass'): |
| super(BaseTestCase, cls).tearDownClass() |
| |
| def setUp(self): |
| testtools.TestCase.skipException = self.orig_skip_exception |
| super(BaseTestCase, self).setUp() |
| if not self.setUpClassCalled: |
| raise RuntimeError("setUpClass does not calls the super's " |
| "setUpClass in {!r}".format(type(self))) |
| test_timeout = os.environ.get('OS_TEST_TIMEOUT', 0) |
| try: |
| test_timeout = int(test_timeout) |
| except ValueError: |
| test_timeout = 0 |
| if test_timeout > 0: |
| self.useFixture(fixtures.Timeout(test_timeout, gentle=True)) |
| |
| if (os.environ.get('OS_STDOUT_CAPTURE') == 'True' or |
| os.environ.get('OS_STDOUT_CAPTURE') == '1'): |
| stdout = self.useFixture(fixtures.StringStream('stdout')).stream |
| self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout)) |
| if (os.environ.get('OS_STDERR_CAPTURE') == 'True' or |
| os.environ.get('OS_STDERR_CAPTURE') == '1'): |
| stderr = self.useFixture(fixtures.StringStream('stderr')).stream |
| self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr)) |
| if (os.environ.get('OS_LOG_CAPTURE') != 'False' and |
| os.environ.get('OS_LOG_CAPTURE') != '0'): |
| self.useFixture(fixtures.LoggerFixture(nuke_handlers=False, |
| format=self.log_format, |
| level=None)) |