Update to Alpine 3.14
[functest.git] / functest / tests / unit / utils / test_functest_utils.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2016 Orange and others.
4 #
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
9
10 # pylint: disable=missing-docstring
11
12 import logging
13 import time
14 import unittest
15
16 import mock
17 import pkg_resources
18 import six
19
20 from functest.utils import functest_utils
21
22
23 class FunctestUtilsTesting(unittest.TestCase):
24     # pylint: disable=too-many-instance-attributes,too-many-public-methods
25
26     readline = 0
27     test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15']
28
29     def setUp(self):
30         self.url = 'http://www.opnfv.org/'
31         self.timeout = 5
32         self.dest_path = 'test_path'
33         self.repo_path = 'test_repo_path'
34         self.installer = 'test_installer'
35         self.scenario = 'test_scenario'
36         self.build_tag = 'jenkins-functest-fuel-opnfv-jump-2-daily-master-190'
37         self.build_tag_week = 'jenkins-functest-fuel-baremetal-weekly-master-8'
38         self.version = 'master'
39         self.node_name = 'test_node_name'
40         self.project = 'test_project'
41         self.case_name = 'test_case_name'
42         self.status = 'test_status'
43         self.details = 'test_details'
44         self.db_url = 'test_db_url'
45         self.criteria = 50
46         self.result = 75
47         self.start_date = 1482624000
48         self.stop_date = 1482624000
49         self.start_time = time.time()
50         self.stop_time = time.time()
51         self.readline = -1
52         self.test_ip = ['10.1.23.4', '10.1.14.15', '10.1.16.15']
53         self.test_file = 'test_file'
54         self.error_msg = 'test_error_msg'
55         self.cmd = 'test_cmd'
56         self.output_file = 'test_output_file'
57         self.testname = 'testname'
58         self.parameter = 'general.openstack.image_name'
59         self.config_yaml = pkg_resources.resource_filename(
60             'functest', 'ci/config_functest.yaml')
61         self.db_url_env = 'http://foo/testdb'
62         self.testcases_yaml = "test_testcases_yaml"
63         self.file_yaml = {'general': {'openstack': {'image_name':
64                                                     'test_image_name'}}}
65
66     def _get_env_dict(self, var):
67         dic = {'INSTALLER_TYPE': self.installer,
68                'DEPLOY_SCENARIO': self.scenario,
69                'NODE_NAME': self.node_name,
70                'BUILD_TAG': self.build_tag}
71         dic.pop(var, None)
72         return dic
73
74     @staticmethod
75     def readline_side():
76         if FunctestUtilsTesting.readline == \
77                 len(FunctestUtilsTesting.test_ip) - 1:
78             return False
79         FunctestUtilsTesting.readline += 1
80         return FunctestUtilsTesting.test_ip[FunctestUtilsTesting.readline]
81
82     def _get_environ(self, var, *args):  # pylint: disable=unused-argument
83         if var == 'INSTALLER_TYPE':
84             return self.installer
85         if var == 'DEPLOY_SCENARIO':
86             return self.scenario
87         return var
88
89     @staticmethod
90     def cmd_readline():
91         return 'test_value\n'
92
93     @mock.patch('functest.utils.functest_utils.LOGGER.error')
94     @mock.patch('functest.utils.functest_utils.LOGGER.info')
95     def test_exec_cmd_args_present_ko(self, mock_logger_info,
96                                       mock_logger_error):
97         with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
98                 as mock_subproc_open, \
99                 mock.patch('six.moves.builtins.open',
100                            mock.mock_open()) as mopen:
101             stream = six.BytesIO()
102             stream.write(self.cmd_readline().encode("utf-8"))
103             attrs = {
104                 'return_value.__enter__.return_value.stdout': stream,
105                 'return_value.__enter__.return_value.wait.return_value': 1}
106             mock_subproc_open.configure_mock(**attrs)
107             resp = functest_utils.execute_command(
108                 self.cmd, info=True, error_msg=self.error_msg, verbose=True,
109                 output_file=self.output_file)
110             self.assertEqual(resp, 1)
111             msg_exec = ("Executing command: '%s'" % self.cmd)
112             mock_logger_info.assert_called_once_with(msg_exec)
113             mopen.assert_called_once_with(self.output_file, "w")
114             mock_logger_error.assert_called_once_with(self.error_msg)
115
116     @mock.patch('functest.utils.functest_utils.LOGGER.info')
117     def test_exec_cmd_args_present_ok(self, mock_logger_info):
118         with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
119                 as mock_subproc_open, \
120                 mock.patch('six.moves.builtins.open',
121                            mock.mock_open()) as mopen:
122             stream = six.BytesIO()
123             stream.write(self.cmd_readline().encode("utf-8"))
124             attrs = {
125                 'return_value.__enter__.return_value.stdout': stream,
126                 'return_value.__enter__.return_value.wait.return_value': 0}
127             mock_subproc_open.configure_mock(**attrs)
128             resp = functest_utils.execute_command(
129                 self.cmd, info=True, error_msg=self.error_msg, verbose=True,
130                 output_file=self.output_file)
131             self.assertEqual(resp, 0)
132             msg_exec = ("Executing command: '%s'" % self.cmd)
133             mock_logger_info.assert_called_once_with(msg_exec)
134             mopen.assert_called_once_with(self.output_file, "w")
135
136     @mock.patch('sys.stdout')
137     def test_exec_cmd_args_missing_ok(self, stdout=None):
138         # pylint: disable=unused-argument
139         with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
140                 as mock_subproc_open:
141             stream = six.BytesIO()
142             stream.write(self.cmd_readline().encode("utf-8"))
143             attrs = {
144                 'return_value.__enter__.return_value.stdout': stream,
145                 'return_value.__enter__.return_value.wait.return_value': 0}
146             mock_subproc_open.configure_mock(**attrs)
147             resp = functest_utils.execute_command(
148                 self.cmd, info=False, error_msg="", verbose=False,
149                 output_file=None)
150             self.assertEqual(resp, 0)
151
152     @mock.patch('sys.stdout')
153     def test_exec_cmd_args_missing_ko(self, stdout=None):
154         # pylint: disable=unused-argument
155         with mock.patch('functest.utils.functest_utils.subprocess.Popen') \
156                 as mock_subproc_open:
157             attrs = {}
158             stream = six.BytesIO()
159             stream.write(self.cmd_readline().encode("utf-8"))
160             attrs = {
161                 'return_value.__enter__.return_value.stdout': stream,
162                 'return_value.__enter__.return_value.wait.return_value': 1}
163             mock_subproc_open.configure_mock(**attrs)
164             resp = functest_utils.execute_command(
165                 self.cmd, info=False, error_msg="", verbose=False,
166                 output_file=None)
167             self.assertEqual(resp, 1)
168
169     def test_get_param_from_yaml_failed(self):
170         self.file_yaml['general'] = None
171         with mock.patch('six.moves.builtins.open', mock.mock_open()), \
172                 mock.patch('functest.utils.functest_utils.yaml.safe_load') \
173                 as mock_yaml, \
174                 self.assertRaises(ValueError) as excep:
175             mock_yaml.return_value = self.file_yaml
176             functest_utils.get_parameter_from_yaml(self.parameter,
177                                                    self.test_file)
178             self.assertTrue(("The parameter %s is not"
179                              " defined in config_functest.yaml" %
180                              self.parameter) in excep.exception)
181
182     def test_get_param_from_yaml_def(self):
183         with mock.patch('six.moves.builtins.open', mock.mock_open()), \
184                 mock.patch('functest.utils.functest_utils.yaml.safe_load') \
185                 as mock_yaml:
186             mock_yaml.return_value = self.file_yaml
187             self.assertEqual(functest_utils.
188                              get_parameter_from_yaml(self.parameter,
189                                                      self.test_file),
190                              'test_image_name')
191
192     def test_nova_version_exc1(self):
193         # pylint: disable=protected-access
194         cloud = mock.Mock()
195         cloud._compute_client.request.return_value = None
196         self.assertEqual(functest_utils.get_nova_version(cloud), None)
197         cloud._compute_client.request.assert_called_once_with('/', 'GET')
198
199     def test_nova_version_exc2(self):
200         # pylint: disable=protected-access
201         cloud = mock.Mock()
202         cloud._compute_client.request.return_value = {"version": None}
203         self.assertEqual(functest_utils.get_nova_version(cloud), None)
204         cloud._compute_client.request.assert_called_once_with('/', 'GET')
205
206     def test_nova_version_exc3(self):
207         # pylint: disable=protected-access
208         cloud = mock.Mock()
209         cloud._compute_client.request.return_value = {
210             "version": {"version": None}}
211         self.assertEqual(functest_utils.get_nova_version(cloud), None)
212         cloud._compute_client.request.assert_called_once_with('/', 'GET')
213
214     def test_nova_version_exc4(self):
215         # pylint: disable=protected-access
216         cloud = mock.Mock()
217         cloud._compute_client.request.return_value = {
218             "version": {"version": "a.b"}}
219         self.assertEqual(functest_utils.get_nova_version(cloud), None)
220         cloud._compute_client.request.assert_called_once_with('/', 'GET')
221
222     def test_nova_version(self):
223         # pylint: disable=protected-access
224         cloud = mock.Mock()
225         cloud._compute_client.request.return_value = {
226             "version": {"version": "2.1"}}
227         self.assertEqual(functest_utils.get_nova_version(cloud), (2, 1))
228         cloud._compute_client.request.assert_called_once_with('/', 'GET')
229
230     @mock.patch('functest.utils.functest_utils.get_nova_version',
231                 return_value=(2, 61))
232     def test_openstack_version1(self, *args):
233         cloud = mock.Mock()
234         self.assertEqual(functest_utils.get_openstack_version(
235             cloud), "Rocky")
236         args[0].assert_called_once_with(cloud)
237
238     @mock.patch('functest.utils.functest_utils.get_nova_version',
239                 return_value=(2, 60))
240     def test_openstack_version2(self, *args):
241         cloud = mock.Mock()
242         self.assertEqual(functest_utils.get_openstack_version(cloud), "Queens")
243         args[0].assert_called_once_with(cloud)
244
245     @mock.patch('functest.utils.functest_utils.get_nova_version',
246                 return_value=(2, 43))
247     def test_openstack_version3(self, *args):
248         cloud = mock.Mock()
249         self.assertEqual(functest_utils.get_openstack_version(cloud), "Pike")
250         args[0].assert_called_once_with(cloud)
251
252     @mock.patch('functest.utils.functest_utils.get_nova_version',
253                 return_value=(2, 39))
254     def test_openstack_version4(self, *args):
255         cloud = mock.Mock()
256         self.assertEqual(functest_utils.get_openstack_version(cloud), "Ocata")
257         args[0].assert_called_once_with(cloud)
258
259     @mock.patch('functest.utils.functest_utils.get_nova_version',
260                 return_value=(2, 26))
261     def test_openstack_version5(self, *args):
262         cloud = mock.Mock()
263         self.assertEqual(functest_utils.get_openstack_version(cloud), "Newton")
264         args[0].assert_called_once_with(cloud)
265
266     @mock.patch('functest.utils.functest_utils.get_nova_version',
267                 return_value=(2, 13))
268     def test_openstack_version6(self, *args):
269         cloud = mock.Mock()
270         self.assertEqual(functest_utils.get_openstack_version(cloud), "Mitaka")
271         args[0].assert_called_once_with(cloud)
272
273     @mock.patch('functest.utils.functest_utils.get_nova_version',
274                 return_value=(2, 4))
275     def test_openstack_version7(self, *args):
276         cloud = mock.Mock()
277         self.assertEqual(
278             functest_utils.get_openstack_version(cloud), "Liberty")
279         args[0].assert_called_once_with(cloud)
280
281     @mock.patch('functest.utils.functest_utils.get_nova_version',
282                 return_value=(2, 1))
283     def test_openstack_version8(self, *args):
284         cloud = mock.Mock()
285         self.assertEqual(functest_utils.get_openstack_version(cloud), "Kilo")
286         args[0].assert_called_once_with(cloud)
287
288     @mock.patch('functest.utils.functest_utils.get_nova_version',
289                 return_value=(1, 9))
290     def test_openstack_version9(self, *args):
291         cloud = mock.Mock()
292         self.assertEqual(
293             functest_utils.get_openstack_version(cloud), "Unknown")
294         args[0].assert_called_once_with(cloud)
295
296     @mock.patch('functest.utils.functest_utils.get_nova_version',
297                 return_value=(3, 1))
298     def test_openstack_version10(self, *args):
299         cloud = mock.Mock()
300         self.assertEqual(
301             functest_utils.get_openstack_version(cloud), "Master")
302         args[0].assert_called_once_with(cloud)
303
304     @mock.patch('functest.utils.functest_utils.get_nova_version',
305                 return_value=(2, 66))
306     def test_openstack_version11(self, *args):
307         cloud = mock.Mock()
308         self.assertEqual(functest_utils.get_openstack_version(
309             cloud), "Stein")
310         args[0].assert_called_once_with(cloud)
311
312     @mock.patch('functest.utils.functest_utils.get_nova_version',
313                 return_value=(2, 78))
314     def test_openstack_version12(self, *args):
315         cloud = mock.Mock()
316         self.assertEqual(functest_utils.get_openstack_version(
317             cloud), "Train")
318         args[0].assert_called_once_with(cloud)
319
320     @mock.patch('functest.utils.functest_utils.get_nova_version',
321                 return_value=(2, 87))
322     def test_openstack_version13(self, *args):
323         cloud = mock.Mock()
324         self.assertEqual(functest_utils.get_openstack_version(
325             cloud), "Ussuri")
326         args[0].assert_called_once_with(cloud)
327
328     @mock.patch('functest.utils.functest_utils.get_nova_version',
329                 return_value=(2, 88))
330     def test_openstack_version14(self, *args):
331         cloud = mock.Mock()
332         self.assertEqual(functest_utils.get_openstack_version(
333             cloud), "Wallaby")
334         args[0].assert_called_once_with(cloud)
335
336     @mock.patch('functest.utils.functest_utils.get_nova_version',
337                 return_value=None)
338     def test_openstack_version_exc(self, *args):
339         cloud = mock.Mock()
340         self.assertEqual(
341             functest_utils.get_openstack_version(cloud), "Unknown")
342         args[0].assert_called_once_with(cloud)
343
344     def test_convert_dict_to_ini(self):
345         self.assertEqual(
346             functest_utils.convert_dict_to_ini({}), "")
347         self.assertEqual(
348             functest_utils.convert_dict_to_ini({"a": "b"}), "a:b")
349         value = functest_utils.convert_dict_to_ini({"a": "b", "c": "d"})
350         self.assertTrue(value in ('a:b,c:d', 'c:d,a:b'))
351         with self.assertRaises(AssertionError):
352             functest_utils.convert_list_to_ini("")
353
354     def test_convert_list_to_ini(self):
355         self.assertEqual(
356             functest_utils.convert_list_to_ini([]), "")
357         self.assertEqual(
358             functest_utils.convert_list_to_ini(["a"]), "a")
359         self.assertEqual(
360             functest_utils.convert_list_to_ini(["a", "b"]), "a,b")
361         with self.assertRaises(AssertionError):
362             functest_utils.convert_list_to_ini("")
363
364     def test_convert_ini_to_dict(self):
365         self.assertEqual(
366             functest_utils.convert_ini_to_dict(""), {})
367         self.assertEqual(
368             functest_utils.convert_ini_to_dict("a:b"), {"a": "b"})
369         self.assertEqual(
370             functest_utils.convert_ini_to_dict(
371                 "a:b,c:d"), {"a": "b", "c": "d"})
372         self.assertEqual(
373             functest_utils.convert_ini_to_dict(
374                 "a:b:c,d:e:f"), {"a:b": "c", "d:e": "f"})
375         with self.assertRaises(AssertionError):
376             functest_utils.convert_list_to_ini({})
377
378     def test_convert_ini_to_list(self):
379         self.assertEqual(
380             functest_utils.convert_ini_to_list(""), [])
381         self.assertEqual(
382             functest_utils.convert_ini_to_list("a"), ["a"])
383         self.assertEqual(
384             functest_utils.convert_ini_to_list("a,b"), ["a", "b"])
385         with self.assertRaises(AssertionError):
386             functest_utils.convert_ini_to_list([])
387
388
389 if __name__ == "__main__":
390     logging.disable(logging.CRITICAL)
391     unittest.main(verbosity=2)