001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: /*
051: * QueryTest.java
052: *
053: * Created on April 1, 2002, 5:47 PM
054: */
055:
056: package org.jaffa.persistence.blackboxtests;
057:
058: import junit.framework.TestCase;
059: import org.jaffa.persistence.domainobjects.*;
060: import org.jaffa.persistence.UOW;
061: import org.jaffa.persistence.Criteria;
062: import java.util.*;
063:
064: /**
065: *
066: * @author GautamJ
067: */
068: public class PerformanceTest extends TestCase {
069:
070: private UOW m_uow = null;
071:
072: /** Creates new QueryTest
073: * @param name The name of the test case.
074: */
075: public PerformanceTest(String name) {
076: super (name);
077: }
078:
079: /** Sets up the fixture, by creating the UOW. This method is called before a test is executed.
080: */
081: protected void setUp() {
082: try {
083: m_uow = new UOW();
084: } catch (Exception e) {
085: e.printStackTrace();
086: fail("Failed to create a UOW: " + e.toString());
087: }
088: }
089:
090: /** Tears down the fixture, by closing the UOW. This method is called after a test is executed.
091: */
092: protected void tearDown() {
093: try {
094: if (m_uow != null)
095: m_uow.rollback();
096: m_uow = null;
097: } catch (Exception e) {
098: e.printStackTrace();
099: fail("Failed to rollback a UOW: " + e.toString());
100: }
101: }
102:
103: /** This will first create 1000 item records.
104: * It will then read them 5 times and display the average read time.
105: */
106: public void testRead1000() {
107: try {
108: read(1000, 5);
109: } catch (Exception e) {
110: e.printStackTrace();
111: fail();
112: }
113: }
114:
115: /** It will create 1000 Item records 5 times and display the average write time.
116: */
117: public void testWrite1000() {
118: try {
119: write(1000, 5);
120: } catch (Exception e) {
121: e.printStackTrace();
122: fail();
123: }
124: }
125:
126: /** This will first create 10000 item records.
127: * It will then read them 5 times and display the average read time.
128: */
129: public void testRead10000() {
130: try {
131: read(10000, 5);
132: } catch (Exception e) {
133: e.printStackTrace();
134: fail();
135: }
136: }
137:
138: /** It will create 10000 Item records 5 times and display the average write time.
139: */
140: public void testWrite10000() {
141: try {
142: write(10000, 5);
143: } catch (Exception e) {
144: e.printStackTrace();
145: fail();
146: }
147: }
148:
149: private void read(int recordSet, int cycles) throws Exception {
150: long time = 0;
151:
152: // ensure no records exist
153: deleteItems("Z-TEST-PERF");
154:
155: // create records
156: createItems("Z-TEST-PERF", recordSet);
157:
158: // read the Record Set 'n' times to calculate the average read-time
159: for (int i = 0; i < cycles; i++)
160: time += readItems("Z-TEST-PERF", recordSet);
161:
162: // delete the record set
163: deleteItems("Z-TEST-PERF");
164:
165: // display the average read time
166: System.out.println("Average Time for reading " + recordSet
167: + " records = " + time / cycles + " ms");
168: }
169:
170: private void write(int recordSet, int cycles) throws Exception {
171: long time = 0;
172:
173: // create the Record Set 'n' times to calculate the average write-time
174: for (int i = 0; i < cycles; i++) {
175: // ensure no records exist
176: deleteItems("Z-TEST-PERF");
177:
178: // create records
179: time += createItems("Z-TEST-PERF", recordSet);
180: }
181:
182: // delete the record set
183: deleteItems("Z-TEST-PERF");
184:
185: // display the average write time
186: System.out.println("Average Time for writing " + recordSet
187: + " records = " + time / cycles + " ms");
188: }
189:
190: /** Deletes Item records having item_id like 'itemIdBeginsWith%'.
191: * This will commit the UOW and then acquire a new UOW.
192: */
193: private void deleteItems(String itemIdBeginsWith) throws Exception {
194: Criteria c = new Criteria();
195: c.setTable(ItemMeta.getName());
196: c.addCriteria(ItemMeta.ITEM_ID,
197: Criteria.RELATIONAL_BEGINS_WITH, itemIdBeginsWith);
198: for (Iterator itr = m_uow.query(c).iterator(); itr.hasNext();) {
199: Item item = (Item) itr.next();
200: m_uow.delete(item);
201: }
202:
203: // commit the exiting UOW and create a new one
204: m_uow.commit();
205: m_uow = new UOW();
206: }
207:
208: /** Creates Item records (no. of records = recordSet) having item_id like 'itemIdBeginsWith-N'.
209: * This will commit the UOW and then acquire a new UOW.
210: * It will return the time required to create the record set.
211: */
212: private long createItems(String itemIdBeginsWith, int recordSet)
213: throws Exception {
214: long time = System.currentTimeMillis();
215: for (int i = 0; i < recordSet; i++) {
216: Item item = (Item) m_uow.newPersistentInstance(Item.class);
217: item.updateItemId(itemIdBeginsWith + i);
218: m_uow.add(item);
219: }
220:
221: // commit the exiting UOW and create a new one
222: m_uow.commit();
223: time = System.currentTimeMillis() - time;
224:
225: m_uow = new UOW();
226: return time;
227: }
228:
229: /** Reads Item records having item_id like 'itemIdBeginsWith%'.
230: * An assertion error will be thrown if the no. of records retrieved does not match the input recordSet.
231: * It will return the time required to read the record set.
232: */
233: private long readItems(String itemIdBeginsWith, int recordSet)
234: throws Exception {
235: int count = 0;
236: long time = System.currentTimeMillis();
237: Criteria c = new Criteria();
238: c.setTable(ItemMeta.getName());
239: c.addCriteria(ItemMeta.ITEM_ID,
240: Criteria.RELATIONAL_BEGINS_WITH, itemIdBeginsWith);
241: for (Iterator itr = m_uow.query(c).iterator(); itr.hasNext();) {
242: Item item = (Item) itr.next();
243: ++count;
244: }
245: time = System.currentTimeMillis() - time;
246: assertEquals(count, recordSet);
247: return time;
248: }
249:
250: }
|