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