You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2014/01/25 23:54:34 UTC

svn commit: r1561418 [2/3] - in /myfaces/core/trunk: ./ impl-test/ impl-test/src/ impl-test/src/main/ impl-test/src/main/java/ impl/ impl/src/test/java/org/apache/myfaces/application/contracts/ impl/src/test/java/org/apache/myfaces/application/flow/ im...

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesRequestTestCase.java Sat Jan 25 22:54:34 2014
@@ -21,15 +21,14 @@ package org.apache.myfaces.mc.test.core;
 import java.io.IOException;
 
 import javax.faces.application.Application;
-import javax.faces.component.UICommand;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
+import javax.servlet.ServletRequestEvent;
 
 import org.apache.myfaces.test.mock.MockHttpServletRequest;
 import org.apache.myfaces.test.mock.MockHttpServletResponse;
 import org.apache.myfaces.test.mock.MockHttpSession;
+import org.apache.myfaces.test.mock.MockHttpSessionProxy;
 
 /**
  * <p>Abstract JUnit test case base class, with method to setup/teardown a request.
@@ -41,6 +40,7 @@ import org.apache.myfaces.test.mock.Mock
  *
  */
 public abstract class AbstractMyFacesRequestTestCase extends AbstractMyFacesTestCase
+    implements ServletMockContainer
 {
     
     @Override
@@ -53,8 +53,9 @@ public abstract class AbstractMyFacesReq
     @Override
     public void tearDown() throws Exception
     {
-        tearDownRequest();
+        endRequest();
         session = null;
+        lastSession = null;
         if (client != null)
         {
             client.setTestCase(null);
@@ -63,12 +64,12 @@ public abstract class AbstractMyFacesReq
         super.tearDown();
     }
 
-    protected void setupRequest() throws Exception
+    protected void setupRequest()
     {
         setupRequest(null);
     }
 
-    protected void setupRequest(String pathInfo) throws Exception
+    protected void setupRequest(String pathInfo)
     {
         if (pathInfo == null)
         {
@@ -87,32 +88,95 @@ public abstract class AbstractMyFacesReq
             }
         }
     }
-    
-    protected void setupRequest(String pathInfo, String query) throws Exception
+
+    protected void setupRequest(String pathInfo, String query)
     {
-        session = (session == null) ? new MockHttpSession() : session;
-        session.setServletContext(servletContext);
-        request = new MockHttpServletRequest(session);
+        if (request != null)
+        {
+            //tear down previous request
+            endRequest();
+        }
+        request = lastSession == null ? 
+            new MockHttpServletRequest() : new MockHttpServletRequest(lastSession);
         request.setServletContext(servletContext);
+        requestInitializedCalled = false;
+        if (session == null)
+        {
+            session = new MockHttpSessionProxy(servletContext, request);
+        }
+        else
+        {
+            session.setRequest(request);
+        }
+        session.setServletContext(servletContext);
         response = new MockHttpServletResponse();
         //TODO check if this is correct
         request.setPathElements(getContextPath(), getServletPath(), pathInfo, query);
 
-        facesContext = facesContextFactory.getFacesContext(servletContext, request, response, lifecycle);
+        facesContext = facesContextFactory.getFacesContext(
+            servletContext, request, response, lifecycle);
         externalContext = facesContext.getExternalContext();
         application = facesContext.getApplication();
         if (client != null)
         {
             client.apply(request);
+            client.reset(facesContext);
+        }
+        else
+        {
+            client = createClient();
         }
-        //Reset client
-        client = createClient();
     }
     
     protected MockMyFacesClient createClient()
     {
         return new MockMyFacesClient(facesContext, this);
     }
+
+    /**
+     * This method call startViewRequest(viewId) and doRequestInitialized()
+     */
+    public final void startViewRequest(String viewId)
+    {
+        setupRequest(viewId);
+        doRequestInitialized();
+    }
+    
+    /**
+     * This method call startViewRequest(null) and doRequestInitialized()
+     */
+    public final void startRequest()
+    {
+        startViewRequest(null);
+        doRequestInitialized();
+    }
+    
+    public void doRequestInitialized()
+    {
+        if (!requestInitializedCalled)
+        {
+            webContainer.requestInitialized(new ServletRequestEvent(servletContext, request));
+            requestInitializedCalled = true;
+        }
+    }
+    
+    /**
+     * This method call doRequestDestroyed() and then tearDownRequest(). 
+     */
+    public final void endRequest()
+    {
+        doRequestDestroyed();
+        tearDownRequest();
+    }
+    
+    public void doRequestDestroyed()
+    {
+        if (request != null)
+        {
+            lastSession = (MockHttpSession) request.getSession(false);
+            webContainer.requestDestroyed(new ServletRequestEvent(servletContext, request));
+        }
+    }
     
     protected void tearDownRequest()
     {
@@ -139,97 +203,116 @@ public abstract class AbstractMyFacesReq
         return "/faces";
     }
 
-    protected void processLifecycleExecute() throws Exception
+    public void processLifecycleExecute()
     {
         processLifecycleExecute(facesContext);
     }
+
+    public void processLifecycleRender()
+    {
+        processLifecycleRender(facesContext);
+    }
     
-    protected void processLifecycleExecuteAndRender() throws Exception
+    public void processLifecycleExecuteAndRender()
     {
         processLifecycleExecute();
-        processRender();
+        renderResponse();
     }
 
-    protected void processRestoreViewPhase() throws Exception
+    public void restoreView()
     {
-        processRestoreViewPhase(facesContext);
+        restoreView(facesContext);
     }
     
-    protected void processApplyRequestValuesPhase() throws Exception
+    public void applyRequestValues()
     {
-        processApplyRequestValuesPhase(facesContext);
+        applyRequestValues(facesContext);
     }
 
-    protected void processValidationsPhase() throws Exception
+    public void processValidations()
     {
-        processValidationsPhase(facesContext);
+        processValidations(facesContext);
     }
 
-    protected void processUpdateModelPhase() throws Exception
+    public void updateModelValues()
     {
-        processUpdateModelPhase(facesContext);
+        updateModelValues(facesContext);
 
     }
-    
-    protected void processInvokeApplicationPhase() throws Exception
+
+    public void invokeApplication()
     {
-        processInvokeApplicationPhase(facesContext);
+        invokeApplication(facesContext);
     }
     
-    protected void processRender() throws Exception
+    public void renderResponse()
     {
-        processRender(facesContext);
+        renderResponse(facesContext);
     }
     
-    protected void processRemainingExecutePhases() throws Exception
+    public void processRemainingExecutePhases()
     {
         processRemainingExecutePhases(facesContext);
     }
 
-    protected void processRemainingPhases() throws Exception
+    public void processRemainingPhases()
     {
         processRemainingPhases(facesContext);
     }
     
-    protected String getRenderedContent() throws IOException
+    public void executeBeforeRender()
     {
-        return getRenderedContent(facesContext);
+        executeBeforeRender(facesContext);
     }
     
-    protected void inputText(UIComponent input, String text)
+    public void executeViewHandlerRender()
     {
-        client.inputText((UIInput)input, text);
+        executeViewHandlerRender(facesContext);
+    }
+        
+    public void executeBuildViewCycle()
+    {
+        executeBuildViewCycle(facesContext);
     }
     
-    /**
-     * Simulate a submit, processing the remaining phases and setting up the new request.
-     * It delegates to client.submit, where the necessary data is gathered to be applied
-     * later on client.apply method.
-     * 
-     * @param component
-     * @throws Exception
-     */
-    protected void submit(UIComponent component) throws Exception
+    public void executeAfterRender()
     {
-        client.submit(component);
-        /*
-        processRemainingPhases();
-        client.submit((UICommand)component);
-        String viewId = facesContext.getViewRoot().getViewId();
-        tearDownRequest();
-        setupRequest(viewId);
-        */
+        executeAfterRender(facesContext);
+    }
+    
+    public String getRenderedContent() throws IOException
+    {
+        return getRenderedContent(facesContext);
     }
     
     protected MockMyFacesClient client = null;
     
     // Servlet objects 
     protected MockHttpServletRequest request = null;
+    protected boolean requestInitializedCalled = false;
     protected MockHttpServletResponse response = null;
-    protected MockHttpSession session = null;
+    protected MockHttpSessionProxy session = null;
+    protected MockHttpSession lastSession = null;
     
     protected Application application = null;
     protected ExternalContext externalContext = null;
     protected FacesContext facesContext = null;
 
+    @Override
+    public MockHttpServletRequest getRequest()
+    {
+        return request;
+    }
+
+    @Override
+    public MockHttpServletResponse getResponse()
+    {
+        return response;
+    }
+
+    @Override
+    public FacesContext getFacesContext()
+    {
+        return facesContext;
+    }
 }

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/AbstractMyFacesTestCase.java Sat Jan 25 22:54:34 2014
@@ -23,11 +23,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -75,9 +78,11 @@ import org.apache.myfaces.test.el.MockEx
 import org.apache.myfaces.test.mock.MockPrintWriter;
 import org.apache.myfaces.test.mock.MockServletConfig;
 import org.apache.myfaces.test.mock.MockServletContext;
