Author: rmannibucau
Date: Wed Jun 12 07:51:17 2019
New Revision: 1861094

URL: http://svn.apache.org/viewvc?rev=1861094&view=rev
Log:
OWB-1289 test for serialization for normal scoped beans, the getReference usage 
is just awesome for us in that case

Modified:
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/SerializationTest.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java?rev=1861094&r1=1861093&r2=1861094&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
 Wed Jun 12 07:51:17 2019
@@ -18,8 +18,12 @@
  */
 package org.apache.webbeans.test;
 
+import static java.util.stream.Collectors.toMap;
+
+import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.config.WebBeansFinder;
+import org.apache.webbeans.corespi.DefaultSingletonService;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.inject.OWBInjector;
 import org.apache.webbeans.lifecycle.StandaloneLifeCycle;
@@ -27,6 +31,7 @@ import org.apache.webbeans.lifecycle.tes
 import org.apache.webbeans.spi.ContainerLifecycle;
 import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.ScannerService;
+import org.apache.webbeans.spi.SingletonService;
 import org.apache.webbeans.util.WebBeansUtil;
 import org.junit.After;
 import org.junit.Assert;
@@ -36,6 +41,7 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -45,6 +51,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.function.BinaryOperator;
+import java.util.stream.Collector;
 
 
 public abstract class AbstractUnitTest
@@ -124,19 +132,46 @@ public abstract class AbstractUnitTest
         final Collection<Class<?>> beanClasses = new ArrayList<Class<?>>(); // 
ensure it is updatable
         beanClasses.addAll(rawBeanClasses);
 
-        WebBeansFinder.clearInstances(WebBeansUtil.getCurrentClassLoader());
+        final ClassLoader currentClassLoader = 
WebBeansUtil.getCurrentClassLoader();
+        WebBeansFinder.clearInstances(currentClassLoader);
         //Creates a new container
+        final SingletonService<WebBeansContext> singletonInstance = 
WebBeansFinder.getSingletonService();
+        final boolean lateServiceRegistration = 
!DefaultSingletonService.class.isInstance(singletonInstance);
+        if (!lateServiceRegistration)
+        {
+            final Map<Class<?>, Object> servicesInstances = 
services.entrySet().stream()
+                    .filter(it -> !Class.class.isInstance(it.getValue()))
+                    .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+            final Map<Class<?>, Object> wbcAwareServices = new 
HashMap<>(services);
+            servicesInstances.keySet().forEach(wbcAwareServices::remove);
+
+            final Properties properties = wbcAwareServices.entrySet().stream()
+                    .collect(Collector.of(
+                        Properties::new,
+                        (p, e) -> p.setProperty(e.getKey().getName(), 
Class.class.cast(e.getValue()).getName()),
+                        (properties1, properties2) -> {
+                            properties1.putAll(properties2);
+                            return properties1;
+                        }));
+
+            final WebBeansContext context = new 
WebBeansContext(servicesInstances, properties);
+            
DefaultSingletonService.class.cast(singletonInstance).register(currentClassLoader,
 context);
+        }
         testLifecycle = new StandaloneLifeCycle()
         {
             @Override
             public void beforeInitApplication(final Properties properties)
             {
                 final WebBeansContext instance = WebBeansContext.getInstance();
-                services.forEach((k, v) ->
+                if (lateServiceRegistration)
                 {
-                    final Class key = k;
-                    instance.registerService(key, v);
-                });
+                    services.forEach((k, v) ->
+                    {
+                        final Object impl = 
k.cast(getServiceInstance(instance, v));
+                        instance.registerService(Class.class.cast(k), impl);
+                    });
+                }
                 if (!services.containsKey(ScannerService.class))
                 {
                     instance.registerService(ScannerService.class, new 
OpenWebBeansTestMetaDataDiscoveryService());
@@ -197,6 +232,20 @@ public abstract class AbstractUnitTest
         }
     }
 
