3 # Copyright (c) 2016 Orange and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 """Define the parent class of all Functest TestCases."""
14 import functest.utils.functest_logger as ft_logger
15 import functest.utils.functest_utils as ft_utils
17 __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
20 class TestCase(object):
21 """Base model for single test case."""
24 """everything is OK"""
26 EX_RUN_ERROR = os.EX_SOFTWARE
29 EX_PUSH_TO_DB_ERROR = os.EX_SOFTWARE - 1
30 """push_to_db() failed"""
32 EX_TESTCASE_FAILED = os.EX_SOFTWARE - 2
33 """results are false"""
35 logger = ft_logger.Logger(__name__).getLogger()
37 def __init__(self, **kwargs):
39 self.project_name = kwargs.get('project_name', 'functest')
40 self.case_name = kwargs.get('case_name', '')
41 self.criteria = kwargs.get('criteria', 100)
46 def check_result(self):
47 """Interpret the result of the test case.
49 It allows getting the result of TestCase. It completes run()
50 which only returns the execution status.
52 It can be overriden if checking result is not suitable.
55 TestCase.EX_OK if result is 'PASS'.
56 TestCase.EX_TESTCASE_FAILED otherwise.
60 if isinstance(self.result, int) and isinstance(self.criteria, int):
61 if self.result >= self.criteria:
64 # Backward compatibility
65 # It must be removed as soon as TestCase subclasses
66 # stop setting result = 'PASS' or 'FAIL'.
67 # In this case criteria is unread.
69 "Please update result which must be an int!")
70 if self.result == 'PASS':
72 except AssertionError:
73 self.logger.error("Please run test before checking the results")
74 return TestCase.EX_TESTCASE_FAILED
76 def run(self, **kwargs):
79 It allows running TestCase and getting its execution
82 The subclasses must override the default implementation which
85 The new implementation must set the following attributes to
86 push the results to DB:
93 kwargs: Arbitrary keyword arguments.
96 TestCase.EX_RUN_ERROR.
98 # pylint: disable=unused-argument
99 self.logger.error("Run must be implemented")
100 return TestCase.EX_RUN_ERROR
102 def push_to_db(self):
103 """Push the results of the test case to the DB.
105 It allows publishing the results and to check the status.
107 It could be overriden if the common implementation is not
108 suitable. The following attributes must be set before pushing
118 TestCase.EX_OK if results were pushed to DB.
119 TestCase.EX_PUSH_TO_DB_ERROR otherwise.
122 assert self.project_name
123 assert self.case_name
124 assert self.start_time
125 assert self.stop_time
126 pub_result = 'PASS' if self.check_result(
127 ) == TestCase.EX_OK else 'FAIL'
128 if ft_utils.push_results_to_db(
129 self.project_name, self.case_name, self.start_time,
130 self.stop_time, pub_result, self.details):
131 self.logger.info("The results were successfully pushed to DB")
132 return TestCase.EX_OK
134 self.logger.error("The results cannot be pushed to DB")
135 return TestCase.EX_PUSH_TO_DB_ERROR
136 except Exception: # pylint: disable=broad-except
137 self.logger.exception("The results cannot be pushed to DB")
138 return TestCase.EX_PUSH_TO_DB_ERROR