Skip to content

Commit 44624dc

Browse files
Merge pull request #671 from splitio/FME-4184-FixParsing
[FME-4184] Splits Parsing Fix
2 parents 41c9451 + 2b23254 commit 44624dc

File tree

6 files changed

+168
-14
lines changed

6 files changed

+168
-14
lines changed

.github/workflows/test_all.yaml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
name: Build and Test iOS
22

33
on:
4-
workflow_run:
5-
workflows: ["Sonar Scan"]
6-
types:
7-
- completed
4+
pull_request:
85
branches:
9-
- master
10-
- development
11-
- "*_baseline"
6+
- master
7+
- development
8+
- "*_baseline"
129

1310
# Cancel in-progress runs when a new workflow with the same group is triggered
1411
concurrency:

Split/Models/SplitModel/Split.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class SplitDTO: NSObject, SplitBase, Codable {
2525
var impressionsDisabled: Bool?
2626
var prerequisites: [Prerequisite]?
2727

28+
// SDK loading optimization
2829
var json: String = ""
29-
3030
var isCompletelyParsed = true
3131

3232
init(name: String, trafficType: String, status: Status, sets: Set<String>?, json: String, killed: Bool = false, impressionsDisabled: Bool = false) {

Split/Storage/Splits/SplitsStorage.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ class DefaultSplitsStorage: SplitsStorage {
5757
}
5858

5959
func get(name: String) -> Split? {
60-
guard let split = inMemorySplits.value(forKey: name.lowercased()) else {
60+
let lowercasedName = name.lowercased()
61+
62+
guard let split = inMemorySplits.value(forKey: lowercasedName) else {
6163
return nil
6264
}
6365
if !split.isCompletelyParsed {
@@ -66,7 +68,8 @@ class DefaultSplitsStorage: SplitsStorage {
6668
parsed.conditions = [SplitHelper.createDefaultCondition()]
6769
}
6870

69-
inMemorySplits.setValue(parsed, forKey: name)
71+
parsed.isCompletelyParsed = true
72+
inMemorySplits.setValue(parsed, forKey: lowercasedName)
7073
return parsed
7174
}
7275
return nil

SplitTests/Helpers/SplitTestHelper.swift

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,127 @@ class SplitTestHelper {
177177
}
178178

179179
static func newSplit(name: String, trafficType: String) -> Split {
180-
let split = Split(name: name, trafficType: trafficType, status: .active, sets: nil, json: "")
181-
split.isCompletelyParsed = true
180+
181+
let splitJSONExample = """
182+
{
183+
"trafficTypeName":"\(trafficType)",
184+
"name": "\(name)\",
185+
"trafficAllocation":59,
186+
"trafficAllocationSeed":-2108186082,
187+
"seed":-1947050785,
188+
"status":"ACTIVE",
189+
"killed":false,
190+
"defaultTreatment":"off",
191+
"changeNumber":1506703262916,
192+
"algo":2,
193+
"conditions":[
194+
{
195+
"conditionType":"WHITELIST",
196+
"matcherGroup":{
197+
"combiner":"AND",
198+
"matchers":[
199+
{
200+
"keySelector":null,
201+
"matcherType":"WHITELIST",
202+
"negate":false,
203+
"userDefinedSegmentMatcherData":null,
204+
"whitelistMatcherData":{
205+
"whitelist":[
206+
"nico_test",
207+
"othertest"
208+
]
209+
},
210+
"unaryNumericMatcherData":null,
211+
"betweenMatcherData":null,
212+
"booleanMatcherData":null,
213+
"dependencyMatcherData":null,
214+
"stringMatcherData":null
215+
}
216+
]
217+
},
218+
"partitions":[
219+
{
220+
"treatment":"on",
221+
"size":100
222+
}
223+
],
224+
"label":"whitelisted"
225+
},
226+
{
227+
"conditionType":"WHITELIST",
228+
"matcherGroup":{
229+
"combiner":"AND",
230+
"matchers":[
231+
{
232+
"keySelector":null,
233+
"matcherType":"WHITELIST",
234+
"negate":false,
235+
"userDefinedSegmentMatcherData":null,
236+
"whitelistMatcherData":{
237+
"whitelist":[
238+
"bla"
239+
]
240+
},
241+
"unaryNumericMatcherData":null,
242+
"betweenMatcherData":null,
243+
"booleanMatcherData":null,
244+
"dependencyMatcherData":null,
245+
"stringMatcherData":null
246+
}
247+
]
248+
},
249+
"partitions":[
250+
{
251+
"treatment":"off",
252+
"size":100
253+
}
254+
],
255+
"label":"whitelisted"
256+
},
257+
{
258+
"conditionType":"ROLLOUT",
259+
"matcherGroup":{
260+
"combiner":"AND",
261+
"matchers":[
262+
{
263+
"keySelector":{
264+
"trafficType":"account",
265+
"attribute":null
266+
},
267+
"matcherType":"ALL_KEYS",
268+
"negate":false,
269+
"userDefinedSegmentMatcherData":null,
270+
"whitelistMatcherData":null,
271+
"unaryNumericMatcherData":null,
272+
"betweenMatcherData":null,
273+
"booleanMatcherData":null,
274+
"dependencyMatcherData":null,
275+
"stringMatcherData":null
276+
}
277+
]
278+
},
279+
"partitions":[
280+
{
281+
"treatment":"on",
282+
"size":0
283+
},
284+
{
285+
"treatment":"off",
286+
"size":100
287+
},
288+
{
289+
"treatment":"visa",
290+
"size":0
291+
}
292+
],
293+
"label":"in segment all"
294+
}
295+
]
296+
}
297+
"""
298+
299+
let split = Split(name: name, trafficType: trafficType, status: .active, sets: nil, json: splitJSONExample)
300+
split.isCompletelyParsed = false
182301
return split
183302
}
184303
}

SplitTests/SplitManagerTest.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ class SplitManagerTest: XCTestCase {
9999
changeNumber: 2, updateTimestamp: 200))
100100
let splits = manager.splits
101101
let names = manager.splitNames
102-
XCTAssertEqual(splits.count, 7, "Added one feature flag count")
103-
XCTAssertEqual(names.sorted().joined(separator: ",").lowercased(), "sample_feature0,sample_feature1,sample_feature2,sample_feature3,sample_feature4,sample_feature5,sample_feature6", "Added one feature flag name check")
102+
XCTAssertEqual(splits.count, 9, "Added one feature flag count")
103+
XCTAssertEqual(names.sorted().joined(separator: ",").lowercased(), "sample_feature0,sample_feature1,sample_feature2,sample_feature3,sample_feature4,sample_feature5,sample_feature6,always_on_if_prerequisite,rbs_test_flag","Added one feature flag name check")
104104
}
105105

106106
func testEmptyName(){

SplitTests/Storage/SplitsStorageTests.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,41 @@ class SplitsStorageTest: XCTestCase {
7575
XCTAssertEqual(1, splits.keys.filter { return $0 == "added1"}.count)
7676
XCTAssertTrue(persistentStorage.updateCalled)
7777
}
78+
79+
func testFetchTwiceParseOnce() {
80+
81+
persistentStorage.snapshot = getTestSnapshot()
82+
splitsStorage.loadLocal()
83+
84+
let split = newSplit(name: "TwiceTestSplit")
85+
XCTAssertFalse(split.isCompletelyParsed, "A new Split shouln't be parsed yet")
86+
87+
let processedChange = ProcessedSplitChange(activeSplits: [split],
88+
archivedSplits: [],
89+
changeNumber: 999, updateTimestamp: 888)
90+
91+
_ = splitsStorage.update(splitChange: processedChange)
92+
let splitGet = splitsStorage.get(name: "TwiceTestSplit")
93+
94+
XCTAssert(splitGet!.isCompletelyParsed, "After getting it once, the Split it should be parsed")
95+
}
96+
97+
func testFetchCaseInsensitive() {
98+
99+
persistentStorage.snapshot = getTestSnapshot()
100+
splitsStorage.loadLocal()
101+
102+
let split = newSplit(name: "TwiceTestSplit")
103+
XCTAssertFalse(split.isCompletelyParsed)
104+
105+
let processedChange = ProcessedSplitChange(activeSplits: [split],
106+
archivedSplits: [],
107+
changeNumber: 999, updateTimestamp: 888)
108+
109+
_ = splitsStorage.update(splitChange: processedChange)
110+
_ = splitsStorage.get(name: "TwiceTestSplit")
111+
XCTAssertNotNil(splitsStorage.getAll()["twicetestsplit"])
112+
}
78113

79114
func testUpdateEmptySplits() {
80115

0 commit comments

Comments
 (0)