Package org.pentaho.test.platform.plugin.services.cache

Source Code of org.pentaho.test.platform.plugin.services.cache.CacheManagerWithRegionTest

/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.test.platform.plugin.services.cache;

import junit.framework.Assert;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pentaho.platform.api.engine.ICacheManager;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.test.platform.engine.core.BaseTest;

import java.io.File;
import java.math.BigDecimal;

@SuppressWarnings( "nls" )
public class CacheManagerWithRegionTest extends BaseTest {

  private static final String SOLUTION_PATH = "test-src/cache-solution";
  private static final String ALT_SOLUTION_PATH = "test-src/cache-solution";
  private static final String PENTAHO_XML_PATH = "/system/pentahoObjects.spring.xml";

  @Override
  public String getSolutionPath() {
    File file = new File( SOLUTION_PATH + PENTAHO_XML_PATH );
    if ( file.exists() ) {
      System.out.println( "File exist returning " + SOLUTION_PATH );
      return SOLUTION_PATH;
    } else {
      System.out.println( "File does not exist returning " + ALT_SOLUTION_PATH );
      return ALT_SOLUTION_PATH;
    }
  }

  // private final StringBuffer longString = new StringBuffer();

  public void testCacheRegion() {

    // Make sure we have a cache first...
    ICacheManager cacheManager = PentahoSystem.getCacheManager( null ); // TODO sbarkdull, need to get real session in
                                                                        // here
    Assert.assertNotNull( cacheManager );
    Assert.assertTrue( cacheManager.cacheEnabled() );

    // Test Session Based Caching
    StandaloneSession userSession1 = new StandaloneSession( "Standalone Session", "1234-5678-90" ); //$NON-NLS-1$ //$NON-NLS-2$
    StandaloneSession userSession2 = new StandaloneSession( "Standalone Session", "abc-def-ghi-jkl" ); //$NON-NLS-1$ //$NON-NLS-2$

    // ================================ Create Objects
    // User Objects

    // Cache any-old String...
    String user1StringObject = "User1's String Object"; //$NON-NLS-1$
    // Make sure we can cache these Document objects...
    Document user1Document = DocumentHelper.createDocument();
    Element user1RootNode = user1Document.addElement( "user1" ); //$NON-NLS-1$
    Element user1FileNode = user1RootNode.addElement( "file" ); //$NON-NLS-1$
    user1FileNode.addAttribute( "name", "test" ); //$NON-NLS-1$ //$NON-NLS-2$
    String user1CompareXMLOriginal = user1Document.asXML();

    // User2's Objects
    // Cache any-old String...
    String user2StringObject = "User2's String Object"; //$NON-NLS-1$
    Document user2Document = DocumentHelper.createDocument();
    Element user2RootNode = user2Document.addElement( "user2" ); //$NON-NLS-1$
    Element user2FileNode = user2RootNode.addElement( "folder" ); //$NON-NLS-1$
    user2FileNode.addAttribute( "name", "test2" ); //$NON-NLS-1$ //$NON-NLS-2$
    String user2CompareXMLOriginal = user2Document.asXML();

    // Global Objects
    Integer globalInt = new Integer( 372 );
    BigDecimal globalBigDecimal = new BigDecimal( "2342.123334444211" ); //$NON-NLS-1$
    StringBuffer globalStringBuffer = new StringBuffer();
    globalStringBuffer.append( "This is a really long string to stick in a string buffer" ); //$NON-NLS-1$

    cacheManager.putInRegionCache( userSession1.getId(), "StringObject", user1StringObject );
    cacheManager.putInRegionCache( userSession1.getId(), "repoDoc", user1Document ); //$NON-NLS-1$
    cacheManager.putInRegionCache( userSession2.getId(), "StringObject", user2StringObject ); //$NON-NLS-1$
    cacheManager.putInRegionCache( userSession2.getId(), "repoDoc", user2Document ); // $NON-N

    // Get them back out
    Object user1CachedStringObject = cacheManager.getFromRegionCache( userSession1.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNull( user1CachedStringObject );
    Object user1CachedDocument = cacheManager.getFromRegionCache( userSession1.getId(), "repoDoc" ); //$NON-NLS-1$
    Assert.assertNull( user1CachedDocument );
    Object user2CachedStringObject = cacheManager.getFromRegionCache( userSession2.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNull( user2CachedStringObject );
    Object user2CachedDocument = cacheManager.getFromRegionCache( userSession2.getId(), "repoDoc" ); //$NON-NLS-1$
    Assert.assertNull( user2CachedDocument );

    cacheManager.addCacheRegion( userSession1.getId() );
    cacheManager.addCacheRegion( userSession2.getId() );
    // Ok - we now have some stuff to jam into the cache.
    cacheManager.putInRegionCache( userSession1.getId(), "StringObject", user1StringObject );
    cacheManager.putInRegionCache( userSession1.getId(), "repoDoc", user1Document ); //$NON-NLS-1$
    cacheManager.putInRegionCache( userSession2.getId(), "StringObject", user2StringObject ); //$NON-NLS-1$
    cacheManager.putInRegionCache( userSession2.getId(), "repoDoc", user2Document ); //$NON-NLS-1$

    // Get them back out
    Object user1CachedStringObject1 = cacheManager.getFromRegionCache( userSession1.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertEquals( user1StringObject, (String) user1CachedStringObject1 );
    Object user1CachedDocument1 = cacheManager.getFromRegionCache( userSession1.getId(), "repoDoc" ); //$NON-NLS-1$
    String user1CompareXMLCached1 = ( (Document) user1CachedDocument1 ).asXML();
    Assert.assertEquals( user1CompareXMLOriginal, user1CompareXMLCached1 );

    Object user2CachedStringObject1 = cacheManager.getFromRegionCache( userSession2.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertEquals( user2StringObject, (String) user2CachedStringObject1 );
    Object user2CachedDocument1 = cacheManager.getFromRegionCache( userSession2.getId(), "repoDoc" ); //$NON-NLS-1$
    String user2CompareXMLCached1 = ( (Document) user2CachedDocument1 ).asXML();
    Assert.assertEquals( user2CompareXMLOriginal, user2CompareXMLCached1 );

    // OK - We've verified that their objects are unique to each individual
    // user.

    // Test Removals from session only

    // Remove a single user-session based object.
    cacheManager.removeFromRegionCache( userSession1.getId(), "StringObject" ); //$NON-NLS-1$
    // Try to get it back anyway.
    Object notThere = cacheManager.getFromRegionCache( userSession1.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNull( notThere );

    // Make sure that User2 is unaffected
    Object shouldBeThere = cacheManager.getFromRegionCache( userSession2.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNotNull( shouldBeThere );

    // Kill user1's session
    cacheManager.removeRegionCache( userSession1.getId() );
    notThere = cacheManager.getFromRegionCache( userSession1.getId(), "repoDoc" ); //$NON-NLS-1$
    Assert.assertNull( notThere );

    // Make sure that User2 is still unaffected
    shouldBeThere = cacheManager.getFromRegionCache( userSession2.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNotNull( shouldBeThere );

    // Test Global Caching
    cacheManager.addCacheRegion( "Global" );
    // Put stuff in
    cacheManager.putInRegionCache( "Global", "globalIntegerKey", globalInt ); //$NON-NLS-1$
    cacheManager.putInRegionCache( "Global", "globalBigDecimalKey", globalBigDecimal ); //$NON-NLS-1$
    cacheManager.putInRegionCache( "Global", "globalStringBufferKey", globalStringBuffer ); //$NON-NLS-1$

    Object cachedGlobalInt = cacheManager.getFromRegionCache( "Global", "globalIntegerKey" ); //$NON-NLS-1$
    Assert.assertEquals( globalInt, cachedGlobalInt );
    Object cachedGlobalBigDecimal = cacheManager.getFromRegionCache( "Global", "globalBigDecimalKey" ); //$NON-NLS-1$
    Assert.assertEquals( globalBigDecimal, cachedGlobalBigDecimal );
    Object cachedGlobalStringBuffer = cacheManager.getFromRegionCache( "Global", "globalStringBufferKey" ); //$NON-NLS-1$
    Assert.assertEquals( globalStringBuffer, cachedGlobalStringBuffer );

    // Test clear all session-based keys. This should leave the global stuff
    // alone.
    cacheManager.removeRegionCache( userSession2.getId() );
    notThere = cacheManager.getFromRegionCache( userSession2.getId(), "StringObject" ); //$NON-NLS-1$
    Assert.assertNull( notThere );
    notThere = cacheManager.getFromRegionCache( userSession2.getId(), "repoDoc" ); //$NON-NLS-1$
    Assert.assertNull( notThere );
    shouldBeThere = cacheManager.getFromRegionCache( "Global", "globalIntegerKey" ); //$NON-NLS-1$
    Assert.assertNotNull( shouldBeThere );

    // Totally clear out the cache.
    cacheManager.clearCache();
    notThere = cacheManager.getFromRegionCache( "Global", "globalIntegerKey" ); //$NON-NLS-1$
    Assert.assertNull( notThere );
    notThere = cacheManager.getFromRegionCache( "Global", "globalBigDecimalKey" ); //$NON-NLS-1$
    Assert.assertNull( notThere );
    notThere = cacheManager.getFromRegionCache( "Global", "globalStringBufferKey" ); //$NON-NLS-1$
    Assert.assertNull( notThere );
    cacheManager.addCacheRegion( "Global" );
    // Force cache overload - make sure it spools objects to disk...
    // Assumes cache size is set to 2000 objects maximum.
    for ( int i = 0; i < 10000; i++ ) {
      String someCachedString = "This is the string to cache " + i; //$NON-NLS-1$
      String someCachedKey = "SomeCachedKey" + i; //$NON-NLS-1$
      if ( ( i % 1000 ) == 0 ) {
        sleep( 5 );
      }
      cacheManager.putInRegionCache( "Global", someCachedKey, someCachedString );
    }
    // Let cache stabalize, and decide what hasn't been used for a while.
    // 15 seconds should do it.
    sleep( 15 );
    // Get first item from the cache...
    shouldBeThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey1" ); //$NON-NLS-1$
    Assert.assertEquals( shouldBeThere, "This is the string to cache 1" ); //$NON-NLS-1$
    // Get middle item from the cache...
    shouldBeThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey5000" ); //$NON-NLS-1$
    Assert.assertEquals( shouldBeThere, "This is the string to cache 5000" ); //$NON-NLS-1$
    // Get last item from the cache...
    shouldBeThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey999" ); //$NON-NLS-1$
    Assert.assertEquals( shouldBeThere, "This is the string to cache 999" ); //$NON-NLS-1$

    // Clear cache again...
    cacheManager.clearCache();

    // Make sure...
    notThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey2" ); //$NON-NLS-1$
    Assert.assertNull( notThere );

    notThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey5002" ); //$NON-NLS-1$
    Assert.assertNull( notThere );

    notThere = cacheManager.getFromRegionCache( "Global", "SomeCachedKey998" ); //$NON-NLS-1$
    Assert.assertNull( notThere );

    // Done with tests.

  }

  private void sleep( final int time ) {
    try {
      System.out.println( "***** Sleeping for " + time + " seconds *****" ); //$NON-NLS-1$ //$NON-NLS-2$
      Thread.sleep( time * 1000 );
    } catch ( Exception ignored ) {
      //ignore
    }

  }

}
TOP

Related Classes of org.pentaho.test.platform.plugin.services.cache.CacheManagerWithRegionTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.