Skip to content

Commit 998f429

Browse files
committed
Tests methods don't overflow
Testcase for #1864 and related -- hasText, data, parents could all overflow.
1 parent b5de45f commit 998f429

1 file changed

Lines changed: 43 additions & 2 deletions

File tree

src/test/java/org/jsoup/nodes/ElementIT.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.jsoup.nodes;
22

33
import org.jsoup.Jsoup;
4+
import org.jsoup.select.Elements;
45
import org.junit.jupiter.api.Test;
56

67
import java.util.List;
78

8-
import static org.junit.jupiter.api.Assertions.assertEquals;
9-
import static org.junit.jupiter.api.Assertions.assertTrue;
9+
import static org.junit.jupiter.api.Assertions.*;
1010

1111
public class ElementIT {
1212
@Test
@@ -78,4 +78,45 @@ public void testFastReparentExistingContent() {
7878

7979
assertTrue(runtime <= 10000);
8080
}
81+
82+
// These overflow tests take a couple seconds to run, so are in the slow tests
83+
@Test void hasTextNoOverflow() {
84+
// hasText() was recursive, so could overflow
85+
Document doc = new Document("https://example.com/");
86+
Element el = doc.body();
87+
for (int i = 0; i <= 50000; i++) {
88+
el = el.appendElement("p");
89+
}
90+
assertFalse(doc.hasText());
91+
el.text("Hello");
92+
assertTrue(doc.hasText());
93+
assertEquals(el.text(), doc.text());
94+
}
95+
96+
@Test void dataNoOverflow() {
97+
// data() was recursive, so could overflow
98+
Document doc = new Document("https://example.com/");
99+
Element el = doc.body();
100+
for (int i = 0; i <= 50000; i++) {
101+
el = el.appendElement("p");
102+
}
103+
Element script = el.appendElement("script");
104+
script.text("script"); // holds data nodes, so inserts as data, not text
105+
assertFalse(script.hasText());
106+
assertEquals("script", script.data());
107+
assertEquals(el.data(), doc.data());
108+
}
109+
110+
@Test void parentsNoOverflow() {
111+
// parents() was recursive, so could overflow
112+
Document doc = new Document("https://example.com/");
113+
Element el = doc.body();
114+
int num = 50000;
115+
for (int i = 0; i <= num; i++) {
116+
el = el.appendElement("p");
117+
}
118+
Elements parents = el.parents();
119+
assertEquals(num+2, parents.size()); // +2 for html and body
120+
assertEquals(doc, el.ownerDocument());
121+
}
81122
}

0 commit comments

Comments
 (0)