3 # All rights reserved. This program and the accompanying materials
4 # are made available under the terms of the Apache License, Version 2.0
5 # which accompanies this distribution, and is available at
6 # http://www.apache.org/licenses/LICENSE-2.0
8 """Unitary test for energy module."""
9 # pylint: disable=unused-argument
15 from functest.energy.energy import EnergyRecorder
16 import functest.energy.energy as energy
19 CASE_NAME = "UNIT_test_CASE"
20 STEP_NAME = "UNIT_test_STEP"
22 logging.disable(logging.CRITICAL)
25 class MockHttpResponse(object): # pylint: disable=too-few-public-methods
26 """Mock response for Energy recorder API."""
28 def __init__(self, text, status_code):
29 """Create an instance of MockHttpResponse."""
31 self.status_code = status_code
34 RECORDER_OK = MockHttpResponse(
35 '{"environment": "UNIT_TEST",'
37 ' "scenario": "' + CASE_NAME + '"}',
40 RECORDER_KO = MockHttpResponse(
41 '{"message": "An unhandled API exception occurred (MOCK)"}',
46 def config_loader_mock(config_key):
47 """Return mocked config values."""
48 if config_key == "energy_recorder.api_url":
49 return "http://pod-uri:8888"
50 elif config_key == "energy_recorder.api_user":
52 elif config_key == "energy_recorder.api_password":
55 raise Exception("Config not mocked")
58 def config_loader_mock_no_creds(config_key):
59 """Return mocked config values."""
60 if config_key == "energy_recorder.api_url":
61 return "http://pod-uri:8888"
62 elif config_key == "energy_recorder.api_user":
64 elif config_key == "energy_recorder.api_password":
67 raise Exception("Config not mocked:" + config_key)
70 class EnergyRecorderTest(unittest.TestCase):
71 """Energy module unitary test suite."""
74 request_headers = {'content-type': 'application/json'}
75 returned_value_to_preserve = "value"
76 exception_message_to_preserve = "exception_message"
78 @mock.patch('functest.energy.energy.requests.post',
79 return_value=RECORDER_OK)
80 def test_start(self, post_mock=None):
81 """EnergyRecorder.start method (regular case)."""
82 self.test_load_config()
83 self.assertTrue(EnergyRecorder.start(self.case_name))
84 post_mock.assert_called_once_with(
85 EnergyRecorder.energy_recorder_api["uri"],
86 auth=EnergyRecorder.energy_recorder_api["auth"],
88 headers=self.request_headers
91 @mock.patch('functest.energy.energy.requests.post',
92 side_effect=Exception("Internal execution error (MOCK)"))
93 def test_start_error(self, post_mock=None):
94 """EnergyRecorder.start method (error in method)."""
95 self.test_load_config()
96 self.assertFalse(EnergyRecorder.start(self.case_name))
97 post_mock.assert_called_once_with(
98 EnergyRecorder.energy_recorder_api["uri"],
99 auth=EnergyRecorder.energy_recorder_api["auth"],
101 headers=self.request_headers
104 @mock.patch('functest.energy.energy.requests.post',
105 return_value=RECORDER_KO)
106 def test_start_api_error(self, post_mock=None):
107 """EnergyRecorder.start method (API error)."""
108 self.test_load_config()
109 self.assertFalse(EnergyRecorder.start(self.case_name))
110 post_mock.assert_called_once_with(
111 EnergyRecorder.energy_recorder_api["uri"],
112 auth=EnergyRecorder.energy_recorder_api["auth"],
114 headers=self.request_headers
117 @mock.patch('functest.energy.energy.requests.post',
118 return_value=RECORDER_OK)
119 def test_set_step(self, post_mock=None):
120 """EnergyRecorder.set_step method (regular case)."""
121 self.test_load_config()
122 self.assertTrue(EnergyRecorder.set_step(STEP_NAME))
123 post_mock.assert_called_once_with(
124 EnergyRecorder.energy_recorder_api["uri"] + "/step",
125 auth=EnergyRecorder.energy_recorder_api["auth"],
127 headers=self.request_headers
130 @mock.patch('functest.energy.energy.requests.post',
131 return_value=RECORDER_KO)
132 def test_set_step_api_error(self, post_mock=None):
133 """EnergyRecorder.set_step method (API error)."""
134 self.test_load_config()
135 self.assertFalse(EnergyRecorder.set_step(STEP_NAME))
136 post_mock.assert_called_once_with(
137 EnergyRecorder.energy_recorder_api["uri"] + "/step",
138 auth=EnergyRecorder.energy_recorder_api["auth"],
140 headers=self.request_headers
143 @mock.patch('functest.energy.energy.requests.post',
144 side_effect=Exception("Internal execution error (MOCK)"))
145 def test_set_step_error(self, post_mock=None):
146 """EnergyRecorder.set_step method (method error)."""
147 self.test_load_config()
148 self.assertFalse(EnergyRecorder.set_step(STEP_NAME))
149 post_mock.assert_called_once_with(
150 EnergyRecorder.energy_recorder_api["uri"] + "/step",
151 auth=EnergyRecorder.energy_recorder_api["auth"],
153 headers=self.request_headers
156 @mock.patch('functest.energy.energy.requests.delete',
157 return_value=RECORDER_OK)
158 def test_stop(self, delete_mock=None):
159 """EnergyRecorder.stop method (regular case)."""
160 self.test_load_config()
161 self.assertTrue(EnergyRecorder.stop())
162 delete_mock.assert_called_once_with(
163 EnergyRecorder.energy_recorder_api["uri"],
164 auth=EnergyRecorder.energy_recorder_api["auth"],
165 headers=self.request_headers
168 @mock.patch('functest.energy.energy.requests.delete',
169 return_value=RECORDER_KO)
170 def test_stop_api_error(self, delete_mock=None):
171 """EnergyRecorder.stop method (API Error)."""
172 self.test_load_config()
173 self.assertFalse(EnergyRecorder.stop())
174 delete_mock.assert_called_once_with(
175 EnergyRecorder.energy_recorder_api["uri"],
176 auth=EnergyRecorder.energy_recorder_api["auth"],
177 headers=self.request_headers
180 @mock.patch('functest.energy.energy.requests.delete',
181 side_effect=Exception("Internal execution error (MOCK)"))
182 def test_stop_error(self, delete_mock=None):
183 """EnergyRecorder.stop method (method error)."""
184 self.test_load_config()
185 self.assertFalse(EnergyRecorder.stop())
186 delete_mock.assert_called_once_with(
187 EnergyRecorder.energy_recorder_api["uri"],
188 auth=EnergyRecorder.energy_recorder_api["auth"],
189 headers=self.request_headers
192 @energy.enable_recording
193 def __decorated_method(self):
194 """Call with to energy recorder decorators."""
195 return self.returned_value_to_preserve
197 @energy.enable_recording
198 def __decorated_method_with_ex(self):
199 """Call with to energy recorder decorators."""
200 raise Exception(self.exception_message_to_preserve)
202 @mock.patch("functest.energy.energy.EnergyRecorder")
203 @mock.patch("functest.utils.functest_utils.get_pod_name",
204 return_value="MOCK_POD")
205 @mock.patch("functest.utils.functest_utils.get_functest_config",
206 side_effect=config_loader_mock)
207 def test_decorators(self,
211 """Test energy module decorators."""
212 self.__decorated_method()
213 calls = [mock.call.start(self.case_name),
215 recorder_mock.assert_has_calls(calls)
217 def test_decorator_preserve_return(self):
218 """Test that decorator preserve method returned value."""
219 self.test_load_config()
221 self.__decorated_method() == self.returned_value_to_preserve
224 def test_decorator_preserve_ex(self):
225 """Test that decorator preserve method exceptions."""
226 self.test_load_config()
227 with self.assertRaises(Exception) as context:
228 self.__decorated_method_with_ex()
230 self.exception_message_to_preserve in context.exception
233 @mock.patch("functest.utils.functest_utils.get_functest_config",
234 side_effect=config_loader_mock)
235 @mock.patch("functest.utils.functest_utils.get_pod_name",
236 return_value="MOCK_POD")
237 def test_load_config(self, loader_mock=None, pod_mock=None):
238 """Test load config."""
239 EnergyRecorder.energy_recorder_api = None
240 EnergyRecorder.load_config()
242 EnergyRecorder.energy_recorder_api["auth"],
246 EnergyRecorder.energy_recorder_api["uri"],
247 "http://pod-uri:8888/recorders/environment/MOCK_POD"
250 @mock.patch("functest.utils.functest_utils.get_functest_config",
251 side_effect=config_loader_mock_no_creds)
252 @mock.patch("functest.utils.functest_utils.get_pod_name",
253 return_value="MOCK_POD")
254 def test_load_config_no_creds(self, loader_mock=None, pod_mock=None):
255 """Test load config without creds."""
256 EnergyRecorder.energy_recorder_api = None
257 EnergyRecorder.load_config()
258 self.assertEquals(EnergyRecorder.energy_recorder_api["auth"], None)
260 EnergyRecorder.energy_recorder_api["uri"],
261 "http://pod-uri:8888/recorders/environment/MOCK_POD"
264 @mock.patch("functest.utils.functest_utils.get_functest_config",
266 @mock.patch("functest.utils.functest_utils.get_pod_name",
267 return_value="MOCK_POD")
268 def test_load_config_ex(self, loader_mock=None, pod_mock=None):
269 """Test load config with exception."""
270 with self.assertRaises(AssertionError):
271 EnergyRecorder.energy_recorder_api = None
272 EnergyRecorder.load_config()
273 self.assertEquals(EnergyRecorder.energy_recorder_api, None)
276 if __name__ == "__main__":
277 unittest.main(verbosity=2)