+    private Object getServiceInstance(final WebBeansContext instance, final 
Object v)
+    {
+        try
+        {
+            return Class.class.isInstance(v) ?
+                    
Class.class.cast(v).getConstructor(WebBeansContext.class).newInstance(instance) 
:
+                    v;
+        }
+        catch (final Exception e)
+        {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
     public void inject(final Object bean)
     {
         OWBInjector.inject(getBeanManager(), bean, null);
@@ -263,6 +312,10 @@ public abstract class AbstractUnitTest
         return (T) getBeanManager().getReference(bean, Object.class, 
getBeanManager().createCreationalContext(bean));
     }
 
+    protected <T> void addService(final Class<T> type, final Class<? extends 
T> instance)
+    {
+        this.services.put(type, instance);
+    }
 
     protected <T> void addService(final Class<T> type, final T instance)
     {

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/SerializationTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/SerializationTest.java?rev=1861094&r1=1861093&r2=1861094&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/SerializationTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/SerializationTest.java
 Wed Jun 12 07:51:17 2019
@@ -19,9 +19,13 @@
 package org.apache.webbeans.test.contexts;
 
 
+import static org.junit.Assert.assertTrue;
+
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.SerializableBean;
 import org.apache.webbeans.context.SessionContext;
+import org.apache.webbeans.service.ClassLoaderProxyService;
+import org.apache.webbeans.spi.DefiningClassService;
 import org.apache.webbeans.test.AbstractUnitTest;
 import org.apache.webbeans.test.contexts.serialize.AppScopedBean;
 import org.apache.webbeans.test.contexts.serialize.SessScopedBean;
@@ -45,7 +49,9 @@ import org.apache.webbeans.util.WebBeans
 
 import org.junit.Assert;
 
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
 
 
 import javax.enterprise.context.SessionScoped;
@@ -56,6 +62,7 @@ import javax.enterprise.inject.spi.BeanM
 import java.io.*;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Properties;
 import java.util.Set;
 
 
@@ -64,6 +71,8 @@ import java.util.Set;
  */
 public class SerializationTest extends AbstractUnitTest
 {
+    @Rule
+    public final TestName testName = new TestName();
 
     @SuppressWarnings("unchecked")
     @Test
@@ -156,6 +165,20 @@ public class SerializationTest extends A
     @Test
     public void testProxySerialization() throws Exception
     {
+        doProxySerialization();
+    }
+
+    @Test
+    public void testProxySerializationWithClassLoaderProxy() throws Exception
+    {
+        addService(DefiningClassService.class, ClassLoaderProxyService.class);
+        doProxySerialization();
+        assertTrue(ClassLoaderProxyService.class.isInstance(
+                getWebBeansContext().getService(DefiningClassService.class)));
+    }
+
+    private void doProxySerialization() throws IOException, 
ClassNotFoundException
+    {
         Collection<Class<?>> classes = new ArrayList<Class<?>>();
 
         // add a few random classes
@@ -167,28 +190,28 @@ public class SerializationTest extends A
         Set<Bean<?>> beans = getBeanManager().getBeans(SessScopedBean.class);
         Assert.assertNotNull(beans);
         Assert.assertTrue(beans.size() == 1);
-        
+
         @SuppressWarnings("unchecked")
         Bean<SessScopedBean> bean = (Bean<SessScopedBean>) 
beans.iterator().next();
         CreationalContext<SessScopedBean> ssbCreational = 
getBeanManager().createCreationalContext(bean);
         Assert.assertNotNull(ssbCreational);
-        
+
         SessScopedBean reference = (SessScopedBean) 
getBeanManager().getReference(bean, SessScopedBean.class, ssbCreational);
         Assert.assertNotNull(reference);
         Assert.assertTrue(reference instanceof OwbNormalScopeProxy);
-        
+
         reference.getApp().setI(4711);
-        
+
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(baos);
         oos.writeObject(reference);
         byte[] ba = baos.toByteArray();
-        
+
         ByteArrayInputStream bais = new ByteArrayInputStream(ba);
         ObjectInputStream ois = new ObjectInputStream(bais);
         SessScopedBean ssb2 =  (SessScopedBean) ois.readObject();
         Assert.assertNotNull(ssb2);
-        
+
         Assert.assertNotNull(ssb2.getApp());
         Assert.assertTrue(ssb2.getApp().getI() == 4711);
     }


Reply via email to