Author: fschumacher
Date: Wed Dec 28 11:26:04 2016
New Revision: 1776270

URL: http://svn.apache.org/viewvc?rev=1776270&view=rev
Log:
Use correct monitor to use wait and notify on (followup to r1769418).
Move constructor to correct place and add a second one to be used by clone.
Make Map and Set for cookieManagers final.
Add tests.

Added:
    
jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java
   (with props)
Modified:
    
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java

Modified: 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java?rev=1776270&r1=1776269&r2=1776270&view=diff
==============================================================================
--- 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
 (original)
+++ 
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
 Wed Dec 28 11:26:04 2016
@@ -52,11 +52,31 @@ public class SessionFilter implements Fi
      * These objects are static across multiple threads in a test, via clone()
      * method.
      */
-    private Map<String, CookieManager> cookieManagers;
-    private Set<CookieManager> managersInUse;
+    private final Map<String, CookieManager> cookieManagers;
+    private final Set<CookieManager> managersInUse;
 
     private CookieManager lastUsed;
 
+    /**
+     * Creates a new SessionFilter and initializes its fields to new 
collections
+     */
+    public SessionFilter() {
+        this(new ConcurrentHashMap<String, CookieManager>(), 
Collections.synchronizedSet(new HashSet<CookieManager>()));
+    }
+
+    /**
+     * Creates a new SessionFilter, but re-uses the given collections
+     * 
+     * @param cookieManagers
+     *            {@link CookieManager}s to be used for the different IPs
+     * @param managersInUse
+     *            CookieManagers currently in use by other threads
+     */
+    public SessionFilter(Map<String, CookieManager> cookieManagers, 
Set<CookieManager> managersInUse) {
+        this.cookieManagers = cookieManagers;
+        this.managersInUse = managersInUse;
+    }
+
     /*
      * (non-Javadoc)
      *
@@ -87,24 +107,7 @@ public class SessionFilter implements Fi
      */
     @Override
     public Object clone() {
-        if(cookieManagers == null)
-        {
-            cookieManagers = new ConcurrentHashMap<>();
-        }
-        if(managersInUse == null)
-        {
-            managersInUse = Collections.synchronizedSet(new 
HashSet<CookieManager>());
-        }
-        SessionFilter f = new SessionFilter();
-        f.cookieManagers = cookieManagers;
-        f.managersInUse = managersInUse;
-        return f;
-    }
-
-    /**
-     *
-     */
-    public SessionFilter() {
+        return new SessionFilter(cookieManagers, managersInUse);
     }
 
     /**
@@ -156,7 +159,7 @@ public class SessionFilter implements Fi
 
     protected CookieManager getCookieManager(String ipAddr)
     {
-        CookieManager cm = null;
+        CookieManager cm;
         // First have to release the cookie we were using so other
         // threads stuck in wait can move on
         synchronized(LOCK)
@@ -164,7 +167,7 @@ public class SessionFilter implements Fi
             if(lastUsed != null)
             {
                 managersInUse.remove(lastUsed);
-                managersInUse.notify();
+                LOCK.notifyAll();
             }
         }
         // let notified threads move on and get lock on managersInUse
@@ -187,7 +190,7 @@ public class SessionFilter implements Fi
             while(managersInUse.contains(cm))
             {
                 try {
-                    managersInUse.wait();
+                    LOCK.wait();
                 } catch (InterruptedException e) {
                     log.info("SessionFilter wait interrupted");
                 }
@@ -213,7 +216,7 @@ public class SessionFilter implements Fi
         synchronized(LOCK)
         {
             managersInUse.remove(lastUsed);
-            managersInUse.notify();
+            LOCK.notifyAll();
         }
     }
 

Added: 
jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java?rev=1776270&view=auto
==============================================================================
--- 
jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java
 (added)
+++ 
jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java
 Wed Dec 28 11:26:04 2016
@@ -0,0 +1,77 @@
+/*
+ * 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.jmeter.protocol.http.util.accesslog;
+
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.jmeter.protocol.http.control.CookieManager;
+import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
+import org.junit.Test;
+
+public class TestSessionFilter {
+
+    @Test
+    public void testGetCookieManager() {
+        SessionFilter orig = new SessionFilter();
+        SessionFilter clone = (SessionFilter) orig.clone();
+
+        final String ipAddr = "1.2.3.4";
+        CookieManager cmOrig = orig.getCookieManager(ipAddr);
+        orig.threadFinished(); // clear CookieManager in use in orig
+        CookieManager cmClone = clone.getCookieManager(ipAddr);
+        clone.threadFinished(); // clear CookieManager in clone
+
+        assertSame(cmOrig, cmClone);
+    }
+
+    @Test
+    public void testGetCookieManagerLastUse() {
+        SessionFilter orig = new SessionFilter();
+        SessionFilter clone = (SessionFilter) orig.clone();
+
+        final String ipAddr = "1.2.3.4";
+        CookieManager cmOrig = orig.getCookieManager(ipAddr);
+        @SuppressWarnings("unused")
+        CookieManager secondCm = orig.getCookieManager("2.2.2.2"); // should 
set cmOrig free
+        CookieManager cmClone = clone.getCookieManager(ipAddr);
+        orig.threadFinished(); // clear CookieManager in clone
+        clone.threadFinished(); // clear CookieManager in clone
+
+        assertSame(cmOrig, cmClone);
+    }
+
+    @Test
+    public void testIsFiltered() throws Exception {
+        Map<String, CookieManager> cm = new ConcurrentHashMap<String, 
CookieManager>();
+        Set<CookieManager> inUse = Collections
+                .synchronizedSet(new HashSet<CookieManager>());
+        SessionFilter filter = new SessionFilter(cm, inUse);
+        HTTPSampler sampler = new HTTPSampler();
+        filter.isFiltered("1.2.3.4 ...", sampler);
+        assertSame(cm.get("1.2.3.4"), sampler.getCookieManager());
+        assertTrue(inUse.contains(sampler.getCookieManager()));
+    }
+
+}

Propchange: 
jmeter/trunk/test/src/org/apache/jmeter/protocol/http/util/accesslog/TestSessionFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to