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 2008/09/30 18:17:53 UTC

svn commit: r700519 - in /jackrabbit/sandbox/benchmark: ./ src/ src/test/ src/test/java/ src/test/java/org/ src/test/java/org/apache/ src/test/java/org/apache/jackrabbit/ src/test/java/org/apache/jackrabbit/harness/

Author: jukka
Date: Tue Sep 30 09:17:48 2008
New Revision: 700519

URL: http://svn.apache.org/viewvc?rev=700519&view=rev
Log:
Added an integration test harness project in sandbox.

Added:
    jackrabbit/sandbox/benchmark/
    jackrabbit/sandbox/benchmark/pom.xml   (with props)
    jackrabbit/sandbox/benchmark/src/
    jackrabbit/sandbox/benchmark/src/test/
    jackrabbit/sandbox/benchmark/src/test/java/
    jackrabbit/sandbox/benchmark/src/test/java/org/
    jackrabbit/sandbox/benchmark/src/test/java/org/apache/
    jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/
    jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/
    jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java   (with props)
    jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java   (with props)
    jackrabbit/sandbox/benchmark/testng.xml   (with props)

Added: jackrabbit/sandbox/benchmark/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/benchmark/pom.xml?rev=700519&view=auto
==============================================================================
--- jackrabbit/sandbox/benchmark/pom.xml (added)
+++ jackrabbit/sandbox/benchmark/pom.xml Tue Sep 30 09:17:48 2008
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd ">
+  <modelVersion>4.0.0</modelVersion>
+
+  <!-- =================================================================== -->
+  <!-- P R O J E C T  D E S C R I P T I O N                                -->
+  <!-- =================================================================== -->
+
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>4</version>
+  </parent>
+
+  <groupId>org.apache.jackrabbit</groupId>
+  <artifactId>jackrabbit-test-harness</artifactId>
+  <name>Apache Jackrabbit Test Harness</name>
+  <version>SNAPSHOT</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.testng</groupId>
+      <artifactId>testng</artifactId>
+      <classifier>jdk15</classifier>
+      <version>5.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-core</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.4</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <suiteXmlFiles>
+            <suiteXmlFile>testng.xml</suiteXmlFile>
+          </suiteXmlFiles>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
+

