@@ -252,8 +252,6 @@ public void bucketUserInForcedVariation() throws Exception {
252252 assertThat (algorithm .bucket (experiment , "testUser1" ).getKey (), is ("var1" ));
253253 }
254254
255-
256-
257255 /**
258256 * Verify that {@link Bucketer#bucket(Experiment, String)} returns the proper variation when the user doesn't
259257 * have a forced variation mapping.
@@ -447,10 +445,14 @@ public void bucketUserNotInOverlappingGroupExperiment() throws Exception {
447445 assertNull (algorithm .bucket (groupExperiment , "blah" ));
448446 }
449447
450- @ Test public void bucketUserSaveActivationWithPersistentBucketer () throws Exception {
448+ /**
449+ * Verify that {@link Bucketer#bucket(Experiment,String} saves a variation of an experiment for a user
450+ * when a {@link UserExperimentRecord} is present.
451+ */
452+ @ Test public void bucketUserSaveActivationWithUserExperimentRecord () throws Exception {
451453 final AtomicInteger bucketValue = new AtomicInteger ();
452454 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
453- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
455+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
454456 bucketValue .set (3000 );
455457
456458 ProjectConfig projectConfig = validProjectConfig ();
@@ -463,15 +465,19 @@ public void bucketUserNotInOverlappingGroupExperiment() throws Exception {
463465 assertThat (algorithm .bucket (groupExperiment , "blah" ), is (variation ));
464466
465467 logbackVerifier .expectMessage (Level .INFO ,
466- "Persisted variation \" e2_vtag1\" of experiment \" group_etag2\" ." );
468+ "Saved variation \" e2_vtag1\" of experiment \" group_etag2\" for user \" blah \" ." );
467469
468470 verify (userExperimentRecord ).save ("blah" , groupExperiment .getKey (), variation .getKey ());
469471 }
470472
471- @ Test public void bucketUserSaveActivationFailWithPersistentBucketer () throws Exception {
473+ /**
474+ * Verify that {@link Bucketer#bucket(Experiment,String} logs correctly
475+ * when a {@link UserExperimentRecord} is present and fails to save an activation.
476+ */
477+ @ Test public void bucketUserSaveActivationFailWithUserExperimentRecord () throws Exception {
472478 final AtomicInteger bucketValue = new AtomicInteger ();
473479 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
474- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
480+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
475481 bucketValue .set (3000 );
476482
477483 ProjectConfig projectConfig = validProjectConfig ();
@@ -484,15 +490,19 @@ public void bucketUserNotInOverlappingGroupExperiment() throws Exception {
484490 assertThat (algorithm .bucket (groupExperiment , "blah" ), is (variation ));
485491
486492 logbackVerifier .expectMessage (Level .WARN ,
487- "Failed to persist variation \" e2_vtag1\" of experiment \" group_etag2\" ." );
493+ "Failed to save variation \" e2_vtag1\" of experiment \" group_etag2\" for user \" blah \" ." );
488494
489495 verify (userExperimentRecord ).save ("blah" , groupExperiment .getKey (), variation .getKey ());
490496 }
491497
492- @ Test public void bucketUserRestoreActivationWithPersistentBucketer () throws Exception {
498+ /**
499+ * Verify that {@link Bucketer#bucket(Experiment,String)} returns a variation that is
500+ * stored in the provided {@link userExperimentRecord}.
501+ */
502+ @ Test public void bucketUserRestoreActivationWithUserExperimentRecord () throws Exception {
493503 final AtomicInteger bucketValue = new AtomicInteger ();
494504 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
495- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
505+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
496506 bucketValue .set (3000 );
497507
498508 ProjectConfig projectConfig = validProjectConfig ();
@@ -505,15 +515,20 @@ public void bucketUserNotInOverlappingGroupExperiment() throws Exception {
505515 assertThat (algorithm .bucket (groupExperiment , "blah" ), is (variation ));
506516
507517 logbackVerifier .expectMessage (Level .INFO ,
508- "Returning previously activated variation \" e2_vtag1\" from user experiment registry." );
518+ "Returning previously activated variation \" e2_vtag1\" of experiment \" group_etag2\" "
519+ + " for user \" blah\" from user experiment record." );
509520
510521 verify (userExperimentRecord ).lookup ("blah" , groupExperiment .getKey ());
511522 }
512523
513- @ Test public void bucketUserRestoreActivationNullWithPersistentBucketer () throws Exception {
524+ /**
525+ * Verify {@link Bucketer#bucket(Experiment,String)} handles a present {@link UserExperimentRecord}
526+ * returning null when looking up a variation.
527+ */
528+ @ Test public void bucketUserRestoreActivationNullWithUserExperimentRecord () throws Exception {
514529 final AtomicInteger bucketValue = new AtomicInteger ();
515530 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
516- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
531+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
517532 bucketValue .set (3000 );
518533
519534 ProjectConfig projectConfig = validProjectConfig ();
@@ -525,73 +540,87 @@ public void bucketUserNotInOverlappingGroupExperiment() throws Exception {
525540
526541 assertThat (algorithm .bucket (groupExperiment , "blah" ), is (variation ));
527542
528- logbackVerifier .expectMessage (Level .INFO ,
529- "No previously activated variation returned from persistent bucketer." );
530-
543+ logbackVerifier .expectMessage (Level .INFO , "No previously activated variation of experiment " +
544+ "\" group_etag2\" for user \" blah\" found in user experiment record." );
531545 verify (userExperimentRecord ).lookup ("blah" , groupExperiment .getKey ());
532546 }
533547
548+ /**
549+ * Verify {@link Bucketer#cleanUserExperimentRecords()} handles a null {@link UserExperimentRecord}.
550+ */
534551 @ Test
535552 public void nullUserExperimentRecordWhenCleaning () {
536553 final AtomicInteger bucketValue = new AtomicInteger ();
537554 Bucketer algorithm = mockBucketAlgorithm (bucketValue );
538555 bucketValue .set (3000 );
539556 try {
540- algorithm .cleanUserExperimentRecord ();
557+ algorithm .cleanUserExperimentRecords ();
541558 } catch (NullPointerException e ) {
542559 fail ();
543560 }
544561 }
545562
563+ /**
564+ * Verify {@link Bucketer#cleanUserExperimentRecords()} handles a null returned from
565+ * {@link UserExperimentRecord#getAllRecords()}.
566+ */
546567 @ Test
547568 public void nullUserExperimentRecords () {
548569 final AtomicInteger bucketValue = new AtomicInteger ();
549570 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
550- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
571+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
551572 bucketValue .set (3000 );
552573
553- when (userExperimentRecord .records ()).thenReturn (null );
574+ when (userExperimentRecord .getAllRecords ()).thenReturn (null );
554575 try {
555- algorithm .cleanUserExperimentRecord ();
576+ algorithm .cleanUserExperimentRecords ();
556577 } catch (NullPointerException e ) {
557578 fail ();
558579 }
559580 }
560581
582+ /**
583+ * Verify {@link Bucketer#cleanUserExperimentRecords()} removes experiments
584+ * that are no longer in the {@link ProjectConfig}.
585+ */
561586 @ Test
562587 public void cleanRemovesRecordsOfExperimentsThatNoLongerExist () {
563588 final AtomicInteger bucketValue = new AtomicInteger ();
564589 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
565- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
590+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
566591 bucketValue .set (3000 );
567592
568593 Map <String ,Map <String ,String >> records = new HashMap <String , Map <String , String >>();
569594 Map <String ,String > activation = new HashMap <String , String >();
570- activation .put ("57 " , "57 " );
595+ activation .put ("exp1 " , "var1 " );
571596 records .put ("blah" , activation );
572- when (userExperimentRecord .records ()).thenReturn (records );
597+ when (userExperimentRecord .getAllRecords ()).thenReturn (records );
573598
574- algorithm .cleanUserExperimentRecord ();
599+ algorithm .cleanUserExperimentRecords ();
575600
576- verify (userExperimentRecord ).remove ("blah" , "57 " );
601+ verify (userExperimentRecord ).remove ("blah" , "exp1 " );
577602 }
578603
604+ /**
605+ * Verify {@link Bucketer#cleanUserExperimentRecords()} removes experiments
606+ * that are paused in the {@link ProjectConfig}.
607+ */
579608 @ Test
580609 public void cleanRemovesRecordsOfExperimentsThatAreNotRunning () {
581610 final AtomicInteger bucketValue = new AtomicInteger ();
582611 UserExperimentRecord userExperimentRecord = mock (UserExperimentRecord .class );
583- Bucketer algorithm = mockPersistentBucketAlgorithm (bucketValue , userExperimentRecord );
612+ Bucketer algorithm = mockUserExperimentRecordAlgorithm (bucketValue , userExperimentRecord );
584613 bucketValue .set (3000 );
585614
586615 Map <String ,Map <String ,String >> records = new HashMap <String , Map <String , String >>();
587616 Map <String ,String > activation = new HashMap <String , String >();
588- activation .put ("118 " , "57 " );
617+ activation .put ("exp1 " , "var1 " );
589618 records .put ("blah" , activation );
590- when (userExperimentRecord .records ()).thenReturn (records );
619+ when (userExperimentRecord .getAllRecords ()).thenReturn (records );
591620
592- algorithm .cleanUserExperimentRecord ();
621+ algorithm .cleanUserExperimentRecords ();
593622
594- verify (userExperimentRecord ).remove ("blah" , "118 " );
623+ verify (userExperimentRecord ).remove ("blah" , "exp1 " );
595624 }
596625
597626 //======== Helper methods ========//
@@ -618,12 +647,12 @@ int generateBucketValue(int hashCode) {
618647 * @param bucketValue the expected bucket value holder
619648 * @return the mock bucket algorithm
620649 */
621- private Bucketer mockPersistentBucketAlgorithm (final AtomicInteger bucketValue , final UserExperimentRecord userExperimentRecord ) {
650+ private Bucketer mockUserExperimentRecordAlgorithm (final AtomicInteger bucketValue , final UserExperimentRecord userExperimentRecord ) {
622651 return new Bucketer (validProjectConfig (), userExperimentRecord ) {
623652 @ Override
624653 int generateBucketValue (int hashCode ) {
625654 return bucketValue .get ();
626655 }
627656 };
628657 }
629- }
658+ }
0 commit comments