blob: b13f03b4af08e1e62bc4d3c0e48a783d3aa12746 [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
<<<<<<< Updated upstream
*
* 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
=======
*
* https://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
>>>>>>> Stashed changes
* limitations under the License.
*/
package org.apache.jdo.tck.lifecycle;
import javax.jdo.JDOOptimisticVerificationException;
import javax.jdo.PersistenceManager;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.mylib.VersionedPCPoint;
/**
* <B>Title:</B> Test NontransactionalWrite abstract base class <br>
* <B>Keywords:</B> NontransactionalWrite <br>
* <B>Assertion ID:</B> <br>
* <B>Assertion Description: </B>
*/
public abstract class NontransactionalWriteTest extends JDO_Test {
/** The ObjectId of the pc instance, set by method createAndModifyInstance. */
protected Object oid;
/**
* The original value of the X field of the pc instance, set by method createAndModifyInstance.
*/
protected static final int ORIGINAL_XVALUE = 100;
protected static final int NEW_XVALUE = 999;
protected static final int CONFLICT_XVALUE = 555;
/**
* Create a new VersionedPCPoint instance,modify its X value, and store its oid in the test class
* oid. The persistence manager referenced by the pm field (in the superclass) manages the
* nontransactional dirty instance. This method is only executed if the JDO implementation
* supports the required features, otherwise this method would be localSetUp.
*
* @return PCPoint instance
*/
protected VersionedPCPoint createAndModifyVersionedPCPoint() {
addTearDownClass(VersionedPCPoint.class);
getPM().currentTransaction().begin();
pm.currentTransaction().setNontransactionalWrite(true);
pm.currentTransaction().setNontransactionalRead(true);
pm.currentTransaction().setRetainValues(true);
VersionedPCPoint instance = new VersionedPCPoint(ORIGINAL_XVALUE, 200);
pm.makePersistent(instance);
oid = pm.getObjectId(instance);
pm.currentTransaction().commit();
instance.setX(NEW_XVALUE);
return instance;
}
/**
* Begin and rollback a transaction using the persistence manager that manages the
* nontransactional dirty instance.
*
* @param optimistic use optimistic transaction
*/
protected void beginAndRollbackTransaction(boolean optimistic) {
getPM().currentTransaction().setOptimistic(optimistic);
pm.currentTransaction().begin();
pm.currentTransaction().rollback();
}
/**
* Begin and commit a transaction using the persistence manager that manages the nontransactional
* dirty instance.
*
* @param optimistic use optimistic transaction
*/
protected void beginAndCommitTransaction(boolean optimistic) {
getPM().currentTransaction().setOptimistic(optimistic);
pm.currentTransaction().begin();
pm.currentTransaction().commit();
}
/**
* Begin and commit a transaction using the persistence manager that manages the nontransactional
* dirty instance. This transaction must fail due to a conflicting update.
*
* @param location location for error message
* @param optimistic use optimistic transaction
*/
protected void beginAndCommitTransactionFails(String location, boolean optimistic) {
getPM().currentTransaction().setOptimistic(optimistic);
pm.currentTransaction().begin();
try {
pm.currentTransaction().commit();
} catch (JDOOptimisticVerificationException ex) {
// good catch; return
return;
}
appendMessage(location + "transaction succeeded but" + " should not succeed.");
}
/**
* Check the x value of the persistent instance referenced by the oid. Use a new persistence
* manager and check the value in a new transaction so there is no interference with the
* persistence manager that managed the nontransactional dirty instance.
*
* @param location location for error message
* @param expectedXValue expected value
*/
protected void checkXValue(String location, int expectedXValue) {
PersistenceManager pmCheck = pmf.getPersistenceManager();
try {
pmCheck.currentTransaction().begin();
VersionedPCPoint instance = (VersionedPCPoint) pmCheck.getObjectById(oid, true);
int actualXValue = instance.getX();
pmCheck.currentTransaction().commit();
if (expectedXValue != actualXValue) {
appendMessage(
location + NL + "expected: " + expectedXValue + NL + " actual: " + actualXValue);
}
} finally {
cleanupPM(pmCheck);
}
}
/**
* Perform a conflicting transaction that updates the same field as the nontransactional dirty
* instance. The field value is conflictXValue. This conflicting transaction uses a new
* persistence manager.
*/
protected void conflictingUpdate() {
PersistenceManager pmConflict = pmf.getPersistenceManager();
try {
pmConflict.currentTransaction().setOptimistic(false);
pmConflict.currentTransaction().begin();
VersionedPCPoint instance = (VersionedPCPoint) pmConflict.getObjectById(oid);
instance.setX(CONFLICT_XVALUE);
pmConflict.currentTransaction().commit();
} finally {
cleanupPM(pmConflict);
}
}
/**
* Check that all Nontransactional features are supported.
*
* @param optimistic check for whether Optimistic is supported as well.
* @return true if nontransactional supported
*/
protected boolean checkNontransactionalFeaturesSupported(boolean optimistic) {
if (!checkNontransactionalWriteSupported()
|| !checkNontransactionalReadSupported()
|| !checkRetainValuesSupported()) return false;
if (optimistic) {
if (!checkOptimisticSupported()) {
return false;
}
}
return true;
}
/**
* Check if NontransactionalWrite is supported, and log a debug message if it is not.
*
* @return true if NontransactionalWriteSupported
*/
protected boolean checkNontransactionalWriteSupported() {
if (!isNontransactionalWriteSupported()) {
printUnsupportedOptionalFeatureNotTested(
getClass().getName(), "javax.jdo.option.NontransactionalWrite");
return false;
}
return true;
}
/**
* Check if NontransactionalRead is supported, and log a debug message if it is not.
*
* @return true NontransactionalReadSupported
*/
protected boolean checkNontransactionalReadSupported() {
if (!isNontransactionalReadSupported()) {
printUnsupportedOptionalFeatureNotTested(
getClass().getName(), "javax.jdo.option.NontransactionalRead");
return false;
}
return true;
}
/**
* Check if Optimistic is supported, and log a debug message if it is not.
*
* @return true if optimistic is supported
*/
protected boolean checkOptimisticSupported() {
if (!isOptimisticSupported()) {
printUnsupportedOptionalFeatureNotTested(getClass().getName(), "javax.jdo.option.Optimistic");
return false;
}
return true;
}
/**
* Check if RetainValues is supported, and log a debug message if it is not.
*
* @return true if retain values is supported
*/
protected boolean checkRetainValuesSupported() {
if (!isRetainValuesSupported()) {
printUnsupportedOptionalFeatureNotTested(
getClass().getName(), "javax.jdo.option.RetainValues");
return false;
}
return true;
}
}