/*
* See LICENSE for licensing and NOTICE for copyright.
*/
package net.shibboleth.idp.cas.flow;
import net.shibboleth.idp.cas.ticket.Ticket;
import net.shibboleth.idp.cas.ticket.TicketContext;
import net.shibboleth.idp.profile.AbstractProfileAction;
import net.shibboleth.idp.session.IdPSession;
import net.shibboleth.idp.session.SessionException;
import net.shibboleth.idp.session.context.SessionContext;
import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
import org.opensaml.profile.context.ProfileRequestContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.test.MockExternalContext;
import org.springframework.webflow.test.MockRequestContext;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Abstract base class for all tests that of actions that extend {@link AbstractProfileAction}.
*
* @author Marvin S. Addison
*/
@ContextConfiguration(
locations = {
"/system/conf/global-system.xml",
"/system/conf/mvc-beans.xml",
"/system/conf/relying-party-system.xml",
"/test/test-service-registry.xml",
"/test/test-webflow-config.xml",
"/flows/cas/login/login-beans.xml",
"/flows/cas/serviceValidate/serviceValidate-beans.xml",
"/flows/cas/proxyValidate/proxyValidate-beans.xml"},
initializers = IdPPropertiesApplicationContextInitializer.class)
@WebAppConfiguration
public abstract class AbstractProfileActionTest extends AbstractTestNGSpringContextTests {
protected static final String TEST_SESSION_ID = "+TkSGIRofZyue/p8F4M7TA==";
protected static final String TEST_PRINCIPAL_NAME = "omega";
protected static RequestContext createProfileContext() {
final MockRequestContext requestContext = new MockRequestContext();
final MockExternalContext externalContext = new MockExternalContext();
externalContext.setNativeRequest(new MockHttpServletRequest());
externalContext.setNativeResponse(new MockHttpServletResponse());
requestContext.setExternalContext(externalContext);
final ProfileRequestContext profileRequestContext = new ProfileRequestContext();
requestContext.getConversationScope().put(ProfileRequestContext.BINDING_KEY, profileRequestContext);
return requestContext;
}
protected static ProfileRequestContext getProfileContext(final RequestContext context) {
return (ProfileRequestContext) context.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
}
protected static RequestContext createSessionContext(final String sessionId) {
return createSessionContext(sessionId, true);
}
protected static RequestContext createSessionContext(final String sessionId, final boolean expiredFlag) {
final RequestContext requestContext = createProfileContext();
final ProfileRequestContext profileRequestContext =
(ProfileRequestContext) requestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
final SessionContext sessionContext = new SessionContext();
sessionContext.setIdPSession(createSession(sessionId, expiredFlag));
profileRequestContext.addSubcontext(sessionContext);
return requestContext;
}
protected static IdPSession createSession(final String sessionId, final boolean expiredFlag) {
final IdPSession mockSession = mock(IdPSession.class);
when(mockSession.getId()).thenReturn(sessionId);
when(mockSession.getPrincipalName()).thenReturn(TEST_PRINCIPAL_NAME);
try {
when(mockSession.checkTimeout()).thenReturn(expiredFlag);
} catch (SessionException e) {
throw new RuntimeException("Session exception", e);
}
return mockSession;
}
protected static RequestContext createTicketContext(final Ticket ticket) {
final RequestContext requestContext = createProfileContext();
final ProfileRequestContext profileRequestContext =
(ProfileRequestContext) requestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
profileRequestContext.addSubcontext(new TicketContext(ticket));
return requestContext;
}
}