• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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