1 /***
2 *
3 * Copyright 2003-2005 Core Developers Network Ltd.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.codehaus.wadi.web;
19
20 import java.io.IOException;
21 import java.io.Serializable;
22 import java.util.ArrayList;
23 import java.util.Date;
24 import java.util.Enumeration;
25 import java.util.List;
26
27 import javax.servlet.http.HttpSession;
28 import javax.servlet.http.HttpSessionActivationListener;
29 import javax.servlet.http.HttpSessionAttributeListener;
30 import javax.servlet.http.HttpSessionBindingEvent;
31 import javax.servlet.http.HttpSessionBindingListener;
32 import javax.servlet.http.HttpSessionEvent;
33 import javax.servlet.http.HttpSessionListener;
34
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37 import org.codehaus.wadi.core.ConcurrentMotableMap;
38 import org.codehaus.wadi.core.JDK5ConcurrentMotableMap;
39 import org.codehaus.wadi.core.contextualiser.Contextualiser;
40 import org.codehaus.wadi.core.manager.BasicSessionMonitor;
41 import org.codehaus.wadi.core.manager.ClusteredManager;
42 import org.codehaus.wadi.core.manager.DummyManagerConfig;
43 import org.codehaus.wadi.core.manager.DummyRouter;
44 import org.codehaus.wadi.core.manager.Manager;
45 import org.codehaus.wadi.core.manager.Router;
46 import org.codehaus.wadi.core.manager.SessionIdFactory;
47 import org.codehaus.wadi.core.manager.SessionMonitor;
48 import org.codehaus.wadi.core.manager.StandardManager;
49 import org.codehaus.wadi.core.manager.TomcatSessionIdFactory;
50 import org.codehaus.wadi.core.session.DistributableAttributesFactory;
51 import org.codehaus.wadi.core.session.StandardValueFactory;
52 import org.codehaus.wadi.core.session.ValueFactory;
53 import org.codehaus.wadi.core.util.SimpleStreamer;
54 import org.codehaus.wadi.replication.manager.basic.NoOpReplicationManager;
55 import org.codehaus.wadi.web.impl.StandardSessionWrapperFactory;
56
57 import com.agical.rmock.extension.junit.RMockTestCase;
58
59 /***
60 * Test WADI's HttpSession implementation
61 *
62 * TODO - reimplement as a true JUnit test
63 *
64 * @author <a href="mailto:jules@coredevelopers.net">Jules Gosnell</a>
65 * @version $Revision: 2481 $
66 */
67 public class TestHttpSession extends RMockTestCase {
68 protected Log _log = LogFactory.getLog(TestHttpSession.class);
69 protected final String _clusterName = "WADI.TEST";
70 protected Listener _listener;
71 protected List events = new ArrayList();
72 protected ConcurrentMotableMap motableMap = new JDK5ConcurrentMotableMap();
73 protected boolean accessOnLoad = true;
74 protected Router router = new DummyRouter();
75
76
77 protected SessionMonitor sessionMonitor = new BasicSessionMonitor();
78 protected Contextualiser contextualiser;
79 protected WebSessionWrapperFactory webSessionWrapperFactory = new StandardSessionWrapperFactory();
80 protected SessionIdFactory sessionIdFactory = new TomcatSessionIdFactory();
81 protected ValueFactory valueFactory = new StandardValueFactory();
82 protected DistributableAttributesFactory attributesFactory = new DistributableAttributesFactory(valueFactory);
83 protected WebSessionFactory webSessionFactory = new BasicWebSessionFactory(attributesFactory,
84 new SimpleStreamer(),
85 new NoOpReplicationManager(),
86 router,
87 webSessionWrapperFactory);
88
89 protected StandardManager _standardManager;
90 protected DummyManagerConfig _standardConfig = new DummyManagerConfig();
91 private WADIHttpSessionListener wadiHttpSessionListener;
92
93 public TestHttpSession(String name) {
94 super(name);
95 }
96
97 static class Pair implements Serializable {
98 String _type;
99
100 HttpSessionEvent _event;
101
102 Pair(String type, HttpSessionEvent event) {
103 _type = type;
104 _event = event;
105 }
106
107 String getType() {
108 return _type;
109 }
110
111 HttpSessionEvent getEvent() {
112 return _event;
113 }
114
115 public String toString() {
116 return "<" + _event.getSession().getId() + ":" + _type + ">";
117 }
118 }
119
120 class Listener implements HttpSessionListener, HttpSessionAttributeListener, HttpSessionBindingListener,
121 Serializable {
122
123 public void sessionCreated(HttpSessionEvent e) {
124 e.getSession().getId();
125 events.add(new Pair("sessionCreated", e));
126 }
127
128 public void sessionDestroyed(HttpSessionEvent e) {
129 e.getSession().getId();
130 events.add(new Pair("sessionDestroyed", e));
131 }
132
133
134 public void attributeAdded(HttpSessionBindingEvent e) {
135 e.getSession().getId();
136 events.add(new Pair("attributeAdded", e));
137 }
138
139 public void attributeRemoved(HttpSessionBindingEvent e) {
140 e.getSession().getId();
141 events.add(new Pair("attributeRemoved", e));
142 }
143
144 public void attributeReplaced(HttpSessionBindingEvent e) {
145 e.getSession().getId();
146 events.add(new Pair("attributeReplaced", e));
147 }
148
149
150 public void valueBound(HttpSessionBindingEvent e) {
151 e.getSession().getId();
152 events.add(new Pair("valueBound", e));
153 }
154
155 public void valueUnbound(HttpSessionBindingEvent e) {
156 e.getSession().getId();
157 events.add(new Pair("valueUnbound", e));
158 }
159 }
160
161 static class ActivationListener implements HttpSessionActivationListener, Serializable {
162 public static List _events = new ArrayList();
163
164
165 public void sessionDidActivate(HttpSessionEvent e) {
166 e.getSession().getId();
167 _events.add(new Pair("sessionDidActivate", e));
168 }
169
170 public void sessionWillPassivate(HttpSessionEvent e) {
171 e.getSession().getId();
172 _events.add(new Pair("sessionWillPassivate", e));
173 }
174 }
175
176 static class BindingListener implements HttpSessionBindingListener, Serializable {
177 public static List _events = new ArrayList();
178
179
180 public void valueBound(HttpSessionBindingEvent e) {
181 e.getSession().getId();
182 _events.add(new Pair("valueBound", e));
183 }
184
185 public void valueUnbound(HttpSessionBindingEvent e) {
186 e.getSession().getId();
187 _events.add(new Pair("valueUnbound", e));
188 }
189 }
190
191 static class SerialisationListener implements Serializable {
192 public static List _events = new ArrayList();
193
194 protected static Log _log = LogFactory.getLog(SerialisationListener.class);
195
196 private void writeObject(java.io.ObjectOutputStream out) throws IOException {
197 _events.add(new Pair("serialised", null));
198 }
199
200 private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
201 _events.add(new Pair("deserialised", null));
202 }
203
204 }
205
206 protected void setUp() throws Exception {
207 contextualiser = (Contextualiser) mock(Contextualiser.class);
208 _standardManager = new StandardManager(webSessionFactory,
209 sessionIdFactory,
210 contextualiser,
211 motableMap,
212 router,
213 sessionMonitor);
214
215 _listener = new Listener();
216 HttpSessionListener[] sessionListeners = new HttpSessionListener[] { _listener };
217 wadiHttpSessionListener = new WADIHttpSessionListener(sessionListeners);
218 sessionMonitor.addSessionListener(wadiHttpSessionListener);
219
220 HttpSessionAttributeListener[] attributeListeners = new HttpSessionAttributeListener[] { _listener };
221 webSessionFactory.getWebSessionConfig().setAttributeListeners(attributeListeners);
222 _standardManager.init(_standardConfig);
223 }
224
225 protected void tearDown() {
226 sessionMonitor.removeSessionListener(wadiHttpSessionListener);
227 webSessionFactory.getWebSessionConfig().setAttributeListeners(null);
228 _listener = null;
229 }
230
231
232
233 public void testCreateHttpSession() {
234 testCreateHttpSession(_standardManager);
235 }
236
237 public void testCreateHttpSession(Manager manager) {
238 events.clear();
239
240
241 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
242 assertTrue(!session.getAttributeNames().hasMoreElements());
243 assertTrue(session.getValueNames().length == 0);
244 Pair pair = (Pair) events.remove(0);
245 assertTrue(pair != null);
246 assertTrue(pair.getType().equals("sessionCreated"));
247 assertTrue(pair.getEvent().getSession() == session);
248 assertTrue(events.size() == 0);
249 }
250
251 public void testDestroyHttpSessionWithListener() throws Exception {
252 testDestroyHttpSessionWithListener(_standardManager);
253 }
254
255 public void testDestroyHttpSessionWithListener(StandardManager manager) throws Exception {
256 WADIHttpSession session = (WADIHttpSession) manager.create(null);
257 HttpSession wrapper = session.getWrapper();
258
259 String key = "foo";
260 Object val = new Listener();
261 wrapper.setAttribute(key, val);
262 wrapper.setAttribute("bar", "baz");
263 events.clear();
264
265 session.destroy();
266
267 assertTrue(events.size() == 4);
268 {
269 Pair pair = (Pair) events.get(0);
270 assertTrue(pair != null);
271 assertTrue(pair.getType().equals("valueUnbound"));
272 HttpSessionEvent e = pair.getEvent();
273 assertTrue(wrapper == e.getSession());
274 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
275 assertTrue(be.getName() == key);
276 assertTrue(be.getValue() == val);
277 }
278 {
279 Pair pair = (Pair) events.get(1);
280 assertTrue(pair != null);
281 assertTrue(pair.getType().equals("attributeRemoved"));
282 HttpSessionEvent e = pair.getEvent();
283 assertTrue(wrapper == e.getSession());
284 }
285 {
286 Pair pair = (Pair) events.get(2);
287 assertTrue(pair != null);
288 assertTrue(pair.getType().equals("attributeRemoved"));
289 HttpSessionEvent e = pair.getEvent();
290 assertTrue(wrapper == e.getSession());
291 }
292 {
293 Pair pair = (Pair) events.get(3);
294 assertTrue(pair != null);
295 assertTrue(pair.getType().equals("sessionDestroyed"));
296 HttpSessionEvent e = pair.getEvent();
297 assertTrue(wrapper == e.getSession());
298 }
299 events.clear();
300 }
301
302 public void testDestroyHttpSessionWithoutListener() throws Exception {
303 webSessionFactory.getWebSessionConfig().setAttributeListeners(null);
304 sessionMonitor.removeSessionListener(wadiHttpSessionListener);
305 wadiHttpSessionListener = new WADIHttpSessionListener(new HttpSessionListener[0]);
306 sessionMonitor.addSessionListener(wadiHttpSessionListener);
307 testDestroyHttpSessionWithoutListener(_standardManager);
308 sessionMonitor.removeSessionListener(wadiHttpSessionListener);
309 }
310
311 public void testDestroyHttpSessionWithoutListener(StandardManager manager) throws Exception {
312 WADIHttpSession session = (WADIHttpSession) manager.create(null);
313 HttpSession wrapper = session.getWrapper();
314
315 String key = "foo";
316 Object val = new Listener();
317 wrapper.setAttribute(key, val);
318 wrapper.setAttribute("bar", "baz");
319 events.clear();
320
321 session.destroy();
322
323
324 assertTrue(events.size() == 1);
325 {
326 Pair pair = (Pair) events.get(0);
327 assertTrue(pair != null);
328 assertTrue(pair.getType().equals("valueUnbound"));
329 HttpSessionEvent e = pair.getEvent();
330 assertTrue(wrapper == e.getSession());
331 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
332 assertTrue(be.getName() == key);
333 assertTrue(be.getValue() == val);
334 }
335 events.clear();
336 }
337
338 public void testInvalidate() throws Exception {
339 testInvalidate(_standardManager);
340 }
341
342 public void testInvalidate(Manager manager) {
343 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
344 session.invalidate();
345
346 }
347
348 public void testSetAttribute() {
349 testSetAttribute(_standardManager);
350 }
351
352 public void testSetAttribute(Manager manager) {
353 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
354 assertTrue(events.size() == 1);
355 events.clear();
356
357 String key = "foo";
358 Object val = new Listener();
359 session.setAttribute(key, val);
360 assertTrue(events.size() == 2);
361 {
362 Pair pair = (Pair) events.get(0);
363 assertTrue(pair != null);
364 assertTrue(pair.getType().equals("valueBound"));
365 HttpSessionEvent e = pair.getEvent();
366 assertTrue(session == e.getSession());
367 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
368 assertTrue(be.getName() == key);
369 assertTrue(be.getValue() == val);
370 }
371 {
372 Pair pair = (Pair) events.get(1);
373 assertTrue(pair != null);
374 assertTrue(pair.getType().equals("attributeAdded"));
375 HttpSessionEvent e = pair.getEvent();
376 assertTrue(session == e.getSession());
377 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
378 assertTrue(be.getName() == key);
379 assertTrue(be.getValue() == val);
380 }
381 events.clear();
382 assertTrue(events.size() == 0);
383 }
384
385 public void testPutValue() {
386 testPutValue(_standardManager);
387 }
388
389 public void testPutValue(Manager manager) {
390 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
391 assertTrue(events.size() == 1);
392 events.clear();
393
394 String key = "foo";
395 Object val = new Listener();
396 session.putValue(key, val);
397 assertTrue(events.size() == 2);
398 {
399 Pair pair = (Pair) events.get(0);
400 assertTrue(pair != null);
401 assertTrue(pair.getType().equals("valueBound"));
402 HttpSessionEvent e = pair.getEvent();
403 assertTrue(session == e.getSession());
404 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
405 assertTrue(be.getName() == key);
406 assertTrue(be.getValue() == val);
407 }
408 {
409 Pair pair = (Pair) events.get(1);
410 assertTrue(pair != null);
411 assertTrue(pair.getType().equals("attributeAdded"));
412 HttpSessionEvent e = pair.getEvent();
413 assertTrue(session == e.getSession());
414 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
415 assertTrue(be.getName() == key);
416 assertTrue(be.getValue() == val);
417 }
418 events.clear();
419 assertTrue(events.size() == 0);
420 }
421
422 public void testGetAttribute() {
423 testGetAttribute(_standardManager);
424 }
425
426 public void testGetAttribute(Manager manager) {
427 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
428 String key = "foo";
429 Object val = new Listener();
430 session.setAttribute(key, val);
431 events.clear();
432
433 assertTrue(session.getAttribute(key) == val);
434 }
435
436 public void testGetValue() {
437 testGetValue(_standardManager);
438 }
439
440 public void testGetValue(Manager manager) {
441 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
442 String key = "foo";
443 Object val = new Listener();
444 session.setAttribute(key, val);
445 events.clear();
446
447 assertTrue(session.getValue(key) == val);
448 }
449
450 public void testRemoveAttribute() {
451 testRemoveAttribute(_standardManager);
452 }
453
454 public void testRemoveAttribute(Manager manager) {
455 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
456 assertTrue(events.size() == 1);
457 String key = "foo";
458 Object val = new Listener();
459 session.setAttribute(key, val);
460 assertTrue(events.size() == 3);
461 events.clear();
462
463 session.removeAttribute(key);
464 assertTrue(events.size() == 2);
465 {
466 Pair pair = (Pair) events.get(0);
467 assertTrue(pair != null);
468 assertTrue(pair.getType().equals("valueUnbound"));
469 HttpSessionEvent e = pair.getEvent();
470 assertTrue(session == e.getSession());
471 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
472 assertTrue(be.getName() == key);
473 assertTrue(be.getValue() == val);
474 }
475 {
476 Pair pair = (Pair) events.get(1);
477 assertTrue(pair != null);
478 assertTrue(pair.getType().equals("attributeRemoved"));
479 HttpSessionEvent e = pair.getEvent();
480 assertTrue(session == e.getSession());
481 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
482 assertTrue(be.getName() == key);
483 assertTrue(be.getValue() == val);
484 }
485 events.clear();
486 assertTrue(events.size() == 0);
487 assertTrue(session.getAttribute(key) == null);
488
489
490 session.removeAttribute(key);
491 assertTrue(events.size() == 0);
492
493 }
494
495 public void testRemoveValue() {
496 testRemoveValue(_standardManager);
497 }
498
499 public void testRemoveValue(Manager manager) {
500 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
501 assertTrue(events.size() == 1);
502 String key = "foo";
503 Object val = new Listener();
504 session.setAttribute(key, val);
505 assertTrue(events.size() == 3);
506 events.clear();
507
508 session.removeValue(key);
509 assertTrue(events.size() == 2);
510
511 {
512 Pair pair = (Pair) events.get(0);
513 assertTrue(pair != null);
514 assertTrue(pair.getType().equals("valueUnbound"));
515 HttpSessionEvent e = pair.getEvent();
516 assertTrue(session == e.getSession());
517 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
518 assertTrue(be.getName() == key);
519 assertTrue(be.getValue() == val);
520 }
521 {
522 Pair pair = (Pair) events.get(1);
523 assertTrue(pair != null);
524 assertTrue(pair.getType().equals("attributeRemoved"));
525 HttpSessionEvent e = pair.getEvent();
526 assertTrue(session == e.getSession());
527 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
528 assertTrue(be.getName() == key);
529 assertTrue(be.getValue() == val);
530 }
531 events.clear();
532 assertTrue(events.size() == 0);
533 assertTrue(session.getAttribute(key) == null);
534 }
535
536 public void testSetAttributeNull() {
537 testSetAttributeNull(_standardManager);
538 }
539
540 public void testSetAttributeNull(Manager manager) {
541 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
542 assertTrue(events.size() == 1);
543 String key = "foo";
544 Object val = new Listener();
545 session.setAttribute(key, val);
546 assertTrue(events.size() == 3);
547 events.clear();
548
549 session.setAttribute(key, null);
550 assertTrue(events.size() == 2);
551
552 {
553 Pair pair = (Pair) events.get(0);
554 assertTrue(pair != null);
555 assertTrue(pair.getType().equals("valueUnbound"));
556 HttpSessionEvent e = pair.getEvent();
557 assertTrue(session == e.getSession());
558 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
559 assertTrue(be.getName() == key);
560 assertTrue(be.getValue() == val);
561 }
562 {
563 Pair pair = (Pair) events.get(1);
564 assertTrue(pair != null);
565 assertTrue(pair.getType().equals("attributeRemoved"));
566 HttpSessionEvent e = pair.getEvent();
567 assertTrue(session == e.getSession());
568 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
569 assertTrue(be.getName() == key);
570 assertTrue(be.getValue() == val);
571 }
572 events.clear();
573 assertTrue(events.size() == 0);
574 assertTrue(session.getAttribute(key) == null);
575 }
576
577 public void testPutValueNull() {
578 testPutValueNull(_standardManager);
579 }
580
581 public void testPutValueNull(Manager manager) {
582 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
583 assertTrue(events.size() == 1);
584 String key = "foo";
585 Object val = new Listener();
586 session.setAttribute(key, val);
587 assertTrue(events.size() == 3);
588 events.clear();
589
590 session.putValue(key, null);
591 assertTrue(events.size() == 2);
592
593 {
594 Pair pair = (Pair) events.get(0);
595 assertTrue(pair != null);
596 assertTrue(pair.getType().equals("valueUnbound"));
597 HttpSessionEvent e = pair.getEvent();
598 assertTrue(session == e.getSession());
599 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
600 assertTrue(be.getName() == key);
601 assertTrue(be.getValue() == val);
602 }
603 {
604 Pair pair = (Pair) events.get(1);
605 assertTrue(pair != null);
606 assertTrue(pair.getType().equals("attributeRemoved"));
607 HttpSessionEvent e = pair.getEvent();
608 assertTrue(session == e.getSession());
609 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
610 assertTrue(be.getName() == key);
611 assertTrue(be.getValue() == val);
612 }
613 events.clear();
614 assertTrue(events.size() == 0);
615 assertTrue(session.getAttribute(key) == null);
616 }
617
618 public void testReplaceAttribute() {
619 testReplaceAttribute(_standardManager);
620 }
621
622 public void testReplaceAttribute(Manager manager) {
623 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
624 assertTrue(events.size() == 1);
625 String key = "foo";
626 Object oldVal = new Listener();
627 Object newVal = new Listener();
628 session.setAttribute(key, oldVal);
629 assertTrue(events.size() == 3);
630 events.clear();
631
632 session.setAttribute(key, newVal);
633 assertTrue(events.size() == 3);
634
635 {
636 Pair pair = (Pair) events.get(0);
637 assertTrue(pair != null);
638 assertTrue(pair.getType().equals("valueUnbound"));
639 HttpSessionEvent e = pair.getEvent();
640 assertTrue(session == e.getSession());
641 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
642 assertTrue(be.getName() == key);
643 assertTrue(be.getValue() == oldVal);
644 }
645 {
646 Pair pair = (Pair) events.get(1);
647 assertTrue(pair != null);
648 assertTrue(pair.getType().equals("valueBound"));
649 HttpSessionEvent e = pair.getEvent();
650 assertTrue(session == e.getSession());
651 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
652 assertTrue(be.getName() == key);
653 assertTrue(be.getValue() == newVal);
654 }
655 {
656 Pair pair = (Pair) events.get(2);
657 assertTrue(pair != null);
658 assertTrue(pair.getType().equals("attributeReplaced"));
659 HttpSessionEvent e = pair.getEvent();
660 assertTrue(session == e.getSession());
661 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
662 assertTrue(be.getName() == key);
663 assertTrue(be.getValue() == oldVal);
664 }
665 events.clear();
666 assertTrue(events.size() == 0);
667 assertTrue(session.getValue(key) == newVal);
668 }
669
670 public void testReplaceValue() {
671 testReplaceValue(_standardManager);
672 }
673
674 public void testReplaceValue(Manager manager) {
675 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
676 String key = "foo";
677 Object oldVal = new Listener();
678 Object newVal = new Listener();
679 session.setAttribute(key, oldVal);
680 events.clear();
681
682 session.putValue(key, newVal);
683 {
684 Pair pair = (Pair) events.remove(0);
685 assertTrue(pair != null);
686 assertTrue(pair.getType().equals("valueUnbound"));
687 HttpSessionEvent e = pair.getEvent();
688 assertTrue(session == e.getSession());
689 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
690 assertTrue(be.getName() == key);
691 assertTrue(be.getValue() == oldVal);
692 }
693 {
694 Pair pair = (Pair) events.remove(0);
695 assertTrue(pair != null);
696 assertTrue(pair.getType().equals("valueBound"));
697 HttpSessionEvent e = pair.getEvent();
698 assertTrue(session == e.getSession());
699 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
700 assertTrue(be.getName() == key);
701 assertTrue(be.getValue() == newVal);
702 }
703 {
704 Pair pair = (Pair) events.remove(0);
705 assertTrue(pair != null);
706 assertTrue(pair.getType().equals("attributeReplaced"));
707 HttpSessionEvent e = pair.getEvent();
708 assertTrue(session == e.getSession());
709 HttpSessionBindingEvent be = (HttpSessionBindingEvent) e;
710 assertTrue(be.getName() == key);
711 assertTrue(be.getValue() == oldVal);
712 }
713 assertTrue(session.getValue(key) == newVal);
714 assertTrue(events.size() == 0);
715 }
716
717 protected int enumerationLength(Enumeration e) {
718 int i = 0;
719 while (e.hasMoreElements()) {
720 e.nextElement();
721 i++;
722 }
723 return i;
724 }
725
726 public void testGetAttributeNames() {
727 testGetAttributeNames(_standardManager);
728 }
729
730 public void testGetAttributeNames(Manager manager) {
731 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
732 assertTrue(enumerationLength(session.getAttributeNames()) == 0);
733 session.setAttribute("foo", "bar");
734 assertTrue(enumerationLength(session.getAttributeNames()) == 1);
735 session.setAttribute("bar", "baz");
736 assertTrue(enumerationLength(session.getAttributeNames()) == 2);
737 session.setAttribute("baz", "foo");
738 assertTrue(enumerationLength(session.getAttributeNames()) == 3);
739 session.setAttribute("baz", null);
740 assertTrue(enumerationLength(session.getAttributeNames()) == 2);
741 session.setAttribute("bar", null);
742 assertTrue(enumerationLength(session.getAttributeNames()) == 1);
743 session.setAttribute("foo", null);
744 assertTrue(enumerationLength(session.getAttributeNames()) == 0);
745 }
746
747 public void testGetValueNames() {
748 testGetValueNames(_standardManager);
749 }
750
751 public void testGetValueNames(Manager manager) {
752 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
753 assertTrue(session.getValueNames().length == 0);
754 session.setAttribute("foo", "bar");
755 assertTrue(session.getValueNames().length == 1);
756 session.setAttribute("bar", "baz");
757 assertTrue(session.getValueNames().length == 2);
758 session.setAttribute("baz", "foo");
759 assertTrue(session.getValueNames().length == 3);
760 session.setAttribute("baz", null);
761 assertTrue(session.getValueNames().length == 2);
762 session.setAttribute("bar", null);
763 assertTrue(session.getValueNames().length == 1);
764 session.setAttribute("foo", null);
765 assertTrue(session.getValueNames().length == 0);
766 }
767
768 public void testMaxInactiveInterval() {
769 testMaxInactiveInterval(_standardManager);
770 }
771
772 public void testMaxInactiveInterval(Manager manager) {
773 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
774 {
775 int interval = 60 * 60;
776 session.setMaxInactiveInterval(interval);
777 assertTrue(session.getMaxInactiveInterval() == interval);
778 }
779 {
780 int interval = -1;
781 session.setMaxInactiveInterval(interval);
782 assertTrue(session.getMaxInactiveInterval() == interval);
783 }
784 }
785
786 public void testIsNew() throws Exception {
787 WADIHttpSession session = (WADIHttpSession) _standardManager.createWithName("name");
788 HttpSession httpSession = session.getWrapper();
789 assertTrue(httpSession.isNew());
790 session.onEndProcessing();
791 assertTrue(!httpSession.isNew());
792 }
793
794 public void testNullName() {
795 testNullName(_standardManager);
796 }
797
798 public void testNullName(Manager manager) {
799 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
800 try {
801 session.setAttribute(null, "a");
802 assertTrue(false);
803 } catch (IllegalArgumentException e) {
804 }
805 try {
806 session.getAttribute(null);
807 assertTrue(false);
808 } catch (IllegalArgumentException e) {
809 }
810 try {
811 session.removeAttribute(null);
812 assertTrue(false);
813 } catch (IllegalArgumentException e) {
814 }
815 try {
816 session.putValue(null, "a");
817 assertTrue(false);
818 } catch (IllegalArgumentException e) {
819 }
820 try {
821 session.getValue(null);
822 assertTrue(false);
823 } catch (IllegalArgumentException e) {
824 }
825 try {
826 session.removeValue(null);
827 assertTrue(false);
828 } catch (IllegalArgumentException e) {
829 }
830 }
831
832 public void testStandard() throws Exception {
833 testStandardValidation(_standardManager);
834 }
835
836 public void testDeserialisationOnReplacementWithListener(ClusteredManager manager) throws Exception {
837 testDeserialisationOnReplacement(manager);
838
839 }
840
841 public void testDeserialisationOnReplacementWithoutListener(ClusteredManager manager) throws Exception {
842 testDeserialisationOnReplacement(manager);
843
844 }
845
846 public void testDeserialisationOnReplacement(ClusteredManager manager) throws Exception {
847 WebSession s0 = (WebSession) manager.create(null);
848 WebSession s1 = (WebSession) manager.create(null);
849
850 s0.setAttribute("dummy", "dummy");
851 s0.setAttribute("binding-listener", new BindingListener());
852 s0.setAttribute("activation-listener", new ActivationListener());
853 events.clear();
854 List activationEvents = ActivationListener._events;
855 activationEvents.clear();
856 List bindingEvents = BindingListener._events;
857 bindingEvents.clear();
858
859 s1.copy(s0);
860
861 s1.setAttribute("activation-listener", new ActivationListener());
862
863 assertTrue(activationEvents.size() == 2);
864 {
865 Pair pair = (Pair) activationEvents.get(0);
866 assertTrue(pair != null);
867 assertTrue(pair.getType().equals("sessionWillPassivate"));
868 HttpSessionEvent e = pair.getEvent();
869 }
870 {
871 Pair pair = (Pair) activationEvents.get(1);
872 assertTrue(pair != null);
873 assertTrue(pair.getType().equals("sessionDidActivate"));
874 HttpSessionEvent e = pair.getEvent();
875 }
876 activationEvents.clear();
877
878 s1.setAttribute("binding-listener", new BindingListener());
879
880 assertTrue(bindingEvents.size() == 2);
881 {
882 Pair pair = (Pair) bindingEvents.get(0);
883 assertTrue(pair != null);
884 assertTrue(pair.getType().equals("valueUnbound"));
885 HttpSessionEvent e = pair.getEvent();
886 }
887 {
888 Pair pair = (Pair) bindingEvents.get(1);
889 assertTrue(pair != null);
890 assertTrue(pair.getType().equals("valueBound"));
891 HttpSessionEvent e = pair.getEvent();
892 }
893 bindingEvents.clear();
894
895 }
896
897 public void testStandardValidation(Manager manager)
898 throws Exception {
899 WebSession session = ((WebSession) manager.create(null));
900
901 session.setAttribute("0", "foo");
902 session.setAttribute("1", new Integer(1));
903 session.setAttribute("2", new Float(1.1));
904 session.setAttribute("3", new Date());
905 session.setAttribute("4", new byte[256]);
906
907 session.setAttribute("5", new Object());
908 }
909
910 public void testDistributableValidation(Manager manager)
911
912 throws Exception {
913 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
914
915 session.setAttribute("0", "foo");
916 session.setAttribute("1", new Integer(1));
917 session.setAttribute("2", new Float(1.1));
918 session.setAttribute("3", new Date());
919 session.setAttribute("4", new byte[256]);
920
921 try {
922 session.setAttribute("5", new Object());
923 assertTrue(false);
924 } catch (IllegalArgumentException ignore) {
925
926 }
927 }
928
929 public void testSeparateAttributes(Manager manager) throws Exception {
930 WebSession sess0 = (WebSession) manager.create(null);
931 Object val = new String("value");
932 String key0 = "foo";
933 String key1 = "bar";
934 sess0.setAttribute(key0, val);
935 sess0.setAttribute(key1, val);
936 assertTrue(sess0.getAttribute(key0) == sess0.getAttribute(key1));
937 byte[] bytes = sess0.getBodyAsByteArray();
938 WebSession sess1 = (WebSession) manager.create(null);
939 sess1.setBodyAsByteArray(bytes);
940 assertTrue(sess1.getAttribute(key0) != sess1.getAttribute(key1));
941 assertTrue(sess1.getAttribute(key0).equals(sess1.getAttribute(key1)));
942 }
943
944 public void testRest() {
945 testRest(_standardManager);
946
947 }
948
949 public void testRest(Manager manager) {
950 long start = System.currentTimeMillis();
951 HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
952 long end = System.currentTimeMillis();
953 assertTrue(session.getSessionContext().getSession(null) == null);
954 assertTrue(session.getSessionContext().getIds() != null);
955 session.getServletContext();
956 assertTrue(session.getCreationTime() >= start && session.getCreationTime() <= end);
957 assertTrue(session.getCreationTime() == session.getLastAccessedTime());
958 }
959 }