Skip to content

Commit 141830d

Browse files
authored
Check for missing metadata when constructing ConfigContainer. (#2217)
1 parent ddccf8e commit 141830d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigContainer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,18 @@ private ConfigContainer(
8686
* <p>The {@code containerJson} must not be modified.
8787
*/
8888
static ConfigContainer copyOf(JSONObject containerJson) throws JSONException {
89+
// Personalization metadata may not have been written yet.
90+
JSONObject personalizationMetadataJSON =
91+
containerJson.optJSONObject(PERSONALIZATION_METADATA_KEY);
92+
if (personalizationMetadataJSON == null) {
93+
personalizationMetadataJSON = new JSONObject();
94+
}
95+
8996
return new ConfigContainer(
9097
containerJson.getJSONObject(CONFIGS_KEY),
9198
new Date(containerJson.getLong(FETCH_TIME_KEY)),
9299
containerJson.getJSONArray(ABT_EXPERIMENTS_KEY),
93-
containerJson.getJSONObject(PERSONALIZATION_METADATA_KEY));
100+
personalizationMetadataJSON);
94101
}
95102

96103
/**

firebase-config/src/test/java/com/google/firebase/remoteconfig/internal/ConfigStorageClientTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@
2323
import java.io.BufferedReader;
2424
import java.io.FileInputStream;
2525
import java.io.FileNotFoundException;
26+
import java.io.FileOutputStream;
2627
import java.io.InputStreamReader;
28+
import java.nio.charset.StandardCharsets;
2729
import java.util.Date;
30+
import org.json.JSONObject;
2831
import org.junit.Before;
2932
import org.junit.Test;
3033
import org.junit.runner.RunWith;
@@ -82,6 +85,36 @@ public void read_validContainer_returnsContainer() throws Exception {
8285
assertThat(container).isEqualTo(configContainer);
8386
}
8487

88+
@Test
89+
public void read_validContainerWithPersonalization_returnsContainer() throws Exception {
90+
ConfigContainer configWithPersonalization =
91+
ConfigContainer.newBuilder(configContainer)
92+
.withPersonalizationMetadata(
93+
new JSONObject(ImmutableMap.of(Personalization.ARM_KEY, "arm_value")))
94+
.build();
95+
storageClient.write(configWithPersonalization);
96+
Preconditions.checkArgument(getFileAsString().equals(configWithPersonalization.toString()));
97+
98+
ConfigContainer container = storageClient.read();
99+
assertThat(container).isEqualTo(configWithPersonalization);
100+
}
101+
102+
@Test
103+
public void read_validContainerWithoutPersonalization_returnsContainer() throws Exception {
104+
// Configs written by SDK versions <20.0.1 do not contain personalization metadata.
105+
// Since the serialized configContainer contains personalization metadata, we manually remove it
106+
// and write the config to disk directly to test.
107+
JSONObject configJSON = new JSONObject(configContainer.toString());
108+
configJSON.remove(ConfigContainer.PERSONALIZATION_METADATA_KEY);
109+
110+
try (FileOutputStream outputStream = context.openFileOutput(FILE_NAME, Context.MODE_PRIVATE)) {
111+
outputStream.write(configJSON.toString().getBytes(StandardCharsets.UTF_8));
112+
}
113+
114+
ConfigContainer container = storageClient.read();
115+
assertThat(container).isEqualTo(configContainer);
116+
}
117+
85118
@Test
86119
public void read_emptyFile_returnsNull() throws Exception {
87120
ConfigContainer container = storageClient.read();

0 commit comments

Comments
 (0)