You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/05/26 18:18:47 UTC

svn commit: r1681787 - in /felix/trunk/http/itest: ./ src/test/java/org/apache/felix/http/itest/

Author: cziegeler
Date: Tue May 26 16:18:47 2015
New Revision: 1681787

URL: http://svn.apache.org/r1681787
Log:
Add integration test for session handling

Added:
    felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java   (with props)
Modified:
    felix/trunk/http/itest/pom.xml
    felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java
    felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/HttpServiceRuntimeTest.java

Modified: felix/trunk/http/itest/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/pom.xml?rev=1681787&r1=1681786&r2=1681787&view=diff
==============================================================================
--- felix/trunk/http/itest/pom.xml (original)
+++ felix/trunk/http/itest/pom.xml Tue May 26 16:18:47 2015
@@ -45,6 +45,24 @@
 			<version>6.0.0</version>
 			<scope>provided</scope>
 		</dependency>
+        <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>1.1.1</version>
+			<scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore-osgi</artifactId>
+            <version>4.3.2</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient-osgi</artifactId>
+            <version>4.3.4</version>
+            <scope>provided</scope>
+        </dependency>
 		<dependency>
 			<groupId>org.osgi</groupId>
 			<artifactId>org.osgi.compendium</artifactId>

Modified: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java?rev=1681787&r1=1681786&r2=1681787&view=diff
==============================================================================
--- felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java (original)
+++ felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java Tue May 26 16:18:47 2015
@@ -336,6 +336,9 @@ public abstract class BaseIntegrationTes
 
             mavenBundle("org.mockito", "mockito-core").versionAsInProject().startLevel(START_LEVEL_SYSTEM_BUNDLES),
             mavenBundle("org.objenesis", "objenesis").versionAsInProject().startLevel(START_LEVEL_SYSTEM_BUNDLES),
+            mavenBundle("com.googlecode.json-simple", "json-simple").versionAsInProject().startLevel(START_LEVEL_SYSTEM_BUNDLES),
+            mavenBundle("org.apache.httpcomponents", "httpcore-osgi").versionAsInProject().startLevel(START_LEVEL_SYSTEM_BUNDLES),
+            mavenBundle("org.apache.httpcomponents", "httpclient-osgi").versionAsInProject().startLevel(START_LEVEL_SYSTEM_BUNDLES),
 
             junitBundles(), frameworkStartLevel(START_LEVEL_TEST_BUNDLE), felix());
     }

Modified: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/HttpServiceRuntimeTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/HttpServiceRuntimeTest.java?rev=1681787&r1=1681786&r2=1681787&view=diff
==============================================================================
--- felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/HttpServiceRuntimeTest.java (original)
+++ felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/HttpServiceRuntimeTest.java Tue May 26 16:18:47 2015
@@ -51,8 +51,10 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Dictionary;
+import java.util.HashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.CountDownLatch;
@@ -94,6 +96,8 @@ import org.osgi.service.http.runtime.dto
 @ExamReactorStrategy( EagerSingleStagedReactorFactory.class )
 public class HttpServiceRuntimeTest extends BaseIntegrationTest
 {
+    private static final String HTTP_CONTEXT_NAME = "org.osgi.service.http";
+
     Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
 
     private static final long DEFAULT_SLEEP = 100;
@@ -316,8 +320,11 @@ public class HttpServiceRuntimeTest exte
 
         contextDTO = assertDefaultContext(runtimeDTOWithBothSerlvets);
         assertEquals(2, contextDTO.servletDTOs.length);
-        assertEquals("testServlet 1", contextDTO.servletDTOs[0].name);
-        assertEquals("testServlet 2", contextDTO.servletDTOs[1].name);
+        final Set<String> names = new HashSet<String>();
+        names.add(contextDTO.servletDTOs[0].name);
+        names.add(contextDTO.servletDTOs[1].name);
+        assertTrue(names.contains("testServlet 1"));
+        assertTrue(names.contains("testServlet 2"));
     }
 
     @Test
@@ -535,7 +542,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals(3, runtimeDTOWithAdditionalContext.servletContextDTOs.length);
 
         // default context is last, as it has the lowest service ranking
-        assertEquals("Http Service context", runtimeDTOWithAdditionalContext.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTOWithAdditionalContext.servletContextDTOs[0].name);
         assertEquals("", runtimeDTOWithAdditionalContext.servletContextDTOs[0].contextPath);
         assertEquals("contextA", runtimeDTOWithAdditionalContext.servletContextDTOs[1].name);
         assertEquals("/contextA", runtimeDTOWithAdditionalContext.servletContextDTOs[1].contextPath);
@@ -552,7 +559,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals(4, runtimeDTOWithAllContexts.servletContextDTOs.length);
 
         // default context is last, as it has the lowest service ranking
