blob: c16988cb424bbbd60dbe213817328f08b488ff32 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* John Vandale - initial API and implementation.
******************************************************************************/
package org.eclipse.persistence.testing.tests.history;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.models.mapping.Baby;
import org.eclipse.persistence.testing.models.mapping.BabyMonitor;
import org.eclipse.persistence.testing.models.mapping.BiDirectionInserOrderTestProject;
import org.eclipse.persistence.testing.models.mapping.BiDirectionInsertOrderTableMaker;
import org.eclipse.persistence.tools.history.HistoryFacade;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;
import org.eclipse.persistence.exceptions.DatabaseException;
// Bug 319276
public class InsertWithHistoryPolicyTest extends TestCase {
DatabaseSession dbSession;
protected DatabaseException caughtException = null;
protected static boolean isHistoryFirstCreation = true;
public InsertWithHistoryPolicyTest() {
setDescription("Tests insert for bi-directional 1 - 1 mapping with history policy.");
}
protected void setup() {
if(getSession().getPlatform().isMySQL() || getSession().getPlatform().isSybase()) {
throwWarning("This test will not work with MySQL or Sybase because it doesn't support millisecond granularity.");
}
org.eclipse.persistence.sessions.Project project = new BiDirectionInserOrderTestProject();
DatabaseLogin databaseLogin = (DatabaseLogin)getSession().getLogin().clone();
project.setLogin(databaseLogin);
dbSession = project.createDatabaseSession();
dbSession.setSessionLog(getSession().getSessionLog());
HistoryFacade.generateHistoryPolicies(dbSession);
BiDirectionInsertOrderTableMaker creator = new BiDirectionInsertOrderTableMaker();
dbSession.login();
// create or delete original tables
creator.replaceTables(dbSession);
List origTableDefs = new ArrayList(creator.getTableDefinitions());
HistoryFacade.generateHistoricalTableDefinitions(creator, dbSession);
// remove entries of tables already dealt with; only history tables remain
creator.getTableDefinitions().removeAll(origTableDefs);
boolean org_FAST_TABLE_CREATOR = false;
if (isHistoryFirstCreation && creator.isFastTableCreator()) {
// clear the flag that was set for the original tables
creator.resetFastTableCreator();
org_FAST_TABLE_CREATOR = SchemaManager.FAST_TABLE_CREATOR;
SchemaManager.FAST_TABLE_CREATOR = false;
}
try {
// create or delete history tables
creator.replaceTables(dbSession);
} finally {
if (org_FAST_TABLE_CREATOR) {
SchemaManager.FAST_TABLE_CREATOR = true;
}
}
isHistoryFirstCreation = false;
}
protected void test() {
UnitOfWork uow = dbSession.acquireUnitOfWork();
Baby baby = new Baby();
BabyMonitor monitor = new BabyMonitor();
baby.setBabyMonitor(monitor);
monitor.setBaby(baby);
uow.registerObject(baby);
try {
uow.commit();
} catch (DatabaseException dbe) {
caughtException = dbe;
}
}
protected void verify() {
if (caughtException != null) {
if (caughtException.getDatabaseErrorCode() == 1400) {//SQLException: cannot insert NULL into (non-null defined column)
throwError("Invalid attempt to insert null value into history table for non-null defined field.", caughtException);
} else {
throwError(caughtException.getMessage(), caughtException);
}
}
}
}