Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 21A45200D41 for ; Tue, 7 Nov 2017 11:26:52 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 205BD160C07; Tue, 7 Nov 2017 10:26:52 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 744A5160C00 for ; Tue, 7 Nov 2017 11:26:50 +0100 (CET) Received: (qmail 20948 invoked by uid 500); 7 Nov 2017 10:26:49 -0000 Mailing-List: contact commits-help@sling.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@sling.apache.org Delivered-To: mailing list commits@sling.apache.org Received: (qmail 20924 invoked by uid 99); 7 Nov 2017 10:26:49 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Nov 2017 10:26:49 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id DD63387CCB; Tue, 7 Nov 2017 10:26:48 +0000 (UTC) Date: Tue, 07 Nov 2017 10:26:49 +0000 To: "commits@sling.apache.org" Subject: [sling-tooling-scm] 01/27: SLING-2311 - adding small performance test suite. Based heavily on the work of Antonio Sanso and the Jackrabbit team (Thanks!!!) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit From: rombert@apache.org In-Reply-To: <151005040853.9221.11919052886554730733@gitbox.apache.org> References: <151005040853.9221.11919052886554730733@gitbox.apache.org> X-Git-Host: gitbox.apache.org X-Git-Repo: sling-tooling-scm X-Git-Refname: refs/tags/org.apache.sling.performance.base-0.0.2 X-Git-Reftype: annotated tag X-Git-Rev: df6828963622eea9e292083a49ccce003d110ee1 X-Git-NotificationType: diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated Message-Id: <20171107102648.DD63387CCB@gitbox.apache.org> archived-at: Tue, 07 Nov 2017 10:26:52 -0000 This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.performance.base-0.0.2 in repository https://gitbox.apache.org/repos/asf/sling-tooling-scm.git commit df6828963622eea9e292083a49ccce003d110ee1 Author: Justin Edelson AuthorDate: Mon Aug 27 20:13:21 2012 +0000 SLING-2311 - adding small performance test suite. Based heavily on the work of Antonio Sanso and the Jackrabbit team (Thanks!!!) git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/performance/base@1377819 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 110 ++++++++ .../sling/performance/AbstractPerformanceTest.java | 91 +++++++ .../sling/performance/AbstractRepositoryTest.java | 90 +++++++ .../org/apache/sling/performance/AbstractTest.java | 134 ++++++++++ .../performance/ResourceResolverTestRequest.java | 285 +++++++++++++++++++++ .../org/apache/sling/performance/TestHelper.java | 32 +++ .../tests/ResolveWith10000AliasTest.java | 27 ++ .../tests/ResolveWith10000VanityPathTest.java | 27 ++ .../tests/ResolveWith1000AliasTest.java | 27 ++ .../tests/ResolveWith1000VanityPathTest.java | 27 ++ .../tests/ResolveWith30000AliasTest.java | 27 ++ .../tests/ResolveWith30000VanityPathTest.java | 27 ++ .../tests/ResolveWith5000AliasTest.java | 27 ++ .../tests/ResolveWith5000VanityPathTest.java | 27 ++ .../tests/ResolveWithManyAliasTest.java | 127 +++++++++ .../tests/ResolveWithManyVanityPathTest.java | 137 ++++++++++ 16 files changed, 1222 insertions(+) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c02e8db --- /dev/null +++ b/pom.xml @@ -0,0 +1,110 @@ + + + + + 4.0.0 + + org.apache.sling + sling-performance-tests + 0.0.1-SNAPSHOT + + + org.apache.sling.performance.base + 0.0.1-SNAPSHOT + + Apache Sling Performance Test Utilities + + + 4.8.2 + + + + scm:svn:http://svn.apache.org/repos/asf/sling/trunk/testing/performance/base + scm:svn:https://svn.apache.org/repos/asf/sling/trunk/testing/performance/base + http://svn.apache.org/viewvc/sling/trunk/testing/performance/base + + + + + org.apache.commons + commons-math + 2.0 + + + commons-io + commons-io + 1.4 + + + junit + junit + ${junit.version} + compile + + + junit-addons + junit-addons + 1.4 + compile + + + javax.servlet + servlet-api + compile + + + javax.jcr + jcr + 2.0 + compile + + + org.apache.sling + org.apache.sling.commons.testing + 2.0.8 + + + org.apache.sling + org.apache.sling.commons.classloader + 1.0.0 + + + com.google.guava + guava + r09 + + + org.osgi + org.osgi.core + compile + + + org.osgi + org.osgi.compendium + compile + + + org.mockito + mockito-all + 1.8.2 + compile + + + diff --git a/src/main/java/org/apache/sling/performance/AbstractPerformanceTest.java b/src/main/java/org/apache/sling/performance/AbstractPerformanceTest.java new file mode 100644 index 0000000..1540cf7 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/AbstractPerformanceTest.java @@ -0,0 +1,91 @@ +/* + * 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.sling.performance; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import junit.framework.TestCase; +import org.apache.commons.io.output.FileWriterWithEncoding; +import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; + +public abstract class AbstractPerformanceTest extends TestCase { + + private final int runtime = 5; + + private final int warmup = 1; + + private void runTest(String name, AbstractTest test) throws Exception { + DescriptiveStatistics statistics = new DescriptiveStatistics(); + + test.setUp(); + try { + // 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 { + test.tearDown(); + } + + if (statistics.getN() > 0) { + writeReport(test.toString(), name, statistics); + } + } + + protected void testPerformance(String name, List tests) throws Exception { + for (AbstractTest test:tests){ + runTest(name,test); + } + } + + 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(); + } + } + +} diff --git a/src/main/java/org/apache/sling/performance/AbstractRepositoryTest.java b/src/main/java/org/apache/sling/performance/AbstractRepositoryTest.java new file mode 100644 index 0000000..f5f818d --- /dev/null +++ b/src/main/java/org/apache/sling/performance/AbstractRepositoryTest.java @@ -0,0 +1,90 @@ +/* + * 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.sling.performance; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.naming.NamingException; + +import org.apache.sling.commons.testing.jcr.RepositoryUtil; +import org.apache.sling.jcr.api.SlingRepository; + + + +public abstract class AbstractRepositoryTest extends AbstractTest { + + private static class ShutdownThread extends Thread { + @Override + public void run() { + try { + RepositoryUtil.stopRepository(); + } catch(Exception e) { + System.out.println("Exception in ShutdownThread:" + e); + } + } + + } + private static SlingRepository repository; + private int counter; + protected Session session; + + protected Node testRoot;; + + /** Return a Repository - first call initializes it, and a JVM + * shutdown hook is registered to stop it + */ + protected SlingRepository getRepository() throws RepositoryException, NamingException { + if(repository != null) { + return repository; + } + + synchronized (AbstractRepositoryTest.class) { + if(repository == null) { + RepositoryUtil.startRepository(); + repository = RepositoryUtil.getRepository(); + Runtime.getRuntime().addShutdownHook(new ShutdownThread()); + } + return repository; + } + } + + /** Return a JCR Session, initialized on demand */ + protected Session getSession() throws RepositoryException, NamingException { + if(session == null) { + session = getRepository().loginAdministrative(null); + } + return session; + } + + /** Return a test root node, created on demand, with a unique path */ + protected Node getTestRootNode() throws RepositoryException, NamingException { + if(testRoot==null) { + final Node root = getSession().getRootNode(); + final Node classRoot = root.addNode(getClass().getSimpleName()); + testRoot = classRoot.addNode(System.currentTimeMillis() + "_" + (++counter)); + } + return testRoot; + } + + @Override + public void tearDown() throws Exception { + super.tearDown(); + if(session != null) { + session.logout(); + } + }} diff --git a/src/main/java/org/apache/sling/performance/AbstractTest.java b/src/main/java/org/apache/sling/performance/AbstractTest.java new file mode 100644 index 0000000..7cdaca2 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/AbstractTest.java @@ -0,0 +1,134 @@ +/* + * 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.sling.performance; + +import java.util.LinkedList; +import java.util.List; + +/** + * Abstract base class for individual performance benchmarks. + */ +public abstract class AbstractTest { + + protected static int getScale(int def) { + int scale = Integer.getInteger("scale", 0); + if (scale == 0) { + scale = def; + } + return scale; + } + + private volatile boolean running; + + private List threads; + + /** + * Adds a background thread that repeatedly executes the given job + * until all the iterations of this test have been executed. + * + * @param job background job + */ + protected void addBackgroundJob(final Runnable job) { + Thread thread = new Thread() { + @Override + public void run() { + while (running) { + job.run(); + } + } + }; + thread.start(); + threads.add(thread); + } + + /** + * Run after all iterations of this test have been executed. Subclasses can + * override this method to clean up static test content. + * + * @throws Exception if an error occurs + */ + protected void afterSuite() throws Exception { + } + + protected void afterTest() throws Exception { + } + + + /** + * Run before any iterations of this test get executed. Subclasses can + * override this method to set up static test content. + * + * @throws Exception if an error occurs + */ + protected void beforeSuite() throws Exception { + } + + protected void beforeTest() throws Exception { + } + + /** + * Executes a single iteration of this test. + * + * @return number of milliseconds spent in this iteration + * @throws Exception if an error occurs + */ + public long execute() throws Exception { + beforeTest(); + try { + long start = System.currentTimeMillis(); + runTest(); + return System.currentTimeMillis() - start; + } finally { + afterTest(); + } + } + + protected abstract void runTest() throws Exception; + + /** + * Prepares this performance benchmark. + * + * @param repository the repository to use + * @param credentials credentials of a user with write access + * @throws Exception if the benchmark can not be prepared + */ + public void setUp() + throws Exception { + this.threads = new LinkedList(); + this.running = true; + beforeSuite(); + } + + /** + * Cleans up after this performance benchmark. + * + * @throws Exception if the benchmark can not be cleaned up + */ + public void tearDown() throws Exception { + this.running = false; + for (Thread thread : threads) { + thread.join(); + } + afterSuite(); + this.threads = null; + } + + public String toString() { + String name = getClass().getName(); + return name.substring(name.lastIndexOf('.') + 1); + } + } diff --git a/src/main/java/org/apache/sling/performance/ResourceResolverTestRequest.java b/src/main/java/org/apache/sling/performance/ResourceResolverTestRequest.java new file mode 100644 index 0000000..38f9ceb --- /dev/null +++ b/src/main/java/org/apache/sling/performance/ResourceResolverTestRequest.java @@ -0,0 +1,285 @@ +/* + * 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.sling.performance; + +import java.io.BufferedReader; +import java.security.Principal; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletInputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +public class ResourceResolverTestRequest implements HttpServletRequest { + + private final Map attrs = new HashMap(); + + private String contextPath; + + private final String host; + + private final String method; + + private final String pathInfo; + + private final int port; + + private final String scheme; + + public ResourceResolverTestRequest(String pathInfo) { + this(pathInfo, null); + } + + public ResourceResolverTestRequest(String pathInfo, String httpMethod) { + this(null, null, -1, pathInfo, httpMethod); + } + + public ResourceResolverTestRequest(String scheme, String host, int port, String pathInfo) { + this(scheme, host, port, pathInfo, null); + } + + public ResourceResolverTestRequest(String scheme, String host, int port, String pathInfo, String httpMethod) { + this.scheme = (scheme == null) ? "http" : scheme; + this.host = (host == null) ? "localhost" : host; + this.port = port; + this.pathInfo = pathInfo; + this.method = httpMethod; + } + + public Object getAttribute(String name) { + return attrs.get(name); + } + + public Enumeration getAttributeNames() { + return null; + } + + public String getAuthType() { + return null; + } + + public String getCharacterEncoding() { + return null; + } + + public int getContentLength() { + return 0; + } + + public String getContentType() { + return null; + } + + public String getContextPath() { + return contextPath; + } + + public Cookie[] getCookies() { + return null; + } + + public long getDateHeader(String name) { + return 0; + } + + public String getHeader(String name) { + return null; + } + + public Enumeration getHeaderNames() { + return null; + } + + public Enumeration getHeaders(String name) { + return null; + } + + public ServletInputStream getInputStream() { + return null; + } + + public int getIntHeader(String name) { + return 0; + } + + public String getLocalAddr() { + return null; + } + + public Locale getLocale() { + return null; + } + + public Enumeration getLocales() { + return null; + } + + public String getLocalName() { + return null; + } + + public int getLocalPort() { + return 0; + } + + public String getMethod() { + return method; + } + + public String getParameter(String name) { + return null; + } + + public Map getParameterMap() { + return null; + } + + public Enumeration getParameterNames() { + return null; + } + + public String[] getParameterValues(String name) { + return null; + } + + public String getPathInfo() { + return pathInfo; + } + + public String getPathTranslated() { + return null; + } + + public String getProtocol() { + return null; + } + + public String getQueryString() { + return null; + } + + public BufferedReader getReader() { + return null; + } + + public String getRealPath(String path) { + return null; + } + + public String getRemoteAddr() { + return null; + } + + public String getRemoteHost() { + return null; + } + + public int getRemotePort() { + return 0; + } + + public String getRemoteUser() { + return null; + } + + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + public String getRequestedSessionId() { + return null; + } + + public String getRequestURI() { + return null; + } + + public StringBuffer getRequestURL() { + return null; + } + + public String getScheme() { + return scheme; + } + + public String getServerName() { + return host; + } + + public int getServerPort() { + return port; + } + + public String getServletPath() { + return null; + } + + public HttpSession getSession() { + return null; + } + + public HttpSession getSession(boolean create) { + return null; + } + + public Principal getUserPrincipal() { + return null; + } + + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + public boolean isRequestedSessionIdFromURL() { + return false; + } + + public boolean isRequestedSessionIdValid() { + return false; + } + + public boolean isSecure() { + return false; + } + + public boolean isUserInRole(String role) { + return false; + } + + public void removeAttribute(String name) { + } + + public void setAttribute(String name, Object o) { + attrs.put(name, o); + } + + public void setCharacterEncoding(String env) { + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/sling/performance/TestHelper.java b/src/main/java/org/apache/sling/performance/TestHelper.java new file mode 100644 index 0000000..6584ca1 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/TestHelper.java @@ -0,0 +1,32 @@ +/* + * 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.sling.performance; + +import javax.jcr.Session; + +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.jcr.api.SlingRepository; + +public interface TestHelper { + + void dispose(); + + ResourceResolver getResourceResolver(); + + void init(String rootPath, Session session, SlingRepository repository) throws Exception; + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith10000AliasTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith10000AliasTest.java new file mode 100644 index 0000000..4f6952a --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith10000AliasTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith10000AliasTest extends ResolveWithManyAliasTest { + + public ResolveWith10000AliasTest(TestHelper helper) { + super(helper, 10000); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith10000VanityPathTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith10000VanityPathTest.java new file mode 100644 index 0000000..88ad4ab --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith10000VanityPathTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith10000VanityPathTest extends ResolveWithManyVanityPathTest { + + public ResolveWith10000VanityPathTest(TestHelper helper) { + super(helper, 100, 100); + } + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith1000AliasTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith1000AliasTest.java new file mode 100644 index 0000000..9f93d1d --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith1000AliasTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith1000AliasTest extends ResolveWithManyAliasTest { + + public ResolveWith1000AliasTest(TestHelper helper) { + super(helper, 1000); + } + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith1000VanityPathTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith1000VanityPathTest.java new file mode 100644 index 0000000..7c5f167 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith1000VanityPathTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith1000VanityPathTest extends ResolveWithManyVanityPathTest { + + public ResolveWith1000VanityPathTest(TestHelper helper) { + super(helper, 100, 10); + } + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith30000AliasTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith30000AliasTest.java new file mode 100644 index 0000000..56e4ab2 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith30000AliasTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith30000AliasTest extends ResolveWithManyAliasTest { + + public ResolveWith30000AliasTest(TestHelper helper) { + super(helper, 30000); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith30000VanityPathTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith30000VanityPathTest.java new file mode 100644 index 0000000..7248a6e --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith30000VanityPathTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith30000VanityPathTest extends ResolveWithManyVanityPathTest { + + public ResolveWith30000VanityPathTest(TestHelper helper) { + super(helper, 300, 100); + } + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith5000AliasTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith5000AliasTest.java new file mode 100644 index 0000000..54f9cdb --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith5000AliasTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith5000AliasTest extends ResolveWithManyAliasTest { + + public ResolveWith5000AliasTest(TestHelper helper) { + super(helper, 5000); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWith5000VanityPathTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWith5000VanityPathTest.java new file mode 100644 index 0000000..b22c6d4 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWith5000VanityPathTest.java @@ -0,0 +1,27 @@ +/* + * 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.sling.performance.tests; + +import org.apache.sling.performance.TestHelper; + +public class ResolveWith5000VanityPathTest extends ResolveWithManyVanityPathTest { + + public ResolveWith5000VanityPathTest(TestHelper helper) { + super(helper, 100, 50); + } + +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWithManyAliasTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWithManyAliasTest.java new file mode 100644 index 0000000..f886957 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWithManyAliasTest.java @@ -0,0 +1,127 @@ +/* + * 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.sling.performance.tests; + +import java.math.BigInteger; +import java.security.SecureRandom; + +import javax.jcr.Node; +import javax.servlet.http.HttpServletRequest; + +import org.apache.jackrabbit.JcrConstants; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceUtil; +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.ResourceResolverTestRequest; + +import static org.junit.Assert.assertNotNull; + +class ResolveWithManyAliasTest extends AbstractRepositoryTest { + + private static final String PN_SLING_ALIAS = "sling:alias"; + + private final TestHelper helper; + + private Node mapRoot; + + private ResourceResolver resResolver; + + private Node rootNode; + + private String rootPath; + + private final int nodeCount; + + public ResolveWithManyAliasTest(TestHelper helper, int nodeCount) { + this.helper = helper; + this.nodeCount = nodeCount; + } + + @Override + protected void afterSuite() throws Exception { + if (helper != null) { + helper.dispose(); + } + + if (rootNode != null) { + rootNode.remove(); + } + if (mapRoot != null) { + mapRoot.remove(); + } + /* + * if ( this.listener != null ) { this.listener.dispose(); } + */ + session.save(); + } + + @Override + 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), JcrConstants.NT_UNSTRUCTURED); + + // test mappings + mapRoot = getSession().getRootNode().addNode("etc", "nt:folder"); + Node map = mapRoot.addNode("map", "sling:Mapping"); + Node http = map.addNode("http", "sling:Mapping"); + http.addNode("localhost.80", "sling:Mapping"); + Node https = map.addNode("https", "sling:Mapping"); + https.addNode("localhost.443", "sling:Mapping"); + + // define a vanity path for the rootPath + SecureRandom random = new SecureRandom(); + // creating nodes + 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(); + + helper.init(rootPath, session, getRepository()); + + resResolver = helper.getResourceResolver(); + + } + + @Override + protected void runTest() throws Exception { + String path = ResourceUtil.normalize(ResourceUtil.getParent(rootPath) + "/" + "testNonExistingAlias" + + ".print.html"); + HttpServletRequest request = new ResourceResolverTestRequest(path); + Resource res = resResolver.resolve(request, path); + assertNotNull(res); + } +} diff --git a/src/main/java/org/apache/sling/performance/tests/ResolveWithManyVanityPathTest.java b/src/main/java/org/apache/sling/performance/tests/ResolveWithManyVanityPathTest.java new file mode 100644 index 0000000..3e51942 --- /dev/null +++ b/src/main/java/org/apache/sling/performance/tests/ResolveWithManyVanityPathTest.java @@ -0,0 +1,137 @@ +/* + * 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.sling.performance.tests; + +import static org.junit.Assert.assertNotNull; + +import java.math.BigInteger; +import java.security.SecureRandom; + +import javax.jcr.Node; +import javax.servlet.http.HttpServletRequest; + +import org.apache.jackrabbit.JcrConstants; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceUtil; +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.ResourceResolverTestRequest; + +class ResolveWithManyVanityPathTest extends AbstractRepositoryTest { + + private static final String NT_VANITY_PATH = "sling:VanityPath"; + + private static final String PN_VANITY_PATH = "sling:vanityPath"; + + private final TestHelper helper; + + private Node mapRoot; + + // private JcrResourceListener listener; + private ResourceResolver resResolver; + + private Node rootNode; + + private String rootPath; + + private final int nodeCount; + + private final int childNodeCount; + + public ResolveWithManyVanityPathTest(TestHelper helper, int nodeCount, int childNodeCount) { + this.helper = helper; + this.nodeCount = nodeCount; + this.childNodeCount = childNodeCount; + } + + @Override + protected void afterSuite() throws Exception { + if (helper != null) { + helper.dispose(); + } + + if (rootNode != null) { + rootNode.remove(); + } + if (mapRoot != null) { + mapRoot.remove(); + } + session.save(); + } + + @Override + 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"); + http.addNode("localhost.80", "sling:Mapping"); + Node https = map.addNode("https", "sling:Mapping"); + https.addNode("localhost.443", "sling:Mapping"); + + SecureRandom random = new SecureRandom(); + + // creating x 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(); + } + } + + session.save(); + + helper.init(rootPath, session, getRepository()); + + resResolver = helper.getResourceResolver(); + + } + + @Override + protected void runTest() throws Exception { + String path = ResourceUtil.normalize(ResourceUtil.getParent(rootPath) + "/" + "testNonExistingVanity" + + ".print.html"); + HttpServletRequest request = new ResourceResolverTestRequest(path); + Resource res = resResolver.resolve(request, path); + assertNotNull(res); + } + +} -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" .