Skip to content

Commit 8bf2030

Browse files
committed
Added e2e tests
1 parent 97e636b commit 8bf2030

File tree

6 files changed

+65
-31
lines changed

6 files changed

+65
-31
lines changed

splitio/push/parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ def default_treatment(self):
419419
def __str__(self):
420420
"""Return string representation."""
421421
return "SplitKill - changeNumber=%d, name=%s, defaultTreatment=%s" % \
422-
(self.change_number, self.feature_flag, self.default_treatment)
422+
(self.change_number, self.feature_flag_name, self.default_treatment)
423423

424424

425425
class SegmentChangeUpdate(BaseUpdate):

splitio/push/splitworker.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from enum import Enum
99

1010
from splitio.models.splits import from_raw
11+
from splitio.push.parser import UpdateType
1112

1213
_LOGGER = logging.getLogger(__name__)
1314

@@ -63,16 +64,17 @@ def _run(self):
6364
continue
6465
_LOGGER.debug('Processing feature flag update %d', event.change_number)
6566
try:
66-
if event.compression is not None and event.previous_change_number == self._feature_flag_storage.get_change_number():
67-
try:
68-
self._feature_flag_storage.put(from_raw(json.loads(self._get_feature_flag_definition(event))))
69-
self._feature_flag_storage.set_change_number(event.change_number)
70-
continue
71-
except Exception as e:
72-
_LOGGER.error('Exception raised in updating feature flag')
73-
_LOGGER.debug(str(e))
74-
_LOGGER.debug('Exception information: ', exc_info=True)
75-
pass
67+
if event.update_type == UpdateType.SPLIT_UPDATE:
68+
if event.compression is not None and event.previous_change_number == self._feature_flag_storage.get_change_number():
69+
try:
70+
self._feature_flag_storage.put(from_raw(json.loads(self._get_feature_flag_definition(event))))
71+
self._feature_flag_storage.set_change_number(event.change_number)
72+
continue
73+
except Exception as e:
74+
_LOGGER.error('Exception raised in updating feature flag')
75+
_LOGGER.debug(str(e))
76+
_LOGGER.debug('Exception information: ', exc_info=True)
77+
pass
7678
self._handler(event.change_number)
7779
except Exception as e: # pylint: disable=broad-except
7880
_LOGGER.error('Exception raised in feature flag synchronization')

tests/client/test_localhost.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def test_make_whitelist_condition(self):
7272
def test_parse_legacy_file(self):
7373
"""Test that aprsing a legacy file works."""
7474
filename = os.path.join(os.path.dirname(__file__), 'files', 'file1.split')
75-
splits = LocalSplitSynchronizer._read_splits_from_legacy_file(filename)
75+
splits = LocalSplitSynchronizer._read_feature_flags_from_legacy_file(filename)
7676
assert len(splits) == 2
7777
for split in splits.values():
7878
assert isinstance(split, Split)
@@ -84,7 +84,7 @@ def test_parse_legacy_file(self):
8484
def test_parse_yaml_file(self):
8585
"""Test that parsing a yaml file works."""
8686
filename = os.path.join(os.path.dirname(__file__), 'files', 'file2.yaml')
87-
splits = LocalSplitSynchronizer._read_splits_from_yaml_file(filename)
87+
splits = LocalSplitSynchronizer._read_feature_flags_from_yaml_file(filename)
8888
assert len(splits) == 4
8989
for split in splits.values():
9090
assert isinstance(split, Split)
@@ -116,44 +116,44 @@ def test_update_splits(self, mocker):
116116
parse_legacy.reset_mock()
117117
parse_yaml.reset_mock()
118118
sync = LocalSplitSynchronizer('something', storage_mock)
119-
sync._read_splits_from_legacy_file = parse_legacy
120-
sync._read_splits_from_yaml_file = parse_yaml
119+
sync._read_feature_flags_from_legacy_file = parse_legacy
120+
sync._read_feature_flags_from_yaml_file = parse_yaml
121121
sync.synchronize_splits()
122122
assert parse_legacy.mock_calls == [mocker.call('something')]
123123
assert parse_yaml.mock_calls == []
124124

