Package org.jboss.cache.loader

Source Code of org.jboss.cache.loader.AdjListJDBCCacheLoaderCompatibilityTest

package org.jboss.cache.loader;

import org.jboss.cache.CacheSPI;
import org.jboss.cache.Fqn;
import org.jboss.cache.config.CacheLoaderConfig;
import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
import org.jboss.cache.marshall.NodeData;
import org.jboss.cache.statetransfer.DefaultStateTransferManager;
import org.jboss.cache.util.TestingUtil;
import org.jboss.util.stream.MarshalledValueInputStream;
import org.jboss.util.stream.MarshalledValueOutputStream;
import static org.testng.AssertJUnit.*;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Properties;
import org.jboss.cache.UnitTestCacheFactory;

/**
* Tests the compatibility between <tt>JDBCCacheLoader</tt> and <tt>JDBCCacheLoaderOld</tt>. More exactly,
* it tests whether the new <tt>JDBCCacheLoader</tt> works fine on data previously created
* <tt>JDBCCacheLoaderOld</tt>.
*
* @author Mircea.Markus@iquestint.com
* @version 1.0
*/
@Test(groups = {"functional"}, sequential = true)
@SuppressWarnings("deprecation")
public class AdjListJDBCCacheLoaderCompatibilityTest
{

   @SuppressWarnings("deprecation")
   private JDBCCacheLoaderOld oldImpl;
   private JDBCCacheLoader newImpl;
   private CacheSPI cache, cache2;


   /**
    * Note : newImpl is not started here but in each individual test. That's because on start it performs
    * some backward compatibility logic.
    *
    * @see JDBCCacheLoader#start()
    */
   @BeforeMethod(alwaysRun = true)
   public void setUp() throws Exception
   {
      newImpl = getNewCacheLoader();
      oldImpl = getOldLoader();
      cache = (CacheSPI) new UnitTestCacheFactory<Object, Object>().createCache();
      cache2 = (CacheSPI) new UnitTestCacheFactory<Object, Object>().createCache();
      newImpl.setCache(cache);//this is needed for marshaller
      oldImpl.setCache(cache2);
      oldImpl.start();
      oldImpl.remove(Fqn.ROOT);
   }

   @AfterMethod(alwaysRun = true)
   public void tearDown() throws Exception
   {
      oldImpl.remove(Fqn.ROOT);
      oldImpl.stop();
      newImpl.stop();

      TestingUtil.killCaches(cache, cache2);
      cache = null;
      cache2 = null;
   }

