/*
* Copyright 2009-2016 Tilmann Zaeschke. All rights reserved.
*
* This file is part of ZooDB.
*
* ZooDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ZooDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ZooDB. If not, see <http://www.gnu.org/licenses/>.
*
* See the README and COPYING files for further information.
*/
package org.zoodb.test.api;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import javax.jdo.PersistenceManager;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.zoodb.api.DBArrayList;
import org.zoodb.test.testutil.TestTools;
/**
* Test harness for DBVector.
*
* @author Tilmann Zaeschke
*/
public final class DBArrayListTest {
private final static String DB_NAME = "TestDb";
private static final String ELEMENT1 = "element one";
private static final String ELEMENT2 = "second element";
private static final String ELEMENT3 = "another element";
private DBArrayList<String> _dbVector;
@BeforeClass
public static void setUpClass() {
TestTools.createDb(DB_NAME);
TestTools.defineSchema(DB_NAME, PersistentDummyImpl.class);
}
@AfterClass
public static void tearDownClass() {
TestTools.removeDb(DB_NAME);
}
/**
* Run before each test.
* The setUp method tests the put method.
*/
@Before
public void before() {
//create a DBHashtable
_dbVector = new DBArrayList<String>();
_dbVector.add(ELEMENT1);
_dbVector.add(ELEMENT2);
_dbVector.add(ELEMENT3);
}
/**
* Run after each test.
*/
@After
public void after() {
_dbVector.clear();
}
/**
* Test the clear() and size() methods.
*/
@Test
public void testClearAndSize() {
assertEquals("Check size 1", 3, _dbVector.size());
_dbVector.clear();
assertEquals("Check size 2", 0, _dbVector.size());
}
/**
* Test the iterator method iterates over the correct collection.
*/
@Test
public void testIterator() {
Iterator<String> i = _dbVector.iterator();
try {
assertEquals("Check element 1", ELEMENT1, i.next());
assertEquals("Check element 2", ELEMENT2, i.next());
assertEquals("Check element 3", ELEMENT3, i.next());
} catch (NoSuchElementException e) {
fail("This shouldn't happen since _dbHastable should contain " +
"three elements");
}
assertFalse("Check the number of remaining elements", i.hasNext());
}
/**
* Test the get method returns the correct values.
*/
@Test
public void testGet() {
assertEquals("Check element 1", ELEMENT1, _dbVector.get(0));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(1));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(2));
}
/**
* Test the set method sets the correct values.
*/
@Test
public void testSet() {
_dbVector.set(0, ELEMENT2);
_dbVector.set(1, ELEMENT1);
assertTrue("Check the number of values", _dbVector.size()==3);
assertEquals("Check element 1", ELEMENT1, _dbVector.get(1));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(0));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(2));
}
/**
* Test the remove method removes the correct values.
*/
@Test
public void testRemove() {
_dbVector.remove(1);
assertEquals("Check element 1", ELEMENT1, _dbVector.get(0));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(1));
assertTrue("Check the number of values", _dbVector.size()==2);
}
/**
* Test the remove method removes the correct values.
*/
@Test
public void testRemove2() {
_dbVector.remove(ELEMENT2);
assertEquals("Check element 1", ELEMENT1, _dbVector.get(0));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(1));
assertTrue("Check the number of values", _dbVector.size()==2);
}
/**
* Test the addAll methods add the correct values.
*/
@Test
public void testAddAll() {
LinkedList<String> l = new LinkedList<String>();
l.add(ELEMENT3);
l.add(ELEMENT2);
l.add(ELEMENT1);
_dbVector.addAll(l);
assertTrue("Check the number of values", _dbVector.size()==6);
assertEquals("Check element 1", ELEMENT1, _dbVector.get(0));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(1));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(2));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(3));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(4));
assertEquals("Check element 1", ELEMENT1, _dbVector.get(5));
_dbVector.addAll(1, l);
assertTrue("Check the number of values", _dbVector.size()==9);
assertEquals("Check element 1", ELEMENT1, _dbVector.get(0));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(1));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(2));
assertEquals("Check element 1", ELEMENT1, _dbVector.get(3));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(4));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(5));
assertEquals("Check element 3", ELEMENT3, _dbVector.get(6));
assertEquals("Check element 2", ELEMENT2, _dbVector.get(7));
assertEquals("Check element 1", ELEMENT1, _dbVector.get(8));
}
/**
* Test the values method returns the correct collection.
*/
@Test
public void testToArray() {
Object[] arrayO = _dbVector.toArray();
assertTrue("Check the number of values", arrayO.length==3);
assertEquals("Check value 1", ELEMENT1, arrayO[0]);
assertEquals("Check value 2", ELEMENT2, arrayO[1]);
assertEquals("Check value 3", ELEMENT3, arrayO[2]);
String[] array = _dbVector.toArray(new String[0]);
assertTrue("Check the number of values", array.length==3);
assertEquals("Check value 1", ELEMENT1, array[0]);
assertEquals("Check value 2", ELEMENT2, array[1]);
assertEquals("Check value 3", ELEMENT3, array[2]);
array = _dbVector.toArray(new String[10]);
assertTrue("Check the number of values", array.length==10);
assertEquals("Check value 1", ELEMENT1, array[0]);
assertEquals("Check value 2", ELEMENT2, array[1]);
assertEquals("Check value 3", ELEMENT3, array[2]);
assertEquals("Check value 4", null, array[3]);
}
/**
* test batch loading.
*/
@SuppressWarnings("unchecked")
@Test
public void testBatchLoading() {
System.out.println("Batch-test");
PersistenceManager pm = null;
Object oid = null;
pm = TestTools.openPM();
pm.currentTransaction().begin();
DBArrayList<Object> dbv = new DBArrayList<Object>();
// dbv.add("TestString");
for (int i = 0 ; i < 100; i++) {
dbv.add(new PersistentDummyImpl());
}
// dbv.add("TestString2");
pm.makePersistent(dbv);
oid = pm.getObjectId(dbv);
pm.currentTransaction().commit();
pm.close();
pm = null;
// pm = TestTools.openPM();
// pm.currentTransaction().begin();
// dbv = (DBArrayList<Object>) pm.getObjectById(oid);
long t1 = System.currentTimeMillis();
// for (Object o: dbv) {
// o.hashCode();
// }
long t2 = System.currentTimeMillis();
// System.out.println("NORMAL: " + (t2 - t1));
// pm.currentTransaction().commit();
// pm.close();
// pm = null;
//
// pm = TestTools.openPM();
// pm.currentTransaction().begin();
// dbv = (DBArrayList<Object>) pm.getObjectById(oid);
// t1 = System.currentTimeMillis();
// dbv.setBatchSize(1000);
// for (Object o: dbv) {
// o.hashCode();
// }
// t2 = System.currentTimeMillis();
// System.out.println("BATCHED: " + (t2 - t1));
// pm.currentTransaction().commit();
// pm.close();
// pm = null;
//
// //Close the store and load the stuff
// pm = TestTools.openPM();
// pm.currentTransaction().begin();
// dbv = (DBArrayList<Object>) pm.getObjectById(oid);
// t1 = System.currentTimeMillis();
// dbv.setBatchSize(1);
// for (Object o: dbv) {
// o.hashCode();
// }
// t2 = System.currentTimeMillis();
// System.out.println("NORMAL: " + (t2 - t1));
// pm.currentTransaction().commit();
// pm.close();
// pm = null;
//
// //Close the store and load the stuff
// pm = TestTools.openPM();
// pm.currentTransaction().begin();
// dbv = (DBArrayList<Object>) pm.getObjectById(oid);
// t1 = System.currentTimeMillis();
// dbv.setBatchSize(0);
// for (Object o: dbv) {
// o.hashCode();
// }
// t2 = System.currentTimeMillis();
// System.out.println("BATCHED: " + (t2 - t1));
// pm.currentTransaction().commit();
// pm.close();
// pm = null;
//Close the store, load the stuff and test with transient object
pm = TestTools.openPM();
pm.currentTransaction().begin();
dbv = (DBArrayList<Object>) pm.getObjectById(oid);
PersistentDummyImpl dummyTrans = new PersistentDummyImpl();
dbv.add(13, dummyTrans);
t1 = System.currentTimeMillis();
dbv.setBatchSize(0);
for (Object o: dbv) {
o.hashCode();
}
t2 = System.currentTimeMillis();
assertEquals(dummyTrans, dbv.get(13));
System.out.println("BATCHED: " + (t2 - t1));
pm.currentTransaction().commit();
pm.close();
pm = null;
//Close the store, load the stuff and test with modified object
pm = TestTools.openPM();
pm.currentTransaction().begin();
dbv = (DBArrayList<Object>) pm.getObjectById(oid);
((PersistentDummyImpl)dbv.get(18)).setData(new byte[]{15});
t1 = System.currentTimeMillis();
dbv.setBatchSize(0);
for (Object o: dbv) {
o.hashCode();
}
t2 = System.currentTimeMillis();
assertEquals(15, ((PersistentDummyImpl)dbv.get(18)).getData()[0]);
System.out.println("BATCHED but dirty: " + (t2 - t1));
pm.currentTransaction().rollback();
TestTools.closePM();
//TODO use setBatch() also for all other tests to verify batch loading!
//Or call these tests here again, outside the store.!
}
/**
* test batch loading.
*/
@SuppressWarnings("unchecked")
@Test
public void testBatchLoading2() {
System.out.println("Batch-test 2");
PersistenceManager pm = null;
Object oid = null;
try {
pm = TestTools.openPM();
pm.currentTransaction().begin();
DBArrayList<Object> dbv = new DBArrayList<Object>();
for (int i = 0 ; i < 120; i++) {
dbv.add(new PersistentDummyImpl());
}
pm.makePersistent(dbv);
oid = pm.getObjectId(dbv);
pm.currentTransaction().commit();
pm.close();
pm = null;
pm = TestTools.openPM();
pm.currentTransaction().begin();
dbv = (DBArrayList<Object>) pm.getObjectById(oid);
dbv.setBatchSize(110);
for (Object o: dbv) {
o.getClass();
}
pm.currentTransaction().commit();
} finally {
if (pm != null) {
pm.close();
}
}
}
}