[hibernate-commits] Hibernate SVN: r14962 - in core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional: classloader and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Jul 21 16:08:07 EDT 2008


Author: bstansberry at jboss.com
Date: 2008-07-21 16:08:07 -0400 (Mon, 21 Jul 2008)
New Revision: 14962

Added:
   core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/OptimisticSessionRefreshTest.java
   core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticRepeatableSessionRefreshTest.java
   core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticSessionRefreshTest.java
Modified:
   core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/classloader/ClassLoaderTestDAO.java
   core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/pessimistic-treecache.xml
Log:
Add a test of Session.refresh(...) functionality.

Added: core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/OptimisticSessionRefreshTest.java
===================================================================
--- core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/OptimisticSessionRefreshTest.java	                        (rev 0)
+++ core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/OptimisticSessionRefreshTest.java	2008-07-21 20:08:07 UTC (rev 14962)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Brian Stansberry
+ */
+
+package org.hibernate.test.cache.jbc2.functional;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.test.cache.jbc2.functional.util.IsolatedCacheTestSetup;
+
+/**
+ * A SessionRefreshTest that uses an OPTIMISTIC cache config.
+ * 
+ * @author <a href="brian.stansberry at jboss.com">Brian Stansberry</a>
+ * @version $Revision: 1 $
+ */
+public class OptimisticSessionRefreshTest extends PessimisticSessionRefreshTest
+{
+   
+   private static final String CACHE_CONFIG = "optimistic-entity";
+
+   /**
+    * Create a new OptimisticSessionRefreshTest.
+    * 
+    * @param x
+    */
+   public OptimisticSessionRefreshTest(String x)
+   {
+      super(x);
+   }
+   
+   public static Test suite() throws Exception {
+       TestSuite suite = new TestSuite(OptimisticSessionRefreshTest.class);
+       String[] acctClasses = { OUR_PACKAGE + ".Account", OUR_PACKAGE + ".AccountHolder" };
+       return new IsolatedCacheTestSetup(suite, acctClasses, CACHE_CONFIG);
+   }
+
+   @Override
+   protected String getEntityCacheConfigName() {
+       return CACHE_CONFIG;
+   } 
+
+}

Added: core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticRepeatableSessionRefreshTest.java
===================================================================
--- core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticRepeatableSessionRefreshTest.java	                        (rev 0)
+++ core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticRepeatableSessionRefreshTest.java	2008-07-21 20:08:07 UTC (rev 14962)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Brian Stansberry
+ */
+
+package org.hibernate.test.cache.jbc2.functional;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.test.cache.jbc2.functional.util.IsolatedCacheTestSetup;
+
+/**
+ * A PessimisticSessionRefreshTest that uses a REPEATABLE_READ cache config.
+ * 
+ * @author <a href="brian.stansberry at jboss.com">Brian Stansberry</a>
+ * @version $Revision: 1 $
+ */
+public class PessimisticRepeatableSessionRefreshTest extends PessimisticSessionRefreshTest
+{
+   
+   private static final String CACHE_CONFIG = "pessimistic-entity-repeatable";
+
+   /**
+    * Create a new PessimisticRepeatableSessionRefreshTest.
+    * 
+    * @param x
+    */
+   public PessimisticRepeatableSessionRefreshTest(String x)
+   {
+      super(x);
+   }
+   
+   public static Test suite() throws Exception {
+       TestSuite suite = new TestSuite(PessimisticRepeatableSessionRefreshTest.class);
+       String[] acctClasses = { OUR_PACKAGE + ".Account", OUR_PACKAGE + ".AccountHolder" };
+       return new IsolatedCacheTestSetup(suite, acctClasses, CACHE_CONFIG);
+   }
+
+   @Override
+   protected String getEntityCacheConfigName() {
+       return CACHE_CONFIG;
+   } 
+
+}

