1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit;
16
17 import java.io.StringReader;
18 import java.util.concurrent.CountDownLatch;
19 import java.util.concurrent.atomic.AtomicInteger;
20
21 import org.htmlunit.WebClient.PooledCSS3Parser;
22 import org.htmlunit.cssparser.parser.CSSOMParser;
23 import org.htmlunit.cssparser.parser.InputSource;
24 import org.htmlunit.cssparser.parser.javacc.CSS3Parser;
25 import org.junit.jupiter.api.Test;
26
27
28
29
30
31
32
33 public class WebClient9Test extends SimpleWebTestCase {
34
35
36
37
38
39 @Test
40 public void newParsersWhenNotReturning() {
41 try (WebClient webClient = new WebClient()) {
42
43 final CSS3Parser p1 = webClient.getCSS3Parser();
44
45
46 final CSS3Parser p2 = webClient.getCSS3Parser();
47
48 assertFalse(p1 == p2);
49 }
50 }
51
52
53
54
55
56 @SuppressWarnings("resource")
57 @Test
58 public void closedParserIsPooled() {
59 try (WebClient webClient = new WebClient()) {
60
61 final PooledCSS3Parser p1;
62 final PooledCSS3Parser p2;
63
64 try (PooledCSS3Parser p = webClient.getCSS3Parser()) {
65 assertNotNull(p);
66 p1 = p;
67 }
68 try (PooledCSS3Parser p = webClient.getCSS3Parser()) {
69 assertNotNull(p);
70 p2 = p;
71 assertTrue(p == p1);
72 }
73 try (PooledCSS3Parser p = webClient.getCSS3Parser()) {
74 assertNotNull(p);
75 assertTrue(p == p2);
76 assertTrue(p1 == p2);
77 }
78 }
79 }
80
81
82
83
84 @SuppressWarnings("resource")
85 @Test
86 public void nestingWorks() {
87 try (WebClient webClient = new WebClient()) {
88 final PooledCSS3Parser p1;
89 final PooledCSS3Parser p2;
90
91 try (PooledCSS3Parser p11 = webClient.getCSS3Parser()) {
92 try (PooledCSS3Parser p21 = webClient.getCSS3Parser()) {
93 assertNotNull(p11);
94 assertNotNull(p21);
95 assertFalse(p11 == p21);
96
97
98 p1 = p11;
99 p2 = p21;
100 }
101 }
102
103 try (PooledCSS3Parser p11 = webClient.getCSS3Parser()) {
104 try (PooledCSS3Parser p21 = webClient.getCSS3Parser()) {
105 assertNotNull(p11);
106 assertNotNull(p21);
107 assertFalse(p11 == p21);
108
109 assertTrue(p11 == p1);
110 assertTrue(p21 == p2);
111 }
112 }
113 }
114 }
115
116
117
118
119 @SuppressWarnings("resource")
120 @Test
121 public void flow1_2() {
122 try (WebClient webClient = new WebClient()) {
123 final PooledCSS3Parser p1;
124
125 try (PooledCSS3Parser p11 = webClient.getCSS3Parser()) {
126 p1 = p11;
127 }
128
129 try (PooledCSS3Parser p11 = webClient.getCSS3Parser()) {
130 assertNotNull(p11);
131 assertTrue(p11 == p1);
132
133 try (PooledCSS3Parser p21 = webClient.getCSS3Parser()) {
134 assertNotNull(p21);
135 assertFalse(p21 == p11);
136 }
137 }
138 }
139 }
140
141
142
143
144 @Test
145 public void multithreading() throws InterruptedException {
146 final String css = "body { background-color: green; }";
147
148 final int numberOfThreads = 10;
149
150 final AtomicInteger errorCount = new AtomicInteger();
151 final CountDownLatch latch = new CountDownLatch(numberOfThreads);
152
153 final WebClient webClient = new WebClient();
154 for (int i = 0; i < numberOfThreads; i++) {
155 new Thread(() -> {
156 try {
157 for (int j = 0; j < 100_000; j++) {
158 try (PooledCSS3Parser pooledParser = webClient.getCSS3Parser()) {
159 assertNotNull(pooledParser);
160
161 try (InputSource source = new InputSource(new StringReader(css))) {
162 final CSSOMParser parser = new CSSOMParser(pooledParser);
163 parser.parseStyleSheet(source, null);
164 }
165 }
166 }
167 }
168 catch (final Exception e) {
169 errorCount.addAndGet(1);
170 }
171 latch.countDown();
172 }).start();
173 }
174
175 latch.await();
176 webClient.close();
177
178 assertEquals(0, errorCount.get());
179 }
180 }