@@ -220,6 +220,130 @@ func TestGetNamesByFlagSets(t *testing.T) {
220220 }
221221}
222222
223+ func TestChangesSince (t * testing.T ) {
224+ dbw , err := persistent .NewBoltWrapper (persistent .BoltInMemoryMode , nil )
225+ assert .Nil (t , err )
226+ logger := logging .NewLogger (nil )
227+
228+ // Initialize storage with some test data
229+ pss := NewProxySplitStorage (dbw , logger , flagsets .NewFlagSetFilter (nil ), true )
230+
231+ // Test case 1: since == -1 and no flagSets
232+ {
233+ initialSplits := []dtos.SplitDTO {
234+ {Name : "split1" , ChangeNumber : 10 , Status : "ACTIVE" , TrafficTypeName : "user" },
235+ {Name : "split2" , ChangeNumber : 10 , Status : "ACTIVE" , TrafficTypeName : "user" },
236+ }
237+ pss .Update (initialSplits , nil , 10 )
238+
239+ changes , err := pss .ChangesSince (- 1 , nil )
240+ assert .Nil (t , err )
241+ assert .Equal (t , int64 (- 1 ), changes .Since )
242+ assert .Equal (t , int64 (10 ), changes .Till )
243+ assert .ElementsMatch (t , initialSplits , changes .Splits )
244+ }
245+
246+ // Test case 2: Error when since is too old
247+ {
248+ // The storage was initialized with CN 10, so requesting CN 5 should fail
249+ changes , err := pss .ChangesSince (5 , nil )
250+ assert .Equal (t , ErrSinceParamTooOld , err )
251+ assert .Nil (t , changes )
252+ }
253+
254+ // Test case 3: Active and archived splits
255+ {
256+ // Add a new split and archive an existing one
257+ toAdd := []dtos.SplitDTO {{Name : "split3" , ChangeNumber : 15 , Status : "ACTIVE" , TrafficTypeName : "user" }}
258+ toRemove := []dtos.SplitDTO {
259+ {
260+ Name : "split2" ,
261+ ChangeNumber : 15 ,
262+ Status : "ARCHIVED" ,
263+ TrafficTypeName : "user" ,
264+ TrafficAllocation : 100 ,
265+ Algo : 1 ,
266+ DefaultTreatment : "off" ,
267+ Conditions : []dtos.ConditionDTO {},
268+ Sets : []string {},
269+ },
270+ }
271+
272+ pss .Update (toAdd , toRemove , 15 )
273+
274+ changes , err := pss .ChangesSince (10 , nil )
275+ assert .Nil (t , err )
276+ assert .Equal (t , int64 (10 ), changes .Since )
277+ assert .Equal (t , int64 (15 ), changes .Till )
278+
279+ // Should include both the new active split and the archived one
280+ expectedSplits := []dtos.SplitDTO {
281+ {
282+ Name : "split3" ,
283+ ChangeNumber : 15 ,
284+ Status : "ACTIVE" ,
285+ TrafficTypeName : "user" ,
286+ TrafficAllocation : 0 ,
287+ Algo : 0 ,
288+ Conditions : nil ,
289+ Sets : nil ,
290+ },
291+ {
292+ Name : "split2" ,
293+ ChangeNumber : 15 ,
294+ Status : "ARCHIVED" ,
295+ TrafficTypeName : "user" ,
296+ TrafficAllocation : 100 ,
297+ Algo : 1 ,
298+ DefaultTreatment : "off" ,
299+ Conditions : []dtos.ConditionDTO {},
300+ Sets : []string {},
301+ },
302+ }
303+ assert .ElementsMatch (t , expectedSplits , changes .Splits )
304+ }
305+
306+ // Test case 4: FlagSets filtering
307+ {
308+ // Add splits with flag sets
309+ flagSetSplits := []dtos.SplitDTO {
310+ {Name : "split4" , ChangeNumber : 20 , Status : "ACTIVE" , Sets : []string {"set1" }, TrafficTypeName : "user" },
311+ {Name : "split5" , ChangeNumber : 20 , Status : "ACTIVE" , Sets : []string {"set2" }, TrafficTypeName : "user" },
312+ }
313+ pss .Update (flagSetSplits , nil , 20 )
314+
315+ // Test filtering by set1
316+ changes , err := pss .ChangesSince (15 , []string {"set1" })
317+ assert .Nil (t , err )
318+ assert .Equal (t , int64 (15 ), changes .Since )
319+ assert .Equal (t , int64 (20 ), changes .Till )
320+ expectedSet1 := []dtos.SplitDTO {
321+ {Name : "split4" , ChangeNumber : 20 , Status : "ACTIVE" , Sets : []string {"set1" }, TrafficTypeName : "user" },
322+ }
323+ assert .ElementsMatch (t , expectedSet1 , changes .Splits )
324+ }
325+
326+ // Test case 5: Proper till calculation with multiple changes
327+ {
328+ // Add changes with different change numbers
329+ changes1 := []dtos.SplitDTO {{Name : "split6" , ChangeNumber : 25 , Status : "ACTIVE" , TrafficTypeName : "user" }}
330+ changes2 := []dtos.SplitDTO {{Name : "split7" , ChangeNumber : 30 , Status : "ACTIVE" , TrafficTypeName : "user" }}
331+
332+ pss .Update (changes1 , nil , 25 )
333+ pss .Update (changes2 , nil , 30 )
334+
335+ changes , err := pss .ChangesSince (20 , nil )
336+ assert .Nil (t , err )
337+ assert .Equal (t , int64 (20 ), changes .Since )
338+ assert .Equal (t , int64 (30 ), changes .Till )
339+ expectedChanges := []dtos.SplitDTO {
340+ {Name : "split6" , ChangeNumber : 25 , Status : "ACTIVE" , TrafficTypeName : "user" },
341+ {Name : "split7" , ChangeNumber : 30 , Status : "ACTIVE" , TrafficTypeName : "user" },
342+ }
343+ assert .ElementsMatch (t , expectedChanges , changes .Splits )
344+ }
345+ }
346+
223347func TestGetAllFlagSetNames (t * testing.T ) {
224348 dbw , err := persistent .NewBoltWrapper (persistent .BoltInMemoryMode , nil )
225349 if err != nil {
0 commit comments