You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/04/09 08:15:33 UTC

[2/5] incubator-freemarker-online-tester git commit: renamed the package name to org/apache/freemarker/onlinetester

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/main/java/org/apache/freemarker/onlinetester/util/LengthLimitedWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/onlinetester/util/LengthLimitedWriter.java b/src/main/java/org/apache/freemarker/onlinetester/util/LengthLimitedWriter.java
new file mode 100644
index 0000000..bb2650d
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/onlinetester/util/LengthLimitedWriter.java
@@ -0,0 +1,87 @@
+/*
+ * 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.freemarker.onlinetester.util;
+
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+/**
+ * A {@link StringWriter} that limits its buffer size, and throws {@link LengthLimitExceededException} when that's
+ * exceeded.
+ */
+public class LengthLimitedWriter extends FilterWriter {
+    
+    private int lengthLeft;
+
+    public LengthLimitedWriter(Writer writer, int lengthLimit) {
+        super(writer);
+        this.lengthLeft = lengthLimit;
+    }
+
+    @Override
+    public void write(int c) throws IOException {
+        if (lengthLeft < 1) {
+            throw new LengthLimitExceededException();
+        }
+        
+        super.write(c);
+        
+        lengthLeft--;
+    }
+
+    @Override
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        final boolean lengthExceeded;
+        if (lengthLeft < len) {
+            len = lengthLeft;
+            lengthExceeded = true;
+        } else {
+            lengthExceeded = false;
+        }
+        
+        super.write(cbuf, off, len);
+        lengthLeft -= len;
+        
+        if (lengthExceeded) {
+            throw new LengthLimitExceededException();
+        }
+    }
+
+    @Override
+    public void write(String str, int off, int len) throws IOException {
+        final boolean lengthExceeded;
+        if (lengthLeft < len) {
+            len = lengthLeft;
+            lengthExceeded = true;
+        } else {
+            lengthExceeded = false;
+        }
+        
+        super.write(str, off, len);
+        lengthLeft -= len;
+        
+        if (lengthExceeded) {
+            throw new LengthLimitExceededException();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/main/java/org/apache/freemarker/onlinetester/view/FreeMarkerOnlineView.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/onlinetester/view/FreeMarkerOnlineView.java b/src/main/java/org/apache/freemarker/onlinetester/view/FreeMarkerOnlineView.java
new file mode 100644
index 0000000..3aecbb5
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/onlinetester/view/FreeMarkerOnlineView.java
@@ -0,0 +1,157 @@
+/*
+ * 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.freemarker.onlinetester.view;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.apache.freemarker.onlinetester.model.SelectionOption;
+import org.apache.freemarker.onlinetester.services.AllowedSettingValuesMaps;
+import com.yammer.dropwizard.views.View;
+
+import freemarker.template.Configuration;
+
+public class FreeMarkerOnlineView extends View {
+
+    private static final List<SelectionOption> LOCALE_SELECTION_OPTIONS = toLocaleSelectionOptions(AllowedSettingValuesMaps.LOCALE_MAP);
+    private static final List<SelectionOption> TIME_ZONE_SELECTION_OPTIONS = toSelectionOptions(AllowedSettingValuesMaps.TIME_ZONE_MAP);
+    private static final List<SelectionOption> OUTPUT_FORMAT_SELECTION_OPTIONS = toSelectionOptions(AllowedSettingValuesMaps.OUTPUT_FORMAT_MAP);
+    
+    private String template = "";
+    private String dataModel = "";
+    private String outputFormat = AllowedSettingValuesMaps.DEFAULT_OUTPUT_FORMAT_KEY;
+    private String locale = AllowedSettingValuesMaps.DEFAULT_LOCALE_KEY;
+    private String timeZone = AllowedSettingValuesMaps.DEFAULT_TIME_ZONE_KEY;
+    
+    private boolean execute;
+    
+    private static List<SelectionOption> toSelectionOptions(Map<String, ?> settingValueMap) {
+        ArrayList<SelectionOption> selectionOptions = new ArrayList<SelectionOption>(settingValueMap.size());
+        for (String key : settingValueMap.keySet()) {
+            selectionOptions.add(new SelectionOption(key, truncate(key, 25)));
+        }
+        Collections.sort(selectionOptions);
+        return selectionOptions;
+    }
+    
+    private static List<SelectionOption> toLocaleSelectionOptions(Map<String, Locale> localeMap) {
+        ArrayList<SelectionOption> selectionOptions = new ArrayList<SelectionOption>(localeMap.size());
+        for (Map.Entry<String, Locale> ent : localeMap.entrySet()) {
+            Locale locale = ent.getValue();
+            selectionOptions.add(
+                    new SelectionOption(ent.getKey(),
+                    truncate(locale.getDisplayName(Locale.US), 18) + "; " + locale.toString()));
+        }
+        Collections.sort(selectionOptions);
+        return selectionOptions;
+    }
+    
+    private static String truncate(String s, int maxLength) {
+        if (s == null) {
+            return null;
+        }
+        return s.length() <= maxLength ? s : s.substring(0, Math.max(maxLength - 3, 0)) + "[...]";
+    }    
+
+    /**
+     *
+     * @param template
+     * @param dataModel
+     * @param execute set to true if the execution should be triggered on page load.
+     */
+    public FreeMarkerOnlineView() {
+        super("/view/freemarker-online.ftl", Charset.forName("utf-8"));
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(String template) {
+        this.template = withDefault(template, "");
+    }
+
+    public String getDataModel() {
+        return dataModel;
+    }
+
+    public void setDataModel(String dataModel) {
+        this.dataModel = withDefault(dataModel, "");
+    }
+
+    public String getFreeMarkerVersion() {
+        return Configuration.getVersion().toString();
+    }
+    
+    public List<SelectionOption> getOutputFormats() {
+        return OUTPUT_FORMAT_SELECTION_OPTIONS;
+    }
+
+    public List<SelectionOption> getLocales() {
+        return LOCALE_SELECTION_OPTIONS;
+    }
+
+    public List<SelectionOption> getTimeZones() {
+        return TIME_ZONE_SELECTION_OPTIONS;
+    }
+
+    public String getOutputFormat() {
+        return outputFormat;
+    }
+
+    public void setOutputFormat(String outputFormat) {
+        this.outputFormat = withDefault(outputFormat, AllowedSettingValuesMaps.DEFAULT_OUTPUT_FORMAT_KEY);
+    }
+
+    public String getLocale() {
+        return locale;
+    }
+
+    public void setLocale(String locale) {
+        this.locale = withDefault(locale, AllowedSettingValuesMaps.DEFAULT_LOCALE_KEY);
+    }
+
+    public String getTimeZone() {
+        return timeZone;
+    }
+
+    public void setTimeZone(String timeZone) {
+        this.timeZone = withDefault(timeZone, AllowedSettingValuesMaps.DEFAULT_TIME_ZONE_KEY);
+    }
+    
+    public boolean isExecute() {
+        return execute;
+    }
+
+    public void setExecute(boolean executeImmediately) {
+        this.execute = executeImmediately;
+    }
+
+    private static String withDefault(String value, String defaultValue) {
+        return !StringUtils.isBlank(value) ? value : defaultValue;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/main/resources/spring/bootstrap-context.xml
----------------------------------------------------------------------
diff --git a/src/main/resources/spring/bootstrap-context.xml b/src/main/resources/spring/bootstrap-context.xml
index db4bf9b..8d8e518 100644
--- a/src/main/resources/spring/bootstrap-context.xml
+++ b/src/main/resources/spring/bootstrap-context.xml
@@ -24,7 +24,7 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">
 
-    <context:component-scan base-package="com.kenshoo"/>
+    <context:component-scan base-package="org.apache.freemarker.onlinetester"/>
 
     <context:annotation-config/>
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/platform/DropWizardServiceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/platform/DropWizardServiceTest.java b/src/test/java/com/kenshoo/freemarker/platform/DropWizardServiceTest.java
deleted file mode 100644
index 312ed0b..0000000
--- a/src/test/java/com/kenshoo/freemarker/platform/DropWizardServiceTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2014 Kenshoo.com
- *
- * 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 com.kenshoo.freemarker.platform;
-
-import com.google.common.io.Resources;
-import com.kenshoo.freemarker.dropwizard.ApplicationStartup;
-import com.yammer.dropwizard.testing.junit.DropwizardServiceRule;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-
-public class DropWizardServiceTest {
-    @ClassRule
-    public static TestRule testRule = new DropwizardServiceRule<>(ApplicationStartup.class,
-            Resources.getResource("freemarker-online.yml").getPath());
-
-
-    @Test
-    public void testServerIsUp() throws Exception {
-        ((DropwizardServiceRule) testRule).getService();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/platform/YamlPropertiesPersister.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/platform/YamlPropertiesPersister.java b/src/test/java/com/kenshoo/freemarker/platform/YamlPropertiesPersister.java
deleted file mode 100644
index 1299581..0000000
--- a/src/test/java/com/kenshoo/freemarker/platform/YamlPropertiesPersister.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.platform;
-
-import com.fasterxml.jackson.dataformat.yaml.snakeyaml.Yaml;
-import org.springframework.util.PropertiesPersister;
-import org.springframework.util.StringUtils;
-
-import java.io.*;
-import java.util.Map;
-import java.util.Properties;
-
-public class YamlPropertiesPersister implements PropertiesPersister {
-    @Override
-    public void load(Properties props, InputStream is) throws IOException {
-        load(props, new InputStreamReader(is));
-    }
-
-    /**
-     * We want to traverse map representing Yaml object and each time we find String=String pair we want to
-     * save it as Property. As we are going deeper into map we generate compound key as path-like String
-     *
-     * @see org.springframework.util.PropertiesPersister#load(java.util.Properties, java.io.Reader)
-     */
-    @Override
-    public void load(Properties props, Reader reader) throws IOException {
-        Yaml yaml = new Yaml();
-        @SuppressWarnings("unchecked")
-        Map<String, Object> map = (Map<String, Object>) yaml.load(reader);
-        // now we can populate supplied props
-        assignProperties(props, map, null);
-    }
-
-    @SuppressWarnings("unchecked")
-    public void assignProperties(Properties props, Map<String, Object> map, String path) {
-        for (Map.Entry<String, Object> entry : map.entrySet()) {
-            String key = entry.getKey();
-            if (!StringUtils.isEmpty(path))
-                key = path + "." + key;
-            Object val = entry.getValue();
-            if (val instanceof String) {
-                // see if we need to create a compound key
-                props.put(key, val);
-            } else if (val instanceof Map) {
-                assignProperties(props, (Map<String, Object>) val, key);
-            }
-        }
-    }
-
-    @Override
-    public void store(Properties props, OutputStream os, String header) throws IOException {
-        throw new IllegalStateException("Current implementation is a read-only");
-    }
-
-    @Override
-    public void store(Properties props, Writer writer, String header) throws IOException {
-        throw new IllegalStateException("Current implementation is a read-only");
-    }
-
-    @Override
-    public void loadFromXml(Properties props, InputStream is) throws IOException {
-        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to read/write XML");
-    }
-
-    @Override
-    public void storeToXml(Properties props, OutputStream os, String header) throws IOException {
-        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to load/store to XML");
-    }
-
-    @Override
-    public void storeToXml(Properties props, OutputStream os, String header, String encoding) throws IOException {
-        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to read/write XML");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineExecuteResourceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineExecuteResourceTest.java b/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineExecuteResourceTest.java
deleted file mode 100644
index e7ca204..0000000
--- a/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineExecuteResourceTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.resources;
-
-import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.request.RequestContextListener;
-
-import com.kenshoo.freemarker.model.ExecuteRequest;
-import com.kenshoo.freemarker.model.ExecuteResourceField;
-import com.kenshoo.freemarker.model.ExecuteResourceProblem;
-import com.kenshoo.freemarker.model.ExecuteResponse;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
-import com.sun.jersey.test.framework.AppDescriptor;
-import com.sun.jersey.test.framework.JerseyTest;
-import com.sun.jersey.test.framework.WebAppDescriptor;
-
-public class FreeMarkerOnlineExecuteResourceTest extends JerseyTest {
-    private static final String DATA_MODEL = "user=John";
-    private static final String TEMPLATE_WITH_VARIABLE = "Welcome ${user}";
-    private static final String TEMPLATE_PLAIN = "Welcome John";
-    private static final String MALFORMED_DATA_MODEL = "userJohn";
-    private static final String EXECUTE_API = "api/execute";
-    @Override
-    protected AppDescriptor configure() {
-        return new WebAppDescriptor.Builder("com.kenshoo.freemarker.resources")
-                        .contextPath("/")
-                        .contextListenerClass(ContextLoaderListener.class)
-                        .contextParam("contextConfigLocation", "classpath:spring/bootstrap-context.xml")
-                        .servletClass(SpringServlet.class)
-                        .requestListenerClass(RequestContextListener.class)
-                        .build();
-    }
-
-    @Test
-    public void testSuccessRequest() throws Exception {
-        ExecuteRequest req = new ExecuteRequest(TEMPLATE_WITH_VARIABLE, DATA_MODEL);
-        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
-                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
-        assertEquals(200, resp.getStatus());
-        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
-        assertNull(response.getProblems());
-    }
-
-    @Test
-    public void testMalformedDataModel() throws Exception {
-        ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, MALFORMED_DATA_MODEL);
-        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
-                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
-        assertEquals(200, resp.getStatus());
-        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
-        assertNotNull(response.getProblems());
-        assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL));
-    }
-
-    @Test
-    public void testLongDataModel() throws Exception {
-        ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, create30KString());
-        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
-                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
-        assertEquals(200, resp.getStatus());
-        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
-        assertNotNull(response.getProblems());
-        assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL));
-        String problemMessage = getProblemMessage(response, ExecuteResourceField.DATA_MODEL);
-        assertThat(problemMessage, containsString("data model"));
-        assertThat(problemMessage, containsString("limit"));
-    }
-
-    @Test
-    public void testLongTemplate() throws Exception {
-        ExecuteRequest req = new ExecuteRequest(create30KString(), DATA_MODEL);
-        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
-                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
-        assertEquals(200, resp.getStatus());
-        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
-        assertNotNull(response.getProblems());
-        assertTrue(containsProblem(response, ExecuteResourceField.TEMPLATE));
-        String problemMessage = getProblemMessage(response, ExecuteResourceField.TEMPLATE);
-        assertThat(problemMessage, containsString("template"));
-        assertThat(problemMessage, containsString("limit"));
-    }
-
-    @Test
-    public void testMultipleErrorsDataModel() throws Exception {
-        ExecuteRequest req = new ExecuteRequest(create30KString(), create30KString());
-        req.setOutputFormat("wrongOutputFormat");
-        req.setLocale("wrongLocale");
-        req.setTimeZone("wrongTimeZone");
-        
-        ClientResponse resp = client().resource(getBaseURI() + EXECUTE_API)
-                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
-        
-        assertEquals(200, resp.getStatus());
-        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
-        assertNotNull(response.getProblems());
-        assertThat(getProblemMessage(response, ExecuteResourceField.TEMPLATE), containsString("limit"));
-        assertThat(getProblemMessage(response, ExecuteResourceField.DATA_MODEL), containsString("limit"));
-        assertThat(getProblemMessage(response, ExecuteResourceField.OUTPUT_FORMAT), containsString("wrongOutputFormat"));
-        assertThat(getProblemMessage(response, ExecuteResourceField.LOCALE), containsString("wrongLocale"));
-        assertThat(getProblemMessage(response, ExecuteResourceField.TIME_ZONE), containsString("wrongTimeZone"));
-    }
-    
-    private String create30KString() {
-        final String veryLongString;
-        {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < 30000 / 10; i++) {
-                sb.append("0123456789");
-            }
-            veryLongString = sb.toString();
-        }
-        return veryLongString;
-    }
-
-    private boolean containsProblem(ExecuteResponse response, ExecuteResourceField field) {
-        for (ExecuteResourceProblem problem : response.getProblems()) {
-            if (problem.getField() == field) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private String getProblemMessage(ExecuteResponse response, ExecuteResourceField field) {
-        for (ExecuteResourceProblem problem : response.getProblems()) {
-            if (problem.getField() == field) {
-                return problem.getMessage();
-            }
-        }
-        return null;
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineResourceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineResourceTest.java b/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineResourceTest.java
deleted file mode 100644
index 6b3df76..0000000
--- a/src/test/java/com/kenshoo/freemarker/resources/FreeMarkerOnlineResourceTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.resources;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyMap;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.when;
-
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import com.kenshoo.freemarker.services.FreeMarkerService;
-import com.kenshoo.freemarker.view.FreeMarkerOnlineView;
-
-import freemarker.core.OutputFormat;
-
-@RunWith(MockitoJUnitRunner.class)
-public class FreeMarkerOnlineResourceTest {
-
-    @InjectMocks
-    FreeMarkerOnlineResource freeMarkerOnlineResultResource;
-
-    @Mock
-    FreeMarkerService freeMarkerService;
-
-    @Test
-    public void testInitialForm() {
-        when(freeMarkerService.calculateTemplateOutput(
-                anyString(), anyMap(), any(OutputFormat.class), any(Locale.class), any(TimeZone.class)))
-                .thenThrow(new AssertionError());
-        FreeMarkerOnlineView view = freeMarkerOnlineResultResource.blankForm();
-        assertEquals(view.getTemplate(), "");
-        assertEquals(view.getDataModel(), "");
-    }
-    
-    @Test
-    public void testPostedBlankForm() {
-        when(freeMarkerService.calculateTemplateOutput(
-                anyString(), anyMap(), any(OutputFormat.class), any(Locale.class), any(TimeZone.class)))
-                .thenThrow(new AssertionError());
-        FreeMarkerOnlineView view = freeMarkerOnlineResultResource.formResult(null, null, null, null, null);
-        assertEquals(view.getTemplate(), "");
-        assertEquals(view.getDataModel(), "");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceResponseBuilderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceResponseBuilderTest.java b/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceResponseBuilderTest.java
deleted file mode 100644
index caf5ca4..0000000
--- a/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceResponseBuilderTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.services;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-public class FreeMarkerServiceResponseBuilderTest {
-
-    private static final String RESULT = "Result";
-    
-    private final FreeMarkerServiceResponse.Builder builder = new FreeMarkerServiceResponse.Builder();
-
-    @Test
-    public void testSuccessResult() {
-        FreeMarkerServiceResponse result = builder.buildForSuccess(RESULT, false);
-        assertThat(result.getTemplateOutput(), equalTo(RESULT));
-        assertThat(result.isTemplateOutputTruncated(), is(false));
-        assertThat(result.isSuccesful(), is(true));
-        assertThat(result.getFailureReason(), nullValue());
-    }
-        
-    @Test
-    public void testSuccessTruncatedResult() {
-        FreeMarkerServiceResponse result = builder.buildForSuccess(RESULT, true);
-        assertThat(result.getTemplateOutput(), equalTo(RESULT));
-        assertThat(result.isTemplateOutputTruncated(), is(true));
-        assertThat(result.isSuccesful(), is(true));
-        assertThat(result.getFailureReason(), nullValue());
-    }
-
-    @Test
-    public void testErrorResult() {
-        Throwable failureReason = new Exception();
-        FreeMarkerServiceResponse result = builder.buildForFailure(failureReason);
-        assertThat(result.getTemplateOutput(), nullValue());
-        assertThat(result.isTemplateOutputTruncated(), is(false));
-        assertThat(result.isSuccesful(), is(false));
-        assertThat(result.getFailureReason(), sameInstance(failureReason));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceTest.java b/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceTest.java
deleted file mode 100644
index 6608d52..0000000
--- a/src/test/java/com/kenshoo/freemarker/services/FreeMarkerServiceTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.services;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import freemarker.core.Environment;
-import freemarker.core.HTMLOutputFormat;
-import freemarker.core.ParseException;
-import freemarker.template.TemplateDirectiveBody;
-import freemarker.template.TemplateDirectiveModel;
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateModel;
-
-@RunWith(MockitoJUnitRunner.class)
-public class FreeMarkerServiceTest {
-
-    private static final Logger LOG = LoggerFactory.getLogger(FreeMarkerServiceTest.class); 
-    
-    private static final int MAX_THREADS = 3;
-    private static final int MAX_QUEUE_LENGTH = 2;
-    private static final int MAX_TEMPLATE_EXECUTION_TIME = 1500;
-
-    private static final int BLOCKING_TEST_TIMEOUT = 5000;
-    
-    private static final String TRUNCATION_TEST_TEMPLATE = "12345";
-    
-    @InjectMocks
-    private FreeMarkerService freeMarkerService;
-    
-    @Before
-    public void initializeSpringBeans() {
-        freeMarkerService.setMaxQueueLength(MAX_QUEUE_LENGTH);
-        freeMarkerService.setMaxThreads(MAX_THREADS);
-        freeMarkerService.postConstruct();
-        freeMarkerService.setMaxTemplateExecutionTime(MAX_TEMPLATE_EXECUTION_TIME);
-    }
-
-    @Test
-    public void testCalculationOfATemplateWithNoDataModel() {
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                "test", Collections.<String, Object>emptyMap(), null, null, null);
-        assertThat(serviceResponse.isSuccesful(), is(true));
-        assertThat(serviceResponse.getTemplateOutput(), is("test"));
-    }
-
-    @Test
-    public void testSimpleTemplate() {
-        HashMap<String, Object> dataModel = new HashMap<>();
-        dataModel.put("var1", "val1");
-        String templateSourceCode = "${var1}";
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                templateSourceCode, dataModel, null, null, null);
-        assertThat(serviceResponse.getTemplateOutput(), equalTo("val1"));
-    }
-
-    @Test
-    public void testTemplateWithFewArgsAndOperators() {
-        HashMap<String, Object> dataModel = new HashMap<>();
-        dataModel.put("var1", "val1");
-        dataModel.put("var2", "val2");
-        String template = "${var1?capitalize} ${var2?cap_first}";
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                template, dataModel, null, null, null);
-        assertThat(serviceResponse.getTemplateOutput(), equalTo("Val1 Val2"));
-    }
-
-    @Test
-    public void testOutputFormatParamterMatters() {
-        String template = "${'&'}";
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, null, null, null);
-            assertThat(serviceResponse.getTemplateOutput(), equalTo("&"));
-        }
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, HTMLOutputFormat.INSTANCE, null, null);
-            assertThat(serviceResponse.getTemplateOutput(), equalTo("&amp;"));
-        }
-    }
-
-    @Test
-    public void testLocaleParameterMatters() {
-        String template = "${.locale}";
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, null, new Locale("en", "US"), null);
-            assertThat(serviceResponse.getTemplateOutput(), equalTo("en_US"));
-        }
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, null, new Locale("ru", "RU"), null);
-            assertThat(serviceResponse.getTemplateOutput(), equalTo("ru_RU"));
-        }
-    }
-
-    @Test
-    public void testTimeZoneParameterMatters() {
-        String template = "${" + System.currentTimeMillis() + "?numberToDatetime}";
-        
-        String gmt1Result;
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, null, null, TimeZone.getTimeZone("GMT+01"));
-            gmt1Result = serviceResponse.getTemplateOutput();
-        }
-        
-        String gmt2Result;
-        {
-            FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                    template, null, null, new Locale("ru", "RU"), null);
-            gmt2Result = serviceResponse.getTemplateOutput();
-        }
-        
-        assertThat(gmt1Result, not(equalTo(gmt2Result)));
-    }
-    
-    @Test
-    public void testTemplateWithSyntaxError() {
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                "test ${xx", Collections.<String, Object>emptyMap(), null, null, null);
-        assertThat(serviceResponse.isSuccesful(), is(false));
-        assertThat(serviceResponse.getFailureReason(), instanceOf(ParseException.class));
-    }
-
-    @Test
-    public void testTemplateWithEvaluationError() {
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                "test ${x}", Collections.<String, Object>emptyMap(), null, null, null);
-        assertThat(serviceResponse.isSuccesful(), is(false));
-        assertThat(serviceResponse.getFailureReason(), instanceOf(TemplateException.class));
-    }
-
-    @Test
-    public void testResultAlmostTruncation() {
-        freeMarkerService.setMaxOutputLength(5);
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                TRUNCATION_TEST_TEMPLATE, Collections.<String, Object>emptyMap(), null, null, null);
-        assertThat(serviceResponse.isSuccesful(), is(true));
-        assertThat(serviceResponse.isTemplateOutputTruncated(), is(false));
-        assertThat(serviceResponse.getTemplateOutput(), equalTo(TRUNCATION_TEST_TEMPLATE));
-    }
-
-    @Test
-    public void testResultTruncation() {
-        freeMarkerService.setMaxOutputLength(4);
-        FreeMarkerServiceResponse serviceResponse = freeMarkerService.calculateTemplateOutput(
-                TRUNCATION_TEST_TEMPLATE, Collections.<String, Object>emptyMap(), null, null, null);
-        assertThat(serviceResponse.isSuccesful(), is(true));
-        assertThat(serviceResponse.isTemplateOutputTruncated(), is(true));
-        assertThat(serviceResponse.getTemplateOutput(),
-                startsWith(TRUNCATION_TEST_TEMPLATE.substring(0, freeMarkerService.getMaxOutputLength())));
-        assertThat(serviceResponse.getTemplateOutput().charAt(freeMarkerService.getMaxOutputLength()),
-                not(equalTo(TRUNCATION_TEST_TEMPLATE.charAt(freeMarkerService.getMaxOutputLength()))));
-    }
-    
-    @Test
-    public void testTemplateExecutionTimeout() throws InterruptedException, ExecutionException {
-        freeMarkerService.setMaxTemplateExecutionTime(200);
-        
-        // To avoid blocking the CI server forever without giving error:
-        Future<FreeMarkerServiceResponse> future = Executors.newSingleThreadExecutor().submit(
-                new Callable<FreeMarkerServiceResponse>() {
-        
-                    @Override
-                    public FreeMarkerServiceResponse call() throws Exception {
-                        return freeMarkerService.calculateTemplateOutput(
-                                "<#list 1.. as _></#list>", Collections.<String, Object>emptyMap(), null, null, null);
-                    }
-                    
-                });
-        FreeMarkerServiceResponse serviceResponse;
-        try {
-            serviceResponse = future.get(BLOCKING_TEST_TIMEOUT, TimeUnit.MILLISECONDS);
-        } catch (TimeoutException e) {
-            throw new AssertionError("The template execution wasn't aborted (within the timeout).");
-        }
-        assertThat(serviceResponse.isSuccesful(), is(false));
-        assertThat(serviceResponse.getFailureReason(), instanceOf(TimeoutException.class));
-    }
-    
-    @Test
-    public void testServiceOverburden() throws InterruptedException {
-        final BlockerDirective blocker = new BlockerDirective();
-        final Map<String, BlockerDirective> blockerDataModel = Collections.singletonMap("blocker", blocker);
-        try {
-            // Fill all available task "slots":
-            for (int i = 0; i < MAX_THREADS + MAX_QUEUE_LENGTH; i++) {
-                new Thread(new Runnable() {
-                    @Override
-                    public void run() {
-                        freeMarkerService.calculateTemplateOutput("<@blocker/>", blockerDataModel, null, null, null);                    
-                    }
-                }).start();
-            }
-            
-            // Wait until all template executions has started:
-            synchronized (blocker) {
-                final long startTime = System.currentTimeMillis();
-                while (blocker.getEntered() < MAX_THREADS) {
-                    // To avoid blocking the CI server forever is something goes wrong:
-                    if (System.currentTimeMillis() - startTime > BLOCKING_TEST_TIMEOUT) {
-                        fail("JUnit test timed out");
-                    }
-                    blocker.wait(1000);
-                }
-            }
-            Thread.sleep(200);
-            // Because the others are waiting in the queue, and weren't started:
-            assertThat(blocker.getEntered(), not(greaterThan(MAX_THREADS)));
-            
-            // Souldn't accept on more tasks:
-            try {
-                freeMarkerService.calculateTemplateOutput("<@blocker/>", blockerDataModel, null, null, null);
-                fail("Expected RejectedExecutionException, but nothing was thrown.");
-            } catch (RejectedExecutionException e) {
-                // Expected
-            }
-        } finally {
-            // Ensure that the started threads will end:
-            blocker.release();
-        }
-    }
-    
-    private static final class BlockerDirective implements TemplateDirectiveModel {
-        
-        private int entered;
-        private boolean released;
-
-        public synchronized void release() {
-            released = true;
-            notifyAll();
-        }
-        
-        @Override
-        public synchronized void execute(Environment env, @SuppressWarnings("rawtypes") Map params,
-                TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
-            entered++;
-            notifyAll();
-            final long startTime = System.currentTimeMillis();
-            while (!released) {
-                // To avoid blocking the CI server forever is something goes wrong:
-                if (System.currentTimeMillis() - startTime > BLOCKING_TEST_TIMEOUT) {
-                    LOG.error("JUnit test timed out");
-                }
-                try {
-                    wait(1000);
-                } catch (InterruptedException e) {
-                    LOG.error("JUnit test was interrupted");
-                }
-            }
-            LOG.debug("Blocker released");
-        }
-
-        public synchronized int getEntered() {
-            return entered;
-        }
-        
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/util/DataModelParserTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/util/DataModelParserTest.java b/src/test/java/com/kenshoo/freemarker/util/DataModelParserTest.java
deleted file mode 100644
index f651fb8..0000000
--- a/src/test/java/com/kenshoo/freemarker/util/DataModelParserTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.util;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.math.BigDecimal;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.util.GregorianCalendar;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import freemarker.template.utility.DateUtil;
-
-public class DataModelParserTest {
-    
-    @Test
-    public void testEmpty() throws DataModelParsingException {
-        assertTrue(DataModelParser.parse("", DateUtil.UTC).isEmpty());
-        assertTrue(DataModelParser.parse(" \n ", DateUtil.UTC).isEmpty());
-    }
-
-    @Test
-    public void testSingleAssignment() throws DataModelParsingException {
-        assertEquals(ImmutableMap.of("n", "v"), DataModelParser.parse("n=v", DateUtil.UTC));
-        assertEquals(ImmutableMap.of("n", "v"), DataModelParser.parse("\n\n\tn\t= v", DateUtil.UTC));
-        assertEquals(ImmutableMap.of("longerN", "longer v"), DataModelParser.parse("longerN=longer v", DateUtil.UTC));
-        assertEquals(ImmutableMap.of("a:b.c-d$@", "foo bar\nbaaz"), DataModelParser.parse("a:b.c-d$@ = foo bar\nbaaz", DateUtil.UTC));
-    }
-
-    @Test
-    public void testNotBlankButHasNoAssignment() {
-        try {
-            DataModelParser.parse("x", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("must start with an assignment"));
-        }
-    }
-
-    @Test
-    public void testNoLinebreakBeforeEquals() {
-        try {
-            DataModelParser.parse("x\n=y", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("must start with an assignment"));
-        }
-    }
-
-    @Test
-    public void testMultipleAssignments() throws DataModelParsingException {
-        assertEquals(ImmutableMap.of("n1", "v1", "n2", "v2", "n3", "v3"),
-                DataModelParser.parse("n1=v1\nn2=v2\nn3=v3", DateUtil.UTC));
-        assertEquals(ImmutableMap.of("n1", "v1", "n2", "v2", "n3", "v3"),
-                DataModelParser.parse(" n1 = v1 \r\n\r\n\tn2=v2\nn3 = v3\n\n", DateUtil.UTC));
-        assertEquals(ImmutableMap.of("n1", "=\n=v", "n2", "l1\nl2\n\nl3", "n3", "v3"),
-                DataModelParser.parse("n1==\n=v \n n2=l1\nl2\n\nl3\nn3=v3", DateUtil.UTC));
-    }
-
-    @Test
-    public void testStrings() throws DataModelParsingException {
-        assertEquals(
-                ImmutableMap.of(
-                    "a", "C:\\x",
-                    "b", "foo\nbar",
-                    "c", "foo\t\"bar\"",
-                    "d", "foo\t\"bar\"",
-                    "e", "Foo's"
-                ),
-                DataModelParser.parse(
-                        "a=C:\\x\n"
-                        + "b=foo\nbar\n"
-                        + "c=foo\t\"bar\"\n"
-                        + "d=\"foo\\t\\\"bar\\\"\"\n"
-                        + "e=\"Foo's\"",
-                        DateUtil.UTC));
-        try {
-            DataModelParser.parse("a=\"foo", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("quoted"));
-        }
-        try {
-            DataModelParser.parse("a='foo'", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("quoted"));
-        }
-        try {
-            DataModelParser.parse("a=\"\\x\"", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("escape"));
-        }
-    }
-    
-    @Test
-    public void testBasicNumbers() throws DataModelParsingException {
-        assertEquals(
-                ImmutableMap.of(
-                    "a", BigDecimal.valueOf(1),
-                    "b", BigDecimal.valueOf(1.5),
-                    "c", BigDecimal.valueOf(-1.5),
-                    "d", BigDecimal.valueOf(1.5),
-                    "e", BigDecimal.valueOf(-0.125)
-                ),
-                DataModelParser.parse("a=1\nb=1.5\nc=-1.5\nd=+1.5\ne=-12.5e-2", DateUtil.UTC));
-        try {
-            DataModelParser.parse("a=1,5", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("Malformed number"));
-            assertThat(e.getMessage(), not(containsString("ISO")));
-        }
-    }
-    
-    @Test
-    public void testSpecialNumbers() throws DataModelParsingException {
-    assertEquals(
-            ImmutableMap.of(
-                "a", Double.NaN,
-                "b", Double.POSITIVE_INFINITY,
-                "c", Double.NEGATIVE_INFINITY,
-                "d", Double.POSITIVE_INFINITY
-            ),
-            DataModelParser.parse("a=NaN\nb=Infinity\nc=-Infinity\nd=+Infinity", DateUtil.UTC));
-    }
-
-    @Test
-    public void testBooleans() throws DataModelParsingException {
-        assertEquals(ImmutableMap.of("a", true, "b", false), DataModelParser.parse("a=true\nb=false", DateUtil.UTC));
-        try {
-            DataModelParser.parse("a=True", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("true"));
-        }
-    }
-    
-    @Test
-    public void testTemporals() throws DataModelParsingException {
-        final Map<String, Object> dm = DataModelParser.parse("a=2014-02-12T01:02:03Z\nb=2014-02-12\nc=01:02:03Z", DateUtil.UTC);
-        
-        final GregorianCalendar cal = new GregorianCalendar(DateUtil.UTC);
-        cal.clear();
-        
-        cal.set(2014, 1, 12, 1, 2, 3);
-        Timestamp a = new Timestamp(cal.getTimeInMillis());
-        assertThat(dm.get("a"), instanceOf(Timestamp.class));
-        assertEquals(dm.get("a"), a);
-        
-        cal.set(2014, 1, 12, 0, 0, 0);
-        java.sql.Date b = new java.sql.Date(cal.getTimeInMillis());
-        assertThat(dm.get("b"), instanceOf(java.sql.Date.class));
-        assertEquals(dm.get("b"), b);
-        
-        cal.set(1970, 0, 1, 1, 2, 3);
-        Time c = new Time(cal.getTimeInMillis());
-        assertThat(dm.get("c"), instanceOf(Time.class));
-        assertEquals(dm.get("c"), c);
-        
-        try {
-            DataModelParser.parse("a=2012T123", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("ISO 8601 date-time"));
-        }
-        try {
-            DataModelParser.parse("a=2012-0102", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("ISO 8601 date"));
-        }
-        try {
-            DataModelParser.parse("a=25:00", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("ISO 8601 time"));
-        }
-    }
-    
-    @Test
-    public void testMaps() throws DataModelParsingException {
-        final Object map = DataModelParser.parse(
-                "n = {\n"
-                + "\t\"a\": 1,\n"
-                + "\t\"b\": 2\n"
-                + "}",
-                DateUtil.UTC)
-                .get("n");
-        assertEquals(ImmutableMap.of("a", 1, "b", 2), map);
-        assertThat(map, instanceOf(LinkedHashMap.class));
-        try {
-            DataModelParser.parse("n={1:2}", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("JSON"));
-        }
-    }    
-    
-    @Test
-    public void testLists() throws DataModelParsingException {
-        final Object list = DataModelParser.parse("n=[1, 2]", DateUtil.UTC).get("n");
-        assertEquals(ImmutableList.of(1, 2), list);
-        assertThat(list, instanceOf(List.class));
-        try {
-            DataModelParser.parse("n=[", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("JSON"));
-        }
-    }
-
-    @Test
-    public void testXML() throws DataModelParsingException {
-        final Object doc = DataModelParser.parse("n=<e xmlns='foo:/bar' a='123'>text</e>", DateUtil.UTC).get("n");
-        assertThat(doc, instanceOf(Document.class));
-        final Node firstChild = ((Document) doc).getFirstChild();
-        assertEquals("e", firstChild.getNodeName());
-        assertEquals("foo:/bar", firstChild.getNamespaceURI());
-        
-        try {
-            DataModelParser.parse("n=<ns:e />", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("XML"));
-        }
-    }
-    
-    @Test
-    public void testNull() throws DataModelParsingException {
-        assertNull(DataModelParser.parse("n=null", DateUtil.UTC).get("n"));
-        try {
-            DataModelParser.parse("a=NULL", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("null"));
-        }
-    }
-
-    @Test
-    public void testEmptyValue() throws DataModelParsingException {
-        try {
-            DataModelParser.parse("n=", DateUtil.UTC);
-            fail();
-        } catch (DataModelParsingException e) {
-            assertThat(e.getMessage(), containsString("Empty"));
-        }
-        
-        assertEquals("", DataModelParser.parse("n=\"\"", DateUtil.UTC).get("n"));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/util/LengthLimitedWriterTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/util/LengthLimitedWriterTest.java b/src/test/java/com/kenshoo/freemarker/util/LengthLimitedWriterTest.java
deleted file mode 100644
index c56d52e..0000000
--- a/src/test/java/com/kenshoo/freemarker/util/LengthLimitedWriterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.util;
-
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.junit.Test;
-
-public class LengthLimitedWriterTest {
-
-    private StringWriter wrappedW = new StringWriter();
-    private LengthLimitedWriter w = new LengthLimitedWriter(wrappedW, 5);
-    
-    @Test
-    public void testLimitNotExceeded() throws IOException {
-        w.write("123");
-        w.write("45");
-    }
-
-    @Test
-    public void testLimitExceededWithString() throws IOException {
-        w.write("123");
-        try {
-            w.write("456");
-            fail();
-        } catch (LengthLimitExceededException e) {
-            assertEquals("12345", wrappedW.toString());
-        }
-    }
-
-    @Test
-    public void testLimitExceededWithCharArray() throws IOException {
-        w.write(new char[] { '1', '2', '3' });
-        try {
-            w.write(new char[] { '4', '5', '6' });
-            fail();
-        } catch (LengthLimitExceededException e) {
-            assertEquals("12345", wrappedW.toString());
-        }
-    }
-
-    @Test
-    public void testLimitExceededWithChar() throws IOException {
-        w.write('1');
-        w.write('2');
-        w.write('3');
-        w.write('4');
-        w.write('5');
-        try {
-            w.write('6');
-            fail();
-        } catch (LengthLimitExceededException e) {
-            assertEquals("12345", wrappedW.toString());
-        }
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/com/kenshoo/freemarker/view/FreeMarkerOnlineViewTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/kenshoo/freemarker/view/FreeMarkerOnlineViewTest.java b/src/test/java/com/kenshoo/freemarker/view/FreeMarkerOnlineViewTest.java
deleted file mode 100644
index c67b44c..0000000
--- a/src/test/java/com/kenshoo/freemarker/view/FreeMarkerOnlineViewTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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 com.kenshoo.freemarker.view;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.junit.Test;
-
-import com.kenshoo.freemarker.services.AllowedSettingValuesMaps;
-
-import freemarker.core.HTMLOutputFormat;
-
-
-public class FreeMarkerOnlineViewTest {
-
-    private static final String TEMPLATE = "Template";
-    private static final String DATA_MODEL = "DataModel";
-
-    @Test
-    public void testVieEmptyConstrucotr() {
-        FreeMarkerOnlineView view = new FreeMarkerOnlineView();
-        assertEquals(view.getTemplate(), "");
-        assertEquals(view.getDataModel(), "");
-        assertEquals(view.getOutputFormat(), AllowedSettingValuesMaps.DEFAULT_OUTPUT_FORMAT_KEY);
-        assertEquals(view.getLocale(), AllowedSettingValuesMaps.DEFAULT_LOCALE_KEY);
-        assertEquals(view.getTimeZone(), AllowedSettingValuesMaps.DEFAULT_TIME_ZONE_KEY);
-    }
-
-    @Test
-    public void testViewWhenAllOK() {
-        FreeMarkerOnlineView view = new FreeMarkerOnlineView();
-        
-        view.setTemplate(TEMPLATE);
-        view.setDataModel(DATA_MODEL);
-        String outputFormatStr = HTMLOutputFormat.INSTANCE.getName();
-        view.setOutputFormat(outputFormatStr);
-        String localeStr = Locale.GERMAN.toString();
-        view.setLocale(localeStr);
-        String timeZoneStr = TimeZone.getTimeZone("GMT+01").getID();
-        view.setTimeZone(timeZoneStr);
-        
-        assertEquals(view.getTemplate(), TEMPLATE);
-        assertEquals(view.getDataModel(), DATA_MODEL);
-        assertEquals(view.getOutputFormat(), outputFormatStr);
-        assertEquals(view.getLocale(), localeStr);
-        assertEquals(view.getTimeZone(), timeZoneStr);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/org/apache/freemarker/onlinetester/platform/DropWizardServiceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/onlinetester/platform/DropWizardServiceTest.java b/src/test/java/org/apache/freemarker/onlinetester/platform/DropWizardServiceTest.java
new file mode 100644
index 0000000..f23672c
--- /dev/null
+++ b/src/test/java/org/apache/freemarker/onlinetester/platform/DropWizardServiceTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.freemarker.onlinetester.platform;
+
+import com.google.common.io.Resources;
+import org.apache.freemarker.onlinetester.dropwizard.ApplicationStartup;
+import com.yammer.dropwizard.testing.junit.DropwizardServiceRule;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+
+public class DropWizardServiceTest {
+    @ClassRule
+    public static TestRule testRule = new DropwizardServiceRule<>(ApplicationStartup.class,
+            Resources.getResource("freemarker-online.yml").getPath());
+
+
+    @Test
+    public void testServerIsUp() throws Exception {
+        ((DropwizardServiceRule) testRule).getService();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/org/apache/freemarker/onlinetester/platform/YamlPropertiesPersister.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/onlinetester/platform/YamlPropertiesPersister.java b/src/test/java/org/apache/freemarker/onlinetester/platform/YamlPropertiesPersister.java
new file mode 100644
index 0000000..4257e40
--- /dev/null
+++ b/src/test/java/org/apache/freemarker/onlinetester/platform/YamlPropertiesPersister.java
@@ -0,0 +1,91 @@
+/*
+ * 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.freemarker.onlinetester.platform;
+
+import com.fasterxml.jackson.dataformat.yaml.snakeyaml.Yaml;
+import org.springframework.util.PropertiesPersister;
+import org.springframework.util.StringUtils;
+
+import java.io.*;
+import java.util.Map;
+import java.util.Properties;
+
+public class YamlPropertiesPersister implements PropertiesPersister {
+    @Override
+    public void load(Properties props, InputStream is) throws IOException {
+        load(props, new InputStreamReader(is));
+    }
+
+    /**
+     * We want to traverse map representing Yaml object and each time we find String=String pair we want to
+     * save it as Property. As we are going deeper into map we generate compound key as path-like String
+     *
+     * @see org.springframework.util.PropertiesPersister#load(java.util.Properties, java.io.Reader)
+     */
+    @Override
+    public void load(Properties props, Reader reader) throws IOException {
+        Yaml yaml = new Yaml();
+        @SuppressWarnings("unchecked")
+        Map<String, Object> map = (Map<String, Object>) yaml.load(reader);
+        // now we can populate supplied props
+        assignProperties(props, map, null);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void assignProperties(Properties props, Map<String, Object> map, String path) {
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
+            String key = entry.getKey();
+            if (!StringUtils.isEmpty(path))
+                key = path + "." + key;
+            Object val = entry.getValue();
+            if (val instanceof String) {
+                // see if we need to create a compound key
+                props.put(key, val);
+            } else if (val instanceof Map) {
+                assignProperties(props, (Map<String, Object>) val, key);
+            }
+        }
+    }
+
+    @Override
+    public void store(Properties props, OutputStream os, String header) throws IOException {
+        throw new IllegalStateException("Current implementation is a read-only");
+    }
+
+    @Override
+    public void store(Properties props, Writer writer, String header) throws IOException {
+        throw new IllegalStateException("Current implementation is a read-only");
+    }
+
+    @Override
+    public void loadFromXml(Properties props, InputStream is) throws IOException {
+        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to read/write XML");
+    }
+
+    @Override
+    public void storeToXml(Properties props, OutputStream os, String header) throws IOException {
+        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to load/store to XML");
+    }
+
+    @Override
+    public void storeToXml(Properties props, OutputStream os, String header, String encoding) throws IOException {
+        throw new IllegalStateException("Use DefaultPropertiesPersister if you want to read/write XML");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineExecuteResourceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineExecuteResourceTest.java b/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineExecuteResourceTest.java
new file mode 100644
index 0000000..d0f81cb
--- /dev/null
+++ b/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineExecuteResourceTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.freemarker.onlinetester.resources;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.freemarker.onlinetester.model.ExecuteRequest;
+import org.apache.freemarker.onlinetester.model.ExecuteResourceField;
+import org.apache.freemarker.onlinetester.model.ExecuteResourceProblem;
+import org.apache.freemarker.onlinetester.model.ExecuteResponse;
+import org.junit.Test;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.request.RequestContextListener;
+
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
+import com.sun.jersey.test.framework.AppDescriptor;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+
+public class FreeMarkerOnlineExecuteResourceTest extends JerseyTest {
+    private static final String DATA_MODEL = "user=John";
+    private static final String TEMPLATE_WITH_VARIABLE = "Welcome ${user}";
+    private static final String TEMPLATE_PLAIN = "Welcome John";
+    private static final String MALFORMED_DATA_MODEL = "userJohn";
+    private static final String EXECUTE_API = "api/execute";
+    @Override
+    protected AppDescriptor configure() {
+        return new WebAppDescriptor.Builder("org.apache.freemarker.onlinetester.resources")
+                        .contextPath("/")
+                        .contextListenerClass(ContextLoaderListener.class)
+                        .contextParam("contextConfigLocation", "classpath:spring/bootstrap-context.xml")
+                        .servletClass(SpringServlet.class)
+                        .requestListenerClass(RequestContextListener.class)
+                        .build();
+    }
+
+    @Test
+    public void testSuccessRequest() throws Exception {
+        ExecuteRequest req = new ExecuteRequest(TEMPLATE_WITH_VARIABLE, DATA_MODEL);
+        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
+                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
+        assertEquals(200, resp.getStatus());
+        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
+        assertNull(response.getProblems());
+    }
+
+    @Test
+    public void testMalformedDataModel() throws Exception {
+        ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, MALFORMED_DATA_MODEL);
+        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
+                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
+        assertEquals(200, resp.getStatus());
+        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
+        assertNotNull(response.getProblems());
+        assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL));
+    }
+
+    @Test
+    public void testLongDataModel() throws Exception {
+        ExecuteRequest req = new ExecuteRequest(TEMPLATE_PLAIN, create30KString());
+        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
+                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
+        assertEquals(200, resp.getStatus());
+        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
+        assertNotNull(response.getProblems());
+        assertTrue(containsProblem(response, ExecuteResourceField.DATA_MODEL));
+        String problemMessage = getProblemMessage(response, ExecuteResourceField.DATA_MODEL);
+        assertThat(problemMessage, containsString("data model"));
+        assertThat(problemMessage, containsString("limit"));
+    }
+
+    @Test
+    public void testLongTemplate() throws Exception {
+        ExecuteRequest req = new ExecuteRequest(create30KString(), DATA_MODEL);
+        ClientResponse resp = client().resource(getBaseURI().toString() + EXECUTE_API)
+                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
+        assertEquals(200, resp.getStatus());
+        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
+        assertNotNull(response.getProblems());
+        assertTrue(containsProblem(response, ExecuteResourceField.TEMPLATE));
+        String problemMessage = getProblemMessage(response, ExecuteResourceField.TEMPLATE);
+        assertThat(problemMessage, containsString("template"));
+        assertThat(problemMessage, containsString("limit"));
+    }
+
+    @Test
+    public void testMultipleErrorsDataModel() throws Exception {
+        ExecuteRequest req = new ExecuteRequest(create30KString(), create30KString());
+        req.setOutputFormat("wrongOutputFormat");
+        req.setLocale("wrongLocale");
+        req.setTimeZone("wrongTimeZone");
+        
+        ClientResponse resp = client().resource(getBaseURI() + EXECUTE_API)
+                .header("Content-Type", "application/json").entity(req).post(ClientResponse.class);
+        
+        assertEquals(200, resp.getStatus());
+        ExecuteResponse response = resp.getEntity(ExecuteResponse.class);
+        assertNotNull(response.getProblems());
+        assertThat(getProblemMessage(response, ExecuteResourceField.TEMPLATE), containsString("limit"));
+        assertThat(getProblemMessage(response, ExecuteResourceField.DATA_MODEL), containsString("limit"));
+        assertThat(getProblemMessage(response, ExecuteResourceField.OUTPUT_FORMAT), containsString("wrongOutputFormat"));
+        assertThat(getProblemMessage(response, ExecuteResourceField.LOCALE), containsString("wrongLocale"));
+        assertThat(getProblemMessage(response, ExecuteResourceField.TIME_ZONE), containsString("wrongTimeZone"));
+    }
+    
+    private String create30KString() {
+        final String veryLongString;
+        {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < 30000 / 10; i++) {
+                sb.append("0123456789");
+            }
+            veryLongString = sb.toString();
+        }
+        return veryLongString;
+    }
+
+    private boolean containsProblem(ExecuteResponse response, ExecuteResourceField field) {
+        for (ExecuteResourceProblem problem : response.getProblems()) {
+            if (problem.getField() == field) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String getProblemMessage(ExecuteResponse response, ExecuteResourceField field) {
+        for (ExecuteResourceProblem problem : response.getProblems()) {
+            if (problem.getField() == field) {
+                return problem.getMessage();
+            }
+        }
+        return null;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineResourceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineResourceTest.java b/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineResourceTest.java
new file mode 100644
index 0000000..4f6ef7c
--- /dev/null
+++ b/src/test/java/org/apache/freemarker/onlinetester/resources/FreeMarkerOnlineResourceTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.freemarker.onlinetester.resources;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyMap;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import org.apache.freemarker.onlinetester.services.FreeMarkerService;
+import org.apache.freemarker.onlinetester.view.FreeMarkerOnlineView;
+
+import freemarker.core.OutputFormat;
+
+@RunWith(MockitoJUnitRunner.class)
+public class FreeMarkerOnlineResourceTest {
+
+    @InjectMocks
+    FreeMarkerOnlineResource freeMarkerOnlineResultResource;
+
+    @Mock
+    FreeMarkerService freeMarkerService;
+
+    @Test
+    public void testInitialForm() {
+        when(freeMarkerService.calculateTemplateOutput(
+                anyString(), anyMap(), any(OutputFormat.class), any(Locale.class), any(TimeZone.class)))
+                .thenThrow(new AssertionError());
+        FreeMarkerOnlineView view = freeMarkerOnlineResultResource.blankForm();
+        assertEquals(view.getTemplate(), "");
+        assertEquals(view.getDataModel(), "");
+    }
+    
+    @Test
+    public void testPostedBlankForm() {
+        when(freeMarkerService.calculateTemplateOutput(
+                anyString(), anyMap(), any(OutputFormat.class), any(Locale.class), any(TimeZone.class)))
+                .thenThrow(new AssertionError());
+        FreeMarkerOnlineView view = freeMarkerOnlineResultResource.formResult(null, null, null, null, null);
+        assertEquals(view.getTemplate(), "");
+        assertEquals(view.getDataModel(), "");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker-online-tester/blob/2f0c0424/src/test/java/org/apache/freemarker/onlinetester/services/FreeMarkerServiceResponseBuilderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/onlinetester/services/FreeMarkerServiceResponseBuilderTest.java b/src/test/java/org/apache/freemarker/onlinetester/services/FreeMarkerServiceResponseBuilderTest.java
new file mode 100644
index 0000000..f83a1b4
--- /dev/null
+++ b/src/test/java/org/apache/freemarker/onlinetester/services/FreeMarkerServiceResponseBuilderTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.freemarker.onlinetester.services;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class FreeMarkerServiceResponseBuilderTest {
+
+    private static final String RESULT = "Result";
+    
+    private final FreeMarkerServiceResponse.Builder builder = new FreeMarkerServiceResponse.Builder();
+
+    @Test
+    public void testSuccessResult() {
+        FreeMarkerServiceResponse result = builder.buildForSuccess(RESULT, false);
+        assertThat(result.getTemplateOutput(), equalTo(RESULT));
+        assertThat(result.isTemplateOutputTruncated(), is(false));
+        assertThat(result.isSuccesful(), is(true));
+        assertThat(result.getFailureReason(), nullValue());
+    }
+        
+    @Test
+    public void testSuccessTruncatedResult() {
+        FreeMarkerServiceResponse result = builder.buildForSuccess(RESULT, true);
+        assertThat(result.getTemplateOutput(), equalTo(RESULT));
+        assertThat(result.isTemplateOutputTruncated(), is(true));
+        assertThat(result.isSuccesful(), is(true));
+        assertThat(result.getFailureReason(), nullValue());
+    }
+
+    @Test
+    public void testErrorResult() {
+        Throwable failureReason = new Exception();
+        FreeMarkerServiceResponse result = builder.buildForFailure(failureReason);
+        assertThat(result.getTemplateOutput(), nullValue());
+        assertThat(result.isTemplateOutputTruncated(), is(false));
+        assertThat(result.isSuccesful(), is(false));
+        assertThat(result.getFailureReason(), sameInstance(failureReason));
+    }
+    
+}