125125
parse_legacy.reset_mock()
126126
parse_yaml.reset_mock()
127127
sync = LocalSplitSynchronizer('something.yaml', storage_mock)
128-
sync._read_splits_from_legacy_file = parse_legacy
129-
sync._read_splits_from_yaml_file = parse_yaml
128+
sync._read_feature_flags_from_legacy_file = parse_legacy
129+
sync._read_feature_flags_from_yaml_file = parse_yaml
130130
sync.synchronize_splits()
131131
assert parse_legacy.mock_calls == []
132132
assert parse_yaml.mock_calls == [mocker.call('something.yaml')]
133133

134134
parse_legacy.reset_mock()
135135
parse_yaml.reset_mock()
136136
sync = LocalSplitSynchronizer('something.yml', storage_mock)
137-
sync._read_splits_from_legacy_file = parse_legacy
138-
sync._read_splits_from_yaml_file = parse_yaml
137+
sync._read_feature_flags_from_legacy_file = parse_legacy
138+
sync._read_feature_flags_from_yaml_file = parse_yaml
139139
sync.synchronize_splits()
140140
assert parse_legacy.mock_calls == []
141141
assert parse_yaml.mock_calls == [mocker.call('something.yml')]
142142

143143
parse_legacy.reset_mock()
144144
parse_yaml.reset_mock()
145145
sync = LocalSplitSynchronizer('something.YAML', storage_mock)
146-
sync._read_splits_from_legacy_file = parse_legacy
147-
sync._read_splits_from_yaml_file = parse_yaml
146+
sync._read_feature_flags_from_legacy_file = parse_legacy
147+
sync._read_feature_flags_from_yaml_file = parse_yaml
148148
sync.synchronize_splits()
149149
assert parse_legacy.mock_calls == []
150150
assert parse_yaml.mock_calls == [mocker.call('something.YAML')]
151151

152152
parse_legacy.reset_mock()
153153
parse_yaml.reset_mock()
154154
sync = LocalSplitSynchronizer('yaml', storage_mock)
155-
sync._read_splits_from_legacy_file = parse_legacy
156-
sync._read_splits_from_yaml_file = parse_yaml
155+
sync._read_feature_flags_from_legacy_file = parse_legacy
156+
sync._read_feature_flags_from_yaml_file = parse_yaml
157157
sync.synchronize_splits()
158158
assert parse_legacy.mock_calls == [mocker.call('yaml')]
159159
assert parse_yaml.mock_calls == []

tests/integration/test_client_e2e.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -965,7 +965,7 @@ def test_localhost_json_e2e(self):
965965

966966
# Tests 1
967967
self.factory._storages['splits'].remove('SPLIT_1')
968-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._split_storage.set_change_number(-1)
968+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._feature_flag_storage.set_change_number(-1)
969969
self._update_temp_file(splits_json['splitChange1_1'])
970970
self._synchronize_now()
971971

@@ -989,7 +989,7 @@ def test_localhost_json_e2e(self):
989989

990990
# Tests 3
991991
self.factory._storages['splits'].remove('SPLIT_1')
992-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._split_storage.set_change_number(-1)
992+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._feature_flag_storage.set_change_number(-1)
993993
self._update_temp_file(splits_json['splitChange3_1'])
994994
self._synchronize_now()
995995

@@ -1004,7 +1004,7 @@ def test_localhost_json_e2e(self):
10041004

10051005
# Tests 4
10061006
self.factory._storages['splits'].remove('SPLIT_2')
1007-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._split_storage.set_change_number(-1)
1007+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._feature_flag_storage.set_change_number(-1)
10081008
self._update_temp_file(splits_json['splitChange4_1'])
10091009
self._synchronize_now()
10101010

@@ -1029,7 +1029,7 @@ def test_localhost_json_e2e(self):
10291029
# Tests 5
10301030
self.factory._storages['splits'].remove('SPLIT_1')
10311031
self.factory._storages['splits'].remove('SPLIT_2')
1032-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._split_storage.set_change_number(-1)
1032+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._feature_flag_storage.set_change_number(-1)
10331033
self._update_temp_file(splits_json['splitChange5_1'])
10341034
self._synchronize_now()
10351035

