rdonkin     2003/07/07 15:00:57

  Modified:    beanutils/src/test/org/apache/commons/beanutils
                        BeanificationTestCase.java
  Log:
  Refactored context thread loader logic into separate class. Added new setInstance 
method which works on a per-thread-context-classloader basis. Unit tests for changes. 
Patch contributed by Eric Pabst
  
  Revision  Changes    Path
  1.2       +113 -4    
jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/BeanificationTestCase.java
  
  Index: BeanificationTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/BeanificationTestCase.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BeanificationTestCase.java        16 May 2003 14:50:22 -0000      1.1
  +++ BeanificationTestCase.java        7 Jul 2003 22:00:57 -0000       1.2
  @@ -345,6 +345,52 @@
                       PropertyUtilsBean.getInstance() != signal.getPropertyUtils());  
      
       }
       
  +    
  +    /** 
  +     * Tests whether difference instances are loaded by different 
  +     * context classloaders.
  +     */
  +    public void testContextClassLoaderLocal() throws Exception {
  +            
  +        class CCLLTesterThread extends Thread {
  +            
  +            private Signal signal;
  +            private ContextClassLoaderLocal ccll;
  +        
  +            CCLLTesterThread(Signal signal, ContextClassLoaderLocal ccll) {
  +                this.signal = signal;
  +                this.ccll = ccll;
  +            }
  +            
  +            public void run() {
  +                ccll.set(new Integer(1789));
  +                signal.setSignal(2);
  +                signal.setMarkerObject(ccll.get());
  +            }
  +            
  +            public String toString() {
  +                return "CCLLTesterThread";
  +            }
  +        }
  +            
  +        ContextClassLoaderLocal ccll = new ContextClassLoaderLocal();
  +        ccll.set(new Integer(1776));
  +        assertEquals("Start thread sets value", new Integer(1776), ccll.get());  
  +        
  +        Signal signal = new Signal();
  +        signal.setSignal(1);
  +        
  +        CCLLTesterThread thread = new CCLLTesterThread(signal, ccll);
  +        thread.setContextClassLoader(new TestClassLoader());
  +        
  +        thread.start();
  +        thread.join();
  +        
  +        assertEquals("Signal not set by test thread", 2, signal.getSignal());     
  +        assertEquals("Second thread preserves value", new Integer(1776), 
ccll.get()); 
  +        assertEquals("Second thread gets value it set", new Integer(1789), 
signal.getMarkerObject()); 
  +    }
  +    
       /** Tests whether calls are independent for different classloaders */
       public void testContextClassloaderIndependence() throws Exception {
       
  @@ -403,6 +449,60 @@
           
       }
       
  +    /** Tests whether different threads can set beanutils instances correctly */
  +    public void testBeanUtilsBeanSetInstance() throws Exception {
  +            
  +        class SetInstanceTesterThread extends Thread {
  +            
  +            private Signal signal;
  +            private BeanUtilsBean bean;
  +        
  +            SetInstanceTesterThread(Signal signal, BeanUtilsBean bean) {
  +                this.signal = signal;
  +                this.bean = bean;
  +            }
  +            
  +            public void run() {
  +                BeanUtilsBean.setInstance(bean);
  +                signal.setSignal(21);
  +                signal.setBean(BeanUtilsBean.getInstance());
  +            }
  +            
  +            public String toString() {
  +                return "SetInstanceTesterThread";
  +            }
  +        }
  +        
  +        Signal signal = new Signal();
  +        signal.setSignal(1);
  +
  +        BeanUtilsBean beanOne = new BeanUtilsBean();
  +        BeanUtilsBean beanTwo = new BeanUtilsBean();
  +        
  +        SetInstanceTesterThread thread = new SetInstanceTesterThread(signal, 
beanTwo);
  +        thread.setContextClassLoader(new TestClassLoader());
  +        
  +        BeanUtilsBean.setInstance(beanOne);
  +        assertEquals("Start thread gets right instance", beanOne, 
BeanUtilsBean.getInstance()); 
  +        
  +        thread.start();
  +        thread.join();
  +        
  +        assertEquals("Signal not set by test thread", 21, signal.getSignal());     
  +        assertEquals("Second thread preserves value", beanOne, 
BeanUtilsBean.getInstance()); 
  +        assertEquals("Second thread gets value it set", beanTwo, signal.getBean()); 
  +    }
  +    
  +    /** Tests whether the unset method works*/
  +    public void testContextClassLoaderUnset() throws Exception {
  +        BeanUtilsBean beanOne = new BeanUtilsBean();
  +        ContextClassLoaderLocal ccll = new ContextClassLoaderLocal();
  +        ccll.set(beanOne);
  +        assertEquals("Start thread gets right instance", beanOne, ccll.get()); 
  +        ccll.unset();
  +        assertTrue("Unset works", !beanOne.equals(ccll.get())); 
  +    }
  +    
       private boolean isPre14JVM() {
           // some pre 1.4 JVM have buggy WeakHashMap implementations 
           // this is used to test for those JVM
  @@ -432,6 +532,7 @@
           private BeanUtilsBean bean;
           private PropertyUtilsBean propertyUtils;
           private ConvertUtilsBean convertUtils;
  +        private Object marker;
           
           public Exception getException() {
               return e;
  @@ -447,6 +548,14 @@
           
           public void setSignal(int signal) {
               this.signal = signal;
  +        }
  +        
  +        public Object getMarkerObject() {
  +            return marker;
  +        }
  +        
  +        public void setMarkerObject(Object marker) {
  +            this.marker = marker;
           }
           
           public BeanUtilsBean getBean() {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to