3 # Copyright (c) 2017 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 # pylint: disable=missing-docstring
17 from functest.core import feature
18 from functest.core import testcase
21 class FeatureTestingBase(unittest.TestCase):
25 _repo = "dir_repo_bar"
26 _cmd = "run_bar_tests.py"
27 _output_file = '/home/opnfv/functest/results/foo.log'
30 @mock.patch('time.time', side_effect=[1, 2])
31 def _test_run(self, status, mock_method=None):
32 self.assertEqual(self.feature.run(cmd=self._cmd), status)
33 if status == testcase.TestCase.EX_OK:
34 self.assertEqual(self.feature.result, 100)
36 self.assertEqual(self.feature.result, 0)
37 mock_method.assert_has_calls([mock.call(), mock.call()])
38 self.assertEqual(self.feature.start_time, 1)
39 self.assertEqual(self.feature.stop_time, 2)
41 def test_logger_module_ko(self):
42 with mock.patch('six.moves.builtins.open'):
43 self.feature = feature.Feature(
44 project_name=self._project_name, case_name=self._case_name)
45 self.assertEqual(self.feature.logger.name, self._case_name)
47 def test_logger_module(self):
48 with mock.patch('six.moves.builtins.open'):
49 self.feature = feature.Feature(
50 project_name=self._project_name, case_name=self._case_name,
51 run={'module': 'bar'})
52 self.assertEqual(self.feature.logger.name, 'bar')
55 class FeatureTesting(FeatureTestingBase):
58 with mock.patch('six.moves.builtins.open'):
59 self.feature = feature.Feature(
60 project_name=self._project_name, case_name=self._case_name)
62 def test_run_exc(self):
63 # pylint: disable=bad-continuation
64 with mock.patch.object(
65 self.feature, 'execute',
66 side_effect=Exception) as mock_method:
67 self._test_run(testcase.TestCase.EX_RUN_ERROR)
68 mock_method.assert_called_once_with(cmd=self._cmd)
71 self._test_run(testcase.TestCase.EX_RUN_ERROR)
74 class BashFeatureTesting(FeatureTestingBase):
77 with mock.patch('six.moves.builtins.open'):
78 self.feature = feature.BashFeature(
79 project_name=self._project_name, case_name=self._case_name)
81 @mock.patch('subprocess.Popen')
82 def test_run_no_cmd(self, mock_subproc):
84 self.feature.run(), testcase.TestCase.EX_RUN_ERROR)
85 mock_subproc.assert_not_called()
87 @mock.patch('subprocess.Popen')
88 def test_run_ko(self, mock_subproc):
89 with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
90 mock_obj = mock.Mock()
91 attrs = {'wait.return_value': 1}
92 mock_obj.configure_mock(**attrs)
94 mock_subproc.return_value = mock_obj
95 self._test_run(testcase.TestCase.EX_RUN_ERROR)
96 mopen.assert_called_once_with(self._output_file, "w+")
98 @mock.patch('subprocess.Popen')
99 def test_run(self, mock_subproc):
100 with mock.patch('six.moves.builtins.open', mock.mock_open()) as mopen:
101 mock_obj = mock.Mock()
102 attrs = {'wait.return_value': 0}
103 mock_obj.configure_mock(**attrs)
105 mock_subproc.return_value = mock_obj
106 self._test_run(testcase.TestCase.EX_OK)
107 mopen.assert_called_once_with(self._output_file, "w+")
110 if __name__ == "__main__":
111 # logging must be disabled else it calls time.time()
112 # what will break these unit tests.
113 logging.disable(logging.CRITICAL)
114 unittest.main(verbosity=2)