-
Notifications
You must be signed in to change notification settings - Fork 152
Expand file tree
/
Copy pathtest_retry_policy.py
More file actions
131 lines (106 loc) · 4.7 KB
/
Copy pathtest_retry_policy.py
File metadata and controls
131 lines (106 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- coding: utf-8 -*-
"""
Copyright 2026 The Dapr Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import unittest
from datetime import timedelta
from dapr.ext.workflow import RetryPolicy
class RetryPolicyConstructionTests(unittest.TestCase):
def test_constructs_with_legacy_max_number_of_attempts(self):
policy = RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_number_of_attempts=5,
)
self.assertEqual(policy.first_retry_interval, timedelta(seconds=1))
self.assertEqual(policy.max_number_of_attempts, 5)
self.assertEqual(policy.max_attempts, 5)
self.assertEqual(policy.backoff_coefficient, 1.0)
self.assertIsNone(policy.max_retry_interval)
self.assertIsNone(policy.retry_timeout)
def test_constructs_with_new_max_attempts(self):
policy = RetryPolicy(
first_retry_interval=timedelta(seconds=2),
max_attempts=3,
backoff_coefficient=2.0,
max_retry_interval=timedelta(seconds=10),
retry_timeout=timedelta(minutes=5),
)
self.assertEqual(policy.first_retry_interval, timedelta(seconds=2))
self.assertEqual(policy.max_attempts, 3)
self.assertEqual(policy.max_number_of_attempts, 3)
self.assertEqual(policy.backoff_coefficient, 2.0)
self.assertEqual(policy.max_retry_interval, timedelta(seconds=10))
self.assertEqual(policy.retry_timeout, timedelta(minutes=5))
def test_exposes_underlying_durabletask_object(self):
policy = RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=2,
)
underlying = policy.obj
self.assertEqual(underlying._max_number_of_attempts, 2)
self.assertEqual(underlying._first_retry_interval, timedelta(seconds=1))
class RetryPolicyAttemptsResolutionTests(unittest.TestCase):
def test_rejects_when_both_attempts_fields_supplied(self):
with self.assertRaises(ValueError) as ctx:
RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=3,
max_number_of_attempts=3,
)
self.assertIn('only one of max_attempts', str(ctx.exception))
def test_rejects_when_neither_attempts_field_supplied(self):
with self.assertRaises(ValueError) as ctx:
RetryPolicy(first_retry_interval=timedelta(seconds=1))
self.assertIn('max_attempts is required', str(ctx.exception))
class RetryPolicyValidationTests(unittest.TestCase):
def test_rejects_negative_first_retry_interval(self):
with self.assertRaisesRegex(ValueError, 'first_retry_interval'):
RetryPolicy(
first_retry_interval=timedelta(seconds=-1),
max_attempts=2,
)
def test_rejects_max_attempts_below_one(self):
with self.assertRaisesRegex(ValueError, 'max_attempts'):
RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=0,
)
def test_rejects_backoff_coefficient_below_one(self):
with self.assertRaisesRegex(ValueError, 'backoff_coefficient'):
RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=2,
backoff_coefficient=0.5,
)
def test_rejects_negative_max_retry_interval(self):
with self.assertRaisesRegex(ValueError, 'max_retry_interval'):
RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=2,
max_retry_interval=timedelta(seconds=-1),
)
def test_rejects_negative_retry_timeout(self):
with self.assertRaisesRegex(ValueError, 'retry_timeout'):
RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=2,
retry_timeout=timedelta(seconds=-1),
)
def test_allows_backoff_coefficient_none(self):
policy = RetryPolicy(
first_retry_interval=timedelta(seconds=1),
max_attempts=2,
backoff_coefficient=None,
)
self.assertIsNone(policy.backoff_coefficient)
if __name__ == '__main__':
unittest.main()