-        assertEquals("Http Service context", runtimeDTOWithAdditionalContext.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTOWithAdditionalContext.servletContextDTOs[0].name);
         assertEquals("", runtimeDTOWithAdditionalContext.servletContextDTOs[0].contextPath);
         assertEquals("contextA", runtimeDTOWithAllContexts.servletContextDTOs[1].name);
         assertEquals("/contextA", runtimeDTOWithAllContexts.servletContextDTOs[1].contextPath);
@@ -596,7 +603,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals(0, runtimeDTO.failedServletDTOs.length);
 
         assertEquals(3, runtimeDTO.servletContextDTOs.length);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
         assertEquals("test-context", runtimeDTO.servletContextDTOs[1].name);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
 
@@ -802,7 +809,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals(FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, runtimeDTO.failedServletContextDTOs[0].failureReason);
 
         assertEquals(3, runtimeDTO.servletContextDTOs.length);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
 
         assertEquals("contextA", runtimeDTO.servletContextDTOs[1].name);
@@ -815,7 +822,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals(0, runtimeDTO.failedServletContextDTOs.length);
 
         assertEquals(3, runtimeDTO.servletContextDTOs.length);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
 
         assertEquals("contextA", runtimeDTO.servletContextDTOs[1].name);
@@ -1107,7 +1114,7 @@ public class HttpServiceRuntimeTest exte
 
         defaultContext = assertDefaultContext(runtimeWithShadowedServlet);
         ServletContextDTO httpServiceContext = runtimeWithShadowedServlet.servletContextDTOs[0];
-        assertEquals("Http Service context", httpServiceContext.name);
+        assertEquals(HTTP_CONTEXT_NAME, httpServiceContext.name);
         assertEquals(1, httpServiceContext.servletDTOs.length);
         assertArrayEquals(new String[] {"/pathcollision"}, httpServiceContext.servletDTOs[0].patterns);
 
@@ -1169,7 +1176,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals("test-context", runtimeDTO.servletContextDTOs[1].name);
         assertEquals("/first", runtimeDTO.servletContextDTOs[1].contextPath);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
 
         assertEquals(1, runtimeDTO.servletContextDTOs[1].servletDTOs.length);
         assertEquals("servlet", runtimeDTO.servletContextDTOs[1].servletDTOs[0].name);
@@ -1196,7 +1203,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals("test-context", runtimeDTO.servletContextDTOs[1].name);
         assertEquals("/second", runtimeDTO.servletContextDTOs[1].contextPath);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
 
         assertEquals(1, runtimeDTO.servletContextDTOs[1].servletDTOs.length);
         assertEquals("servlet", runtimeDTO.servletContextDTOs[1].servletDTOs[0].name);
@@ -1211,7 +1218,7 @@ public class HttpServiceRuntimeTest exte
         assertEquals("test-context", runtimeDTO.servletContextDTOs[1].name);
         assertEquals("/first", runtimeDTO.servletContextDTOs[1].contextPath);
         assertEquals("default", runtimeDTO.servletContextDTOs[2].name);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
 
         assertEquals(1, runtimeDTO.servletContextDTOs[1].servletDTOs.length);
         assertEquals("servlet", runtimeDTO.servletContextDTOs[1].servletDTOs[0].name);
@@ -1351,7 +1358,7 @@ public class HttpServiceRuntimeTest exte
     private ServletContextDTO assertDefaultContext(RuntimeDTO runtimeDTO)
     {
         assertTrue(1 < runtimeDTO.servletContextDTOs.length);
-        assertEquals("Http Service context", runtimeDTO.servletContextDTOs[0].name);
+        assertEquals(HTTP_CONTEXT_NAME, runtimeDTO.servletContextDTOs[0].name);
         assertEquals("default", runtimeDTO.servletContextDTOs[1].name);
         return runtimeDTO.servletContextDTOs[1];
     }