+import org.apache.myfaces.test.mock.MockWebContainer;
 import org.apache.myfaces.webapp.AbstractFacesInitializer;
 import org.apache.myfaces.webapp.StartupServletContextListener;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.xml.sax.SAXException;
 
@@ -144,6 +149,12 @@ public abstract class AbstractMyFacesTes
                 .setContextClassLoader(
                         new URLClassLoader(new URL[0], this.getClass()
                                 .getClassLoader()));
+        
+        jsfConfiguration = sharedConfiguration.get(this.getClass().getName());
+        if (jsfConfiguration == null)
+        {
+            jsfConfiguration = new SharedFacesConfiguration();
+        }
 
         // Set up Servlet API Objects
         setUpServletObjects();
@@ -153,7 +164,11 @@ public abstract class AbstractMyFacesTes
 
         setUpServletListeners();
         
+        webContainer.contextInitialized(new ServletContextEvent(servletContext));
+        
         setUpFacesServlet();
+        
+        sharedConfiguration.put(this.getClass().getName(), jsfConfiguration);
     }
     
     /**
@@ -171,6 +186,8 @@ public abstract class AbstractMyFacesTes
         servletContext = new MockServletContext();
         servletConfig = new MockServletConfig(servletContext);
         servletContext.setDocumentRoot(getWebappContextURI());
+        webContainer = new MockWebContainer();
+        servletContext.setWebContainer(webContainer);
         setUpWebConfigParams();
     }
     
@@ -281,6 +298,11 @@ public abstract class AbstractMyFacesTes
         return new MyFacesMockFacesConfigurationProvider(this); 
     }
     
+    protected AbstractFacesInitializer createFacesInitializer()
+    {
+        return new JUnitFacesInitializer(this);
+    }
+    
     protected void setUpMyFaces() throws Exception
     {
         if (facesConfigurationProvider == null)
@@ -291,28 +313,18 @@ public abstract class AbstractMyFacesTes
                 DefaultFacesConfigurationProviderFactory.FACES_CONFIGURATION_PROVIDER_INSTANCE_KEY, 
                 facesConfigurationProvider);
         listener = new StartupServletContextListener();
-        listener.setFacesInitializer(new AbstractFacesInitializer()
-        {
-            
-            @Override
-            protected void initContainerIntegration(ServletContext servletContext,
-                    ExternalContext externalContext)
-            {
-                ExpressionFactory expressionFactory = createExpressionFactory();
-
-                RuntimeConfig runtimeConfig = buildConfiguration(servletContext, externalContext, expressionFactory);
-            }
-        });
-        listener.contextInitialized(new ServletContextEvent(servletContext));
+        listener.setFacesInitializer(createFacesInitializer());
+        webContainer.subscribeListener(listener);
+        //listener.contextInitialized(new ServletContextEvent(servletContext));
     }
 
-    protected void tearDownMyFaces() throws Exception
+    protected void tearDownMyFaces()
     {
         //Don't tear down FacesConfigurationProvider, because that is shared by all tests.
         //This helps to reduce the time each test takes 
         //facesConfigurationProvider = null
         
-        listener.contextDestroyed(new ServletContextEvent(servletContext));
+        //listener.contextDestroyed(new ServletContextEvent(servletContext));
     }
 
     protected void setUpFacesServlet() throws Exception
@@ -343,6 +355,8 @@ public abstract class AbstractMyFacesTes
     {
         tearDownServlets();
 
+        webContainer.contextDestroyed(new ServletContextEvent(servletContext));
+        
         tearDownServletListeners();
         
         listener = null;
@@ -356,6 +370,13 @@ public abstract class AbstractMyFacesTes
         threadContextClassLoader = null;
     }
     
+    @AfterClass
+    public static void tearDownClass()
+    {
+        standardFacesConfig = null;
+        sharedConfiguration.clear();
+    }
+    
     private String getLifecycleId()
     {
         // 1. check for Servlet's init-param
@@ -372,7 +393,7 @@ public abstract class AbstractMyFacesTes
      * 
      * @param facesContext
      */
