/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, 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.cmp2.optimisticlock.test;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import junit.framework.Test;
import org.jboss.test.JBossTestCase;
import org.jboss.test.cmp2.optimisticlock.interfaces.FacadeHome;
import org.jboss.test.cmp2.optimisticlock.interfaces.Facade;
import org.jboss.test.cmp2.optimisticlock.bug1006723.testsession.TestSessionRemoteHome;
import org.jboss.test.cmp2.optimisticlock.bug1006723.testsession.TestSessionRemote;
/**
* This class tests optimistic locking with different strategies.
*
* @author <a href="mailto:aloubyansky@hotmail.com">Alex Loubyansky</a>
*/
public class OptimisticLockUnitTestCase
extends JBossTestCase
{
// Constants -------------------------------------
private static final String ENTITY_GROUP_LOCKING = "local/EntityGroupLocking";
private static final String ENTITY_MODIFIED_LOCKING = "local/EntityModifiedLocking";
private static final String ENTITY_READ_LOCKING = "local/EntityReadLocking";
private static final String ENTITY_VERSION_LOCKING = "local/EntityVersionLocking";
private static final String ENTITY_EXPLICIT_VERSION_LOCKING = "local/EntityExplicitVersionLocking";
private static final String ENTITY_TIMESTAMP_LOCKING = "local/EntityTimestampLocking";
private static final String ENTITY_KEYGEN_LOCKING = "local/EntityKeyGeneratorLocking";
// Attributes ------------------------------------
private FacadeHome facadeHome;
/**
* entity primary key value
*/
private static final Integer id = new Integer(1);
// Constructor -----------------------------------
public OptimisticLockUnitTestCase(String name)
{
super(name);
}
// TestCase overrides ----------------------------
public static Test suite() throws Exception
{
return JBossTestCase.getDeploySetup(OptimisticLockUnitTestCase.class, "cmp2-optimisticlock.jar");
}
// Tests -----------------------------------------
public void testBug1006723() throws Exception
{
InitialContext ctx = new InitialContext();
TestSessionRemoteHome testSessionRemoteHome = (TestSessionRemoteHome)
PortableRemoteObject.narrow(ctx.lookup("ejb/TestSession"), TestSessionRemoteHome.class);
TestSessionRemote testSessionRemote = testSessionRemoteHome.create();
Long oID = testSessionRemote.setup();
testSessionRemote.test(oID);
}
public void testNullLockedFields() throws Exception
{
Facade facade = getFacadeHome().create();
facade.createCmpEntity(ENTITY_MODIFIED_LOCKING, id,
null, new Integer(1), null, "str2", null, new Double(2.2));
try
{
facade.testNullLockedFields(ENTITY_MODIFIED_LOCKING, id);
}
finally
{
tearDown(ENTITY_MODIFIED_LOCKING);
}
}
public void testKeygenStrategyPass() throws Exception
{
setup(ENTITY_KEYGEN_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testKeygenStrategyPass(ENTITY_KEYGEN_LOCKING, id);
}
finally
{
tearDown(ENTITY_KEYGEN_LOCKING);
}
}
public void testKeygenStrategyFail() throws Exception
{
setup(ENTITY_KEYGEN_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testKeygenStrategyFail(ENTITY_KEYGEN_LOCKING, id);
fail("Should have failed to update.");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_KEYGEN_LOCKING);
}
}
public void testTimestampStrategyPass() throws Exception
{
setup(ENTITY_TIMESTAMP_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testTimestampStrategyPass(ENTITY_TIMESTAMP_LOCKING, id);
}
finally
{
tearDown(ENTITY_TIMESTAMP_LOCKING);
}
}
public void testTimestampStrategyFail() throws Exception
{
setup(ENTITY_TIMESTAMP_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testTimestampStrategyFail(ENTITY_TIMESTAMP_LOCKING, id);
fail("Should have failed to update.");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_TIMESTAMP_LOCKING);
}
}
public void testVersionStrategyPass() throws Exception
{
setup(ENTITY_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testVersionStrategyPass(ENTITY_VERSION_LOCKING, id);
}
finally
{
tearDown(ENTITY_VERSION_LOCKING);
}
}
public void testVerionStrategyFail() throws Exception
{
setup(ENTITY_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testVersionStrategyFail(ENTITY_VERSION_LOCKING, id);
fail("Should have failed to update.");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_VERSION_LOCKING);
}
}
public void testExplicitVersionStrategyPass() throws Exception
{
setup(ENTITY_EXPLICIT_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testVersionStrategyPass(ENTITY_EXPLICIT_VERSION_LOCKING, id);
}
finally
{
tearDown(ENTITY_EXPLICIT_VERSION_LOCKING);
}
}
public void testExplicitVerionStrategyFail() throws Exception
{
setup(ENTITY_EXPLICIT_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testVersionStrategyFail(ENTITY_EXPLICIT_VERSION_LOCKING, id);
fail("Should have failed to update.");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_EXPLICIT_VERSION_LOCKING);
}
}
public void testExplicitVersionUpdateOnSync() throws Exception
{
setup(ENTITY_EXPLICIT_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testExplicitVersionUpdateOnSync(ENTITY_EXPLICIT_VERSION_LOCKING, id);
}
catch(Exception e)
{
fail("Locked fields are not updated on sync: " + e.getMessage());
}
finally
{
tearDown(ENTITY_EXPLICIT_VERSION_LOCKING);
}
}
public void testGroupStrategyPass() throws Exception
{
setup(ENTITY_GROUP_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testGroupStrategyPass(ENTITY_GROUP_LOCKING, id);
}
finally
{
tearDown(ENTITY_GROUP_LOCKING);
}
}
public void testGroupStrategyFail() throws Exception
{
setup(ENTITY_GROUP_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testGroupStrategyFail(ENTITY_GROUP_LOCKING, id);
fail("Should have failed to update!");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_GROUP_LOCKING);
}
}
public void testReadStrategyPass() throws Exception
{
setup(ENTITY_READ_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testReadStrategyPass(ENTITY_READ_LOCKING, id);
}
finally
{
tearDown(ENTITY_READ_LOCKING);
}
}
public void testReadStrategyFail() throws Exception
{
setup(ENTITY_READ_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testReadStrategyFail(ENTITY_READ_LOCKING, id);
fail("Should have failed to update.");
}
catch(Exception e)
{
}
finally
{
tearDown(ENTITY_READ_LOCKING);
}
}
public void testModifiedStrategyPass() throws Exception
{
setup(ENTITY_MODIFIED_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testModifiedStrategyPass(ENTITY_MODIFIED_LOCKING, id);
}
finally
{
tearDown(ENTITY_MODIFIED_LOCKING);
}
}
public void testModifiedStrategyFail() throws Exception
{
setup(ENTITY_MODIFIED_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testModifiedStrategyFail(ENTITY_MODIFIED_LOCKING, id);
fail("Should have failed to update!");
}
catch(Exception e)
{
// expected
}
finally
{
tearDown(ENTITY_MODIFIED_LOCKING);
}
}
public void testUpdateLockOnSync() throws Exception
{
setup(ENTITY_VERSION_LOCKING);
Facade facade = getFacadeHome().create();
try
{
facade.testUpdateLockOnSync(ENTITY_VERSION_LOCKING, id);
}
catch(Exception e)
{
fail("Locked fields are not updated on sync!");
}
finally
{
tearDown(ENTITY_VERSION_LOCKING);
}
}
// Private
private void setup(String jndiName) throws Exception
{
Facade facade = getFacadeHome().create();
facade.createCmpEntity(jndiName, id,
"str1", new Integer(1), new Double(1.1),
"str2", new Integer(2), new Double(2.2));
}
private void tearDown(String jndiName) throws Exception
{
Facade facade = getFacadeHome().create();
facade.safeRemove(jndiName, id);
}
private FacadeHome getFacadeHome()
throws NamingException
{
if(facadeHome == null)
{
InitialContext ic = new InitialContext();
Object ref = ic.lookup(FacadeHome.JNDI_NAME);
facadeHome = (FacadeHome) PortableRemoteObject.narrow(ref, FacadeHome.class);
}
return facadeHome;
}
}