Author: tv
Date: Fri Sep 11 14:58:59 2015
New Revision: 1702493

URL: http://svn.apache.org/r1702493
Log:
Fix removal of items from group cache, added several tests

Added:
    
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java
   (with props)
Modified:
    
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
    
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/CacheAccessUnitTest.java
    commons/proper/jcs/trunk/src/changes/changes.xml

Modified: 
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java?rev=1702493&r1=1702492&r2=1702493&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
 (original)
+++ 
commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
 Fri Sep 11 14:58:59 2015
@@ -388,7 +388,7 @@ public abstract class AbstractDoubleLink
                 }
             }
         }
-        else if ( key instanceof GroupAttrName )
+        else if ( key instanceof GroupAttrName && 
((GroupAttrName<?>)key).attrName == null)
         {
             // remove all keys of the same name hierarchy.
             for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = 
map.entrySet().iterator(); itr.hasNext(); )

Modified: 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/CacheAccessUnitTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/CacheAccessUnitTest.java?rev=1702493&r1=1702492&r2=1702493&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/CacheAccessUnitTest.java
 (original)
+++ 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/CacheAccessUnitTest.java
 Fri Sep 11 14:58:59 2015
@@ -19,7 +19,12 @@ package org.apache.commons.jcs.access;
  * under the License.
  */
 
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
 import junit.framework.TestCase;
+
 import org.apache.commons.jcs.JCS;
 import org.apache.commons.jcs.access.exception.CacheException;
 import org.apache.commons.jcs.access.exception.ObjectExistsException;
@@ -29,12 +34,8 @@ import org.apache.commons.jcs.engine.beh
 import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
 import org.apache.commons.jcs.engine.behavior.IElementAttributes;
 
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
 /**
- * Tests the methods of the cache access class from which the class JCS 
extends.
+ * Tests the methods of the cache access class.
  * <p>
  * @author Aaron Smuts
  */
@@ -62,7 +63,7 @@ public class CacheAccessUnitTest
         try
         {
             access.putSafe( key, "someothervalue" );
-            fail( "We should have received an eception since this key is 
alredy in the cache." );
+            fail( "We should have received an exception since this key is 
already in the cache." );
         }
         catch ( CacheException e )
         {
@@ -71,7 +72,7 @@ public class CacheAccessUnitTest
         }
 
         String returnedValue2 = access.get( key );
-        assertEquals( "Wrong value returned.  Shoudl still be the original.", 
value, returnedValue2 );
+        assertEquals( "Wrong value returned.  Should still be the original.", 
value, returnedValue2 );
     }
 
     /**
@@ -94,7 +95,7 @@ public class CacheAccessUnitTest
         }
         catch ( CacheException e )
         {
-            assertTrue( "Should have the work null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
+            assertTrue( "Should have the word null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
         }
     }
 
@@ -118,7 +119,7 @@ public class CacheAccessUnitTest
         }
         catch ( CacheException e )
         {
-            assertTrue( "Should have the work null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
+            assertTrue( "Should have the word null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
         }
     }
 
@@ -223,7 +224,7 @@ public class CacheAccessUnitTest
 
     /**
      * Verify that we can get a region using the define region method with 
cache attributes and
-     * elemetn attributes.
+     * element attributes.
      * @throws Exception
      */
     public void testRegionDefinitonWithBothAttributes()
@@ -352,51 +353,4 @@ public class CacheAccessUnitTest
             assertTrue( "Should be a cache element.", value instanceof 
ICacheElement );
         }
     }
-
-    /**
-     * Verify we can use the group cache.
-     * <p>
-     * @throws Exception
-     */
-    public void testGroupCache()
-        throws Exception
-    {
-        GroupCacheAccess<String, Integer> access = JCS.getGroupCacheInstance( 
"testGroup" );
-        String groupName1 = "testgroup1";
-        String groupName2 = "testgroup2";
-
-        Set<String> keys1 = access.getGroupKeys( groupName1 );
-        assertNotNull(keys1);
-        assertEquals(0, keys1.size());
-
-        Set<String> keys2 = access.getGroupKeys( groupName2 );
-        assertNotNull(keys2);
-        assertEquals(0, keys2.size());
-
-        // DO WORK
-        int numToInsertGroup1 = 10;
-        // insert with prefix1
-        for ( int i = 0; i < numToInsertGroup1; i++ )
-        {
-            access.putInGroup(String.valueOf( i ), groupName1, 
Integer.valueOf( i ) );
-        }
-
-        int numToInsertGroup2 = 50;
-        // insert with prefix1
-        for ( int i = 0; i < numToInsertGroup2; i++ )
-        {
-            access.putInGroup(String.valueOf( i ), groupName2, 
Integer.valueOf( i + 1 ) );
-        }
-
-        keys1 = access.getGroupKeys( groupName1 ); // Test for JCS-102
-        assertNotNull(keys1);
-        assertEquals("Wrong number returned 1:", 10, keys1.size());
-
-        keys2 = access.getGroupKeys( groupName2 );
-        assertNotNull(keys2);
-        assertEquals("Wrong number returned 2:", 50, keys2.size());
-
-        assertEquals(Integer.valueOf(5), access.getFromGroup("5", groupName1));
-        assertEquals(Integer.valueOf(6), access.getFromGroup("5", groupName2));
-    }
 }

