Skip to content

Commit 7227fb9

Browse files
committed
update
1 parent 6052f8c commit 7227fb9

File tree

3 files changed

+80
-22
lines changed

3 files changed

+80
-22
lines changed

firebase-common/src/main/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ private DefaultHeartBeatController(
150150
}
151151

152152
@Override
153-
@NonNull public HeartBeat getHeartBeatCode(@NonNull String heartBeatTag) {
153+
@NonNull
154+
public HeartBeat getHeartBeatCode(@NonNull String heartBeatTag) {
154155
long presentTime = System.currentTimeMillis();
155156
HeartBeatInfoStorage storage = storageProvider.get();
156157
boolean shouldSendGlobalHB = storage.shouldSendGlobalHeartBeat(presentTime);

firebase-common/src/main/java/com/google/firebase/heartbeatinfo/HeartBeatInfoStorage.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ synchronized void removeStoredDate(String dateString) {
101101
// Find stored heartbeat and clear it.
102102
String userAgentString = null;
103103
for (Map.Entry<String, ?> entry : firebaseSharedPreferences.getAll().entrySet()) {
104-
if(userAgentString != null) {
104+
if (userAgentString != null) {
105105
break;
106106
}
107107
if (entry.getValue() instanceof Set) {
@@ -114,12 +114,12 @@ synchronized void removeStoredDate(String dateString) {
114114
}
115115
}
116116
}
117-
if(userAgentString == null) {
117+
if (userAgentString == null) {
118118
return;
119119
}
120120
Set<String> userAgentDateSet =
121-
new HashSet<String>(
122-
firebaseSharedPreferences.getStringSet(userAgentString, new HashSet<String>()));
121+
new HashSet<String>(
122+
firebaseSharedPreferences.getStringSet(userAgentString, new HashSet<String>()));
123123
userAgentDateSet.remove(dateString);
124124
if (userAgentDateSet.isEmpty()) {
125125
firebaseSharedPreferences.edit().remove(userAgentString).commit();

firebase-common/src/test/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatControllerTest.java

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
import static org.mockito.Mockito.when;
2424

2525
import android.content.Context;
26-
26+
import android.content.SharedPreferences;
2727
import androidx.test.core.app.ApplicationProvider;
28-
28+
import androidx.test.runner.AndroidJUnit4;
2929
import com.google.firebase.platforminfo.UserAgentPublisher;
3030
import java.util.ArrayList;
3131
import java.util.Base64;
@@ -37,21 +37,22 @@
3737
import java.util.concurrent.LinkedBlockingQueue;
3838
import java.util.concurrent.ThreadPoolExecutor;
3939
import java.util.concurrent.TimeUnit;
40+
import org.json.JSONArray;
4041
import org.json.JSONException;
42+
import org.json.JSONObject;
4143
import org.junit.Before;
4244
import org.junit.Test;
4345
import org.junit.runner.RunWith;
44-
import org.junit.runners.JUnit4;
4546

46-
@RunWith(JUnit4.class)
47+
@RunWith(AndroidJUnit4.class)
4748
public class DefaultHeartBeatControllerTest {
4849
private ExecutorService executor;
4950
private TestOnCompleteListener<Void> storeOnCompleteListener;
5051
private TestOnCompleteListener<String> getOnCompleteListener;
5152
private final String DEFAULT_USER_AGENT = "agent1";
5253
private HeartBeatInfoStorage storage = mock(HeartBeatInfoStorage.class);
5354
private UserAgentPublisher publisher = mock(UserAgentPublisher.class);
54-
private static Context applicationContext = mock(Context.class);
55+
private static Context applicationContext = ApplicationProvider.getApplicationContext();
5556
private final Set<HeartBeatConsumer> logSources =
5657
new HashSet<HeartBeatConsumer>() {
5758
{
@@ -67,13 +68,15 @@ public void setUp() {
6768
storeOnCompleteListener = new TestOnCompleteListener<>();
6869
getOnCompleteListener = new TestOnCompleteListener<>();
6970
heartBeatController =
70-
new DefaultHeartBeatController(() -> storage, logSources, executor, () -> publisher, applicationContext);
71+
new DefaultHeartBeatController(
72+
() -> storage, logSources, executor, () -> publisher, applicationContext);
7173
}
7274

7375
@Test
7476
public void whenNoSource_dontStoreHeartBeat() throws ExecutionException, InterruptedException {
7577
DefaultHeartBeatController controller =
76-
new DefaultHeartBeatController(() -> storage, new HashSet<>(), executor, () -> publisher, applicationContext);
78+
new DefaultHeartBeatController(
79+
() -> storage, new HashSet<>(), executor, () -> publisher, applicationContext);
7780
controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener);
7881
storeOnCompleteListener.await();
7982
verify(storage, times(0)).storeHeartBeat(anyLong(), anyString());
@@ -110,9 +113,58 @@ public void generateHeartBeat_oneHeartBeat()
110113
String expected =
111114
Base64.getEncoder()
112115
.encodeToString(
113-
"{\"heartbeats\":[{\"date\":[\"2015-02-03\"],\"agent\":\"test-agent\"}],\"version\":\"2\"}"
116+
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"date\":\"[2015-02-03]\"}],\"version\":\"2\"}"
114117
.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);
116168
}
117169

118170
@Test
@@ -136,12 +188,17 @@ public void generateHeartBeat_twoHeartBeatsSameUserAgent()
136188
heartBeatController
137189
.getHeartBeatsHeader()
138190
.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);
145202
}
146203

147204
@Test
@@ -170,8 +227,8 @@ public void generateHeartBeat_twoHeartBeatstwoUserAgents()
170227
String expected =
171228
Base64.getEncoder()
172229
.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\"}"
174231
.getBytes());
175-
assertThat(getOnCompleteListener.await()).isEqualTo(expected);
232+
assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected);
176233
}
177234
}

0 commit comments

Comments
 (0)