blob: bc8fe07df6fff2fe44cfb958156b19649c68654a [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.jdbc;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.RollbackException;
import org.apache.openjpa.jdbc.sql.SybaseDictionary;
import org.apache.openjpa.persistence.kernel.common.apps.Blobs;
import org.apache.openjpa.persistence.kernel.common.apps.Lobs;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
import junit.framework.AssertionFailedError;
public class TestLobs extends SingleEMFTestCase {
/**
* Support method to get a random Byte for testing.
*/
public static Byte randomByte() {
return (byte) (Math.random() * Byte.MAX_VALUE);
}
@Override
public void setUp() throws Exception {
super.setUp(DROP_TABLES, Lobs.class, Blobs.class);
}
// blob tests
public void testBlobSetToNull() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Blobs lobs = new Blobs();
lobs.setLobNotNullable(null);
lobs.setLobNullable(null);
em.persist(lobs);
try {
em.getTransaction().commit();
fail("Expected a RollbackException");
} catch (Exception e) {
assertError(e, RollbackException.class);
}
em.close();
}
public void testBlobPersistQuery() {
// test with null
EntityManager em = emf.createEntityManager();
Blobs lobs = new Blobs();
byte[] bytes = new byte[10];
for (int i = 0; i < bytes.length; i++)
bytes[i] = randomByte();
em.getTransaction().begin();
lobs.setLobNotNullable(bytes);
lobs.setLobNullable(null);
em.persist(lobs);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Blobs e");
lobs = (Blobs)query.getSingleResult();
assertTrue(lobs.getLobNullable() == null || lobs.getLobNullable().length == 0); // still an empty string
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
public void testBlobZeroLengthByteArray() throws Exception {
// test with 0 length bytes
byte[] bytes = new byte[0];
EntityManager em = emf.createEntityManager();
Blobs lobs = new Blobs();
em.getTransaction().begin();
lobs.setLobNotNullable(bytes);
lobs.setLobNullable(bytes);
em.persist(lobs);
try {
em.getTransaction().commit();
} catch (Exception e) {
if (getDBDictionary() instanceof SybaseDictionary) {
assertTrue(e instanceof RollbackException);
return;
} else {
throw e;
}
}
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Blobs e");
lobs = (Blobs)query.getSingleResult();
assertTrue(lobs.getLobNullable() == null || lobs.getLobNullable().length == 0);
assertTrue(lobs.getLobNotNullable() == null || lobs.getLobNotNullable().length == 0);
for (int i = 0; i < bytes.length; i++) {
assertEquals(bytes[i], lobs.getLobNullable()[i]);
}
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
public void testBlobLargeData() {
// test with large data
byte[] bytes = new byte[5000];
for (int i = 0; i < bytes.length; i++)
bytes[i] = randomByte();
EntityManager em = emf.createEntityManager();
Blobs lobs = new Blobs();
em.getTransaction().begin();
lobs.setLobNotNullable(bytes);
lobs.setLobNullable(bytes);
em.persist(lobs);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Blobs e");
lobs = (Blobs)query.getSingleResult();
for (int i = 0; i < 5000; i++) {
assertEquals(lobs.getLobNullable()[i], lobs.getLobNotNullable()[i]);
assertEquals(bytes[i], lobs.getLobNullable()[i]);
}
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
// lob tests
public void testLobPersistQuery() {
// test with null
EntityManager em = emf.createEntityManager();
Lobs lobs = new Lobs();
em.getTransaction().begin();
lobs.setLobNotNullable("test");
lobs.setLobNullable(null);
em.persist(lobs);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Lobs e");
lobs = (Lobs)query.getSingleResult();
// Oracle treats "" as null
assertTrue(lobs.getLobNullable() == null || lobs.getLobNullable().length() == 0); // still an empty string
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
public void testLobSetToNull() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Lobs lobs = new Lobs();
lobs.setLobNotNullable(null);
lobs.setLobNullable(null);
em.persist(lobs);
try {
em.getTransaction().commit();
fail("Expected a RollbackException");
} catch (Exception e) {
assertError(e, RollbackException.class);
}
em.close();
}
public void testLobEmptyString() {
// test with ""
EntityManager em = emf.createEntityManager();
Lobs lobs = new Lobs();
em.getTransaction().begin();
lobs.setLobNullable("");
em.persist(lobs);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Lobs e");
lobs = (Lobs)query.getSingleResult();
if (lobs.getLobNullable() != null) {
if (getDBDictionary() instanceof SybaseDictionary) {
// Sybase stores empty strings as " "
assertEquals(" ", lobs.getLobNullable());
} else {
assertEquals(0, lobs.getLobNullable().length());
}
}
if (lobs.getLobNotNullable() != null) {
if (getDBDictionary() instanceof SybaseDictionary) {
// Sybase stores empty strings as " "
assertEquals(" ", lobs.getLobNotNullable());
} else {
assertEquals(0, lobs.getLobNotNullable().length());
}
}
assertEquals(lobs.getLobNullable(), lobs.getLobNotNullable());
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
public void testLobLargeData() {
// test with large data
String temp = "";
for (int i = 0; i < 500; i++) // at 400 it changes from strings to Objects
temp = temp + "1234567890";
EntityManager em = emf.createEntityManager();
Lobs lobs = new Lobs();
em.getTransaction().begin();
lobs.setLobNotNullable(temp);
lobs.setLobNullable(temp);
em.persist(lobs);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("select e from Lobs e");
lobs = (Lobs)query.getSingleResult();
assertEquals(lobs.getLobNullable(), lobs.getLobNotNullable());
assertEquals(temp, lobs.getLobNullable());
em.remove(lobs);
em.getTransaction().commit();
em.close();
}
void assertError(Throwable actual, Class<? extends Throwable> expected) {
if (!expected.isAssignableFrom(actual.getClass())) {
actual.printStackTrace();
throw new AssertionFailedError(actual.getClass().getName() + " was raised but expected "
+ expected.getName());
}
}
}