Propchange: jackrabbit/sandbox/benchmark/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java?rev=700519&view=auto
==============================================================================
--- jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java (added)
+++ jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java Tue Sep 30 09:17:48 2008
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.harness;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Calendar;
+import java.util.Random;
+import java.util.UUID;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.PropertyType;
+import javax.jcr.Session;
+import javax.jcr.ValueFactory;
+
+import org.apache.jackrabbit.util.Base64;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Test case that attempts to validate the following requirements:
+ * <ul>
+ *   <li>import file details:
+ *     <ul>
+ *       <li>size - 100MB,</li>
+ *       <li>number of nodes - 100 000 (40% are versionable nodes),</li>
+ *     </ul>
+ *   </li>
+ *   <li>binary properties:
+ *     <ul>
+ *       <li>number - 2000,</li>
+ *       <li>size - up to 100kB,</li> 
+ *     </ul>
+ *   </li>
+ *   <li>heap size : 1024 MB.</li>
+ * </ul>
+ * <p>
+ * To validate the above, this test case generates a virtual XML system
+ * view import file with the following characteristics:
+ * <ol>
+ *   <li>one nt:folder node</li>
+ *   <li>ten nt:folder nodes under the top level node</li>
+ *   <li>100 nt:folder nodes under each second level node</li>
+ *   <li>100 versionable nt:file nodes under each third level node</li>
+ *   <li>
+ *     one nt:resource node under each fourth level node,
+ *     each with 10k bytes of random binary content
+ *   </li>
+ * </ol>
+ * <p>
+ * This is a total of 100k files or 200+k nodes, which should well cover the
+ * above requirements.
+ */
+public class ImportMemoryTest {
+
+    private static final String JCR = "http://www.jcp.org/jcr/1.0";
+
+    private static final String NT = "http://www.jcp.org/jcr/nt/1.0";
+
+    private static final String SV = "http://www.jcp.org/jcr/sv/1.0";
+
+    private Session session;
+
+    private ContentHandler handler;
+
+    private String date;
+
+    private long nodes;
+
+    private long maxUsedMemory;
+
+    private volatile boolean running;
+
+    private Thread thread;
+
+    @BeforeMethod
+    public void login() throws Exception {
+        session = Repository.login();
+        handler = session.getImportContentHandler(
+                "/", ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
+        ValueFactory factory = session.getValueFactory();
+        date = factory.createValue(Calendar.getInstance()).getString();
+        nodes = 0;
+        maxUsedMemory = 0;
+        running = true;
+        thread = new Thread() {
+            public void run() {
+                Runtime runtime = Runtime.getRuntime();
+                long start = runtime.totalMemory() - runtime.freeMemory();
+                while (running) {
+                    try {
+                        long currentUsedMemory =
+                            runtime.totalMemory() - runtime.freeMemory() - start;
+                        System.out.println("Current: " + currentUsedMemory);
+                        if (maxUsedMemory < currentUsedMemory) {
+                            maxUsedMemory = currentUsedMemory;
+                        }
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+        };
+        thread.start();
+    }
+
+    @AfterMethod
+    public void logout() throws Exception {
+        session.logout();
+        running = false;
+        thread.join();
+    }
+
+    @Test
+    public void testMemoryUse() throws Exception {
+        handler.startDocument();
+        handler.startPrefixMapping("jcr", JCR);
+        handler.startPrefixMapping("nt", NT);
+        handler.startPrefixMapping("sv", SV);
+        handler.startPrefixMapping("", "");
+        exportTopLevelNode();
+        handler.endPrefixMapping("");
+        handler.endPrefixMapping("sv");
+        handler.endPrefixMapping("nt");
+        handler.endPrefixMapping("jcr");
+        handler.endDocument();
+
+        System.out.println("Saving...");
+        session.save();
+    }
+
+    private void exportTopLevelNode() throws Exception {
+        startNode("top", "nt:folder");
+        for (int i = 0; i < 10; i++) {
+            System.out.println("Exporting " + (i + 1) + "/10...");
+            exportSecondLevelNode(i);
+        }
+        endNode();
+    }
+
+    private void exportSecondLevelNode(int index) throws Exception {
+        startNode("folder" + index, "nt:folder");
+        for (int i = 0; i < 100; i++) {
+            exportThirdLevelNode(i);
+        }
+        endNode();
+    }
+
+    private void exportThirdLevelNode(int index) throws Exception {
+        startNode("folder" + index, "nt:folder");
+        for (int i = 0; i < 100; i++) {
+            exportFourthLevelNode(i);
+        }
+        endNode();
+    }
+
+    private void exportFourthLevelNode(int index) throws Exception {
+        startNode("file" + index, "nt:file");
+        property("jcr:mixinTypes", PropertyType.NAME, "mix:versionable");
+        property("jcr:uuid", PropertyType.STRING, UUID.randomUUID().toString());
+        exportFifthLevelNode();
+        endNode();
+    }
+
+    private void exportFifthLevelNode() throws Exception {
+        startNode("jcr:content", "nt:resource");
+
+        property("jcr:uuid", PropertyType.STRING, UUID.randomUUID().toString());
+        property("jcr:mimeType", PropertyType.STRING, "application/octet-stream");
+        property("jcr:lastModified", PropertyType.DATE, date);
+
+        Writer buffer = new StringWriter();
+        byte[] random = new byte[10 * 1024];
+        new Random().nextBytes(random);
+        Base64.encode(new ByteArrayInputStream(random), buffer);
+        property("jcr:data", PropertyType.BINARY, buffer.toString());
+
+        endNode();
+    }
+
+    private void startNode(String name, String type) throws SAXException {
+        AttributesImpl attributes = new AttributesImpl();
+        attributes.addAttribute(SV, "name", "sv:name", "CDATA", name);
+        handler.startElement(SV, "node", "sv:node", attributes);
+        property("jcr:primaryType", PropertyType.NAME, type);
+    }
+
+    private void endNode() throws SAXException {
+        handler.endElement(SV, "node", "sv:node");
+        nodes++;
+    }
+
+    private void property(String name, int type, String value)
+            throws SAXException {
+        startProperty(name, type);
+        startValue();
+        handler.characters(value.toCharArray(), 0, value.length());
+        endValue();
+        endProperty();
+    }
+
+    private void startProperty(String name, int type) throws SAXException {
+        String tname = PropertyType.nameFromValue(type);
+        AttributesImpl attributes = new AttributesImpl();
+        attributes.addAttribute(SV, "name", "sv:name", "CDATA", name);
+        attributes.addAttribute(SV, "type", "sv:type", "CDATA", tname);
+        handler.startElement(SV, "property", "sv:property", attributes);
+    }
+
+    private void endProperty() throws SAXException {
+        handler.endElement(SV, "property", "sv:property");
+    }
+
+    private void startValue() throws SAXException {
+        AttributesImpl attributes = new AttributesImpl();
+        handler.startElement(SV, "value", "sv:value", attributes);
+    }
+
+    private void endValue() throws SAXException {
+        handler.endElement(SV, "value", "sv:value");
+    }
+
+}

Propchange: jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/ImportMemoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java?rev=700519&view=auto
==============================================================================
--- jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java (added)
+++ jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java Tue Sep 30 09:17:48 2008
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.harness;
+
+import java.io.File;
+
+import javax.jcr.Credentials;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+
+public class Repository {
+
+    private static final Credentials CREDENTIALS =
+        new SimpleCredentials("admin", "admin".toCharArray());
+
+    private static RepositoryImpl repository;
+
+    @BeforeSuite
+    public void startRepository() throws Exception {
+        FileUtils.deleteDirectory(new File("target/repository"));
+
+        RepositoryConfig config = RepositoryConfig.create(
+                RepositoryImpl.class.getResourceAsStream("repository.xml"),
+                "target/repository");
+        repository = RepositoryImpl.create(config);
+    }
+
+    @AfterSuite
+    public void closeRepository() throws Exception {
+        repository.shutdown();
+    }
+
+    public static Session login() throws RepositoryException {
+        return repository.login(CREDENTIALS);
+    }
+
+}

Propchange: jackrabbit/sandbox/benchmark/src/test/java/org/apache/jackrabbit/harness/Repository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/benchmark/testng.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/benchmark/testng.xml?rev=700519&view=auto
==============================================================================
--- jackrabbit/sandbox/benchmark/testng.xml (added)
+++ jackrabbit/sandbox/benchmark/testng.xml Tue Sep 30 09:17:48 2008
@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<suite name="jackrabbit-test-harness">
+  <test name="JackrabbitTestHarness">
+    <packages>
+      <package name="org.apache.jackrabbit.harness"/>
+    </packages>
+  </test>
+</suite>

Propchange: jackrabbit/sandbox/benchmark/testng.xml
------------------------------------------------------------------------------
    svn:eol-style = native