View Javadoc

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      // Standard
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         // HttpSessionListener
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         // HttpSessionAttributeListener
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         // HttpSessionBindingListener
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         // HttpSessionActivationListener
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         // HttpSessionBindingListener
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         // create a session
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         // analyse results
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         // TODO - what should we test here ?
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); // sessionCreated
355         events.clear();
356 
357         String key = "foo";
358         Object val = new Listener();
359         session.setAttribute(key, val);
360         assertTrue(events.size() == 2); // valueBound, attributeAdded
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); // sessionCreated
392         events.clear();
393 
394         String key = "foo";
395         Object val = new Listener();
396         session.putValue(key, val);
397         assertTrue(events.size() == 2); // valueBound, attributeAdded
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); // sessionCreated
457         String key = "foo";
458         Object val = new Listener();
459         session.setAttribute(key, val);
460         assertTrue(events.size() == 3); // valueBound, attributeAdded
461         events.clear();
462 
463         session.removeAttribute(key);
464         assertTrue(events.size() == 2); // valueUnBound, attributeRemoved
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         // try removing it again !
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); // sessionCreated
502         String key = "foo";
503         Object val = new Listener();
504         session.setAttribute(key, val);
505         assertTrue(events.size() == 3); // valueBound, attributeAdded
506         events.clear();
507 
508         session.removeValue(key);
509         assertTrue(events.size() == 2); // valueUnBound, attributeRemoved
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); // sessionCreated
543         String key = "foo";
544         Object val = new Listener();
545         session.setAttribute(key, val);
546         assertTrue(events.size() == 3); // valueBound, attributeAdded
547         events.clear();
548 
549         session.setAttribute(key, null);
550         assertTrue(events.size() == 2); // valueUnBound, attributeRemoved
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); // sessionCreated
584         String key = "foo";
585         Object val = new Listener();
586         session.setAttribute(key, val);
587         assertTrue(events.size() == 3); // valueBound, attributeAdded
588         events.clear();
589 
590         session.putValue(key, null);
591         assertTrue(events.size() == 2); // valueUnBound, attributeRemoved
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); // sessionCreated
625         String key = "foo";
626         Object oldVal = new Listener();
627         Object newVal = new Listener();
628         session.setAttribute(key, oldVal);
629         assertTrue(events.size() == 3); // valueBound, attributeAdded
630         events.clear();
631 
632         session.setAttribute(key, newVal);
633         assertTrue(events.size() == 3); // valueUnbound, valueBound,
634                                             // attributeReplaced
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         // TODO - test context level events here...
839     }
840 
841     public void testDeserialisationOnReplacementWithoutListener(ClusteredManager manager) throws Exception {
842         testDeserialisationOnReplacement(manager);
843         // TODO - test context level events here...
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) // Distributable only
898             throws Exception {
899         WebSession session = ((WebSession) manager.create(null));
900         // try some Serializables...
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         // and some non-Serializables...
907         session.setAttribute("5", new Object());
908     }
909 
910     public void testDistributableValidation(Manager manager) // Distributable
911                                                                 // only
912             throws Exception {
913         HttpSession session = ((WADIHttpSession) manager.create(null)).getWrapper();
914         // try some Serializables...
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         // and some non-Serializables...
921         try {
922             session.setAttribute("5", new Object());
923             assertTrue(false);
924         } catch (IllegalArgumentException ignore) {
925             // expected
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(); // cannot really test unless inside a container... - TODO
956         assertTrue(session.getCreationTime() >= start && session.getCreationTime() <= end);
957         assertTrue(session.getCreationTime() == session.getLastAccessedTime());
958     }
959 }