|
18 | 18 | */
|
19 | 19 | package org.apache.johnzon.core;
|
20 | 20 |
|
| 21 | +import org.junit.Ignore; |
21 | 22 | import org.junit.Test;
|
22 | 23 |
|
| 24 | +import javax.json.Json; |
| 25 | +import javax.json.JsonReader; |
| 26 | +import javax.json.JsonReaderFactory; |
| 27 | +import javax.json.spi.JsonProvider; |
23 | 28 | import javax.json.stream.JsonParser;
|
24 | 29 | import java.io.ByteArrayInputStream;
|
25 | 30 | import java.io.IOException;
|
| 31 | +import java.io.StringReader; |
26 | 32 | import java.nio.charset.StandardCharsets;
|
27 | 33 | import java.util.ArrayList;
|
| 34 | +import java.util.Collections; |
28 | 35 | import java.util.List;
|
29 | 36 |
|
30 | 37 | import static java.util.Arrays.asList;
|
31 | 38 | import static java.util.Collections.emptyMap;
|
32 | 39 | import static org.junit.Assert.assertEquals;
|
| 40 | +import static org.junit.Assert.assertTrue; |
33 | 41 |
|
34 | 42 | public class JsonStreamParserImplTest {
|
35 | 43 | @Test
|
@@ -63,4 +71,80 @@ public void ensureNoArrayBoundErrorWhenOverflow() throws IOException {
|
63 | 71 | asList("START_OBJECT", "KEY_NAME", "VALUE_STRING", "{\"foo\":\"barbar\\barbarbar\"}", "END_OBJECT"),
|
64 | 72 | events);
|
65 | 73 | }
|
| 74 | + |
| 75 | + @Test |
| 76 | + @Ignore("No real test, just run directly from your IDE") |
| 77 | + public void largeStringPerformance() { |
| 78 | + StringBuilder jsonBuilder = new StringBuilder("{\"data\":\""); |
| 79 | + for (int i = 0; i < 50 * 1024 * 1024 + 1; i++) { |
| 80 | + jsonBuilder.append("a"); |
| 81 | + } |
| 82 | + jsonBuilder.append("\"}"); |
| 83 | + String json = jsonBuilder.toString(); |
| 84 | + |
| 85 | + // Warmup |
| 86 | + for (int i = 0; i < 10; i++) { |
| 87 | + try (JsonReader reader = Json.createReader(new StringReader(json))) { |
| 88 | + reader.readObject(); |
| 89 | + } |
| 90 | + } |
| 91 | + |
| 92 | + long start = System.currentTimeMillis(); |
| 93 | + try (JsonReader reader = Json.createReader(new StringReader(json))) { |
| 94 | + reader.readObject(); |
| 95 | + } |
| 96 | + System.err.println("Took " + (System.currentTimeMillis() - start) + "ms"); |
| 97 | + } |
| 98 | + |
| 99 | + @Test |
| 100 | + public void allBuffersReleased() { |
| 101 | + StringBuilder jsonBuilder = new StringBuilder("{\"data\":\""); |
| 102 | + for (int i = 0; i < JsonParserFactoryImpl.DEFAULT_MAX_STRING_LENGTH * 2; i++) { |
| 103 | + jsonBuilder.append("a"); |
| 104 | + } |
| 105 | + jsonBuilder.append("\"}"); |
| 106 | + String json = jsonBuilder.toString(); |
| 107 | + |
| 108 | + JsonReaderFactory readerFactory = JsonProvider.provider().createReaderFactory(Collections.singletonMap( |
| 109 | + JsonParserFactoryImpl.BUFFER_STRATEGY, TrackingBufferStrategy.class.getName())); |
| 110 | + |
| 111 | + try (JsonReader reader = readerFactory.createReader(new StringReader(json))) { |
| 112 | + reader.readObject(); |
| 113 | + } |
| 114 | + |
| 115 | + assertTrue(TrackingBufferStrategy.TrackingBufferProvider.borrowed.isEmpty()); |
| 116 | + } |
| 117 | + |
| 118 | + public static class TrackingBufferStrategy implements BufferStrategy { |
| 119 | + private final BufferStrategy delegate = BufferStrategyFactory.valueOf("BY_INSTANCE"); |
| 120 | + |
| 121 | + @Override |
| 122 | + public BufferProvider<char[]> newCharProvider(int size) { |
| 123 | + return new TrackingBufferProvider(delegate.newCharProvider(size)); |
| 124 | + } |
| 125 | + |
| 126 | + public static class TrackingBufferProvider implements BufferStrategy.BufferProvider<char[]> { |
| 127 | + protected static List<char[]> borrowed = new ArrayList<>(); |
| 128 | + |
| 129 | + private final BufferStrategy.BufferProvider<char[]> delegate; |
| 130 | + |
| 131 | + public TrackingBufferProvider(BufferStrategy.BufferProvider<char[]> delegate) { |
| 132 | + this.delegate = delegate; |
| 133 | + } |
| 134 | + |
| 135 | + @Override |
| 136 | + public char[] newBuffer() { |
| 137 | + char[] result = delegate.newBuffer(); |
| 138 | + borrowed.add(result); |
| 139 | + |
| 140 | + return result; |
| 141 | + } |
| 142 | + |
| 143 | + @Override |
| 144 | + public void release(char[] value) { |
| 145 | + borrowed.remove(value); |
| 146 | + delegate.release(value); |
| 147 | + } |
| 148 | + } |
| 149 | + } |
66 | 150 | }
|
0 commit comments