/*
* $Id: FilterTest.java 484717 2006-12-08 19:57:59Z mrdon $
*
* 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.struts2.dispatcher;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import junit.framework.TestCase;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.springframework.mock.web.MockFilterConfig;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletContext;
import com.mockobjects.servlet.MockFilterChain;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.inject.Container;
/**
*
* @version $Date: 2006-12-08 14:57:59 -0500 (Fri, 08 Dec 2006) $ $Id: FilterTest.java 484717 2006-12-08 19:57:59Z mrdon $
*/
public class FilterTest extends TestCase {
protected MockFilterConfig filterConfig;
protected MockHttpServletRequest request;
protected MockHttpServletResponse response;
protected MockFilterChain filterChain;
protected MockFilterChain filterChain2;
protected MockServletContext servletContext;
protected InnerDispatcher _dispatcher1;
protected InnerDispatcher _dispatcher2;
protected ActionContextCleanUp cleanUp;
protected FilterDispatcher filterDispatcher;
protected int cleanUpFilterCreateDispatcherCount = 0; // number of times clean up filter create a dispatcher
protected int filterDispatcherCreateDispatcherCount = 0; // number of times FilterDispatcher create a dispatcher
@Override
protected void tearDown() throws Exception {
filterConfig = null;
request = null;
response = null;
filterChain = null;
filterChain2 = null;
servletContext = null;
_dispatcher1 = null;
_dispatcher2 = null;
cleanUp = null;
filterDispatcher = null;
}
@Override
protected void setUp() throws Exception {
Dispatcher.setInstance(null);
filterConfig = new MockFilterConfig();
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
servletContext = new MockServletContext();
_dispatcher1 = new InnerDispatcher(servletContext){
@Override
public String toString() {
return "dispatcher1";
}
};
_dispatcher2 = new InnerDispatcher(servletContext){
@Override
public String toString() {
return "dispatcher2";
}
};
filterChain = new MockFilterChain() {
@Override
public void doFilter(ServletRequest req, ServletResponse res) throws IOException, ServletException {
filterDispatcher.doFilter(req, res, filterChain2);
}
};
filterChain2 = new MockFilterChain() {
@Override
public void doFilter(ServletRequest req, ServletResponse res) throws IOException, ServletException {
}
};
cleanUp = new ActionContextCleanUp();
filterDispatcher = new FilterDispatcher() {
@Override
protected Dispatcher createDispatcher(FilterConfig filterConfig) {
filterDispatcherCreateDispatcherCount++;
return _dispatcher2;
}
@Override
public String toString() {
return "filterDispatcher";
}
};
}
public void testUsingFilterDispatcherOnly() throws Exception {
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
assertEquals(filterDispatcherCreateDispatcherCount, 0);
assertFalse(_dispatcher1.init);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertFalse(_dispatcher2.init);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
filterDispatcher.init(filterConfig);
FilterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.destroy();
// we are using FilterDispatcher only, so cleanUp filter's Dispatcher should not be created.
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
assertEquals(filterDispatcherCreateDispatcherCount, 1);
assertFalse(_dispatcher1.init);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertTrue(_dispatcher2.init);
assertTrue(_dispatcher2.prepare);
assertTrue(_dispatcher2.wrapRequest);
assertTrue(_dispatcher2.service);
assertTrue(Dispatcher.getInstance() == null);
}
public void testUsingFilterDispatcherOnly_Multiple() throws Exception {
filterDispatcher.setActionMapper(new FilterTest.InnerMapper());
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
assertEquals(filterDispatcherCreateDispatcherCount, 0);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertFalse(_dispatcher1.cleanUp);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
assertFalse(_dispatcher2.cleanUp);
filterDispatcher.init(filterConfig);
FilterDispatcher.setActionMapper(new FilterTest.InnerMapper());
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.doFilter(request, response, filterChain2);
filterDispatcher.destroy();
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
// We should create dispatcher once, although filter.doFilter(...) is called many times.
assertEquals(filterDispatcherCreateDispatcherCount, 1);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertFalse(_dispatcher1.cleanUp);
assertTrue(_dispatcher2.prepare);
assertTrue(_dispatcher2.wrapRequest);
assertTrue(_dispatcher2.service);
assertTrue(_dispatcher2.cleanUp);
assertTrue(Dispatcher.getInstance() == null);
}
/*public void testUsingCleanUpAndFilterDispatcher() throws Exception {
ObjectFactory oldObjecFactory = ObjectFactory.getObjectFactory();
try {
ObjectFactory.setObjectFactory(new InnerObjectFactory());
filterDispatcher.setActionMapper(new FilterTest.InnerMapper());
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
assertEquals(filterDispatcherCreateDispatcherCount, 0);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
cleanUp.init(filterConfig);
filterDispatcher.init(filterConfig);
cleanUp.doFilter(request, response, filterChain);
filterDispatcher.destroy();
cleanUp.destroy();
assertEquals(1, cleanUpFilterCreateDispatcherCount);
assertEquals(1, filterDispatcherCreateDispatcherCount);
assertTrue(_dispatcher1.prepare);
assertTrue(_dispatcher1.wrapRequest);
assertTrue(_dispatcher1.service);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
assertTrue(Dispatcher.getInstance() == null);
}
finally {
ObjectFactory.setObjectFactory(oldObjecFactory);
}
}
public void testUsingCleanUpAndFilterDispatcher_Multiple() throws Exception {
ObjectFactory oldObjecFactory = ObjectFactory.getObjectFactory();
try {
ObjectFactory.setObjectFactory(new InnerObjectFactory());
filterDispatcher.setActionMapper(new FilterTest.InnerMapper());
assertEquals(cleanUpFilterCreateDispatcherCount, 0);
assertEquals(filterDispatcherCreateDispatcherCount, 0);
assertFalse(_dispatcher1.prepare);
assertFalse(_dispatcher1.wrapRequest);
assertFalse(_dispatcher1.service);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
cleanUp.init(filterConfig);
filterDispatcher.init(filterConfig);
cleanUp.doFilter(request, response, filterChain);
cleanUp.doFilter(request, response, filterChain);
filterDispatcher.destroy();
cleanUp.destroy();
assertEquals(cleanUpFilterCreateDispatcherCount, 1);
assertEquals(filterDispatcherCreateDispatcherCount, 1);
assertTrue(_dispatcher1.prepare);
assertTrue(_dispatcher1.wrapRequest);
assertTrue(_dispatcher1.service);
assertFalse(_dispatcher2.prepare);
assertFalse(_dispatcher2.wrapRequest);
assertFalse(_dispatcher2.service);
assertTrue(Dispatcher.getInstance() == null);
}
finally {
ObjectFactory.setObjectFactory(oldObjecFactory);
}
}
*/
class InnerDispatcher extends Dispatcher {
public boolean init = false;
public boolean prepare = false;
public boolean wrapRequest = false;
public boolean service = false;
public boolean cleanUp = false;
public InnerDispatcher(ServletContext servletContext) {
super(servletContext, new HashMap<String, String>());
}
@Override
public void init() {
init= true;
}
@Override
public Container getContainer() {
return null;
}
@Override
public void prepare(HttpServletRequest request, HttpServletResponse response) {
prepare = true;
}
@Override
public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException {
wrapRequest = true;
return request;
}
@Override
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException {
service = true;
}
@Override
public void cleanup() {
cleanUp = true;
}
}
class NullInnerMapper implements ActionMapper {
public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
return null;
}
public String getUriFromActionMapping(ActionMapping mapping) {
return null;
}
}
public static class InnerMapper implements ActionMapper {
public InnerMapper() {}
public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
return new ActionMapping();
}
public String getUriFromActionMapping(ActionMapping mapping) {
return "";
}
}
class InnerObjectFactory extends ObjectFactory {
public InnerObjectFactory() {
super();
}
}
}
|