def test_one_failure(self): a1 = Mock() a1.f = Mock(__name__='f', side_effect=IOError) a1.x = 100 a2 = Mock() a2.f = Mock(__name__='f', return_value=2) a2.x = 200 a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.x, 100) self.assertEqual(a.f(), 2) # a2 was the last alternative that worked, so now we get x from it self.assertEqual(a.x, 200) # this time we should skip calling a1.f() entirely self.assertEqual(a.f(), 2) self.assertEqual(a1.f.call_count, 1) self.assertEqual(a2.f.call_count, 2)
def test_wrapping(self): a1 = Mock() a1.f = Mock(__name__='f', side_effect=IOError) a2 = Mock() a2.f = Mock(__name__='f', return_value=2) a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.f('foo', bar='baz'), 2) a1.f.assert_called_once_with('foo', bar='baz') a2.f.assert_called_once_with('foo', bar='baz') self.assertEqual(a.f.__name__, 'f')
def test_can_wrap_around(self): a1 = Mock() a1.f = Mock(__name__='f', side_effect=[IOError, 1]) a2 = Mock() a2.f = Mock(__name__='f', side_effect=[2, IOError]) a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.f(), 2) self.assertEqual(a.f(), 1) self.assertEqual(a1.f.call_count, 2) self.assertEqual(a2.f.call_count, 2)
def test_success(self): a1 = Mock() # need __name__ so wraps() will work a1.f = Mock(__name__='f', return_value=1) a2 = Mock() a2.f = Mock(__name__='f', return_value=2) a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.f(), 1) self.assertEqual(a1.f.call_count, 1) # never needed to try a2.f() self.assertEqual(a2.f.call_count, 0)