Skip to content

Commit

Permalink
changes to ensure if no object is opened user won't be able to add pr…
Browse files Browse the repository at this point in the history
…op in the object
  • Loading branch information
shivamsehgal committed Aug 21, 2023
1 parent 1e7625b commit 4ff675d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 6 deletions.
4 changes: 4 additions & 0 deletions gson/src/main/java/com/google/gson/stream/JsonWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,10 @@ public JsonWriter name(String name) throws IOException {
if (stackSize == 0) {
throw new IllegalStateException("JsonWriter is closed.");
}
// As currently in any valid case name function cannot be called if stack top has these 2 statuses
if (stackSize == 1 && ( peek() == EMPTY_DOCUMENT || peek() == NONEMPTY_DOCUMENT )) {
throw new IllegalStateException("Please begin an object before this.");
}
deferredName = name;
return this;
}
Expand Down
37 changes: 31 additions & 6 deletions gson/src/test/java/com/google/gson/stream/JsonWriterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

@SuppressWarnings("resource")
public final class JsonWriterTest {
Expand Down Expand Up @@ -114,13 +116,36 @@ public void testTopLevelValueTypes() throws IOException {
public void testInvalidTopLevelTypes() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.name("hello"); // TODO: This should throw, see https://github.com/google/gson/issues/2407
try {
jsonWriter.value("world");
fail();
} catch (IllegalStateException expected) {
assertThat(expected).hasMessageThat().isEqualTo("Nesting problem.");
assertThrows(IllegalStateException.class, () -> jsonWriter.name("hello"));
//removed nested exception test on jsonwriter.writevalue as it seems currently valid case per code
}

@Test
public void closeAllObjectsAndTryToAddElements() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a").value(20);
jsonWriter.name("age").value(30);

// Start the nested "address" object
jsonWriter.name("address").beginObject();
jsonWriter.name("city").value("New York");
jsonWriter.name("country").value("USA");
jsonWriter.endObject(); // End the nested "address" object
jsonWriter.name("random_prop").value(78);
// Add an array of phone numbers (list of numbers)
List<Integer> phoneNumbers = Arrays.asList(1234567890, 98989, 9909);
jsonWriter.name("phoneNumbers").beginArray();
for (Integer phoneNumber : phoneNumbers) {
jsonWriter.value(phoneNumber);
}
jsonWriter.endArray(); // End the array
jsonWriter.endObject(); // End the outer object
assertThrows(IllegalStateException.class, () -> jsonWriter.name("this_throw_exception_as_all_objects_are_closed"));
assertThrows(IllegalStateException.class, () -> jsonWriter.value("this_throw_exception_as_only_one_top_level_entry"));
jsonWriter.close();

}

@Test
Expand Down

0 comments on commit 4ff675d

Please sign in to comment.