You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/09/27 13:54:09 UTC

svn commit: r1001682 - in /jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance: AbstractPerformanceTest.java PerformanceTestSuite.java

Author: jukka
Date: Mon Sep 27 11:54:08 2010
New Revision: 1001682

URL: http://svn.apache.org/viewvc?rev=1001682&view=rev
Log:
JCR-2695: Jackrabbit performance test suite

Remove the test repository after each test case to prevent content from previous tests from affecting other tests

Removed:
    jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/PerformanceTestSuite.java
Modified:
    jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java

Modified: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java?rev=1001682&r1=1001681&r2=1001682&view=diff
==============================================================================
--- jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java (original)
+++ jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java Mon Sep 27 11:54:08 2010
@@ -16,13 +16,17 @@
  */
 package org.apache.jackrabbit.performance;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.regex.Pattern;
 
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.SimpleCredentials;
 
@@ -36,6 +40,15 @@ import org.apache.jackrabbit.core.config
 
 public abstract class AbstractPerformanceTest {
 
+    private final int warmup = 10;
+
+    private final int runtime = 50;
+
+    private final Credentials credentials =
+        new SimpleCredentials("admin", "admin".toCharArray());
+
+    private Pattern testPattern;
+
     protected void testPerformance(String name) throws Exception {
         String only = System.getProperty("only", ".*:.*");
         int colon = only.indexOf(':');
@@ -44,12 +57,12 @@ public abstract class AbstractPerformanc
             only = only + ":-1";
         }
 
-        Pattern testPattern = Pattern.compile(only.substring(0, colon));
+        testPattern = Pattern.compile(only.substring(0, colon));
         Pattern namePattern = Pattern.compile(only.substring(colon + 1));
 
         // Create a repository using the Jackrabbit default configuration
         if (namePattern.matcher(name).matches()) {
-            testPerformance(name, getDefaultConfig(), testPattern);
+            testPerformance(name, getDefaultConfig());
         }
 
         // Create repositories for any special configurations included
@@ -65,131 +78,148 @@ public abstract class AbstractPerformanc
                     if (namePattern.matcher(repositoryName).matches()) {
                         testPerformance(
                                 repositoryName,
-                                FileUtils.openInputStream(file),
-                                testPattern);
+                                FileUtils.openInputStream(file));
                     }
                 }
             }
         }
     }
 
-    private void testPerformance(
-            String name, InputStream xml, Pattern testPattern)
+    private void testPerformance(String name, InputStream xml)
             throws Exception {
-        RepositoryImpl repository = createRepository(name, xml);
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
         try {
-            testPerformance(name, repository, testPattern);
+            IOUtils.copy(xml, buffer);
         } finally {
-            repository.shutdown();
+            xml.close();
         }
-    }
+        byte[] conf = buffer.toByteArray();
 
-    private void testPerformance(
-            String name, RepositoryImpl repository, Pattern testPattern) {
-        PerformanceTestSuite suite = new PerformanceTestSuite(
-                repository,
-                new SimpleCredentials("admin", "admin".toCharArray()));
-        runTest(suite, new LoginTest(), name, testPattern);
-        runTest(suite, new LoginLogoutTest(), name, testPattern);
-        runTest(suite, new SetPropertyTest(), name, testPattern);
-        runTest(suite, new SmallFileReadTest(), name, testPattern);
-        runTest(suite, new SmallFileWriteTest(), name, testPattern);
-        runTest(suite, new BigFileReadTest(), name, testPattern);
-        runTest(suite, new BigFileWriteTest(), name, testPattern);
-        runTest(suite, new ConcurrentReadTest(), name, testPattern);
-        runTest(suite, new ConcurrentReadWriteTest(), name, testPattern);
-        runTest(suite, new SimpleSearchTest(), name, testPattern);
-        runTest(suite, new TwoWayJoinTest(), name, testPattern);
-        runTest(suite, new ThreeWayJoinTest(), name, testPattern);
-        runTest(suite, new CreateManyChildNodesTest(), name, testPattern);
-        runTest(suite, new UpdateManyChildNodesTest(), name, testPattern);
-        runTest(suite, new TransientManyChildNodesTest(), name, testPattern);
-        runTest(suite, new CreateUserTest(), name, testPattern);
+        runTest(new LoginTest(), name, conf);
+        runTest(new LoginLogoutTest(), name, conf);
+        runTest(new SetPropertyTest(), name, conf);
+        runTest(new SmallFileReadTest(), name, conf);
+        runTest(new SmallFileWriteTest(), name, conf);
+        runTest(new BigFileReadTest(), name, conf);
+        runTest(new BigFileWriteTest(), name, conf);
+        runTest(new ConcurrentReadTest(), name, conf);
+        runTest(new ConcurrentReadWriteTest(), name, conf);
+        runTest(new SimpleSearchTest(), name, conf);
+        runTest(new TwoWayJoinTest(), name, conf);
+        runTest(new ThreeWayJoinTest(), name, conf);
+        runTest(new CreateManyChildNodesTest(), name, conf);
+        runTest(new UpdateManyChildNodesTest(), name, conf);
+        runTest(new TransientManyChildNodesTest(), name, conf);
+        runTest(new CreateUserTest(), name, conf);
         try {
-            runTest(suite, new AddGroupMembersTest(), name, testPattern);
-            runTest(suite, new GroupMemberLookupTest(), name, testPattern);
-            runTest(suite, new GroupGetMembersTest(), name, testPattern);
+            runTest(new AddGroupMembersTest(), name, conf);
+            runTest(new GroupMemberLookupTest(), name, conf);
+            runTest(new GroupGetMembersTest(), name, conf);
         } catch (NoClassDefFoundError e) {
             // ignore these tests if the required jackrabbit-api
             // extensions are not available
         }
     }
 
