@@ -7,6 +7,7 @@ import splitChangesMock6 from '../mocks/splitchanges.since.1684265694505.till.16
77import splitChangesMock7 from '../mocks/splitchanges.since.1684265694506.till.1684265694526.SPLIT_UPDATE.json' ;
88import splitChangesMock8 from '../mocks/splitchanges.since.1684265694526.till.1684265694546.SPLIT_UPDATE.json' ;
99import splitChangesMock9 from '../mocks/splitchanges.since.1684265694546.till.1684265694556.SPLIT_UPDATE.json' ;
10+ import splitChangesMock10 from '../mocks/splitchanges.since.100.till.1457552649999.RB_SEGMENT_UPDATE.json' ;
1011
1112import splitUpdateMessage from '../mocks/message.SPLIT_UPDATE.1457552649999.json' ;
1213import oldSplitUpdateMessage from '../mocks/message.SPLIT_UPDATE.1457552620999.json' ;
@@ -19,6 +20,11 @@ import iffuSplitUpdateMessageZeroPCN from '../mocks/message.SPLIT_UPDATE.IFFU.16
1920import iffuSplitUpdateMessageMissingPCN from '../mocks/message.SPLIT_UPDATE.IFFU.1684265694545.json' ;
2021import iffuSplitUpdateMessageArchivedFF from '../mocks/message.SPLIT_UPDATE.IFFU.1684265694555.json' ;
2122
23+ import rbsUpdateMessage from '../mocks/message.RB_SEGMENT_UPDATE.1457552649999.json' ;
24+ import iffuRbsUpdateNoCompressionMessage from '../mocks/message.RB_SEGMENT_UPDATE.C0.json' ;
25+ import iffuRbsUpdateGZipMessage from '../mocks/message.RB_SEGMENT_UPDATE.C1.json' ;
26+ import iffuRbsUpdateZLibMessage from '../mocks/message.RB_SEGMENT_UPDATE.C2.json' ;
27+
2228import authPushEnabled from '../mocks/auth.pushEnabled.node.json' ;
2329
2430import { nearlyEqual , mockSegmentChanges , url , hasNoCacheHeader } from '../testUtils' ;
@@ -59,7 +65,11 @@ const MILLIS_IFFU_UPDATE_EVENT_WITH_OLD_CHANGENUMBER = 900;
5965const MILLIS_IFFU_UPDATE_EVENT_WITH_ZERO_PCN = 1000 ;
6066const MILLIS_IFFU_UPDATE_EVENT_WITH_MISSING_PCN = 1100 ;
6167const MILLIS_IFFU_UPDATE_EVENT_WITH_ARCHIVED = 1200 ;
62- const MILLIS_DESTROY = 1300 ;
68+ const MILLIS_FIRST_RB_SEGMENT_UPDATE_EVENT = 1300 ;
69+ const MILLIS_IFFU_RB_SEGMENT_UPDATE_C0_EVENT = 1400 ;
70+ const MILLIS_IFFU_RB_SEGMENT_UPDATE_C1_EVENT = 1500 ;
71+ const MILLIS_IFFU_RB_SEGMENT_UPDATE_C2_EVENT = 1600 ;
72+ const MILLIS_DESTROY = 1700 ;
6373
6474/**
6575 * Sequence of calls:
@@ -76,9 +86,13 @@ const MILLIS_DESTROY = 1300;
7686 * 1.0 secs: SPLIT_UPDATE IFFU event with pcn = 0 -> /splitChanges
7787 * 1.1 secs: SPLIT_UPDATE IFFU event with previous change number !== current change number -> /splitChanges
7888 * 1.2 secs: SPLIT_UPDATE IFFU event with ARCHIVED feature flag in notification and Base64 encoded + zLib (c==2) -> /splitChanges
89+ * 1.3 secs: RB_SEGMENT_UPDATE event -> /splitChanges
90+ * 1.4 secs: RB_SEGMENT_UPDATE IFFU event with no compression
91+ * 1.5 secs: RB_SEGMENT_UPDATE IFFU event with Gzip compression
92+ * 1.6 secs: RB_SEGMENT_UPDATE IFFU event with ZLib compression
7993 */
8094export function testSynchronization ( fetchMock , assert ) {
81- assert . plan ( 49 ) ;
95+ assert . plan ( 53 ) ;
8296 fetchMock . reset ( ) ;
8397 __setEventSource ( EventSourceMock ) ;
8498
@@ -204,14 +218,46 @@ export function testSynchronization(fetchMock, assert) {
204218 eventSourceInstance . emitMessage ( iffuSplitUpdateMessageArchivedFF ) ;
205219 } , MILLIS_IFFU_UPDATE_EVENT_WITH_ARCHIVED ) ; // send a SPLIT_UPDATE event with pcn = 0 after 1.1 seconds
206220
221+ setTimeout ( ( ) => {
222+ client . once ( client . Event . SDK_UPDATE , ( ) => {
223+ const lapse = Date . now ( ) - start ;
224+ assert . true ( nearlyEqual ( lapse , MILLIS_FIRST_RB_SEGMENT_UPDATE_EVENT ) , 'SDK_UPDATE due to RB_SEGMENT_UPDATE event' ) ;
225+ } ) ;
226+ eventSourceInstance . emitMessage ( rbsUpdateMessage ) ;
227+ } , MILLIS_FIRST_RB_SEGMENT_UPDATE_EVENT ) ; // send a RB_SEGMENT_UPDATE event with a new changeNumber
228+
229+ setTimeout ( ( ) => {
230+ client . once ( client . Event . SDK_UPDATE , ( ) => {
231+ const lapse = Date . now ( ) - start ;
232+ assert . true ( nearlyEqual ( lapse , MILLIS_IFFU_RB_SEGMENT_UPDATE_C0_EVENT ) , 'SDK_UPDATE due to RB_SEGMENT_UPDATE IFFU event with no compression' ) ;
233+ } ) ;
234+ eventSourceInstance . emitMessage ( iffuRbsUpdateNoCompressionMessage ) ;
235+ } , MILLIS_IFFU_RB_SEGMENT_UPDATE_C0_EVENT ) ; // send a IFFU RB_SEGMENT_UPDATE event
236+
237+ setTimeout ( ( ) => {
238+ client . once ( client . Event . SDK_UPDATE , ( ) => {
239+ const lapse = Date . now ( ) - start ;
240+ assert . true ( nearlyEqual ( lapse , MILLIS_IFFU_RB_SEGMENT_UPDATE_C1_EVENT ) , 'SDK_UPDATE due to RB_SEGMENT_UPDATE IFFU event with GZip compression' ) ;
241+ } ) ;
242+ eventSourceInstance . emitMessage ( iffuRbsUpdateGZipMessage ) ;
243+ } , MILLIS_IFFU_RB_SEGMENT_UPDATE_C1_EVENT ) ; // send a IFFU RB_SEGMENT_UPDATE event
244+
245+ setTimeout ( ( ) => {
246+ client . once ( client . Event . SDK_UPDATE , ( ) => {
247+ const lapse = Date . now ( ) - start ;
248+ assert . true ( nearlyEqual ( lapse , MILLIS_IFFU_RB_SEGMENT_UPDATE_C2_EVENT ) , 'SDK_UPDATE due to RB_SEGMENT_UPDATE IFFU event with ZLib compression' ) ;
249+ } ) ;
250+ eventSourceInstance . emitMessage ( iffuRbsUpdateZLibMessage ) ;
251+ } , MILLIS_IFFU_RB_SEGMENT_UPDATE_C2_EVENT ) ; // send a IFFU RB_SEGMENT_UPDATE event
252+
207253 setTimeout ( ( ) => {
208254 client . destroy ( ) . then ( ( ) => {
209255 assert . equal ( client . getTreatment ( key , 'whitelist' ) , 'control' , 'evaluation returns control if client is destroyed' ) ;
210- // @TODO SDK_UPDATE should be emitted 9 times, but currently it is being emitted twice on SPLIT_KILL
211- assert . equal ( sdkUpdateCount , 10 , 'SDK_UPDATE should be emitted 10 times' ) ;
256+ // @TODO SDK_UPDATE should be emitted 13 times, but currently it is being emitted twice on SPLIT_KILL
257+ assert . equal ( sdkUpdateCount , 14 , 'SDK_UPDATE should be emitted 14 times' ) ;
212258 assert . end ( ) ;
213259 } ) ;
214- } , MILLIS_DESTROY ) ; // destroy client after 1.3 second
260+ } , MILLIS_DESTROY ) ; // destroy client
215261 } ) ;
216262
217263 // initial auth
@@ -309,7 +355,11 @@ export function testSynchronization(fetchMock, assert) {
309355 return { status : 200 , body : splitChangesMock9 } ;
310356 } ) ;
311357
358+ // fetch due to RB_SEGMENTS_UPDATE event
359+ fetchMock . getOnce ( url ( settings , '/splitChanges?s=1.3&since=1684265694556&rbSince=100' ) , { status : 200 , body : splitChangesMock10 } ) ;
360+
312361 mockSegmentChanges ( fetchMock , new RegExp ( `${ url ( settings , '/segmentChanges' ) } /employees` ) , [ key ] ) ;
362+ mockSegmentChanges ( fetchMock , new RegExp ( `${ url ( settings , '/segmentChanges' ) } /segment_excluded_by_rbs` ) , [ ] ) ;
313363 // Special case: empty segment with -1 till
314364 mockSegmentChanges ( fetchMock , new RegExp ( `${ url ( settings , '/segmentChanges' ) } /developers` ) , [ ] , - 1 ) ;
315365 mockSegmentChanges ( fetchMock , { url : new RegExp ( `${ url ( settings , '/segmentChanges' ) } /new_segment` ) , repeat : 2 } , [ otherUserKey ] ) ;
0 commit comments