[jboss-cvs] JBossAS SVN: r104403 - in trunk/testsuite/src/main/org/jboss/test/cluster: lock and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon May 3 18:17:54 EDT 2010
Author: bstansberry at jboss.com
Date: 2010-05-03 18:17:53 -0400 (Mon, 03 May 2010)
New Revision: 104403
Removed:
trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/ReadWriteClusteredLockManagerUnitTestCase.java
trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/YieldingGloballyExclusiveClusterLockSupportUnitTestCase.java
trunk/testsuite/src/main/org/jboss/test/cluster/lock/ClusteredLockManagerTestBase.java
Log:
[JBCLUSTER-223] Move tests from AS testsuite to ha-server-api
Deleted: trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/ReadWriteClusteredLockManagerUnitTestCase.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/ReadWriteClusteredLockManagerUnitTestCase.java 2010-05-03 22:11:04 UTC (rev 104402)
+++ trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/ReadWriteClusteredLockManagerUnitTestCase.java 2010-05-03 22:17:53 UTC (rev 104403)
@@ -1,434 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.jboss.test.cluster.defaultcfg.test;
-
-import static org.easymock.EasyMock.anyLong;
-import static org.easymock.EasyMock.aryEq;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.makeThreadSafe;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.resetToNice;
-import static org.easymock.EasyMock.resetToStrict;
-import static org.easymock.EasyMock.verify;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.jboss.ha.framework.interfaces.ClusterNode;
-import org.jboss.ha.framework.interfaces.HAPartition;
-import org.jboss.ha.framework.server.lock.AbstractClusterLockSupport;
-import org.jboss.ha.framework.server.lock.LocalLockHandler;
-import org.jboss.ha.framework.server.lock.NonGloballyExclusiveClusterLockSupport;
-import org.jboss.ha.framework.server.lock.RemoteLockResponse;
-import org.jboss.ha.framework.server.lock.TimeoutException;
-import org.jboss.ha.framework.server.lock.AbstractClusterLockSupport.RpcTarget;
-import org.jboss.test.cluster.lock.ClusteredLockManagerTestBase;
-
-/**
- * Unit test of ClusteredLockManagerImpl
- *
- * @author Brian Stansberry
- *
- */
-public class ReadWriteClusteredLockManagerUnitTestCase extends ClusteredLockManagerTestBase<NonGloballyExclusiveClusterLockSupport>
-{
- /**
- * Create a new ClusteredLockManagerImplUnitTestCase.
- *
- * @param name
- */
- public ReadWriteClusteredLockManagerUnitTestCase(String name)
- {
- super(name);
- }
-
- @Override
- protected NonGloballyExclusiveClusterLockSupport createClusteredLockManager(String serviceHAName,
- HAPartition partition, LocalLockHandler handler)
- {
- return new NonGloballyExclusiveClusterLockSupport(serviceHAName, partition, handler);
- }
-
- public void testBasicRemoteLock() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 2);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller));
-
- resetToStrict(handler);
- handler.lockFromCluster("test", caller, 1000);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // Do it again; should fail as another thread from caller already
- // acquired the lock
- resetToStrict(handler); // fail if we call the local handler
- replay(handler);
-
- rsp = target.remoteLock("test", caller, 1000);
-
- assertEquals(RemoteLockResponse.Flag.REJECT, rsp.flag);
- assertEquals(caller, rsp.holder);
-
- verify(handler);
- }
-
- public void testContestedRemoteLock() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller1 = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller1));
-
- ClusterNode caller2 = testee.getCurrentView().get(2);
- assertFalse(node1.equals(caller2));
-
- resetToStrict(handler);
- handler.lockFromCluster("test", caller1, 1000);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // A call from a different caller should be rejected without need
- // to go to the LocalLockHandler
- resetToStrict(handler);
- replay(handler);
-
- rsp = target.remoteLock("test", caller2, 1000);
-
- assertEquals(RemoteLockResponse.Flag.REJECT, rsp.flag);
- assertEquals(caller1, rsp.holder);
-
- verify(handler);
- }
-
- /**
- * Test for handling concurrent calls to remoteLock when the lock
- * is in UNLOCKED state. Calls should get passed to the local lock handler,
- * which allows one to succeed and the other to throw a TimeoutException;
- * testee should react correctly.
- *
- * FIXME We are using a MockObject for the LocalLockHandler impl, and with
- * that approach we can't really get concurrent calls to it. Effect is
- * sometimes the thread that acquires the lock has already done so before
- * the other thread even invokes remoteLock, defeating the purpose of this
- * test and turning it into a variant of testContestedRemoteLock. Need to redo
- * this test with a true multithreaded local lock handler, updating the latches
- * such that both threads are in BlockingAnswer.answer at the same time.
- *
- * @throws Exception
- */
- public void testConcurrentRemoteLock() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- final RpcTarget target = testeeSet.target;
-
- ClusterNode caller1 = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller1));
-
- ClusterNode caller2 = testee.getCurrentView().get(2);
- assertFalse(node1.equals(caller2));
-
-
- resetToStrict(handler);
- makeThreadSafe(handler, true);
- // When caller 1 invokes, block before giving response
- CountDownLatch answerStartLatch = new CountDownLatch(1);
- CountDownLatch answerDoneLatch = new CountDownLatch(1);
- BlockingAnswer<Boolean> caller1Answer = new BlockingAnswer<Boolean>(Boolean.TRUE, answerStartLatch, null, answerDoneLatch);
- BlockingAnswer<Boolean> caller2Answer = new BlockingAnswer<Boolean>(new TimeoutException(caller1), answerDoneLatch, 0, null, null);
- handler.lockFromCluster("test", caller1, 1000);
- expectLastCall().andAnswer(caller1Answer);
- handler.lockFromCluster("test", caller2, 1000);
-
-
- // There is a race where t1 may have already marked the lock as LOCKED in
- // which case t2 will not call handler.lockFromCluster("test", caller2, 1000);
- // See FIXME in method javadoc. So, we use times(0, 1) to specify no
- // calls are OK
- expectLastCall().andAnswer(caller2Answer).times(0, 1);
- replay(handler);
-
- CountDownLatch startLatch1 = new CountDownLatch(1);
- CountDownLatch startLatch2 = new CountDownLatch(1);
- CountDownLatch finishedLatch = new CountDownLatch(2);
-
- RemoteLockCaller winner = new RemoteLockCaller(target, caller1, startLatch1, null, finishedLatch);
- RemoteLockCaller loser = new RemoteLockCaller(target, caller2, startLatch2, null, finishedLatch);
-
- Thread t1 = new Thread(winner);
- t1.setDaemon(true);
- Thread t2 = new Thread(loser);
- t2.setDaemon(true);
-
- try
- {
- t1.start();
- assertTrue(startLatch1.await(1, TimeUnit.SECONDS));
- // t1 should now be blocking in caller1Answer
-
- t2.start();
- assertTrue(startLatch2.await(1, TimeUnit.SECONDS));
- // t2 should now be blocking due to t1
-
- // release t1
- answerStartLatch.countDown();
-
- // wait for both to complete
- assertTrue(finishedLatch.await(1, TimeUnit.SECONDS));
-
- verify(handler);
-
- rethrow("winner had an exception", winner.getException());
- rethrow("loser had an exception", loser.getException());
-
- RemoteLockResponse rsp = winner.getResult();
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- rsp = loser.getResult();
- if (rsp.flag != RemoteLockResponse.Flag.REJECT)
- {
- assertEquals(RemoteLockResponse.Flag.FAIL, rsp.flag);
- }
- assertEquals(caller1, rsp.holder);
- }
- finally
- {
- if (t1.isAlive())
- t1.interrupt();
- if (t2.isAlive())
- t2.interrupt();
- }
- }
-
- public void testRemoteLockFailsAgainstLocalLock() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 2);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller1 = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller1));
-
- resetToStrict(handler);
- // We throw TimeoutException to indicate "node1" holds the lock
- handler.lockFromCluster("test", caller1, 1000);
- expectLastCall().andThrow(new TimeoutException(node1));
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.FAIL, rsp.flag);
- assertEquals(node1, rsp.holder);
-
- verify(handler);
-
- // A second attempt should succeed if the local lock is released
-
- resetToStrict(handler);
- // We return normally to indicate success
- handler.lockFromCluster("test", caller1, 1000);
- replay(handler);
-
- rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
- }
-
- public void testBasicClusterLockFailsAgainstLocalLock() throws Exception
- {
- basicClusterLockFailsAgainstLocalLockTest(2);
- }
-
- public void testStandaloneClusterLockFailsAgainstLocalLock() throws Exception
- {
- basicClusterLockFailsAgainstLocalLockTest(2);
- }
-
- private void basicClusterLockFailsAgainstLocalLockTest(int viewSize) throws Exception
- {
- int viewPos = viewSize == 1 ? 0 : 1;
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, viewPos, viewSize);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
-
- resetToNice(partition);
- resetToStrict(handler);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- for (int i = 0; i < viewSize - 1; i++)
- {
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- }
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 2000000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList).atLeastOnce();
-
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
- expectLastCall().andThrow(new TimeoutException(node1)).atLeastOnce();
-
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("releaseRemoteLock"),
- aryEq(new Object[]{"test", node1}),
- aryEq(AbstractClusterLockSupport.RELEASE_REMOTE_LOCK_TYPES),
- eq(true))).andReturn(new ArrayList<Object>()).atLeastOnce();
- replay(partition);
- replay(handler);
-
- assertFalse(testee.lock("test", 10));
-
- verify(partition);
- verify(handler);
- }
-
- /**
- * Test that if a member holds a lock but is then removed from the
- * view, another remote member can obtain the lock.
- *
- * @throws Exception
- */
- public void testDeadMemberCleanupAllowsRemoteLock() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- List<ClusterNode> members = testee.getCurrentView();
- ClusterNode caller1 = members.get(0);
- assertFalse(node1.equals(caller1));
-
- ClusterNode caller2 = members.get(2);
- assertFalse(node1.equals(caller2));
-
- resetToStrict(handler);
- handler.lockFromCluster("test", caller1, 1000);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // Change the view
- Vector<ClusterNode> dead = new Vector<ClusterNode>();
- dead.add(caller1);
-
- Vector<ClusterNode> all = new Vector<ClusterNode>(members);
- all.remove(caller1);
-
- resetToStrict(handler);
- expect(handler.getLockHolder("test")).andReturn(caller1);
- handler.unlockFromCluster("test", caller1);
- replay(handler);
-
- testee.membershipChanged(dead, new Vector<ClusterNode>(), all);
-
- verify(handler);
-
- // A call from a different caller should work
- resetToStrict(handler);
- handler.lockFromCluster("test", caller2, 1000);
- replay(handler);
-
- rsp = target.remoteLock("test", caller2, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
- }
-
- /**
- * Remote node acquires a lock; different remote node tries to release which is ignored.
- *
- * @throws Exception
- */
- public void testSpuriousLockReleaseIgnored2() throws Exception
- {
- TesteeSet<NonGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- NonGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller1 = testee.getCurrentView().get(0);
- ClusterNode caller2 = testee.getCurrentView().get(2);
-
- resetToStrict(partition);
- resetToStrict(handler);
-
- handler.lockFromCluster(eq("test"), eq(caller1), anyLong());
-
- expect(handler.getLockHolder("test")).andReturn(caller1);
-
- replay(partition);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1);
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
-
- target.releaseRemoteLock("test", caller2);
-
- verify(partition);
- verify(handler);
- }
-
-}
Deleted: trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/YieldingGloballyExclusiveClusterLockSupportUnitTestCase.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/YieldingGloballyExclusiveClusterLockSupportUnitTestCase.java 2010-05-03 22:11:04 UTC (rev 104402)
+++ trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/test/YieldingGloballyExclusiveClusterLockSupportUnitTestCase.java 2010-05-03 22:17:53 UTC (rev 104403)
@@ -1,190 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.jboss.test.cluster.defaultcfg.test;
-
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.resetToStrict;
-import static org.easymock.EasyMock.verify;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.jboss.ha.framework.interfaces.ClusterNode;
-import org.jboss.ha.framework.interfaces.HAPartition;
-import org.jboss.ha.framework.server.lock.YieldingGloballyExclusiveClusterLockSupport;
-import org.jboss.ha.framework.server.lock.LocalLockHandler;
-import org.jboss.ha.framework.server.lock.RemoteLockResponse;
-import org.jboss.ha.framework.server.lock.AbstractClusterLockSupport.RpcTarget;
-import org.jboss.test.cluster.lock.ClusteredLockManagerTestBase;
-
-/**
- * Unit test of ExclusiveClusterLockManager
- *
- * @author Brian Stansberry
- *
- */
-public class YieldingGloballyExclusiveClusterLockSupportUnitTestCase extends ClusteredLockManagerTestBase<YieldingGloballyExclusiveClusterLockSupport>
-{
- /**
- * Create a new ClusteredLockManagerImplUnitTestCase.
- *
- * @param name
- */
- public YieldingGloballyExclusiveClusterLockSupportUnitTestCase(String name)
- {
- super(name);
- }
-
- @Override
- protected YieldingGloballyExclusiveClusterLockSupport createClusteredLockManager(String serviceHAName,
- HAPartition partition, LocalLockHandler handler)
- {
- return new YieldingGloballyExclusiveClusterLockSupport(serviceHAName, partition, handler);
- }
-
- public void testBasicRemoteLock() throws Exception
- {
- TesteeSet<YieldingGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 2);
- YieldingGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller));
-
- resetToStrict(handler);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // Do it again; should still work
- resetToStrict(handler);
- replay(handler);
-
- rsp = target.remoteLock("test", caller, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
- }
-
- public void testContestedRemoteLock() throws Exception
- {
- TesteeSet<YieldingGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- YieldingGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- ClusterNode caller1 = testee.getCurrentView().get(0);
- assertFalse(node1.equals(caller1));
-
- ClusterNode caller2 = testee.getCurrentView().get(2);
- assertFalse(node1.equals(caller2));
-
- resetToStrict(handler);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // A call from a different caller should still work as
- // w/ supportLockOnly==false we only reject if WE hold the lock
- resetToStrict(handler);
- replay(handler);
-
- rsp = target.remoteLock("test", caller2, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- }
-
- /**
- * Test that if a member holds a lock but is then removed from the
- * view, another remote member can obtain the lock.
- *
- * @throws Exception
- */
- public void testDeadMemberCleanupAllowsRemoteLock() throws Exception
- {
- TesteeSet<YieldingGloballyExclusiveClusterLockSupport> testeeSet = getTesteeSet(node1, 1, 3);
- YieldingGloballyExclusiveClusterLockSupport testee = testeeSet.impl;
- LocalLockHandler handler = testee.getLocalHandler();
- RpcTarget target = testeeSet.target;
-
- List<ClusterNode> members = testee.getCurrentView();
- ClusterNode caller1 = members.get(0);
- assertFalse(node1.equals(caller1));
-
- ClusterNode caller2 = members.get(2);
- assertFalse(node1.equals(caller2));
-
- resetToStrict(handler);
- replay(handler);
-
- RemoteLockResponse rsp = target.remoteLock("test", caller1, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
-
- // Change the view
- Vector<ClusterNode> dead = new Vector<ClusterNode>();
- dead.add(caller1);
-
- Vector<ClusterNode> all = new Vector<ClusterNode>(members);
- all.remove(caller1);
-
- resetToStrict(handler);
- replay(handler);
-
- testee.membershipChanged(dead, new Vector<ClusterNode>(), all);
-
- verify(handler);
-
- // A call from a different caller should work
- resetToStrict(handler);
- replay(handler);
-
- rsp = target.remoteLock("test", caller2, 1000);
-
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
- assertNull(rsp.holder);
-
- verify(handler);
- }
-
-}
Deleted: trunk/testsuite/src/main/org/jboss/test/cluster/lock/ClusteredLockManagerTestBase.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/cluster/lock/ClusteredLockManagerTestBase.java 2010-05-03 22:11:04 UTC (rev 104402)
+++ trunk/testsuite/src/main/org/jboss/test/cluster/lock/ClusteredLockManagerTestBase.java 2010-05-03 22:17:53 UTC (rev 104403)
@@ -1,940 +0,0 @@
-package org.jboss.test.cluster.lock;
-
-import static org.easymock.EasyMock.and;
-import static org.easymock.EasyMock.anyLong;
-import static org.easymock.EasyMock.aryEq;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.isA;
-import static org.easymock.EasyMock.makeThreadSafe;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.reset;
-import static org.easymock.EasyMock.resetToNice;
-import static org.easymock.EasyMock.resetToStrict;
-import static org.easymock.EasyMock.same;
-import static org.easymock.EasyMock.verify;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Vector;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import junit.framework.TestCase;
-
-import org.easymock.Capture;
-import org.easymock.EasyMock;
-import org.easymock.IAnswer;
-import org.easymock.IArgumentMatcher;
-import org.jboss.ha.framework.interfaces.ClusterNode;
-import org.jboss.ha.framework.interfaces.HAPartition;
-import org.jboss.ha.framework.server.lock.AbstractClusterLockSupport;
-import org.jboss.ha.framework.server.lock.LocalLockHandler;
-import org.jboss.ha.framework.server.lock.RemoteLockResponse;
-import org.jboss.ha.framework.server.lock.AbstractClusterLockSupport.RpcTarget;
-import org.jboss.ha.framework.server.ClusterNodeFactory;
-import org.jboss.test.cluster.testutil.TestClusterNodeFactory;
-import org.jgroups.stack.IpAddress;
-
-public abstract class ClusteredLockManagerTestBase<T extends AbstractClusterLockSupport> extends TestCase
-{
-
- protected ClusterNode node1;
- protected ClusterNode node2;
- protected ClusterNode node3;
- protected final ClusterNodeFactory factory = new TestClusterNodeFactory();
-
- public static Object[] eqLockParams(ClusterNode node, long timeout)
- {
- EasyMock.reportMatcher(new LockParamsMatcher(node, timeout));
- return null;
- }
-
- protected static class LockParamsMatcher implements IArgumentMatcher
- {
- private final ClusterNode node;
- private final long timeout;
-
- LockParamsMatcher(ClusterNode node, long timeout)
- {
- this.node = node;
- this.timeout = timeout;
- }
-
- public void appendTo(StringBuffer buffer)
- {
- buffer.append("eqRemoteLockParams({\"test\",");
- buffer.append(node);
- buffer.append(',');
- buffer.append(timeout);
- buffer.append("})");
- }
-
- public boolean matches(Object arg)
- {
- if (arg instanceof Object[])
- {
- Object[] args = (Object[]) arg;
- if (args.length == 3)
- {
- if ("test".equals(args[0]) && node.equals(args[1])
- && args[2] instanceof Long)
- {
- long l = ((Long) args[2]).longValue();
- return l >= 0 && l <= timeout;
- }
- }
- }
- return false;
- }
-
- }
-
- public ClusteredLockManagerTestBase()
- {
- super();
- }
-
- public ClusteredLockManagerTestBase(String name)
- {
- super(name);
- }
-
- protected void setUp() throws Exception
- {
- super.setUp();
- node1 = factory.getClusterNode(new IpAddress("localhost", 1));
- node2 = factory.getClusterNode(new IpAddress("localhost", 2));
- node3 = factory.getClusterNode(new IpAddress("localhost", 3));
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- public void testConstructor() throws Exception
- {
- HAPartition haPartition = createNiceMock(HAPartition.class);
- LocalLockHandler handler = createNiceMock(LocalLockHandler.class);
-
- try
- {
- createClusteredLockManager(null, haPartition, handler);
- fail("Null serviceHAName should prevent construction");
- }
- catch (IllegalArgumentException good) {}
-
- try
- {
- createClusteredLockManager("test", null, handler);
- fail("Null HAPartition should prevent construction");
- }
- catch (IllegalArgumentException good) {}
-
- try
- {
- createClusteredLockManager("test", haPartition, null);
- fail("Null LocalLockHandler should prevent construction");
- }
- catch (IllegalArgumentException good) {}
-
- expect(haPartition.getClusterNode()).andReturn(node1);
- expect(haPartition.getPartitionName()).andReturn("TestPartition");
-
- replay(haPartition);
- replay(handler);
-
- T testee = createClusteredLockManager("test", haPartition, handler);
-
- assertEquals("test", testee.getServiceHAName());
- assertEquals("TestPartition", testee.getPartitionName());
- }
-
- public void testStart() throws Exception
- {
- HAPartition haPartition = createNiceMock(HAPartition.class);
- LocalLockHandler handler = createNiceMock(LocalLockHandler.class);
- expect(haPartition.getClusterNode()).andReturn(node1);
- expect(haPartition.getPartitionName()).andReturn("TestPartition");
-
- replay(haPartition);
- replay(handler);
-
- T testee = createClusteredLockManager("test", haPartition, handler);
-
- try
- {
- testee.lock("id", 1000);
- fail("Call to lock() should fail if not started");
- }
- catch (IllegalStateException good) {}
-
- try
- {
- testee.unlock("id");
- fail("Call to unlock() should fail if not started");
- }
- catch (IllegalStateException good) {}
-
- reset(haPartition);
-
- assertEquals("Current view is empty when unstarted", 0, testee.getCurrentView().size());
-
- haPartition.registerRPCHandler(eq("test"), isA(RpcTarget.class));
- haPartition.registerMembershipListener(testee);
- expect(haPartition.getClusterNodes()).andReturn(new ClusterNode[]{node1});
- replay(haPartition);
-
- testee.start();
-
- verify(haPartition);
-
- assertEquals("Current view is correct", 1, testee.getCurrentView().size());
- assertTrue(testee.getCurrentView().contains(node1));
-
- }
-
- public void testStop() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 0, 1);
- T testee = testeeSet.impl;
- HAPartition haPartition = testee.getPartition();
-
- reset(haPartition);
-
- haPartition.unregisterMembershipListener(testee);
- haPartition.unregisterRPCHandler(eq("test"), same(testeeSet.target));
-
- replay(haPartition);
-
- testee.stop();
-
- verify(haPartition);
-
- assertEquals("Current view is empty when stopped", 0, testee.getCurrentView().size());
-
- try
- {
- testee.lock("id", 1000);
- fail("Call to lock() should fail if stopped");
- }
- catch (IllegalStateException good) {}
-
- try
- {
- testee.unlock("id");
- fail("Call to unlock() should fail if stopped");
- }
- catch (IllegalStateException good) {}
-
- }
-
- public void testGetMembers() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 2);
- T testee = testeeSet.impl;
-
- List<ClusterNode> members = testee.getCurrentView();
- assertEquals(2, members.size());
- assertEquals(node1, members.get(1));
-
- ClusterNode dead = members.get(0);
- assertFalse(node1.equals(dead));
-
- Vector<ClusterNode> newView = getView(node1, 0, 3);
- newView.remove(dead);
-
- Vector<ClusterNode> addedMembers = new Vector<ClusterNode>(newView);
- addedMembers.removeAll(members);
-
- Vector<ClusterNode> deadMembers = new Vector<ClusterNode>();
- deadMembers.add(dead);
-
- testee.membershipChanged(deadMembers, addedMembers, newView);
-
- members = testee.getCurrentView();
- assertEquals(2, members.size());
- assertEquals(node1, members.get(0));
- assertFalse(node1.equals(members.get(1)));
- assertFalse(members.contains(dead));
-
- }
-
- /**
- * Simple test of acquiring a cluster-wide lock in a two node cluster
- * where local-only locks are supported.
- *
- * @throws Exception
- */
- public void testBasicClusterLock() throws Exception
- {
- basicClusterLockTest(2);
- }
-
- /**
- * Simple test of acquiring a cluster-wide lock in a cluster where the
- * caller is the only member and where local-only locks are supported.
- *
- * @throws Exception
- */
- public void testStandaloneClusterLock() throws Exception
- {
- basicClusterLockTest(1);
- }
-
- private void basicClusterLockTest(int viewSize) throws Exception
- {
- int viewPos = viewSize == 1 ? 0 : 1;
- TesteeSet<T> testeeSet = getTesteeSet(node1, viewPos, viewSize);
- AbstractClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
-
- resetToStrict(partition);
- resetToStrict(handler);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- for (int i = 0; i < viewSize - 1; i++)
- {
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- }
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
-
- replay(partition);
- replay(handler);
-
- assertTrue(testee.lock("test", 200000));
-
- verify(partition);
- verify(handler);
-
- }
-
- public void testRemoteRejectionFromSuperiorCaller() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 3);
- AbstractClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
-
- resetToNice(partition);
- resetToStrict(handler);
-
- ClusterNode superior = testee.getCurrentView().get(0);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.REJECT, superior));
-
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList).atLeastOnce();
-
- replay(partition);
- replay(handler);
-
- assertFalse(testee.lock("test", 50));
-
- verify(partition);
- verify(handler);
-
- }
-
- public void testRemoteRejectionFromInferiorCaller() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 3);
- AbstractClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
-
- resetToStrict(partition);
- resetToStrict(handler);
-
- ClusterNode inferior = testee.getCurrentView().get(2);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.REJECT, inferior));
-
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("releaseRemoteLock"),
- aryEq(new Object[]{"test", node1}),
- aryEq(AbstractClusterLockSupport.RELEASE_REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
- expectLastCall().atLeastOnce();
-
- replay(partition);
- replay(handler);
-
- assertTrue(testee.lock("test", 50));
-
- verify(partition);
- verify(handler);
-
- }
-
- public void testLocalLockingStateRejectsSuperiorRemoteCaller() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 3);
- T testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
- final RpcTarget target = testeeSet.target;
-
- ClusterNode superiorCaller = testee.getCurrentView().get(0);
- assertFalse(node1.equals(superiorCaller));
-
- resetToStrict(partition);
- makeThreadSafe(partition, true);
- resetToStrict(handler);
- makeThreadSafe(handler, true);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- // When caller 1 invokes, block before giving response
- CountDownLatch answerAwaitLatch = new CountDownLatch(1);
- CountDownLatch answerStartLatch = new CountDownLatch(1);
- CountDownLatch answerDoneLatch = new CountDownLatch(1);
- BlockingAnswer<Boolean> caller1Answer = new BlockingAnswer<Boolean>(Boolean.TRUE, answerAwaitLatch, answerStartLatch, null);
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
- expectLastCall().andAnswer(caller1Answer);
-
- replay(partition);
- replay(handler);
-
- LocalLockCaller winner = new LocalLockCaller(testee, null, null, answerDoneLatch, 500);
-
- Thread t1 = new Thread(winner);
- t1.setDaemon(true);
-
- try
- {
- t1.start();
- assertTrue(answerStartLatch.await(500, TimeUnit.SECONDS));
- // t1 should now be blocking in caller1Answer
-
- RemoteLockResponse rsp = target.remoteLock("test", superiorCaller, 1);
- assertEquals(RemoteLockResponse.Flag.REJECT, rsp.flag);
- assertEquals(node1, rsp.holder);
-
- // release t1
- answerAwaitLatch.countDown();
-
- // wait for t1 to complete
- assertTrue(answerDoneLatch.await(5, TimeUnit.SECONDS));
-
- verify(handler);
-
- rethrow("winner had an exception", winner.getException());
-
- Boolean locked = winner.getResult();
- assertEquals(Boolean.TRUE, locked);
- }
- finally
- {
- if (t1.isAlive())
- t1.interrupt();
- }
- }
-
- public void testRemoteLockingStateAllowsSuperiorRemoteCaller() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 3);
- T testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
- final RpcTarget target = testeeSet.target;
-
- ClusterNode superiorCaller = testee.getCurrentView().get(0);
- assertFalse(node1.equals(superiorCaller));
-
- resetToNice(partition); // nice as we may loop retrying and failing
- makeThreadSafe(partition, true);
- resetToStrict(handler);
- makeThreadSafe(handler, true);
-
- // When caller 1 invokes, block before giving response
- CountDownLatch answerAwaitLatch = new CountDownLatch(1);
- CountDownLatch answerStartLatch = new CountDownLatch(1);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.REJECT, superiorCaller));
-
- BlockingAnswer<ArrayList<RemoteLockResponse>> caller1Answer = new BlockingAnswer<ArrayList<RemoteLockResponse>>(rspList, answerAwaitLatch, answerStartLatch, null);
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andAnswer(caller1Answer).atLeastOnce();
-
- handler.lockFromCluster(eq("test"), eq(superiorCaller), anyLong());
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("releaseRemoteLock"),
- aryEq(new Object[]{"test", node1}),
- aryEq(AbstractClusterLockSupport.RELEASE_REMOTE_LOCK_TYPES),
- eq(true))).andReturn(new ArrayList<Object>()).atLeastOnce();
-
- replay(partition);
- replay(handler);
-
- CountDownLatch finishedLatch = new CountDownLatch(1);
- LocalLockCaller loser = new LocalLockCaller(testee, null, null, finishedLatch);
-
- Thread t1 = new Thread(loser);
- t1.setDaemon(true);
-
- try
- {
- t1.start();
- assertTrue(answerStartLatch.await(1, TimeUnit.SECONDS));
- // t1 should now be blocking in caller1Answer
-
- RemoteLockResponse rsp = target.remoteLock("test", superiorCaller, 1);
- assertEquals(RemoteLockResponse.Flag.OK, rsp.flag);
-
- // release t1
- answerAwaitLatch.countDown();
-
- // wait for t1 to complete
- assertTrue(finishedLatch.await(5, TimeUnit.SECONDS));
-
- verify(handler);
-
- rethrow("winner had an exception", loser.getException());
-
- Boolean locked = loser.getResult();
- assertEquals(Boolean.FALSE, locked);
- }
- finally
- {
- if (t1.isAlive())
- t1.interrupt();
- }
- }
-
- public void testRemoteLockingStateRejectsInferiorRemoteCaller() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 3);
- T testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
- final RpcTarget target = testeeSet.target;
-
- ClusterNode inferiorNode = testee.getCurrentView().get(2);
- assertFalse(node1.equals(inferiorNode));
-
- ClusterNode superiorNode = testee.getCurrentView().get(0);
- assertFalse(node1.equals(superiorNode));
-
- resetToStrict(partition);
- makeThreadSafe(partition, true);
- resetToStrict(handler);
- makeThreadSafe(handler, true);
-
- // When caller 1 invokes, block before giving response
- CountDownLatch answerAwaitLatch = new CountDownLatch(1);
- CountDownLatch answerStartLatch = new CountDownLatch(1);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(superiorNode, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(inferiorNode, RemoteLockResponse.Flag.REJECT, inferiorNode));
-
- BlockingAnswer<ArrayList<RemoteLockResponse>> caller1Answer =
- new BlockingAnswer<ArrayList<RemoteLockResponse>>(rspList, answerAwaitLatch, answerStartLatch, null);
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andAnswer(caller1Answer);
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("releaseRemoteLock"),
- aryEq(new Object[]{"test", node1}),
- aryEq(AbstractClusterLockSupport.RELEASE_REMOTE_LOCK_TYPES),
- eq(true))).andReturn(new ArrayList<Object>());
-
- rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(superiorNode, RemoteLockResponse.Flag.OK));
- rspList.add(new RemoteLockResponse(inferiorNode, RemoteLockResponse.Flag.OK));
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
-
- replay(partition);
- replay(handler);
-
- CountDownLatch finishedLatch = new CountDownLatch(1);
- LocalLockCaller winner = new LocalLockCaller(testee, null, null, finishedLatch);
-
- Thread t1 = new Thread(winner);
- t1.setDaemon(true);
-
- try
- {
- t1.start();
- assertTrue(answerStartLatch.await(1, TimeUnit.SECONDS));
- // t1 should now be blocking in caller1Answer
-
- RemoteLockResponse rsp = target.remoteLock("test", inferiorNode, 1);
- assertEquals(RemoteLockResponse.Flag.REJECT, rsp.flag);
- assertEquals(node1, rsp.holder);
-
- // release t1
- answerAwaitLatch.countDown();
-
- // wait for t1 to complete
- assertTrue(finishedLatch.await(5, TimeUnit.SECONDS));
-
- verify(handler);
-
- rethrow("winner had an exception", winner.getException());
-
- Boolean locked = winner.getResult();
- assertEquals(Boolean.TRUE, locked);
- }
- finally
- {
- if (t1.isAlive())
- t1.interrupt();
- }
- }
-
- /**
- * Local node acquires a lock; remote node tries to releasem which is ignored.
- *
- * @throws Exception
- */
- public void testSpuriousRemoteLockReleaseIgnored() throws Exception
- {
- TesteeSet<T> testeeSet = getTesteeSet(node1, 1, 2);
- AbstractClusterLockSupport testee = testeeSet.impl;
- HAPartition partition = testee.getPartition();
- LocalLockHandler handler = testee.getLocalHandler();
-
- ClusterNode other = testee.getCurrentView().get(0);
- resetToStrict(partition);
- resetToStrict(handler);
-
- ArrayList<RemoteLockResponse> rspList = new ArrayList<RemoteLockResponse>();
- rspList.add(new RemoteLockResponse(null, RemoteLockResponse.Flag.OK));
-
-
- expect(partition.callMethodOnCluster(eq("test"),
- eq("remoteLock"),
- eqLockParams(node1, 200000),
- aryEq(AbstractClusterLockSupport.REMOTE_LOCK_TYPES),
- eq(true))).andReturn(rspList);
-
- handler.lockFromCluster(eq("test"), eq(node1), anyLong());
-
- expect(handler.getLockHolder("test")).andReturn(node1);
-
- replay(partition);
- replay(handler);
-
- assertTrue(testee.lock("test", 200000));
- testeeSet.target.releaseRemoteLock("test", other);
-
- verify(partition);
- verify(handler);
- }
-
- protected TesteeSet<T> getTesteeSet(ClusterNode node, int viewPos, int viewSize) throws Exception
- {
- HAPartition haPartition = createNiceMock(HAPartition.class);
- LocalLockHandler handler = createNiceMock(LocalLockHandler.class);
- expect(haPartition.getClusterNode()).andReturn(node);
- expect(haPartition.getPartitionName()).andReturn("TestPartition");
-
- Capture<RpcTarget> c = new Capture<RpcTarget>();
- haPartition.registerRPCHandler(eq("test"), and(isA(RpcTarget.class), capture(c)));
- Vector<ClusterNode> view = getView(node, viewPos, viewSize);
- expect(haPartition.getClusterNodes()).andReturn(view.toArray(new ClusterNode[view.size()]));
-
- replay(haPartition);
- replay(handler);
-
- T testee = createClusteredLockManager("test", haPartition, handler);
-
- testee.start();
-
- reset(haPartition);
- reset(handler);
-
- return new TesteeSet<T>(testee, c.getValue());
- }
-
- protected abstract T createClusteredLockManager(String serviceHAName, HAPartition partition, LocalLockHandler handler);
-
- private Vector<ClusterNode> getView(ClusterNode member, int viewPos, int numMembers)
- {
- Vector<ClusterNode> all = new Vector<ClusterNode>(Arrays.asList(new ClusterNode[]{node1, node2, node3}));
- all.remove(member);
- while (all.size() > numMembers - 1) // -1 'cause we'll add one in a sec
- {
- all.remove(all.size() - 1);
- }
- all.add(viewPos, member);
-
- return all;
- }
-
- protected static void rethrow(String msg, Throwable t) throws Exception
- {
- if (t != null)
- {
- if (t instanceof AssertionError)
- {
- AssertionError rethrow = new AssertionError(msg);
- rethrow.initCause(t);
- throw rethrow;
- }
-
- throw new RuntimeException(msg, t);
- }
- }
-
- protected class TesteeSet<C extends AbstractClusterLockSupport>
- {
- public final C impl;
- public final RpcTarget target;
-
- TesteeSet(C impl, RpcTarget target)
- {
- this.impl = impl;
- this.target = target;
- }
- }
-
- /**
- * Allows EasyMock to block before returning.
- *
- * @author Brian Stansberry
- *
- * @param <T>
- */
- protected class BlockingAnswer<C> implements IAnswer<C>
- {
- private final C answer;
- private final Exception toThrow;
- private final CountDownLatch startLatch;
- private final CountDownLatch awaitlatch;
- private final CountDownLatch endLatch;
- private final long timeout;
-
- public BlockingAnswer(C answer, CountDownLatch awaitLatch, CountDownLatch startLatch, CountDownLatch endLatch)
- {
- this(answer, awaitLatch, 0, startLatch, endLatch);
- }
-
- public BlockingAnswer(C answer, CountDownLatch awaitLatch, long timeout, CountDownLatch startLatch, CountDownLatch endLatch)
- {
- this.awaitlatch = awaitLatch;
- this.startLatch = startLatch;
- this.endLatch = endLatch;
- this.timeout = timeout;
- this.answer = answer;
- this.toThrow = null;
- }
-
- public BlockingAnswer(Exception toThrow, CountDownLatch awaitLatch, long timeout, CountDownLatch startLatch, CountDownLatch endLatch)
- {
- this.awaitlatch = awaitLatch;
- this.startLatch = startLatch;
- this.endLatch = endLatch;
- this.timeout = timeout;
- this.answer = null;
- this.toThrow = toThrow;
- }
-
- public C answer() throws Throwable
- {
- if (startLatch != null)
- {
- startLatch.countDown();
- }
-
- try
- {
- if (timeout > 0)
- {
- awaitlatch.await(timeout, TimeUnit.MILLISECONDS);
- }
- else
- {
- awaitlatch.await();
- }
-
- if (toThrow != null)
- {
- throw toThrow;
- }
-
- return answer;
- }
- finally
- {
- if (endLatch != null)
- {
- endLatch.countDown();
- }
- }
- }
- }
-
- protected abstract class AbstractCaller<C> implements Runnable
- {
- private final CountDownLatch startLatch;
- private final CountDownLatch proceedLatch;
- private final CountDownLatch finishLatch;
- private C result;
- private Throwable exception;
-
- AbstractCaller(CountDownLatch startLatch,
- CountDownLatch proceedLatch, CountDownLatch finishLatch)
- {
- this.startLatch = startLatch;
- this.proceedLatch = proceedLatch;
- this.finishLatch = finishLatch;
- }
-
- public void run()
- {
- try
- {
- if (startLatch != null)
- {
- startLatch.countDown();
- }
-
- if (proceedLatch != null)
- {
- proceedLatch.await();
- }
-
- result = execute();
- }
- catch (Throwable t)
- {
- exception = t;
- }
- finally
- {
- if (finishLatch != null)
- {
- finishLatch.countDown();
- }
-
- }
- }
-
- protected abstract C execute();
-
- public C getResult()
- {
- return result;
- }
-
- public Throwable getException()
- {
- return exception;
- }
-
- }
-
- protected class RemoteLockCaller extends AbstractCaller<RemoteLockResponse>
- {
- private final RpcTarget target;
- private final ClusterNode caller;
-
- public RemoteLockCaller(RpcTarget target, ClusterNode caller, CountDownLatch startLatch,
- CountDownLatch proceedLatch, CountDownLatch finishLatch)
- {
- super(startLatch, proceedLatch, finishLatch);
- this.target = target;
- this.caller = caller;
- }
-
- protected RemoteLockResponse execute()
- {
- return target.remoteLock("test", caller, 1000);
- }
- }
-
- protected class LocalLockCaller extends AbstractCaller<Boolean>
- {
- private final AbstractClusterLockSupport target;
- private final long timeout;
-
- public LocalLockCaller(AbstractClusterLockSupport target, CountDownLatch startLatch,
- CountDownLatch proceedLatch, CountDownLatch finishLatch)
- {
- this(target, startLatch, proceedLatch, finishLatch, 3000);
- }
-
- public LocalLockCaller(AbstractClusterLockSupport target, CountDownLatch startLatch,
- CountDownLatch proceedLatch, CountDownLatch finishLatch, long timeout)
- {
- super(startLatch, proceedLatch, finishLatch);
- this.target = target;
- this.timeout = timeout;
- }
-
- protected Boolean execute()
- {
- return Boolean.valueOf(target.lock("test", timeout));
- }
- }
-
-}
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list