1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.interceptor;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Properties;
28
29 import javax.servlet.http.HttpSession;
30
31 import org.apache.struts2.ServletActionContext;
32 import org.apache.struts2.StrutsTestCase;
33 import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest;
34 import org.apache.struts2.views.jsp.StrutsMockHttpSession;
35
36 import com.opensymphony.xwork2.Action;
37 import com.opensymphony.xwork2.ActionContext;
38 import com.opensymphony.xwork2.ActionProxy;
39 import com.opensymphony.xwork2.ActionProxyFactory;
40 import com.opensymphony.xwork2.DefaultActionProxyFactory;
41 import com.opensymphony.xwork2.ObjectFactory;
42 import com.opensymphony.xwork2.config.Configuration;
43 import com.opensymphony.xwork2.config.ConfigurationException;
44 import com.opensymphony.xwork2.config.ConfigurationManager;
45 import com.opensymphony.xwork2.config.ConfigurationProvider;
46 import com.opensymphony.xwork2.config.entities.ActionConfig;
47 import com.opensymphony.xwork2.config.entities.InterceptorMapping;
48 import com.opensymphony.xwork2.config.entities.PackageConfig;
49 import com.opensymphony.xwork2.config.entities.ResultConfig;
50 import com.opensymphony.xwork2.inject.ContainerBuilder;
51 import com.opensymphony.xwork2.interceptor.ParametersInterceptor;
52 import com.opensymphony.xwork2.mock.MockResult;
53 import com.opensymphony.xwork2.util.location.LocatableProperties;
54
55 /***
56 * Test case for ExecuteAndWaitInterceptor.
57 */
58 public class ExecuteAndWaitInterceptorTest extends StrutsTestCase {
59
60 private StrutsMockHttpServletRequest request;
61 private HttpSession httpSession;
62 private Map context;
63 private Map params;
64 private Map session;
65 private ExecuteAndWaitInterceptor waitInterceptor;
66
67 public void _testOneWait() throws Exception {
68 waitInterceptor.setDelay(0);
69 waitInterceptor.setDelaySleepInterval(0);
70
71 ActionProxy proxy = buildProxy("action1");
72 String result = proxy.execute();
73 assertEquals("wait", result);
74
75 Thread.sleep(1000);
76
77 ActionProxy proxy2 = buildProxy("action1");
78 String result2 = proxy2.execute();
79 assertEquals("success", result2);
80 }
81
82 public void _testTwoWait() throws Exception {
83 waitInterceptor.setDelay(0);
84 waitInterceptor.setDelaySleepInterval(0);
85
86 ActionProxy proxy = buildProxy("action1");
87 String result = proxy.execute();
88 assertEquals("wait", result);
89
90 Thread.sleep(300);
91
92 ActionProxy proxy2 = buildProxy("action1");
93 String result2 = proxy2.execute();
94 assertEquals("wait", result2);
95
96 Thread.sleep(300);
97
98 ActionProxy proxy3 = buildProxy("action1");
99 String result3 = proxy3.execute();
100 assertEquals("success", result3);
101 }
102
103 public void _testOneWaitWithDelay() throws Exception {
104 waitInterceptor.setDelay(200);
105 waitInterceptor.setDelaySleepInterval(100);
106
107 ActionProxy proxy = buildProxy("action1");
108 long before = System.currentTimeMillis();
109 String result = proxy.execute();
110 long after = System.currentTimeMillis();
111 assertEquals("wait", result);
112 assertTrue("delay should be ca. 200 millis", (after - before) >= 190);
113
114 Thread.sleep(400);
115
116 ActionProxy proxy2 = buildProxy("action1");
117 String result2 = proxy2.execute();
118 assertEquals("success", result2);
119 }
120
121 public void _testTwoWaitWithDelay() throws Exception {
122 waitInterceptor.setDelay(100);
123 waitInterceptor.setDelaySleepInterval(100);
124
125 ActionProxy proxy = buildProxy("action1");
126 long before = System.currentTimeMillis();
127 String result = proxy.execute();
128 long after = System.currentTimeMillis();
129 assertEquals("wait", result);
130 assertTrue("delay should be ca. 100 millis", (after - before) >= 90);
131
132 Thread.sleep(100);
133
134 ActionProxy proxy2 = buildProxy("action1");
135 long before2 = System.currentTimeMillis();
136 String result2 = proxy2.execute();
137 long after2 = System.currentTimeMillis();
138 assertEquals("wait", result2);
139 assertTrue("there should be no delay", (after2 - before2) < 110);
140
141 Thread.sleep(400);
142
143 ActionProxy proxy3 = buildProxy("action1");
144 String result3 = proxy3.execute();
145 assertEquals("success", result3);
146 }
147
148 public void testWaitDelayAndJobAlreadyDone() throws Exception {
149 waitInterceptor.setDelay(1500);
150 waitInterceptor.setDelaySleepInterval(100);
151
152 ActionProxy proxy = buildProxy("action1");
153 long before = System.currentTimeMillis();
154 String result = proxy.execute();
155 long diff = System.currentTimeMillis() - before;
156 assertEquals("success", result);
157 assertTrue("Job done already after 500 so there should not be such long delay", diff <= 750);
158 }
159
160 public void testWaitDelayAndJobAlreadyDone2() throws Exception {
161 waitInterceptor.setDelay(1500);
162 waitInterceptor.setDelaySleepInterval(200);
163
164 ActionProxy proxy = buildProxy("action1");
165 long before = System.currentTimeMillis();
166 String result = proxy.execute();
167 long diff = System.currentTimeMillis() - before;
168 assertEquals("success", result);
169 assertTrue("Job done already after 500 so there should not be such long delay", diff <= 750);
170 }
171
172 protected ActionProxy buildProxy(String actionName) throws Exception {
173 return actionProxyFactory.createActionProxy("", actionName, context);
174 }
175
176 protected void setUp() throws Exception {
177 loadConfigurationProviders(new WaitConfigurationProvider());
178
179 session = new HashMap();
180 params = new HashMap();
181 context = new HashMap();
182 context.put(ActionContext.SESSION, session);
183 context.put(ActionContext.PARAMETERS, params);
184
185 request = new StrutsMockHttpServletRequest();
186 httpSession = new StrutsMockHttpSession();
187 request.setSession(httpSession);
188 request.setParameterMap(params);
189 context.put(ServletActionContext.HTTP_REQUEST, request);
190 }
191
192 protected void tearDown() throws Exception {
193 configurationManager.clearConfigurationProviders();
194 configurationManager.destroyConfiguration();
195 ActionContext.setContext(null);
196 }
197
198 private class WaitConfigurationProvider implements ConfigurationProvider {
199
200 Configuration configuration;
201 public void destroy() {
202 waitInterceptor.destroy();
203 }
204
205 public boolean needsReload() {
206 return false;
207 }
208
209 public void init(Configuration configuration) throws ConfigurationException {
210 this.configuration = configuration;
211 }
212
213 public void loadPackages() throws ConfigurationException {
214 PackageConfig wait = new PackageConfig("");
215
216 Map results = new HashMap();
217 results.put(Action.SUCCESS, new ResultConfig(Action.SUCCESS, MockResult.class.getName(), null));
218 results.put(ExecuteAndWaitInterceptor.WAIT, new ResultConfig(ExecuteAndWaitInterceptor.WAIT, MockResult.class.getName(), null));
219
220
221 waitInterceptor = new ExecuteAndWaitInterceptor();
222 List interceptors = new ArrayList();
223 interceptors.add(new InterceptorMapping("params", new ParametersInterceptor()));
224 interceptors.add(new InterceptorMapping("execAndWait", waitInterceptor));
225
226 ActionConfig ac = new ActionConfig(null, ExecuteAndWaitDelayAction.class, null, results, interceptors);
227 wait.addActionConfig("action1", ac);
228
229 configuration.addPackageConfig("", wait);
230 }
231
232 public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
233 builder.factory(ObjectFactory.class);
234 builder.factory(ActionProxyFactory.class, DefaultActionProxyFactory.class);
235 }
236
237 }
238 }
239