-    private void runTest(
-            PerformanceTestSuite suite, AbstractTest test, String name,
-            Pattern testPattern) {
-        if (!testPattern.matcher(test.toString()).matches()) {
-            return;
-        }
-
-        try {
-            DescriptiveStatistics statistics = suite.runTest(test);
-
-            File report = new File("target", test + ".txt");
-            boolean needsPrefix = !report.exists();
+    private void runTest(AbstractTest test, String name, byte[] conf) {
+        if (testPattern.matcher(test.toString()).matches()) {
+            // Create the repository directory
+            File dir = new File(
+                    new File("target", "repository"),
+                    name + "-" + test);
+            dir.mkdirs();
 
-            PrintWriter writer = new PrintWriter(
-                    new FileWriterWithEncoding(report, "UTF-8", true));
             try {
-                if (needsPrefix) {
-                    writer.format(
-                            "# %-34.34s     min     10%%     50%%     90%%     max%n",
-                            test);
+                // Copy the configuration file into the repository directory
+                File xml = new File(dir, "repository.xml");
+                OutputStream output = FileUtils.openOutputStream(xml);
+                try {
+                    output.write(conf, 0, conf.length);
+                } finally {
+                    output.close();
                 }
 
-                writer.format(
-                        "%-36.36s  %6.0f  %6.0f  %6.0f  %6.0f  %6.0f%n",
-                        name,
-                        statistics.getMin(),
-                        statistics.getPercentile(10.0),
-                        statistics.getPercentile(50.0),
-                        statistics.getPercentile(90.0),
-                        statistics.getMax());
+                // Create the repository
+                RepositoryImpl repository = createRepository(dir, xml);
+                try {
+                    // Run the test
+                    DescriptiveStatistics statistics = runTest(test, repository);
+                    if (statistics.getN() > 0) {
+                        writeReport(test.toString(), name, statistics);
+                    }
+                } finally {
+                    repository.shutdown();
+                }
+            } catch (Throwable t) {
+                System.out.println(
+                        "Unable to run " + test + ": " + t.getMessage());
             } finally {
-                writer.close();
+                FileUtils.deleteQuietly(dir);
             }
-        } catch (Throwable t) {
-            System.out.println("Unable to run " + test + ": " + t.getMessage());
         }
     }
 
-    /**
-     * Creates a named test repository with the given configuration file.
-     *
-     * @param name name of the repository
-     * @param xml input stream for reading the repository configuration
-     * @throws Exception if the repository could not be created
-     */
-    private RepositoryImpl createRepository(String name, InputStream xml)
+    private DescriptiveStatistics runTest(
+            AbstractTest test, Repository repository)
             throws Exception {
-        File directory = new File(new File("target", "repository"), name);
-        File configuration = new File(directory, "repository.xml");
+        DescriptiveStatistics statistics = new DescriptiveStatistics();
 
-        // Copy the configuration file into the repository directory
+        test.setUp(repository, credentials);
         try {
-            OutputStream output = FileUtils.openOutputStream(configuration);
-            try {
-                IOUtils.copy(xml, output);
-            } finally {
-                output.close();
+            // Run a few iterations to warm up the system
+            long warmupEnd = System.currentTimeMillis() + warmup * 1000;
+            while (System.currentTimeMillis() < warmupEnd) {
+                test.execute();
+            }
+
+            // Run test iterations, and capture the execution times
+            long runtimeEnd = System.currentTimeMillis() + runtime * 1000;
+            while (System.currentTimeMillis() < runtimeEnd) {
+                statistics.addValue(test.execute());
             }
         } finally {
-            xml.close();
+            test.tearDown();
         }
 
-        // Create the repository
-        return createRepository(directory, configuration);
+        return statistics;
+    }
+
+    private void writeReport(
+            String test, String name, DescriptiveStatistics statistics)
+            throws IOException {
+        File report = new File("target", test + ".txt");
+
+        boolean needsPrefix = !report.exists();
+        PrintWriter writer = new PrintWriter(
+                new FileWriterWithEncoding(report, "UTF-8", true));
+        try {
+            if (needsPrefix) {
+                writer.format(
+                        "# %-34.34s     min     10%%     50%%     90%%     max%n",
+                        test);
+            }
+
+            writer.format(
+                    "%-36.36s  %6.0f  %6.0f  %6.0f  %6.0f  %6.0f%n",
+                    name,
+                    statistics.getMin(),
+                    statistics.getPercentile(10.0),
+                    statistics.getPercentile(50.0),
+                    statistics.getPercentile(90.0),
+                    statistics.getMax());
+        } finally {
+            writer.close();
+        }
     }
 
     protected InputStream getDefaultConfig() {
         return RepositoryImpl.class.getResourceAsStream("repository.xml");
     }
 
-    protected RepositoryImpl createRepository(
-            File directory, File configuration)
+    protected RepositoryImpl createRepository(File dir, File xml)
             throws RepositoryException, ConfigurationException {
-        return RepositoryImpl.create(RepositoryConfig.create(
-                configuration.getPath(), directory.getPath()));
+        return RepositoryImpl.create(
+                RepositoryConfig.create(xml.getPath(), dir.getPath()));
     }
 
 }