Skip to content

Commit 9dec703

Browse files
authored
Fix the way of gzipping and base64. This is now consistent with server (#3414)
* push test pr * fix platform logging header request * small fixes * use try * fix tests * use strings * update * gJF
1 parent e8659b5 commit 9dec703

File tree

3 files changed

+39
-65
lines changed

3 files changed

+39
-65
lines changed

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import android.content.Context;
1818
import android.util.Base64;
19+
import android.util.Base64OutputStream;
1920
import androidx.annotation.NonNull;
2021
import androidx.annotation.VisibleForTesting;
2122
import androidx.core.os.UserManagerCompat;
@@ -95,19 +96,20 @@ public Task<String> getHeartBeatsHeader() {
9596
HeartBeatResult result = allHeartBeats.get(i);
9697
JSONObject obj = new JSONObject();
9798
obj.put("agent", result.getUserAgent());
98-
obj.put("date", result.getUsedDates());
99+
obj.put("dates", new JSONArray(result.getUsedDates()));
99100
array.put(obj);
100101
}
101102
JSONObject output = new JSONObject();
102103
output.put("heartbeats", array);
103104
output.put("version", "2");
104105
ByteArrayOutputStream out = new ByteArrayOutputStream();
105-
GZIPOutputStream gzip = new GZIPOutputStream(out);
106-
gzip.write(output.toString().getBytes());
107-
gzip.close();
108-
return Base64.encodeToString(
109-
out.toString("UTF-8").getBytes(),
110-
Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
106+
try (Base64OutputStream b64os =
107+
new Base64OutputStream(
108+
out, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
109+
GZIPOutputStream gzip = new GZIPOutputStream(b64os); ) {
110+
gzip.write(output.toString().getBytes("UTF-8"));
111+
}
112+
return out.toString("UTF-8");
111113
}
112114
});
113115
}

firebase-common/src/test/java/android/util/Base64.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

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

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.google.firebase.heartbeatinfo;
1616

1717
import static com.google.common.truth.Truth.assertThat;
18+
import static java.nio.charset.StandardCharsets.UTF_8;
1819
import static org.mockito.ArgumentMatchers.anyLong;
1920
import static org.mockito.ArgumentMatchers.anyString;
2021
import static org.mockito.Mockito.mock;
@@ -40,9 +41,7 @@
4041
import java.util.concurrent.ThreadPoolExecutor;
4142
import java.util.concurrent.TimeUnit;
4243
import java.util.zip.GZIPOutputStream;
43-
import org.json.JSONArray;
4444
import org.json.JSONException;
45-
import org.json.JSONObject;
4645
import org.junit.Before;
4746
import org.junit.Test;
4847
import org.junit.runner.RunWith;
@@ -115,13 +114,9 @@ public void generateHeartBeat_oneHeartBeat()
115114
heartBeatController
116115
.getHeartBeatsHeader()
117116
.addOnCompleteListener(executor, getOnCompleteListener);
118-
String expected =
119-
Base64.getUrlEncoder()
120-
.withoutPadding()
121-
.encodeToString(
122-
compress(
123-
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"date\":\"[2015-02-03]\"}],\"version\":\"2\"}")
124-
.getBytes());
117+
String str =
118+
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-02-03\"]}],\"version\":\"2\"}";
119+
String expected = compress(str);
125120
assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected);
126121
}
127122

@@ -162,10 +157,7 @@ public void firstOldThenNew_synchronizedCorrectly()
162157
DefaultHeartBeatController controller =
163158
new DefaultHeartBeatController(
164159
() -> heartBeatInfoStorage, logSources, executor, () -> publisher, context);
165-
String emptyString =
166-
Base64.getUrlEncoder()
167-
.withoutPadding()
168-
.encodeToString(compress("{\"heartbeats\":[],\"version\":\"2\"}").getBytes());
160+
String emptyString = compress("{\"heartbeats\":[],\"version\":\"2\"}");
169161
controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener);
170162
storeOnCompleteListener.await();
171163
int heartBeatCode = controller.getHeartBeatCode("test").getCode();
@@ -202,27 +194,32 @@ public void generateHeartBeat_twoHeartBeatsSameUserAgent()
202194
heartBeatController
203195
.getHeartBeatsHeader()
204196
.addOnCompleteListener(executor, getOnCompleteListener);
205-
JSONObject output = new JSONObject();
206-
JSONArray array = new JSONArray();
207-
JSONObject obj = new JSONObject();
208-
obj.put("agent", "test-agent");
209-
obj.put("date", dateList);
210-
array.put(obj);
211-
output.put("heartbeats", array);
212-
output.put("version", "2");
213-
String expected =
214-
Base64.getUrlEncoder()
215-
.withoutPadding()
216-
.encodeToString(compress(output.toString()).getBytes());
197+
String str =
198+
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-03-02\",\"2015-03-01\"]}],\"version\":\"2\"}";
199+
String expected = compress(str);
217200
assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected);
218201
}
219202

203+
private static String base64Encode(byte[] input) {
204+
return Base64.getUrlEncoder().withoutPadding().encodeToString(input);
205+
}
206+
207+
private static byte[] gzip(String input) {
208+
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
209+
try {
210+
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteOutputStream)) {
211+
gzipOutputStream.write(input.getBytes(UTF_8));
212+
}
213+
byte[] gzipped = byteOutputStream.toByteArray();
214+
byteOutputStream.close();
215+
return gzipped;
216+
} catch (IOException e) {
217+
return null;
218+
}
219+
}
220+
220221
private String compress(String str) throws IOException {
221-
ByteArrayOutputStream out = new ByteArrayOutputStream();
222-
GZIPOutputStream gzip = new GZIPOutputStream(out);
223-
gzip.write(str.toString().getBytes());
224-
gzip.close();
225-
return out.toString("UTF-8");
222+
return base64Encode(gzip(str));
226223
}
227224

228225
@Config(sdk = 29)
@@ -250,13 +247,9 @@ public void generateHeartBeat_twoHeartBeatstwoUserAgents()
250247
heartBeatController
251248
.getHeartBeatsHeader()
252249
.addOnCompleteListener(executor, getOnCompleteListener);
253-
String expected =
254-
Base64.getUrlEncoder()
255-
.withoutPadding()
256-
.encodeToString(
257-
compress(
258-
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"date\":\"[2015-03-02]\"},{\"agent\":\"test-agent-1\",\"date\":\"[2015-03-03]\"}],\"version\":\"2\"}")
259-
.getBytes());
250+
String str =
251+
"{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-03-02\"]},{\"agent\":\"test-agent-1\",\"dates\":[\"2015-03-03\"]}],\"version\":\"2\"}";
252+
String expected = compress(str);
260253
assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected);
261254
}
262255
}

0 commit comments

Comments
 (0)