11package io .split .client .impressions ;
22
3+ import io .split .client .dtos .UniqueKeys ;
34import io .split .telemetry .synchronizer .TelemetryInMemorySubmitter ;
45import io .split .telemetry .synchronizer .TelemetrySynchronizer ;
56import org .junit .Assert ;
67import org .junit .Test ;
78import org .mockito .Mockito ;
89
10+ import java .lang .reflect .Field ;
11+ import java .lang .reflect .InvocationTargetException ;
12+ import java .lang .reflect .Method ;
913import java .util .HashMap ;
1014import java .util .HashSet ;
15+ import java .util .List ;
16+ import java .util .Map ;
17+ import java .util .ArrayList ;
18+ import java .util .concurrent .atomic .AtomicInteger ;
1119
1220public class UniqueKeysTrackerImpTest {
1321 private static TelemetrySynchronizer _telemetrySynchronizer = Mockito .mock (TelemetryInMemorySubmitter .class );
@@ -100,4 +108,71 @@ public void testStopSynchronization() throws Exception {
100108 uniqueKeysTrackerImp .stop ();
101109 Mockito .verify (telemetrySynchronizer , Mockito .times (1 )).synchronizeUniqueKeys (Mockito .anyObject ());
102110 }
111+
112+ @ Test
113+ public void testUniqueKeysChunks () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
114+ UniqueKeysTrackerImp uniqueKeysTrackerImp = new UniqueKeysTrackerImp (_telemetrySynchronizer , 10000 , 10000 , null );
115+ HashMap <String , HashSet <String >> uniqueKeysHashMap = new HashMap <>();
116+ HashSet <String > feature1 = new HashSet <>();
117+ HashSet <String > feature2 = new HashSet <>();
118+ HashSet <String > feature3 = new HashSet <>();
119+ HashSet <String > feature4 = new HashSet <>();
120+ HashSet <String > feature5 = new HashSet <>();
121+ for (Integer i =1 ; i <6000 ; i ++) {
122+ if (i <= 1000 ) {
123+ feature1 .add ("key" + i );
124+ }
125+ if (i <= 2000 ) {
126+ feature2 .add ("key" + i );
127+ }
128+ if (i <= 3000 ) {
129+ feature3 .add ("key" + i );
130+ }
131+ if (i <= 4000 ) {
132+ feature4 .add ("key" + i );
133+ }
134+ feature5 .add ("key" + i );
135+ }
136+ uniqueKeysHashMap .put ("feature1" , feature1 );
137+ uniqueKeysHashMap .put ("feature2" , feature2 );
138+ uniqueKeysHashMap .put ("feature3" , feature3 );
139+ uniqueKeysHashMap .put ("feature4" , feature4 );
140+ uniqueKeysHashMap .put ("feature5" , feature5 );
141+
142+ List <UniqueKeys .UniqueKey > uniqueKeysFromPopAll = new ArrayList <>();
143+ for (Map .Entry <String , HashSet <String >> uniqueKeyEntry : uniqueKeysHashMap .entrySet ()) {
144+ UniqueKeys .UniqueKey uniqueKey = new UniqueKeys .UniqueKey (uniqueKeyEntry .getKey (), new ArrayList <>(uniqueKeyEntry .getValue ()));
145+ uniqueKeysFromPopAll .add (uniqueKey );
146+ }
147+ Method methodCapChunks = uniqueKeysTrackerImp .getClass ().getDeclaredMethod ("capChunksToMaxSize" , List .class );
148+ methodCapChunks .setAccessible (true );
149+ uniqueKeysFromPopAll = (List <UniqueKeys .UniqueKey >)methodCapChunks .invoke (uniqueKeysTrackerImp , uniqueKeysFromPopAll );
150+
151+ Method methodGetChunks = uniqueKeysTrackerImp .getClass ().getDeclaredMethod ("getChunks" , List .class );
152+ methodGetChunks .setAccessible (true );
153+ List <List <UniqueKeys .UniqueKey >> keysChunks = (List <List <UniqueKeys .UniqueKey >>) methodGetChunks .invoke (uniqueKeysTrackerImp , uniqueKeysFromPopAll );
154+ for (List <UniqueKeys .UniqueKey > chunk : keysChunks ) {
155+ int chunkSize = 0 ;
156+ for (UniqueKeys .UniqueKey keys : chunk ) {
157+ chunkSize += keys .keysDto .size ();
158+ }
159+ Assert .assertTrue (chunkSize <= 5000 );
160+ }
161+ }
162+
163+ @ Test
164+ public void testTrackReachMaxKeys () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException , NoSuchFieldException {
165+ TelemetrySynchronizer telemetrySynchronizer = Mockito .mock (TelemetryInMemorySubmitter .class );
166+ UniqueKeysTrackerImp uniqueKeysTrackerImp = new UniqueKeysTrackerImp (telemetrySynchronizer , 10000 , 10000 , null );
167+ for (int i =1 ; i <6000 ; i ++) {
168+ Assert .assertTrue (uniqueKeysTrackerImp .track ("feature1" , "key" + i ));
169+ Assert .assertTrue (uniqueKeysTrackerImp .track ("feature2" , "key" + i ));
170+ }
171+ Mockito .verify (telemetrySynchronizer , Mockito .times (2 )).synchronizeUniqueKeys (Mockito .anyObject ());
172+
173+ Field getTrackerSize = uniqueKeysTrackerImp .getClass ().getDeclaredField ("trackerKeysSize" );
174+ getTrackerSize .setAccessible (true );
175+ AtomicInteger trackerSize = (AtomicInteger ) getTrackerSize .get (uniqueKeysTrackerImp );
176+ Assert .assertTrue (trackerSize .intValue () == 1998 );
177+ }
103178}
0 commit comments