1
1
package io .split .client .impressions ;
2
2
3
+ import io .split .client .dtos .UniqueKeys ;
3
4
import io .split .telemetry .synchronizer .TelemetryInMemorySubmitter ;
4
5
import io .split .telemetry .synchronizer .TelemetrySynchronizer ;
5
6
import org .junit .Assert ;
6
7
import org .junit .Test ;
7
8
import org .mockito .Mockito ;
8
9
10
+ import java .lang .reflect .Field ;
11
+ import java .lang .reflect .InvocationTargetException ;
12
+ import java .lang .reflect .Method ;
9
13
import java .util .HashMap ;
10
14
import 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 ;
11
19
12
20
public class UniqueKeysTrackerImpTest {
13
21
private static TelemetrySynchronizer _telemetrySynchronizer = Mockito .mock (TelemetryInMemorySubmitter .class );
@@ -100,4 +108,71 @@ public void testStopSynchronization() throws Exception {
100
108
uniqueKeysTrackerImp .stop ();
101
109
Mockito .verify (telemetrySynchronizer , Mockito .times (1 )).synchronizeUniqueKeys (Mockito .anyObject ());
102
110
}
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
+ }
103
178
}
0 commit comments