Added: core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticSessionRefreshTest.java
===================================================================
--- core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticSessionRefreshTest.java	                        (rev 0)
+++ core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/PessimisticSessionRefreshTest.java	2008-07-21 20:08:07 UTC (rev 14962)
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Brian Stansberry
+ */
+
+package org.hibernate.test.cache.jbc2.functional;
+
+import javax.transaction.TransactionManager;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.test.cache.jbc2.functional.classloader.Account;
+import org.hibernate.test.cache.jbc2.functional.classloader.ClassLoaderTestDAO;
+import org.hibernate.test.cache.jbc2.functional.util.DualNodeJtaTransactionManagerImpl;
+import org.hibernate.test.cache.jbc2.functional.util.DualNodeTestUtil;
+import org.hibernate.test.cache.jbc2.functional.util.IsolatedCacheTestSetup;
+import org.hibernate.test.cache.jbc2.functional.util.TestCacheInstanceManager;
+import org.hibernate.test.cache.jbc2.functional.util.TestJBossCacheRegionFactory;
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A test that a Session.refresh(...) operation works properly when the
+ * item being refreshed is in the 2nd level cache.
+ * 
+ * Uses the infrastructure of our dual-node tests, but 
+ * {@link #configureSecondNode(Configuration)} plays a trick and disables
+ * the 2nd level cache on the second node.  We then use that second node
+ * to simulate an external process that changes the DB while bypassing the 
+ * cache.
+ * 
+ * @author <a href="brian.stansberry at jboss.com">Brian Stansberry</a>
+ * @version $Revision: 1 $
+ */
+public class PessimisticSessionRefreshTest extends DualNodeTestCaseBase
+{
+   public static final String OUR_PACKAGE = PessimisticSessionRefreshTest.class.getPackage().getName();
+   
+   private static final String CACHE_CONFIG = "pessimistic-entity";
+   
+   protected final Logger log = LoggerFactory.getLogger(getClass());
+
+   static int test = 0;
+   
+   private Cache localCache;
+   
+   /**
+    * Create a new PessimisticSessionRefreshTest.
+    * 
+    * @param x
+    */
+   public PessimisticSessionRefreshTest(String x)
+   {
+      super(x);
+   }
+   
+   public static Test suite() throws Exception {
+       TestSuite suite = new TestSuite(PessimisticSessionRefreshTest.class);
+       String[] acctClasses = { OUR_PACKAGE + ".Account", OUR_PACKAGE + ".AccountHolder" };
+       return new IsolatedCacheTestSetup(suite, acctClasses, CACHE_CONFIG);
+   }
+   
+   // --------------------------------------------------------------- Overrides
+
+   /**
+    * Disables use of the second level cache for this session factory.
+    * 
+    * {@inheritDoc} 
+    */
+   @Override
+   protected void configureSecondNode(Configuration cfg)
+   {
+      super.configureSecondNode(cfg);
+      cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+   }
+
+   @Override
+   protected void configureCacheFactory(Configuration cfg)
+   {
+      cfg.setProperty(MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP, 
+            getEntityCacheConfigName()); 
+   }
+
+   @Override
+   protected Class getCacheRegionFactory()
+   {
+      return TestJBossCacheRegionFactory.class;
+   }
+
+   @Override
+   protected boolean getUseQueryCache()
+   {
+      return false;
+   }
+
+   protected String getEntityCacheConfigName() {
+       return CACHE_CONFIG;
+   } 
+
+   @Override
+   public String[] getMappings()
+   {
+      return new String[] { "cache/jbc2/functional/classloader/Account.hbm.xml" };
+   }
+   
+   @Override
+   protected void cleanupTransactionManagement() {
+      // Don't clean up the managers, just the transactions
+      // Managers are still needed by the long-lived caches
+      DualNodeJtaTransactionManagerImpl.cleanupTransactions();
+   }
+   
+   // ------------------------------------------------------------------  Tests
+   
+   public void testRefreshAfterExternalChange() throws Exception
+   {
+      // First session factory uses a cache
+      CacheManager localManager = TestCacheInstanceManager.getTestCacheManager(DualNodeTestUtil.LOCAL);
+      this.localCache = localManager.getCache(getEntityCacheConfigName(), true);      
+      TransactionManager localTM = localCache.getConfiguration().getRuntimeConfig().getTransactionManager();
+      SessionFactory localFactory = getEnvironment().getSessionFactory();
+      
+      // Second session factory doesn't; just needs a transaction manager
+      TransactionManager remoteTM = DualNodeJtaTransactionManagerImpl.getInstance(DualNodeTestUtil.REMOTE);
+      SessionFactory remoteFactory = getSecondNodeEnvironment().getSessionFactory();
+      
+      ClassLoaderTestDAO dao0 = new ClassLoaderTestDAO(localFactory, localTM);      
+      ClassLoaderTestDAO dao1 = new ClassLoaderTestDAO(remoteFactory, remoteTM);
+      
+      Integer id = new Integer(1);
+      dao0.createAccount(dao0.getSmith(), id, new Integer(5), DualNodeTestUtil.LOCAL);
+      
+      // Basic sanity check
+      Account acct1 = dao1.getAccount(id);
+      assertNotNull(acct1);
+      assertEquals(DualNodeTestUtil.LOCAL, acct1.getBranch());
+      
+      // This dao's session factory isn't caching, so cache won't see this change
+      dao1.updateAccountBranch(id, DualNodeTestUtil.REMOTE);
+      
+      // dao1's session doesn't touch the cache, 
+      // so reading from dao0 should show a stale value from the cache
+      // (we check to confirm the cache is used)
+      Account acct0 = dao0.getAccount(id);
+      assertNotNull(acct0);
+      assertEquals(DualNodeTestUtil.LOCAL, acct0.getBranch());
+      
+      // Now call session.refresh and confirm we get the correct value
+      acct0 = dao0.getAccountWithRefresh(id);
+      assertNotNull(acct0);
+      assertEquals(DualNodeTestUtil.REMOTE, acct0.getBranch());
+      
+      // Double check with a brand new session, in case the other session
+      // for some reason bypassed the 2nd level cache
+      ClassLoaderTestDAO dao0A = new ClassLoaderTestDAO(localFactory, localTM);
+      Account acct0A = dao0A.getAccount(id);
+      assertNotNull(acct0A);
+      assertEquals(DualNodeTestUtil.REMOTE, acct0A.getBranch());
+   }
+
+}

Modified: core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/classloader/ClassLoaderTestDAO.java
===================================================================
--- core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/classloader/ClassLoaderTestDAO.java	2008-07-18 22:13:15 UTC (rev 14961)
+++ core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/classloader/ClassLoaderTestDAO.java	2008-07-21 20:08:07 UTC (rev 14962)
@@ -163,6 +163,42 @@
        log.debug("Created account " + id);
    }
    
