1 package com.fasterxml.jackson.databind.node; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.StringReader; 5 import java.nio.charset.StandardCharsets; 6 7 import com.fasterxml.jackson.core.JsonParser; 8 import com.fasterxml.jackson.core.TreeNode; 9 import com.fasterxml.jackson.databind.*; 10 11 /** 12 * Tests to verify handling of empty content with "readTree()" 13 */ 14 public class EmptyContentAsTreeTest extends BaseMapTest 15 { 16 private final ObjectMapper MAPPER = objectMapper(); 17 18 private final String EMPTY0 = ""; 19 private final byte[] EMPTY0_BYTES = EMPTY0.getBytes(StandardCharsets.UTF_8); 20 private final String EMPTY1 = " \n\t "; 21 private final byte[] EMPTY1_BYTES = EMPTY1.getBytes(StandardCharsets.UTF_8); 22 23 // [databind#1406]: when passing `JsonParser`, indicate lack of content 24 // by returning `null` 25 testNullFromEOFWithParserAndMapper()26 public void testNullFromEOFWithParserAndMapper() throws Exception 27 { 28 try (JsonParser p = MAPPER.createParser(EMPTY0)) { 29 _assertNullTree(MAPPER.readTree(p)); 30 } 31 try (JsonParser p = MAPPER.createParser(EMPTY1)) { 32 _assertNullTree(MAPPER.readTree(p)); 33 } 34 try (JsonParser p = MAPPER.createParser(new StringReader(EMPTY0))) { 35 _assertNullTree(MAPPER.readTree(p)); 36 } 37 try (JsonParser p = MAPPER.createParser(new StringReader(EMPTY1))) { 38 _assertNullTree(MAPPER.readTree(p)); 39 } 40 41 try (JsonParser p = MAPPER.createParser(EMPTY0_BYTES)) { 42 _assertNullTree(MAPPER.readTree(p)); 43 } 44 try (JsonParser p = MAPPER.createParser(EMPTY1_BYTES)) { 45 _assertNullTree(MAPPER.readTree(p)); 46 } 47 try (JsonParser p = MAPPER.createParser(EMPTY1_BYTES, 0, EMPTY1_BYTES.length)) { 48 _assertNullTree(MAPPER.readTree(p)); 49 } 50 try (JsonParser p = MAPPER.createParser(new ByteArrayInputStream(EMPTY0_BYTES))) { 51 _assertNullTree(MAPPER.readTree(p)); 52 } 53 try (JsonParser p = MAPPER.createParser(new ByteArrayInputStream(EMPTY1_BYTES))) { 54 _assertNullTree(MAPPER.readTree(p)); 55 } 56 } 57 58 // [databind#1406] testNullFromEOFWithParserAndReader()59 public void testNullFromEOFWithParserAndReader() throws Exception 60 { 61 try (JsonParser p = MAPPER.createParser(EMPTY0)) { 62 _assertNullTree(MAPPER.reader().readTree(p)); 63 } 64 try (JsonParser p = MAPPER.createParser(EMPTY1)) { 65 _assertNullTree(MAPPER.reader().readTree(p)); 66 } 67 try (JsonParser p = MAPPER.createParser(new StringReader(EMPTY0))) { 68 _assertNullTree(MAPPER.reader().readTree(p)); 69 } 70 try (JsonParser p = MAPPER.createParser(new StringReader(EMPTY1))) { 71 _assertNullTree(MAPPER.reader().readTree(p)); 72 } 73 74 try (JsonParser p = MAPPER.createParser(EMPTY0_BYTES)) { 75 _assertNullTree(MAPPER.reader().readTree(p)); 76 } 77 try (JsonParser p = MAPPER.createParser(EMPTY1_BYTES)) { 78 _assertNullTree(MAPPER.reader().readTree(p)); 79 } 80 try (JsonParser p = MAPPER.createParser(EMPTY1_BYTES, 0, EMPTY1_BYTES.length)) { 81 _assertNullTree(MAPPER.reader().readTree(p)); 82 } 83 84 try (JsonParser p = MAPPER.createParser(new ByteArrayInputStream(EMPTY0_BYTES))) { 85 _assertNullTree(MAPPER.reader().readTree(p)); 86 } 87 try (JsonParser p = MAPPER.createParser(new ByteArrayInputStream(EMPTY1_BYTES))) { 88 _assertNullTree(MAPPER.reader().readTree(p)); 89 } 90 } 91 92 // [databind#2211]: when passing content sources OTHER than `JsonParser`, 93 // return "missing node" instead of alternate (return `null`, throw exception). testMissingNodeForEOFOtherMapper()94 public void testMissingNodeForEOFOtherMapper() throws Exception 95 { 96 _assertMissing(MAPPER.readTree(EMPTY0)); 97 _assertMissing(MAPPER.readTree(EMPTY1)); 98 _assertMissing(MAPPER.readTree(new StringReader(EMPTY0))); 99 _assertMissing(MAPPER.readTree(new StringReader(EMPTY1))); 100 101 _assertMissing(MAPPER.readTree(EMPTY0_BYTES)); 102 _assertMissing(MAPPER.readTree(EMPTY0_BYTES, 0, EMPTY0_BYTES.length)); 103 _assertMissing(MAPPER.readTree(new ByteArrayInputStream(EMPTY0_BYTES))); 104 _assertMissing(MAPPER.readTree(EMPTY1_BYTES)); 105 _assertMissing(MAPPER.readTree(EMPTY1_BYTES, 0, EMPTY1_BYTES.length)); 106 _assertMissing(MAPPER.readTree(new ByteArrayInputStream(EMPTY1_BYTES))); 107 108 // Assume File, URL, etc are fine. Note: `DataInput` probably can't be made to 109 // work since it can not easily/gracefully handle unexpected end-of-input 110 } 111 testMissingNodeViaObjectReader()112 public void testMissingNodeViaObjectReader() throws Exception 113 { 114 _assertMissing(MAPPER.reader().readTree(EMPTY0)); 115 _assertMissing(MAPPER.reader().readTree(EMPTY1)); 116 _assertMissing(MAPPER.reader().readTree(new StringReader(EMPTY0))); 117 _assertMissing(MAPPER.reader().readTree(new StringReader(EMPTY1))); 118 119 _assertMissing(MAPPER.reader().readTree(EMPTY0_BYTES)); 120 _assertMissing(MAPPER.reader().readTree(EMPTY0_BYTES, 0, EMPTY0_BYTES.length)); 121 _assertMissing(MAPPER.reader().readTree(new ByteArrayInputStream(EMPTY0_BYTES))); 122 _assertMissing(MAPPER.reader().readTree(EMPTY1_BYTES)); 123 _assertMissing(MAPPER.reader().readTree(EMPTY1_BYTES, 0, EMPTY1_BYTES.length)); 124 _assertMissing(MAPPER.reader().readTree(new ByteArrayInputStream(EMPTY1_BYTES))); 125 } 126 _assertNullTree(TreeNode n)127 private void _assertNullTree(TreeNode n) { 128 if (n != null) { 129 fail("Should get `null` for reads with `JsonParser`, instead got: "+n.getClass().getName()); 130 } 131 } 132 _assertMissing(JsonNode n)133 private void _assertMissing(JsonNode n) { 134 assertNotNull("Should not get `null` but `MissingNode`", n); 135 if (!n.isMissingNode()) { 136 fail("Should get `MissingNode` but got: "+n.getClass().getName()); 137 } 138 } 139 } 140