-    protected void processLifecycleExecute(FacesContext facesContext)
+    public void processLifecycleExecute(FacesContext facesContext)
     {
         lifecycle.attachWindow(facesContext);
         lifecycle.execute(facesContext);
@@ -385,7 +406,7 @@ public abstract class AbstractMyFacesTes
      * @param facesContext
      * @throws Exception
      */
-    protected void processRestoreViewPhase(FacesContext facesContext) throws Exception
+    public void restoreView(FacesContext facesContext)
     {
         lifecycle.attachWindow(facesContext);
         executePhase(facesContext, PhaseId.RESTORE_VIEW);
@@ -399,12 +420,13 @@ public abstract class AbstractMyFacesTes
      * @param facesContext
      * @throws Exception
      */
-    protected void processApplyRequestValuesPhase(FacesContext facesContext) throws Exception
+    public void applyRequestValues(FacesContext facesContext)
     {
         if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
         {
             return;
         }
+        processRemainingPhasesBefore(facesContext, PhaseId.APPLY_REQUEST_VALUES);
         executePhase(facesContext, PhaseId.APPLY_REQUEST_VALUES);
         facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.APPLY_REQUEST_VALUES);
     }
@@ -416,12 +438,13 @@ public abstract class AbstractMyFacesTes
      * @param facesContext
      * @throws Exception
      */
-    protected void processValidationsPhase(FacesContext facesContext) throws Exception
+    public void processValidations(FacesContext facesContext)
     {
         if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
         {
             return;
         }
+        processRemainingPhasesBefore(facesContext, PhaseId.PROCESS_VALIDATIONS);
         executePhase(facesContext, PhaseId.PROCESS_VALIDATIONS);
         facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.PROCESS_VALIDATIONS);
     }
@@ -433,12 +456,13 @@ public abstract class AbstractMyFacesTes
      * @param facesContext
      * @throws Exception
      */
-    protected void processUpdateModelPhase(FacesContext facesContext) throws Exception
+    public void updateModelValues(FacesContext facesContext)
     {
         if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
         {
             return;
         }
+        processRemainingPhasesBefore(facesContext, PhaseId.UPDATE_MODEL_VALUES);
         executePhase(facesContext, PhaseId.UPDATE_MODEL_VALUES);
         facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.UPDATE_MODEL_VALUES);
 
@@ -451,19 +475,20 @@ public abstract class AbstractMyFacesTes
      * @param facesContext
      * @throws Exception
      */
-    protected void processInvokeApplicationPhase(FacesContext facesContext) throws Exception
+    public void invokeApplication(FacesContext facesContext)
     {
         if (facesContext.getRenderResponse() || facesContext.getResponseComplete())
         {
             return;
         }
+        processRemainingPhasesBefore(facesContext, PhaseId.INVOKE_APPLICATION);
         executePhase(facesContext, PhaseId.INVOKE_APPLICATION);
         facesContext.getAttributes().put(LAST_PHASE_PROCESSED, PhaseId.INVOKE_APPLICATION);
     }
 
-    protected void processLifecycleRender(FacesContext facesContext) throws Exception
+    public void processLifecycleRender(FacesContext facesContext)
     {
-        processRender(facesContext);
+        renderResponse(facesContext);
     }
 
     /**
@@ -471,7 +496,7 @@ public abstract class AbstractMyFacesTes
      * 
      * @param facesContext
      */
-    protected void processRender(FacesContext facesContext) throws Exception
+    public void renderResponse(FacesContext facesContext)
     {
         processRemainingExecutePhases(facesContext);
         lifecycle.render(facesContext);
@@ -479,7 +504,76 @@ public abstract class AbstractMyFacesTes
         facesContext.getAttributes().put(LAST_RENDER_PHASE_STEP, AFTER_RENDER_STEP);
     }
     
