#!/usr/bin/env python import traceback import unittest import arvados.errors as arv_error import arvados_testutil as tutil class KeepRequestErrorTestCase(unittest.TestCase): SERVICE_ERRORS = [ ('http://keep1.zzzzz.example.org/', IOError("test IOError")), ('http://keep3.zzzzz.example.org/', MemoryError("test MemoryError")), ('http://keep5.zzzzz.example.org/', tutil.fake_requests_response( 500, "test 500")), ('http://keep7.zzzzz.example.org/', IOError("second test IOError")), ] def check_get_message(self, *args): test_exc = arv_error.KeepRequestError("test message", *args) self.assertEqual("test message", test_exc.message) def test_get_message_with_service_errors(self): self.check_get_message(self.SERVICE_ERRORS[:]) def test_get_message_without_service_errors(self): self.check_get_message() def check_get_service_errors(self, *args): expected = dict(args[0]) if args else {} test_exc = arv_error.KeepRequestError("test service exceptions", *args) self.assertEqual(expected, test_exc.service_errors()) def test_get_service_errors(self): self.check_get_service_errors(self.SERVICE_ERRORS[:]) def test_get_service_errors_none(self): self.check_get_service_errors({}) def test_empty_exception(self): test_exc = arv_error.KeepRequestError() self.assertFalse(test_exc.message) self.assertEqual({}, test_exc.service_errors()) def traceback_str(self, exc): return traceback.format_exception_only(type(exc), exc)[-1] def test_traceback_str_without_service_errors(self): message = "test plain traceback string" test_exc = arv_error.KeepRequestError(message) exc_report = self.traceback_str(test_exc) self.assertTrue(exc_report.startswith("KeepRequestError: ")) self.assertIn(message, exc_report) def test_traceback_str_with_service_errors(self): message = "test traceback shows Keep services" test_exc = arv_error.KeepRequestError(message, self.SERVICE_ERRORS[:]) exc_report = self.traceback_str(test_exc) self.assertTrue(exc_report.startswith("KeepRequestError: ")) for expect_substr in [message, "raised IOError", "raised MemoryError", "test MemoryError", "second test IOError", "responded with 500 Internal Server Error"]: self.assertIn(expect_substr, exc_report) # Assert the report maintains order of listed services. last_index = -1 for service_key, _ in self.SERVICE_ERRORS: service_index = exc_report.find(service_key) self.assertGreater(service_index, last_index) last_index = service_index