blob: 49fd0105a937586fe5b284034046d3ad140c4c97 [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
Andrea Frittoli3be57482017-08-25 22:41:26 +010017import sys
18
19import mock
20from 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
Andrea Frittoli3be57482017-08-25 22:41:26 +010027from tempest import test
28from tempest.tests import base
29from tempest.tests import fake_config
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010030from tempest.tests.lib import fake_credentials
31from tempest.tests.lib.services import registry_fixture
Andrea Frittoli3be57482017-08-25 22:41:26 +010032
33
34if sys.version_info >= (2, 7):
35 import unittest
36else:
37 import unittest2 as unittest
38
39
40class LoggingTestResult(testtools.TestResult):
41
42 def __init__(self, log, *args, **kwargs):
43 super(LoggingTestResult, self).__init__(*args, **kwargs)
44 self.log = log
45
46 def addError(self, test, err=None, details=None):
47 self.log.append((test, err, details))
48
49
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010050class TestValidationResources(base.TestCase):
51
Andrea Frittoli0477acc2017-08-09 21:14:53 +010052 validation_resources_module = 'tempest.lib.common.validation_resources'
Andrea Frittoli9f416dd2017-08-10 15:38:00 +010053
54 def setUp(self):
55 super(TestValidationResources, self).setUp()
56 self.useFixture(fake_config.ConfigFixture())
57 self.useFixture(registry_fixture.RegistryFixture())
58 self.patchobject(config, 'TempestConfigPrivate',
59 fake_config.FakePrivate)
60
61 class TestTestClass(test.BaseTestCase):
62 pass
63
64 self.test_test_class = TestTestClass
65
66 def test_validation_resources_no_validation(self):
67 cfg.CONF.set_default('run_validation', False, 'validation')
68 creds = fake_credentials.FakeKeystoneV3Credentials()
69 osclients = clients.Manager(creds)
70 vr = self.test_test_class.get_class_validation_resources(osclients)
71 self.assertIsNone(vr)
72
73 def test_validation_resources_exists(self):
74 cfg.CONF.set_default('run_validation', True, 'validation')
75 creds = fake_credentials.FakeKeystoneV3Credentials()
76 osclients = clients.Manager(creds)
77 expected_vr = 'expected_validation_resources'
78 self.test_test_class._validation_resources[osclients] = expected_vr
79 obtained_vr = self.test_test_class.get_class_validation_resources(
80 osclients)
81 self.assertEqual(expected_vr, obtained_vr)
82
83 @mock.patch(validation_resources_module + '.create_validation_resources',
84 autospec=True)
85 def test_validation_resources_new(self, mock_create_vr):
86 cfg.CONF.set_default('run_validation', True, 'validation')
87 cfg.CONF.set_default('neutron', True, 'service_available')
88 creds = fake_credentials.FakeKeystoneV3Credentials()
89 osclients = clients.Manager(creds)
90 expected_vr = {'expected_validation_resources': None}
91 mock_create_vr.return_value = expected_vr
92 with mock.patch.object(
93 self.test_test_class,
94 'addClassResourceCleanup') as mock_add_class_cleanup:
95 obtained_vr = self.test_test_class.get_class_validation_resources(
96 osclients)
97 self.assertEqual(1, mock_add_class_cleanup.call_count)
98 self.assertEqual(mock.call(vr.clear_validation_resources,
99 osclients,
100 use_neutron=True,
101 **expected_vr),
102 mock_add_class_cleanup.call_args)
103 self.assertEqual(mock_create_vr.call_count, 1)
104 self.assertIn(osclients, mock_create_vr.call_args_list[0][0])
105 self.assertEqual(expected_vr, obtained_vr)
106 self.assertIn(osclients, self.test_test_class._validation_resources)
107 self.assertEqual(expected_vr,
108 self.test_test_class._validation_resources[osclients])
109
110 def test_validation_resources_invalid_config(self):
111 invalid_version = 999
112 cfg.CONF.set_default('run_validation', True, 'validation')
113 cfg.CONF.set_default('ip_version_for_ssh', invalid_version,
114 'validation')
115 cfg.CONF.set_default('neutron', True, 'service_available')
116 creds = fake_credentials.FakeKeystoneV3Credentials()
117 osclients = clients.Manager(creds)
118 with testtools.ExpectedException(
119 lib_exc.InvalidConfiguration,
120 value_re='^.*\n.*' + str(invalid_version)):
121 self.test_test_class.get_class_validation_resources(osclients)
122
123 @mock.patch(validation_resources_module + '.create_validation_resources',
124 autospec=True)
125 def test_validation_resources_invalid_config_nova_net(self,
126 mock_create_vr):
127 invalid_version = 999
128 cfg.CONF.set_default('run_validation', True, 'validation')
129 cfg.CONF.set_default('ip_version_for_ssh', invalid_version,
130 'validation')
131 cfg.CONF.set_default('neutron', False, 'service_available')
132 creds = fake_credentials.FakeKeystoneV3Credentials()
133 osclients = clients.Manager(creds)
134 expected_vr = {'expected_validation_resources': None}
135 mock_create_vr.return_value = expected_vr
136 obtained_vr = self.test_test_class.get_class_validation_resources(
137 osclients)
138 self.assertEqual(mock_create_vr.call_count, 1)
139 self.assertIn(osclients, mock_create_vr.call_args_list[0][0])
140 self.assertEqual(expected_vr, obtained_vr)
141 self.assertIn(osclients, self.test_test_class._validation_resources)
142 self.assertEqual(expected_vr,
143 self.test_test_class._validation_resources[osclients])
144
145 @mock.patch(validation_resources_module + '.create_validation_resources',
146 autospec=True)
147 @mock.patch(validation_resources_module + '.clear_validation_resources',
148 autospec=True)
149 def test_validation_resources_fixture(self, mock_clean_vr, mock_create_vr):
150
151 class TestWithRun(self.test_test_class):
152
153 def runTest(self):
154 pass
155
156 cfg.CONF.set_default('run_validation', True, 'validation')
157 test_case = TestWithRun()
158 creds = fake_credentials.FakeKeystoneV3Credentials()
159 osclients = clients.Manager(creds)
160 test_case.get_test_validation_resources(osclients)
161 self.assertEqual(1, mock_create_vr.call_count)
162 self.assertEqual(0, mock_clean_vr.call_count)
163
164
Andrea Frittolibcbf1af12017-08-14 11:53:35 +0100165class TestSetNetworkResources(base.TestCase):
166
167 def setUp(self):
168 super(TestSetNetworkResources, self).setUp()
169
170 class ParentTest(test.BaseTestCase):
171
172 @classmethod
173 def setup_credentials(cls):
174 cls.set_network_resources(dhcp=True)
175 super(ParentTest, cls).setup_credentials()
176
177 def runTest(self):
178 pass
179
180 self.parent_class = ParentTest
181
182 def test_set_network_resources_child_only(self):
183
184 class ChildTest(self.parent_class):
185
186 @classmethod
187 def setup_credentials(cls):
188 cls.set_network_resources(router=True)
189 super(ChildTest, cls).setup_credentials()
190
191 child_test = ChildTest()
192 child_test.setUpClass()
193 # Assert that the parents network resources are not set
194 self.assertFalse(child_test._network_resources['dhcp'])
195 # Assert that the child network resources are set
196 self.assertTrue(child_test._network_resources['router'])
197
198 def test_set_network_resources_right_order(self):
199
200 class ChildTest(self.parent_class):
201
202 @classmethod
203 def setup_credentials(cls):
204 super(ChildTest, cls).setup_credentials()
205 cls.set_network_resources(router=True)
206
207 child_test = ChildTest()
208 with testtools.ExpectedException(RuntimeError,
209 value_re='set_network_resources'):
210 child_test.setUpClass()
211
212 def test_set_network_resources_children(self):
213
214 class ChildTest(self.parent_class):
215
216 @classmethod
217 def setup_credentials(cls):
218 cls.set_network_resources(router=True)
219 super(ChildTest, cls).setup_credentials()
220
221 class GrandChildTest(ChildTest):
222 pass
223
224 # Invoke setupClass on both and check that the setup_credentials
225 # call check mechanism does not report any false negative.
226 child_test = ChildTest()
227 child_test.setUpClass()
228 grandchild_test = GrandChildTest()
229 grandchild_test.setUpClass()
230
231
Andrea Frittoli3be57482017-08-25 22:41:26 +0100232class TestTempestBaseTestClass(base.TestCase):
233
234 def setUp(self):
235 super(TestTempestBaseTestClass, self).setUp()
236 self.useFixture(fake_config.ConfigFixture())
237 self.patchobject(config, 'TempestConfigPrivate',
238 fake_config.FakePrivate)
239
240 class ParentTest(test.BaseTestCase):
241
242 def runTest(self):
243 pass
244
245 self.parent_test = ParentTest
246
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100247 def test_resource_cleanup(self):
Andrea Frittoli3be57482017-08-25 22:41:26 +0100248 cfg.CONF.set_default('neutron', False, 'service_available')
249 exp_args = (1, 2,)
250 exp_kwargs = {'a': 1, 'b': 2}
Andrea Frittoli3be57482017-08-25 22:41:26 +0100251 mock1 = mock.Mock()
252 mock2 = mock.Mock()
253 exp_functions = [mock1, mock2]
254
255 class TestWithCleanups(self.parent_test):
256
Andrea Frittoli3be57482017-08-25 22:41:26 +0100257 @classmethod
258 def resource_setup(cls):
259 for fn in exp_functions:
260 cls.addClassResourceCleanup(fn, *exp_args,
261 **exp_kwargs)
262
263 test_cleanups = TestWithCleanups()
264 suite = unittest.TestSuite((test_cleanups,))
265 log = []
266 result = LoggingTestResult(log)
267 suite.run(result)
268 # No exception raised - error log is empty
269 self.assertFalse(log)
270 # All stacked resource cleanups invoked
271 mock1.assert_called_once_with(*exp_args, **exp_kwargs)
272 mock2.assert_called_once_with(*exp_args, **exp_kwargs)
Andrea Frittoli3be57482017-08-25 22:41:26 +0100273 # Cleanup stack is empty
274 self.assertEqual(0, len(test_cleanups._class_cleanups))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100275
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100276 def test_resource_cleanup_failures(self):
Andrea Frittoli3be57482017-08-25 22:41:26 +0100277 cfg.CONF.set_default('neutron', False, 'service_available')
278 exp_args = (1, 2,)
279 exp_kwargs = {'a': 1, 'b': 2}
Andrea Frittoli3be57482017-08-25 22:41:26 +0100280 mock1 = mock.Mock()
281 mock1.side_effect = Exception('mock1 resource cleanup failure')
282 mock2 = mock.Mock()
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100283 mock3 = mock.Mock()
284 mock3.side_effect = Exception('mock3 resource cleanup failure')
285 exp_functions = [mock1, mock2, mock3]
Andrea Frittoli3be57482017-08-25 22:41:26 +0100286
287 class TestWithFailingCleanups(self.parent_test):
288
Andrea Frittoli3be57482017-08-25 22:41:26 +0100289 @classmethod
290 def resource_setup(cls):
291 for fn in exp_functions:
292 cls.addClassResourceCleanup(fn, *exp_args,
293 **exp_kwargs)
294
295 test_cleanups = TestWithFailingCleanups()
296 suite = unittest.TestSuite((test_cleanups,))
297 log = []
298 result = LoggingTestResult(log)
299 suite.run(result)
300 # One multiple exception captured
301 self.assertEqual(1, len(log))
302 # [0]: test, err, details [1] -> exc_info
303 # Type, Exception, traceback [1] -> MultipleException
304 found_exc = log[0][1][1]
305 self.assertTrue(isinstance(found_exc, testtools.MultipleExceptions))
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100306 self.assertEqual(2, len(found_exc.args))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100307 # Each arg is exc_info - match messages and order
Andrea Frittoli9f416dd2017-08-10 15:38:00 +0100308 self.assertIn('mock3 resource', str(found_exc.args[0][1]))
309 self.assertIn('mock1 resource', str(found_exc.args[1][1]))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100310 # All stacked resource cleanups invoked
311 mock1.assert_called_once_with(*exp_args, **exp_kwargs)
312 mock2.assert_called_once_with(*exp_args, **exp_kwargs)
Andrea Frittoli3be57482017-08-25 22:41:26 +0100313 # Cleanup stack is empty
314 self.assertEqual(0, len(test_cleanups._class_cleanups))
Andrea Frittoli3be57482017-08-25 22:41:26 +0100315
316 def test_super_resource_cleanup_not_invoked(self):
317
318 class BadResourceCleanup(self.parent_test):
319
320 @classmethod
321 def resource_cleanup(cls):
322 pass
323
324 bad_class = BadResourceCleanup()
325 suite = unittest.TestSuite((bad_class,))
326 log = []
327 result = LoggingTestResult(log)
328 suite.run(result)
329 # One multiple exception captured
330 self.assertEqual(1, len(log))
331 # [0]: test, err, details [1] -> exc_info
332 # Type, Exception, traceback [1] -> RuntimeError
333 found_exc = log[0][1][1]
334 self.assertTrue(isinstance(found_exc, RuntimeError))
335 self.assertIn(BadResourceCleanup.__name__, str(found_exc))
Andrea Frittoli421dc3c2017-08-15 12:17:42 +0100336
337 def test_super_skip_checks_not_invoked(self):
338
339 class BadSkipChecks(self.parent_test):
340
341 @classmethod
342 def skip_checks(cls):
343 pass
344
345 bad_class = BadSkipChecks()
346 with testtools.ExpectedException(
347 RuntimeError,
348 value_re='^.* ' + BadSkipChecks.__name__):
349 bad_class.setUpClass()
350
351 def test_super_setup_credentials_not_invoked(self):
352
353 class BadSetupCredentials(self.parent_test):
354
355 @classmethod
356 def skip_checks(cls):
357 pass
358
359 bad_class = BadSetupCredentials()
360 with testtools.ExpectedException(
361 RuntimeError,
362 value_re='^.* ' + BadSetupCredentials.__name__):
363 bad_class.setUpClass()
364
365 def test_grandparent_skip_checks_not_invoked(self):
366
367 class BadSkipChecks(self.parent_test):
368
369 @classmethod
370 def skip_checks(cls):
371 pass
372
373 class SonOfBadSkipChecks(BadSkipChecks):
374 pass
375
376 bad_class = SonOfBadSkipChecks()
377 with testtools.ExpectedException(
378 RuntimeError,
379 value_re='^.* ' + SonOfBadSkipChecks.__name__):
380 bad_class.setUpClass()
Andrea Frittolia5440c82017-08-23 18:11:21 +0100381
382 @mock.patch('tempest.common.credentials_factory.is_admin_available',
383 autospec=True, return_value=True)
384 def test_skip_checks_admin(self, mock_iaa):
385 identity_version = 'identity_version'
386
387 class NeedAdmin(self.parent_test):
388 credentials = ['admin']
389
390 @classmethod
391 def get_identity_version(cls):
392 return identity_version
393
394 NeedAdmin().skip_checks()
395 mock_iaa.assert_called_once_with('identity_version')
396
397 @mock.patch('tempest.common.credentials_factory.is_admin_available',
398 autospec=True, return_value=False)
399 def test_skip_checks_admin_not_available(self, mock_iaa):
400 identity_version = 'identity_version'
401
402 class NeedAdmin(self.parent_test):
403 credentials = ['admin']
404
405 @classmethod
406 def get_identity_version(cls):
407 return identity_version
408
409 with testtools.ExpectedException(testtools.testcase.TestSkipped):
410 NeedAdmin().skip_checks()
411 mock_iaa.assert_called_once_with('identity_version')
412
413 def test_skip_checks_identity_v2_not_available(self):
414 cfg.CONF.set_default('api_v2', False, 'identity-feature-enabled')
415
416 class NeedV2(self.parent_test):
417 identity_version = 'v2'
418
419 with testtools.ExpectedException(testtools.testcase.TestSkipped):
420 NeedV2().skip_checks()
421
422 def test_skip_checks_identity_v3_not_available(self):
423 cfg.CONF.set_default('api_v3', False, 'identity-feature-enabled')
424
425 class NeedV3(self.parent_test):
426 identity_version = 'v3'
427
428 with testtools.ExpectedException(testtools.testcase.TestSkipped):
429 NeedV3().skip_checks()
Andrea Frittolia6c885a2017-08-23 19:37:50 +0100430
431 def test_setup_credentials_all(self):
432 expected_creds = ['string', ['list', 'role1', 'role2']]
433
434 class AllCredentials(self.parent_test):
435 credentials = expected_creds
436
437 expected_clients = 'clients'
438 with mock.patch.object(
439 AllCredentials,
440 'get_client_manager') as mock_get_client_manager:
441 mock_get_client_manager.return_value = expected_clients
442 all_creds = AllCredentials()
443 all_creds.setup_credentials()
444 self.assertTrue(hasattr(all_creds, 'os_string'))
445 self.assertEqual(expected_clients, all_creds.os_string)
446 self.assertTrue(hasattr(all_creds, 'os_roles_list'))
447 self.assertEqual(expected_clients, all_creds.os_roles_list)
448 self.assertEqual(2, mock_get_client_manager.call_count)
449 self.assertEqual(
450 expected_creds[0],
451 mock_get_client_manager.mock_calls[0][2]['credential_type'])
452 self.assertEqual(
453 expected_creds[1][1:],
454 mock_get_client_manager.mock_calls[1][2]['roles'])
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100455
Andrea Frittoliba712ac2017-09-13 16:54:47 -0600456 def test_setup_class_overwritten(self):
457
458 class OverridesSetup(self.parent_test):
459
460 @classmethod
461 def setUpClass(cls): # noqa
462 pass
463
464 overrides_setup = OverridesSetup()
465 suite = unittest.TestSuite((overrides_setup,))
466 log = []
467 result = LoggingTestResult(log)
468 suite.run(result)
469 # Record 0, test (error holder). The error generates during test run.
470 self.assertIn('runTest', str(log[0][0]))
471 # Record 0, traceback
472 self.assertRegex(
473 str(log[0][2]['traceback']).replace('\n', ' '),
474 RuntimeError.__name__ + ': .* ' + OverridesSetup.__name__)
475
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100476
477class TestTempestBaseTestClassFixtures(base.TestCase):
478
479 SETUP_FIXTURES = [test.BaseTestCase.setUpClass.__name__,
480 test.BaseTestCase.skip_checks.__name__,
481 test.BaseTestCase.setup_credentials.__name__,
482 test.BaseTestCase.setup_clients.__name__,
483 test.BaseTestCase.resource_setup.__name__]
484 TEARDOWN_FIXTURES = [test.BaseTestCase.tearDownClass.__name__,
485 test.BaseTestCase.resource_cleanup.__name__,
486 test.BaseTestCase.clear_credentials.__name__]
487
488 def setUp(self):
489 super(TestTempestBaseTestClassFixtures, self).setUp()
490 self.mocks = {}
491 for fix in self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES:
492 self.mocks[fix] = mock.Mock()
493
494 def tracker_builder(name):
495
496 def tracker(cls):
497 # Track that the fixture was invoked
498 cls.fixtures_invoked.append(name)
499 # Run the fixture
500 getattr(super(TestWithClassFixtures, cls), name)()
501 # Run a mock we can use for side effects
502 self.mocks[name]()
503
504 return tracker
505
506 class TestWithClassFixtures(test.BaseTestCase):
507
508 credentials = []
509 fixtures_invoked = []
510
511 def runTest(_self):
512 pass
513
514 # Decorate all test class fixtures with tracker_builder
515 for method_name in self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES:
516 setattr(TestWithClassFixtures, method_name,
517 classmethod(tracker_builder(method_name)))
518
519 self.test = TestWithClassFixtures()
520
521 def test_no_error_flow(self):
522 # If all setup fixtures are executed, all cleanup fixtures are
523 # executed too
524 suite = unittest.TestSuite((self.test,))
525 log = []
526 result = LoggingTestResult(log)
527 suite.run(result)
528 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
529 self.test.fixtures_invoked)
530
531 def test_skip_only(self):
532 # If a skip condition is hit in the test, no credentials or resource
533 # is provisioned / cleaned-up
Ghanshyam Manne64c78d2019-10-10 22:26:43 +0000534 self.mocks['skip_checks'].side_effect = (
535 testtools.TestCase.skipException())
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100536 suite = unittest.TestSuite((self.test,))
537 log = []
538 result = LoggingTestResult(log)
539 suite.run(result)
540 # If we trigger a skip condition, teardown is not invoked at all
Douglas Viroel7155fdf2019-10-01 13:34:52 -0300541 self.assertEqual((self.SETUP_FIXTURES[:2] +
542 [self.TEARDOWN_FIXTURES[0]]),
Andrea Frittoli (andreaf)08e42d42017-09-07 17:09:13 +0100543 self.test.fixtures_invoked)
544
545 def test_skip_credentials_fails(self):
546 expected_exc = 'sc exploded'
547 self.mocks['setup_credentials'].side_effect = Exception(expected_exc)
548 suite = unittest.TestSuite((self.test,))
549 log = []
550 result = LoggingTestResult(log)
551 suite.run(result)
552 # If setup_credentials explodes, we invoked teardown class and
553 # clear credentials, and re-raise
554 self.assertEqual((self.SETUP_FIXTURES[:3] +
555 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
556 self.test.fixtures_invoked)
557 found_exc = log[0][1][1]
558 self.assertIn(expected_exc, str(found_exc))
559
560 def test_skip_credentials_fails_clear_fails(self):
561 # If cleanup fails on failure, we log the exception and do not
562 # re-raise it. Note that since the exception happens outside of
563 # the Tempest test setUp, logging is not captured on the Tempest
564 # test side, it will be captured by the unit test instead.
565 expected_exc = 'sc exploded'
566 clear_exc = 'clear exploded'
567 self.mocks['setup_credentials'].side_effect = Exception(expected_exc)
568 self.mocks['clear_credentials'].side_effect = Exception(clear_exc)
569 suite = unittest.TestSuite((self.test,))
570 log = []
571 result = LoggingTestResult(log)
572 suite.run(result)
573 # If setup_credentials explodes, we invoked teardown class and
574 # clear credentials, and re-raise
575 self.assertEqual((self.SETUP_FIXTURES[:3] +
576 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
577 self.test.fixtures_invoked)
578 found_exc = log[0][1][1]
579 self.assertIn(expected_exc, str(found_exc))
580 # Since log capture depends on OS_LOG_CAPTURE, we can only assert if
581 # logging was captured
582 if os.environ.get('OS_LOG_CAPTURE'):
583 self.assertIn(clear_exc, self.log_fixture.logger.output)
584
585 def test_skip_credentials_clients_resources_credentials_clear_fails(self):
586 # If cleanup fails with no previous failure, we re-raise the exception.
587 expected_exc = 'clear exploded'
588 self.mocks['clear_credentials'].side_effect = Exception(expected_exc)
589 suite = unittest.TestSuite((self.test,))
590 log = []
591 result = LoggingTestResult(log)
592 suite.run(result)
593 # If setup_credentials explodes, we invoked teardown class and
594 # clear credentials, and re-raise
595 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
596 self.test.fixtures_invoked)
597 found_exc = log[0][1][1]
598 self.assertIn(expected_exc, str(found_exc))
599
600 def test_skip_credentials_clients_fails(self):
601 expected_exc = 'clients exploded'
602 self.mocks['setup_clients'].side_effect = Exception(expected_exc)
603 suite = unittest.TestSuite((self.test,))
604 log = []
605 result = LoggingTestResult(log)
606 suite.run(result)
607 # If setup_clients explodes, we invoked teardown class and
608 # clear credentials, and re-raise
609 self.assertEqual((self.SETUP_FIXTURES[:4] +
610 [self.TEARDOWN_FIXTURES[i] for i in (0, 2)]),
611 self.test.fixtures_invoked)
612 found_exc = log[0][1][1]
613 self.assertIn(expected_exc, str(found_exc))
614
615 def test_skip_credentials_clients_resources_fails(self):
616 expected_exc = 'resource setup exploded'
617 self.mocks['resource_setup'].side_effect = Exception(expected_exc)
618 suite = unittest.TestSuite((self.test,))
619 log = []
620 result = LoggingTestResult(log)
621 suite.run(result)
622 # If resource_setup explodes, we invoked teardown class and
623 # clear credentials and resource cleanup, and re-raise
624 self.assertEqual(self.SETUP_FIXTURES + self.TEARDOWN_FIXTURES,
625 self.test.fixtures_invoked)
626 found_exc = log[0][1][1]
627 self.assertIn(expected_exc, str(found_exc))