16
16
17
17
import static com .google .common .truth .Truth .assertThat ;
18
18
import static com .google .firebase .remoteconfig .internal .Personalization .ANALYTICS_ORIGIN_PERSONALIZATION ;
19
- import static com .google .firebase .remoteconfig .internal .Personalization .ANALYTICS_PULL_EVENT ;
20
- import static com .google .firebase .remoteconfig .internal .Personalization .ARM_KEY ;
21
- import static com .google .firebase .remoteconfig .internal .Personalization .ARM_VALUE ;
19
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_ARM_INDEX_PARAM ;
20
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_ARM_VALUE_PARAM ;
21
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_EVENT ;
22
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_GROUP_PARAM ;
23
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_PERSONALIZATION_ID_PARAM ;
24
+ import static com .google .firebase .remoteconfig .internal .Personalization .EXTERNAL_RC_PARAMETER_PARAM ;
25
+ import static com .google .firebase .remoteconfig .internal .Personalization .INTERNAL_CHOICE_ID_PARAM ;
26
+ import static com .google .firebase .remoteconfig .internal .Personalization .INTERNAL_EVENT ;
27
+ import static org .mockito .AdditionalMatchers .or ;
22
28
import static org .mockito .ArgumentMatchers .any ;
29
+ import static org .mockito .ArgumentMatchers .anyString ;
23
30
import static org .mockito .ArgumentMatchers .eq ;
24
31
import static org .mockito .Mockito .doAnswer ;
25
32
import static org .mockito .Mockito .times ;
26
33
import static org .mockito .Mockito .verify ;
27
34
import static org .mockito .MockitoAnnotations .initMocks ;
28
35
29
36
import android .os .Bundle ;
37
+ import com .google .common .truth .Correspondence ;
30
38
import com .google .firebase .analytics .connector .AnalyticsConnector ;
31
39
import java .util .ArrayList ;
32
40
import java .util .Date ;
45
53
@ Config (manifest = Config .NONE )
46
54
public class PersonalizationTest {
47
55
private static final ConfigContainer CONFIG_CONTAINER ;
56
+ private static final Bundle LOG_PARAMS_1 = new Bundle ();
57
+ private static final Bundle LOG_PARAMS_2 = new Bundle ();
58
+ private static final Bundle INTERNAL_LOG_PARAMS_1 = new Bundle ();
59
+ private static final Bundle INTERNAL_LOG_PARAMS_2 = new Bundle ();
48
60
49
61
static {
50
62
try {
@@ -55,15 +67,37 @@ public class PersonalizationTest {
55
67
.withFetchTime (new Date (1 ))
56
68
.withPersonalizationMetadata (
57
69
new JSONObject (
58
- "{key1: {personalizationId: 'id1'}, key2: {personalizationId: 'id2'}}" ))
70
+ "{key1: {personalizationId: 'p13n1', armIndex: 0,"
71
+ + " choiceId: 'id1', group: 'BASELINE'},"
72
+ + " key2: {personalizationId: 'p13n2', armIndex: 1,"
73
+ + " choiceId: 'id2', group: 'P13N'}}" ))
59
74
.build ();
60
75
} catch (JSONException e ) {
61
76
throw new RuntimeException (e );
62
77
}
78
+
79
+ LOG_PARAMS_1 .putString (EXTERNAL_RC_PARAMETER_PARAM , "key1" );
80
+ LOG_PARAMS_1 .putString (EXTERNAL_ARM_VALUE_PARAM , "value1" );
81
+ LOG_PARAMS_1 .putString (EXTERNAL_PERSONALIZATION_ID_PARAM , "p13n1" );
82
+ LOG_PARAMS_1 .putInt (EXTERNAL_ARM_INDEX_PARAM , 0 );
83
+ LOG_PARAMS_1 .putString (EXTERNAL_GROUP_PARAM , "BASELINE" );
84
+
85
+ LOG_PARAMS_2 .putString (EXTERNAL_RC_PARAMETER_PARAM , "key2" );
86
+ LOG_PARAMS_2 .putString (EXTERNAL_ARM_VALUE_PARAM , "value2" );
87
+ LOG_PARAMS_2 .putString (EXTERNAL_PERSONALIZATION_ID_PARAM , "p13n2" );
88
+ LOG_PARAMS_2 .putInt (EXTERNAL_ARM_INDEX_PARAM , 1 );
89
+ LOG_PARAMS_2 .putString (EXTERNAL_GROUP_PARAM , "P13N" );
90
+
91
+ INTERNAL_LOG_PARAMS_1 .putString (INTERNAL_CHOICE_ID_PARAM , "id1" );
92
+
93
+ INTERNAL_LOG_PARAMS_2 .putString (INTERNAL_CHOICE_ID_PARAM , "id2" );
63
94
}
64
95
65
96
private static final List <Bundle > FAKE_LOGS = new ArrayList <>();
66
97
98
+ private static final Correspondence <Bundle , String > TO_STRING =
99
+ Correspondence .transforming (Bundle ::toString , "as String is" );
100
+
67
101
private Personalization personalization ;
68
102
69
103
@ Mock private AnalyticsConnector mockAnalyticsConnector ;
@@ -74,8 +108,7 @@ public void setUp() {
74
108
75
109
doAnswer (invocation -> FAKE_LOGS .add (invocation .getArgument (2 )))
76
110
.when (mockAnalyticsConnector )
77
- .logEvent (
78
- eq (ANALYTICS_ORIGIN_PERSONALIZATION ), eq (ANALYTICS_PULL_EVENT ), any (Bundle .class ));
111
+ .logEvent (eq (ANALYTICS_ORIGIN_PERSONALIZATION ), anyString (), any (Bundle .class ));
79
112
80
113
personalization = new Personalization (mockAnalyticsConnector );
81
114
@@ -88,43 +121,46 @@ public void logArmActive_nonPersonalizationKey_notLogged() {
88
121
89
122
verify (mockAnalyticsConnector , times (0 ))
90
123
.logEvent (
91
- eq (ANALYTICS_ORIGIN_PERSONALIZATION ), eq (ANALYTICS_PULL_EVENT ), any (Bundle .class ));
124
+ eq (ANALYTICS_ORIGIN_PERSONALIZATION ),
125
+ or (eq (EXTERNAL_EVENT ), eq (INTERNAL_EVENT )),
126
+ any (Bundle .class ));
92
127
assertThat (FAKE_LOGS ).isEmpty ();
93
128
}
94
129
95
130
@ Test
96
- public void logArmActive_singlePersonalizationKey_loggedOnce () {
131
+ public void logArmActive_singlePersonalizationKey_loggedInternallyAndExternally () {
97
132
personalization .logArmActive ("key1" , CONFIG_CONTAINER );
98
133
99
134
verify (mockAnalyticsConnector , times (1 ))
100
- .logEvent (
101
- eq (ANALYTICS_ORIGIN_PERSONALIZATION ), eq (ANALYTICS_PULL_EVENT ), any (Bundle .class ));
102
- assertThat (FAKE_LOGS ).hasSize (1 );
135
+ .logEvent (eq (ANALYTICS_ORIGIN_PERSONALIZATION ), eq (EXTERNAL_EVENT ), any (Bundle .class ));
136
+ verify (mockAnalyticsConnector , times (1 ))
137
+ .logEvent (eq (ANALYTICS_ORIGIN_PERSONALIZATION ), eq (INTERNAL_EVENT ), any (Bundle .class ));
138
+ assertThat (FAKE_LOGS ).hasSize (2 );
103
139
104
- Bundle params = new Bundle ();
105
- params .putString (ARM_KEY , "id1" );
106
- params .putString (ARM_VALUE , "value1" );
107
- assertThat (FAKE_LOGS .get (0 ).toString ()).isEqualTo (params .toString ());
140
+ assertThat (FAKE_LOGS )
141
+ .comparingElementsUsing (TO_STRING )
142
+ .containsExactly (LOG_PARAMS_1 .toString (), INTERNAL_LOG_PARAMS_1 .toString ());
108
143
}
109
144
110
145
@ Test
111
- public void logArmActive_multiplePersonalizationKeys_loggedMultiple () {
146
+ public void logArmActive_multiplePersonalizationKeys_loggedInternallyAndExternally () {
112
147
personalization .logArmActive ("key1" , CONFIG_CONTAINER );
113
148
personalization .logArmActive ("key2" , CONFIG_CONTAINER );
149
+ personalization .logArmActive ("key1" , CONFIG_CONTAINER );
114
150
115
151
verify (mockAnalyticsConnector , times (2 ))
116
- .logEvent (
117
- eq ( ANALYTICS_ORIGIN_PERSONALIZATION ), eq ( ANALYTICS_PULL_EVENT ), any ( Bundle . class ));
118
- assertThat ( FAKE_LOGS ). hasSize ( 2 );
119
-
120
- Bundle params1 = new Bundle ();
121
- params1 . putString ( ARM_KEY , "id1" );
122
- params1 . putString ( ARM_VALUE , "value1" );
123
- assertThat ( FAKE_LOGS . get ( 0 ) .toString ()). isEqualTo ( params1 . toString ());
124
-
125
- Bundle params2 = new Bundle ();
126
- params2 . putString ( ARM_KEY , "id2" );
127
- params2 . putString ( ARM_VALUE , "value2" );
128
- assertThat ( FAKE_LOGS . get ( 1 ). toString ()). isEqualTo ( params2 . toString () );
152
+ .logEvent (eq ( ANALYTICS_ORIGIN_PERSONALIZATION ), eq ( EXTERNAL_EVENT ), any ( Bundle . class ));
153
+ verify ( mockAnalyticsConnector , times ( 2 ))
154
+ . logEvent ( eq ( ANALYTICS_ORIGIN_PERSONALIZATION ), eq ( INTERNAL_EVENT ), any ( Bundle . class ) );
155
+ assertThat ( FAKE_LOGS ). hasSize ( 4 );
156
+
157
+ assertThat ( FAKE_LOGS )
158
+ . comparingElementsUsing ( TO_STRING )
159
+ . containsAtLeast ( LOG_PARAMS_1 .toString (), LOG_PARAMS_2 . toString ())
160
+ . inOrder ();
161
+ assertThat ( FAKE_LOGS )
162
+ . comparingElementsUsing ( TO_STRING )
163
+ . containsAtLeast ( INTERNAL_LOG_PARAMS_1 . toString (), INTERNAL_LOG_PARAMS_2 . toString ())
164
+ . inOrder ( );
129
165
}
130
166
}
0 commit comments