Fuzz61198_1169_NumberParseTest.java

package com.fasterxml.jackson.core.fuzz;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.json.JsonReadFeature;

import static org.junit.jupiter.api.Assertions.fail;

// For
//
// * [core#1169],
// * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61198
class Fuzz61198_1169_NumberParseTest extends JUnit5TestBase
{
    // NOTE! Not enough to enable just first, but both it seem
    private final JsonFactory JSON_F = JsonFactory.builder()
            .enable(JsonReadFeature.ALLOW_LEADING_PLUS_SIGN_FOR_NUMBERS)
            .enable(JsonReadFeature.ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS)
            .build();

    @Test
    void leadingPlusSignMalformedBytes() throws Exception {
        _testLeadingPlusMalformed(JSON_F, MODE_INPUT_STREAM);
        _testLeadingPlusMalformed(JSON_F, MODE_INPUT_STREAM_THROTTLED);
    }

    @Test
    void leadingPlusSignMalformedReader() throws Exception {
        _testLeadingPlusMalformed(JSON_F, MODE_READER);
        _testLeadingPlusMalformed(JSON_F, MODE_READER_THROTTLED);
    }

    @Test
    void leadingPlusSignMalformedOther() throws Exception {
        _testLeadingPlusMalformed(JSON_F, MODE_DATA_INPUT);
    }

    private void _testLeadingPlusMalformed(JsonFactory f, int mode) throws Exception
    {
        // But also, invalid case:
        try (JsonParser p = createParser(f, mode, "[ +X  1 ")) {
            assertToken(JsonToken.START_ARRAY, p.nextToken());
            try {
                JsonToken t = p.nextToken();
                assertToken(JsonToken.VALUE_NUMBER_INT, t);
                // Either one works:
//                p.getNumberType();
                p.getIntValue();
                fail("Should not pass, got: "+t);
            } catch (JsonParseException e) {
                verifyException(e, "Unexpected character ('X' (code 88");
            }
        }
    }
    
}