blob: c2d062003ae40099310cbefb7545e10115c7234e [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.api.persistencemanager.detach;
import java.util.Iterator;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.shoppingcart.Cart;
import org.apache.jdo.tck.pc.shoppingcart.CartEntry;
import org.apache.jdo.tck.pc.shoppingcart.Product;
import org.apache.jdo.tck.pc.shoppingcart.Undetachable;
/** */
public abstract class DetachTest extends JDO_Test {
protected Cart cart1;
protected CartEntry cartEntry1;
protected Product product1;
protected Object cart1oid;
protected Cart goldenCart;
protected CartEntry goldenCartEntry;
protected Object[] cartClosure;
protected static final String CART_ENTRIES = "Cart.entries";
protected static final String CARTENTRY_CART = "CartEntry.cart";
protected static final String CARTENTRY_PRODUCT = "CartEntry.product";
protected static final String[] CART_FETCH_GROUPS =
new String[] {FetchPlan.DEFAULT, CART_ENTRIES, CARTENTRY_CART, CARTENTRY_PRODUCT};
/** Creates a new instance of DetachTest */
public DetachTest() {}
/**
* @see org.apache.jdo.tck.JDO_Test#localSetUp()
*/
@Override
protected void localSetUp() {
addTearDownClass(CartEntry.class);
addTearDownClass(Cart.class);
addTearDownClass(Product.class);
addTearDownClass(Undetachable.class);
Product goldenProduct = new Product("PRODUCT1", "Product 1");
goldenCart = new Cart("142857");
goldenCartEntry = goldenCart.newCartEntry(goldenProduct, 100);
product1 = new Product("PRODUCT1", "Product 1");
cart1 = new Cart("142857");
cartEntry1 = new CartEntry(cart1, goldenCartEntry.getId(), product1, 100);
cartClosure = new Object[] {cart1, cartEntry1, product1};
getPM().currentTransaction().begin();
pm.makePersistent(cart1);
cart1oid = pm.getObjectId(cart1);
pm.currentTransaction().commit();
}
/** */
protected void setCartFetchGroups() {
FetchPlan fp = getPM().getFetchPlan();
fp.setGroups(CART_FETCH_GROUPS);
fp.setMaxFetchDepth(2);
}
/**
* @param location location
* @param obj object
* @param persistent persistent option
*/
protected void checkState(String location, Object obj, boolean persistent) {
if (persistent) {
if (JDOHelper.isPersistent(obj)) return;
} else if (JDOHelper.isDetached(obj)) return;
appendMessage(
location
+ " should be "
+ (persistent ? "persistent" : "detached")
+ " but is not. The object state is: "
+ states[currentState(obj)]
+ " "
+ getStateOfInstance(obj));
}
/**
* @param location location
* @param expected expected value
* @param actual actual value
*/
protected void reportDifference(String location, long expected, long actual) {
appendMessage(location + NL + "expected: " + expected + NL + "actual: " + actual);
}
/**
* @param location location
* @param expected expected value
* @param actual actual value
*/
protected void reportDifference(String location, Object expected, Object actual) {
appendMessage(location + NL + "expected: " + expected + NL + " actual: " + actual);
}
/**
* @param location location
* @param cart cart
*/
protected void checkCartValues(String location, Cart cart) {
checkCartValues(location, cart, false);
}
/**
* @param location location
* @param cart cart
* @param persistent persistent option
*/
protected void checkCartValues(String location, Cart cart, boolean persistent) {
checkState(location + "Cart instance", cart, persistent);
if (!goldenCart.getCustomerId().equals(cart.getCustomerId()))
reportDifference(
location + " differences in cart.customerId",
goldenCart.getCustomerId(),
cart.getCustomerId());
Iterator<CartEntry> goldenCartEntries = goldenCart.getEntries();
Iterator<CartEntry> cartEntries = cart.getEntries();
while (cartEntries.hasNext()) {
CartEntry goldenCartEntry = goldenCartEntries.next();
CartEntry cartEntry = cartEntries.next();
checkState(location + "CartEntry instance", cartEntry, persistent);
Cart cartEntryCart = cartEntry.getCart();
if (cartEntryCart != cart) {
reportDifference(location + " incorrect value for cartEntry.cart", cart, cartEntryCart);
}
if (goldenCartEntry.getId() != cartEntry.getId())
reportDifference(
location + " differences in cartEntry.id", goldenCartEntry.getId(), cartEntry.getId());
if (goldenCartEntry.getQuantity() != cartEntry.getQuantity())
reportDifference(
location + " differences in cartEntry.quantity",
goldenCartEntry.getQuantity(),
cartEntry.getQuantity());
Product goldenProduct = goldenCartEntry.getProduct();
Product product = cartEntry.getProduct();
checkState(location + "Product instance", product, persistent);
if (!goldenProduct.getDescription().equals(product.getDescription()))
reportDifference(
location + " differences in product.description",
goldenProduct.getDescription(),
product.getDescription());
}
}
/**
* @param ASSERTION_FAILED assertion
* @return cart
*/
protected Cart createDetachedInstance(String ASSERTION_FAILED) {
getPM().currentTransaction().begin();
setCartFetchGroups();
pm.retrieveAll(cartClosure);
pm.setDetachAllOnCommit(true);
pm.currentTransaction().commit();
checkCartValues(ASSERTION_FAILED + "after commit with DetachAllOnCommit,", cart1);
failOnError();
pm.setDetachAllOnCommit(false);
return cart1;
}
}