1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit;
16
17 import static java.nio.charset.StandardCharsets.UTF_8;
18
19 import java.io.IOException;
20 import java.io.Writer;
21 import java.util.Enumeration;
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import javax.servlet.Servlet;
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServlet;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.htmlunit.junit.annotation.Alerts;
32 import org.htmlunit.util.MimeType;
33 import org.junit.jupiter.api.Assertions;
34 import org.junit.jupiter.api.Test;
35 import org.openqa.selenium.By;
36 import org.openqa.selenium.WebDriver;
37
38
39
40
41
42
43
44 public class HistoryTest extends WebDriverTestCase {
45
46
47
48
49
50
51 @Test
52 public void post() throws Exception {
53 final Map<String, Class<? extends Servlet>> servlets = new HashMap<>();
54 servlets.put("/post1", Post1Servlet.class);
55 servlets.put("/post2", Post2Servlet.class);
56 servlets.put("/post3", Post3Servlet.class);
57 startWebServer("./", new String[0], servlets);
58
59 final WebDriver driver = getWebDriver();
60 driver.get(URL_FIRST + "post1");
61
62 driver.findElement(By.id("mySubmit")).click();
63 if (useRealBrowser()) {
64 Thread.sleep(400);
65 }
66 assertEquals(URL_FIRST + "post2", driver.getCurrentUrl());
67 assertTrue(driver.getPageSource().contains("POST"));
68 assertTrue(driver.getPageSource().contains("para1=value1"));
69
70 driver.findElement(By.linkText("Go to GET")).click();
71 if (useRealBrowser()) {
72 Thread.sleep(400);
73 }
74 assertEquals(URL_FIRST + "post3", driver.getCurrentUrl());
75 assertTrue(driver.getPageSource().contains("GET"));
76
77 driver.navigate().back();
78 assertEquals(URL_FIRST + "post2", driver.getCurrentUrl());
79 assertTrue(driver.getPageSource().contains("POST"));
80 assertTrue(driver.getPageSource().contains("para1=value1"));
81 }
82
83
84
85
86
87
88 @Test
89 @Alerts("49")
90
91 public void historyCache() throws Exception {
92 final Map<String, Class<? extends Servlet>> servlets = new HashMap<>();
93 final int testDeep = 70;
94
95 for (int i = 0; i < testDeep; i++) {
96 servlets.put("/post" + i, Post1Servlet.class);
97 }
98 startWebServer("./", new String[0], servlets);
99
100 final WebDriver driver = getWebDriver();
101
102 int count = Post1Servlet.Count_;
103 for (int i = 0; i < testDeep; i++) {
104 driver.get(URL_FIRST + "post" + i);
105 assertTrue(driver.getPageSource(), driver.getPageSource().contains("Call: " + (i + count)));
106 }
107
108 count = Post1Servlet.Count_;
109 for (int i = 0; i < testDeep - 1; i++) {
110 driver.navigate().back();
111 if (!driver.getPageSource().contains("Call: " + (count - i - 2))) {
112 assertEquals(Integer.parseInt(getExpectedAlerts()[0]), i);
113 return;
114 }
115
116 if (count != Post1Servlet.Count_) {
117 Assertions.fail("Server called for " + i);
118 break;
119 }
120 }
121
122 assertEquals(getExpectedAlerts()[0], "done");
123 }
124
125
126
127
128 public static class Post1Servlet extends HttpServlet {
129 static int Count_ = 0;
130
131
132
133
134 @Override
135 protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
136 throws ServletException, IOException {
137
138 response.setCharacterEncoding(UTF_8.name());
139 response.setContentType(MimeType.TEXT_HTML);
140 response.getWriter().write(
141 DOCTYPE_HTML
142 + "<html>\n"
143 + "<body>\n"
144 + " <h1>Call: " + Count_ + "</h1>\n"
145 + " <form action='post2' method='post'>\n"
146 + " <input type='hidden' name='para1' value='value1'>\n"
147 + " <input type='submit' value='Click Me' id='mySubmit'>\n"
148 + " </form>\n"
149 + "</body>\n"
150 + "</html>\n");
151
152 Count_++;
153 }
154 }
155
156
157
158
159 public static class Post2Servlet extends HttpServlet {
160
161
162
163
164 @Override
165 protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
166 throws ServletException, IOException {
167
168 request.setCharacterEncoding(UTF_8.name());
169 response.setContentType(MimeType.TEXT_HTML);
170 final Writer writer = response.getWriter();
171 writer.write("POST<br>\n");
172 for (final Enumeration<String> en = request.getParameterNames(); en.hasMoreElements();) {
173 final String key = en.nextElement();
174 writer.write(key + "=" + request.getParameter(key) + "<br>\n");
175 }
176 writer.write("<a href='post3'>Go to GET</a>\n");
177 }
178 }
179
180
181
182
183 public static class Post3Servlet extends HttpServlet {
184
185
186
187
188 @Override
189 protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
190 throws ServletException, IOException {
191 request.setCharacterEncoding(UTF_8.name());
192 response.setContentType(MimeType.TEXT_HTML);
193 final Writer writer = response.getWriter();
194 writer.write("GET<br>\n");
195 }
196 }
197 }