Added: 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java?rev=1702493&view=auto
==============================================================================
--- 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java
 (added)
+++ 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java
 Fri Sep 11 14:58:59 2015
@@ -0,0 +1,240 @@
+package org.apache.commons.jcs.access;
+
+/*
+ * 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.
+ */
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.jcs.JCS;
+import org.apache.commons.jcs.access.exception.CacheException;
+
+/**
+ * Tests the methods of the group cache access class.
+ * <p>
+ * @author Aaron Smuts
+ */
+public class GroupCacheAccessUnitTest
+    extends TestCase
+{
+    /**
+     * Verify that we can put and get an object
+     * @throws Exception
+     */
+    public void testPutAndGet()
+        throws Exception
+    {
+        GroupCacheAccess<String, String> access = JCS.getGroupCacheInstance( 
"test" );
+        assertNotNull( "We should have an access class", access );
+
+        String key = "mykey";
+        String group = "mygroup";
+        String value = "myvalue";
+
+        access.putInGroup(key, group, value);
+
+        String returnedValue1 = access.getFromGroup(key, group);
+        assertEquals( "Wrong value returned.", value, returnedValue1 );
+    }
+
+    /**
+     * Try to put a null key and verify that we get an exception.
+     * @throws Exception
+     */
+    public void testPutNullKey()
+        throws Exception
+    {
+        GroupCacheAccess<String, String> access = JCS.getGroupCacheInstance( 
"test" );
+        assertNotNull( "We should have an access class", access );
+
+        String key = null;
+        String group = "mygroup";
+        String value = "myvalue";
+
+        try
+        {
+            access.putInGroup(key, group, value);
+            fail( "Should not have been able to put a null key." );
+        }
+        catch ( CacheException e )
+        {
+            assertTrue( "Should have the word null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
+        }
+    }
+
+    /**
+     * Try to put a null value and verify that we get an exception.
+     * @throws Exception
+     */
+    public void testPutNullValue()
+        throws Exception
+    {
+        GroupCacheAccess<String, String> access = JCS.getGroupCacheInstance( 
"test" );
+        assertNotNull( "We should have an access class", access );
+
+        String key = "myKey";
+        String group = "mygroup";
+        String value = null;
+
+        try
+        {
+            access.putInGroup(key, group, value);
+            fail( "Should not have been able to put a null object." );
+        }
+        catch ( CacheException e )
+        {
+            assertTrue( "Should have the word null in the error message.", 
e.getMessage().indexOf( "null" ) != -1 );
+        }
+    }
+
+    /**
+     * Verify that we can remove items from the cache
+     * @throws Exception
+     */
+    public void testRemove()
+        throws Exception
+    {
+        GroupCacheAccess<String, String> access = JCS.getGroupCacheInstance( 
"test" );
+        assertNotNull( "We should have an access class", access );
+
+        String key = "mykey";
+        String group = "mygroup";
+        String value = "myvalue";
+
+        for (int i = 0; i < 10; i++)
+        {
+            access.putInGroup(key + i, group, value + i);
+        }
+
+        // Make sure cache contains some data
+        for (int i = 0; i < 10; i++)
+        {
+            String returnedValue1 = access.getFromGroup(key + i, group);
+            assertEquals( "Wrong value returned.", value + i, returnedValue1 );
+        }
+
+        access.removeFromGroup(key + 0, group);
+
+        assertNull("Should not be in cache", access.getFromGroup(key + 0, 
group));
+
+        for (int i = 1; i < 10; i++)
+        {
+            String returnedValue1 = access.getFromGroup(key + i, group);
+            assertEquals( "Wrong value returned.", value + i, returnedValue1 );
+        }
+    }
+
+    /**
+     * Verify that we can invalidate the group
+     * @throws Exception
+     */
+    public void testInvalidate()
+        throws Exception
+    {
+        GroupCacheAccess<String, String> access = JCS.getGroupCacheInstance( 
"test" );
+        assertNotNull( "We should have an access class", access );
+
+        String key = "mykey";
+        String group = "mygroup";
+        String value = "myvalue";
+
+        for (int i = 0; i < 10; i++)
+        {
+            access.putInGroup(key + i, group + 0, value + i);
+        }
+
+        for (int i = 0; i < 10; i++)
+        {
+            access.putInGroup(key + i, group + 1, value + i);
+        }
+
+        // Make sure cache contains some data
+        for (int i = 0; i < 10; i++)
+        {
+            String returnedValue1 = access.getFromGroup(key + i, group + 0);
+            assertEquals( "Wrong value returned.", value + i, returnedValue1 );
+            String returnedValue2 = access.getFromGroup(key + i, group + 1);
+            assertEquals( "Wrong value returned.", value + i, returnedValue2 );
+        }
+
+        access.invalidateGroup(group + 0);
+
+        for (int i = 0; i < 10; i++)
+        {
+            assertNull("Should not be in cache", access.getFromGroup(key + i, 
group + 0));
+        }
+
+        for (int i = 0; i < 10; i++)
+        {
+            String returnedValue1 = access.getFromGroup(key + i, group + 1);
+            assertEquals( "Wrong value returned.", value + i, returnedValue1 );
+        }
+    }
+
+    /**
+     * Verify we can use the group cache.
+     * <p>
+     * @throws Exception
+     */
+    public void testGroupCache()
+        throws Exception
+    {
+        GroupCacheAccess<String, Integer> access = JCS.getGroupCacheInstance( 
"testGroup" );
+        String groupName1 = "testgroup1";
+        String groupName2 = "testgroup2";
+
+        Set<String> keys1 = access.getGroupKeys( groupName1 );
+        assertNotNull(keys1);
+        assertEquals(0, keys1.size());
+
+        Set<String> keys2 = access.getGroupKeys( groupName2 );
+        assertNotNull(keys2);
+        assertEquals(0, keys2.size());
+
+        // DO WORK
+        int numToInsertGroup1 = 10;
+        // insert with prefix1
+        for ( int i = 0; i < numToInsertGroup1; i++ )
+        {
+            access.putInGroup(String.valueOf( i ), groupName1, 
Integer.valueOf( i ) );
+        }
+
+        int numToInsertGroup2 = 50;
+        // insert with prefix1
+        for ( int i = 0; i < numToInsertGroup2; i++ )
+        {
+            access.putInGroup(String.valueOf( i ), groupName2, 
Integer.valueOf( i + 1 ) );
+        }
+
+        keys1 = access.getGroupKeys( groupName1 ); // Test for JCS-102
+        assertNotNull(keys1);
+        assertEquals("Wrong number returned 1:", 10, keys1.size());
+
+        keys2 = access.getGroupKeys( groupName2 );
+        assertNotNull(keys2);
+        assertEquals("Wrong number returned 2:", 50, keys2.size());
+
+        assertEquals(Integer.valueOf(5), access.getFromGroup("5", groupName1));
+        assertEquals(Integer.valueOf(6), access.getFromGroup("5", groupName2));
+
+        assertTrue(access.getGroupNames().contains(groupName1));
+        assertTrue(access.getGroupNames().contains(groupName2));
+    }
+}

Propchange: 
commons/proper/jcs/trunk/commons-jcs-core/src/test/java/org/apache/commons/jcs/access/GroupCacheAccessUnitTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/proper/jcs/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/changes/changes.xml?rev=1702493&r1=1702492&r2=1702493&view=diff
==============================================================================
--- commons/proper/jcs/trunk/src/changes/changes.xml (original)
+++ commons/proper/jcs/trunk/src/changes/changes.xml Fri Sep 11 14:58:59 2015
@@ -20,6 +20,9 @@
        </properties>
        <body>
         <release version="2.0" date="unreleased" description="JDK 1.6 based 
major release">
+            <action dev="tv" type="fix">
+                Fix removal of items from group cache, added several tests
+            </action>
             <action dev="tv" type="add">
                 Add orderly shutdown of ThreadPoolManager
             </action>


Reply via email to