Skip to content

Commit

Permalink
Merge ce0bf88 into cbac067
Browse files Browse the repository at this point in the history
  • Loading branch information
UnDarkle committed Jan 7, 2019
2 parents cbac067 + ce0bf88 commit 4d4610f
Show file tree
Hide file tree
Showing 10 changed files with 122 additions and 79 deletions.
10 changes: 5 additions & 5 deletions requirements.txt
Expand Up @@ -28,7 +28,7 @@ jsonschema==2.6.0
lazy-object-proxy==1.3.1
mccabe==0.6.1
mock==2.0.0
more-itertools==4.3.0
more-itertools==5.0.0
pathlib2==2.3.3
pbr==5.1.1
pexpect==4.6.0
Expand All @@ -39,12 +39,12 @@ psutil==5.4.8
ptyprocess==0.6.0
py==1.7.0
pycodestyle==2.4.0
pyfakefs==3.5.4
pyfakefs==3.5.5
pyflakes==2.0.0
Pygments==2.3.1
pylint==1.9.3
pytest==4.0.2
pytest-cov==2.6.0
pylint==1.9.4
pytest==4.1.0
pytest-cov==2.6.1
pytest-django==3.4.4
PyYAML==3.13
requests==2.21.0
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -3,7 +3,7 @@
from setuptools import setup, find_packages


__version__ = "5.4.1"
__version__ = "5.4.2"

