001: package com.mockrunner.test.web;
002:
003: import java.util.ArrayList;
004: import java.util.Enumeration;
005: import java.util.List;
006:
007: import javax.servlet.http.HttpSession;
008: import javax.servlet.http.HttpSessionAttributeListener;
009: import javax.servlet.http.HttpSessionBindingEvent;
010: import javax.servlet.http.HttpSessionBindingListener;
011:
012: import junit.framework.TestCase;
013:
014: import com.mockrunner.mock.web.MockHttpSession;
015:
016: public class MockHttpSessionTest extends TestCase {
017: private MockHttpSession session;
018:
019: protected void setUp() {
020: session = new MockHttpSession();
021: }
022:
023: protected void tearDown() {
024: session = null;
025: }
026:
027: public void testResetAll() throws Exception {
028: session.setAttribute("key", "value");
029: session.setMaxInactiveInterval(3);
030: session.resetAll();
031: assertNull(session.getAttribute("key"));
032: assertEquals(-1, session.getMaxInactiveInterval());
033: }
034:
035: public void testBindingListenerInvalidate() {
036: TestSessionListener listener1 = new TestSessionListener();
037: TestSessionListener listener2 = new TestSessionListener();
038: session.setAttribute("key1", listener1);
039: session.setAttribute("key2", listener2);
040: assertTrue(listener1.wasValueBoundCalled());
041: assertTrue(listener2.wasValueBoundCalled());
042: assertFalse(listener1.wasValueUnboundCalled());
043: assertFalse(listener2.wasValueUnboundCalled());
044: session.removeAttribute("key2");
045: assertTrue(listener2.wasValueUnboundCalled());
046: InvalidateAttributeListener listener = new InvalidateAttributeListener();
047: session.addAttributeListener(listener);
048: session.invalidate();
049: assertTrue(listener1.wasValueUnboundCalled());
050: assertTrue(listener.getDidThrowIllegalStateException());
051: try {
052: session.invalidate();
053: fail();
054: } catch (IllegalStateException exc) {
055: //should throw exception
056: }
057: }
058:
059: public void testBindingListenerOverwriteAttribute() {
060: TestSessionListener listener1 = new TestSessionListener();
061: TestSessionListener listener2 = new TestSessionListener();
062: session.setAttribute("key", listener1);
063: session.setAttribute("key", listener2);
064: assertTrue(listener1.wasValueUnboundCalled());
065: assertTrue(listener2.wasValueBoundCalled());
066: assertFalse(listener2.wasValueUnboundCalled());
067: }
068:
069: public void testBindingListenerOverwriteSameAttribute() {
070: TestSessionListener listener = new TestSessionListener();
071: session.setAttribute("key", listener);
072: listener.reset();
073: session.setAttribute("key", listener);
074: assertTrue(listener.wasValueUnboundCalled());
075: assertTrue(listener.wasValueBoundCalled());
076: assertTrue(listener.wasValueUnboundBeforeBoundCalled());
077: }
078:
079: public void testBindingListenerCorrectOrder() {
080: session.setAttribute("key", "test");
081: TestSessionOrderListener listener = new TestSessionOrderListener();
082: session.setAttribute("key", listener);
083: assertEquals("key", listener.getBoundEventKey());
084: assertEquals(listener, listener.getBoundEventValue());
085: assertEquals(listener, listener.getBoundSessionValue());
086: session.setAttribute("key", "xyz");
087: assertEquals("key", listener.getUnboundEventKey());
088: assertEquals(listener, listener.getUnboundEventValue());
089: assertEquals("xyz", listener.getUnboundSessionValue());
090: session = new MockHttpSession();
091: listener = new TestSessionOrderListener();
092: session.setAttribute("key", "abc");
093: session.setAttribute("key", listener);
094: session.removeAttribute("key");
095: assertEquals("key", listener.getUnboundEventKey());
096: assertEquals(listener, listener.getUnboundEventValue());
097: assertEquals(null, listener.getUnboundSessionValue());
098: }
099:
100: public void testAttributeListenerCalled() {
101: TestAttributeListener listener1 = new TestAttributeListener();
102: TestAttributeListener listener2 = new TestAttributeListener();
103: TestAttributeListener listener3 = new TestAttributeListener();
104: session.addAttributeListener(listener1);
105: session.addAttributeListener(listener2);
106: session.addAttributeListener(listener3);
107: session.setAttribute("key", "value");
108: assertTrue(listener1.wasAttributeAddedCalled());
109: assertTrue(listener2.wasAttributeAddedCalled());
110: assertTrue(listener3.wasAttributeAddedCalled());
111: assertFalse(listener1.wasAttributeReplacedCalled());
112: assertFalse(listener2.wasAttributeReplacedCalled());
113: assertFalse(listener3.wasAttributeReplacedCalled());
114: listener1.reset();
115: listener2.reset();
116: listener3.reset();
117: session.setAttribute("key", "value1");
118: assertFalse(listener1.wasAttributeAddedCalled());
119: assertFalse(listener2.wasAttributeAddedCalled());
120: assertFalse(listener3.wasAttributeAddedCalled());
121: assertTrue(listener1.wasAttributeReplacedCalled());
122: assertTrue(listener2.wasAttributeReplacedCalled());
123: assertTrue(listener3.wasAttributeReplacedCalled());
124: session.removeAttribute("key");
125: assertTrue(listener1.wasAttributeRemovedCalled());
126: assertTrue(listener2.wasAttributeRemovedCalled());
127: assertTrue(listener3.wasAttributeRemovedCalled());
128: }
129:
130: public void testAttributeListenerOrder() {
131: TestAttributeOrderListener listener = new TestAttributeOrderListener();
132: session.addAttributeListener(listener);
133: session.setAttribute("key", "value");
134: assertEquals("key", listener.getAddedEventKey());
135: assertEquals("value", listener.getAddedEventValue());
136: assertEquals("value", listener.getAddedSessionValue());
137: session.setAttribute("key", "anotherValue");
138: assertEquals("key", listener.getReplacedEventKey());
139: assertEquals("value", listener.getReplacedEventValue());
140: assertEquals("anotherValue", listener.getReplacedSessionValue());
141: session.removeAttribute("key");
142: assertEquals("key", listener.getRemovedEventKey());
143: assertEquals("anotherValue", listener.getRemovedEventValue());
144: assertNull("", listener.getRemovedSessionValue());
145: }
146:
147: public void testAttributeListenerNullValue() {
148: TestAttributeListener listener = new TestAttributeListener();
149: session.addAttributeListener(listener);
150: session.setAttribute("key", null);
151: assertFalse(listener.wasAttributeAddedCalled());
152: session.setAttribute("key", "xyz");
153: assertTrue(listener.wasAttributeAddedCalled());
154: session.setAttribute("key", null);
155: assertTrue(listener.wasAttributeRemovedCalled());
156: assertFalse(listener.wasAttributeReplacedCalled());
157: listener.reset();
158: session.setAttribute("key", "xyz");
159: assertTrue(listener.wasAttributeAddedCalled());
160: assertFalse(listener.wasAttributeReplacedCalled());
161: session.removeAttribute("myKey");
162: assertFalse(listener.wasAttributeRemovedCalled());
163: }
164:
165: public void testGetAttributeNames() {
166: Enumeration enumeration = session.getAttributeNames();
167: assertFalse(enumeration.hasMoreElements());
168: session.setAttribute("key", null);
169: enumeration = session.getAttributeNames();
170: assertFalse(enumeration.hasMoreElements());
171: session.setAttribute("key1", "value1");
172: session.setAttribute("key2", "value2");
173: assertEquals("value1", session.getAttribute("key1"));
174: assertEquals("value2", session.getAttribute("key2"));
175: enumeration = session.getAttributeNames();
176: List testList = new ArrayList();
177: testList.add(enumeration.nextElement());
178: testList.add(enumeration.nextElement());
179: assertFalse(enumeration.hasMoreElements());
180: assertTrue(testList.contains("key1"));
181: assertTrue(testList.contains("key2"));
182: session.setAttribute("key2", null);
183: assertNull(session.getAttribute("key2"));
184: enumeration = session.getAttributeNames();
185: testList = new ArrayList();
186: testList.add(enumeration.nextElement());
187: assertFalse(enumeration.hasMoreElements());
188: assertTrue(testList.contains("key1"));
189: session.setAttribute("key1", null);
190: assertNull(session.getAttribute("key1"));
191: enumeration = session.getAttributeNames();
192: assertFalse(enumeration.hasMoreElements());
193: }
194:
195: private static class TestSessionListener implements
196: HttpSessionBindingListener {
197: private boolean valueBoundCalled = false;
198: private boolean valueUnboundCalled = false;
199: private boolean valueUnboundBeforeBoundCalled = false;
200:
201: public void reset() {
202: valueBoundCalled = false;
203: valueUnboundCalled = false;
204: valueUnboundBeforeBoundCalled = false;
205: }
206:
207: public void valueBound(HttpSessionBindingEvent event) {
208: valueBoundCalled = true;
209: }
210:
211: public void valueUnbound(HttpSessionBindingEvent event) {
212: valueUnboundCalled = true;
213: if (!valueBoundCalled) {
214: valueUnboundBeforeBoundCalled = true;
215: }
216: }
217:
218: public boolean wasValueBoundCalled() {
219: return valueBoundCalled;
220: }
221:
222: public boolean wasValueUnboundCalled() {
223: return valueUnboundCalled;
224: }
225:
226: public boolean wasValueUnboundBeforeBoundCalled() {
227: return valueUnboundBeforeBoundCalled;
228: }
229: }
230:
231: private static class TestSessionOrderListener implements
232: HttpSessionBindingListener {
233: private String boundEventKey;
234: private Object boundEventValue;
235: private Object boundSessionValue;
236: private String unboundEventKey;
237: private Object unboundEventValue;
238: private Object unboundSessionValue;
239:
240: public void valueBound(HttpSessionBindingEvent event) {
241: boundEventKey = event.getName();
242: boundEventValue = event.getValue();
243: boundSessionValue = event.getSession().getAttribute(
244: boundEventKey);
245: }
246:
247: public void valueUnbound(HttpSessionBindingEvent event) {
248: unboundEventKey = event.getName();
249: unboundEventValue = event.getValue();
250: unboundSessionValue = event.getSession().getAttribute(
251: unboundEventKey);
252: }
253:
254: public String getBoundEventKey() {
255: return boundEventKey;
256: }
257:
258: public Object getBoundEventValue() {
259: return boundEventValue;
260: }
261:
262: public Object getBoundSessionValue() {
263: return boundSessionValue;
264: }
265:
266: public String getUnboundEventKey() {
267: return unboundEventKey;
268: }
269:
270: public Object getUnboundEventValue() {
271: return unboundEventValue;
272: }
273:
274: public Object getUnboundSessionValue() {
275: return unboundSessionValue;
276: }
277: }
278:
279: private static class InvalidateAttributeListener implements
280: HttpSessionAttributeListener {
281: private boolean didThrowIllegalStateException = false;
282:
283: public void attributeAdded(HttpSessionBindingEvent event) {
284:
285: }
286:
287: public void attributeRemoved(HttpSessionBindingEvent event) {
288: HttpSession session = event.getSession();
289: didThrowIllegalStateException = false;
290: try {
291: session.getAttribute(event.getName());
292: } catch (IllegalStateException exc) {
293: didThrowIllegalStateException = true;
294: }
295: }
296:
297: public void attributeReplaced(HttpSessionBindingEvent event) {
298:
299: }
300:
301: public boolean getDidThrowIllegalStateException() {
302: return didThrowIllegalStateException;
303: }
304: }
305:
306: private static class TestAttributeListener implements
307: HttpSessionAttributeListener {
308: private boolean wasAttributeAddedCalled = false;
309: private boolean wasAttributeReplacedCalled = false;
310: private boolean wasAttributeRemovedCalled = false;
311:
312: public void attributeAdded(HttpSessionBindingEvent event) {
313: wasAttributeAddedCalled = true;
314: }
315:
316: public void attributeRemoved(HttpSessionBindingEvent event) {
317: wasAttributeRemovedCalled = true;
318: }
319:
320: public void attributeReplaced(HttpSessionBindingEvent event) {
321: wasAttributeReplacedCalled = true;
322: }
323:
324: public void reset() {
325: wasAttributeAddedCalled = false;
326: wasAttributeReplacedCalled = false;
327: wasAttributeRemovedCalled = false;
328: }
329:
330: public boolean wasAttributeAddedCalled() {
331: return wasAttributeAddedCalled;
332: }
333:
334: public boolean wasAttributeRemovedCalled() {
335: return wasAttributeRemovedCalled;
336: }
337:
338: public boolean wasAttributeReplacedCalled() {
339: return wasAttributeReplacedCalled;
340: }
341: }
342:
343: private static class TestAttributeOrderListener implements
344: HttpSessionAttributeListener {
345: private String addedEventKey;
346: private Object addedEventValue;
347: private Object addedSessionValue;
348: private String replacedEventKey;
349: private Object replacedEventValue;
350: private Object replacedSessionValue;
351: private String removedEventKey;
352: private Object removedEventValue;
353: private Object removedSessionValue;
354:
355: public void attributeAdded(HttpSessionBindingEvent event) {
356: addedEventKey = event.getName();
357: addedEventValue = event.getValue();
358: addedSessionValue = event.getSession().getAttribute(
359: addedEventKey);
360: }
361:
362: public void attributeRemoved(HttpSessionBindingEvent event) {
363: removedEventKey = event.getName();
364: removedEventValue = event.getValue();
365: removedSessionValue = event.getSession().getAttribute(
366: removedEventKey);
367: }
368:
369: public void attributeReplaced(HttpSessionBindingEvent event) {
370: replacedEventKey = event.getName();
371: replacedEventValue = event.getValue();
372: replacedSessionValue = event.getSession().getAttribute(
373: replacedEventKey);
374: }
375:
376: public String getAddedEventKey() {
377: return addedEventKey;
378: }
379:
380: public Object getAddedEventValue() {
381: return addedEventValue;
382: }
383:
384: public Object getAddedSessionValue() {
385: return addedSessionValue;
386: }
387:
388: public String getRemovedEventKey() {
389: return removedEventKey;
390: }
391:
392: public Object getRemovedEventValue() {
393: return removedEventValue;
394: }
395:
396: public Object getRemovedSessionValue() {
397: return removedSessionValue;
398: }
399:
400: public String getReplacedEventKey() {
401: return replacedEventKey;
402: }
403:
404: public Object getReplacedEventValue() {
405: return replacedEventValue;
406: }
407:
408: public Object getReplacedSessionValue() {
409: return replacedSessionValue;
410: }
411: }
412: }
|