/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.web.filter;
import org.exoplatform.component.test.AbstractGateInTest;
import org.exoplatform.test.mocks.servlet.MockServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Created by The eXo Platform SAS Author : Nicolas Filotto nicolas.filotto@exoplatform.com 25 sept. 2009
*/
public class TestExtensibleFilter extends AbstractGateInTest {
public void testDoFilter() throws IOException, ServletException {
String pathRequest = "/testPath";
ExtensibleFilter exFilter = new ExtensibleFilter();
MockFilterOKTF mockFilterOKTF = new MockFilterOKTF();
MockFilterOKWTF mockFilterOKWTF = new MockFilterOKWTF();
MockFilterChain chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF)));
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertTrue(mockFilterOKWTF.end);
assertTrue(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKO())));
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertTrue(mockFilterOKWTF.end);
assertFalse(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKOIO())));
try {
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
fail("IOException is expected");
} catch (IOException e) {
}
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertFalse(mockFilterOKWTF.end);
assertFalse(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKOSE())));
try {
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
fail("ServletException is expected");
} catch (ServletException e) {
}
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertFalse(mockFilterOKWTF.end);
assertFalse(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKORE())));
try {
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
fail("RuntimeException is expected");
} catch (RuntimeException e) {
}
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertFalse(mockFilterOKWTF.end);
assertFalse(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKOER())));
try {
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
fail("Error is expected");
} catch (Error e) {
}
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertFalse(mockFilterOKWTF.end);
assertFalse(chain.called);
exFilter = new ExtensibleFilter();
mockFilterOKTF = new MockFilterOKTF();
mockFilterOKWTF = new MockFilterOKWTF();
MockFilterOKTF mockFilterOKTF2 = new MockFilterOKTF();
chain = new MockFilterChain();
exFilter.addFilterDefinitions(Arrays.asList(getFilterDefinition(mockFilterOKTF), getFilterDefinition(mockFilterOKWTF),
getFilterDefinition(new MockFilterKOIO()), getFilterDefinition(mockFilterOKTF2)));
try {
exFilter.doFilter(new MockServletRequest(null, null), null, chain, pathRequest);
fail("IOException is expected");
} catch (IOException e) {
}
assertTrue(mockFilterOKTF.start);
assertTrue(mockFilterOKTF.end);
assertTrue(mockFilterOKWTF.start);
assertFalse(mockFilterOKWTF.end);
assertFalse(chain.called);
assertFalse(mockFilterOKTF2.start);
assertFalse(mockFilterOKTF2.end);
}
private FilterDefinition getFilterDefinition(Filter filter) {
return new FilterDefinition(filter, Collections.singletonList(".*"));
}
private static class MockFilterChain implements FilterChain {
private boolean called;
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
called = true;
}
}
private static class MockFilterOKTF implements Filter {
private boolean start;
private boolean end;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
try {
start = true;
chain.doFilter(request, response);
} finally {
end = true;
}
}
}
private static class MockFilterOKWTF implements Filter {
private boolean start;
private boolean end;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
start = true;
chain.doFilter(request, response);
end = true;
}
}
private static class MockFilterKO implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
}
}
private static class MockFilterKOIO implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
throw new IOException();
}
}
private static class MockFilterKOSE implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
throw new ServletException();
}
}
private static class MockFilterKORE implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
throw new RuntimeException();
}
}
private static class MockFilterKOER implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
throw new Error();
}
}
}