You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by je...@apache.org on 2018/05/14 16:48:27 UTC

[sling-org-apache-sling-servlets-get] 01/02: SLING-7656 improvements to unit tests

This is an automated email from the ASF dual-hosted git repository.

jeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-get.git

commit fa6da778a3cc9075c79d6a4c60480c6d879fbdf3
Author: JE Bailey <je...@apache.org>
AuthorDate: Mon May 7 08:51:01 2018 -0400

    SLING-7656 improvements to unit tests
---
 pom.xml                                            |  23 ++--
 .../sling/servlets/get/impl/DefaultGetServlet.java |   8 +-
 .../servlets/get/impl/VersionInfoServlet.java      |  22 +++-
 .../servlets/get/impl/helpers/JsonRenderer.java    |   7 +-
 .../servlets/get/impl/util/JsonObjectCreator.java  |  42 ++++---
 .../servlets/get/impl/util/ResourceTraversor.java  |   7 +-
 .../servlets/get/impl/JsonRendererServletTest.java |   2 +-
 ...dererServletTest.java => HtmlRendererTest.java} |   6 +-
 .../get/impl/helpers/JsonRendererServletTest.java  | 112 -----------------
 .../get/impl/helpers/JsonRendererTest.java         | 136 +++++++++++++++++++++
 ...rerServletTest.java => StreamRendererTest.java} |   3 +-
 src/test/resources/data.json                       |  19 +++
 12 files changed, 240 insertions(+), 147 deletions(-)

diff --git a/pom.xml b/pom.xml
index bc8133d..b49ff5b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -97,12 +97,6 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-json_1.0_spec</artifactId>
-            <version>1.0-alpha-1</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>org.apache.jackrabbit</groupId>
             <artifactId>jackrabbit-jcr-commons</artifactId>
             <version>2.2.9</version>
@@ -149,7 +143,22 @@
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.johnzon</artifactId>
             <version>1.0.0</version>
-            <scope>test</scope>
+            <scope>provided</scope>
+        </dependency>
+                <dependency>
+        	<groupId>org.apache.sling</groupId>
+        	<artifactId>org.apache.sling.testing.sling-mock</artifactId>
+        	<version>2.2.10</version>
+        	<scope>test</scope>
         </dependency>
+                        <dependency>
+                	<groupId>org.apache.sling</groupId>
+                	<artifactId>
+                		org.apache.sling.servlet-helpers
+                	</artifactId>
+                	<version>1.1.5-SNAPSHOT</version>
+                	<type>bundle</type>
+                	<scope>test</scope>
+                </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
index 05d6015..50df111 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
@@ -128,6 +128,9 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
                   "this basically means the number of Objects to return. Default value is " +
                   "200.")
         int json_maximumresults() default 200;
+        
+        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        boolean ecmaSuport() default false;
     }
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -155,6 +158,8 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
 
     @Reference(policyOption = ReferencePolicyOption.GREEDY)
     private XSSAPI xssApi;
+
+	private boolean enableEcmaSupport;
     
     public static final String EXT_HTML = "html";
 
@@ -180,6 +185,7 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
         this.enableJson = cfg.enable_json();
         this.enableXml = cfg.enable_xml();
         this.jsonMaximumResults = cfg.json_maximumresults();
+        this.enableEcmaSupport = cfg.ecmaSuport();
     }
 
     @Deactivate
@@ -198,7 +204,7 @@ public class DefaultGetServlet extends SlingSafeMethodsServlet {
         } else if ( EXT_TXT.equals(type) ) {
             renderer = new PlainTextRenderer();
         } else if (EXT_JSON.equals(type) ) {
-            renderer = new JsonRenderer(jsonMaximumResults);
+            renderer = new JsonRenderer(jsonMaximumResults, enableEcmaSupport);
         } else if ( EXT_XML.equals(type) ) {
             renderer = new XMLRenderer();
         }
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
index 31b786c..35b9fae 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
@@ -21,6 +21,7 @@ package org.apache.sling.servlets.get.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.List;
 
@@ -39,12 +40,14 @@ import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
 import org.apache.sling.servlets.get.impl.util.JsonObjectCreator;
 import org.apache.sling.servlets.get.impl.util.JsonToText;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.ConfigurationPolicy;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
