SLING-3332 - Long startup time with many sling:alias

- added performance test for Startup with many aliases

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1560681 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyAliasTest.java b/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyAliasTest.java
new file mode 100644
index 0000000..13cc06f
--- /dev/null
+++ b/tests/src/main/java/org/apache/sling/performance/tests/StartupWithManyAliasTest.java
@@ -0,0 +1,118 @@
+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 StartupWithManyAliasTest extends AbstractRepositoryTest {
+    private static final String PN_SLING_ALIAS = "sling:alias";
+    
+    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;
+ 
+    public StartupWithManyAliasTest(String testInstanceName,
+            TestHelper helper, int nodeCount) {
+        super(testInstanceName);
+        this.helper = helper;
+        this.nodeCount = nodeCount;
+        
+    }
+
+    @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();
+
+        for (int j = 0; j < nodeCount; j++) {
+            Node content = rootNode.addNode("a" + j, JcrConstants.NT_UNSTRUCTURED);
+            String alias = new BigInteger(130, random).toString(32);
+            content.setProperty(PN_SLING_ALIAS, alias);
+
+            if (j % 10 == 0) {
+                session.save();
+            }
+        }
+        session.save();
+    }
+
+    @PerformanceTest
+    public void runTest() throws Exception {
+        helper.init(rootPath, session, getRepository()); 
+    }
+
+}