Skip to content

Commit 533740b

Browse files
authored
Merge pull request #567 from splitio/rbs-oldspec-restore-since
updated split api
2 parents 066b78f + ca2e3cb commit 533740b

File tree

2 files changed

+88
-4
lines changed

2 files changed

+88
-4
lines changed

splitio/api/splits.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,20 @@ def __init__(self, client, sdk_key, sdk_metadata, telemetry_runtime_producer):
3737
self._spec_version = SPEC_VERSION
3838
self._last_proxy_check_timestamp = 0
3939
self.clear_storage = False
40+
self._old_spec_since = None
4041

41-
def _check_last_proxy_check_timestamp(self):
42+
def _check_last_proxy_check_timestamp(self, since):
4243
if self._spec_version == _SPEC_1_1 and ((utctime_ms() - self._last_proxy_check_timestamp) >= _PROXY_CHECK_INTERVAL_MILLISECONDS_SS):
4344
_LOGGER.info("Switching to new Feature flag spec (%s) and fetching.", SPEC_VERSION);
4445
self._spec_version = SPEC_VERSION
46+
self._old_spec_since = since
47+
48+
def _check_old_spec_since(self, change_number):
49+
if self._spec_version == _SPEC_1_1 and self._old_spec_since is not None:
50+
since = self._old_spec_since
51+
self._old_spec_since = None
52+
return since
53+
return change_number
4554

4655