@@ -1044,7 +1044,7 @@ def test_localhost_json_e2e(self):
10441044

10451045
# Tests 6
10461046
self.factory._storages['splits'].remove('SPLIT_2')
1047-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._split_storage.set_change_number(-1)
1047+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._feature_flag_storage.set_change_number(-1)
10481048
self._update_temp_file(splits_json['splitChange6_1'])
10491049
self._synchronize_now()
10501050

@@ -1073,8 +1073,8 @@ def _update_temp_file(self, json_body):
10731073

10741074
def _synchronize_now(self):
10751075
filename = os.path.join(os.path.dirname(__file__), 'files', 'split_changes_temp.json')
1076-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync._filename = filename
1077-
self.factory._sync_manager._synchronizer._split_synchronizers._split_sync.synchronize_splits()
1076+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync._filename = filename
1077+
self.factory._sync_manager._synchronizer._split_synchronizers._feature_flag_sync.synchronize_splits()
10781078

10791079
def test_incorrect_file_e2e(self):
10801080
"""Test initialize factory with a incorrect file name."""

tests/integration/test_streaming_e2e.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import threading
55
import time
66
import json
7+
import base64
8+
79
from queue import Queue
810
from splitio.client.factory import get_factory
911
from tests.helpers.mockserver import SSEMockServer, SplitMockServer
@@ -106,6 +108,10 @@ def test_happiness(self):
106108
assert factory.client().get_treatment('pindon', 'split2') == 'off'
107109
assert factory.client().get_treatment('maldo', 'split2') == 'on'
108110

111+
sse_server.publish(make_split_fast_change_event(4))
112+
time.sleep(1)
113+
assert factory.client().get_treatment('maldo', 'split1') == 'on'
114+
109115
# Validate the SSE request
110116
sse_request = sse_requests.get()
111117
assert sse_request.method == 'GET'
@@ -1233,6 +1239,32 @@ def make_split_change_event(change_number):
12331239
})
12341240
}
12351241

1242+
def make_split_fast_change_event(change_number):
1243+
"""Make a split change event."""
1244+
json1 = make_simple_split('split1', 1, True, False, 'off', 'user', True)
1245+
str1 = json.dumps(json1)
1246+
byt1 = bytes(str1, encoding='utf-8')
1247+
compressed = base64.b64encode(byt1)
1248+
final = compressed.decode('utf-8')
1249+
1250+
return {
1251+
'event': 'message',
1252+
'data': json.dumps({
1253+
'id':'TVUsxaabHs:0:0',
1254+
'clientId':'pri:MzM0ODI1MTkxMw==',
1255+
'timestamp': change_number-1,
1256+
'encoding':'json',
1257+
'channel':'MTYyMTcxOTQ4Mw==_MjA4MzczNDU1Mg==_splits',
1258+
'data': json.dumps({
1259+
'type': 'SPLIT_UPDATE',
1260+
'changeNumber': change_number,
1261+
'pcn': 3,
1262+
'c': 0,
1263+
'd': final
1264+
})
1265+
})
1266+
}
1267+
12361268
def make_split_kill_event(name, default_treatment, change_number):
12371269
"""Make a split change event."""
12381270
return {

tests/push/test_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def test_auth_apiexception(self, mocker):
137137
def test_split_change(self, mocker):
138138
"""Test update-type messages are properly forwarded to the processor."""
139139
sse_event = SSEEvent('1', EventType.MESSAGE, '', '{}')
140-
update_message = SplitChangeUpdate('chan', 123, 456)
140+
update_message = SplitChangeUpdate('chan', 123, 456, None, None, None)
141141
parse_event_mock = mocker.Mock(spec=parse_incoming_event)
142142
parse_event_mock.return_value = update_message
143143
mocker.patch('splitio.push.manager.parse_incoming_event', new=parse_event_mock)

0 commit comments

Comments
 (0)