/* * Rapid Beans Framework: DocumentTest.java * * Copyright Martin Bluemel, 2006 * * 31.01.2006 */ package org.rapidbeans.datasource; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import junit.framework.TestCase; import junit.textui.TestRunner; import org.rapidbeans.core.basic.IdGeneratorNumeric; import org.rapidbeans.core.basic.RapidBean; import org.rapidbeans.core.basic.RapidBeanImplParent; import org.rapidbeans.core.type.TypePropertyCollection; import org.rapidbeans.core.type.TypeRapidBean; import org.rapidbeans.core.type.TypeRapidEnum; import org.rapidbeans.domain.org.Sex; import org.rapidbeans.test.codegen.AddressBook; import org.rapidbeans.test.codegen.Person; /** * Unit Tests for class Document. * * @author Martin Bluemel */ public class BBDocumentIORuntimePerfTest extends TestCase { /** * warm up flag. */ private boolean isWarmedUp = false; /** * set up the unit test: warm up the first time. * * @throws InterruptedException * because we use Thread.sleep(). */ public void setUp() throws InterruptedException { // set the default collection class to array list to achive the // desired perfomance. TypePropertyCollection.setDefaultCollectionClass(ArrayList.class); // warm up if (!this.isWarmedUp) { System.out.println("[BBDocumentIORuntimePerfTest] warm up..."); for (int i = 0; i < 100000; i++) { RapidBeanImplParent.createInstance("org.rapidbeans.test.Person"); } this.isWarmedUp = true; } } /** * reset the default default collection class. */ public void tearDown() { try { return; } finally { TypePropertyCollection.setDefaultCollectionClass(TypePropertyCollection.DEFAULT_COLLECTION_CLASS_DEFAULT); } } /** * test write. * * @throws IOException * if IO fails * @throws InterruptedException * for Thread.sleep() */ public void testWrite() throws IOException, InterruptedException { IdGeneratorNumeric idGenerator = new IdGeneratorNumeric(); idGenerator.setMode(IdGeneratorNumeric.GENERATION_STRATEGY_COMPACT); TypeRapidBean.forName("org.rapidbeans.test.Address").setIdGenerator(idGenerator); File file = new File("testperf/testdoc.xml"); // generate 100k Persons final int number = 100000; // ----------------------------------------------------------------- // test generating a bunch of Person beans // ----------------------------------------------------------------- System.out.println("[BBDocumentIORuntimePerfTest]" + " generating " + number + " Person beans..."); Thread.sleep(100); long timeExpectedMax = 10000; long startTime = System.currentTimeMillis(); AddressBook adrbook = new AddressBook(); for (int i = 0; i < number; i++) { adrbook.addPerson(generatePerson()); } long time = System.currentTimeMillis() - startTime; assertTrue("creation of " + number + " Person beans took longer than " + timeExpectedMax + " ms: " + time + " ms", time <= timeExpectedMax); System.out.println("[BBDocumentIORuntimePerfTest]" + " generation took " + time + " ms"); Thread.sleep(100); // ----------------------------------------------------------------- // Test creating a document with that bunch of Person beans: // The beans a added to the "identity map" (pool). // ----------------------------------------------------------------- System.out.println("[BBDocumentIORuntimePerfTest]" + " creating document..."); Thread.sleep(100); timeExpectedMax = 5000; startTime = System.currentTimeMillis(); Document testdoc = new Document("testdoc", adrbook); testdoc.setUrl(file.toURI().toURL()); time = System.currentTimeMillis() - startTime; assertTrue("creation of a document with " + number + " Person beans took longer than " + timeExpectedMax + " ms: " + time + " ms", time <= timeExpectedMax); System.out.println("[BBDocumentIORuntimePerfTest]" + " document creation took " + time + " ms"); Thread.sleep(100); // ----------------------------------------------------------------- // test executing a query over that bunch of Person beans // ----------------------------------------------------------------- System.out.println("[BBDocumentIORuntimePerfTest]" + " executing query..."); Thread.sleep(100); timeExpectedMax = 500; startTime = System.currentTimeMillis(); List<RapidBean> beans = testdoc.findBeansByQuery("org.rapidbeans.test.Person[surname $ 'A.*']"); time = System.currentTimeMillis() - startTime; assertTrue("query over " + number + " Person beans took longer than " + timeExpectedMax + " ms: " + time + " ms", time <= timeExpectedMax); System.out.println("[BBDocumentIORuntimePerfTest] query took " + time + " ms"); System.out.println("[BBDocumentIORuntimePerfTest] found " + beans.size() + " Persons."); // for (int i = 0; i < 10; i++) { // if (beans.size() > i) { // System.out.println(" Person No " + (i + 1) + ": " + ((Person) // beans.get(i)).getSurname()); // } // } // ----------------------------------------------------------------- // test writing the document to a file // ----------------------------------------------------------------- System.out.println("[BBDocumentIORuntimePerfTest]" + " writing document to file " + file.getAbsolutePath() + "..."); Thread.sleep(100); timeExpectedMax = 5000; startTime = System.currentTimeMillis(); testdoc.save(); time = System.currentTimeMillis() - startTime; assertTrue("writing a document with " + number + " Person beans took longer than " + timeExpectedMax + " ms: " + time + " ms", time <= timeExpectedMax); System.out.println("[BBDocumentIORuntimePerfTest]" + " writing took " + time + " ms"); System.out.println("[BBDocumentIORuntimePerfTest]" + " file size = " + file.length() + " byte"); Thread.sleep(100); // ----------------------------------------------------------------- // test reading the document from file // - reading the file, XML parsing // - creating the beans // - adding the to the document's identity map // ----------------------------------------------------------------- Thread.sleep(100); timeExpectedMax = 25000; testdoc = null; System.out.println("[BBDocumentIORuntimePerfTest] waiting 2 seconds for" + " garbage collection..."); Thread.sleep(2000); System.out .println("[BBDocumentIORuntimePerfTest] reading document from file " + file.getAbsolutePath() + "..."); startTime = System.currentTimeMillis(); testdoc = new Document("testdoc", file); time = System.currentTimeMillis() - startTime; assertTrue("reading a document with " + number + " Person beans took longer than " + timeExpectedMax + " ms: " + time + " ms", time <= timeExpectedMax); System.out.println("[BBDocumentIORuntimePerfTest] reading took " + time + " ms"); Thread.sleep(100); file.delete(); } /** * @return a new person */ public static Person generatePerson() { Person person = new Person("\"" + generateName(3, 15) + "\" \"" + generateName(3, 20) + "\" \"19640101\""); person.setEmail(generateName(1, 15) + "@" + generateName(5, 15) + ".de"); person.setSex((Sex) TypeRapidEnum.forName("org.rapidbeans.domain.org.Sex").elementOf(random.nextInt(2))); person.setPhone(generateNumber(5, 16)); return person; } /** * the random generator. */ private static Random random = new Random(System.currentTimeMillis()); /** * @param min * minumum * @param max * maximum * @return a generatedName */ private static String generateName(final int min, final int max) { int len = min + random.nextInt(max); char[] ca = new char[len]; ca[0] = generateUpperCaseChar(); for (int i = 1; i < len; i++) { ca[i] = generateLowerCaseChar(); } return new String(ca); } /** * @param min * minimum * @param max * maximum * @return a generated number */ private static String generateNumber(final int min, final int max) { int len = min + random.nextInt(max); char[] ca = new char[len]; for (int i = 0; i < len; i++) { ca[i] = generateNumberChar(); } return new String(ca); } /** * @return a randomly generated character between A and Z */ private static char generateUpperCaseChar() { return (char) (random.nextInt(26) + 'A'); } /** * @return a randomly generated character between A and Z */ private static char generateLowerCaseChar() { return (char) (random.nextInt(26) + 'a'); } /** * @return a randomly generated character between A and Z */ private static char generateNumberChar() { return (char) (random.nextInt(10) + '0'); } // /** // * @return a new address // */ // private Address generateAddress() { // Address address = new Address(); // return address; // } /** * @param args * the args */ public static void main(final String[] args) { TestRunner.run(BBDocumentIORuntimePerfTest.class); } }