23
23
import static org .mockito .Mockito .when ;
24
24
25
25
import android .content .Context ;
26
-
26
+ import android . content . SharedPreferences ;
27
27
import androidx .test .core .app .ApplicationProvider ;
28
-
28
+ import androidx . test . runner . AndroidJUnit4 ;
29
29
import com .google .firebase .platforminfo .UserAgentPublisher ;
30
30
import java .util .ArrayList ;
31
31
import java .util .Base64 ;
37
37
import java .util .concurrent .LinkedBlockingQueue ;
38
38
import java .util .concurrent .ThreadPoolExecutor ;
39
39
import java .util .concurrent .TimeUnit ;
40
+ import org .json .JSONArray ;
40
41
import org .json .JSONException ;
42
+ import org .json .JSONObject ;
41
43
import org .junit .Before ;
42
44
import org .junit .Test ;
43
45
import org .junit .runner .RunWith ;
44
- import org .junit .runners .JUnit4 ;
45
46
46
- @ RunWith (JUnit4 .class )
47
+ @ RunWith (AndroidJUnit4 .class )
47
48
public class DefaultHeartBeatControllerTest {
48
49
private ExecutorService executor ;
49
50
private TestOnCompleteListener <Void > storeOnCompleteListener ;
50
51
private TestOnCompleteListener <String > getOnCompleteListener ;
51
52
private final String DEFAULT_USER_AGENT = "agent1" ;
52
53
private HeartBeatInfoStorage storage = mock (HeartBeatInfoStorage .class );
53
54
private UserAgentPublisher publisher = mock (UserAgentPublisher .class );
54
- private static Context applicationContext = mock ( Context . class );
55
+ private static Context applicationContext = ApplicationProvider . getApplicationContext ( );
55
56
private final Set <HeartBeatConsumer > logSources =
56
57
new HashSet <HeartBeatConsumer >() {
57
58
{
@@ -67,13 +68,15 @@ public void setUp() {
67
68
storeOnCompleteListener = new TestOnCompleteListener <>();
68
69
getOnCompleteListener = new TestOnCompleteListener <>();
69
70
heartBeatController =
70
- new DefaultHeartBeatController (() -> storage , logSources , executor , () -> publisher , applicationContext );
71
+ new DefaultHeartBeatController (
72
+ () -> storage , logSources , executor , () -> publisher , applicationContext );
71
73
}
72
74
73
75
@ Test
74
76
public void whenNoSource_dontStoreHeartBeat () throws ExecutionException , InterruptedException {
75
77
DefaultHeartBeatController controller =
76
- new DefaultHeartBeatController (() -> storage , new HashSet <>(), executor , () -> publisher , applicationContext );
78
+ new DefaultHeartBeatController (
79
+ () -> storage , new HashSet <>(), executor , () -> publisher , applicationContext );
77
80
controller .registerHeartBeat ().addOnCompleteListener (executor , storeOnCompleteListener );
78
81
storeOnCompleteListener .await ();
79
82
verify (storage , times (0 )).storeHeartBeat (anyLong (), anyString ());
@@ -110,9 +113,58 @@ public void generateHeartBeat_oneHeartBeat()
110
113
String expected =
111
114
Base64 .getEncoder ()
112
115
.encodeToString (
113
- "{\" heartbeats\" :[{\" date \" :[ \" 2015-02-03 \" ] ,\" agent \" :\" test-agent \" }],\" version\" :\" 2\" }"
116
+ "{\" heartbeats\" :[{\" agent \" :\" test-agent \" ,\" date \" :\" [2015-02-03] \" }],\" version\" :\" 2\" }"
114
117
.getBytes ());
115
- assertThat (getOnCompleteListener .await ()).isEqualTo (expected );
118
+ assertThat (getOnCompleteListener .await ().replace ("\n " , "" )).isEqualTo (expected );
119
+ }
120
+
121
+ @ Test
122
+ public void firstNewThenOld_synchronizedCorrectly ()
123
+ throws ExecutionException , InterruptedException {
124
+ Context context = ApplicationProvider .getApplicationContext ();
125
+ SharedPreferences heartBeatSharedPreferences =
126
+ context .getSharedPreferences ("testHeartBeat" , Context .MODE_PRIVATE );
127
+ HeartBeatInfoStorage heartBeatInfoStorage =
128
+ new HeartBeatInfoStorage (heartBeatSharedPreferences );
129
+ DefaultHeartBeatController controller =
130
+ new DefaultHeartBeatController (
131
+ () -> heartBeatInfoStorage , logSources , executor , () -> publisher , context );
132
+ String emptyString =
133
+ Base64 .getEncoder ().encodeToString ("{\" heartbeats\" :[],\" version\" :\" 2\" }" .getBytes ());
134
+ controller .registerHeartBeat ().addOnCompleteListener (executor , storeOnCompleteListener );
135
+ storeOnCompleteListener .await ();
136
+ controller .getHeartBeatsHeader ().addOnCompleteListener (executor , getOnCompleteListener );
137
+ String output = getOnCompleteListener .await ();
138
+ assertThat (output .replace ("\n " , "" )).isNotEqualTo (emptyString );
139
+ int heartBeatCode = controller .getHeartBeatCode ("test" ).getCode ();
140
+ assertThat (heartBeatCode ).isEqualTo (0 );
141
+ }
142
+
143
+ @ Test
144
+ public void firstOldThenNew_synchronizedCorrectly ()
145
+ throws ExecutionException , InterruptedException {
146
+ Context context = ApplicationProvider .getApplicationContext ();
147
+ SharedPreferences heartBeatSharedPreferences =
148
+ context .getSharedPreferences ("testHeartBeat" , Context .MODE_PRIVATE );
149
+ HeartBeatInfoStorage heartBeatInfoStorage =
150
+ new HeartBeatInfoStorage (heartBeatSharedPreferences );
151
+ DefaultHeartBeatController controller =
152
+ new DefaultHeartBeatController (
153
+ () -> heartBeatInfoStorage , logSources , executor , () -> publisher , context );
154
+ String emptyString =
155
+ Base64 .getEncoder ().encodeToString ("{\" heartbeats\" :[],\" version\" :\" 2\" }" .getBytes ());
156
+ controller .registerHeartBeat ().addOnCompleteListener (executor , storeOnCompleteListener );
157
+ storeOnCompleteListener .await ();
158
+ int heartBeatCode = controller .getHeartBeatCode ("test" ).getCode ();
159
+ assertThat (heartBeatCode ).isEqualTo (2 );
160
+ controller .getHeartBeatsHeader ().addOnCompleteListener (executor , getOnCompleteListener );
161
+ String output = getOnCompleteListener .await ();
162
+ assertThat (output .replace ("\n " , "" )).isEqualTo (emptyString );
163
+ controller .registerHeartBeat ().addOnCompleteListener (executor , storeOnCompleteListener );
164
+ storeOnCompleteListener .await ();
165
+ controller .getHeartBeatsHeader ().addOnCompleteListener (executor , getOnCompleteListener );
166
+ output = getOnCompleteListener .await ();
167
+ assertThat (output .replace ("\n " , "" )).isEqualTo (emptyString );
116
168
}
117
169
118
170
@ Test
@@ -136,12 +188,17 @@ public void generateHeartBeat_twoHeartBeatsSameUserAgent()
136
188
heartBeatController
137
189
.getHeartBeatsHeader ()
138
190
.addOnCompleteListener (executor , getOnCompleteListener );
139
- String expected =
140
- Base64 .getEncoder ()
141
- .encodeToString (
142
- "{\" heartbeats\" :[{\" date\" :[\" 2015-03-02\" ,\" 2015-03-01\" ],\" agent\" :\" test-agent\" }],\" version\" :\" 2\" }"
143
- .getBytes ());
144
- assertThat (getOnCompleteListener .await ()).isEqualTo (expected );
191
+ JSONObject output = new JSONObject ();
192
+ JSONArray array = new JSONArray ();
193
+ JSONObject obj = new JSONObject ();
194
+ ;
195
+ obj .put ("agent" , "test-agent" );
196
+ obj .put ("date" , dateList );
197
+ array .put (obj );
198
+ output .put ("heartbeats" , array );
199
+ output .put ("version" , "2" );
200
+ String expected = Base64 .getEncoder ().encodeToString (output .toString ().getBytes ());
201
+ assertThat (getOnCompleteListener .await ().replace ("\n " , "" )).isEqualTo (expected );
145
202
}
146
203
147
204
@ Test
@@ -170,8 +227,8 @@ public void generateHeartBeat_twoHeartBeatstwoUserAgents()
170
227
String expected =
171
228
Base64 .getEncoder ()
172
229
.encodeToString (
173
- "{\" heartbeats\" :[{\" date \" :[ \" 2015-03-02 \" ] ,\" agent \" :\" test-agent \" },{\" date \" :[ \" 2015-03-03 \" ] ,\" agent \" :\" test-agent-1 \" }],\" version\" :\" 2\" }"
230
+ "{\" heartbeats\" :[{\" agent \" :\" test-agent \" ,\" date \" :\" [2015-03-02] \" },{\" agent \" :\" test-agent-1 \" ,\" date \" :\" [2015-03-03] \" }],\" version\" :\" 2\" }"
174
231
.getBytes ());
175
- assertThat (getOnCompleteListener .await ()).isEqualTo (expected );
232
+ assertThat (getOnCompleteListener .await (). replace ( " \n " , "" ) ).isEqualTo (expected );
176
233
}
177
234
}
0 commit comments