diff --git a/.github/workflows/gradle-test.yml b/.github/workflows/gradle-test.yml new file mode 100644 index 00000000..1125c710 --- /dev/null +++ b/.github/workflows/gradle-test.yml @@ -0,0 +1,21 @@ +name: Run Gradle Tests + +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: corretto + + - name: Run Gradle test + run: ./gradlew test diff --git a/faunaJava/src/main/java/com/fauna/serialization/FaunaParser.java b/faunaJava/src/main/java/com/fauna/serialization/FaunaParser.java index 1d350130..2f72fb8c 100644 --- a/faunaJava/src/main/java/com/fauna/serialization/FaunaParser.java +++ b/faunaJava/src/main/java/com/fauna/serialization/FaunaParser.java @@ -90,7 +90,6 @@ public boolean read() throws IOException { case VALUE_STRING: currentFaunaTokenType = FaunaTokenType.STRING; break; - case NOT_AVAILABLE: case START_OBJECT: handleStartObject(); break; @@ -117,44 +116,20 @@ private void handleStartObject() throws IOException { switch (jsonParser.currentToken()) { case FIELD_NAME: switch (jsonParser.getText()) { - case DATE_TAG: - handleTaggedString(FaunaTokenType.DATE); - break; - case DOC_TAG: - advance(); - currentFaunaTokenType = FaunaTokenType.START_DOCUMENT; - tokenStack.push(FaunaTokenType.START_DOCUMENT); - break; - case DOUBLE_TAG: - handleTaggedString(FaunaTokenType.DOUBLE); - break; case INT_TAG: handleTaggedString(FaunaTokenType.INT); break; + case DATE_TAG: + case DOC_TAG: + case DOUBLE_TAG: case LONG_TAG: - handleTaggedString(FaunaTokenType.LONG); - break; case MOD_TAG: - handleTaggedString(FaunaTokenType.MODULE); - break; case OBJECT_TAG: - advance(); - currentFaunaTokenType = FaunaTokenType.START_OBJECT; - tokenStack.push(TokenTypeInternal.START_ESCAPED_OBJECT); - break; case REF_TAG: - advance(); - currentFaunaTokenType = FaunaTokenType.START_REF; - tokenStack.push(FaunaTokenType.START_REF); - break; case SET_TAG: - advance(); - currentFaunaTokenType = FaunaTokenType.START_PAGE; - tokenStack.push(FaunaTokenType.START_PAGE); - break; case TIME_TAG: - handleTaggedString(FaunaTokenType.TIME); - break; + throw new SerializationException( + "Token not implemented: " + jsonParser.currentToken()); default: bufferedFaunaTokenType = FaunaTokenType.FIELD_NAME; tokenStack.push(FaunaTokenType.START_OBJECT); @@ -163,12 +138,11 @@ private void handleStartObject() throws IOException { } break; case END_OBJECT: - bufferedFaunaTokenType = FaunaTokenType.END_OBJECT; - tokenStack.push(FaunaTokenType.START_OBJECT); - currentFaunaTokenType = FaunaTokenType.START_OBJECT; - break; + throw new SerializationException( + "Token not implemented: " + jsonParser.currentToken()); default: - throw new SerializationException("Unexpected token following StartObject: " + jsonParser.currentToken()); + throw new SerializationException( + "Unexpected token following StartObject: " + jsonParser.currentToken()); } } @@ -180,8 +154,7 @@ private void handleTaggedString(FaunaTokenType token) throws IOException { } private void advanceTrue() { - if (!advance()) - { + if (!advance()) { throw new SerializationException("Unexpected end of underlying JSON reader."); } } @@ -195,8 +168,10 @@ private boolean advance() { } private void validateTaggedType(FaunaTokenType type) { - if (currentFaunaTokenType != type || taggedTokenValue == null || !(taggedTokenValue instanceof String)) { - throw new IllegalStateException("CurrentTokenType is a " + currentFaunaTokenType.toString() + + if (currentFaunaTokenType != type || taggedTokenValue == null + || !(taggedTokenValue instanceof String)) { + throw new IllegalStateException( + "CurrentTokenType is a " + currentFaunaTokenType.toString() + ", not a " + type.toString() + "."); } } @@ -205,15 +180,16 @@ public String getValueAsString() { try { return jsonParser.getValueAsString(); } catch (IOException e) { - throw new RuntimeException("Error reading current token as String", e); + throw new RuntimeException("Error getting the current token as String", e); } } + public Integer getValueAsInt() { validateTaggedType(FaunaTokenType.INT); try { return Integer.parseInt(taggedTokenValue); } catch (NumberFormatException e) { - throw new RuntimeException("Error parsing the current token as Integer", e); + throw new RuntimeException("Error getting the current token as Integer", e); } } diff --git a/faunaJava/src/test/java/com/fauna/serialization/FaunaParserTest.java b/faunaJava/src/test/java/com/fauna/serialization/FaunaParserTest.java index 82d75a8f..7d1e896f 100644 --- a/faunaJava/src/test/java/com/fauna/serialization/FaunaParserTest.java +++ b/faunaJava/src/test/java/com/fauna/serialization/FaunaParserTest.java @@ -4,8 +4,10 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import com.fauna.common.enums.FaunaTokenType; +import com.fauna.exception.SerializationException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -39,6 +41,22 @@ public void testGetValueAsInt() throws IOException { ); assertReader(reader, expectedTokens); + + String invalidJson = "{\"@int\": \"abc\"}"; + InputStream invalidInputStream = new ByteArrayInputStream(invalidJson.getBytes()); + FaunaParser invalidReader = new FaunaParser(invalidInputStream); + + assertThrows(RuntimeException.class, invalidReader::getValueAsInt); + } + + @Test + public void testUnexpectedEndDuringAdvance() throws IOException { + + String json = "{\"@int\": \"123\""; + InputStream inputStream = new ByteArrayInputStream(json.getBytes()); + FaunaParser reader = new FaunaParser(inputStream); + + assertThrows(SerializationException.class, reader::read); } @Test diff --git a/gradlew b/gradlew old mode 100644 new mode 100755