TestOverflow.java

package net.minidev.json.test;

import static net.minidev.json.parser.JSONParser.DEFAULT_PERMISSIVE_MODE;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

import net.minidev.json.JSONArray;
import net.minidev.json.JSONValue;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.parser.ParseException;
import org.junit.jupiter.api.Test;

public class TestOverflow {
  @Test
  public void stressTest() throws Exception {
    int size = 10000;
    StringBuilder sb = new StringBuilder(10 + size * 4);
    for (int i = 0; i < size; i++) {
      sb.append("{a:");
    }
    sb.append("true");
    for (int i = 0; i < size; i++) {
      sb.append("}");
    }
    String s = sb.toString();
    try {
      JSONValue.parseWithException(s);
    } catch (ParseException e) {
      assertEquals(e.getErrorType(), ParseException.ERROR_UNEXPECTED_JSON_DEPTH);
      return;
    }
    fail();
  }

  @Test
  public void shouldNotFailWhenInfiniteJsonDepth() throws Exception {
    int size = 500;
    StringBuilder sb = new StringBuilder(10 + size * 4);
    for (int i = 0; i < size; i++) {
      sb.append("{a:");
    }
    sb.append("true");
    for (int i = 0; i < size; i++) {
      sb.append("}");
    }
    String s = sb.toString();
    try {
      JSONParser parser = new JSONParser(DEFAULT_PERMISSIVE_MODE & ~JSONParser.LIMIT_JSON_DEPTH);
      parser.parse(s, JSONValue.defaultReader.DEFAULT);
    } catch (ParseException e) {
      fail();
    }
  }

  @Test
  public void shouldNotFailParsingArraysWith400Elements() throws Exception {
    int size = 400;
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for (int i = 0; i < size; i++) {
      sb.append("{a:true}");
      if (i + 1 < size) {
        sb.append(",");
      }
    }
    sb.append("]");
    String s = sb.toString();
    JSONArray array = (JSONArray) JSONValue.parseWithException(s);
    assertEquals(array.size(), size);
  }
}