blob: cbb81e297d637fa2d157f860df654a0dc1b48645 [file] [log] [blame]
Andrea Frittoli3be57482017-08-25 22:41:26 +01001# Copyright 2017 IBM Corp
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +010016import os
Jon Schlueter1ff77482022-01-24 17:38:48 -050017import unittest
Sean McGinniseed80742020-04-18 12:01:03 -050018from unittest import mock
Andrea Frittoli3be57482017-08-25 22:41:26 +010019
Andrea Frittoli3be57482017-08-25 22:41:26 +010020from oslo_config import cfg
21import testtools
22
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010023from tempest import clients
Andrea Frittoli3be57482017-08-25 22:41:26 +010024from tempest import config
Andrea Frittoli0477acc2017-08-09 21:14:53 +010025from tempest.lib.common import validation_resources as vr
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010026from tempest.lib import exceptions as lib_exc
Ghanshyam Mann18b45d72021-12-07 12:37:29 -060027from tempest.lib.services.compute import base_compute_client
28from tempest.lib.services.placement import base_placement_client
29from tempest.lib.services.volume import base_client as base_volume_client
Andrea Frittoli3be57482017-08-25 22:41:26 +010030from tempest import test
31from tempest.tests import base
32from tempest.tests import fake_config
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010033from tempest.tests.lib import fake_credentials
34from tempest.tests.lib.services import registry_fixture
Andrea Frittoli3be57482017-08-25 22:41:26 +010035
36
Andrea Frittoli3be57482017-08-25 22:41:26 +010037class LoggingTestResult(testtools.TestResult):
38
39 def __init__(self, log, *args, **kwargs):
40 super(LoggingTestResult, self).__init__(*args, **kwargs)
41 self.log = log
42
43 def addError(self, test, err=None, details=None):
44 self.log.append((test, err, details))
45
46
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010047class TestValidationResources(base.TestCase):
48
Andrea Frittoli0477acc2017-08-09 21:14:53 +010049 validation_resources_module = 'tempest.lib.common.validation_resources'
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010050
51 def setUp(self):
52 super(TestValidationResources, self).setUp()
53 self.useFixture(fake_config.ConfigFixture())
54 self.useFixture(registry_fixture.RegistryFixture())
55 self.patchobject(config, 'TempestConfigPrivate',
56 fake_config.FakePrivate)
57
58 class TestTestClass(test.BaseTestCase):
59 pass
60
61 self.test_test_class = TestTestClass
62
63 def test_validation_resources_no_validation(self):
64 cfg.CONF.set_default('run_validation', False, 'validation')
65 creds = fake_credentials.FakeKeystoneV3Credentials()
66 osclients = clients.Manager(creds)
67 vr = self.test_test_class.get_class_validation_resources(osclients)
68 self.assertIsNone(vr)
69
70 def test_validation_resources_exists(self):
71 cfg.CONF.set_default('run_validation', True, 'validation')
72 creds = fake_credentials.FakeKeystoneV3Credentials()
73 osclients = clients.Manager(creds)
74 expected_vr = 'expected_validation_resources'
75 self.test_test_class._validation_resources[osclients] = expected_vr
76 obtained_vr = self.test_test_class.get_class_validation_resources(
77 osclients)
78 self.assertEqual(expected_vr, obtained_vr)
79
80 @mock.patch(validation_resources_module + '.create_validation_resources',
81 autospec=True)
82 def test_validation_resources_new(self, mock_create_vr):
83 cfg.CONF.set_default('run_validation', True, 'validation')
84 cfg.CONF.set_default('neutron', True, 'service_available')
85 creds = fake_credentials.FakeKeystoneV3Credentials()
86 osclients = clients.Manager(creds)
87 expected_vr = {'expected_validation_resources': None}
88 mock_create_vr.return_value = expected_vr
89 with mock.patch.object(
90 self.test_test_class,
91 'addClassResourceCleanup') as mock_add_class_cleanup:
92 obtained_vr = self.test_test_class.get_class_validation_resources(
93 osclients)
94 self.assertEqual(1, mock_add_class_cleanup.call_count)
95 self.assertEqual(mock.call(vr.clear_validation_resources,
96 osclients,
97 use_neutron=True,
98 **expected_vr),
99 mock_add_class_cleanup.call_args)
100 self.assertEqual(mock_create_vr.call_count, 1)
101 self.assertIn(osclients, mock_create_vr.call_args_list[0][0])
102 self.assertEqual(expected_vr, obtained_vr)
103 self.assertIn(osclients, self.test_test_class._validation_resources)
104 self.assertEqual(expected_vr,
105 self.test_test_class._validation_resources[osclients])
106
107 def test_validation_resources_invalid_config(self):
108 invalid_version = 999
109 cfg.CONF.set_default('run_validation', True, 'validation')
110 cfg.CONF.set_default('ip_version_for_ssh', invalid_version,
111 'validation')
112 cfg.CONF.set_default('neutron', True, 'service_available')
113 creds = fake_credentials.FakeKeystoneV3Credentials()
114 osclients = clients.Manager(creds)
115 with testtools.ExpectedException(
116 lib_exc.InvalidConfiguration,
117 value_re='^.*\n.*' + str(invalid_version)):
118 self.test_test_class.get_class_validation_resources(osclients)
119
120 @mock.patch(validation_resources_module + '.create_validation_resources',
121 autospec=True)
122 def test_validation_resources_invalid_config_nova_net(self,
123 mock_create_vr):
124 invalid_version = 999
125 cfg.CONF.set_default('run_validation', True, 'validation')
126 cfg.CONF.set_default('ip_version_for_ssh', invalid_version,
127 'validation')
128 cfg.CONF.set_default('neutron', False, 'service_available')
129 creds = fake_credentials.FakeKeystoneV3Credentials()
130 osclients = clients.Manager(creds)
131 expected_vr = {'expected_validation_resources': None}
132 mock_create_vr.return_value = expected_vr
133 obtained_vr = self.test_test_class.get_class_validation_resources(
134 osclients)
135 self.assertEqual(mock_create_vr.call_count, 1)
136 self.assertIn(osclients, mock_create_vr.call_args_list[0][0])
137 self.assertEqual(expected_vr, obtained_vr)
138 self.assertIn(osclients, self.test_test_class._validation_resources)
139 self.assertEqual(expected_vr,
140 self.test_test_class._validation_resources[osclients])
141
142 @mock.patch(validation_resources_module + '.create_validation_resources',
143 autospec=True)
144 @mock.patch(validation_resources_module + '.clear_validation_resources',
145 autospec=True)
146 def test_validation_resources_fixture(self, mock_clean_vr, mock_create_vr):
147
148 class TestWithRun(self.test_test_class):
149
150 def runTest(self):
151 pass
152
153 cfg.CONF.set_default('run_validation', True, 'validation')
154 test_case = TestWithRun()
155 creds = fake_credentials.FakeKeystoneV3Credentials()
156 osclients = clients.Manager(creds)
157 test_case.get_test_validation_resources(osclients)
158 self.assertEqual(1, mock_create_vr.call_count)
159 self.assertEqual(0, mock_clean_vr.call_count)
160
161
Andrea Frittolibcbf1af12017-08-14 11:53:35 +0100162class TestSetNetworkResources(base.TestCase):
163
164 def setUp(self):
165 super(TestSetNetworkResources, self).setUp()
166
167 class ParentTest(test.BaseTestCase):
168
169 @classmethod
170 def setup_credentials(cls):
171 cls.set_network_resources(dhcp=True)
172 super(ParentTest, cls).setup_credentials()
173
174 def runTest(self):
175 pass
176
177 self.parent_class = ParentTest
178
179 def test_set_network_resources_child_only(self):
180
181 class ChildTest(self.parent_class):
182
183 @classmethod
184 def setup_credentials(cls):
185 cls.set_network_resources(router=True)
186 super(ChildTest, cls).setup_credentials()
187
188 child_test = ChildTest()
189 child_test.setUpClass()
190 # Assert that the parents network resources are not set
191 self.assertFalse(child_test._network_resources['dhcp'])
192 # Assert that the child network resources are set
193 self.assertTrue(child_test._network_resources['router'])
194
195 def test_set_network_resources_right_order(self):
196
197 class ChildTest(self.parent_class):
198
199 @classmethod
200 def setup_credentials(cls):
201 super(ChildTest, cls).setup_credentials()
202 cls.set_network_resources(router=True)
203
204 child_test = ChildTest()
205 with testtools.ExpectedException(RuntimeError,
206 value_re='set_network_resources'):
207 child_test.setUpClass()
208
209 def test_set_network_resources_children(self):
210
211 class ChildTest(self.parent_class):
212
213 @classmethod
214 def setup_credentials(cls):
215 cls.set_network_resources(router=True)
216 super(ChildTest, cls).setup_credentials()
217
218 class GrandChildTest(ChildTest):
219 pass
220
221 # Invoke setupClass on both and check that the setup_credentials
222 # call check mechanism does not report any false negative.
223 child_test = ChildTest()
224 child_test.setUpClass()
225 grandchild_test = GrandChildTest()
226 grandchild_test.setUpClass()
227
228
Andrea Frittoli3be57482017-08-25 22:41:26 +0100229class TestTempestBaseTestClass(base.TestCase):
230
231 def setUp(self):
232 super(TestTempestBaseTestClass, self).setUp()
233 self.useFixture(fake_config.ConfigFixture())
234 self.patchobject(config, 'TempestConfigPrivate',
235 fake_config.FakePrivate)
236
237 class ParentTest(test.BaseTestCase):
238
239 def runTest(self):
240 pass
241
242 self.parent_test = ParentTest
243
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100244 def test_resource_cleanup(self):
Andrea Frittoli3be57482017-08-25 22:41:26 +0100245 cfg.CONF.set_default('neutron', False, 'service_available')
246 exp_args = (1, 2,)
247 exp_kwargs = {'a': 1, 'b': 2}
Andrea Frittoli3be57482017-08-25 22:41:26 +0100248 mock1 = mock.Mock()
249 mock2 = mock.Mock()
250 exp_functions = [mock1, mock2]
251
252 class TestWithCleanups(self.parent_test):
253
Andrea Frittoli3be57482017-08-25 22:41:26 +0100254 @classmethod
255 def resource_setup(cls):
256 for fn in exp_functions:
257 cls.addClassResourceCleanup(fn, *exp_args,
258 **exp_kwargs)
259
260 test_cleanups = TestWithCleanups()
261 suite = unittest.TestSuite((test_cleanups,))
262 log = []
263 result = LoggingTestResult(log)
264 suite.run(result)
265 # No exception raised - error log is empty
266 self.assertFalse(log)
267 # All stacked resource cleanups invoked
268 mock1.assert_called_once_with(*exp_args, **exp_kwargs)
269 mock2.assert_called_once_with(*exp_args, **exp_kwargs)
Andrea Frittoli3be57482017-08-25 22:41:26 +0100270 # Cleanup stack is empty
271 self.assertEqual(0, len(test_cleanups._class_cleanups))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100272
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100273 def test_resource_cleanup_failures(self):
Andrea Frittoli3be57482017-08-25 22:41:26 +0100274 cfg.CONF.set_default('neutron', False, 'service_available')
275 exp_args = (1, 2,)
276 exp_kwargs = {'a': 1, 'b': 2}
Andrea Frittoli3be57482017-08-25 22:41:26 +0100277 mock1 = mock.Mock()
278 mock1.side_effect = Exception('mock1 resource cleanup failure')
279 mock2 = mock.Mock()
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100280 mock3 = mock.Mock()
281 mock3.side_effect = Exception('mock3 resource cleanup failure')
282 exp_functions = [mock1, mock2, mock3]
Andrea Frittoli3be57482017-08-25 22:41:26 +0100283
284 class TestWithFailingCleanups(self.parent_test):
285
Andrea Frittoli3be57482017-08-25 22:41:26 +0100286 @classmethod
287 def resource_setup(cls):
288 for fn in exp_functions:
289 cls.addClassResourceCleanup(fn, *exp_args,
290 **exp_kwargs)
291
292 test_cleanups = TestWithFailingCleanups()
293 suite = unittest.TestSuite((test_cleanups,))
294 log = []
295 result = LoggingTestResult(log)
296 suite.run(result)
297 # One multiple exception captured
298 self.assertEqual(1, len(log))
299 # [0]: test, err, details [1] -> exc_info
300 # Type, Exception, traceback [1] -> MultipleException
301 found_exc = log[0][1][1]
302 self.assertTrue(isinstance(found_exc, testtools.MultipleExceptions))
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100303 self.assertEqual(2, len(found_exc.args))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100304 # Each arg is exc_info - match messages and order
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100305 self.assertIn('mock3 resource', str(found_exc.args[0][1]))
306 self.assertIn('mock1 resource', str(found_exc.args[1][1]))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100307 # All stacked resource cleanups invoked
308 mock1.assert_called_once_with(*exp_args, **exp_kwargs)
309 mock2.assert_called_once_with(*exp_args, **exp_kwargs)
Andrea Frittoli3be57482017-08-25 22:41:26 +0100310 # Cleanup stack is empty
311 self.assertEqual(0, len(test_cleanups._class_cleanups))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100312
313 def test_super_resource_cleanup_not_invoked(self):
314
315 class BadResourceCleanup(self.parent_test):
316
317 @classmethod
318 def resource_cleanup(cls):
319 pass
320
321 bad_class = BadResourceCleanup()
322 suite = unittest.TestSuite((bad_class,))
323 log = []
324 result = LoggingTestResult(log)
325 suite.run(result)
326 # One multiple exception captured
327 self.assertEqual(1, len(log))
328 # [0]: test, err, details [1] -> exc_info
329 # Type, Exception, traceback [1] -> RuntimeError
330 found_exc = log[0][1][1]
331 self.assertTrue(isinstance(found_exc, RuntimeError))
332 self.assertIn(BadResourceCleanup.__name__, str(found_exc))
Andrea Frittoli421dc3c2017-08-15 12:17:42 +0100333
334 def test_super_skip_checks_not_invoked(self):
335
336 class BadSkipChecks(self.parent_test):
337
338 @classmethod
339 def skip_checks(cls):
340 pass
341
342 bad_class = BadSkipChecks()
343 with testtools.ExpectedException(
344 RuntimeError,
345 value_re='^.* ' + BadSkipChecks.__name__):
346 bad_class.setUpClass()
347
348 def test_super_setup_credentials_not_invoked(self):
349
350 class BadSetupCredentials(self.parent_test):
351
352 @classmethod
353 def skip_checks(cls):
354 pass
355
356 bad_class = BadSetupCredentials()
357 with testtools.ExpectedException(
358 RuntimeError,
359 value_re='^.* ' + BadSetupCredentials.__name__):
360 bad_class.setUpClass()
361
362 def test_grandparent_skip_checks_not_invoked(self):
363
364 class BadSkipChecks(self.parent_test):
365
366 @classmethod
367 def skip_checks(cls):
368 pass
369
370 class SonOfBadSkipChecks(BadSkipChecks):
371 pass
372
373 bad_class = SonOfBadSkipChecks()
374 with testtools.ExpectedException(
375 RuntimeError,
376 value_re='^.* ' + SonOfBadSkipChecks.__name__):
377 bad_class.setUpClass()
Andrea Frittolia5440c82017-08-23 18:11:21 +0100378
379 @mock.patch('tempest.common.credentials_factory.is_admin_available',
380 autospec=True, return_value=True)
381 def test_skip_checks_admin(self, mock_iaa):
382 identity_version = 'identity_version'
383
384 class NeedAdmin(self.parent_test):
385 credentials = ['admin']
386
387 @classmethod
388 def get_identity_version(cls):
389 return identity_version
390
391 NeedAdmin().skip_checks()
392 mock_iaa.assert_called_once_with('identity_version')
393
394 @mock.patch('tempest.common.credentials_factory.is_admin_available',
395 autospec=True, return_value=False)
396 def test_skip_checks_admin_not_available(self, mock_iaa):
397 identity_version = 'identity_version'
398
399 class NeedAdmin(self.parent_test):
400 credentials = ['admin']
401
402 @classmethod
403 def get_identity_version(cls):
404 return identity_version
405
406 with testtools.ExpectedException(testtools.testcase.TestSkipped):
407 NeedAdmin().skip_checks()
408 mock_iaa.assert_called_once_with('identity_version')
409
410 def test_skip_checks_identity_v2_not_available(self):
411 cfg.CONF.set_default('api_v2', False, 'identity-feature-enabled')
412
413 class NeedV2(self.parent_test):
414 identity_version = 'v2'
415
416 with testtools.ExpectedException(testtools.testcase.TestSkipped):
417 NeedV2().skip_checks()
418
419 def test_skip_checks_identity_v3_not_available(self):
420 cfg.CONF.set_default('api_v3', False, 'identity-feature-enabled')
421
422 class NeedV3(self.parent_test):
423 identity_version = 'v3'
424
425 with testtools.ExpectedException(testtools.testcase.TestSkipped):
426 NeedV3().skip_checks()
Andrea Frittolia6c885a2017-08-23 19:37:50 +0100427
428 def test_setup_credentials_all(self):
429 expected_creds = ['string', ['list', 'role1', 'role2']]
430
431 class AllCredentials(self.parent_test):
432 credentials = expected_creds
433
434 expected_clients = 'clients'
435 with mock.patch.object(
436 AllCredentials,
437 'get_client_manager') as mock_get_client_manager:
438 mock_get_client_manager.return_value = expected_clients
439 all_creds = AllCredentials()
440 all_creds.setup_credentials()
441 self.assertTrue(hasattr(all_creds, 'os_string'))
442 self.assertEqual(expected_clients, all_creds.os_string)
443 self.assertTrue(hasattr(all_creds, 'os_roles_list'))
444 self.assertEqual(expected_clients, all_creds.os_roles_list)
445 self.assertEqual(2, mock_get_client_manager.call_count)
446 self.assertEqual(
447 expected_creds[0],
448 mock_get_client_manager.mock_calls[0][2]['credential_type'])
449 self.assertEqual(
450 expected_creds[1][1:],
451 mock_get_client_manager.mock_calls[1][2]['roles'])
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100452
Ghanshyam Mann2d0da042021-03-05 09:09:30 -0600453 def test_setup_credentials_with_role_and_system_scope(self):
454 expected_creds = [['system_my_role', 'role1', 'role2']]
455
456 class SystemRoleCredentials(self.parent_test):
457 credentials = expected_creds
458
459 expected_clients = 'clients'
460 with mock.patch.object(
461 SystemRoleCredentials,
462 'get_client_manager') as mock_get_client_manager:
463 mock_get_client_manager.return_value = expected_clients
464 sys_creds = SystemRoleCredentials()
465 sys_creds.setup_credentials()
466 self.assertTrue(hasattr(sys_creds, 'os_system_my_role'))
467 self.assertEqual(expected_clients, sys_creds.os_system_my_role)
468 self.assertTrue(hasattr(sys_creds, 'os_roles_system_my_role'))
469 self.assertEqual(expected_clients, sys_creds.os_roles_system_my_role)
470 self.assertEqual(1, mock_get_client_manager.call_count)
471 self.assertEqual(
472 expected_creds[0][1:],
473 mock_get_client_manager.mock_calls[0][2]['roles'])
474 self.assertEqual(
475 'system',
476 mock_get_client_manager.mock_calls[0][2]['scope'])
477
478 def test_setup_credentials_with_multiple_role_and_system_scope(self):
479 expected_creds = [['system_my_role', 'role1', 'role2'],
480 ['system_my_role2', 'role1', 'role2'],
481 ['system_my_role3', 'role3']]
482
483 class SystemRoleCredentials(self.parent_test):
484 credentials = expected_creds
485
486 expected_clients = 'clients'
487 with mock.patch.object(
488 SystemRoleCredentials,
489 'get_client_manager') as mock_get_client_manager:
490 mock_get_client_manager.return_value = expected_clients
491 sys_creds = SystemRoleCredentials()
492 sys_creds.setup_credentials()
493 self.assertTrue(hasattr(sys_creds, 'os_system_my_role'))
494 self.assertEqual(expected_clients, sys_creds.os_system_my_role)
495 self.assertTrue(hasattr(sys_creds, 'os_roles_system_my_role'))
496 self.assertEqual(expected_clients, sys_creds.os_roles_system_my_role)
497 self.assertTrue(hasattr(sys_creds, 'os_system_my_role2'))
498 self.assertEqual(expected_clients, sys_creds.os_system_my_role2)
499 self.assertTrue(hasattr(sys_creds, 'os_roles_system_my_role2'))
500 self.assertEqual(expected_clients, sys_creds.os_roles_system_my_role2)
501 self.assertTrue(hasattr(sys_creds, 'os_system_my_role3'))
502 self.assertEqual(expected_clients, sys_creds.os_system_my_role3)
503 self.assertTrue(hasattr(sys_creds, 'os_roles_system_my_role3'))
504 self.assertEqual(expected_clients, sys_creds.os_roles_system_my_role3)
505 self.assertEqual(3, mock_get_client_manager.call_count)
506 self.assertEqual(
507 expected_creds[0][1:],
508 mock_get_client_manager.mock_calls[0][2]['roles'])
509 self.assertEqual(
510 'system', mock_get_client_manager.mock_calls[0][2]['scope'])
511 self.assertEqual(
512 expected_creds[1][1:],
513 mock_get_client_manager.mock_calls[1][2]['roles'])
514 self.assertEqual(
515 'system', mock_get_client_manager.mock_calls[1][2]['scope'])
516 self.assertEqual(
517 expected_creds[2][1:],
518 mock_get_client_manager.mock_calls[2][2]['roles'])
519 self.assertEqual(
520 'system', mock_get_client_manager.mock_calls[2][2]['scope'])
521
522 def test_setup_credentials_with_role_and_multiple_scope(self):
523 expected_creds = [['my_role', 'role1', 'role2'],
524 ['project_my_role', 'role1', 'role2'],
525 ['domain_my_role', 'role1', 'role2'],
526 ['system_my_role', 'role1', 'role2']]
527
528 class SystemRoleCredentials(self.parent_test):
529 credentials = expected_creds
530
531 expected_clients = 'clients'
532 with mock.patch.object(
533 SystemRoleCredentials,
534 'get_client_manager') as mock_get_client_manager:
535 mock_get_client_manager.return_value = expected_clients
536 sys_creds = SystemRoleCredentials()
537 sys_creds.setup_credentials()
538 self.assertTrue(hasattr(sys_creds, 'os_my_role'))
539 self.assertEqual(expected_clients, sys_creds.os_my_role)
540 self.assertTrue(hasattr(sys_creds, 'os_roles_my_role'))
541 self.assertEqual(expected_clients, sys_creds.os_roles_my_role)
542 self.assertTrue(hasattr(sys_creds, 'os_project_my_role'))
543 self.assertEqual(expected_clients, sys_creds.os_project_my_role)
544 self.assertTrue(hasattr(sys_creds, 'os_roles_project_my_role'))
545 self.assertEqual(expected_clients, sys_creds.os_roles_project_my_role)
546 self.assertTrue(hasattr(sys_creds, 'os_domain_my_role'))
547 self.assertEqual(expected_clients, sys_creds.os_domain_my_role)
548 self.assertTrue(hasattr(sys_creds, 'os_roles_domain_my_role'))
549 self.assertEqual(expected_clients, sys_creds.os_roles_domain_my_role)
550 self.assertTrue(hasattr(sys_creds, 'os_system_my_role'))
551 self.assertEqual(expected_clients, sys_creds.os_system_my_role)
552 self.assertTrue(hasattr(sys_creds, 'os_roles_system_my_role'))
553 self.assertEqual(expected_clients, sys_creds.os_roles_system_my_role)
554
555 self.assertEqual(4, mock_get_client_manager.call_count)
556 self.assertEqual(
557 expected_creds[0][1:],
558 mock_get_client_manager.mock_calls[0][2]['roles'])
559 self.assertEqual(
560 'project', mock_get_client_manager.mock_calls[0][2]['scope'])
561 self.assertEqual(
562 expected_creds[1][1:],
563 mock_get_client_manager.mock_calls[1][2]['roles'])
564 self.assertEqual(
565 'project', mock_get_client_manager.mock_calls[1][2]['scope'])
566 self.assertEqual(
567 expected_creds[2][1:],
568 mock_get_client_manager.mock_calls[2][2]['roles'])
569 self.assertEqual(
570 'domain', mock_get_client_manager.mock_calls[2][2]['scope'])
571 self.assertEqual(
572 expected_creds[3][1:],
573 mock_get_client_manager.mock_calls[3][2]['roles'])
574 self.assertEqual(
575 'system', mock_get_client_manager.mock_calls[3][2]['scope'])
576
Andrea Frittoliba712ac2017-09-13 16:54:47 -0600577 def test_setup_class_overwritten(self):
578
579 class OverridesSetup(self.parent_test):
580
581 @classmethod
582 def setUpClass(cls): # noqa
583 pass
584
585 overrides_setup = OverridesSetup()
586 suite = unittest.TestSuite((overrides_setup,))
587 log = []
588 result = LoggingTestResult(log)
589 suite.run(result)
590 # Record 0, test (error holder). The error generates during test run.
591 self.assertIn('runTest', str(log[0][0]))
592 # Record 0, traceback
593 self.assertRegex(
594 str(log[0][2]['traceback']).replace('\n', ' '),
595 RuntimeError.__name__ + ': .* ' + OverridesSetup.__name__)
596
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100597
598class TestTempestBaseTestClassFixtures(base.TestCase):
599
600 SETUP_FIXTURES = [test.BaseTestCase.setUpClass.__name__,
601 test.BaseTestCase.skip_checks.__name__,
602 test.BaseTestCase.setup_credentials.__name__,
603 test.BaseTestCase.setup_clients.__name__,
604 test.BaseTestCase.resource_setup.__name__]
605 TEARDOWN_FIXTURES = [test.BaseTestCase.tearDownClass.__name__,
606 test.BaseTestCase.resource_cleanup.__name__,
607 test.BaseTestCase.clear_credentials.__name__]
608
609 def setUp(self):
610 super(TestTempestBaseTestClassFixtures, self).setUp()
611 self.mocks = {}
612 for fix in self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES:
613 self.mocks[fix] = mock.Mock()
614
615 def tracker_builder(name):
616
617 def tracker(cls):
618 # Track that the fixture was invoked
619 cls.fixtures_invoked.append(name)
620 # Run the fixture
621 getattr(super(TestWithClassFixtures, cls), name)()
622 # Run a mock we can use for side effects
623 self.mocks[name]()
624
625 return tracker
626
627 class TestWithClassFixtures(test.BaseTestCase):
628
629 credentials = []
630 fixtures_invoked = []
631
632 def runTest(_self):
633 pass
634
635 # Decorate all test class fixtures with tracker_builder
636 for method_name in self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES:
637 setattr(TestWithClassFixtures, method_name,
638 classmethod(tracker_builder(method_name)))
639
640 self.test = TestWithClassFixtures()
641
642 def test_no_error_flow(self):
643 # If all setup fixtures are executed, all cleanup fixtures are
644 # executed too
645 suite = unittest.TestSuite((self.test,))
646 log = []
647 result = LoggingTestResult(log)
648 suite.run(result)
649 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
650 self.test.fixtures_invoked)
651
652 def test_skip_only(self):
653 # If a skip condition is hit in the test, no credentials or resource
654 # is provisioned / cleaned-up
Ghanshyam Manne64c78d2019-10-10 22:26:43 +0000655 self.mocks['skip_checks'].side_effect = (
656 testtools.TestCase.skipException())
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100657 suite = unittest.TestSuite((self.test,))
658 log = []
659 result = LoggingTestResult(log)
660 suite.run(result)
661 # If we trigger a skip condition, teardown is not invoked at all
Douglas Viroel7155fdf2019-10-01 13:34:52 -0300662 self.assertEqual((self.SETUP_FIXTURES[:2] +
663 [self.TEARDOWN_FIXTURES[0]]),
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100664 self.test.fixtures_invoked)
665
666 def test_skip_credentials_fails(self):
667 expected_exc = 'sc exploded'
668 self.mocks['setup_credentials'].side_effect = Exception(expected_exc)
669 suite = unittest.TestSuite((self.test,))
670 log = []
671 result = LoggingTestResult(log)
672 suite.run(result)
673 # If setup_credentials explodes, we invoked teardown class and
674 # clear credentials, and re-raise
675 self.assertEqual((self.SETUP_FIXTURES[:3] +
676 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
677 self.test.fixtures_invoked)
678 found_exc = log[0][1][1]
679 self.assertIn(expected_exc, str(found_exc))
680
681 def test_skip_credentials_fails_clear_fails(self):
682 # If cleanup fails on failure, we log the exception and do not
683 # re-raise it. Note that since the exception happens outside of
684 # the Tempest test setUp, logging is not captured on the Tempest
685 # test side, it will be captured by the unit test instead.
686 expected_exc = 'sc exploded'
687 clear_exc = 'clear exploded'
688 self.mocks['setup_credentials'].side_effect = Exception(expected_exc)
689 self.mocks['clear_credentials'].side_effect = Exception(clear_exc)
690 suite = unittest.TestSuite((self.test,))
691 log = []
692 result = LoggingTestResult(log)
693 suite.run(result)
694 # If setup_credentials explodes, we invoked teardown class and
695 # clear credentials, and re-raise
696 self.assertEqual((self.SETUP_FIXTURES[:3] +
697 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
698 self.test.fixtures_invoked)
699 found_exc = log[0][1][1]
700 self.assertIn(expected_exc, str(found_exc))
701 # Since log capture depends on OS_LOG_CAPTURE, we can only assert if
702 # logging was captured
703 if os.environ.get('OS_LOG_CAPTURE'):
704 self.assertIn(clear_exc, self.log_fixture.logger.output)
705
706 def test_skip_credentials_clients_resources_credentials_clear_fails(self):
707 # If cleanup fails with no previous failure, we re-raise the exception.
708 expected_exc = 'clear exploded'
709 self.mocks['clear_credentials'].side_effect = Exception(expected_exc)
710 suite = unittest.TestSuite((self.test,))
711 log = []
712 result = LoggingTestResult(log)
713 suite.run(result)
714 # If setup_credentials explodes, we invoked teardown class and
715 # clear credentials, and re-raise
716 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
717 self.test.fixtures_invoked)
718 found_exc = log[0][1][1]
719 self.assertIn(expected_exc, str(found_exc))
720
721 def test_skip_credentials_clients_fails(self):
722 expected_exc = 'clients exploded'
723 self.mocks['setup_clients'].side_effect = Exception(expected_exc)
724 suite = unittest.TestSuite((self.test,))
725 log = []
726 result = LoggingTestResult(log)
727 suite.run(result)
728 # If setup_clients explodes, we invoked teardown class and
729 # clear credentials, and re-raise
730 self.assertEqual((self.SETUP_FIXTURES[:4] +
731 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
732 self.test.fixtures_invoked)
733 found_exc = log[0][1][1]
734 self.assertIn(expected_exc, str(found_exc))
735
736 def test_skip_credentials_clients_resources_fails(self):
737 expected_exc = 'resource setup exploded'
738 self.mocks['resource_setup'].side_effect = Exception(expected_exc)
739 suite = unittest.TestSuite((self.test,))
740 log = []
741 result = LoggingTestResult(log)
742 suite.run(result)
743 # If resource_setup explodes, we invoked teardown class and
744 # clear credentials and resource cleanup, and re-raise
745 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
746 self.test.fixtures_invoked)
747 found_exc = log[0][1][1]
748 self.assertIn(expected_exc, str(found_exc))
Ghanshyam Mann18b45d72021-12-07 12:37:29 -0600749
750
751class TestAPIMicroversionTest1(test.BaseTestCase):
752
753 @classmethod
754 def resource_setup(cls):
755 super(TestAPIMicroversionTest1, cls).resource_setup()
756 # Setting microvesions and checks that every tests
757 # of this class will have those microversion set
758 # on service clients requesting service APIs.
759 cls.setup_api_microversion_fixture(
760 compute_microversion='2.30',
761 volume_microversion='3.10',
762 placement_microversion='3.1')
763 # Check microvesion is set during resource_setup()
764 if base_compute_client.COMPUTE_MICROVERSION != '2.30':
765 raise testtools.TestCase.failureException(
766 "Microversion is not set in resource_setup method")
767 if base_volume_client.VOLUME_MICROVERSION != '3.10':
768 raise testtools.TestCase.failureException(
769 "Microversion is not set in resource_setup method")
770 if base_placement_client.PLACEMENT_MICROVERSION != '3.1':
771 raise testtools.TestCase.failureException(
772 "Microversion is not set in resource_setup method")
773
774 @classmethod
775 def resource_cleanup(cls):
776 super(TestAPIMicroversionTest1, cls).resource_cleanup()
777 # Check microversion is reset back to None in resource_cleanup()
778 if base_compute_client.COMPUTE_MICROVERSION is not None:
779 raise testtools.TestCase.failureException(
780 "Microversion is not reset to None in resource_cleanup method")
781 if base_volume_client.VOLUME_MICROVERSION is not None:
782 raise testtools.TestCase.failureException(
783 "Microversion is not reset to None in resource_cleanup method")
784 if base_placement_client.PLACEMENT_MICROVERSION is not None:
785 raise testtools.TestCase.failureException(
786 "Microversion is not reset to None in resource_cleanup method")
787
788 def setUp(self):
789 super(TestAPIMicroversionTest1, self).setUp()
790 # Check microversion is set in setUp method also.
791 self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
792 self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
793 self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
794
795 def tearDown(self):
796 super(TestAPIMicroversionTest1, self).tearDown()
797 # Check microversion is set in tearDown method also.
798 self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
799 self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
800 self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
801
802 def test_1(self):
803 self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
804 self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
805 self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
806
807 def test_2(self):
808 self.assertEqual('2.30', base_compute_client.COMPUTE_MICROVERSION)
809 self.assertEqual('3.10', base_volume_client.VOLUME_MICROVERSION)
810 self.assertEqual('3.1', base_placement_client.PLACEMENT_MICROVERSION)
811
812
813class TestAPIMicroversionTest2(test.BaseTestCase):
814
815 @classmethod
816 def resource_setup(cls):
817 super(TestAPIMicroversionTest2, cls).resource_setup()
818 # Setting microvesions different from what set in
819 # MicroversionTest1 and checks that every tests
820 # of this class will have the new microversion set
821 # on service clients requesting service APIs.
822 cls.setup_api_microversion_fixture(
823 compute_microversion='2.80',
824 volume_microversion='3.80',
825 placement_microversion='3.8')
826 # Check microvesion is set during resource_setup()
827 if base_compute_client.COMPUTE_MICROVERSION != '2.80':
828 raise testtools.TestCase.failureException(
829 "Microversion is not set in resource_setup method")
830 if base_volume_client.VOLUME_MICROVERSION != '3.80':
831 raise testtools.TestCase.failureException(
832 "Microversion is not set in resource_setup method")
833 if base_placement_client.PLACEMENT_MICROVERSION != '3.8':
834 raise testtools.TestCase.failureException(
835 "Microversion is not set in resource_setup method")
836
837 @classmethod
838 def resource_cleanup(cls):
839 super(TestAPIMicroversionTest2, cls).resource_cleanup()
840 # Check microversion is reset back to None in resource_cleanup()
841 if base_compute_client.COMPUTE_MICROVERSION is not None:
842 raise testtools.TestCase.failureException(
843 "Microversion is not reset to None in resource_cleanup method")
844 if base_volume_client.VOLUME_MICROVERSION is not None:
845 raise testtools.TestCase.failureException(
846 "Microversion is not reset to None in resource_cleanup method")
847 if base_placement_client.PLACEMENT_MICROVERSION is not None:
848 raise testtools.TestCase.failureException(
849 "Microversion is not reset to None in resource_cleanup method")
850
851 def setUp(self):
852 super(TestAPIMicroversionTest2, self).setUp()
853 # Check microversion is set in setUp method also.
854 self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
855 self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
856 self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
857
858 def tearDown(self):
859 super(TestAPIMicroversionTest2, self).tearDown()
860 # Check microversion is set in tearDown method also.
861 self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
862 self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
863 self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
864
865 def test_1(self):
866 self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
867 self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
868 self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
869
870 def test_2(self):
871 self.assertEqual('2.80', base_compute_client.COMPUTE_MICROVERSION)
872 self.assertEqual('3.80', base_volume_client.VOLUME_MICROVERSION)
873 self.assertEqual('3.8', base_placement_client.PLACEMENT_MICROVERSION)
874
875
876class TestAPIMicroversionTest3(test.BaseTestCase):
877
878 @classmethod
879 def resource_setup(cls):
880 super(TestAPIMicroversionTest3, cls).resource_setup()
881 # Not setting microversion for this test class so
882 # there should not be any micorversion set on service
883 # clients requesting services APIs.
884 # Check microvesion is not set during resource_setup()
885 if base_compute_client.COMPUTE_MICROVERSION is not None:
886 raise testtools.TestCase.failureException(
887 "Microversion is not set in resource_setup method")
888 if base_volume_client.VOLUME_MICROVERSION is not None:
889 raise testtools.TestCase.failureException(
890 "Microversion is not set in resource_setup method")
891 if base_placement_client.PLACEMENT_MICROVERSION is not None:
892 raise testtools.TestCase.failureException(
893 "Microversion is not set in resource_setup method")
894
895 @classmethod
896 def resource_cleanup(cls):
897 super(TestAPIMicroversionTest3, cls).resource_cleanup()
898 # Check microversion is set to None in resource_cleanup()
899 if base_compute_client.COMPUTE_MICROVERSION is not None:
900 raise testtools.TestCase.failureException(
901 "Microversion is not reset to None in resource_cleanup method")
902 if base_volume_client.VOLUME_MICROVERSION is not None:
903 raise testtools.TestCase.failureException(
904 "Microversion is not reset to None in resource_cleanup method")
905 if base_placement_client.PLACEMENT_MICROVERSION is not None:
906 raise testtools.TestCase.failureException(
907 "Microversion is not reset to None in resource_cleanup method")
908
909 def setUp(self):
910 super(TestAPIMicroversionTest3, self).setUp()
911 # Check microversion is None in setUp method also.
912 self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
913 self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
914 self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
915
916 def tearDown(self):
917 super(TestAPIMicroversionTest3, self).tearDown()
918 # Check microversion is None in tearDown method also.
919 self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
920 self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
921 self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
922
923 def test_1(self):
924 self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
925 self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
926 self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)
927
928 def test_2(self):
929 self.assertIsNone(base_compute_client.COMPUTE_MICROVERSION)
930 self.assertIsNone(base_volume_client.VOLUME_MICROVERSION)
931 self.assertIsNone(base_placement_client.PLACEMENT_MICROVERSION)