| /* |
| * 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.jcr.oak.server.it; |
| |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.concurrent.atomic.AtomicInteger; |
| |
| import javax.inject.Inject; |
| import javax.jcr.Item; |
| import javax.jcr.Node; |
| import javax.jcr.RepositoryException; |
| import javax.jcr.Session; |
| import javax.jcr.observation.EventIterator; |
| import javax.jcr.observation.EventListener; |
| import javax.jcr.observation.ObservationManager; |
| |
| import org.apache.jackrabbit.commons.JcrUtils; |
| import org.apache.sling.api.resource.ResourceResolverFactory; |
| import org.apache.sling.jcr.api.SlingRepository; |
| import org.apache.sling.testing.paxexam.TestSupport; |
| import org.ops4j.pax.exam.Configuration; |
| import org.ops4j.pax.exam.Option; |
| import org.ops4j.pax.exam.util.PathUtils; |
| import org.osgi.framework.BundleContext; |
| |
| import static org.apache.sling.testing.paxexam.SlingOptions.scr; |
| import static org.apache.sling.testing.paxexam.SlingOptions.slingJcr; |
| import static org.apache.sling.testing.paxexam.SlingOptions.slingJcrRepoinit; |
| import static org.apache.sling.testing.paxexam.SlingOptions.versionResolver; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.ops4j.pax.exam.CoreOptions.composite; |
| import static org.ops4j.pax.exam.CoreOptions.junitBundles; |
| import static org.ops4j.pax.exam.CoreOptions.mavenBundle; |
| import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration; |
| import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration; |
| |
| public abstract class OakServerTestSupport extends TestSupport { |
| |
| @Inject |
| protected SlingRepository slingRepository; |
| |
| @Inject |
| protected BundleContext bundleContext; |
| |
| @Inject |
| protected SlingRepository repository; |
| |
| @Inject |
| protected ResourceResolverFactory resourceResolverFactory; |
| |
| |
| protected final List<String> toDelete = new LinkedList<String>(); |
| |
| private final AtomicInteger uniqueNameCounter = new AtomicInteger(); |
| |
| protected static final Integer TEST_SCALE = Integer.getInteger("test.scale", 1); |
| |
| protected class JcrEventsCounter implements EventListener { |
| private final Session s; |
| private int jcrEventsCounter; |
| |
| public JcrEventsCounter() throws RepositoryException { |
| s = repository.loginAdministrative(null); |
| final ObservationManager om = s.getWorkspace().getObservationManager(); |
| final int eventTypes = 255; // not sure if that's a recommended value, but common |
| final boolean deep = true; |
| final String[] uuid = null; |
| final String[] nodeTypeNames = new String[]{"mix:language", "sling:Message"}; |
| final boolean noLocal = true; |
| final String root = "/"; |
| om.addEventListener(this, eventTypes, root, deep, uuid, nodeTypeNames, noLocal); |
| } |
| |
| void close() { |
| s.logout(); |
| } |
| |
| @Override |
| public void onEvent(EventIterator it) { |
| while (it.hasNext()) { |
| it.nextEvent(); |
| jcrEventsCounter++; |
| } |
| } |
| |
| int get() { |
| return jcrEventsCounter; |
| } |
| } |
| |
| protected <ItemType extends Item> ItemType deleteAfterTests(ItemType it) throws RepositoryException { |
| toDelete.add(it.getPath()); |
| return it; |
| } |
| |
| /** |
| * Verify that admin can create and retrieve a node of the specified type. |
| * |
| * @return the path of the test node that was created. |
| */ |
| protected String assertCreateRetrieveNode(String nodeType) throws RepositoryException { |
| return assertCreateRetrieveNode(nodeType, null); |
| } |
| |
| protected String assertCreateRetrieveNode(String nodeType, String relParentPath) throws RepositoryException { |
| Session session = repository.loginAdministrative(null); |
| try { |
| final Node root = session.getRootNode(); |
| final String name = uniqueName("assertCreateRetrieveNode"); |
| final String propName = "PN_" + name; |
| final String propValue = "PV_" + name; |
| final Node parent = relParentPath == null ? root : JcrUtils.getOrAddNode(root, relParentPath); |
| final Node child = nodeType == null ? parent.addNode(name) : parent.addNode(name, nodeType); |
| child.setProperty(propName, propValue); |
| child.setProperty("foo", child.getPath()); |
| session.save(); |
| session.logout(); |
| session = repository.loginAdministrative(null); |
| final String path = relParentPath == null ? "/" + name : "/" + relParentPath + "/" + name; |
| final Node n = session.getNode(path); |
| assertNotNull(n); |
| assertEquals(propValue, n.getProperty(propName).getString()); |
| return n.getPath(); |
| } finally { |
| session.logout(); |
| } |
| } |
| |
| protected String uniqueName(String hint) { |
| return hint + "_" + uniqueNameCounter.incrementAndGet() + "_" + System.currentTimeMillis(); |
| } |
| |
| @Configuration |
| public Option[] configuration() { |
| return new Option[]{ |
| baseConfiguration(), |
| launchpad(), |
| // Sling JCR Oak Server |
| testBundle("bundle.filename"), |
| // testing |
| junitBundles() |
| }; |
| } |
| |
| protected Option launchpad() { |
| versionResolver.setVersion("org.apache.felix", "org.apache.felix.http.jetty", "3.1.6"); // SLING-6080 – Java 7 |
| versionResolver.setVersion("org.apache.felix", "org.apache.felix.http.whiteboard", "2.3.2"); // SLING-6080 – Java 7 |
| final String repoinit = String.format("raw:file:%s/src/test/resources/repoinit.txt", PathUtils.getBaseDir()); |
| final String slingHome = String.format("%s/sling", workingDirectory()); |
| final String repositoryHome = String.format("%s/repository", slingHome); |
| final String localIndexDir = String.format("%s/index", repositoryHome); |
| return composite( |
| scr(), |
| slingJcr(), |
| slingJcrRepoinit(), |
| mavenBundle().groupId("org.apache.jackrabbit").artifactId("oak-segment-tar").version(versionResolver), |
| newConfiguration("org.apache.jackrabbit.oak.segment.SegmentNodeStoreService") |
| .put("repository.home", repositoryHome) |
| .put("name", "Default NodeStore") |
| .asOption(), |
| newConfiguration("org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexProviderService") |
| .put("localIndexDir", localIndexDir) |
| .asOption(), |
| newConfiguration("org.apache.sling.jcr.repoinit.impl.RepositoryInitializer") |
| .put("references", new String[]{repoinit}) |
| .asOption(), |
| getWhitelistRegexpOption(), |
| // To generate the list of whitelisted bundles after a failed test-run: |
| // grep -R 'NOT white' target/failsafe-reports/ | awk -F': Bundle ' '{print substr($2, 1, index($2, " is NOT "))}' | sort -u |
| factoryConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment") |
| .put("whitelist.bundles", new String[]{ |
| "org.apache.sling.jcr.oak.server", |
| "org.apache.sling.jcr.contentloader", |
| "org.apache.sling.jcr.resource", |
| "org.apache.sling.resourceresolver" |
| }) |
| .asOption() |
| ); |
| } |
| |
| protected Option getWhitelistRegexpOption() { |
| return newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist") |
| .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*") |
| .asOption(); |
| } |
| } |