-    protected void processRemainingExecutePhases(FacesContext facesContext) throws Exception
+    protected void processRemainingPhasesBefore(FacesContext facesContext, PhaseId phaseId)
+    {
+        PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+        if (lastPhaseId == null)
+        {
+            if (!phaseId.equals(PhaseId.RESTORE_VIEW))
+            {
+                restoreView(facesContext);
+                lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            }
+            else
+            {
+                // There are no phases before restore view
+                return;
+            }
+        }
+        if (PhaseId.APPLY_REQUEST_VALUES.equals(phaseId))
+        {
+            return;
+        }
+        boolean continueProcess = false;
+        if (continueProcess || PhaseId.RESTORE_VIEW.equals(lastPhaseId))
+        {
+            applyRequestValues(facesContext);
+            lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            continueProcess = true;
+        }
+        if (PhaseId.PROCESS_VALIDATIONS.equals(phaseId))
+        {
+            return;
+        }
+        if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
+        {
+            processValidations(facesContext);
+            lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            continueProcess = true;
+        }
+        if (PhaseId.UPDATE_MODEL_VALUES.equals(phaseId))
+        {
+            return;
+        }
+        if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
+        {
+            updateModelValues(facesContext);
+            lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            continueProcess = true;
+        }
+        if (PhaseId.INVOKE_APPLICATION.equals(phaseId))
+        {
+            return;
+        }
+        if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
+        {
+            invokeApplication(facesContext);
+            lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            continueProcess = true;
+        }        
+        if (PhaseId.RENDER_RESPONSE.equals(phaseId))
+        {
+            return;
+        }
+        if (continueProcess || PhaseId.INVOKE_APPLICATION.equals(lastPhaseId))
+        {
+            renderResponse(facesContext);
+            lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
+            continueProcess = true;
+        }
+    }
+    
+    public void processRemainingExecutePhases(FacesContext facesContext)
     {
         PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
         if (lastPhaseId == null)
@@ -492,34 +586,34 @@ public abstract class AbstractMyFacesTes
             boolean continueProcess = false;
             if (PhaseId.RESTORE_VIEW.equals(lastPhaseId))
             {
-                processApplyRequestValuesPhase(facesContext);
+                applyRequestValues(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
             {
-                processValidationsPhase(facesContext);
+                processValidations(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
             {
-                processUpdateModelPhase(facesContext);
+                updateModelValues(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
             {
-                processInvokeApplicationPhase(facesContext);
+                invokeApplication(facesContext);
                 continueProcess = true;
             }
         }
     }
 
-    protected void processRemainingPhases(FacesContext facesContext) throws Exception
+    public void processRemainingPhases(FacesContext facesContext)
     {
         PhaseId lastPhaseId = (PhaseId) facesContext.getAttributes().get(LAST_PHASE_PROCESSED);
         if (lastPhaseId == null)
         {
             processLifecycleExecute(facesContext);
-            processRender(facesContext);
+            renderResponse(facesContext);
             return;
         }
         else
@@ -527,22 +621,22 @@ public abstract class AbstractMyFacesTes
             boolean continueProcess = false;
             if (PhaseId.RESTORE_VIEW.equals(lastPhaseId))
             {
-                processApplyRequestValuesPhase(facesContext);
+                applyRequestValues(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.APPLY_REQUEST_VALUES.equals(lastPhaseId))
             {
-                processValidationsPhase(facesContext);
+                processValidations(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.PROCESS_VALIDATIONS.equals(lastPhaseId))
             {
-                processUpdateModelPhase(facesContext);
+                updateModelValues(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.UPDATE_MODEL_VALUES.equals(lastPhaseId))
             {
-                processInvokeApplicationPhase(facesContext);
+                invokeApplication(facesContext);
                 continueProcess = true;
             }
             if (continueProcess || PhaseId.INVOKE_APPLICATION.equals(lastPhaseId))
@@ -550,7 +644,7 @@ public abstract class AbstractMyFacesTes
                 Integer step = (Integer) facesContext.getAttributes().get(LAST_RENDER_PHASE_STEP);
                 if (step == null)
                 {
-                    processRender(facesContext);
+                    renderResponse(facesContext);
                 }
                 else
                 {
@@ -585,41 +679,75 @@ public abstract class AbstractMyFacesTes
         return false;
     }
     
-    protected void executeBeforeRender(FacesContext facesContext) throws Exception
+    public void executeBeforeRender(FacesContext facesContext)
     {
         if (lifecycle instanceof LifecycleImpl)
         {
             LifecycleImpl lifecycleImpl = (LifecycleImpl) lifecycle;
             
             Object phaseExecutor = null;
-            Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
-            if (!renderExecutorField.isAccessible())
-            {
-                renderExecutorField.setAccessible(true);
-            }
-            phaseExecutor = renderExecutorField.get(lifecycleImpl);
-            
-            if (facesContext.getResponseComplete())
-            {
-                return;
-            }
-            
-            Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
-            if (phaseManager == null)
+            Object phaseManager = null;
+            try
             {
-                Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
-                if (!getPhaseListenersMethod.isAccessible())
+                Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+                if (!renderExecutorField.isAccessible())
                 {
-                    getPhaseListenersMethod.setAccessible(true);
+                    renderExecutorField.setAccessible(true);
                 }
-                
-                Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
-                if (!plmc.isAccessible())
+                phaseExecutor = renderExecutorField.get(lifecycleImpl);
+
+                if (facesContext.getResponseComplete())
                 {
-                    plmc.setAccessible(true);
+                    return;
                 }
-                phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
-                facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+
+                phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+                if (phaseManager == null)
+                {
+                    Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+                    if (!getPhaseListenersMethod.isAccessible())
+                    {
+                        getPhaseListenersMethod.setAccessible(true);
+                    }
+
+                    Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(
+                        new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+                    if (!plmc.isAccessible())
+                    {
+                        plmc.setAccessible(true);
+                    }
+                    phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(
+                        lifecycleImpl, null));
+                    facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+                }
+            }
+            catch (NoSuchFieldException ex)
+            {
+                throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (SecurityException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (IllegalArgumentException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (IllegalAccessException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (NoSuchMethodException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InvocationTargetException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InstantiationException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
             }
             
             Flash flash = facesContext.getExternalContext().getFlash();
@@ -689,7 +817,7 @@ public abstract class AbstractMyFacesTes
         }
     }
     
-    public void executeBuildViewCycle(FacesContext facesContext) throws Exception
+    public void executeBuildViewCycle(FacesContext facesContext)
     {
         Application application = facesContext.getApplication();
         ViewHandler viewHandler = application.getViewHandler();
@@ -811,48 +939,81 @@ public abstract class AbstractMyFacesTes
         }
     }
     
-    public void executeAfterRender(FacesContext facesContext) throws Exception
+    public void executeAfterRender(FacesContext facesContext)
     {
         if (lifecycle instanceof LifecycleImpl)
         {
             LifecycleImpl lifecycleImpl = (LifecycleImpl) lifecycle;
             
             Object phaseExecutor = null;
-            Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
-            if (!renderExecutorField.isAccessible())
+            Object phaseManager = null;
+            Method informPhaseListenersAfterMethod = null;
+            try
             {
-                renderExecutorField.setAccessible(true);
-            }
-            phaseExecutor = renderExecutorField.get(lifecycleImpl);
+                Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+                if (!renderExecutorField.isAccessible())
+                {
+                    renderExecutorField.setAccessible(true);
+                }
+                phaseExecutor = renderExecutorField.get(lifecycleImpl);
             
-            Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
-            if (phaseManager == null)
-            {
-                Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
-                if (!getPhaseListenersMethod.isAccessible())
+                phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+                if (phaseManager == null)
                 {
-                    getPhaseListenersMethod.setAccessible(true);
+                    Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+                    if (!getPhaseListenersMethod.isAccessible())
+                    {
+                        getPhaseListenersMethod.setAccessible(true);
+                    }
+
+                    Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+                    if (!plmc.isAccessible())
+                    {
+                        plmc.setAccessible(true);
+                    }
+                    phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
+                    facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
                 }
-                
-                Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
-                if (!plmc.isAccessible())
+
+                //phaseListenerMgr.informPhaseListenersAfter(renderExecutor.getPhase());
+                informPhaseListenersAfterMethod = phaseManager.getClass().getDeclaredMethod("informPhaseListenersAfter", PhaseId.class);
+                if(!(informPhaseListenersAfterMethod.isAccessible()))
                 {
-                    plmc.setAccessible(true);
+                    informPhaseListenersAfterMethod.setAccessible(true);
                 }
-                phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
-                facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+                
+                informPhaseListenersAfterMethod.invoke(phaseManager, PhaseId.RENDER_RESPONSE);
             }
-            
-            
-            Flash flash = facesContext.getExternalContext().getFlash();
-            
-            //phaseListenerMgr.informPhaseListenersAfter(renderExecutor.getPhase());
-            Method informPhaseListenersAfterMethod = phaseManager.getClass().getDeclaredMethod("informPhaseListenersAfter", PhaseId.class);
-            if(!(informPhaseListenersAfterMethod.isAccessible()))
+            catch (NoSuchFieldException ex)
+            {
+                throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (SecurityException ex)
             {
-                informPhaseListenersAfterMethod.setAccessible(true);
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
             }
-            informPhaseListenersAfterMethod.invoke(phaseManager, PhaseId.RENDER_RESPONSE);
+            catch (IllegalArgumentException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (IllegalAccessException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (NoSuchMethodException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InvocationTargetException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InstantiationException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            
+            Flash flash = facesContext.getExternalContext().getFlash();
             
             flash.doPostPhaseActions(facesContext);
             
@@ -877,7 +1038,7 @@ public abstract class AbstractMyFacesTes
      * @param phase
      * @throws Exception
      */
-    protected void executePhase(FacesContext facesContext, PhaseId phase) throws Exception
+    protected void executePhase(FacesContext facesContext, PhaseId phase)
     {
         if (lifecycle instanceof LifecycleImpl)
         {
@@ -889,52 +1050,86 @@ public abstract class AbstractMyFacesTes
                           phase.equals(PhaseId.UPDATE_MODEL_VALUES) ? 3 : 
                           phase.equals(PhaseId.INVOKE_APPLICATION) ? 4 : 5 ;
             
+            Method executePhaseMethod = null;
+            Object phaseManager = null;
             Object phaseExecutor = null;
-            if (phaseId < 5)
+            try
             {
-                Field lifecycleExecutorsField = lifecycleImpl.getClass().getDeclaredField("lifecycleExecutors");
-                if (!lifecycleExecutorsField.isAccessible())
+                if (phaseId < 5)
                 {
-                    lifecycleExecutorsField.setAccessible(true);
+                    Field lifecycleExecutorsField;
+                        lifecycleExecutorsField = lifecycleImpl.getClass().getDeclaredField("lifecycleExecutors");
+                        if (!lifecycleExecutorsField.isAccessible())
+                        {
+                            lifecycleExecutorsField.setAccessible(true);
+                        }
+                        phaseExecutor = ((Object[])lifecycleExecutorsField.get(lifecycleImpl))[phaseId];
                 }
-                phaseExecutor = ((Object[])lifecycleExecutorsField.get(lifecycleImpl))[phaseId];
-            }
-            else
-            {
-                Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
-                if (!renderExecutorField.isAccessible())
+                else
                 {
-                    renderExecutorField.setAccessible(true);
+                    Field renderExecutorField = lifecycleImpl.getClass().getDeclaredField("renderExecutor");
+                    if (!renderExecutorField.isAccessible())
+                    {
+                        renderExecutorField.setAccessible(true);
+                    }
+                    phaseExecutor = renderExecutorField.get(lifecycleImpl);
                 }
-                phaseExecutor = renderExecutorField.get(lifecycleImpl);
-            }
-            
-            Object phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
-            if (phaseManager == null)
-            {
-                Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
-                if (!getPhaseListenersMethod.isAccessible())
+
+                phaseManager = facesContext.getAttributes().get(PHASE_MANAGER_INSTANCE);
+                if (phaseManager == null)
                 {
-                    getPhaseListenersMethod.setAccessible(true);
+                    Method getPhaseListenersMethod = lifecycleImpl.getClass().getDeclaredMethod("getPhaseListeners");
+                    if (!getPhaseListenersMethod.isAccessible())
+                    {
+                        getPhaseListenersMethod.setAccessible(true);
+                    }
+
+                    Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
+                    if (!plmc.isAccessible())
+                    {
+                        plmc.setAccessible(true);
+                    }
+                    phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
+                    facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
                 }
-                
-                Constructor<?> plmc = PHASE_MANAGER_CLASS.getDeclaredConstructor(new Class[]{Lifecycle.class, FacesContext.class, PhaseListener[].class});
-                if (!plmc.isAccessible())
+
+                executePhaseMethod = lifecycleImpl.getClass().getDeclaredMethod("executePhase", new Class[]{
+                        FacesContext.class, PHASE_EXECUTOR_CLASS, PHASE_MANAGER_CLASS});
+                if (!executePhaseMethod.isAccessible())
                 {
-                    plmc.setAccessible(true);
+                    executePhaseMethod.setAccessible(true);
                 }
-                phaseManager = plmc.newInstance(lifecycle, facesContext, getPhaseListenersMethod.invoke(lifecycleImpl, null));
-                facesContext.getAttributes().put(PHASE_MANAGER_INSTANCE, phaseManager);
+                
+                executePhaseMethod.invoke(lifecycleImpl, facesContext, phaseExecutor, phaseManager);
             }
-            
-            Method executePhaseMethod = lifecycleImpl.getClass().getDeclaredMethod("executePhase", new Class[]{
-                    FacesContext.class, PHASE_EXECUTOR_CLASS, PHASE_MANAGER_CLASS});
-            if (!executePhaseMethod.isAccessible())
+            catch (NoSuchFieldException ex)
             {
-                executePhaseMethod.setAccessible(true);
+                throw new IllegalStateException("Cannot get executors from LifecycleImpl", ex);
             }
-            
-            executePhaseMethod.invoke(lifecycleImpl, facesContext, phaseExecutor, phaseManager);
+            catch (SecurityException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (IllegalArgumentException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (IllegalAccessException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (NoSuchMethodException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InvocationTargetException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }
+            catch (InstantiationException ex)
+            {
+                throw new UnsupportedOperationException("Cannot get executors from LifecycleImpl", ex);
+            }            
             
             if (phase.equals(PhaseId.RENDER_RESPONSE))
             {
@@ -962,6 +1157,7 @@ public abstract class AbstractMyFacesTes
     // Servlet objects 
     protected MockServletConfig servletConfig = null;
     protected MockServletContext servletContext = null;
+    protected MockWebContainer webContainer = null;
 
     // MyFaces specific objects created by the servlet environment
     protected StartupServletContextListener listener = null;
@@ -972,6 +1168,9 @@ public abstract class AbstractMyFacesTes
     protected Lifecycle lifecycle;
 
     private static FacesConfig standardFacesConfig;
+    private static Map<String, SharedFacesConfiguration> sharedConfiguration =
+        new ConcurrentHashMap<String, SharedFacesConfiguration>();
+    private SharedFacesConfiguration jsfConfiguration;
 
     // ------------------------------------------------------ Subclasses
 
@@ -1010,47 +1209,98 @@ public abstract class AbstractMyFacesTes
         public FacesConfig getAnnotationsFacesConfig(ExternalContext ectx,
                 boolean metadataComplete)
         {
-            FacesConfig facesConfig = null;
-            if (isScanAnnotations())
+            FacesConfig facesConfig = jsfConfiguration.getAnnotationsFacesConfig();
+            if (facesConfig == null)
             {
-                facesConfig = super.getAnnotationsFacesConfig(ectx, metadataComplete); 
-            }
-            
-            ManagedBeans annoManagedBeans = testCase.getClass().getAnnotation(ManagedBeans.class);
-            if (annoManagedBeans != null)
-            {
-                if (facesConfig == null)
+                if (isScanAnnotations())
                 {
-                    facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+                    facesConfig = super.getAnnotationsFacesConfig(ectx, metadataComplete); 
                 }
-                for (PageBean annoPageBean : annoManagedBeans.values())
+
+                ManagedBeans annoManagedBeans = testCase.getClass().getAnnotation(ManagedBeans.class);
+                if (annoManagedBeans != null)
                 {
+                    if (facesConfig == null)
+                    {
+                        facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+                    }
+                    for (PageBean annoPageBean : annoManagedBeans.values())
+                    {
+                        org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new 
+                            org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
+                        bean.setBeanClass(annoPageBean.clazz().getName());
+                        bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
+                        bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
+                        bean.setEager(Boolean.toString(annoPageBean.eager()));
+
+                        ((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
+                    }
+                }
+
+                PageBean annoPageBean = testCase.getClass().getAnnotation(PageBean.class);
+                if (annoPageBean != null)
+                {
+                    if (facesConfig == null)
+                    {
+                        facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
+                    }
                     org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new 
                         org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
                     bean.setBeanClass(annoPageBean.clazz().getName());
                     bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
                     bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
                     bean.setEager(Boolean.toString(annoPageBean.eager()));
-                    
+
                     ((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
                 }
+                jsfConfiguration.setAnnotationFacesConfig(facesConfig);
             }
+            return facesConfig;
+        }
 
-            PageBean annoPageBean = testCase.getClass().getAnnotation(PageBean.class);
-            if (annoPageBean != null)
+        @Override
+        public List<FacesConfig> getClassloaderFacesConfig(ExternalContext ectx)
+        {
+            List<FacesConfig> list = jsfConfiguration.getClassloaderFacesConfig();
+            if (list == null)
             {
-                if (facesConfig == null)
-                {
-                    facesConfig = new org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl();
-                }
-                org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl bean = new 
-                    org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl();
-                bean.setBeanClass(annoPageBean.clazz().getName());
-                bean.setName(annoPageBean.name() == null ? annoPageBean.clazz().getName() : annoPageBean.name());
-                bean.setScope(annoPageBean.scope() == null ? "request" : annoPageBean.scope());
-                bean.setEager(Boolean.toString(annoPageBean.eager()));
-                
-                ((org.apache.myfaces.config.impl.digester.elements.FacesConfigImpl)facesConfig).addManagedBean(bean);
+                list = super.getClassloaderFacesConfig(ectx);
+                jsfConfiguration.setClassloaderFacesConfig(list);
+            }
+            return list;
+        }
+
+        @Override
+        public List<FacesConfig> getFaceletTaglibFacesConfig(ExternalContext externalContext)
+        {
+            List<FacesConfig> list = jsfConfiguration.getFaceletTaglibFacesConfig();
+            if (list == null)
+            {
+                list = super.getFaceletTaglibFacesConfig(externalContext);
+                jsfConfiguration.setFaceletTaglibFacesConfig(list);
+            }
+            return list;
+        }
+
+        @Override
+        public List<FacesConfig> getFacesFlowFacesConfig(ExternalContext ectx)
+        {
+            List<FacesConfig> list = jsfConfiguration.getFacesFlowFacesConfig();
+            if (list == null)
+            {
+                list = super.getFacesFlowFacesConfig(ectx);
+                jsfConfiguration.setFacesFlowFacesConfig(list);
+            }
+            return list;
+        }
+
+        @Override
+        public FacesConfig getMetaInfServicesFacesConfig(ExternalContext ectx)
+        {
+            FacesConfig facesConfig = jsfConfiguration.getMetaInfServicesFacesConfig();
+            if (facesConfig == null)
+            {
+                facesConfig = super.getMetaInfServicesFacesConfig(ectx);
             }
             return facesConfig;
         }
@@ -1111,4 +1361,143 @@ public abstract class AbstractMyFacesTes
             ConfigFilesXmlValidationUtils.validateFacesConfigFile(url, ectx, version);
         }
     }
+    
+    protected class JUnitFacesInitializer extends AbstractFacesInitializer
+    {
+        private final AbstractMyFacesTestCase testCase;
+        
+        public JUnitFacesInitializer(AbstractMyFacesTestCase testCase)
+        {
+            this.testCase = testCase;
+        }
+        
+        @Override
+        protected void initContainerIntegration(ServletContext servletContext,
+                ExternalContext externalContext)
+        {
+            ExpressionFactory expressionFactory = createExpressionFactory();
+
+            RuntimeConfig runtimeConfig = buildConfiguration(servletContext, externalContext, expressionFactory);
+        }
+
+        public AbstractMyFacesTestCase getTestCase()
+        {
+            return testCase;
+        }
+
+    }
+    
+    protected static class SharedFacesConfiguration
+    {
+        private List<FacesConfig> classloaderFacesConfig;
+        private FacesConfig annotationFacesConfig;
+        private List<FacesConfig> faceletTaglibFacesConfig;
+        private List<FacesConfig> facesFlowFacesConfig;
+        private FacesConfig metaInfServicesFacesConfig;
+        private List<FacesConfig> contextSpecifiedFacesConfig;
+
+        /**
+         * @return the annotationFacesConfig
+         */
+        public FacesConfig getAnnotationsFacesConfig()
+        {
+            return annotationFacesConfig;
+        }
+
+        /**
+         * @param annotationFacesConfig the annotationFacesConfig to set
+         */
+        public void setAnnotationFacesConfig(FacesConfig annotationFacesConfig)
+        {
+            this.annotationFacesConfig = annotationFacesConfig;
+        }
+
+        /**
+         * @return the annotationFacesConfig
+         */
+        public FacesConfig getAnnotationFacesConfig()
+        {
+            return annotationFacesConfig;
+        }
+
+        /**
+         * @return the faceletTaglibFacesConfig
+         */
+        public List<FacesConfig> getFaceletTaglibFacesConfig()
+        {
+            return faceletTaglibFacesConfig;
+        }
+
+        /**
+         * @param faceletTaglibFacesConfig the faceletTaglibFacesConfig to set
+         */
+        public void setFaceletTaglibFacesConfig(List<FacesConfig> faceletTaglibFacesConfig)
+        {
+            this.faceletTaglibFacesConfig = faceletTaglibFacesConfig;
+        }
+
+        /**
+         * @return the facesFlowFacesConfig
+         */
+        public List<FacesConfig> getFacesFlowFacesConfig()
+        {
+            return facesFlowFacesConfig;
+        }
+
+        /**
+         * @param facesFlowFacesConfig the facesFlowFacesConfig to set
+         */
+        public void setFacesFlowFacesConfig(List<FacesConfig> facesFlowFacesConfig)
+        {
+            this.facesFlowFacesConfig = facesFlowFacesConfig;
+        }
+
+        /**
+         * @return the metaInfServicesFacesConfig
+         */
+        public FacesConfig getMetaInfServicesFacesConfig()
+        {
+            return metaInfServicesFacesConfig;
+        }
+
+        /**
+         * @param metaInfServicesFacesConfig the metaInfServicesFacesConfig to set
+         */
+        public void setMetaInfServicesFacesConfig(FacesConfig metaInfServicesFacesConfig)
+        {
+            this.metaInfServicesFacesConfig = metaInfServicesFacesConfig;
+        }
+
+        /**
+         * @return the contextSpecifiedFacesConfig
+         */
+        public List<FacesConfig> getContextSpecifiedFacesConfig()
+        {
+            return contextSpecifiedFacesConfig;
+        }
+
+        /**
+         * @param contextSpecifiedFacesConfig the contextSpecifiedFacesConfig to set
+         */
+        public void setContextSpecifiedFacesConfig(List<FacesConfig> contextSpecifiedFacesConfig)
+        {
+            this.contextSpecifiedFacesConfig = contextSpecifiedFacesConfig;
+        }
+
+        /**
+         * @return the classloaderFacesConfigList
+         */
+        public List<FacesConfig> getClassloaderFacesConfig()
+        {
+            return classloaderFacesConfig;
+        }
+
+        /**
+         * @param classloaderFacesConfigList the classloaderFacesConfigList to set
+         */
+        public void setClassloaderFacesConfig(List<FacesConfig> classloaderFacesConfigList)
+        {
+            this.classloaderFacesConfig = classloaderFacesConfigList;
+        }
+    }
 }

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java?rev=1561418&r1=1561417&r2=1561418&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/MockMyFacesClient.java Sat Jan 25 22:54:34 2014
@@ -20,6 +20,7 @@ package org.apache.myfaces.mc.test.core;
 
 import java.util.HashMap;
 import java.util.Map;
+import javax.faces.FacesException;
 
 import javax.faces.component.UICommand;
 import javax.faces.component.UIComponent;
@@ -32,10 +33,13 @@ import javax.faces.component.visit.Visit
 import javax.faces.context.FacesContext;
 import javax.faces.render.ResponseStateManager;
 import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.myfaces.shared.renderkit.RendererUtils;
 import org.apache.myfaces.test.mock.MockHttpServletRequest;
 import org.apache.myfaces.test.mock.MockHttpServletResponse;
+import org.junit.Assert;
 
 /**
  * Client that keep track and "translate" the commands done in a JSF component.
@@ -53,36 +57,100 @@ public class MockMyFacesClient
     private Map<String, Cookie> cookies = new HashMap<String, Cookie>();
     private Map<String, Object> headers = new HashMap<String, Object>();
     
-    private final FacesContext facesContext;
-    
     // It has sense the client has a reference over the test, because 
     // after all this class encapsulate some automatic operations
-    private AbstractMyFacesRequestTestCase testCase;
+    private ServletMockContainer testCase;
     
-    public MockMyFacesClient(FacesContext facesContext, AbstractMyFacesRequestTestCase testCase)
+    public MockMyFacesClient(FacesContext facesContext, ServletMockContainer testCase)
     {
-        this.facesContext = facesContext;
         this.testCase = testCase;
     }
     
+    public void processRedirect()
+    {
+        HttpServletResponse response = testCase.getResponse();
+        HttpServletRequest request = testCase.getRequest();
+        if (response.getStatus() == HttpServletResponse.SC_FOUND)
+        {
+            testCase.processRemainingPhases(); //testCase.processRemainingPhases();
+            testCase.endRequest();
+            String location = response.getHeader("Location");
+            String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
+            String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
+            int cpi = location.indexOf(contextPath);
+            int spi = cpi < 0 ? -1 : location.indexOf(servletPath, cpi+contextPath.length());
+            String viewId;
+            if (spi >= 0)
+            {
+                viewId = location.substring(spi+servletPath.length());
+            }
+            else
+            {
+                viewId = location;
+            }
+            testCase.startViewRequest(viewId);
+        }
+        else
+        {
+            Assert.fail("Expected redirect not found");
+        }
+    }
+    
     public void inputText(UIInput input, String text)
     {
         parameters.put(input.getClientId(), text);
     }
     
-    public void submit(UIComponent component) throws Exception
+    public void inputText(String clientId, String text)
+    {
+        UIComponent input = getTestCase().getFacesContext().
+            getViewRoot().findComponent(clientId);
+        if (input == null)
+        {
+            throw new FacesException("input with clientId:"+clientId+" not found");
+        }
+        else
+        {
+            parameters.put(input.getClientId(), text);
+        }
+    }
+    
+    /**
+     * Simulate a submit, processing the remaining phases and setting up the new request.
+     * It delegates to client.submit, where the necessary data is gathered to be applied
+     * later on client.apply method.
+     * 
+     * @param component
+     * @throws Exception
+     */
+    public void submit(UIComponent component)
     {
         testCase.processRemainingPhases();
         this.internalSubmit((UICommand)component);
-        String viewId = facesContext.getViewRoot().getViewId();
-        testCase.tearDownRequest();
-        testCase.setupRequest(viewId);
+        String viewId = testCase.getFacesContext().getViewRoot().getViewId();
+        testCase.endRequest();
+        testCase.startViewRequest(viewId);
+    }
+    
+    public void submit(String clientId)
+    {
+        UIComponent button = getTestCase().getFacesContext().
+            getViewRoot().findComponent(clientId);
+        if (button == null)
+        {
+            throw new FacesException("button with clientId:"+clientId+" not found");
+        }
+        else
+        {
+            submit(button);
+        }
     }
     
     protected void internalSubmit(UICommand command)
     {
         if (command instanceof HtmlCommandButton)
         {
+            final FacesContext facesContext = testCase.getFacesContext();
             UIForm form = getParentForm(command);
             VisitContext visitContext = VisitContext.createVisitContext(facesContext);
             form.visitTree(visitContext, new VisitCallback(){
@@ -102,16 +170,19 @@ public class MockMyFacesClient
                 
             });
             parameters.put(form.getClientId(facesContext)+"_SUBMIT", "1");
-            parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
             Object value = command.getValue();
             parameters.put(command.getClientId(), value == null ? "" : value.toString());
+            
+            applyStateFromPreviousRequest();
+            /*
+            parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
             if (facesContext.getExternalContext().getClientWindow() != null)
             {
                 parameters.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, facesContext.getExternalContext().getClientWindow().getId());
             }
             MockHttpServletResponse response = (MockHttpServletResponse) facesContext.getExternalContext().getResponse(); 
             Cookie cookie = response.getCookie("oam.Flash.RENDERMAP.TOKEN");
-            getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);
+            getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);*/
         }
     }
     
@@ -120,21 +191,23 @@ public class MockMyFacesClient
         ajax(source, event, execute, render, submit, false);
     }
             
-    public void ajax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues) throws Exception
+    public void ajax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues)
     {
         testCase.processRemainingPhases();
         this.internalAjax(source, event, execute, render, submit, resetValues);
-        String viewId = facesContext.getViewRoot().getViewId();
-        testCase.tearDownRequest();
-        testCase.setupRequest(viewId);
+        String viewId = testCase.getFacesContext().getViewRoot().getViewId();
+        testCase.endRequest();
+        testCase.startViewRequest(viewId);
     }
     
     protected void internalAjax(UIComponent source, String event, String execute, String render, boolean submit, boolean resetValues)
     {
+        final FacesContext facesContext = testCase.getFacesContext();
         parameters.put("javax.faces.partial.ajax", "true");
         parameters.put("javax.faces.behavior.event", event);
         parameters.put("javax.faces.partial.event", "action".equals(event) ? "click" : event);
-        parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
+        applyStateFromPreviousRequest();
+        //parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
         parameters.put("javax.faces.source", source.getClientId(facesContext));
         if (execute == null)
         {
@@ -160,14 +233,35 @@ public class MockMyFacesClient
             parameters.put("javax.faces.partial.resetValues", "true");
         }
         
-        MockHttpServletResponse response = (MockHttpServletResponse) facesContext.getExternalContext().getResponse(); 
-        Cookie cookie = response.getCookie("oam.Flash.RENDERMAP.TOKEN");
-        getCookies().put("oam.Flash.RENDERMAP.TOKEN", cookie);
-        
         headers.put("Faces-Request", "partial/ajax");
         headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
     }
     
+    protected void applyStateFromPreviousRequest()
+    {
+        FacesContext facesContext = testCase.getFacesContext();
+        
+        parameters.put(ResponseStateManager.VIEW_STATE_PARAM, facesContext.getApplication().getStateManager().getViewState(facesContext));
+        if (facesContext.getExternalContext().getClientWindow() != null)
+        {
+            parameters.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, facesContext.getExternalContext().getClientWindow().getId());
+        }
+        
+        applyCookiesFromPreviousRequest();
+    }
+    
+    protected void applyCookiesFromPreviousRequest()
+    {
+        MockHttpServletResponse response = (MockHttpServletResponse) testCase.getResponse();
+        if (response.getCookies() != null && !response.getCookies().isEmpty())
+        {
+            for (Map.Entry<String, Cookie> entry : response.getCookies().entrySet())
+            {
+                getCookies().put(entry.getKey(), entry.getValue());
+            }
+        }
+    }
+    
     public Map<String, String> getParameters()
     {
         return parameters;
@@ -231,8 +325,15 @@ public class MockMyFacesClient
             request.addCookie(entry.getValue());
         }
     }
+    
+    public void reset(FacesContext facesContext)
+    {
+        this.parameters.clear();
+        this.headers.clear();
+        this.cookies.clear();
+    }
 
-    public AbstractMyFacesRequestTestCase getTestCase()
+    public ServletMockContainer getTestCase()
     {
         return testCase;
     }

Added: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java?rev=1561418&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java (added)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java Sat Jan 25 22:54:34 2014
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.mc.test.core;
+
+import javax.faces.context.FacesContext;
+import org.apache.myfaces.test.mock.MockHttpServletRequest;
+import org.apache.myfaces.test.mock.MockHttpServletResponse;
+
+/**
+ *
+ */
+public interface ServletMockContainer
+{
+    
+    public MockHttpServletRequest getRequest();
+    
+    public MockHttpServletResponse getResponse();
+    
+    public FacesContext getFacesContext();
+
+    public void processRemainingPhases();
+
+    public void endRequest();
+
+    public void startViewRequest(String viewId);
+}

Propchange: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/mc/test/core/ServletMockContainer.java
------------------------------------------------------------------------------
    svn:eol-style = native