Author: bramk
Date: Thu Sep 19 15:14:36 2013
New Revision: 1524768

URL: http://svn.apache.org/r1524768
Log:
ACE-386 - Added tests for byte range support

Modified:
    
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java

Modified: 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java?rev=1524768&r1=1524767&r2=1524768&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java
 Thu Sep 19 15:14:36 2013
@@ -27,7 +27,9 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -37,42 +39,63 @@ import org.apache.ace.deployment.provide
 import org.apache.ace.deployment.provider.DeploymentProvider;
 import org.apache.ace.deployment.streamgenerator.StreamGenerator;
 import org.osgi.service.log.LogService;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
 public class DeploymentServletTest {
 
+    // the servlet under test
     private DeploymentServlet m_servlet;
 
+    // request state
     private HttpServletRequest m_request;
     private String m_requestCurrentParameter;
+    private String m_requestRangeHeader;
     private String m_requestPathInfo;
 
+    // response state
     private HttpServletResponse m_response;
     private ByteArrayOutputStream m_responseOutputStream;
     private int m_responseStatus;
+    private Map<String, String> m_responseHeaders;
 
+    // deployment provider state
     private DeploymentProvider m_provider;
-    private List<String> m_providerVersions;
+    private Map<String, List<String>> m_providerVersions;
 
+    // stream generator state
     private StreamGenerator m_generator;
-    private InputStream m_generatorResultStream;
     private String m_generatorId;
     private String m_generatorFromVersion;
     private String m_generatorToVersion;
+    private InputStream m_generatorResultStream;
 
+    @BeforeTest
+    protected void setUpOnce() throws Exception {
 
-    @BeforeMethod(alwaysRun = true)
-    protected void setUp() throws Exception {
-        // resets variables that store results of tests
-        m_generatorResultStream = null;
-        m_generatorId = null;
-        m_generatorFromVersion = null;
-        m_generatorToVersion = null;
-        m_providerVersions = null;
+        List<String> existingTargetVersions = new ArrayList<String>();
+        existingTargetVersions.add("2.0.0");
+        m_providerVersions = new HashMap<String, List<String>>();
+        m_providerVersions.put("existing", existingTargetVersions);
+
+        m_provider = new DeploymentProvider() {
+            public List<ArtifactData> getBundleData(String targetId, String 
version) throws IllegalArgumentException {
+                return null; // not used
+            }
+
+            public List<ArtifactData> getBundleData(String targetId, String 
versionFrom, String versionTo) throws IllegalArgumentException {
+                return null; // not used
+            }
+
+            public List<String> getVersions(String targetId) throws 
IllegalArgumentException {
+                if (m_providerVersions.containsKey(targetId)) {
+                    return m_providerVersions.get(targetId);
+                }
+                throw new IllegalArgumentException();
+            }
+        };
 
-        // create mock stream generator
         m_generator = new StreamGenerator() {
             public InputStream getDeploymentPackage(String id, String version) 
throws IOException {
                 if (m_generatorResultStream == null) {
@@ -82,6 +105,7 @@ public class DeploymentServletTest {
                 m_generatorToVersion = version;
                 return m_generatorResultStream;
             }
+
             public InputStream getDeploymentPackage(String id, String 
fromVersion, String toVersion) throws IOException {
                 if (m_generatorResultStream == null) {
                     throw new IOException("No delta for " + id + " " + 
fromVersion + " " + toVersion);
@@ -93,23 +117,6 @@ public class DeploymentServletTest {
             }
         };
 
-
-        // create mock deployment provider
-        m_provider = new DeploymentProvider() {
-            public List<ArtifactData> getBundleData(String targetId, String 
version) throws IllegalArgumentException {
-                return null; // not used
-            }
-            public List<ArtifactData> getBundleData(String targetId, String 
versionFrom, String versionTo) throws IllegalArgumentException {
-                return null; // not used
-            }
-            public List<String> getVersions(String targetId) throws 
IllegalArgumentException {
-                if (m_providerVersions == null) {
-                    throw new IllegalArgumentException();
-                }
-                return m_providerVersions;
-            }
-        };
-
         // create a HttpServletRequest mock object
         m_request = createMockObjectAdapter(HttpServletRequest.class, new 
Object() {
             @SuppressWarnings("unused")
@@ -119,10 +126,19 @@ public class DeploymentServletTest {
                 }
                 return null;
             }
+
             @SuppressWarnings("unused")
             public String getPathInfo() {
                 return m_requestPathInfo;
             }
+
+            @SuppressWarnings("unused")
+            public String getHeader(String name) {
+                if (name.equals("Range")) {
+                    return m_requestRangeHeader;
+                }
+                return null;
+            }
         });
 
         // create a HttpServletResponse mock object
@@ -136,71 +152,174 @@ public class DeploymentServletTest {
                     }
                 };
             }
-            @SuppressWarnings("unused")
+
             public void sendError(int status) {
                 m_responseStatus = status;
             }
+
             @SuppressWarnings("unused")
             public void sendError(int status, String desc) {
                 sendError(status);
             }
-        });
 
-        m_responseStatus = HttpServletResponse.SC_OK;
-        m_responseOutputStream = new ByteArrayOutputStream();
+            public void setStatus(int status) {
+                m_responseStatus = status;
+            }
+
+            @SuppressWarnings("unused")
+            public void setStatus(int status, String desc) {
+                setStatus(status);
+            }
+
+            @SuppressWarnings("unused")
+            public void setHeader(String name, String value) {
+                m_responseHeaders.put(name, value);
+            }
+        });
 
         // create the instance to test
         m_servlet = new DeploymentServlet();
         configureObject(m_servlet, LogService.class);
         configureObject(m_servlet, StreamGenerator.class, m_generator);
         configureObject(m_servlet, DeploymentProvider.class, m_provider);
