f7f3e460548c4bc57f271ed138481a855a30cb92
[functest.git] / functest / core / feature.py
1 import time
2
3 import testcase as base
4 import functest.utils.functest_utils as ft_utils
5 import functest.utils.functest_logger as ft_logger
6 from functest.utils.constants import CONST
7
8
9 class FeatureBase(base.TestCase):
10
11     def __init__(self, project='functest', case='', repo='', cmd=''):
12         super(FeatureBase, self).__init__()
13         self.project_name = project
14         self.case_name = case
15         self.cmd = cmd
16         self.repo = CONST.__getattribute__(repo)
17         self.result_file = self.get_result_file()
18         self.logger = ft_logger.Logger(project).getLogger()
19
20     def run(self, **kwargs):
21         self.prepare()
22         self.start_time = time.time()
23         ret = self.execute()
24         self.stop_time = time.time()
25         self.post()
26         self.parse_results(ret)
27         self.log_results()
28         self.logger.info("Test result is stored in '%s'" % self.result_file)
29         return base.TestCase.EX_OK
30
31     def execute(self):
32         '''
33         Executer method that can be overwritten
34         By default it executes a shell command.
35         '''
36         return ft_utils.execute_command(self.cmd, output_file=self.result_file)
37
38     def prepare(self, **kwargs):
39         pass
40
41     def post(self, **kwargs):
42         pass
43
44     def parse_results(self, ret):
45         exit_code = base.TestCase.EX_OK
46         if ret == 0:
47             self.logger.info("{} OK".format(self.project_name))
48             self.criteria = 'PASS'
49         else:
50             self.logger.info("{} FAILED".format(self.project_name))
51             exit_code = base.TestCase.EX_RUN_ERROR
52             self.criteria = "FAIL"
53
54         return exit_code
55
56     def get_result_file(self):
57         return "{}/{}.log".format(CONST.dir_results, self.project_name)
58
59     def log_results(self):
60         ft_utils.logger_test_results(self.project_name,
61                                      self.case_name,
62                                      self.criteria,
63                                      self.details)