Author: asmuts
Date: Mon Feb 20 13:21:11 2006
New Revision: 379241

URL: http://svn.apache.org/viewcvs?rev=379241&view=rev
Log:
adding a test that showed up in the mailing list as a supposed problem.  JCS 
passes with no problems.

Added:
    jakarta/jcs/trunk/src/test-conf/TestThrash.ccf
    jakarta/jcs/trunk/src/test/org/apache/jcs/JCSThrashTest.java

Added: jakarta/jcs/trunk/src/test-conf/TestThrash.ccf
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/test-conf/TestThrash.ccf?rev=379241&view=auto
==============================================================================
--- jakarta/jcs/trunk/src/test-conf/TestThrash.ccf (added)
+++ jakarta/jcs/trunk/src/test-conf/TestThrash.ccf Mon Feb 20 13:21:11 2006
@@ -0,0 +1,4 @@
+jcs.default=
+jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
+jcs.default.cacheattributes.MaxObjects=10000
+jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache

Added: jakarta/jcs/trunk/src/test/org/apache/jcs/JCSThrashTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/test/org/apache/jcs/JCSThrashTest.java?rev=379241&view=auto
==============================================================================
--- jakarta/jcs/trunk/src/test/org/apache/jcs/JCSThrashTest.java (added)
+++ jakarta/jcs/trunk/src/test/org/apache/jcs/JCSThrashTest.java Mon Feb 20 
13:21:11 2006
@@ -0,0 +1,318 @@
+package org.apache.jcs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jcs.engine.stats.behavior.IStatElement;
+import org.apache.jcs.engine.stats.behavior.IStats;
+
+/**
+ * This is based on a test that was posted to the user's list:
+ * 
+ * 
http://www.opensubscriber.com/message/[email protected]/2435965.html
+ *
+ */
+public class JCSThrashTest
+    extends TestCase
+{
+
+    private static final Log LOG = LogFactory.getLog( 
JCSThrashTest.class.getName() );
+
+    /**
+     * the cache instance
+     */
+    protected JCS jcs;
+
+    /**
+     * @param args
+     */
+    public static void main( String[] args )
+    {
+        junit.textui.TestRunner.run( JCSThrashTest.class );
+    }
+
+    /**
+     * @param arg0
+     */
+    public JCSThrashTest( String arg0 )
+    {
+        super( arg0 );
+    }
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        JCS.setConfigFilename( "/TestThrash.ccf" );
+        jcs = JCS.getInstance( "testcache" );
+    }
+
+    protected void tearDown()
+        throws Exception
+    {
+        super.tearDown();
+        jcs.clear();
+        jcs.dispose();
+    }
+
+    /**
+     * Tests adding an entry.
+     * @throws Exception 
+     */
+    public void testPut()
+        throws Exception
+    {
+        final String value = "value";
+        final String key = "key";
+
+        // Make sure the element is not found
+        assertEquals( 0, getListSize() );
+
+        assertNull( jcs.get( key ) );
+
+        jcs.put( key, value );
+
+        // Get the element
+        LOG.info( "jcs.getStats(): " + jcs.getStatistics() );
+        assertEquals( 1, getListSize() );
+        assertNotNull( jcs.get( key ) );
+        assertEquals( value, jcs.get( key ) );
+    }
+
+    /**
+     * Test elements can be removed from the store
+     * @throws Exception 
+     */
+    public void testRemove()
+        throws Exception
+    {
+        jcs.put( "key1", "value1" );
+        assertEquals( 1, getListSize() );
+
+        jcs.remove( "key1" );
+        assertEquals( 0, getListSize() );
+
+        jcs.put( "key2", "value2" );
+        jcs.put( "key3", "value3" );
+        assertEquals( 2, getListSize() );
+
+        jcs.remove( "key2" );
+        assertEquals( 1, getListSize() );
+
+        // Try to remove an object that is not there in the store
+        jcs.remove( "key4" );
+        assertEquals( 1, getListSize() );
+    }
+
+    /**
+     * This does a bunch of work and then verifies that the memory has not 
grown by much.
+     * Most of the time the amount of memory used after the test is less.
+     * 
+     * @throws Exception
+     */
+    public void testForMemoryLeaks()
+        throws Exception
+    {
+        long differenceMemoryCache = thrashCache();
+        LOG.info( "Memory Difference is: " + differenceMemoryCache );
+        assertTrue( differenceMemoryCache < 500000 );
+        
+        //LOG.info( "Memory Used is: " + measureMemoryUse() );
+    }
+
+    /**
+     * @return
+     * @throws Exception
+     */
+    protected long thrashCache()
+        throws Exception
+    {
+
+        long startingSize = measureMemoryUse();
+        LOG.info( "Memory Used is: " + startingSize );
+
+        final String value = "value";
+        final String key = "key";
+
+        // Add the entry
+        jcs.put( key, value );
+
+        // Create 15 threads that read the keys;
+        final List executables = new ArrayList();
+        for ( int i = 0; i < 15; i++ )
+        {
+            final JCSThrashTest.Executable executable = new 
JCSThrashTest.Executable()
+            {
+                public void execute()
+                    throws Exception
+                {
+                    for ( int i = 0; i < 500; i++ )
+                    {
+                        final String key = "key" + i;
+                        jcs.get( key );
+                    }
+                    jcs.get( "key" );
+                }
+            };
+            executables.add( executable );
+        }
+        
+        // Create 15 threads that are insert 500 keys with large byte[] as
+        // values
+        for ( int i = 0; i < 15; i++ )
+        {
+            final JCSThrashTest.Executable executable = new 
JCSThrashTest.Executable()
+            {
+                public void execute()
+                    throws Exception
+                {
+
+                    // Add a bunch of entries
+                    for ( int i = 0; i < 500; i++ )
+                    {
+                        // Use a random length value
+                        final String key = "key" + i;
+                        byte[] value = new byte[10000];
+                        jcs.put( key, value );
+                    }
+                }
+            };
+            executables.add( executable );
+        }
+
+        runThreads( executables );
+        jcs.clear();
+
+        long finishingSize = measureMemoryUse();
+        LOG.info( "Memory Used is: " + finishingSize );
+        return finishingSize - startingSize;
+    }
+
+    /**
+     * Runs a set of threads, for a fixed amount of time.
+     * @param executables 
+     * @throws Exception 
+     */
+    protected void runThreads( final List executables )
+        throws Exception
+    {
+
+        final long endTime = System.currentTimeMillis() + 10000;
+        final Throwable[] errors = new Throwable[1];
+
+        // Spin up the threads
+        final Thread[] threads = new Thread[executables.size()];
+        for ( int i = 0; i < threads.length; i++ )
+        {
+            final JCSThrashTest.Executable executable = 
(JCSThrashTest.Executable) executables.get( i );
+            threads[i] = new Thread()
+            {
+                public void run()
+                {
+                    try
+                    {
+                        // Run the thread until the given end time
+                        while ( System.currentTimeMillis() < endTime )
+                        {
+                            executable.execute();
+                        }
+                    }
+                    catch ( Throwable t )
+                    {
+                        // Hang on to any errors
+                        errors[0] = t;
+                    }
+                }
+            };
+            threads[i].start();
+        }
+
+        // Wait for the threads to finish
+        for ( int i = 0; i < threads.length; i++ )
+        {
+            threads[i].join();
+        }
+
+        // Throw any error that happened
+        if ( errors[0] != null )
+        {
+            throw new Exception( "Test thread failed.", errors[0] );
+        }
+    }
+
+    /**
+     * Measure memory used by the VM.
+     * 
+     * @return
+     * @throws InterruptedException
+     */
+    protected long measureMemoryUse()
+        throws InterruptedException
+    {
+        System.gc();
+        Thread.sleep( 3000 );
+        System.gc();
+        return Runtime.getRuntime().totalMemory() - 
Runtime.getRuntime().freeMemory();
+    }
+
+    /**
+     * A runnable, that can throw an exception.
+     */
+    protected interface Executable
+    {
+        /**
+         * Executes this object.
+         * 
+         * @throws Exception
+         */
+        void execute()
+            throws Exception;
+    }
+
+    /**
+     * 
+     * @return
+     */
+    private int getListSize()
+    {
+        final String listSize = "List Size";
+        final String lruMemoryCache = "LRU Memory Cache";
+        String result = "0";
+        IStats istats[] = jcs.getStatistics().getAuxiliaryCacheStats();
+        for ( int i = 0; i < istats.length; i++ )
+        {
+            IStatElement statElements[] = istats[i].getStatElements();
+            if ( lruMemoryCache.equals( istats[i].getTypeName() ) )
+            {
+                for ( int j = 0; j < statElements.length; j++ )
+                {
+                    if ( listSize.equals( statElements[j].getName() ) )
+                    {
+                        result = statElements[j].getData();
+                    }
+                }
+            }
+
+        }
+        return Integer.parseInt( result );
+    }
+
+//    private int getMapSize()
+//    {
+//        final String listSize = "Map Size";
+//        String result = "0";
+//        IStatElement statElements[] = jcs.getStatistics().getStatElements();
+//        for ( int i = 0; i < statElements.length; i++ )
+//        {
+//            if ( listSize.equals( statElements[i].getName() ) )
+//            {
+//                result = statElements[i].getData();
+//            }
+//        }
+//        return Integer.parseInt( result );
+//    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to