/**
* Copyright 2012 the original author or authors.
*
* Licensed 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 de.jbellmann.tomcat.cassandra.hector;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.servlet.ServletContext;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import de.jbellmann.tomcat.cassandra.CassandraManager;
import de.jbellmann.tomcat.cassandra.CassandraTemplate;
/**
*
* @author Joerg Bellmann
*
*/
public class RequestTest {
private static final String REQUESTED_SESSION_ID = "REQUESTED_SESSION_ID";
private Context context;
private Response response;
@Before
public void setUp() throws LifecycleException {
Container container = Mockito.mock(Container.class);
Mockito.when(container.getName()).thenReturn("TEST_CONTAINER");
context = Mockito.mock(Context.class);
CassandraManager manager = new MockCassandraManager();
Mockito.when(context.getManager()).thenReturn(manager);
Mockito.when(context.getName()).thenReturn("TEST_CONTEXT");
Mockito.when(context.getParent()).thenReturn(container);
// CookieConfig
SessionCookieConfig cookieConfig = Mockito.mock(SessionCookieConfig.class);
Mockito.when(cookieConfig.getName()).thenReturn("JSESSIONID");
Mockito.when(cookieConfig.getComment()).thenReturn("TEST-COOKIE-COMMENT");
Mockito.when(cookieConfig.getMaxAge()).thenReturn(-1);
Mockito.when(cookieConfig.getPath()).thenReturn("/");
//
ServletContext servletContext = Mockito.mock(ServletContext.class);
Mockito.when(servletContext.getEffectiveSessionTrackingModes()).thenReturn(getTrackingModes());
Mockito.when(servletContext.getSessionCookieConfig()).thenReturn(cookieConfig);
//
Mockito.when(context.getServletContext()).thenReturn(servletContext);
Mockito.when(context.getSessionCookieName()).thenReturn("JSESSIONID");
//
response = Mockito.mock(Response.class);
HttpServletResponse servletResponse = Mockito.mock(HttpServletResponse.class);
Mockito.when(servletResponse.isCommitted()).thenReturn(false);
Mockito.when(response.getResponse()).thenReturn(servletResponse);
CassandraTemplate template = new MockCassandraTemplate();
template.initialize(getClass().getClassLoader());
manager.setContainer(context);
manager.setCassandraTemplate(template);
manager.setMaxInactiveInterval(1000 * 60 * 30);
manager.start();
}
@Test
public void testGetSession() throws LifecycleException {
Request request = new Request();
request.setContext(context);
request.setResponse(response);
// fake cookie sent a value
request.setRequestedSessionId(REQUESTED_SESSION_ID);
HttpSession session = request.getSession();
Assert.assertFalse(REQUESTED_SESSION_ID.equals(session.getId()));
}
@Test
public void testRecycleSessionId() {
Mockito.when(context.getSessionCookiePath()).thenReturn("/");
Request request = new Request();
request.setContext(context);
request.setResponse(response);
// fake cookie sent a value
request.setRequestedSessionId(REQUESTED_SESSION_ID);
request.setRequestedSessionCookie(true);
HttpSession session = request.getSession();
Assert.assertEquals(REQUESTED_SESSION_ID, session.getId());
}
private Set<SessionTrackingMode> getTrackingModes() {
Set<SessionTrackingMode> trackingModes = new HashSet<SessionTrackingMode>();
trackingModes.add(SessionTrackingMode.COOKIE);
return trackingModes;
}
class MockCassandraTemplate extends HectorCassandraTemplate {
@Override
public void initialize(ClassLoader classLoader) {
// do nothing
}
@Override
public long getLastAccessedTime(String sessionId) {
return sessionId.equals(REQUESTED_SESSION_ID) ? -1 : System.currentTimeMillis();
}
// @Override
// public void addSession(String sessionId) {
// }
@Override
public void setCreationTime(String sessionId, long time) {
}
@Override
public void setLastAccessedTime(String sessionId, long time) {
}
}
class MockCassandraManager extends CassandraManager {
@Override
protected String generateSessionId() {
return UUID.randomUUID().toString().replace("-", "");
}
@Override
public void load() {
}
@Override
public CassandraTemplate createCassandraTemplate() {
return new MockCassandraTemplate();
}
}
}