/*
* Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky
*
* 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 freemarker.ext.servlet;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.Collections;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.MockServletContext;
public class InitParamParserTest {
@Test
public void testFindTemplatePathSettingAssignmentsStart() {
assertEquals(0, InitParamParser.findTemplatePathSettingAssignmentsStart("?settings()"));
assertEquals(1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings()"));
assertEquals(1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings(x=1, y=2)"));
assertEquals(2, InitParamParser.findTemplatePathSettingAssignmentsStart("x ? settings ( x=1, y=2 ) "));
assertEquals(1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings(x=f(), y=g())"));
assertEquals(1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings(x=\"(\", y='(')"));
assertEquals(1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings(x=\"(\\\"\", y='(\\'')"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart(""));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("settings"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("settings()"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("foo?/settings(x=1)"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings()x=1)"));
assertEquals(-1, InitParamParser.findTemplatePathSettingAssignmentsStart("x?settings((x=1)"));
try {
assertEquals(0, InitParamParser.findTemplatePathSettingAssignmentsStart("x?setting(x = 1)"));
fail();
} catch (Exception e) {
assertThat(e.getMessage(), containsString("\"setting\""));
}
}
@Test
public void testCreateTemplateLoader() throws IOException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
{
ClassTemplateLoader ctl = (ClassTemplateLoader) InitParamParser.createTemplateLoader(
"classpath:templates",
cfg, this.getClass(), null);
assertEquals("templates/", ctl.getBasePackagePath());
assertNull(ctl.getURLConnectionUsesCaches());
}
{
ClassTemplateLoader ctl = (ClassTemplateLoader) InitParamParser.createTemplateLoader(
"classpath:templates?settings(URLConnectionUsesCaches=false)",
cfg, this.getClass(), null);
assertEquals("templates/", ctl.getBasePackagePath());
assertEquals(Boolean.FALSE, ctl.getURLConnectionUsesCaches());
}
{
MultiTemplateLoader mtl = (MultiTemplateLoader) InitParamParser.createTemplateLoader(
"["
+ "templates?settings(URLConnectionUsesCaches=false, attemptFileAccess=false), "
+ "foo/templates?settings(URLConnectionUsesCaches=true), "
+ "classpath:templates, "
+ "classpath:foo/templates?settings(URLConnectionUsesCaches=true)"
+ "]",
cfg, this.getClass(), new MockServletContext());
assertEquals(4, mtl.getTemplateLoaderCount());
final WebappTemplateLoader tl1 = (WebappTemplateLoader) mtl.getTemplateLoader(0);
assertEquals(Boolean.FALSE, tl1.getURLConnectionUsesCaches());
assertFalse(tl1.getAttemptFileAccess());
final WebappTemplateLoader tl2 = (WebappTemplateLoader) mtl.getTemplateLoader(1);
assertEquals(Boolean.TRUE, tl2.getURLConnectionUsesCaches());
assertTrue(tl2.getAttemptFileAccess());
final ClassTemplateLoader tl3 = (ClassTemplateLoader) mtl.getTemplateLoader(2);
assertNull(tl3.getURLConnectionUsesCaches());
final ClassTemplateLoader tl4 = (ClassTemplateLoader) mtl.getTemplateLoader(3);
assertEquals(Boolean.TRUE, tl4.getURLConnectionUsesCaches());
}
}
@Test
public void testParseCommaSeparatedTemplateLoaderList() {
assertEquals(Collections.emptyList(),
InitParamParser.parseCommaSeparatedTemplatePaths(""));
assertEquals(Collections.emptyList(),
InitParamParser.parseCommaSeparatedTemplatePaths(" "));
assertEquals(Collections.emptyList(),
InitParamParser.parseCommaSeparatedTemplatePaths(","));
assertEquals(ImmutableList.of("a"),
InitParamParser.parseCommaSeparatedTemplatePaths("a"));
assertEquals(ImmutableList.of("a"),
InitParamParser.parseCommaSeparatedTemplatePaths(" a "));
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths("a,b,c"));
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths(" a , b , c "));
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths("a,b,c,"));
try {
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths("a,b,,c"));
} catch (Exception e) {
assertThat(e.getMessage(), containsString("comma"));
}
try {
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths(",a,b,c"));
} catch (Exception e) {
assertThat(e.getMessage(), containsString("comma"));
}
try {
assertEquals(ImmutableList.of("a", "b", "c"),
InitParamParser.parseCommaSeparatedTemplatePaths(",a,b,c"));
} catch (Exception e) {
assertThat(e.getMessage(), containsString("comma"));
}
assertEquals(ImmutableList.of("a?settings(1)", "b", "c?settings(2)"),
InitParamParser.parseCommaSeparatedTemplatePaths("a?settings(1),b,c?settings(2)"));
assertEquals(ImmutableList.of("a ? settings ( 1 )", "b", "c ? settings ( 2 )"),
InitParamParser.parseCommaSeparatedTemplatePaths(" a ? settings ( 1 ) , b , c ? settings ( 2 ) "));
assertEquals(ImmutableList.of("a?settings(1,2,3)", "b?settings(1,2)", "c?settings()"),
InitParamParser.parseCommaSeparatedTemplatePaths("a?settings(1,2,3),b?settings(1,2),c?settings()"));
assertEquals(ImmutableList.of("a?settings(x=1, y=2)"),
InitParamParser.parseCommaSeparatedTemplatePaths("a?settings(x=1, y=2)"));
try {
InitParamParser.parseCommaSeparatedTemplatePaths("a?foo(x=1, y=2)");
} catch (Exception e) {
assertThat(e.getMessage(), containsString("settings"));
}
}
}