Skip to content

Commit e880f37

Browse files
authored
Merge pull request #468 from splitio/push-manager-pr
Push manager pr
2 parents 980033a + 18fb7bb commit e880f37

File tree

4 files changed

+47
-27
lines changed

4 files changed

+47
-27
lines changed

splitio/models/token.py

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,6 @@ def iat(self):
5858
return self._iat
5959

6060

61-
def decode_token(raw_token):
62-
"""Decode token"""
63-
if not 'pushEnabled' in raw_token or not 'token' in raw_token:
64-
return None, None, None
65-
66-
token = raw_token['token']
67-
push_enabled = raw_token['pushEnabled']
68-
if not push_enabled or len(token.strip()) == 0:
69-
return None, None, None
70-
71-
token_parts = token.split('.')
72-
if len(token_parts) < 2:
73-
return None, None, None
74-
75-
to_decode = token_parts[1]
76-
decoded_payload = base64.b64decode(to_decode + '='*(-len(to_decode) % 4))
77-
return push_enabled, token, json.loads(decoded_payload)
78-
79-
8061
def from_raw(raw_token):
8162
"""
8263
Parse a new token from a raw token response.
@@ -87,5 +68,15 @@ def from_raw(raw_token):
8768
:return: New token model object
8869
:rtype: splitio.models.token.Token
8970
"""
90-
push_enabled, token, decoded_token = decode_token(raw_token)
91-
return None if push_enabled is None else Token(push_enabled, token, json.loads(decoded_token['x-ably-capability']), decoded_token['exp'], decoded_token['iat'])
71+
if not 'pushEnabled' in raw_token or not 'token' in raw_token:
72+
return Token(False, None, None, None, None)
73+
token = raw_token['token']
74+
push_enabled = raw_token['pushEnabled']
75+
token_parts = token.strip().split('.')
76+
77+
if not push_enabled or len(token_parts) < 2:
78+
return Token(False, None, None, None, None)
79+
80+
to_decode = token_parts[1]
81+
decoded_token = json.loads(base64.b64decode(to_decode + '='*(-len(to_decode) % 4)))
82+
return Token(push_enabled, token, json.loads(decoded_token['x-ably-capability']), decoded_token['exp'], decoded_token['iat'])

splitio/tasks/util/asynctask.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def _execution_wrapper(self):
9494
_LOGGER.debug("Force execution signal received. Running now")
9595
if not _safe_run(self._main):
9696
_LOGGER.error("An error occurred when executing the task. "
97-
"Retrying after perio expires")
97+
"Retrying after period expires")
9898
continue
9999
except queue.Empty:
100100
# If no message was received, the timeout has expired
@@ -104,7 +104,7 @@ def _execution_wrapper(self):
104104
if not _safe_run(self._main):
105105
_LOGGER.error(
106106
"An error occurred when executing the task. "
107-
"Retrying after perio expires"
107+
"Retrying after period expires"
108108
)
109109
finally:
110110
self._cleanup()

tests/models/test_token.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ class TokenTests(object):
1111
def test_from_raw_false(self):
1212
"""Test token model parsing."""
1313
parsed = token.from_raw(self.raw_false)
14-
assert parsed == None
15-
14+
assert parsed.push_enabled == False
15+
assert parsed.iat == None
16+
assert parsed.channels == None
17+
assert parsed.exp == None
18+
assert parsed.token == None
19+
1620
raw_empty = {
1721
'pushEnabled': True,
1822
'token': '',
@@ -21,7 +25,11 @@ def test_from_raw_false(self):
2125
def test_from_raw_empty(self):
2226
"""Test token model parsing."""
2327
parsed = token.from_raw(self.raw_empty)
24-
assert parsed == None
28+
assert parsed.push_enabled == False
29+
assert parsed.iat == None
30+
assert parsed.channels == None
31+
assert parsed.exp == None
32+
assert parsed.token == None
2533

2634
raw_ok = {
2735
'pushEnabled': True,
@@ -39,4 +47,3 @@ def test_from_raw(self):
3947
assert parsed.channels['NzM2MDI5Mzc0_MTgyNTg1MTgwNg==_splits'] == ['subscribe']
4048
assert parsed.channels['control_pri'] == ['subscribe', 'channel-metadata:publishers']
4149
assert parsed.channels['control_sec'] == ['subscribe', 'channel-metadata:publishers']
42-

tests/push/test_manager.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,28 @@ def new_start(*args, **kwargs): # pylint: disable=unused-argument
9090
assert feedback_loop.get() == Status.PUSH_RETRYABLE_ERROR
9191
assert timer_mock.mock_calls == [mocker.call(0, Any())]
9292

93+
def test_empty_auth_respnse(self, mocker):
94+
"""Test the initial status is ok and reset() works as expected."""
95+
api_mock = mocker.Mock()
96+
api_mock.authenticate.return_value = Token(False, None, None, None, None)
97+
98+
sse_mock = mocker.Mock(spec=SplitSSEClient)
99+
sse_constructor_mock = mocker.Mock()
100+
sse_constructor_mock.return_value = sse_mock
101+
timer_mock = mocker.Mock()
102+
mocker.patch('splitio.push.manager.Timer', new=timer_mock)
103+
mocker.patch('splitio.push.manager.SplitSSEClient', new=sse_constructor_mock)
104+
feedback_loop = Queue()
105+
telemetry_storage = InMemoryTelemetryStorage()
106+
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
107+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
108+
manager = PushManager(api_mock, mocker.Mock(), feedback_loop, mocker.Mock(), telemetry_runtime_producer)
109+
manager.start()
110+
assert feedback_loop.get() == Status.PUSH_NONRETRYABLE_ERROR
111+
assert timer_mock.mock_calls == [mocker.call(0, Any())]
112+
assert sse_mock.mock_calls == []
113+
114+
93115
def test_push_disabled(self, mocker):
94116
"""Test the initial status is ok and reset() works as expected."""
95117
api_mock = mocker.Mock()

0 commit comments

Comments
 (0)