001: /*
002:
003: Derby - Class org.apache.derbyTesting.unitTests.harness.T_MultiIterations
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derbyTesting.unitTests.harness;
023:
024: import org.apache.derby.iapi.services.monitor.Monitor;
025: import org.apache.derby.iapi.services.property.PropertyUtil;
026:
027: import java.util.Properties;
028:
029: /**
030: Abstract class which executes T_Generic. This splits the running
031: of a test into two parts, the test setup and running the test.
032: This allows the setup to be performed once, and then the
033: test itself to be run for a number of iterations. The number
034: iterations is set by the property derby.unittests.iterations
035: and defaults to 1.
036: <P>
037: Statistics are provided about each iteration in the error log. The statistics
038: are time for each iteration, used and total memory changes per iteration.
039:
040: @see T_Generic
041: */
042: public abstract class T_MultiIterations extends T_Generic {
043: protected T_MultiIterations() {
044: super ();
045: }
046:
047: /*
048: ** methods required by T_Generic
049: */
050:
051: /**
052: Run the test. The test should raise an exception if it
053: fails. runTests should return if the tests pass.
054:
055: @exception T_Fail Test code throws these
056: */
057: protected void runTests() throws T_Fail {
058:
059: setupTest();
060:
061: int iterations = 1;
062:
063: /*
064: ** The property name for the number of iterations is
065: ** derby.className.iterations. For example, if the test
066: ** class is derby.com.package.to.test.T_Tester,
067: ** the property name is derby.T_Tester.iterations.
068: */
069: String myClass = this .getClass().getName();
070: String noPackage = myClass
071: .substring(myClass.lastIndexOf('.') + 1);
072: String propertyName = "derby." + noPackage + ".iterations";
073:
074: String iter = PropertyUtil.getSystemProperty(propertyName);
075: if (iter != null) {
076: try {
077: iterations = Integer.parseInt(iter);
078: } catch (NumberFormatException nfe) {
079: // leave at one
080: }
081: if (iterations <= 0)
082: iterations = 1;
083: }
084:
085: for (int i = 0; i < iterations; i++) {
086: Runtime.getRuntime().gc();
087: long btm = Runtime.getRuntime().totalMemory();
088: long bfm = Runtime.getRuntime().freeMemory();
089: long bum = btm - bfm;
090:
091: long start = System.currentTimeMillis();
092:
093: runTestSet();
094:
095: long end = System.currentTimeMillis();
096:
097: Runtime.getRuntime().gc();
098: long atm = Runtime.getRuntime().totalMemory();
099: long afm = Runtime.getRuntime().freeMemory();
100: long aum = atm - afm;
101:
102: out.println("Iteration " + i + " took " + (end - start)
103: + "ms");
104: out.println("Total memory increased by " + (atm - btm)
105: + " is " + atm);
106: out.println("Used memory increased by " + (aum - bum)
107: + " is " + aum);
108: }
109: }
110:
111: /*
112: ** Abstract methods to implement for your test.
113: */
114:
115: /**
116: Run once to set up the test.
117:
118: @exception T_Fail Test code throws these
119: */
120: protected abstract void setupTest() throws T_Fail;
121:
122: /**
123: Run once per-iteration to run the actual test.
124:
125: @exception T_Fail Test code throws these
126: */
127: protected abstract void runTestSet() throws T_Fail;
128: }
|