+    }
 
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        // set the default state
+        m_generatorResultStream = new ByteArrayInputStream(new byte[100]);
+        m_generatorId = null;
+        m_generatorFromVersion = null;
+        m_generatorToVersion = null;
+
+        m_responseStatus = HttpServletResponse.SC_OK;
+        m_responseHeaders = new HashMap<String, String>();
+        m_responseOutputStream = new ByteArrayOutputStream();
     }
 
-    @AfterMethod(alwaysRun = true)
-    public void tearDown() throws Exception {
+    @Test
+    public void getDataForExistingTarget() throws Exception {
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+        assertGeneratorTargetId("existing");
+        assertGeneratorToVersion("2.0.0");
+    }
+
+    @Test
+    public void getRangeDataForExistingTarget_first0lastOK() throws Exception {
+        // valid range starting at 0
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=0-10";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_PARTIAL_CONTENT);
+        assertResponseHeaderValue("Content-Length", "11");
+        assertResponseHeaderValue("Content-Range", "bytes 0-10/100");
     }
 
     @Test(groups = { UNIT })
-    public void getDataForExistingTarget() throws Exception {
-        m_requestPathInfo = "/T1/versions/2.0.0";
-        m_generatorResultStream = new ByteArrayInputStream(new byte[10]);
-        m_providerVersions = new ArrayList<String>();
-        m_providerVersions.add("2.0.0");
+    public void getRangeDataForExistingTarget_firstOKlastOK() throws Exception 
{
+        // valid range not starting at 0
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=2-50";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_PARTIAL_CONTENT);
+        assertResponseHeaderValue("Content-Length", "49");
+        assertResponseHeaderValue("Content-Range", "bytes 2-50/100");
+    }
+
+    @Test
+    public void getRangeDataForExistingTarget_firstOKlastTooBig() throws 
Exception {
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1
+        // If the last-byte-pos value is absent, or if the value is greater 
than or equal to the current length of the
+        // entity-body, last-byte-pos is taken to be equal to one less than 
the current length of the entity- body in
+        // bytes.
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=2-100";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_PARTIAL_CONTENT);
+        assertResponseHeaderValue("Content-Length", "98");
+        assertResponseHeaderValue("Content-Range", "bytes 2-99/100");
+        assertResponseOutputSize(98);
+    }
+
+    @Test
+    public void getRangeDataForExistingTarget_firstOKlastANY() throws 
Exception {
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1
+        // If the last-byte-pos value is absent, or if the value is greater 
than or equal to the current length of the
+        // entity-body, last-byte-pos is taken to be equal to one less than 
the current length of the entity- body in
+        // bytes.
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=2-";
         m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_PARTIAL_CONTENT);
+        assertResponseHeaderValue("Content-Length", "98");
+        assertResponseHeaderValue("Content-Range", "bytes 2-99/100");
+        assertResponseOutputSize(98);
+    }
 
-        // make sure the request went fine
-        assert m_responseStatus == HttpServletResponse.SC_OK : "We should have 
got response code " + HttpServletResponse.SC_OK + " and we got " + 
m_responseStatus;
-        assert m_responseOutputStream.size() == 10 : "We should have got a 
(dummy) deployment package of 10 bytes.";
-        assert m_generatorId.equals("T1") : "Wrong target ID.";
-        assert m_generatorToVersion.equals("2.0.0") : "Wrong version.";
+    @Test
+    public void getRangeDataForExistingTarget_firstTooBiglastTooBig() throws 
Exception {
+        // invalid range: start=toobig end=toobig
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=100-110";
+        m_servlet.doGet(m_request, m_response);
+        
assertResponseCode(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
+        assertResponseHeaderValue("Content-Range", "bytes */100");
+        assertResponseOutputSize(0);
+    }
+
+    @Test
+    public void getRangeDataForExistingTarget_firstOKlastTooSmall() throws 
Exception {
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1
+        // If the last-byte-pos value is present, it MUST be greater than or 
equal to the first-byte-pos in that
+        // byte-range-spec, or the byte- range-spec is syntactically invalid.
+
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16
+        // If the server ignores a byte-range-spec because it is syntactically 
invalid, the server SHOULD treat the
+        // request as if the invalid Range header field did not exist. 
(Normally, this means return a 200 response
+        // containing the full entity).
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=2-1";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+    }
+
+    @Test
+    public void getRangeDataForExistingTarget_badHeaderValue() throws 
Exception {
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16
+        // If the server ignores a byte-range-spec because it is syntactically 
invalid, the server SHOULD treat the
+        // request as if the invalid Range header field did not exist. 
(Normally, this means return a 200 response
+        // containing the full entity).
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestRangeHeader = "bytes=a-1";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
     }
 
     @Test(groups = { UNIT })
     public void getFixPackageForExistingTarget() throws Exception {
-        m_requestPathInfo = "/T1/versions/2.0.0";
+        m_requestPathInfo = "/existing/versions/2.0.0";
         m_requestCurrentParameter = "1.0.0";
-        m_generatorResultStream = new ByteArrayInputStream(new byte[10]);
-        m_providerVersions = new ArrayList<String>();
-        m_providerVersions.add("2.0.0");
         m_servlet.doGet(m_request, m_response);
-
-        // make sure the request went fine
-        assert m_responseStatus == HttpServletResponse.SC_OK : "We should have 
got response code " + HttpServletResponse.SC_OK + " and we got " + 
m_responseStatus;
-        assert m_responseOutputStream.size() == 10 : "We should have got a 
(dummy) deployment package of 10 bytes.";
-        assert m_generatorId.equals("T1") : "Wrong target ID.";
-        assert m_generatorToVersion.equals("2.0.0") : "Wrong version.";
-        assert m_generatorFromVersion.equals("1.0.0") : "Wrong current 
version.";
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+        assertGeneratorTargetId("existing");
+        assertGeneratorToVersion("2.0.0");
+        assertGeneratorFromVersion("1.0.0");
     }
 
-    @Test(groups = { UNIT })
+    @Test
     public void getDataForNonExistingTarget() throws Exception {
-        m_requestPathInfo = "/T?/versions/2.0.0";
+        m_requestPathInfo = "/nonexisting/versions/2.0.0";
         m_servlet.doGet(m_request, m_response);
-        assert m_responseStatus == HttpServletResponse.SC_NOT_FOUND : "We 
should have gotten response code" + HttpServletResponse.SC_NOT_FOUND + ", 
actual code: " + m_responseStatus;
+        assertResponseCode(HttpServletResponse.SC_NOT_FOUND);
     }
 
-    @Test(groups = { UNIT })
+    @Test
     public void getDataForBadURL() throws Exception {
         HttpServletRequest garbage = 
createMockObjectAdapter(HttpServletRequest.class, new Object() {
             @SuppressWarnings("unused")
@@ -209,24 +328,47 @@ public class DeploymentServletTest {
             }
         });
         m_servlet.doGet(garbage, m_response);
-        assert m_responseStatus == HttpServletResponse.SC_BAD_REQUEST : "We 
should have gotten response code " + HttpServletResponse.SC_NOT_FOUND + ", 
actual code: " + m_responseStatus;
+        assertResponseCode(HttpServletResponse.SC_BAD_REQUEST);
     }
 
-
-    @Test(groups = { UNIT })
+    @Test
     public void getVersionsExistingTarget() throws Exception {
-        m_requestPathInfo = "/T1/versions";
-        m_providerVersions = new ArrayList<String>();
-        m_providerVersions.add("2.0.0");
+        m_requestPathInfo = "/existing/versions";
         m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
         assert "2.0.0\n".equals(m_responseOutputStream.toString()) : "Expected 
to get version 2.0.0 in the response";
     }
 
-    @Test(groups = { UNIT })
+    @Test
     public void getVersionsNonExistingTarget() throws Exception {
-        m_requestPathInfo = "/T1/versions";
+        m_requestPathInfo = "/nonexisting/versions";
         m_servlet.doGet(m_request, m_response);
-        assert "".equals(m_responseOutputStream.toString()) : "Expected to get 
an empty response";
+        assertResponseCode(HttpServletResponse.SC_NOT_FOUND);
+        assertResponseOutputSize(0);
+    }
+
+    private void assertResponseCode(int value) throws Exception {
+        assert m_responseStatus == value : "We should have got response code " 
+ value + " but got " + m_responseStatus;
+    }
+
+    private void assertResponseHeaderValue(String name, String value) throws 
Exception {
+        assert m_responseHeaders.containsKey(name) : "Expected response " + 
name + " header to be set";
+        assert m_responseHeaders.get(name).equals(value) : "Expected " + name 
+ " header with value '" + value + "' and got '" + m_responseHeaders.get(name) 
+ "'";
+    }
+
+    private void assertResponseOutputSize(long size) throws Exception {
+        assert m_responseOutputStream.size() == size : "We should have got a 
(dummy) deployment package of " + size + " bytes but got " + 
m_responseOutputStream.size();
+    }
+
+    private void assertGeneratorTargetId(String id) {
+        assert m_generatorId.equals(id) : "Wrong target ID.";
     }
 
+    private void assertGeneratorToVersion(String version) {
+        assert m_generatorToVersion.equals(version) : "Wrong version.";
+    }
+
+    private void assertGeneratorFromVersion(String version) {
+        assert m_generatorFromVersion.equals(version) : "Wrong version.";
+    }
 }


Reply via email to