15397: Merge branch 'main'
[arvados.git] / sdk / python / tests / test_retry_job_helpers.py
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 import hashlib
6 import json
7 import os
8 import unittest
9
10 from apiclient import http as apiclient_http
11 from unittest import mock
12
13 import arvados
14 from . import run_test_server
15 from . import arvados_testutil as tutil
16
17 @tutil.skip_sleep
18 class ApiClientRetryTestMixin(object):
19
20     TEST_UUID = 'zzzzz-zzzzz-zzzzzzzzzzzzzzz'
21     TEST_LOCATOR = 'd41d8cd98f00b204e9800998ecf8427e+0'
22
23     @classmethod
24     def setUpClass(cls):
25         run_test_server.run()
26
27     def setUp(self):
28         # Patch arvados.api() to return our mock API, so we can mock
29         # its http requests.
30         self.api_client = arvados.api('v1', cache=False, num_retries=0)
31         self.api_patch = mock.patch('arvados.api', return_value=self.api_client)
32         self.api_patch.start()
33
34     def tearDown(self):
35         self.api_patch.stop()
36
37     def run_method(self):
38         raise NotImplementedError("test subclasses must define run_method")
39
40     def test_immediate_success(self):
41         with tutil.mock_api_responses(self.api_client, '{}', [200]):
42             self.run_method()
43
44     def test_immediate_failure(self):
45         with tutil.mock_api_responses(self.api_client, '{}', [400]), self.assertRaises(self.DEFAULT_EXCEPTION):
46             self.run_method()
47
48     def test_retry_then_success(self):
49         with tutil.mock_api_responses(self.api_client, '{}', [500, 200]):
50             self.run_method()
51
52     def test_error_after_default_retries_exhausted(self):
53         with tutil.mock_api_responses(self.api_client, '{}', [500, 500, 500, 500, 500, 500, 200]), self.assertRaises(self.DEFAULT_EXCEPTION):
54             self.run_method()
55
56     def test_no_retry_after_immediate_success(self):
57         with tutil.mock_api_responses(self.api_client, '{}', [200, 400]):
58             self.run_method()