blob: 859d3f5000e42309ab958d57b3027416dd563cbb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.lockmgr;
import javax.persistence.EntityNotFoundException;
import javax.persistence.LockModeType;
import javax.persistence.OptimisticLockException;
import javax.persistence.TransactionRequiredException;
/**
* Test JPA 2.0 em.find(LockMode) exception behaviors with "mixed" lock manager.
*/
public class TestMixedLockManagerFindException extends SequencedActionsTest {
public void setUp() {
setUp(LockEmployee.class
, "openjpa.LockManager", "mixed"
);
commonSetUp();
}
/**
* TransactionRequiredException if there is no transaction
*/
public void testFindTxReqExceptions() {
Object[][] threadMainTxReqTest = {
{Act.CreateEm},
{Act.Find},
{Act.SaveVersion},
{Act.TestEmployee, 1, Default_FirstName},
{Act.FindWithLock, 1, LockModeType.NONE },
{Act.TestException},
{Act.FindWithLock, 1, LockModeType.READ },
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.WRITE },
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.OPTIMISTIC },
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.OPTIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.PESSIMISTIC_READ},
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.PESSIMISTIC_WRITE},
{Act.TestException, 0, TransactionRequiredException.class },
{Act.FindWithLock, 1, LockModeType.PESSIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, TransactionRequiredException.class },
{Act.CloseEm},
};
launchActionSequence("testLockTxReqExceptions()",
null, threadMainTxReqTest);
}
/*
* IllegalArgumentException if the instance is not an entity or is a
* detached entity
*/
public void testFindIllegalArgrumentExceptions() {
// Test invalid entity argument throws IllegalArgumentException.
Object[][] threadMainInvEntityIllegalArgTest = {
{Act.CreateEm},
{Act.Find},
{Act.SaveVersion},
{Act.TestEmployee, 1, Default_FirstName},
{Act.StartTx},
{Act.FindObject, null, 0, LockModeType.NONE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0, LockModeType.NONE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null, LockModeType.NONE },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.NONE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0, LockModeType.READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0, LockModeType.READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null, LockModeType.READ },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0, LockModeType.WRITE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0, LockModeType.WRITE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null, LockModeType.WRITE },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.WRITE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0, LockModeType.OPTIMISTIC },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0, LockModeType.OPTIMISTIC },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null,
LockModeType.OPTIMISTIC },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.OPTIMISTIC },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0,
LockModeType.OPTIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0,
LockModeType.OPTIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null,
LockModeType.OPTIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.OPTIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0,
LockModeType.PESSIMISTIC_READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, Object.class, 0,
LockModeType.PESSIMISTIC_READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null,
LockModeType.PESSIMISTIC_READ },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.PESSIMISTIC_READ },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0,
LockModeType.PESSIMISTIC_WRITE },
{Act.TestException, 0,
IllegalArgumentException.class },
{Act.FindObject, Object.class, 0,
LockModeType.PESSIMISTIC_WRITE },
{Act.TestException, 0,
IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null,
LockModeType.PESSIMISTIC_WRITE },
{Act.TestException, 0,
EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.PESSIMISTIC_WRITE },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.FindObject, null, 0,
LockModeType.PESSIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0,
IllegalArgumentException.class },
{Act.FindObject, Object.class, 0,
LockModeType.PESSIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0,
IllegalArgumentException.class },
{Act.FindObject, LockEmployee.class, null,
LockModeType.PESSIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, EntityNotFoundException.class },
{Act.FindObject, LockEmployee.class, Boolean.TRUE,
LockModeType.PESSIMISTIC_FORCE_INCREMENT },
{Act.TestException, 0, IllegalArgumentException.class },
{Act.CloseEm}
};
launchActionSequence("testLockIllegalArgrumentExceptions()",
"Test invalid entity.", threadMainInvEntityIllegalArgTest);
}
/*
* If a pessimistic lock mode type is specified and the entity
* contains a version attribute, the persistence provider must
* also perform optimistic version checks when obtaining the
* database lock. If these checks fail, the
* OptimisticLockException will be thrown.
*/
public void testLockOptimisticLockExceptions() {
commonLockOptimisticLockExceptions(
LockModeType.NONE, true, false);
// commonLockOptimisticLockExceptions(
// LockModeType.READ, true, false);
// commonLockOptimisticLockExceptions(
// LockModeType.WRITE, true, false);
commonLockOptimisticLockExceptions(
LockModeType.OPTIMISTIC, true, false);
commonLockOptimisticLockExceptions(
LockModeType.OPTIMISTIC_FORCE_INCREMENT, true, false);
// commonLockOptimisticLockExceptions(
// LockModeType.PESSIMISTIC_READ, false, true);
commonLockOptimisticLockExceptions(
LockModeType.PESSIMISTIC_WRITE, false, true);
commonLockOptimisticLockExceptions(
LockModeType.PESSIMISTIC_FORCE_INCREMENT, false, true);
}
public void commonLockOptimisticLockExceptions(LockModeType lockMode,
boolean expectingOptLockException1,
boolean expectingOptLockException2) {
Object[][] threadMainOptLockExTest = {
{Act.CreateEm},
{Act.Find},
{Act.SaveVersion},
{Act.TestEmployee, 1, Default_FirstName},
{Act.Clear},
{Act.NewThread, 1 },
{Act.StartThread, 1 },
{Act.Wait},
{Act.StartTx},
{Act.FindWithLock, 1, lockMode},
{Act.UpdateEmployee},
{Act.Notify, 1},
{Act.Wait},
{Act.CommitTx},
{Act.WaitAllChildren},
{Act.TestException, 0, expectingOptLockException1
? OptimisticLockException.class : null},
{Act.TestException, 1, expectingOptLockException2
? OptimisticLockException.class : null},
{Act.CloseEm}
};
Object[][] thread1OptLockExTest = {
{Act.CreateEm},
{Act.StartTx},
{Act.FindWithLock, 1, LockModeType.OPTIMISTIC},
{Act.SaveVersion},
{Act.UpdateEmployee},
{Act.Notify, 0},
{Act.Wait},
{Act.CommitTx},
{Act.Notify, 0},
{Act.CloseEm}
};
launchActionSequence("testLockOptimisticLockExceptions()", null,
threadMainOptLockExTest, thread1OptLockExTest);
}
}