@@ -77,8 +80,14 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
 
         @AttributeDefinition(name = "Selector", description="List of selectors this servlet handles to display the versions")
         String[] sling_servlet_selectors() default "V";
+        
+        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        boolean ecmaSuport() default false;
     }
+    
     private static final long serialVersionUID = 1656887064561951302L;
+    
+    private boolean ecmaSupport;
 
     /** Selector that means "pretty-print the output */
     public static final String TIDY = "tidy";
@@ -93,6 +102,11 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
     public static final int INDENT_SPACES = 2;
     
     private final JsonToText renderer = new JsonToText();
+    
+    @Activate
+    private void activate(Config config) {
+    	this.ecmaSupport = config.ecmaSuport();
+    }
 
     @Override
     public void doGet(SlingHttpServletRequest req, SlingHttpServletResponse resp) throws ServletException,
@@ -176,8 +190,12 @@ public class VersionInfoServlet extends SlingSafeMethodsServlet {
         return false;
     }
 
-    private static String createdDate(Node node) throws RepositoryException {
-        return JsonObjectCreator.format(node.getProperty(JcrConstants.JCR_CREATED).getDate());
+    private String createdDate(Node node) throws RepositoryException {
+    	Calendar cal = node.getProperty(JcrConstants.JCR_CREATED).getDate();
+    	if (ecmaSupport) {
+            return JsonObjectCreator.formatEcma(cal);
+    	}
+    	return ISO8601.format(cal);
     }
 
 }
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
index f8fbbed..dbfbcf2 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/JsonRenderer.java
@@ -61,8 +61,11 @@ public class JsonRenderer implements Renderer {
 
     private final JsonToText renderer = new JsonToText();
 
-    public JsonRenderer(long maximumResults) {
+	private boolean ecmaSupport;
+
+    public JsonRenderer(long maximumResults, boolean ecmaSupport) {
         this.maximumResults = maximumResults;
+        this.ecmaSupport = ecmaSupport;
     }
 
     public void render(SlingHttpServletRequest req,
@@ -91,7 +94,7 @@ public class JsonRenderer implements Renderer {
         final boolean harray = hasSelector(req, HARRAY);
         ResourceTraversor traversor = null;
         try {
-            traversor = new ResourceTraversor(maxRecursionLevels, maximumResults, r);
+            traversor = new ResourceTraversor(maxRecursionLevels, maximumResults, r, ecmaSupport);
             allowedLevel = traversor.collectResources();
             if ( allowedLevel != -1 ) {
                 allowDump = false;
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
index 49d8caf..6f587cd 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
@@ -33,13 +33,25 @@ import javax.json.JsonArrayBuilder;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
 
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 
-public abstract class JsonObjectCreator {
+public class JsonObjectCreator {
+	
+	private Resource resource;
+	
+	private ValueMap valueMap;
 
-    public static JsonObjectBuilder create(final Resource resource) {
-        final ValueMap valueMap = resource.getValueMap();
+	private boolean ecmaSupport;
+
+	public JsonObjectCreator(Resource resource, boolean ecmaSupport) {
+		this.resource = resource;
+		this.valueMap = resource.getValueMap();
+		this.ecmaSupport = ecmaSupport;
+	}
+
+    public JsonObjectBuilder create() {
 
         final JsonObjectBuilder obj = Json.createObjectBuilder();
 
@@ -71,7 +83,7 @@ public abstract class JsonObjectCreator {
             while (props.hasNext()) {
                 final Map.Entry<String,Object> prop = props.next();
                 if ( prop.getValue() != null ) {
-                    createProperty(obj, valueMap, prop.getKey(), prop.getValue());
+                    createProperty(obj, prop.getKey(), prop.getValue());
                 }
             }
         }
@@ -85,22 +97,26 @@ public abstract class JsonObjectCreator {
     /** The Locale used to format date values */
     static final Locale DATE_FORMAT_LOCALE = Locale.US;
 
-
-    public static String format(final Calendar date) {
+    
+    public static String formatEcma(final Calendar date) {
         DateFormat formatter = new SimpleDateFormat(ECMA_DATE_FORMAT, DATE_FORMAT_LOCALE);
         formatter.setTimeZone(date.getTimeZone());
         return formatter.format(date.getTime());
     }
 
     /** Dump only a value in the correct format */
-    private static JsonValue getValue(final Object value) {
+    private JsonValue getValue(final Object value ) {
         JsonObjectBuilder builder = Json.createObjectBuilder();
 
         if ( value instanceof InputStream ) {
             // input stream is already handled
             builder.add("entry", 0);
         } else if ( value instanceof Calendar ) {
-            builder.add("entry", format((Calendar)value));
+        	if (ecmaSupport) {
+        		builder.add("entry", JsonObjectCreator.formatEcma((Calendar)value));
+        	} else {
+        		builder.add("entry", ISO8601.format(((Calendar)value)));
+        	}
         } else if ( value instanceof Boolean ) {
             builder.add("entry", (Boolean) value);
         } else if ( value instanceof Long ) {
@@ -120,8 +136,7 @@ public abstract class JsonObjectCreator {
     /**
      * Write a single property
      */
-    private static void createProperty(final JsonObjectBuilder obj,
-                                 final ValueMap valueMap,
+    private void createProperty(final JsonObjectBuilder obj,
                                  final String key,
                                  final Object value) {
         Object[] values = null;
@@ -146,11 +161,11 @@ public abstract class JsonObjectCreator {
             // (colon is not allowed as a JCR property name)
             // in the name, and the value should be the size of the binary data
             if (values == null) {
-                obj.add(":" + key, getLength(valueMap, -1, key, (InputStream)value));
+                obj.add(":" + key, getLength(-1, key, (InputStream)value));
             } else {
                 final JsonArrayBuilder result = Json.createArrayBuilder();
                 for (int i = 0; i < values.length; i++) {
-                    result.add(getLength(valueMap, i, key, (InputStream)values[i]));
+                    result.add(getLength(i, key, (InputStream)values[i]));
                 }
                 obj.add(":" + key, result);
             }
@@ -168,8 +183,7 @@ public abstract class JsonObjectCreator {
         }
     }
 
-    private static long getLength(final ValueMap    valueMap,
-                           final int         index,
+    private long getLength(final int         index,
                            final String      key,
                            final InputStream stream) {
         try {
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java b/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
index c42df33..d93aa2d 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java
@@ -49,6 +49,8 @@ public class ResourceTraversor
 
     private final Resource startResource;
 
+	private boolean ecmaSupport;
+
     /** Create a ResourceTraversor, optionally limiting recursion and total number of resources
      * @param levels recursion levels limit, -1 means no limit
      * @param maxResources maximum number of resources to collect, ignored if levels == 1
@@ -56,12 +58,13 @@ public class ResourceTraversor
      * @param tidy not used
      * @throws JSONException
      */
-    public ResourceTraversor(final int levels, final long maxResources, final Resource resource) {
+    public ResourceTraversor(final int levels, final long maxResources, final Resource resource, boolean ecmaSupport) {
         this.maxResources = maxResources;
         this.maxRecursionLevels = levels;
         this.startResource = resource;
         currentQueue = new LinkedList<>();
         nextQueue = new LinkedList<>();
+        this.ecmaSupport = ecmaSupport;
         this.startObject = this.adapt(resource);
     }
 
@@ -135,7 +138,7 @@ public class ResourceTraversor
      * @throws JSONException
      */
     private JsonObjectBuilder adapt(final Resource resource) {
-        return JsonObjectCreator.create(resource);
+        return new JsonObjectCreator(resource,ecmaSupport).create();
     }
 
     public JsonObject getJSONObject() {
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
index 6c5ee91..a86cee0 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
@@ -79,7 +79,7 @@ public class JsonRendererServletTest {
 		request.setResource(resolver.getResource(path));
 
 		MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
-		JsonRenderer servlet = new JsonRenderer(1000);
+		JsonRenderer servlet = new JsonRenderer(1000,true);
 		PrivateAccessor.invoke(servlet, "render",
 				new Class[]{SlingHttpServletRequest.class, SlingHttpServletResponse.class},
 				new Object[]{request, response});
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
similarity index 94%
rename from src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java
rename to src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
index b7feaf8..72a3a1b 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/HtmlRendererTest.java
@@ -35,7 +35,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-public class HtmlRendererServletTest {
+public class HtmlRendererTest {
 
     private SlingHttpServletRequest request;
     private SlingHttpServletResponse response;
@@ -64,9 +64,7 @@ public class HtmlRendererServletTest {
     public void testEscaping() throws ServletException, IOException {
         XSSAPI xss = Mockito.mock(XSSAPI.class);
 
-        final HtmlRenderer servlet = new HtmlRenderer(xss);
-
-        servlet.render(request, response);
+        new HtmlRenderer(xss).render(request, response);
 
         Mockito.verify(xss).encodeForHTML("<script>alert(1);</script>");
     }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java
deleted file mode 100644
index b2c5cd3..0000000
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererServletTest.java
+++ /dev/null
@@ -1,112 +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 org.apache.sling.servlets.get.impl.helpers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.request.RequestPathInfo;
-import org.apache.sling.api.resource.Resource;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Matchers;
-import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class JsonRendererServletTest {
-    
-    private SlingHttpServletRequest request;
-    private SlingHttpServletResponse response;
-    private String [] selectors;
-    private JsonRenderer jrs;
-    
-    @Before
-    public void setup() {
-        request = Mockito.mock(SlingHttpServletRequest.class);
-        
-        final RequestPathInfo rpi = Mockito.mock(RequestPathInfo.class);
-        Mockito.when(request.getRequestPathInfo()).thenReturn(rpi);
-        Mockito.when(rpi.getSelectors()).thenAnswer(new Answer<String[]>(){
-            public String [] answer(InvocationOnMock invocation) {
-                return selectors;
-            }
-        });
-        
-        final Resource resource = Mockito.mock(Resource.class);
-        Mockito.when(request.getResource()).thenReturn(resource);
-        
-        response = Mockito.mock(SlingHttpServletResponse.class);
-        
-        jrs = new JsonRenderer(42);
-    }
-    
-    @Test
-    public void testRecursionLevelA() {
-        selectors = new String[] { "12" };
-        assertEquals(12, jrs.getMaxRecursionLevel(request));
-        assertFalse(jrs.isTidy(request));
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void testRecursionLevelB() {
-        selectors = new String[] { "42", "more" };
-        jrs.getMaxRecursionLevel(request);
-    }
-    
-    @Test(expected=IllegalArgumentException.class)
-    public void testRecursionLevelC() {
-        selectors = new String[] { "more" };
-        jrs.getMaxRecursionLevel(request);
-    }
-    
-    @Test
-    public void testRecursionLevelD() {
-        selectors = new String[] { "tidy" };
-        assertEquals(0, jrs.getMaxRecursionLevel(request));
-    }
-
-    @Test
-    public void testRecursionLevelE() {
-        // Level must be the last selector but
-        // if the last selector is "tidy" there's
-        // no error. "for historical reasons"
-        selectors = new String[] { "46", "tidy" };
-        assertEquals(0, jrs.getMaxRecursionLevel(request));
-    }
-
-    @Test
-    public void testRecursionLevelF() {
-        selectors = new String[] { "tidy", "45" };
-        assertEquals(45, jrs.getMaxRecursionLevel(request));
-        assertTrue(jrs.isTidy(request));
-    }
-    
-    @Test
-    public void testBadRequest() throws IOException {
-        selectors = new String[] { "bad", "selectors" };
-        jrs.render(request, response);
-        Mockito.verify(response, Mockito.times(1)).sendError(Matchers.anyInt(), Matchers.anyString());
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
new file mode 100644
index 0000000..e6d971d
--- /dev/null
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.sling.servlets.get.impl.helpers;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Calendar;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+
+import org.apache.jackrabbit.util.ISO8601;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
+import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class JsonRendererTest {
+    
+	@Rule
+	public final SlingContext context = new SlingContext();
+	
+    private MockSlingHttpServletRequest request;
+    private MockSlingHttpServletResponse response;
+
+    private JsonRenderer jrs;
+    
+    @Before
+    public void setup() {
+    	context.load().json("/data.json", "/content");
+        request = context.request();
+        response = context.response();
+        
+        context.currentResource("/content");
+        
+        jrs = new JsonRenderer(42,false);
+    }
+    
+    @Test
+    public void testRecursionLevelA() {
+    	context.requestPathInfo().setSelectorString("12");
+        assertEquals(12, jrs.getMaxRecursionLevel(request));
+        assertFalse(jrs.isTidy(request));
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testRecursionLevelB() {
+    	context.requestPathInfo().setSelectorString("42.more");
+        jrs.getMaxRecursionLevel(request);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testRecursionLevelC() {
+    	context.requestPathInfo().setSelectorString("more");
+        jrs.getMaxRecursionLevel(request);
+    }
+    
+    @Test
+    public void testRecursionLevelD() {
+    	context.requestPathInfo().setSelectorString("tidy");
+        assertEquals(0, jrs.getMaxRecursionLevel(request));
+    }
+
+    @Test
+    public void testRecursionLevelE() {
+        // Level must be the last selector but
+        // if the last selector is "tidy" there's
+        // no error. "for historical reasons"
+    	context.requestPathInfo().setSelectorString("46.tidy");
+        assertEquals(0, jrs.getMaxRecursionLevel(request));
+    }
+
+    @Test
+    public void testRecursionLevelF() {
+    	context.requestPathInfo().setSelectorString("tidy.45");
+        assertEquals(45, jrs.getMaxRecursionLevel(request));
+        assertTrue(jrs.isTidy(request));
+    }
+    
+    @Test
+    public void testBadRequest() throws IOException {
+    	context.requestPathInfo().setSelectorString("bad.selectors");
+        jrs.render(request, response);
+        assertTrue(response.getStatus() == 400);
+    }
+    
+    @Test
+    public void testISO8601() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        jrs.render(request, response);
+        StringReader reader = new StringReader(response.getOutputAsString());
+        JsonObject job = Json.createReader(reader).readObject();
+        String created = job.getString("created");
+        Calendar cal = ISO8601.parse(created);
+        // at the time of the test the offset it not preserved
+        // if we did direct string comparison the time would be different based on the testers
+        // time zone
+        assertTrue(ISO8601.getYear(cal) == 2016);
+    }
+    
+    @Test
+    public void testECMA() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+    	jrs = new JsonRenderer(42,true);
+        jrs.render(request, response);
+        String out = response.getOutputAsString();
+        JsonObject job = Json.createReader(new StringReader(out)).readObject();
+        String created = job.getString("created");
+        assertTrue(created.startsWith("Mon Jan"));
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
similarity index 98%
rename from src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java
rename to src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
index 2423ecb..8318196 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/StreamRendererTest.java
@@ -34,7 +34,7 @@ import org.apache.sling.api.resource.ResourceMetadata;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-public class StreamRendererServletTest {
+public class StreamRendererTest {
 
     @Test
     public void testCopyRange() throws IOException {
@@ -135,7 +135,6 @@ public class StreamRendererServletTest {
         final ResourceMetadata meta = Mockito.mock(ResourceMetadata.class);
         final ServletContext sc = Mockito.mock(ServletContext.class);
         
-        @SuppressWarnings("serial")
 		StreamRenderer streamRendererServlet = new StreamRenderer(true,new String []{"/"},sc);       
 
         Mockito.when(resource.getResourceMetadata()).thenReturn(meta);
diff --git a/src/test/resources/data.json b/src/test/resources/data.json
new file mode 100644
index 0000000..7619a4f
--- /dev/null
+++ b/src/test/resources/data.json
@@ -0,0 +1,19 @@
+{
+  "resourceType":"page",
+  "created" : "Mon Jan 18 2016 16:30:00 GMT+0200",
+  "one":
+  {
+    "resourceType":"one"
+  },
+  "two":
+  {
+    "resourceType":"two"
+  },
+  "etc":
+  {
+    "resourceType":"etc",
+    "tags" : {
+        "resourceType" : "tags"
+    }
+  }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
jeb@apache.org.