You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2010/10/02 17:33:45 UTC

svn commit: r1003817 - in /sling/trunk/launchpad/integration-tests/src/main: java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java resources/integration-test/rangestreaming.txt

Author: fmeschbe
Date: Sat Oct  2 15:33:45 2010
New Revision: 1003817

URL: http://svn.apache.org/viewvc?rev=1003817&view=rev
Log:
SLING-1814 Integration tests for Range support

Added:
    sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java   (with props)
    sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt   (with props)

Added: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java?rev=1003817&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java (added)
+++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java Sat Oct  2 15:33:45 2010
@@ -0,0 +1,173 @@
+/*
+ * 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.launchpad.webapp.integrationtest;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.sling.commons.testing.integration.HttpTestBase;
+
+/**
+ * The <code>RangeStreamingTest</code> tests the Range request header support
+ * for the StreamRendererServlet introduced with SLING-1814
+ */
+public class RangeStreamingTest extends HttpTestBase {
+
+    private String rootUrl;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // Create the test nodes under a path that's specific to this class to
+        // allow collisions
+        final String path = "/" + getClass().getSimpleName() + "/"
+            + System.currentTimeMillis();
+        testClient.mkdirs(WEBDAV_BASE_URL, path);
+        rootUrl = uploadTestScript(path, "rangestreaming.txt",
+            "rangestreaming.txt");
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        testClient.delete(rootUrl);
+        super.tearDown();
+    }
+
+    public void test_full_range() throws IOException {
+        GetMethod get = new GetMethod(rootUrl);
+        int status = httpClient.executeMethod(get);
+        assertEquals(200, status);
+        assertEquals(79, get.getResponseContentLength());
+    }
+
+    public void test_wrong_ranges() throws IOException {
+        GetMethod get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "unit 1-10"));
+        int status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for unsupported unit", 416, status);
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes 5"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for missing dash", 416, status);
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes -x"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for illegal negative number", 416, status);
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes -x"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for illegal negative number", 416, status);
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes y-10"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for unparseable number", 416, status);
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes 10-5"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 416 for end < start", 416, status);
+    }
+
+    public void test_single_range() throws IOException {
+        GetMethod get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes 0-9"));
+        int status = httpClient.executeMethod(get);
+        assertEquals("Expect 206/PARTIAL CONTENT", 206, status);
+        assertEquals(10, get.getResponseContentLength());
+        assertEquals("The quick ", get.getResponseBodyAsString());
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes -10"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 206/PARTIAL CONTENT", 206, status);
+        assertEquals(10, get.getResponseContentLength());
+        assertEquals("corpus sic", get.getResponseBodyAsString());
+
+        get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes 16-38"));
+        status = httpClient.executeMethod(get);
+        assertEquals("Expect 206/PARTIAL CONTENT", 206, status);
+        assertEquals(23, get.getResponseContentLength());
+        assertEquals("fox jumps over the lazy", get.getResponseBodyAsString());
+    }
+
+    public void test_multiple_ranges() throws IOException {
+        GetMethod get = new GetMethod(rootUrl);
+        get.setRequestHeader(new Header("Range", "bytes 0-9,-10"));
+        int status = httpClient.executeMethod(get);
+        assertEquals("Expect 206/PARTIAL CONTENT", 206, status);
+
+        String contentType = get.getResponseHeader("Content-Type").getValue();
+        assertTrue("Content Type must be multipart/byteranges",
+            contentType.contains("multipart/byteranges"));
+        String boundary = contentType.substring(contentType.indexOf("boundary=")
+            + "boundary=".length());
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(
+            get.getResponseBodyAsStream()));
+
+        String line = reader.readLine();
+        while (!("--" + boundary).equals(line)) {
+            line = reader.readLine();
+        }
+
+        assertEquals("Expected content to start with boundary",
+            "--" + boundary, line);
+        assertEntityHeaders(reader, "text/plain", "bytes 0-9/79");
+        assertEquals("The quick ", reader.readLine());
+
+        assertEquals("Expected content to start with boundary",
+            "--" + boundary, reader.readLine());
+        assertEntityHeaders(reader, "text/plain", "bytes 69-78/79");
+        assertEquals("corpus sic", reader.readLine());
+
+        char[] buf = new char[boundary.length() + 4];
+        reader.read(buf);
+        assertEquals("Expected content to start with boundary", "--" + boundary
+            + "--", new String(buf));
+    }
+
+    private void assertEntityHeaders(final BufferedReader reader,
+            final String expectedContentType, final String expectedRange)
+            throws IOException {
+        for (String line = reader.readLine(); line != null; line = reader.readLine()) {
+            line = line.toLowerCase();
+            if (line.startsWith("content-type:")) {
+                assertTrue("Wrong content type: " + line + "; expected="
+                    + expectedContentType, line.contains(expectedContentType));
+            } else if (line.startsWith("content-range:")) {
+                assertTrue("Wrong content range: " + line + "; expected="
+                    + expectedRange, line.contains(expectedRange));
+            } else if (line.length() == 0) {
+                return;
+            }
+        }
+
+        // exhausted reader without reaching end of headers
+        fail("Unexpected end of data");
+    }
+}

Propchange: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/RangeStreamingTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt?rev=1003817&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt Sat Oct  2 15:33:45 2010
@@ -0,0 +1 @@
+The quick brown fox jumps over the lazy dog lorem ipsum donor habeas corpus sic
\ No newline at end of file

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/rangestreaming.txt
------------------------------------------------------------------------------
    svn:eol-style = native