/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library 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 library 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.
*/
package com.liferay.portal.servlet.filters.strip;
import com.liferay.portal.cache.key.HashCodeHexStringCacheKeyGenerator;
import com.liferay.portal.kernel.cache.key.CacheKeyGeneratorUtil;
import com.liferay.portal.kernel.test.CaptureHandler;
import com.liferay.portal.kernel.test.JDKLoggerTestUtil;
import com.liferay.portal.minifier.GoogleJavaScriptMinifier;
import com.liferay.portal.minifier.MinifierUtil;
import java.io.StringWriter;
import java.nio.CharBuffer;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author Shuyang Zhou
* @author Miguel Pastor
*/
public class StripFilterTest {
@BeforeClass
public static void setUpClass() {
CacheKeyGeneratorUtil cacheKeyGeneratorUtil =
new CacheKeyGeneratorUtil();
cacheKeyGeneratorUtil.setDefaultCacheKeyGenerator(
new HashCodeHexStringCacheKeyGenerator());
}
@Test
public void testHasMarker() {
StripFilter stripFilter = new StripFilter();
// Marker is longer than buffer's remaining
CharBuffer charBuffer = CharBuffer.wrap("abcdef");
charBuffer.position(2);
charBuffer.limit(4);
char[] marker = "cdef".toCharArray();
Assert.assertFalse(stripFilter.hasMarker(charBuffer, marker));
Assert.assertEquals(2, charBuffer.position());
// No match
charBuffer = CharBuffer.wrap("abcdef");
marker = "abce".toCharArray();
Assert.assertFalse(stripFilter.hasMarker(charBuffer, marker));
Assert.assertEquals(0, charBuffer.position());
// Exact match
charBuffer = CharBuffer.wrap("abcdef");
marker = "abcd".toCharArray();
Assert.assertTrue(stripFilter.hasMarker(charBuffer, marker));
Assert.assertEquals(0, charBuffer.position());
// Match ignore case
charBuffer = CharBuffer.wrap("aBcDef");
marker = "abcd".toCharArray();
Assert.assertTrue(stripFilter.hasMarker(charBuffer, marker));
Assert.assertEquals(0, charBuffer.position());
}
@Test
public void testProcessCSS() throws Exception {
StripFilter stripFilter = new StripFilter();
// Missing close tag
CharBuffer charBuffer = CharBuffer.wrap("style type=\"text/css\">abc");
StringWriter stringWriter = new StringWriter();
try (CaptureHandler captureHandler =
JDKLoggerTestUtil.configureJDKLogger(
StripFilter.class.getName(), Level.WARNING)) {
stripFilter.processCSS(null, null, charBuffer, stringWriter);
List<LogRecord> logRecords = captureHandler.getLogRecords();
Assert.assertEquals(logRecords.toString(), 1, logRecords.size());
LogRecord logRecord = logRecords.get(0);
Assert.assertEquals("Missing </style>", logRecord.getMessage());
}
Assert.assertEquals(
"style type=\"text/css\">", stringWriter.toString());
Assert.assertEquals(22, charBuffer.position());
// Empty tag
charBuffer = CharBuffer.wrap("style type=\"text/css\"></style>");
stringWriter = new StringWriter();
stripFilter.processCSS(null, null, charBuffer, stringWriter);
Assert.assertEquals(
"style type=\"text/css\"></style>", stringWriter.toString());
Assert.assertEquals(30, charBuffer.position());
// Minifier spaces
charBuffer = CharBuffer.wrap("style type=\"text/css\"> \r\t\n</style>");
stringWriter = new StringWriter();
stripFilter.processCSS(null, null, charBuffer, stringWriter);
Assert.assertEquals(
"style type=\"text/css\"></style>", stringWriter.toString());
Assert.assertEquals(34, charBuffer.position());
// Minifier code
String code =
".a{ position: relative; outline: none; overflow: hidden; " +
"text-align: left /* Force default alignment */ }";
String minifiedCode = MinifierUtil.minifyCss(code);
charBuffer = CharBuffer.wrap(
"style type=\"text/css\">" + code + "</style>");
stringWriter = new StringWriter();
stripFilter.processCSS(null, null, charBuffer, stringWriter);
Assert.assertEquals(
"style type=\"text/css\">" + minifiedCode + "</style>",
stringWriter.toString());
Assert.assertEquals(code.length() + 30, charBuffer.position());
// Minifier code with trailing spaces
charBuffer = CharBuffer.wrap(
"style type=\"text/css\">" + code + "</style> \r\t\n");
stringWriter = new StringWriter();
stripFilter.processCSS(null, null, charBuffer, stringWriter);
Assert.assertEquals(
"style type=\"text/css\">" + minifiedCode + "</style> ",
stringWriter.toString());
Assert.assertEquals(code.length() + 34, charBuffer.position());
}
@Test
public void testProcessJavaScript() throws Exception {
StripFilter stripFilter = new StripFilter();
// Missing close tag
CharBuffer charBuffer = CharBuffer.wrap("script>abc");
StringWriter stringWriter = new StringWriter();
try (CaptureHandler captureHandler =
JDKLoggerTestUtil.configureJDKLogger(
StripFilter.class.getName(), Level.WARNING)) {
stripFilter.processJavaScript(
"test.js", charBuffer, stringWriter, "script".toCharArray());
List<LogRecord> logRecords = captureHandler.getLogRecords();
Assert.assertEquals(logRecords.toString(), 1, logRecords.size());
LogRecord logRecord = logRecords.get(0);
Assert.assertEquals("Missing </script>", logRecord.getMessage());
Assert.assertEquals("script>", stringWriter.toString());
}
Assert.assertEquals(7, charBuffer.position());
// Empty tag
charBuffer = CharBuffer.wrap("script></script>");
stringWriter = new StringWriter();
stripFilter.processJavaScript(
"test.js", charBuffer, stringWriter, "script".toCharArray());
Assert.assertEquals("script></script>", stringWriter.toString());
Assert.assertEquals(16, charBuffer.position());
// Minifier spaces
charBuffer = CharBuffer.wrap("script> \t\r\n</script>");
stringWriter = new StringWriter();
stripFilter.processJavaScript(
"test.js", charBuffer, stringWriter, "script".toCharArray());
Assert.assertEquals("script></script>", stringWriter.toString());
Assert.assertEquals(20, charBuffer.position());
// Minifier code
String code = "function(){ var abcd; var efgh; }";
try (CaptureHandler captureHandler =
JDKLoggerTestUtil.configureJDKLogger(
GoogleJavaScriptMinifier.class.getName(), Level.SEVERE)) {
String minifiedCode = MinifierUtil.minifyJavaScript(
"test.js", code);
List<LogRecord> logRecords = captureHandler.getLogRecords();
Assert.assertEquals(logRecords.toString(), 2, logRecords.size());
LogRecord logRecord = logRecords.get(0);
Assert.assertEquals(
"(test.js:1): Parse error. unnamed function statement",
logRecord.getMessage());
logRecord = logRecords.get(1);
Assert.assertEquals(
"{0} error(s), {1} warning(s)", logRecord.getMessage());
logRecords = captureHandler.resetLogLevel(Level.SEVERE);
charBuffer = CharBuffer.wrap("script>" + code + "</script>");
stringWriter = new StringWriter();
stripFilter.processJavaScript(
"test.js", charBuffer, stringWriter, "script".toCharArray());
Assert.assertEquals(logRecords.toString(), 2, logRecords.size());
logRecord = logRecords.get(0);
Assert.assertEquals(
"(test.js:1): Parse error. unnamed function statement",
logRecord.getMessage());
logRecord = logRecords.get(1);
Assert.assertEquals(
"{0} error(s), {1} warning(s)", logRecord.getMessage());
Assert.assertEquals(
"script>" + minifiedCode + "</script>",
stringWriter.toString());
Assert.assertEquals(code.length() + 16, charBuffer.position());
// Minifier code with trailing spaces
charBuffer = CharBuffer.wrap("script>" + code + "</script> \t\r\n");
stringWriter = new StringWriter();
stripFilter.processJavaScript(
"test.js", charBuffer, stringWriter, "script".toCharArray());
Assert.assertEquals(
"script>" + minifiedCode + "</script> ",
stringWriter.toString());
}
Assert.assertEquals(code.length() + 20, charBuffer.position());
}
@Test
public void testProcessPre() throws Exception {
StripFilter stripFilter = new StripFilter();
// Missing close tag
CharBuffer charBuffer = CharBuffer.wrap("pre>abcde");
StringWriter stringWriter = new StringWriter();
try (CaptureHandler captureHandler =
JDKLoggerTestUtil.configureJDKLogger(
StripFilter.class.getName(), Level.WARNING)) {
stripFilter.processPre(charBuffer, stringWriter);
List<LogRecord> logRecords = captureHandler.getLogRecords();
Assert.assertEquals(logRecords.toString(), 1, logRecords.size());
LogRecord logRecord = logRecords.get(0);
Assert.assertEquals("Missing </pre>", logRecord.getMessage());
Assert.assertEquals("pre", stringWriter.toString());
Assert.assertEquals(3, charBuffer.position());
}
// Without trailing spaces
charBuffer = CharBuffer.wrap("pre>a b </pre>");
stringWriter = new StringWriter();
stripFilter.processPre(charBuffer, stringWriter);
Assert.assertEquals("pre>a b </pre>", stringWriter.toString());
Assert.assertEquals(14, charBuffer.position());
// With trailing spaces
charBuffer = CharBuffer.wrap("pre>a b </pre> \r\n\tc");
stringWriter = new StringWriter();
stripFilter.processPre(charBuffer, stringWriter);
Assert.assertEquals("pre>a b </pre> ", stringWriter.toString());
Assert.assertEquals(18, charBuffer.position());
}
@Test
public void testProcessTextArea() throws Exception {
StripFilter stripFilter = new StripFilter();
// Missing close tag
CharBuffer charBuffer = CharBuffer.wrap("textarea >abcde");
StringWriter stringWriter = new StringWriter();
try (CaptureHandler captureHandler =
JDKLoggerTestUtil.configureJDKLogger(
StripFilter.class.getName(), Level.WARNING)) {
stripFilter.processTextArea(charBuffer, stringWriter);
List<LogRecord> logRecords = captureHandler.getLogRecords();
Assert.assertEquals(logRecords.toString(), 1, logRecords.size());
LogRecord logRecord = logRecords.get(0);
Assert.assertEquals("Missing </textArea>", logRecord.getMessage());
Assert.assertEquals("textarea ", stringWriter.toString());
Assert.assertEquals(9, charBuffer.position());
}
// Without trailing spaces
charBuffer = CharBuffer.wrap("textarea >a b </textarea>");
stringWriter = new StringWriter();
stripFilter.processTextArea(charBuffer, stringWriter);
Assert.assertEquals(
"textarea >a b </textarea>", stringWriter.toString());
Assert.assertEquals(25, charBuffer.position());
// With trailing spaces
charBuffer = CharBuffer.wrap("textarea >a b </textarea> \r\n\tc");
stringWriter = new StringWriter();
stripFilter.processTextArea(charBuffer, stringWriter);
Assert.assertEquals(
"textarea >a b </textarea> ", stringWriter.toString());
Assert.assertEquals(29, charBuffer.position());
}
@Test
public void testSkipWhiteSpace() throws Exception {
StripFilter stripFilter = new StripFilter();
// Empty buffer
CharBuffer charBuffer = CharBuffer.allocate(0);
StringWriter stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals("", stringWriter.toString());
Assert.assertEquals(0, charBuffer.position());
// No leading space
charBuffer = CharBuffer.wrap("abc \t\r\n");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals("", stringWriter.toString());
Assert.assertEquals(0, charBuffer.position());
// Single leading space
charBuffer = CharBuffer.wrap(" ");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals(" ", stringWriter.toString());
Assert.assertEquals(1, charBuffer.position());
charBuffer = CharBuffer.wrap("\t");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals(" ", stringWriter.toString());
Assert.assertEquals(1, charBuffer.position());
charBuffer = CharBuffer.wrap("\r");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals(" ", stringWriter.toString());
Assert.assertEquals(1, charBuffer.position());
charBuffer = CharBuffer.wrap("\n");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals(" ", stringWriter.toString());
Assert.assertEquals(1, charBuffer.position());
// Multiple leading spaces
charBuffer = CharBuffer.wrap(" \t\r\n");
stringWriter = new StringWriter();
stripFilter.skipWhiteSpace(charBuffer, stringWriter, true);
Assert.assertEquals(" ", stringWriter.toString());
Assert.assertEquals(4, charBuffer.position());
}
}