Skip to content

Commit 7df86ef

Browse files
committed
polishing
1 parent 6611a43 commit 7df86ef

File tree

2 files changed

+60
-13
lines changed

2 files changed

+60
-13
lines changed

splitio/sync/split.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def __init__(self, feature_flag_api, feature_flag_storage, rule_based_segment_st
4242
4343
:param feature_flag_storage: Feature Flag Storage.
4444
:type feature_flag_storage: splitio.storage.InMemorySplitStorage
45+
46+
:param rule_based_segment_storage: Rule based segment Storage.
47+
:type rule_based_segment_storage: splitio.storage.InMemoryRuleBasedStorage
4548
"""
4649
self._api = feature_flag_api
4750
self._feature_flag_storage = feature_flag_storage
@@ -83,6 +86,9 @@ def __init__(self, feature_flag_api, feature_flag_storage, rule_based_segment_st
8386
8487
:param feature_flag_storage: Feature Flag Storage.
8588
:type feature_flag_storage: splitio.storage.InMemorySplitStorage
89+
90+
:param rule_based_segment_storage: Rule based segment Storage.
91+
:type rule_based_segment_storage: splitio.storage.InMemoryRuleBasedStorage
8692
"""
8793
SplitSynchronizerBase.__init__(self, feature_flag_api, feature_flag_storage, rule_based_segment_storage)
8894

@@ -96,6 +102,9 @@ def _fetch_until(self, fetch_options, till=None, rbs_till=None):
96102
:param till: Passed till from Streaming.
97103
:type till: int
98104
105+
:param rbs_till: Passed rbs till from Streaming.
106+
:type rbs_till: int
107+
99108
:return: last change number
100109
:rtype: int
101110
"""
@@ -145,6 +154,9 @@ def _attempt_feature_flag_sync(self, fetch_options, till=None, rbs_till=None):
145154
:param till: Passed till from Streaming.
146155
:type till: int
147156
157+
:param rbs_till: Passed rbs till from Streaming.
158+
:type rbs_till: int
159+
148160
:return: Flags to check if it should perform bypass or operation ended
149161
:rtype: bool, int, int
150162
"""
@@ -182,6 +194,9 @@ def synchronize_splits(self, till=None, rbs_till=None):
182194
183195
:param till: Passed till from Streaming.
184196
:type till: int
197+
198+
:param rbs_till: Passed rbs till from Streaming.
199+
:type rbs_till: int
185200
"""
186201
final_segment_list = set()
187202
fetch_options = FetchOptions(True, sets=self._get_config_sets()) # Set Cache-Control to no-cache
@@ -230,6 +245,9 @@ def __init__(self, feature_flag_api, feature_flag_storage, rule_based_segment_st
230245
231246
:param feature_flag_storage: Feature Flag Storage.
232247
:type feature_flag_storage: splitio.storage.InMemorySplitStorage
248+
249+
:param rule_based_segment_storage: Rule based segment Storage.
250+
:type rule_based_segment_storage: splitio.storage.InMemoryRuleBasedStorage
233251
"""
234252
SplitSynchronizerBase.__init__(self, feature_flag_api, feature_flag_storage, rule_based_segment_storage)
235253

@@ -243,6 +261,9 @@ async def _fetch_until(self, fetch_options, till=None, rbs_till=None):
243261
:param till: Passed till from Streaming.
244262
:type till: int
245263
264+
:param rbs_till: Passed rbs till from Streaming.
265+
:type rbs_till: int
266+
246267
:return: last change number
247268
:rtype: int
248269
"""
@@ -256,7 +277,7 @@ async def _fetch_until(self, fetch_options, till=None, rbs_till=None):
256277
if rbs_change_number is None:
257278
rbs_change_number = -1
258279

259-
if (till is not None and till < change_number) or (rbs_till is not None and till < rbs_change_number):
280+
if (till is not None and till < change_number) or (rbs_till is not None and rbs_till < rbs_change_number):
260281
# the passed till is less than change_number, no need to perform updates
261282
return change_number, rbs_change_number, segment_list
262283

@@ -292,6 +313,9 @@ async def _attempt_feature_flag_sync(self, fetch_options, till=None, rbs_till=No
292313
:param till: Passed till from Streaming.
293314
:type till: int
294315
316+
:param rbs_till: Passed rbs till from Streaming.
317+
:type rbs_till: int
318+
295319
:return: Flags to check if it should perform bypass or operation ended
296320
:rtype: bool, int, int
297321
"""
@@ -317,6 +341,9 @@ async def synchronize_splits(self, till=None, rbs_till=None):
317341
318342
:param till: Passed till from Streaming.
319343
:type till: int
344+
345+
:param rbs_till: Passed rbs till from Streaming.
346+
:type rbs_till: int
320347
"""
321348
final_segment_list = set()
322349
fetch_options = FetchOptions(True, sets=self._get_config_sets()) # Set Cache-Control to no-cache

tests/sync/test_splits_synchronizer.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@ def rbs_change_number_mock():
337337
rbs_1 = copy.deepcopy(json_body['rbs']['d'])
338338
def get_changes(*args, **kwargs):
339339
get_changes.called += 1
340-
# pytest.set_trace()
341340
if get_changes.called == 1:
342341
return { 'ff': { 'd': self.splits, 's': -1, 't': 123 },
343342
'rbs': {"t": 555, "s": -1, "d": rbs_1}}
@@ -392,6 +391,8 @@ def intersect(sets):
392391
inserted_split = storage.update.mock_calls[0][1][0][0]
393392
assert isinstance(inserted_split, Split)
394393
assert inserted_split.name == 'some_name'
394+
inserted_rbs = rbs_storage.update.mock_calls[0][1][0][0]
395+
assert inserted_rbs.excluded.get_excluded_keys() == ["mauro@split.io","gaston@split.io"]
395396

396397
split_synchronizer._backoff = Backoff(1, 0.1)
397398
split_synchronizer.synchronize_splits(None, 666)
@@ -664,7 +665,11 @@ async def rbs_change_number_mock():
664665
rbs_change_number_mock._calls += 1
665666
if rbs_change_number_mock._calls == 1:
666667
return -1
667-
return 12345 # Return proper cn for CDN Bypass
668+
elif change_number_mock._calls >= 2 and change_number_mock._calls <= 3:
669+
return 555
670+
elif change_number_mock._calls <= 9:
671+
return 555
672+
return 666 # Return proper cn for CDN Bypass
668673

669674
change_number_mock._calls = 0
670675
rbs_change_number_mock._calls = 0
@@ -677,8 +682,10 @@ async def update(parsed_split, deleted, change_number):
677682
self.parsed_split = parsed_split
678683
storage.update = update
679684

685+
self.parsed_rbs = None
680686
async def rbs_update(parsed, deleted, change_number):
681-
pass
687+
if len(parsed) > 0:
688+
self.parsed_rbs = parsed
682689
rbs_storage.update = rbs_update
683690

684691
api = mocker.Mock()
@@ -688,32 +695,38 @@ async def rbs_update(parsed, deleted, change_number):
688695
self.fetch_options_2 = None
689696
self.change_number_3 = None
690697
self.fetch_options_3 = None
698+
rbs_1 = copy.deepcopy(json_body['rbs']['d'])
699+
691700
async def get_changes(change_number, rbs_change_number, fetch_options):
692701
get_changes.called += 1
693702
if get_changes.called == 1:
694703
self.change_number_1 = change_number
695704
self.fetch_options_1 = fetch_options
696705
return { 'ff': { 'd': self.splits, 's': -1, 't': 123 },
697-
'rbs': {"t": 123, "s": -1, "d": []}}
706+
'rbs': {"t": 555, "s": -1, "d": rbs_1}}
698707
elif get_changes.called == 2:
699708
self.change_number_2 = change_number
700709
self.fetch_options_2 = fetch_options
701710
return { 'ff': { 'd': [], 's': 123, 't': 123 },
702-
'rbs': {"t": 123, "s": 123, "d": []}}
711+
'rbs': {"t": 555, "s": 555, "d": []}}
703712
elif get_changes.called == 3:
704713
return { 'ff': { 'd': [], 's': 123, 't': 1234 },
705-
'rbs': {"t": 123, "s": 123, "d": []}}
714+
'rbs': {"t": 555, "s": 555, "d": []}}
706715
elif get_changes.called >= 4 and get_changes.called <= 6:
707716
return { 'ff': { 'd': [], 's': 1234, 't': 1234 },
708-
'rbs': {"t": 123, "s": 123, "d": []}}
717+
'rbs': {"t": 555, "s": 555, "d": []}}
709718
elif get_changes.called == 7:
710719
return { 'ff': { 'd': [], 's': 1234, 't': 12345 },
711-
'rbs': {"t": 123, "s": 123, "d": []}}
712-
self.change_number_3 = change_number
713-
self.fetch_options_3 = fetch_options
720+
'rbs': {"t": 555, "s": 555, "d": []}}
721+
elif get_changes.called == 8:
722+
self.change_number_3 = change_number
723+
self.fetch_options_3 = fetch_options
724+
return { 'ff': { 'd': [], 's': 12345, 't': 12345 },
725+
'rbs': {"t": 555, "s": 555, "d": []}}
726+
rbs_1[0]['excluded']['keys'] = ['bilal@split.io']
714727
return { 'ff': { 'd': [], 's': 12345, 't': 12345 },
715-
'rbs': {"t": 123, "s": 123, "d": []}}
716-
728+
'rbs': {"t": 666, "s": 666, "d": rbs_1}}
729+
717730
get_changes.called = 0
718731
api.fetch_splits = get_changes
719732

@@ -743,7 +756,14 @@ def intersect(sets):
743756
inserted_split = self.parsed_split[0]
744757
assert isinstance(inserted_split, Split)
745758
assert inserted_split.name == 'some_name'
759+
inserted_rbs = self.parsed_rbs[0]
760+
assert inserted_rbs.excluded.get_excluded_keys() == ["mauro@split.io","gaston@split.io"]
746761

762+
split_synchronizer._backoff = Backoff(1, 0.1)
763+
await split_synchronizer.synchronize_splits(None, 666)
764+
inserted_rbs = self.parsed_rbs[0]
765+
assert inserted_rbs.excluded.get_excluded_keys() == ['bilal@split.io']
766+
747767
@pytest.mark.asyncio
748768
async def test_sync_flag_sets_with_config_sets(self, mocker):
749769
"""Test split sync with flag sets."""

0 commit comments

Comments
 (0)