vhardy 2003/07/03 07:51:09 Modified: test-resources/org/apache/batik/test unitTesting.xml Added: test-sources/org/apache/batik/test PerformanceTest.java PerformanceTestValidator.java Log: Initial commit of PerformanceTest with validation test Revision Changes Path 1.1 xml-batik/test-sources/org/apache/batik/test/PerformanceTest.java Index: PerformanceTest.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.batik.test; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; /** * This abstract <code>Test</code> implementation instruments performance * testing. * * Derived classes need only implement the <code>runOp</code> and, * optionally, the <code>runRef</code> methods. * * The <code>setReferenceScore</code> method is used to specify * the last recorded score for the performance test and the * <code>setAllowedScoreDeviation</code> method is used to specify * the allowed deviation from the reference score. * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> * @version $Id: PerformanceTest.java,v 1.1 2003/07/03 14:51:08 vhardy Exp $ */ public abstract class PerformanceTest extends AbstractTest { /** * Reference score. -1 means there is no reference score */ protected double referenceScore = -1; /** * Allowed deviation from the reference score. 10% by default */ protected double allowedScoreDeviation = 0.1; /** * Score during last run */ protected double lastScore = -1; public double getLastScore() { return lastScore; } public double getReferenceScore() { return referenceScore; } public void setReferenceScore(double referenceScore) { this.referenceScore = referenceScore; } public double getAllowedScoreDeviation() { return allowedScoreDeviation; } public void setAllowedScoreDeviation(double allowedScoreDeviation) { this.allowedScoreDeviation = allowedScoreDeviation; } /** * Force implementations to only implement <code>runOp</code> * and other performance specific methods. */ public final TestReport run() { return super.run(); } /** * Force implementations to only implement <code>runOp</code> * and other performance specific methods. */ public final boolean runImplBasic() throws Exception { // Should never be called for a PerformanceTest return false; } /** * This implementation of runImpl runs the reference * operation (with <code>runRef</code>), then runs * the operation (with <code>runOp</code>) and checks whether * or not the score is within the allowed deviation of the * reference score. * * @see #runRef * @see #runOp */ public final TestReport runImpl() throws Exception { // Run the reference and time it the second time it // is run runRef(); long refStart = System.currentTimeMillis(); runRef(); long refEnd = System.currentTimeMillis(); double refUnit = refEnd - refStart; System.err.println(">>>>>>>>>>>>>> refUnit : " + refUnit); // Now, run the test's operation and time it the second // time it is run runOp(); long opStart = System.currentTimeMillis(); runOp(); long opEnd = System.currentTimeMillis(); double opLength = opEnd - opStart; // Compute the score double score = opLength / refUnit; this.lastScore = score; // Compare to the reference score if (referenceScore == -1) { TestReport report = reportError("no.reference.score.set"); report.addDescriptionEntry("computed.score", "" + score); return report; } else { double scoreMin = referenceScore*(1-allowedScoreDeviation); double scoreMax = referenceScore*(1+allowedScoreDeviation); if (score > scoreMax) { TestReport report = reportError("performance.regression"); report.addDescriptionEntry("reference.score", "" + referenceScore); report.addDescriptionEntry("computed.score", "" + score); report.addDescriptionEntry("score.deviation", "" + 100*((score-referenceScore)/referenceScore)); return report; } else if (score < scoreMin) { TestReport report = reportError("unexpected.performance.improvement"); report.addDescriptionEntry("reference.score", "" + referenceScore); report.addDescriptionEntry("computed.score", "" + score); report.addDescriptionEntry("score.deviation", "" + 100*((score-referenceScore)/referenceScore)); return report; } else { return reportSuccess(); } } } /** * Runs the reference operation. * By default, this runs the same BufferedImage drawing * operation 10000 times */ protected void runRef() { BufferedImage buf = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB); Graphics2D g = buf.createGraphics(); AffineTransform txf = new AffineTransform(); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g.setPaint(new Color(30, 100, 200)); for (int i=0; i<50; i++) { for (int j=0; j<20; j++) { txf.setToIdentity(); txf.translate(-100, -100); txf.rotate(j*Math.PI/100); txf.translate(100, 100); g.setTransform(txf); g.drawRect(30, 30, 140, 140); } } } /** * Runs the tested operation */ protected abstract void runOp() throws Exception; } 1.1 xml-batik/test-sources/org/apache/batik/test/PerformanceTestValidator.java Index: PerformanceTestValidator.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.batik.test; import java.io.StringWriter; import java.io.PrintWriter; import java.util.Vector; /** * Validates the operation of the <code>PerformanceTest</code> class. * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> * @version $Id: PerformanceTestValidator.java,v 1.1 2003/07/03 14:51:08 vhardy Exp $ */ public class PerformanceTestValidator extends AbstractTest { public TestReport runImpl() throws Exception { // First, work with SimplePerformanceTest to check the life // cycle of using a performance test. // =========================================================== SimplePerformanceTest p = new SimplePerformanceTest(); TestReport r = p.run(); assertTrue(!r.hasPassed()); assertTrue(r.getErrorCode().equals("no.reference.score.set")); double score = p.getLastScore(); p.setReferenceScore(score); r = p.run(); if (!r.hasPassed()) { TestReport result = reportError("unexpected.performance.test.failure"); result.addDescriptionEntry("expected.score", "" + score); result.addDescriptionEntry("actual.score", "" + p.getLastScore()); return result; } // Now, check that performance changes are detected // =========================================================== p.setReferenceScore(score*0.5); r = p.run(); assertTrue(!r.hasPassed()); if (!r.getErrorCode().equals("performance.regression")) { TestReport result = reportError("unexpected.performance.test.error.code"); result.addDescriptionEntry("expected.code", "performance.regression"); result.addDescriptionEntry("actual.code", r.getErrorCode()); result.addDescriptionEntry("expected.score", "" + score); result.addDescriptionEntry("actual.score", "" + p.getLastScore()); return result; } p.setReferenceScore(score*2); r = p.run(); assertTrue(!r.hasPassed()); if (!r.getErrorCode().equals("unexpected.performance.improvement")) { TestReport result = reportError("unexpected.performance.test.error.code"); result.addDescriptionEntry("expected.code", "unexpected.performance.improvement"); result.addDescriptionEntry("actual.code", r.getErrorCode()); result.addDescriptionEntry("expected.score", "" + score); result.addDescriptionEntry("actual.score", "" + p.getLastScore()); return result; } return reportSuccess(); } static class SimplePerformanceTest extends PerformanceTest { public void runOp() { Vector v = new Vector(); for (int i=0; i<10000; i++) { v.addElement("" + i); } for (int i=0; i<10000; i++) { if (v.contains("" + i)) { v.remove("" + i); } } } } } 1.8 +8 -1 xml-batik/test-resources/org/apache/batik/test/unitTesting.xml Index: unitTesting.xml =================================================================== RCS file: /home/cvs/xml-batik/test-resources/org/apache/batik/test/unitTesting.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- unitTesting.xml 3 Jul 2003 14:10:04 -0000 1.7 +++ unitTesting.xml 3 Jul 2003 14:51:08 -0000 1.8 @@ -45,4 +45,11 @@ <test id="memoryLeakTestValidator" class="org.apache.batik.test.MemoryLeakTestValidator" /> + <!-- ========================================================================== --> + <!-- Validates the operation of PerformanceTest --> + <!-- ========================================================================== --> + <test id="PerformanceTestValidator" class="org.apache.batik.test.PerformanceTestValidator" /> + + + </testSuite>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]