result_handlers = [
"db = rotest.core.result.handlers.db_handler:DBHandler",
Expand Down
27 changes: 19 additions & 8 deletions src/rotest/core/abstract_test.py
Expand Up @@ -19,9 +19,11 @@
from future.builtins import next, str, object
from future.utils import iteritems, itervalues

from rotest.core.result.result import Result
from rotest.common.utils import get_class_fields
from rotest.core.models.case_data import TestOutcome
from rotest.management.base_resource import BaseResource
from rotest.common.log import get_test_logger, get_tree_path
from rotest.management.client.manager import ResourceRequest
from rotest.management.client.manager import ClientResourceManager

Expand Down Expand Up @@ -64,9 +66,9 @@ class AbstractTest(unittest.TestCase):

STATE_DIR_NAME = "state"

def __init__(self, indexer=count(), methodName='runTest', save_state=True,
force_initialize=False, config=None, parent=None,
enable_debug=True, resource_manager=None, skip_init=False):
def __init__(self, methodName='test_method', indexer=count(), parent=None,
save_state=True, force_initialize=False, config=None,
enable_debug=False, resource_manager=None, skip_init=False):

if enable_debug:
for method_name in (methodName, self.SETUP_METHOD_NAME,
Expand All @@ -80,6 +82,8 @@ def __init__(self, indexer=count(), methodName='runTest', save_state=True,
super(AbstractTest, self).__init__(methodName)

self.result = None
self.logger = None
self.is_main = True
self.config = config
self.parent = parent
self.skip_init = skip_init
Expand Down Expand Up @@ -201,7 +205,7 @@ def request_resources(self, resources_to_request, use_previous=False):
for resource in itervalues(requested_resources):
resource.override_logger(self.logger)

if self.result is not None:
if isinstance(self.result, Result):
self.result.updateResources(self)

def release_resources(self, resources=None, dirty=False,
Expand Down Expand Up @@ -248,6 +252,12 @@ def _get_parents_count(self):

return self.parent.parents_count + 1

def create_logger(self):
"""Create logger instance for the test."""
if self.logger is None:
self.logger = get_test_logger(get_tree_path(self), self.work_dir)
self.logger.info("Test %r has started running", self.data)

def start(self):
"""Update the data that the test started."""
self.data.start()
Expand All @@ -262,12 +272,11 @@ def end(self, test_outcome, details=None):
"""
self.data.update_result(test_outcome, details)

def _decorate_teardown(self, teardown_method, result):
def _decorate_teardown(self, teardown_method):
"""Decorate the tearDown method to handle resource release.
Args:
teardown_method (function): the original tearDown method.
result (rotest.core.result.result.Result): test result information.
Returns:
function. the wrapped tearDown method.
Expand All @@ -280,12 +289,14 @@ def teardown_method_wrapper(*args, **kwargs):
* Releases the test resources.
* Closes the client if needed
"""
self.result.startTeardown(self)
if isinstance(self.result, Result):
self.result.startTeardown(self)

try:
teardown_method(*args, **kwargs)

except Exception:
result.addError(self, sys.exc_info())
self.result.addError(self, sys.exc_info())

finally:
self.store_state()
Expand Down
7 changes: 4 additions & 3 deletions src/rotest/core/block.py
Expand Up @@ -73,10 +73,11 @@ class TestBlock(AbstractFlowComponent):
IS_COMPLEX (bool): if this test is complex (may contain sub-tests).
"""
IS_COMPLEX = False
__test__ = False

def __init__(self, indexer=count(), base_work_dir=ROTEST_WORK_DIR,
save_state=True, force_initialize=False, config=None,
parent=None, run_data=None, enable_debug=True,
parent=None, run_data=None, enable_debug=False,
resource_manager=None, skip_init=False, is_main=True):

super(TestBlock, self).__init__(parent=parent,
Expand Down Expand Up @@ -131,8 +132,8 @@ def _share_outputs(self):
outputs_dict = {}
for output_name in self.get_outputs():
if output_name not in self.__dict__:
self.logger.warn("Block %r didn't create output %r",
self.data.name, output_name)
self.logger.warning("Block %r didn't create output %r",
self.data.name, output_name)

outputs_dict[output_name] = getattr(self, output_name)

Expand Down
42 changes: 25 additions & 17 deletions src/rotest/core/case.py
Expand Up @@ -9,6 +9,7 @@

from rotest.common import core_log
from rotest.common.utils import get_work_dir
from rotest.core.result.result import Result
from rotest.common.config import ROTEST_WORK_DIR
from rotest.core.models.case_data import CaseData
from rotest.core.abstract_test import AbstractTest, request
Expand Down Expand Up @@ -54,19 +55,20 @@ class TestCase(AbstractTest):
IS_COMPLEX = False
test_methods_names = None

def __init__(self, indexer=count(), methodName='runTest',
def __init__(self, methodName='test_method', parent=None, indexer=count(),
base_work_dir=ROTEST_WORK_DIR, save_state=True,
force_initialize=False, config=None, parent=None,
run_data=None, enable_debug=True, resource_manager=None,
skip_init=False):

super(TestCase, self).__init__(indexer, methodName, save_state,
force_initialize, config, parent,
enable_debug, resource_manager,
skip_init)

self.skip_reason = None
self.skip_determined = False
force_initialize=False, config=None, run_data=None,
enable_debug=False, resource_manager=None, skip_init=False):

super(TestCase, self).__init__(methodName=methodName,
parent=parent,
indexer=indexer,
save_state=save_state,
force_initialize=force_initialize,
config=config,
enable_debug=enable_debug,
resource_manager=resource_manager,
skip_init=skip_init)

name = self.get_name(methodName)
core_log.debug("Initializing %r test-case", name)
Expand Down Expand Up @@ -120,16 +122,21 @@ def setup_method_wrapper(*args, **kwargs):
* Executes the original setUp method.
* Upon exception, finalizes the resources.
"""
skip_reason = self.result.shouldSkip(self)
if skip_reason is not None:
self.skipTest(skip_reason)
self.override_resource_loggers()

if isinstance(self.result, Result):
skip_reason = self.result.shouldSkip(self)

if skip_reason is not None:
self.skipTest(skip_reason)

self.request_resources(self.get_resource_requests(),
use_previous=True)

try:
setup_method(*args, **kwargs)
self.result.setupFinished(self)
if isinstance(self.result, Result):
self.result.setupFinished(self)

except Exception:
self.release_resources(dirty=True)
Expand All @@ -151,6 +158,7 @@ def run(self, result=None):
# method signature, but the Rotest test case does not support it.
self.assertIsNotNone(result, 'TestCase must run inside a TestSuite')
self.result = result
self.create_logger()

# === Decorate the setUp, test and tearDown methods. ===
setup_method = getattr(self, self.SETUP_METHOD_NAME)
Expand All @@ -159,6 +167,6 @@ def run(self, result=None):

teardown_method = getattr(self, self.TEARDOWN_METHOD_NAME)
setattr(self, self.TEARDOWN_METHOD_NAME,
self._decorate_teardown(teardown_method, result))
self._decorate_teardown(teardown_method))

super(TestCase, self).run(result)
10 changes: 8 additions & 2 deletions src/rotest/core/flow.py
Expand Up @@ -83,8 +83,8 @@ class TestFlow(AbstractFlowComponent):

TEST_METHOD_NAME = "test_run_blocks"

def __init__(self, base_work_dir=ROTEST_WORK_DIR, save_state=True,
force_initialize=False, config=None, indexer=count(),
def __init__(self, indexer=count(), base_work_dir=ROTEST_WORK_DIR,
save_state=True, force_initialize=False, config=None,
parent=None, run_data=None, enable_debug=False, is_main=True,
skip_init=False, resource_manager=None):

Expand Down Expand Up @@ -135,6 +135,12 @@ def __iter__(self):
def addTest(self, test_item):
self._tests.append(test_item)

def create_logger(self):
"""Create logger instances for the test and its components."""
super(TestFlow, self).create_logger()
for block in self._tests:
block.create_logger()

def validate_inputs(self, extra_inputs=[]):
"""Validate that all the required inputs of the blocks were passed.
Expand Down
36 changes: 25 additions & 11 deletions src/rotest/core/flow_component.py
Expand Up @@ -3,6 +3,7 @@
# pylint: disable=too-many-arguments,too-many-locals,broad-except
# pylint: disable=dangerous-default-value,access-member-before-definition
# pylint: disable=bare-except,protected-access,too-many-instance-attributes
# pylint: disable=too-many-branches
from __future__ import absolute_import, print_function

import unittest
Expand All @@ -14,6 +15,7 @@

from rotest.common import core_log
from rotest.common.utils import get_work_dir
from rotest.core.result.result import Result
from rotest.common.config import ROTEST_WORK_DIR
from rotest.core.abstract_test import AbstractTest
from rotest.management.common.errors import ServerError
Expand Down Expand Up @@ -118,14 +120,20 @@ class AbstractFlowComponent(AbstractTest):

def __init__(self, indexer=count(), base_work_dir=ROTEST_WORK_DIR,
save_state=True, force_initialize=False, config=None,
parent=None, run_data=None, enable_debug=True,
parent=None, run_data=None, enable_debug=False,
resource_manager=None, skip_init=False, is_main=True):

test_method_name = self.get_test_method_name()
super(AbstractFlowComponent, self).__init__(indexer, test_method_name,
save_state, force_initialize, config,
parent, enable_debug, resource_manager,
skip_init)
super(AbstractFlowComponent, self).__init__(
methodName=test_method_name,
parent=parent,
indexer=indexer,
save_state=save_state,
force_initialize=force_initialize,
config=config,
enable_debug=enable_debug,
resource_manager=resource_manager,
skip_init=skip_init)

self._pipes = {}
self.is_main = is_main
Expand Down Expand Up @@ -219,11 +227,15 @@ def setup_method_wrapper(*args, **kwargs):
* Executes the original setUp method.
* Upon exception, finalizes the resources.
"""
self.override_resource_loggers()

if self.is_main:
skip_reason = self.result.shouldSkip(self)
if skip_reason is not None:
self.skip_sub_components(skip_reason)
self.skipTest(skip_reason)
if isinstance(self.result, Result):
skip_reason = self.result.shouldSkip(self)

if skip_reason is not None:
self.skip_sub_components(skip_reason)
self.skipTest(skip_reason)

else:
if self.mode in (MODE_CRITICAL, MODE_OPTIONAL):
Expand Down Expand Up @@ -263,7 +275,8 @@ def setup_method_wrapper(*args, **kwargs):
self.validate_inputs()

setup_method(*args, **kwargs)
self.result.setupFinished(self)
if isinstance(self.result, Result):
self.result.setupFinished(self)

except Exception:
self.release_resources(self.locked_resources, dirty=True)
Expand All @@ -290,6 +303,7 @@ def run(self, result=None):
result (rotest.core.result.result.Result): test result information.
"""
self.result = result
self.create_logger()

# === Decorate the setUp and tearDown methods ===
setup_method = getattr(self, self.SETUP_METHOD_NAME)
Expand All @@ -298,7 +312,7 @@ def run(self, result=None):

teardown_method = getattr(self, self.TEARDOWN_METHOD_NAME)
setattr(self, self.TEARDOWN_METHOD_NAME,
self._decorate_teardown(teardown_method, result))
self._decorate_teardown(teardown_method))

try:
super(AbstractFlowComponent, self).run(result)
Expand Down

0 comments on commit 4d4610f

Please sign in to comment.