4756
class SplitsAPI(SplitsAPIBase): # pylint: disable=too-few-public-methods
@@ -77,7 +86,9 @@ def fetch_splits(self, change_number, rbs_change_number, fetch_options):
7786
:rtype: dict
7887
"""
7988
try:
80-
self._check_last_proxy_check_timestamp()
89+
self._check_last_proxy_check_timestamp(change_number)
90+
change_number = self._check_old_spec_since(change_number)
91+
8192
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata, rbs_change_number)
8293
response = self._client.get(
8394
'sdk',
@@ -145,7 +156,9 @@ async def fetch_splits(self, change_number, rbs_change_number, fetch_options):
145156
:rtype: dict
146157
"""
147158
try:
148-
self._check_last_proxy_check_timestamp()
159+
self._check_last_proxy_check_timestamp(change_number)
160+
change_number = self._check_old_spec_since(change_number)
161+
149162
query, extra_headers = build_fetch(change_number, fetch_options, self._metadata, rbs_change_number)
150163
response = await self._client.get(
151164
'sdk',

tests/api/test_splits_api.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,41 @@ def get(sdk, splitChanges, sdk_key, extra_headers, query):
122122
assert self.query[2] == {'s': '1.3', 'since': 123, 'rbSince': -1}
123123
assert response == {"ff": {"d": [], "s": 123, "t": 456}, "rbs": {"d": [], "s": 123, "t": -1}}
124124
assert split_api.clear_storage
125+
126+
def test_using_old_spec_since(self, mocker):
127+
"""Test using old_spec_since variable."""
128+
httpclient = mocker.Mock(spec=client.HttpClient)
129+
self.counter = 0
130+
self.query = []
131+
def get(sdk, splitChanges, sdk_key, extra_headers, query):
132+
self.counter += 1
133+
self.query.append(query)
134+
if self.counter == 1:
135+
return client.HttpResponse(400, 'error', {})
136+
if self.counter == 2:
137+
return client.HttpResponse(200, '{"splits": [], "since": 123, "till": 456}', {})
138+
if self.counter == 3:
139+
return client.HttpResponse(400, 'error', {})
140+
if self.counter == 4:
141+
return client.HttpResponse(200, '{"splits": [], "since": 456, "till": 456}', {})
142+
143+
httpclient.is_sdk_endpoint_overridden.return_value = True
144+
httpclient.get = get
145+
split_api = splits.SplitsAPI(httpclient, 'some_api_key', SdkMetadata('1.0', 'some', '1.2.3.4'), mocker.Mock())
146+
response = split_api.fetch_splits(123, -1, FetchOptions(False, None, None, None))
147+
assert response == {"ff": {"d": [], "s": 123, "t": 456}, "rbs": {"d": [], "s": -1, "t": -1}}
148+
assert self.query == [{'s': '1.3', 'since': 123, 'rbSince': -1}, {'s': '1.1', 'since': 123}]
149+
assert not split_api.clear_storage
150+
151+
time.sleep(1)
152+
splits._PROXY_CHECK_INTERVAL_MILLISECONDS_SS = 10
153+
154+
response = split_api.fetch_splits(456, -1, FetchOptions(False, None, None, None))
155+
time.sleep(1)
156+
splits._PROXY_CHECK_INTERVAL_MILLISECONDS_SS = 1000000
157+
assert self.query[2] == {'s': '1.3', 'since': 456, 'rbSince': -1}
158+
assert self.query[3] == {'s': '1.1', 'since': 456}
159+
assert response == {"ff": {"d": [], "s": 456, "t": 456}, "rbs": {"d": [], "s": -1, "t": -1}}
125160

126161
class SplitAPIAsyncTests(object):
127162
"""Split async API test cases."""
@@ -253,9 +288,45 @@ async def get(sdk, splitChanges, sdk_key, extra_headers, query):
253288
assert self.query == [{'s': '1.3', 'since': 123, 'rbSince': -1}, {'s': '1.1', 'since': 123}]
254289
assert not split_api.clear_storage
255290

256-
time.sleep(1)
291+
time.sleep(1)
257292
splits._PROXY_CHECK_INTERVAL_MILLISECONDS_SS = 10
258293
response = await split_api.fetch_splits(123, -1, FetchOptions(False, None, None, None))
259294
assert self.query[2] == {'s': '1.3', 'since': 123, 'rbSince': -1}
260295
assert response == {"ff": {"d": [], "s": 123, "t": 456}, "rbs": {"d": [], "s": 123, "t": -1}}
261296
assert split_api.clear_storage
297+
298+
@pytest.mark.asyncio
299+
async def test_using_old_spec_since(self, mocker):
300+
"""Test using old_spec_since variable."""
301+
httpclient = mocker.Mock(spec=client.HttpClient)
302+
self.counter = 0
303+
self.query = []
304+
async def get(sdk, splitChanges, sdk_key, extra_headers, query):
305+
self.counter += 1
306+
self.query.append(query)
307+
if self.counter == 1:
308+
return client.HttpResponse(400, 'error', {})
309+
if self.counter == 2:
310+
return client.HttpResponse(200, '{"splits": [], "since": 123, "till": 456}', {})
311+
if self.counter == 3:
312+
return client.HttpResponse(400, 'error', {})
313+
if self.counter == 4:
314+
return client.HttpResponse(200, '{"splits": [], "since": 456, "till": 456}', {})
315+
316+
httpclient.is_sdk_endpoint_overridden.return_value = True
317+
httpclient.get = get
318+
split_api = splits.SplitsAPIAsync(httpclient, 'some_api_key', SdkMetadata('1.0', 'some', '1.2.3.4'), mocker.Mock())
319+
response = await split_api.fetch_splits(123, -1, FetchOptions(False, None, None, None))
320+
assert response == {"ff": {"d": [], "s": 123, "t": 456}, "rbs": {"d": [], "s": -1, "t": -1}}
321+
assert self.query == [{'s': '1.3', 'since': 123, 'rbSince': -1}, {'s': '1.1', 'since': 123}]
322+
assert not split_api.clear_storage
323+
324+
time.sleep(1)
325+
splits._PROXY_CHECK_INTERVAL_MILLISECONDS_SS = 10
326+
327+
response = await split_api.fetch_splits(456, -1, FetchOptions(False, None, None, None))
328+
time.sleep(1)
329+
splits._PROXY_CHECK_INTERVAL_MILLISECONDS_SS = 1000000
330+
assert self.query[2] == {'s': '1.3', 'since': 456, 'rbSince': -1}
331+
assert self.query[3] == {'s': '1.1', 'since': 456}
332+
assert response == {"ff": {"d": [], "s": 456, "t": 456}, "rbs": {"d": [], "s": -1, "t": -1}}

0 commit comments

Comments
 (0)