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