Added: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java?rev=1681787&view=auto
==============================================================================
--- felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java (added)
+++ felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java Tue May 26 16:18:47 2015
@@ -0,0 +1,219 @@
+/*
+ * 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.felix.http.itest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.osgi.framework.Constants.SERVICE_RANKING;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME;
+import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.CookieSpecs;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.json.simple.parser.ParseException;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.ExamReactorStrategy;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.http.context.ServletContextHelper;
+
+@RunWith(JUnit4TestRunner.class)
+@ExamReactorStrategy( EagerSingleStagedReactorFactory.class )
+public class SessionHandlingTest extends BaseIntegrationTest
+{
+    private List<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
+
+    private CountDownLatch initLatch;
+    private CountDownLatch destroyLatch;
+
+    private void setupLatches(int count)
+    {
+        initLatch = new CountDownLatch(count);
+        destroyLatch = new CountDownLatch(count);
+    }
+
+    private void setupServlet(final String name, String[] path, int rank, final String context) throws Exception
+    {
+        Dictionary<String, Object> servletProps = new Hashtable<String, Object>();
+        servletProps.put(HTTP_WHITEBOARD_SERVLET_NAME, name);
+        servletProps.put(HTTP_WHITEBOARD_SERVLET_PATTERN, path);
+        servletProps.put(SERVICE_RANKING, rank);
+        if (context != null)
+        {
+            servletProps.put(HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HTTP_WHITEBOARD_CONTEXT_NAME + "=" + context + ")");
+        }
+
+        Servlet sessionServlet = new TestServlet(initLatch, destroyLatch)
+        {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws IOException
+            {
+                final boolean create = req.getParameter("create") != null;
+                if ( create )
+                {
+                    req.getSession();
+                }
+                final HttpSession s = req.getSession(false);
+                if ( s != null )
+                {
+                    s.setAttribute("value", context);
+                }
+
+                final PrintWriter pw = resp.getWriter();
+                pw.println("{");
+                if ( s == null )
+                {
+                    pw.println(" \"session\" : false");
+                }
+                else
+                {
+                    pw.println(" \"session\" : true,");
+                    pw.println(" \"isNew\" : " + s.isNew() + ",");
+                    pw.println(" \"sessionId\" : \"" + s.getId() + "\",");
+                    pw.println(" \"value\" : \"" + s.getAttribute("value") + "\"");
+                }
+                pw.println("}");
+            }
+        };
+
+        registrations.add(m_context.registerService(Servlet.class.getName(), sessionServlet, servletProps));
+    }
+
+    private void setupContext(String name, String path) throws InterruptedException
+    {
+        Dictionary<String, ?> properties = createDictionary(
+                HTTP_WHITEBOARD_CONTEXT_NAME, name,
+                HTTP_WHITEBOARD_CONTEXT_PATH, path);
+
+        ServletContextHelper servletContextHelper = new ServletContextHelper(m_context.getBundle()){
+            // test helper
+        };
+        registrations.add(m_context.registerService(ServletContextHelper.class.getName(), servletContextHelper, properties));
+
+        Thread.sleep(500);
+    }
+
+    @After
+    public void unregisterServices() throws InterruptedException
+    {
+        for (ServiceRegistration<?> serviceRegistration : registrations)
+        {
+            serviceRegistration.unregister();
+        }
+
+        assertTrue(destroyLatch.await(5, TimeUnit.SECONDS));
+
+        Thread.sleep(500);
+    }
+
+    private JSONObject getJSONResponse(final CloseableHttpClient client, final String path) throws IOException, ParseException
+    {
+        final HttpGet httpGet = new HttpGet(createURL(path).toExternalForm().toString());
+        CloseableHttpResponse response1 = client.execute(httpGet);
+
+        try {
+            HttpEntity entity1 = response1.getEntity();
+            final String content = EntityUtils.toString(entity1);
+
+            return (JSONObject) JSONValue.parseWithException(content);
+        } finally {
+            response1.close();
+        }
+
+    }
+    @Test
+    public void testSessionAttributes() throws Exception
+    {
+        setupContext("test1", "/");
+        setupContext("test2", "/");
+
+        setupLatches(2);
+
+        setupServlet("lowRankServlet", new String[] { "/foo" }, 1, "test1");
+        setupServlet("highRankServlet", new String[] { "/bar" }, 2, "test2" );
+
+        assertTrue(initLatch.await(5, TimeUnit.SECONDS));
+
+        RequestConfig globalConfig = RequestConfig.custom()
+                .setCookieSpec(CookieSpecs.BEST_MATCH)
+                .build();
+        final CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(globalConfig)
+                .setDefaultCookieStore(new BasicCookieStore())
+                .build();
+
+        // session should not be available
+        final JSONObject obj1 = getJSONResponse(httpclient, "/foo");
+        assertFalse(((Boolean)obj1.get("session")).booleanValue());
+
+        final JSONObject obj2 = getJSONResponse(httpclient, "/bar");
+        assertFalse(((Boolean)obj2.get("session")).booleanValue());
+
+        // create session for one context
+        final JSONObject obj3 = getJSONResponse(httpclient, "/foo?create=true");
+        assertTrue(((Boolean)obj3.get("session")).booleanValue());
+        assertEquals("test1", obj3.get("value"));
+        final JSONObject obj4 = getJSONResponse(httpclient, "/bar");
+        assertFalse(((Boolean)obj4.get("session")).booleanValue());
+        final JSONObject obj5 = getJSONResponse(httpclient, "/foo");
+        assertTrue(((Boolean)obj5.get("session")).booleanValue());
+        assertEquals("test1", obj5.get("value"));
+
+        // create session for second context
+        final JSONObject obj6 = getJSONResponse(httpclient, "/bar?create=true");
+        assertTrue(((Boolean)obj6.get("session")).booleanValue());
+        assertEquals("test2", obj6.get("value"));
+        final JSONObject obj7 = getJSONResponse(httpclient, "/foo");
+        assertTrue(((Boolean)obj7.get("session")).booleanValue());
+        assertEquals("test1", obj7.get("value"));
+    }
+}

Propchange: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/http/itest/src/test/java/org/apache/felix/http/itest/SessionHandlingTest.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url