diff --git a/pom.xml b/pom.xml
index f506089..7e7a0d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,7 @@
UTF-8
4.11
+ 3.2
1.9.5
15.0
2.6
@@ -39,16 +40,11 @@
-
- junit
- junit
- 4.11
- test
-
com.google.guava
guava
${guava.version}
+ cdi1.0
junit
@@ -56,6 +52,12 @@
${junit.version}
test
+
+ org.easymock
+ easymock
+ ${easymock.version}
+ test
+
org.mockito
mockito-all
@@ -78,11 +80,11 @@
commons-httpclient
${commons-httpclient.version}
-
-
-
-
-
+
+ log4j
+ log4j
+ ${log4j.version}
+
diff --git a/prerender-java.iml b/prerender-java.iml
index 2dc2562..2ff1f47 100644
--- a/prerender-java.iml
+++ b/prerender-java.iml
@@ -10,15 +10,19 @@
+
-
+
+
+
+
diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java
index 5e9defd..cd7fc62 100644
--- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java
+++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java
@@ -1,57 +1,66 @@
package com.github.greengerong;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
+import com.github.greengerong.config.SeoFilterConfig;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;
-import java.net.URISyntaxException;
-import java.util.Arrays;
import java.util.List;
-import java.util.regex.Pattern;
-
-import static com.google.common.collect.FluentIterable.from;
public class PreRenderSEOFilter implements Filter {
+ public static final String REFERER_HEADER = "Referer";
+ private static final String FORWARD_SLASH = "/";
+
+ public static Logger LOG = Logger.getLogger(PreRenderSEOFilter.class);
- private FilterConfig filterConfig;
+ private SeoFilterConfig config;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
- this.filterConfig = filterConfig;
+ config = new SeoFilterConfig(filterConfig);
+ LOG.info("Initialization Complete");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
- try {
- final HttpServletRequest request = (HttpServletRequest) servletRequest;
- if (shouldShowPrerenderedPage(request)) {
+
+ final HttpServletRequest request = (HttpServletRequest) servletRequest;
+ if (shouldShowPrerenderedPage(request)) {
+ try {
final ResponseResult result = getPrerenderedPageResponse(request);
- if (result.getStatusCode() == 200) {
+ if (result.getStatusCode() == HttpStatus.SC_OK) {
final PrintWriter writer = servletResponse.getWriter();
writer.write(result.getResponseBody());
writer.flush();
- return;
}
+ } catch (Exception e) {
+ LOG.warn("An error occured processing the request", e);
}
- } catch (Exception e) {
+ }else {
+ filterChain.doFilter(servletRequest, servletResponse);
}
- filterChain.doFilter(servletRequest, servletResponse);
+ }
+
+ @Override
+ public void destroy() {
+ config = null;
+ LOG.info("Shutting down");
}
private ResponseResult getPrerenderedPageResponse(HttpServletRequest request) throws IOException {
- final String apiUrl = getApiUrl(getFullUrl(request));
+ final String apiUrl = getApiUrl(request, config);
final HttpClient httpClient = new HttpClient();
final GetMethod getMethod = new GetMethod(apiUrl);
- setConfig(httpClient);
+ setProxy(httpClient);
setHttpHeader(getMethod);
final int code = httpClient.executeMethod(getMethod);
final String responseBody = getMethod.getResponseBodyAsString();
@@ -59,7 +68,15 @@ private ResponseResult getPrerenderedPageResponse(HttpServletRequest request) th
return new ResponseResult(code, body);
}
- private String getFullUrl(HttpServletRequest request) {
+ public static String getApiUrl(HttpServletRequest request, SeoFilterConfig config) {
+ String prerenderServiceUrl = config.getPrerenderServiceUrl();
+ if (!prerenderServiceUrl.endsWith(FORWARD_SLASH)) {
+ prerenderServiceUrl += FORWARD_SLASH;
+ }
+ return prerenderServiceUrl + getFullUrl(request);
+ }
+
+ private static String getFullUrl(HttpServletRequest request) {
final StringBuffer url = request.getRequestURL();
final String queryString = request.getQueryString();
if (queryString != null) {
@@ -74,164 +91,37 @@ private void setHttpHeader(HttpMethod httpMethod) {
httpMethod.setRequestHeader("Content-Type", "text/html");
}
- private void setConfig(HttpClient httpClient) {
- final String proxy = filterConfig.getInitParameter("proxy");
- if (StringUtils.isNotBlank(proxy)) {
- final int proxyPort = Integer.parseInt(filterConfig.getInitParameter("proxyPort"));
- httpClient.getHostConfiguration().setProxy(proxy, proxyPort);
- }
- }
-
- @Override
- public void destroy() {
- filterConfig = null;
- }
-
- private List getCrawlerUserAgents() {
- List crawlerUserAgents = Lists.newArrayList("googlebot", "yahoo", "bingbot", "baiduspider",
- "facebookexternalhit", "twitterbot");
- final String crawlerUserAgentsFromConfig = filterConfig.getInitParameter("crawlerUserAgents");
- if (StringUtils.isNotBlank(crawlerUserAgentsFromConfig)) {
- crawlerUserAgents.addAll(Arrays.asList(crawlerUserAgentsFromConfig.trim().split(",")));
- }
-
- return crawlerUserAgents;
- }
-
- private List getExtensionsToIgnore() {
- List extensionsToIgnore = Lists.newArrayList(".js", ".css", ".less", ".png", ".jpg", ".jpeg",
- ".gif", ".pdf", ".doc", ".txt", ".zip", ".mp3", ".rar", ".exe", ".wmv", ".doc", ".avi", ".ppt", ".mpg",
- ".mpeg", ".tif", ".wav", ".mov", ".psd", ".ai", ".xls", ".mp4", ".m4a", ".swf", ".dat", ".dmg",
- ".iso", ".flv", ".m4v", ".torrent");
- final String extensionsToIgnoreFromConfig = filterConfig.getInitParameter("extensionsToIgnore");
- if (StringUtils.isNotBlank(extensionsToIgnoreFromConfig)) {
- extensionsToIgnore.addAll(Arrays.asList(extensionsToIgnoreFromConfig.trim().split(",")));
+ private void setProxy(HttpClient httpClient) {
+ if (StringUtils.isNotBlank(config.getProxy())) {
+ httpClient.getHostConfiguration().setProxy(config.getProxy(), config.getProxyPort());
}
-
- return extensionsToIgnore;
}
- private List getWhitelist() {
- final String whitelist = filterConfig.getInitParameter("whitelist");
- if (StringUtils.isNotBlank(whitelist)) {
- return Arrays.asList(whitelist.trim().split(","));
- }
- return null;
- }
-
- private List getBlacklist() {
- final String blacklist = filterConfig.getInitParameter("blacklist");
- if (StringUtils.isNotBlank(blacklist)) {
- return Arrays.asList(blacklist.trim().split(","));
- }
- return null;
- }
-
- private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URISyntaxException {
- final String useAgent = request.getHeader("User-Agent");
- final String url = request.getRequestURL().toString();
- final String referer = request.getHeader("Referer");
-
- if (hasEscapedFragment(request)) {
+ private boolean shouldShowPrerenderedPage(HttpServletRequest request){
+ if (RenderUtils.hasEscapedFragment(request)) {
return true;
}
- if (StringUtils.isBlank(useAgent)) {
- return false;
- }
-
- if (!isInSearchUserAgent(useAgent)) {
+ if (!RenderUtils.isValidUserAgent(request, config)) {
return false;
}
+ final String url = request.getRequestURI();
- if (isInResources(url)) {
+ if (RenderUtils.ignoreFileExtension(url, config)) {
return false;
}
- final List whiteList = getWhitelist();
- if (whiteList != null && !isInWhiteList(url, whiteList)) {
+ final List whiteList = config.getWhitelist();
+ if (!whiteList.isEmpty() && !RenderUtils.isInWhiteList(url, whiteList)) {
return false;
}
- final List blacklist = getBlacklist();
- if (blacklist != null && isInBlackList(url, referer, blacklist)) {
+ final List blacklist = config.getBlacklist();
+ if (!blacklist.isEmpty() && RenderUtils.isInBlackList(url, request.getHeader(REFERER_HEADER), blacklist)) {
return false;
}
return true;
}
-
- private boolean hasEscapedFragment(HttpServletRequest request) {
- return request.getParameterMap().containsKey("_escaped_fragment_");
- }
-
- private String getApiUrl(String url) {
- String prerenderServiceUrl = getPrerenderServiceUrl();
- if (!prerenderServiceUrl.endsWith("/")) {
- prerenderServiceUrl += "/";
- }
- return prerenderServiceUrl + url;
- }
-
- private String getPrerenderServiceUrl() {
- final String prerenderServiceUrl = filterConfig.getInitParameter("prerenderServiceUrl");
- return StringUtils.isNotBlank(prerenderServiceUrl) ? prerenderServiceUrl : "http://prerender.herokuapp.com/";
- }
-
- private boolean isInBlackList(final String url, final String referer, List blacklist) {
- return from(blacklist).anyMatch(new Predicate() {
- @Override
- public boolean apply(String regex) {
- final Pattern pattern = Pattern.compile(regex);
- return pattern.matcher(url).matches() ||
- (!StringUtils.isBlank(referer) && pattern.matcher(referer).matches());
- }
- });
- }
-
- private boolean isInWhiteList(final String url, List whitelist) {
- return from(whitelist).anyMatch(new Predicate() {
- @Override
- public boolean apply(String regex) {
- return Pattern.compile(regex).matcher(url).matches();
- }
- });
- }
-
- private boolean isInResources(final String url) {
- return from(getExtensionsToIgnore()).anyMatch(new Predicate() {
- @Override
- public boolean apply(String item) {
- return url.contains(item.toLowerCase());
- }
- });
- }
-
- private boolean isInSearchUserAgent(final String useAgent) {
- return from(getCrawlerUserAgents()).anyMatch(new Predicate() {
- @Override
- public boolean apply(String item) {
- return item.equalsIgnoreCase(useAgent);
- }
- });
- }
-
- private class ResponseResult {
- private int statusCode;
- private String responseBody;
-
- public ResponseResult(int code, String body) {
- statusCode = code;
- responseBody = body;
- }
-
- private int getStatusCode() {
- return statusCode;
- }
-
- private String getResponseBody() {
- return responseBody;
- }
- }
}
diff --git a/src/main/java/com/github/greengerong/RenderUtils.java b/src/main/java/com/github/greengerong/RenderUtils.java
new file mode 100644
index 0000000..24f0295
--- /dev/null
+++ b/src/main/java/com/github/greengerong/RenderUtils.java
@@ -0,0 +1,71 @@
+package com.github.greengerong;
+
+import com.github.greengerong.config.SeoFilterConfig;
+import com.google.common.base.Predicate;
+import org.apache.commons.lang.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import static com.google.common.collect.FluentIterable.from;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: set321go
+ * Date: 12/27/2013
+ * Time: 10:04 PM
+ */
+public class RenderUtils {
+ public static final String ESCAPED_FRAGMENT_PARAMETER = "_escaped_fragment_";
+ public static final String USER_AGENT_HEADER = "User-Agent";
+
+
+ public static boolean hasEscapedFragment(HttpServletRequest request) {
+ return request.getParameterMap().containsKey(ESCAPED_FRAGMENT_PARAMETER);
+ }
+
+ public static boolean isInBlackList(final String url, final String referer, List blacklist) {
+ return from(blacklist).anyMatch(new Predicate() {
+ @Override
+ public boolean apply(String regex) {
+ final Pattern pattern = Pattern.compile(regex);
+ return pattern.matcher(url).matches() ||
+ (!StringUtils.isBlank(referer) && pattern.matcher(referer).matches());
+ }
+ });
+ }
+
+ public static boolean isInWhiteList(final String url, List whitelist) {
+ return from(whitelist).anyMatch(new Predicate() {
+ @Override
+ public boolean apply(String regex) {
+ return Pattern.compile(regex).matcher(url).matches();
+ }
+ });
+ }
+
+ public static boolean ignoreFileExtension(final String url, SeoFilterConfig config) {
+ return from(config.getExtensions()).anyMatch(new Predicate() {
+ @Override
+ public boolean apply(String item) {
+ return url.contains(item.toLowerCase());
+ }
+ });
+ }
+
+ public static boolean isValidUserAgent(HttpServletRequest request, SeoFilterConfig config) {
+ final String useAgent = request.getHeader(USER_AGENT_HEADER);
+
+ if (StringUtils.isBlank(useAgent)) {
+ return false;
+ }else{
+ return from(config.getCrawlers()).anyMatch(new Predicate() {
+ @Override
+ public boolean apply(String item) {
+ return item.equalsIgnoreCase(useAgent);
+ }
+ });
+ }
+ }
+}
diff --git a/src/main/java/com/github/greengerong/ResponseResult.java b/src/main/java/com/github/greengerong/ResponseResult.java
new file mode 100644
index 0000000..e2d569e
--- /dev/null
+++ b/src/main/java/com/github/greengerong/ResponseResult.java
@@ -0,0 +1,25 @@
+package com.github.greengerong;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: set321go
+ * Date: 12/27/2013
+ * Time: 9:56 PM
+ */
+public class ResponseResult {
+ private final int statusCode;
+ private final String responseBody;
+
+ public ResponseResult(int code, String body) {
+ statusCode = code;
+ responseBody = body;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public String getResponseBody() {
+ return responseBody;
+ }
+}
diff --git a/src/main/java/com/github/greengerong/config/FilterParameter.java b/src/main/java/com/github/greengerong/config/FilterParameter.java
new file mode 100644
index 0000000..5d81311
--- /dev/null
+++ b/src/main/java/com/github/greengerong/config/FilterParameter.java
@@ -0,0 +1,34 @@
+package com.github.greengerong.config;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: set321go
+ * Date: 12/26/2013
+ * Time: 11:26 PM
+ */
+public enum FilterParameter {
+ CRAWLER_USER_AGENTS("crawlerUserAgents", "googlebot,yahoo,bingbot,baiduspider,facebookexternalhit,twitterbot"),
+ EXTENSIONS_TO_IGNORE("extensionsToIgnore", ".js,.css,.less,.png,.jpg,.jpeg,.gif,.pdf,.doc,.txt,.zip,.mp3,.rar," +
+ ".exe,.wmv,.doc,.avi,.ppt,.mpg,.mpeg,.tif,.wav,.mov,.psd,.ai,.xls,.mp4,.m4a,.swf,.dat,.dmg,.iso,.flv,.m4v,.torrent"),
+ WHITELIST("whitelist", ""),
+ BLACKLIST("blacklist", ""),
+ SERVICE_URL("prerenderServiceUrl", "http://prerender.herokuapp.com/"),
+ PROXY_HOST("proxy", ""),
+ PROXY_PORT("proxyPort", "80");
+
+ private String paramName;
+ private String defaultValue;
+
+ private FilterParameter(String paramName, String defaultValue){
+ this.paramName = paramName;
+ this.defaultValue = defaultValue;
+ }
+
+ public String getName(){
+ return paramName;
+ }
+
+ public String getDefaultValue(){
+ return defaultValue;
+ }
+}
diff --git a/src/main/java/com/github/greengerong/config/SeoFilterConfig.java b/src/main/java/com/github/greengerong/config/SeoFilterConfig.java
new file mode 100644
index 0000000..a0c84ec
--- /dev/null
+++ b/src/main/java/com/github/greengerong/config/SeoFilterConfig.java
@@ -0,0 +1,120 @@
+package com.github.greengerong.config;
+
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.StringUtils;
+
+import javax.servlet.FilterConfig;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: set321go
+ * Date: 12/26/2013
+ * Time: 11:17 PM
+ */
+public class SeoFilterConfig {
+ public static final String LIST_SEPERATOR = ",";
+
+ private final String prerenderServiceUrl;
+ private final List blacklist;
+ private final List whitelist;
+ private final List extensions;
+ private final List crawlers;
+ private final String proxy;
+ private final int proxyPort;
+
+ public SeoFilterConfig(FilterConfig filterConfig){
+ crawlers = loadCrawlerUserAgents(filterConfig);
+ extensions = loadExtensionsToIgnore(filterConfig);
+ whitelist = loadWhitelist(filterConfig);
+ blacklist = loadBlacklist(filterConfig);
+ prerenderServiceUrl = loadPrerenderServiceUrl(filterConfig);
+ proxy = loadProxyHost(filterConfig);
+ proxyPort = loadProxyPort(filterConfig);
+ }
+
+ private List loadCrawlerUserAgents(FilterConfig filterConfig) {
+ List crawlerUserAgents = Lists.newArrayList(FilterParameter.CRAWLER_USER_AGENTS.getDefaultValue().split(LIST_SEPERATOR));
+ final String crawlerUserAgentsFromConfig = filterConfig.getInitParameter(FilterParameter.CRAWLER_USER_AGENTS.getName());
+ if (StringUtils.isNotBlank(crawlerUserAgentsFromConfig)) {
+ crawlerUserAgents.addAll(Arrays.asList(crawlerUserAgentsFromConfig.trim().split(LIST_SEPERATOR)));
+ }
+
+ return crawlerUserAgents;
+ }
+
+ private List loadExtensionsToIgnore(FilterConfig filterConfig) {
+ List extensionsToIgnore = Lists.newArrayList(FilterParameter.EXTENSIONS_TO_IGNORE.getDefaultValue().split(LIST_SEPERATOR));
+ final String extensionsToIgnoreFromConfig = filterConfig.getInitParameter(FilterParameter.EXTENSIONS_TO_IGNORE.getName());
+ if (StringUtils.isNotBlank(extensionsToIgnoreFromConfig)) {
+ extensionsToIgnore.addAll(Arrays.asList(extensionsToIgnoreFromConfig.trim().split(LIST_SEPERATOR)));
+ }
+
+ return extensionsToIgnore;
+ }
+
+ private String loadPrerenderServiceUrl(FilterConfig filterConfig) {
+ final String prerenderServiceUrl = filterConfig.getInitParameter(FilterParameter.SERVICE_URL.getName());
+ return StringUtils.isNotBlank(prerenderServiceUrl) ? prerenderServiceUrl : FilterParameter.SERVICE_URL.getDefaultValue();
+ }
+
+ private List loadWhitelist(FilterConfig filterConfig) {
+ final String whitelist = filterConfig.getInitParameter(FilterParameter.WHITELIST.getName());
+ if (StringUtils.isNotBlank(whitelist)) {
+ return Arrays.asList(whitelist.trim().split(LIST_SEPERATOR));
+ }
+ return Collections.emptyList();
+ }
+
+ private List loadBlacklist(FilterConfig filterConfig) {
+ final String blacklist = filterConfig.getInitParameter(FilterParameter.BLACKLIST.getName());
+ if (StringUtils.isNotBlank(blacklist)) {
+ return Arrays.asList(blacklist.trim().split(LIST_SEPERATOR));
+ }
+ return Collections.emptyList();
+ }
+
+ private String loadProxyHost(FilterConfig filterConfig){
+ final String proxy = filterConfig.getInitParameter(FilterParameter.PROXY_HOST.getName());
+ return StringUtils.isNotBlank(proxy) ? proxy : FilterParameter.PROXY_HOST.getDefaultValue();
+ }
+
+ private int loadProxyPort(FilterConfig filterConfig){
+ final String proxyPort = filterConfig.getInitParameter(FilterParameter.PROXY_PORT.getName());
+ if (StringUtils.isNotBlank(proxy) && StringUtils.isNotBlank(proxyPort)) {
+ return Integer.parseInt(proxyPort);
+ }else {
+ return Integer.parseInt(FilterParameter.PROXY_PORT.getDefaultValue());
+ }
+ }
+
+ public String getPrerenderServiceUrl() {
+ return prerenderServiceUrl;
+ }
+
+ public List getBlacklist() {
+ return blacklist;
+ }
+
+ public List getWhitelist() {
+ return whitelist;
+ }
+
+ public List getExtensions() {
+ return extensions;
+ }
+
+ public List getCrawlers() {
+ return crawlers;
+ }
+
+ public String getProxy() {
+ return proxy;
+ }
+
+ public int getProxyPort() {
+ return proxyPort;
+ }
+}
diff --git a/src/test/java/com/github/greengerong/RenderUtilsTest.java b/src/test/java/com/github/greengerong/RenderUtilsTest.java
new file mode 100644
index 0000000..5daaa50
--- /dev/null
+++ b/src/test/java/com/github/greengerong/RenderUtilsTest.java
@@ -0,0 +1,177 @@
+package com.github.greengerong;
+
+import com.github.greengerong.config.SeoFilterConfig;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.http.HttpServletRequest;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.TestCase.assertFalse;
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: set321go
+ * Date: 12/27/2013
+ * Time: 10:16 PM
+ */
+public class RenderUtilsTest {
+ HttpServletRequest mockRequest;
+ SeoFilterConfig mockSeoFilterConfig;
+
+ IMocksControl control;
+
+ @Before
+ public void initMocks(){
+ control = EasyMock.createControl();
+ }
+
+ @Test
+ public void testHasEscapedFragment() throws Exception {
+ mockRequest = control.createMock(HttpServletRequest.class);
+ Map paramMap = new HashMap();
+ paramMap.put(RenderUtils.ESCAPED_FRAGMENT_PARAMETER, "_escaped_fragment_");
+
+ expect(mockRequest.getParameterMap()).andReturn(paramMap);
+
+ control.replay();
+ assertTrue("The method should have returned true", RenderUtils.hasEscapedFragment(mockRequest));
+ control.verify();
+ }
+
+ @Test
+ public void testHasNoEscapedFragment() throws Exception {
+ mockRequest = control.createMock(HttpServletRequest.class);
+ Map paramMap = new HashMap();
+ paramMap.put("myParameter", "testParam");
+
+ expect(mockRequest.getParameterMap()).andReturn(paramMap);
+
+ control.replay();
+ assertFalse("The method should have returned false", RenderUtils.hasEscapedFragment(mockRequest));
+ control.verify();
+ }
+
+ @Test
+ public void testIsValidUserAgent() throws Exception {
+ mockRequest = control.createMock(HttpServletRequest.class);
+ mockSeoFilterConfig = control.createMock(SeoFilterConfig.class);
+
+ String testBot = "googlebot";
+ List crawlers = new ArrayList();
+ crawlers.add(testBot);
+
+ expect(mockRequest.getHeader(RenderUtils.USER_AGENT_HEADER)).andReturn(testBot);
+ expect(mockSeoFilterConfig.getCrawlers()).andReturn(crawlers);
+
+ control.replay();
+
+ assertTrue("This method should have returned true", RenderUtils.isValidUserAgent(mockRequest, mockSeoFilterConfig));
+
+ control.verify();
+ }
+
+ @Test
+ public void testIsNotValidUserAgent() throws Exception {
+ mockRequest = control.createMock(HttpServletRequest.class);
+ mockSeoFilterConfig = control.createMock(SeoFilterConfig.class);
+
+ String testBot = "googlebot";
+ List crawlers = new ArrayList();
+ crawlers.add("testbot");
+
+ expect(mockRequest.getHeader(RenderUtils.USER_AGENT_HEADER)).andReturn(testBot);
+ expect(mockSeoFilterConfig.getCrawlers()).andReturn(crawlers);
+
+ control.replay();
+
+ assertFalse("This method should have returned false", RenderUtils.isValidUserAgent(mockRequest, mockSeoFilterConfig));
+
+ control.verify();
+ }
+
+ @Test
+ public void testIsInBlackList() throws Exception {
+ String url = "http://test.com";
+ String referer = "http://referer.com";
+ List blacklist = new ArrayList();
+ blacklist.add("http://test.com");
+
+
+ assertTrue("This method should have returned true", RenderUtils.isInBlackList(url, referer, blacklist));
+ }
+
+ @Test
+ public void testIsNotInBlackList() throws Exception {
+ String url = "http://test.com";
+ String referer = "http://referer.com";
+ List blacklist = new ArrayList();
+ blacklist.add("http://blacklist.com");
+
+
+ assertFalse("This method should have returned false", RenderUtils.isInBlackList(url, referer, blacklist));
+ }
+
+ @Test
+ public void testIsInWhiteList() throws Exception {
+ String url = "http://test.com";
+ List whitelist = new ArrayList();
+ whitelist.add("http://test.com");
+
+
+ assertTrue("This method should have returned true", RenderUtils.isInWhiteList(url, whitelist));
+ }
+
+ @Test
+ public void testIsNotInWhiteList() throws Exception {
+ String url = "http://test.com";
+ List whitelist = new ArrayList();
+ whitelist.add("http://dummy.com");
+
+
+ assertFalse("This method should have returned false", RenderUtils.isInWhiteList(url, whitelist));
+ }
+
+ @Test
+ public void testIgnoreFileExtension() throws Exception {
+ mockSeoFilterConfig = control.createMock(SeoFilterConfig.class);
+
+ String url = "http://test.com/myImg.jpg";
+ List extensions = new ArrayList();
+ extensions.add(".jpg");
+
+ expect(mockSeoFilterConfig.getExtensions()).andReturn(extensions);
+
+ control.replay();
+
+ assertTrue("This method should have returned true", RenderUtils.ignoreFileExtension(url, mockSeoFilterConfig));
+
+ control.verify();
+ }
+
+ @Test
+ public void testDoNotIgnoreFileExtension() throws Exception {
+ mockSeoFilterConfig = control.createMock(SeoFilterConfig.class);
+
+ String url = "http://test.com/my-page.html";
+ List extensions = new ArrayList();
+ extensions.add(".jpg");
+
+ expect(mockSeoFilterConfig.getExtensions()).andReturn(extensions);
+
+ control.replay();
+
+ assertFalse("This method should have returned false", RenderUtils.ignoreFileExtension(url, mockSeoFilterConfig));
+
+ control.verify();
+ }
+}