   public void testCommonOperations() throws Exception
   {
      newImpl.start();
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      oldImpl.put(Fqn.fromString("/a/b/e"), "key3", "value3");
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/c")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/d")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/e")));
      assertEquals("value1", newImpl.get(Fqn.fromString("/a/b/c")).get("key1"));
      assertEquals("value2", newImpl.get(Fqn.fromString("/a/b/d")).get("key2"));
      assertEquals("value3", newImpl.get(Fqn.fromString("/a/b/e")).get("key3"));
   }

   /**
    * Does the new implementation manage to successfully remove nodes created by old one?
    */
   public void testRemove() throws Exception
   {
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      oldImpl.put(Fqn.fromString("/a/b/e"), "key3", "value3");
      oldImpl.put(Fqn.fromString("/a/f/e"), "key4", "value4");
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/c")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/d")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/b/e")));
      newImpl.start();
      newImpl.remove(Fqn.fromString("/a/b"));
      assertFalse(newImpl.exists(Fqn.fromString("/a/b/c")));
      assertFalse(newImpl.exists(Fqn.fromString("/a/b/d")));
      assertFalse(newImpl.exists(Fqn.fromString("/a/b/e")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/f")));
      assertTrue(newImpl.exists(Fqn.fromString("/a/f/e")));
   }

   public void testLoadEntireState() throws Exception
   {
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      oldImpl.put(Fqn.fromString("/a/b/e"), "key3", "value3");
      oldImpl.put(Fqn.fromString("/a/f/e"), "key4", "value4");
      oldImpl.put(Fqn.ROOT, "root_key", "root_value");

      ByteArrayOutputStream newBaos = new ByteArrayOutputStream(1024);
      MarshalledValueOutputStream newOs = new MarshalledValueOutputStream(newBaos);
      newImpl.start();
      newImpl.loadEntireState(newOs);
      newImpl.getMarshaller().objectToObjectStream(DefaultStateTransferManager.STREAMING_DELIMITER_NODE, newOs);
      newOs.close();
      newImpl.remove(Fqn.ROOT);
      assertNull(newImpl.get(Fqn.fromString("/a/b/c")));
      assertNull(newImpl.get(Fqn.fromString("/a/b/d")));
      assertNull(newImpl.get(Fqn.fromString("/a/b/e")));
      assertNull(newImpl.get(Fqn.fromString("/a/f/e")));
      assertNull(newImpl.get(Fqn.ROOT));
      ByteArrayInputStream bais = new ByteArrayInputStream(newBaos.toByteArray());
      MarshalledValueInputStream is = new MarshalledValueInputStream(bais);
      newImpl.storeEntireState(is);
      assertEquals(newImpl.get(Fqn.fromString("/a/b/c")).get("key1"), "value1");
      assertEquals(newImpl.get(Fqn.fromString("/a/b/d")).get("key2"), "value2");
      assertEquals(newImpl.get(Fqn.fromString("/a/b/e")).get("key3"), "value3");
      assertEquals(newImpl.get(Fqn.fromString("/a/f/e")).get("key4"), "value4");
      assertEquals("root_value", newImpl.get(Fqn.ROOT).get("root_key"));
      assertEquals(newImpl.getNodeCount(), 8);
   }

   public void testLoadNodeState() throws Exception
   {
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      oldImpl.put(Fqn.fromString("/a/b/e"), "key3", "value3");
      oldImpl.put(Fqn.fromString("/a/f/e"), "key4", "value4");
      oldImpl.put(Fqn.ROOT, "root_key", "root_value");

      ByteArrayOutputStream newBaos = new ByteArrayOutputStream(1024);
      MarshalledValueOutputStream newOs = new MarshalledValueOutputStream(newBaos);
      newImpl.start();
      newImpl.loadState(Fqn.fromString("/a/b"), newOs);
      newImpl.getMarshaller().objectToObjectStream(DefaultStateTransferManager.STREAMING_DELIMITER_NODE, newOs);
      newOs.close();

      newImpl.remove(Fqn.fromString("/a/b"));
      assertNull(newImpl.get(Fqn.fromString("/a/b/c")));
      assertNull(newImpl.get(Fqn.fromString("/a/b/d")));
      assertNull(newImpl.get(Fqn.fromString("/a/b/e")));
      assertNull(newImpl.get(Fqn.fromString("/a/b")));

      ByteArrayInputStream bais = new ByteArrayInputStream(newBaos.toByteArray());
      MarshalledValueInputStream is = new MarshalledValueInputStream(bais);
      newImpl.storeState(Fqn.fromString("/a/b"), is);

      assertEquals(newImpl.get(Fqn.fromString("/a/b/c")).get("key1"), "value1");
      assertEquals(newImpl.get(Fqn.fromString("/a/b/d")).get("key2"), "value2");
      assertEquals(newImpl.get(Fqn.fromString("/a/b/e")).get("key3"), "value3");
      assertEquals(newImpl.get(Fqn.fromString("/a/f/e")).get("key4"), "value4");
      assertEquals(newImpl.get(Fqn.ROOT).get("root_key"), "root_value");
      assertEquals(newImpl.getNodeCount(), 8);
   }

   /**
    * getNodeDataList is a template method on which the serialisation process relies. We check here that the new
    * implementation works exactelly as the old one.
    */
   public void testGetNodeData() throws Exception
   {
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      oldImpl.put(Fqn.fromString("/a/b/e"), "key3", "value3");
      oldImpl.put(Fqn.fromString("/a/f/e"), "key4", "value4");
      oldImpl.put(Fqn.ROOT, "root_key", "root_value");
      newImpl.start();
      ArrayList<NodeData> oldList = new ArrayList<NodeData>();
      oldImpl.getNodeDataList(Fqn.ROOT, oldList);
      ArrayList<NodeData> newList = new ArrayList<NodeData>();
      newImpl.getNodeDataList(Fqn.ROOT, newList);
      assertEquals(new HashSet<NodeData>(oldList), new HashSet<NodeData>(newList));
   }

   /**
    * Tests performs some backward copatibility work. See {@link JDBCCacheLoader#start()} for details.
    */
   public void testStartWork() throws Exception
   {
      oldImpl.put(Fqn.fromString("/a/b/c"), "key1", "value1");
      oldImpl.put(Fqn.fromString("/a/b/d"), "key2", "value2");
      assertNull(oldImpl.get(Fqn.ROOT));
      newImpl.start();
      assertNotNull(newImpl.get(Fqn.ROOT));
   }


   protected CacheLoaderConfig getSingleCacheLoaderConfig(String preload, String cacheloaderClass, String properties) throws Exception
   {
      return UnitTestCacheConfigurationFactory.buildSingleCacheLoaderConfig(false, preload, cacheloaderClass, properties, false, true, false, false, false);
   }

   protected Properties getProperties() throws Exception
   {
      Properties prop = new Properties();
      try
      {
         prop.load(this.getClass().getClassLoader().getResourceAsStream("cache-jdbc.properties"));
         return prop;
      }
      catch (Exception e)
      {
         throw new Exception("Error loading jdbc properties ", e);
      }
   }

   private JDBCCacheLoader getNewCacheLoader() throws Exception
   {
      Properties prop = getProperties();

      String tablePrefix = prop.getProperty("cache.jdbc.table.name", "jbosscache");
      prop.setProperty("cache.jdbc.table.name", tablePrefix + TestingUtil.getThreadId());

      String props = "cache.jdbc.driver =" + prop.getProperty("cache.jdbc.driver") + "\n" +
            "cache.jdbc.url=" + prop.getProperty("cache.jdbc.url") + "\n" +
            "cache.jdbc.user=" + prop.getProperty("cache.jdbc.user") + "\n" +
            "cache.jdbc.password=" + prop.getProperty("cache.jdbc.password") + "\n" +
            "cache.jdbc.node.type=" + prop.getProperty("cache.jdbc.node.type") + "\n" +
            "cache.jdbc.sql-concat=" + prop.getProperty("cache.jdbc.sql-concat") + "\n" +
            "cache.jdbc.table.name=" + prop.getProperty("cache.jdbc.table.name");


      CacheLoaderConfig.IndividualCacheLoaderConfig base = getSingleCacheLoaderConfig("", "org.jboss.cache.loader.JDBCCacheLoader", props).getFirstCacheLoaderConfig();

      JDBCCacheLoader jdbcCacheLoader = new JDBCCacheLoader();
      jdbcCacheLoader.setConfig(base);
      return jdbcCacheLoader;
   }


   private JDBCCacheLoaderOld getOldLoader() throws Exception
   {
      Properties prop = getProperties();

      String tablePrefix = prop.getProperty("cache.jdbc.table.name", "jbosscache");
      prop.setProperty("cache.jdbc.table.name", tablePrefix + TestingUtil.getThreadId());
     
      String props = "cache.jdbc.driver =" + prop.getProperty("cache.jdbc.driver") + "\n" +
            "cache.jdbc.url=" + prop.getProperty("cache.jdbc.url") + "\n" +
            "cache.jdbc.user=" + prop.getProperty("cache.jdbc.user") + "\n" +
            "cache.jdbc.password=" + prop.getProperty("cache.jdbc.password") + "\n" +
            "cache.jdbc.node.type=" + prop.getProperty("cache.jdbc.node.type") + "\n" +
            "cache.jdbc.sql-concat=" + prop.getProperty("cache.jdbc.sql-concat") + "\n" +
            "cache.jdbc.table.name=" + prop.getProperty("cache.jdbc.table.name");
//                "cache.jdbc.connection.factory=org.jboss.cache.manualtests.cacheloader.OneConnectionFactory";


      CacheLoaderConfig.IndividualCacheLoaderConfig base = getSingleCacheLoaderConfig("", "org.jboss.cache.loader.JDBCCacheLoader", props).getFirstCacheLoaderConfig();
      JDBCCacheLoaderOld jdbcCacheLoader = new JDBCCacheLoaderOld();
      jdbcCacheLoader.setConfig(base);
      return jdbcCacheLoader;
   }

}
TOP

Related Classes of org.jboss.cache.loader.AdjListJDBCCacheLoaderCompatibilityTest

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.