blob: 3810f2da4bea0082989a0f9173ae5822a0e5b62f [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.lob;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.testing.framework.TestModel;
import org.eclipse.persistence.testing.framework.TestSuite;
import org.eclipse.persistence.testing.framework.TestVariation;
import org.eclipse.persistence.testing.framework.TestWarningException;
/**
* The test model is used to test the TopLink BLOB/CLOB support.
* Object Model: Image [id(int), script(String), picture(byte[]), audio(byte[]), commentary(char[])]
* Data Schame: IMAGE [id(NUMBER), SCRIPT(CLOB), PICTURE(BLOB)]
* CLIP [id(NUMBER), AUDIO(BLOB), COMMENTARY(CLOB)]
* Descriptor: Image --{@literal >} (IMAGE, CLIP). i.e. multiple table.
* Mappings: id -{@literal >} ID (direct-to-field mapping).
* script -{@literal >} SCRIPT (TypeConversionMapping, 'converted type': java.sql.Clob).
* picture -{@literal >} PICTURE (TypeConversionMapping, 'converted type': java.sql.Blob).
* audio -{@literal >} AUDIO (TypeConversionMapping, 'converted type': java.sql.Blob).
* Commentary -{@literal >} COMMENTARY (TypeConversionMapping, 'converted type': java.sql.Clob).
*
* NOTE: The main purpose of this test model is to test Oracle Thin driver 4k limits. TopLink overally supports
* BLOB/CLOB well with the proper JDBC drivers. One exception is Oracle thin driver, which has had a well known 4k limits
* for LOB INSERT/UPDATE since 8i. (OTN bug number 1273826).
* TopLink addresss this issue on 5.0, and with the features of: (for Oracle thin driver ONLY)
* 1. Support on database session, client/server session and theoretically session broker.
* 2. Support multiple tables.
* 3. Support nested unite of work.
* 4. Minimal Locator SELECT statement.
* 5. Client side locator settings (limits size, turn on/off the locator usage) configurable through DatabaseLogin.
* 6. Trivial overhead (two if(true) condition calls) for non Oracle thin driver usage. Easy to turn it off if the limits bug is addressed by the driver team later.
* 7. TypeConversionMapping is now recommended for the LOB mapping and the converted type are java.sql.Clob and java.sql.Blob respectively.
* 8. Support localization.
*
* @author King Wang (Aug. 2002)
* @since TopLink/Java 5.0
*/
// This is Oracle8 specific test model.
// It won't run on any platform other than Oracle.
// Moreover, this model is Oracle8 specific.
// In setup each test verifies if the current platform is an instance of
// Oracle9Platform, and will attempt to usePlatform(Oracle8Platform) if not
// (reset returns back the originally used DatabasePlatform).
public class LOBTestModel extends TestModel {
String str = "shouldBindAllParameters";
public LOBTestModel() {
setDescription("This suite tests TopLink LOB support with Oracle thin driver.");
}
@Override
public void addRequiredSystems() {
if (!getSession().getPlatform().isOracle()) {
throw new TestWarningException("WARNING: This model is not supposed to be run on databases other than Oracle.");
}
addRequiredSystem(new LOBImageModelSystem());
}
@Override
public void addTests() {
addTest(getLOBInsertTestSuite());
addTest(getLOBUpdateTestSuite());
addTest(getLOBDeleteTestSuite());
boolean usesOCI = false;
try {
((AbstractSession)getSession()).getAccessor().incrementCallCount((AbstractSession)getSession());
java.sql.DatabaseMetaData meta =((AbstractSession)getSession()).getAccessor().getConnection().getMetaData();
((AbstractSession)getSession()).getAccessor().decrementCallCount();
String url = meta.getURL();
usesOCI = url.startsWith("jdbc:oracle:oci");
} catch (java.sql.SQLException sqlException) {
}
if (usesOCI) {
addTest(getLOBOCITestSuite());
}
}
protected TestSuite getLOBInsertTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("LOB INSERT Test Suite");
Object obj = getSession().getPlatform();
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImageNullLOB()))));
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(1000, 800)))));
String str2 = "usesBatchWriting " + str;
suite.addTests(TestVariation.get(obj, str2, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(100000, 80000)))));
return suite;
}
protected TestSuite getLOBUpdateTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("LOB UPDATE Test Suite");
Object obj = getSession().getPlatform();
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBUpdateTest(ImageSimulator.generateImage(100, 100), 500))));
String str2 = "usesBatchWriting " + str;
suite.addTests(TestVariation.get(obj, str2, new LOBTestWrapper(new LOBUpdateTest(ImageSimulator.generateImage(100, 100), 120000))));
return suite;
}
protected TestSuite getLOBDeleteTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("LOB DELETE Test Suite");
Object obj = getSession().getPlatform();
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBDeleteTest(ImageSimulator.generateImage(2800, 900)))));
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBDeleteTest(ImageSimulator.generateImage(280000, 90000)))));
return suite;
}
protected TestSuite getLOBOCITestSuite() {
TestSuite suite = new TestSuite();
suite.setName("LOB OCI Test Suite");
Object obj = getSession().getPlatform();
suite.addTests(TestVariation.get(obj, str, new LOBTestWrapper(new LOBInsertTest(ImageSimulator.generateImage(240000, 120000)), false)));
return suite;
}
}