SLING-3290 - Long startup time with many vanityPath

* added performance test

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1608751 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jcr-resource-2.2.10/pom.xml b/jcr-resource-2.2.10/pom.xml
index dfcd2e0..15e249d 100644
--- a/jcr-resource-2.2.10/pom.xml
+++ b/jcr-resource-2.2.10/pom.xml
@@ -53,7 +53,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.resourceresolver</artifactId>
-            <version>1.0.7-SNAPSHOT</version>
+            <version>1.1.1-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/jcr-resource-2.2.10/src/test/java/org/apache/sling/performance/PerformanceTest.java b/jcr-resource-2.2.10/src/test/java/org/apache/sling/performance/PerformanceTest.java
index 0344e31..f152b1c 100644
--- a/jcr-resource-2.2.10/src/test/java/org/apache/sling/performance/PerformanceTest.java
+++ b/jcr-resource-2.2.10/src/test/java/org/apache/sling/performance/PerformanceTest.java
@@ -40,6 +40,7 @@
 import org.apache.sling.performance.tests.ResolveNonExistingWithManyAliasTest;
 import org.apache.sling.performance.tests.ResolveNonExistingWithManyVanityPathTest;
 import org.apache.sling.performance.tests.StartupWithManyAliasTest;
+import org.apache.sling.performance.tests.StartupWithManyVanityTest;
 import org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl;
 import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker;
 import org.apache.sling.resourceresolver.impl.ResourceResolverFactoryActivator;
@@ -135,7 +136,12 @@
         testCenter.addTestObject(new ResolveNonExistingWithManyAliasTest("ResolveNonExistingWith10000AliasTest",helper, 10000));
         
         testCenter.addTestObject(new StartupWithManyAliasTest("StartupWithManyAliasTest",helper, 10000));
-      
+        testCenter.addTestObject(new StartupWithManyVanityTest("StartupWith10VanityTest",helper, 1, 10));
+        testCenter.addTestObject(new StartupWithManyVanityTest("StartupWith100ManyVanityTest",helper, 10, 10));
+        testCenter.addTestObject(new StartupWithManyVanityTest("StartupWith1000ManyVanityTest",helper, 10, 100));
+        testCenter.addTestObject(new StartupWithManyVanityTest("StartupWith10000ManyVanityTest",helper, 100, 100));
+        
+        
         return testCenter;
     }
 }
diff --git a/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyVanityTest.java b/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyVanityTest.java
new file mode 100644
index 0000000..477c8b8
--- /dev/null
+++ b/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyVanityTest.java
@@ -0,0 +1,130 @@
+package org.apache.sling.performance.tests;
+/*
+ * 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.
+ */
+
+
+import java.math.BigInteger;
+import java.security.SecureRandom;
+
+import javax.jcr.Node;
+
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.sling.commons.testing.jcr.RepositoryUtil;
+import org.apache.sling.performance.AbstractRepositoryTest;
+import org.apache.sling.performance.TestHelper;
+import org.apache.sling.performance.annotation.AfterMethodInvocation;
+import org.apache.sling.performance.annotation.PerformanceTest;
+import org.junit.After;
+import org.junit.Before;
+
+public class StartupWithManyVanityTest extends AbstractRepositoryTest {
+    
+    private static final String NT_VANITY_PATH = "sling:VanityPath";
+
+    private static final String PN_VANITY_PATH = "sling:vanityPath";
+    
+    public static final String PROP_REDIRECT_INTERNAL = "sling:internalRedirect";
+
+    private final TestHelper helper;
+
+    private Node mapRoot;
+
+    private Node rootNode;
+
+    private String rootPath;
+
+    private final int nodeCount;
+    
+    private final int childNodeCount;
+ 
+    public StartupWithManyVanityTest(String testInstanceName,
+            TestHelper helper, int nodeCount,  int childNodeCount) {
+        super(testInstanceName);
+        this.helper = helper;
+        this.nodeCount = nodeCount;
+        this.childNodeCount = childNodeCount;       
+    }
+
+    @After
+    protected void afterSuite() throws Exception {
+        if (helper != null) {
+            helper.dispose();
+        }
+
+        if (rootNode != null) {
+            rootNode.remove();
+        }
+        if (mapRoot != null) {
+            mapRoot.remove();
+        }
+        session.save();
+    }
+
+    @AfterMethodInvocation
+    protected void afterMethod() throws Exception {
+        helper.dispose();
+    }
+    
+    @Before
+    protected void beforeSuite() throws Exception {
+        RepositoryUtil.registerNodeType(getSession(),
+                this.getClass().getResourceAsStream("/SLING-INF/nodetypes/folder.cnd"));
+        RepositoryUtil.registerNodeType(getSession(),
+                this.getClass().getResourceAsStream("/SLING-INF/nodetypes/resource.cnd"));
+        RepositoryUtil.registerNodeType(getSession(),
+                this.getClass().getResourceAsStream("/SLING-INF/nodetypes/vanitypath.cnd"));
+        RepositoryUtil.registerNodeType(getSession(),
+                this.getClass().getResourceAsStream("/SLING-INF/nodetypes/mapping.cnd"));
+
+        // test data
+        rootPath = "/test" + System.currentTimeMillis();
+        rootNode = getSession().getRootNode().addNode(rootPath.substring(1), "nt:unstructured");
+
+        // test mappings
+        mapRoot = getSession().getRootNode().addNode("etc", JcrConstants.NT_FOLDER);
+        Node map = mapRoot.addNode("map", "sling:Mapping");
+        Node http = map.addNode("http", "sling:Mapping");
+        Node aliasNode = map.addNode("alias", "nt:unstructured");
+        Node localhost80 =http.addNode("localhost.80", "sling:Mapping");
+        Node https = map.addNode("https", "sling:Mapping");
+        https.addNode("localhost.443", "sling:Mapping");
+
+        SecureRandom random = new SecureRandom();
+
+        // creating <nodeCount> x <childNodeCount> nodes with vanity
+        for (int j = 0; j < nodeCount; j++) {
+            Node content = rootNode.addNode("a" + j, JcrConstants.NT_UNSTRUCTURED);
+            String s = new BigInteger(130, random).toString(32);
+            content.addMixin(NT_VANITY_PATH);
+            content.setProperty(PN_VANITY_PATH, s);
+            for (int k = 0; k < childNodeCount; k++) {
+                Node content2 = content.addNode("b" + k, JcrConstants.NT_UNSTRUCTURED);
+                String ss = new BigInteger(130, random).toString(32);
+                content2.addMixin(NT_VANITY_PATH);
+                content2.setProperty(PN_VANITY_PATH, ss);
+            }
+            if (j % 10 == 0) {
+                session.save();
+            }
+        }    }
+
+    @PerformanceTest
+    public void runTest() throws Exception {
+        helper.init(rootPath, session, getRepository()); 
+    }
+
+}