//$Id: ContextTest.java 11208 2009-06-25 14:55:53Z manaRH $
package org.jboss.seam.test.unit;
import java.util.Map;
import javax.el.ELContext;
import javax.faces.context.ExternalContext;
import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.Component;
import org.jboss.seam.Namespace;
import org.jboss.seam.Seam;
import org.jboss.seam.contexts.ApplicationContext;
import org.jboss.seam.contexts.Context;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.EventContext;
import org.jboss.seam.contexts.FacesLifecycle;
import org.jboss.seam.contexts.ServerConversationContext;
import org.jboss.seam.contexts.ServletLifecycle;
import org.jboss.seam.contexts.SessionContext;
import org.jboss.seam.core.ConversationEntries;
import org.jboss.seam.core.Init;
import org.jboss.seam.core.Manager;
import org.jboss.seam.el.EL;
import org.jboss.seam.el.SeamELResolver;
import org.jboss.seam.mock.MockExternalContext;
import org.jboss.seam.mock.MockHttpServletRequest;
import org.jboss.seam.mock.MockHttpSession;
import org.jboss.seam.mock.MockServletContext;
import org.jboss.seam.servlet.ServletRequestMap;
import org.jboss.seam.servlet.ServletRequestSessionMap;
import org.jboss.seam.web.Parameters;
import org.jboss.seam.web.ServletContexts;
import org.jboss.seam.web.Session;
import org.testng.Assert;
import org.testng.annotations.Test;
public class ContextTest {
private void installComponent(Context appContext, Class clazz) {
appContext.set(Seam.getComponentName(clazz) + ".component",
new Component(clazz));
}
@Test
public void testContextManagement() throws Exception {
ELContext elContext = EL.createELContext();
SeamELResolver seamVariableResolver = new SeamELResolver();
// org.jboss.seam.bpm.SeamVariableResolver jbpmVariableResolver = new
// org.jboss.seam.bpm.SeamVariableResolver();
MockServletContext servletContext = new MockServletContext();
ServletLifecycle.beginApplication(servletContext);
MockExternalContext externalContext = new MockExternalContext(
servletContext);
Context appContext = new ApplicationContext(externalContext
.getApplicationMap());
// appContext.set( Seam.getComponentName(Init.class), new Init() );
installComponent(appContext, ConversationEntries.class);
installComponent(appContext, Manager.class);
installComponent(appContext, Session.class);
installComponent(appContext, ServletContexts.class);
installComponent(appContext, Parameters.class);
appContext.set(Seam.getComponentName(Init.class), new Init());
installComponent(appContext, Bar.class);
installComponent(appContext, Foo.class);
appContext.set("otherFoo", new Foo());
assert !Contexts.isEventContextActive();
assert !Contexts.isSessionContextActive();
assert !Contexts.isConversationContextActive();
assert !Contexts.isApplicationContextActive();
FacesLifecycle.beginRequest(externalContext);
assert Contexts.isEventContextActive();
assert Contexts.isSessionContextActive();
assert !Contexts.isConversationContextActive();
assert Contexts.isApplicationContextActive();
Manager.instance().setCurrentConversationId("3");
FacesLifecycle.resumeConversation(externalContext);
Manager.instance().setLongRunningConversation(true);
assert Contexts.isEventContextActive();
assert Contexts.isSessionContextActive();
assert Contexts.isConversationContextActive();
assert Contexts.isApplicationContextActive();
assert !Contexts.isPageContextActive();
assert Contexts.getEventContext() != null;
assert Contexts.getSessionContext() != null;
assert Contexts.getConversationContext() != null;
assert Contexts.getApplicationContext() != null;
assert Contexts.getEventContext() instanceof EventContext;
assert Contexts.getSessionContext() instanceof SessionContext;
assert Contexts.getConversationContext() instanceof ServerConversationContext;
assert Contexts.getApplicationContext() instanceof ApplicationContext;
Contexts.getSessionContext().set("zzz", "bar");
Contexts.getApplicationContext().set("zzz", "bar");
Contexts.getConversationContext().set("xxx", "yyy");
Object bar = seamVariableResolver.getValue(elContext, null, "bar");
assert bar != null;
assert bar instanceof Bar;
assert Contexts.getConversationContext().get("bar") == bar;
Object foo = Contexts.getSessionContext().get("foo");
assert foo != null;
assert foo instanceof Foo;
FacesLifecycle.endRequest(externalContext);
assert !Contexts.isEventContextActive();
assert !Contexts.isSessionContextActive();
assert !Contexts.isConversationContextActive();
assert !Contexts.isApplicationContextActive();
assert ((MockHttpSession) externalContext.getSession(false))
.getAttributes().size() == 4;
assert ((MockServletContext) externalContext.getContext())
.getAttributes().size() == 12;
FacesLifecycle.beginRequest(externalContext);
assert Contexts.isEventContextActive();
assert Contexts.isSessionContextActive();
assert !Contexts.isConversationContextActive();
assert Contexts.isApplicationContextActive();
Manager.instance().setCurrentConversationId("3");
FacesLifecycle.resumeConversation(externalContext);
assert Contexts.isEventContextActive();
assert Contexts.isSessionContextActive();
assert Contexts.isConversationContextActive();
assert Contexts.isApplicationContextActive();
assert Contexts.getEventContext() != null;
assert Contexts.getSessionContext() != null;
assert Contexts.getConversationContext() != null;
assert Contexts.getApplicationContext() != null;
assert Contexts.getEventContext() instanceof EventContext;
assert Contexts.getSessionContext() instanceof SessionContext;
assert Contexts.getConversationContext() instanceof ServerConversationContext;
assert Contexts.getApplicationContext() instanceof ApplicationContext;
assert Contexts.getSessionContext().get("zzz").equals("bar");
assert Contexts.getApplicationContext().get("zzz").equals("bar");
assert Contexts.getConversationContext().get("xxx").equals("yyy");
assert Contexts.getConversationContext().get("bar") == bar;
assert Contexts.getSessionContext().get("foo") == foo;
assert Contexts.getConversationContext().getNames().length == 2;
assert Contexts.getApplicationContext().getNames().length == 12;
assert Contexts.getSessionContext().getNames().length == 2;
assert seamVariableResolver.getValue(elContext, null, "zzz").equals(
"bar");
assert seamVariableResolver.getValue(elContext, null, "xxx").equals(
"yyy");
assert seamVariableResolver.getValue(elContext, null, "bar") == bar;
assert seamVariableResolver.getValue(elContext, null, "foo") == foo;
// JBSEAM-3077
assert EL.EL_RESOLVER.getValue(elContext, new Namespace("org.jboss.seam.core."), "conversationEntries") instanceof ConversationEntries;
try {
assert EL.EL_RESOLVER.getValue(elContext, new Namespace("org.jboss.seam."), "caughtException") == null;
} catch (Exception e) {
Assert.fail("An exception should not be thrown when a qualified name resolves to null", e);
}
/*
* assert jbpmVariableResolver.resolveVariable("zzz").equals("bar");
* assert jbpmVariableResolver.resolveVariable("xxx").equals("yyy");
* assert jbpmVariableResolver.resolveVariable("bar")==bar; assert
* jbpmVariableResolver.resolveVariable("foo")==foo;
*/
Manager.instance().setLongRunningConversation(false);
FacesLifecycle.endRequest(externalContext);
assert !Contexts.isEventContextActive();
assert !Contexts.isSessionContextActive();
assert !Contexts.isConversationContextActive();
assert !Contexts.isApplicationContextActive();
assert ((MockHttpSession) externalContext.getSession(false))
.getAttributes().size() == 3; // foo, zzz, org.jboss.seam.core.conversationEntries
assert ((MockServletContext) externalContext.getContext())
.getAttributes().size() == 12;
ServletLifecycle.endSession(((HttpServletRequest) externalContext
.getRequest()).getSession());
ServletLifecycle.endApplication();
}
@Test
public void testContexts() {
MockServletContext servletContext = new MockServletContext();
ServletLifecycle.beginApplication(servletContext);
MockHttpSession session = new MockHttpSession(servletContext);
MockHttpServletRequest request = new MockHttpServletRequest(session);
final ExternalContext externalContext = new MockExternalContext(
servletContext, request);
final Map sessionAdaptor = new ServletRequestSessionMap(request);
Map requestAdaptor = new ServletRequestMap(request);
Context appContext = new ApplicationContext(externalContext
.getApplicationMap());
installComponent(appContext, ConversationEntries.class);
installComponent(appContext, Manager.class);
appContext.set(Seam.getComponentName(Init.class), new Init());
FacesLifecycle.beginRequest(externalContext);
Manager.instance().setLongRunningConversation(true);
testContext(new ApplicationContext(externalContext.getApplicationMap()));
testContext(new SessionContext(sessionAdaptor));
testContext(new EventContext(requestAdaptor));
testContext(new ServerConversationContext(sessionAdaptor, "1"));
testEquivalence(new ContextCreator() {
public Context createContext() {
return new ServerConversationContext(sessionAdaptor, "1");
}
});
testEquivalence(new ContextCreator() {
public Context createContext() {
return new SessionContext(sessionAdaptor);
}
});
testEquivalence(new ContextCreator() {
public Context createContext() {
return new ApplicationContext(externalContext.getApplicationMap());
}
});
testIsolation(new ServerConversationContext(sessionAdaptor, "1"),
new ServerConversationContext(sessionAdaptor, "2"));
// testIsolation( new WebSessionContext(externalContext), new
// WebSessionContext( new MockExternalContext()) );
ServletLifecycle.endApplication();
}
private interface ContextCreator {
Context createContext();
}
private void testEquivalence(ContextCreator creator) {
//Creates a new context for each action to better simulate these operations
//happening in different call contexts.
{ //Test Adding
Context ctx = creator.createContext();
ctx.set("foo", "bar");
ctx.flush();
}
{ //Is Added?
Context ctx = creator.createContext();
assert ctx.get("foo").equals("bar");
}
{ // Test Removing
Context ctx = creator.createContext();
ctx.remove("foo");
ctx.flush();
}
{ // Is Removed?
Context ctx = creator.createContext();
assert !ctx.isSet("foo");
}
}
private void testIsolation(Context ctx, Context cty) {
ctx.set("foo", "bar");
ctx.flush();
assert !cty.isSet("foo");
cty.set("foo", "bar");
ctx.remove("foo");
ctx.flush();
assert cty.get("foo").equals("bar");
}
private void testContext(Context ctx) {
assert !ctx.isSet("foo");
ctx.set("foo", "bar");
assert ctx.isSet("foo");
assert ctx.get("foo").equals("bar");
ctx.remove("foo");
assert !ctx.isSet("foo");
}
}