@@ -389,4 +389,157 @@ - (void)testUpdateExperimentsWithNoCompletion {
389
389
390
390
[experimentControllerMock verify ];
391
391
}
392
+
393
+ - (void )testValidateRunningExperimentsWithEmptyArray {
394
+ NSTimeInterval now = [[NSDate date ] timeIntervalSince1970 ];
395
+
396
+ ABTExperimentPayload *payload2 = [[ABTExperimentPayload alloc ] init ];
397
+ payload2.experimentId = @" exp_2" ;
398
+ payload2.variantId = @" v200" ;
399
+ payload2.experimentStartTimeMillis =
400
+ (now + 1500 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
401
+ ABTExperimentLite *ongoingExperiment = [[ABTExperimentLite alloc ] init ];
402
+ ongoingExperiment.experimentId = @" exp_1" ;
403
+ [payload2.ongoingExperimentsArray addObject: ongoingExperiment];
404
+
405
+ ABTExperimentPayload *payload3 = [[ABTExperimentPayload alloc ] init ];
406
+ payload3.experimentId = @" exp_3" ;
407
+ payload3.variantId = @" v200" ;
408
+ payload3.experimentStartTimeMillis =
409
+ (now + 900 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
410
+ ongoingExperiment = [[ABTExperimentLite alloc ] init ];
411
+ ongoingExperiment.experimentId = @" exp_2" ;
412
+ [payload3.ongoingExperimentsArray addObject: ongoingExperiment];
413
+
414
+ FIRLifecycleEvents *events = [[FIRLifecycleEvents alloc ] init ];
415
+ NSArray *payloads = @[ [payload2 data ], [payload3 data ] ];
416
+ [_experimentController
417
+ updateExperimentConditionalUserPropertiesWithServiceOrigin: gABTTestOrigin
418
+ events: events
419
+ policy:
420
+ ABTExperimentPayload_ExperimentOverflowPolicy_DiscardOldest // NOLINT
421
+ lastStartTime: now
422
+ payloads: payloads
423
+ completionHandler: nil ];
424
+
425
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 2 );
426
+
427
+ [_experimentController validateRunningExperimentsForServiceOrigin: gABTTestOrigin
428
+ runningExperimentPayloads: [NSArray array ]];
429
+
430
+ // Expect all experiments have been cleared.
431
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 0 );
432
+ }
433
+
434
+ - (void )testValidateRunningExperimentsClearingOne {
435
+ NSTimeInterval now = [[NSDate date ] timeIntervalSince1970 ];
436
+
437
+ ABTExperimentPayload *payload2 = [[ABTExperimentPayload alloc ] init ];
438
+ payload2.experimentId = @" exp_2" ;
439
+ payload2.variantId = @" v200" ;
440
+ payload2.experimentStartTimeMillis =
441
+ (now + 1500 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
442
+ ABTExperimentLite *ongoingExperiment = [[ABTExperimentLite alloc ] init ];
443
+ ongoingExperiment.experimentId = @" exp_1" ;
444
+ [payload2.ongoingExperimentsArray addObject: ongoingExperiment];
445
+
446
+ ABTExperimentPayload *payload3 = [[ABTExperimentPayload alloc ] init ];
447
+ payload3.experimentId = @" exp_3" ;
448
+ payload3.variantId = @" v200" ;
449
+ payload3.experimentStartTimeMillis =
450
+ (now + 900 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
451
+ ongoingExperiment = [[ABTExperimentLite alloc ] init ];
452
+ ongoingExperiment.experimentId = @" exp_2" ;
453
+ [payload3.ongoingExperimentsArray addObject: ongoingExperiment];
454
+
455
+ FIRLifecycleEvents *events = [[FIRLifecycleEvents alloc ] init ];
456
+ NSArray *payloads = @[ [payload2 data ], [payload3 data ] ];
457
+ [_experimentController
458
+ updateExperimentConditionalUserPropertiesWithServiceOrigin: gABTTestOrigin
459
+ events: events
460
+ policy:
461
+ ABTExperimentPayload_ExperimentOverflowPolicy_DiscardOldest // NOLINT
462
+ lastStartTime: now
463
+ payloads: payloads
464
+ completionHandler: nil ];
465
+
466
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 2 );
467
+
468
+ ABTExperimentPayload *validatingPayload2 = [[ABTExperimentPayload alloc ] init ];
469
+ validatingPayload2.experimentId = @" exp_2" ;
470
+ validatingPayload2.variantId = @" v200" ;
471
+
472
+ [_experimentController validateRunningExperimentsForServiceOrigin: gABTTestOrigin
473
+ runningExperimentPayloads: @[ validatingPayload2 ]];
474
+
475
+ // Expect no experiments have been cleared.
476
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 1 );
477
+ }
478
+
479
+ - (void )testValidateRunningExperimentsKeepingAll {
480
+ NSTimeInterval now = [[NSDate date ] timeIntervalSince1970 ];
481
+
482
+ ABTExperimentPayload *payload2 = [[ABTExperimentPayload alloc ] init ];
483
+ payload2.experimentId = @" exp_2" ;
484
+ payload2.variantId = @" v200" ;
485
+ payload2.experimentStartTimeMillis =
486
+ (now + 1500 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
487
+ ABTExperimentLite *ongoingExperiment = [[ABTExperimentLite alloc ] init ];
488
+ ongoingExperiment.experimentId = @" exp_1" ;
489
+ [payload2.ongoingExperimentsArray addObject: ongoingExperiment];
490
+
491
+ ABTExperimentPayload *payload3 = [[ABTExperimentPayload alloc ] init ];
492
+ payload3.experimentId = @" exp_3" ;
493
+ payload3.variantId = @" v200" ;
494
+ payload3.experimentStartTimeMillis =
495
+ (now + 900 ) * ABT_MSEC_PER_SEC; // start time > last start time, do set
496
+ ongoingExperiment = [[ABTExperimentLite alloc ] init ];
497
+ ongoingExperiment.experimentId = @" exp_2" ;
498
+ [payload3.ongoingExperimentsArray addObject: ongoingExperiment];
499
+
500
+ FIRLifecycleEvents *events = [[FIRLifecycleEvents alloc ] init ];
501
+ NSArray *payloads = @[ [payload2 data ], [payload3 data ] ];
502
+ [_experimentController
503
+ updateExperimentConditionalUserPropertiesWithServiceOrigin: gABTTestOrigin
504
+ events: events
505
+ policy:
506
+ ABTExperimentPayload_ExperimentOverflowPolicy_DiscardOldest // NOLINT
507
+ lastStartTime: now
508
+ payloads: payloads
509
+ completionHandler: nil ];
510
+
511
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 2 );
512
+
513
+ ABTExperimentPayload *validatingPayload2 = [[ABTExperimentPayload alloc ] init ];
514
+ validatingPayload2.experimentId = @" exp_2" ;
515
+ validatingPayload2.variantId = @" v200" ;
516
+
517
+ ABTExperimentPayload *validatingPayload3 = [[ABTExperimentPayload alloc ] init ];
518
+ validatingPayload3.experimentId = @" exp_3" ;
519
+ validatingPayload3.variantId = @" v200" ;
520
+
521
+ [_experimentController
522
+ validateRunningExperimentsForServiceOrigin: gABTTestOrigin
523
+ runningExperimentPayloads: @[ validatingPayload2, validatingPayload3 ]];
524
+
525
+ // Expect no experiments have been cleared.
526
+ XCTAssertEqual ([_mockCUPController experimentsWithOrigin: gABTTestOrigin ].count , 2 );
527
+ }
528
+
529
+ - (void )testActivateExperiment {
530
+ ABTExperimentPayload *activeExperiment = [[ABTExperimentPayload alloc ] init ];
531
+ activeExperiment.experimentId = @" exp_3" ;
532
+ activeExperiment.variantId = @" v200" ;
533
+ activeExperiment.triggerEvent = @" trigger" ;
534
+
535
+ [_experimentController activateExperiment: activeExperiment forServiceOrigin: gABTTestOrigin ];
536
+
537
+ NSArray *experiments = [_mockCUPController experimentsWithOrigin: gABTTestOrigin ];
538
+
539
+ FIRAConditionalUserProperty *userPropertyForExperiment = [experiments firstObject ];
540
+
541
+ // Verify that the triggerEventName is cleared, making this experiment active.
542
+ XCTAssertNil ([userPropertyForExperiment valueForKeyPath: @" triggerEventName" ]);
543
+ }
544
+
392
545
@end
0 commit comments