+   public Account getAccount(Integer id) throws Exception
+   {
+      log.debug("Getting account " + id);
+      tm.begin();
+      try {
+          Session session = sessionFactory.getCurrentSession();
+          Account acct = (Account) session.get(acctClass, id);
+          tm.commit();
+          return acct;
+      }
+      catch (Exception e) {
+          log.error("rolling back", e);
+          tm.rollback();
+          throw e;
+      }
+   }
+   
+   public Account getAccountWithRefresh(Integer id) throws Exception
+   {
+      log.debug("Getting account " + id + " with refresh");
+      tm.begin();
+      try {
+          Session session = sessionFactory.getCurrentSession();
+          Account acct  = (Account) session.get(acctClass, id);
+          session.refresh(acct);
+          acct = (Account) session.get(acctClass, id);
+          tm.commit();
+          return acct;
+      }
+      catch (Exception e) {
+          log.error("rolling back", e);
+          tm.rollback();
+          throw e;
+      }
+   }
+   
    public void updateAccountBalance(Integer id, Integer newBalance) throws Exception
    {
       log.debug("Updating account " + id + " to balance " + newBalance);

Modified: core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/pessimistic-treecache.xml
===================================================================
--- core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/pessimistic-treecache.xml	2008-07-18 22:13:15 UTC (rev 14961)
+++ core/trunk/cache-jbosscache2/src/test/java/org/hibernate/test/cache/jbc2/functional/pessimistic-treecache.xml	2008-07-21 20:08:07 UTC (rev 14962)
@@ -50,14 +50,7 @@
             Hibernate will plug in its own transaction manager integration.
         -->
 
-        <!--
-            Node isolation level : SERIALIZABLE
-                                 REPEATABLE_READ (default)
-                                 READ_COMMITTED
-                                 READ_UNCOMMITTED
-                                 NONE
-        -->
-        <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
+        <attribute name="IsolationLevel">READ_COMMITTED</attribute>
 
         <!--
              Valid modes are LOCAL




More information about the hibernate-commits mailing list