Author: olli Date: Fri Jul 14 10:45:28 2017 New Revision: 1801933 URL: http://svn.apache.org/viewvc?rev=1801933&view=rev Log: SLING-3017 Improve Karaf integration tests
switch from OSGi EventHandler to Sling ResourceChangeListener Modified: sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java Modified: sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java URL: http://svn.apache.org/viewvc/sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java?rev=1801933&r1=1801932&r2=1801933&view=diff ============================================================================== --- sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java (original) +++ sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java Fri Jul 14 10:45:28 2017 @@ -21,8 +21,10 @@ package org.apache.sling.karaf.tests.boo import java.io.Reader; import java.io.StringReader; import java.util.Collections; +import java.util.Dictionary; import java.util.HashSet; import java.util.Hashtable; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -43,18 +45,16 @@ import javax.jcr.observation.Observation import javax.jcr.query.Query; import org.apache.jackrabbit.commons.cnd.CndImporter; -import org.apache.sling.api.SlingConstants; import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.observation.ResourceChange; +import org.apache.sling.api.resource.observation.ResourceChange.ChangeType; +import org.apache.sling.api.resource.observation.ResourceChangeListener; import org.apache.sling.jcr.api.SlingRepository; import org.apache.sling.karaf.testing.KarafTestSupport; import org.junit.After; import org.junit.Test; import org.ops4j.pax.exam.util.Filter; -import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; -import org.osgi.service.event.Event; -import org.osgi.service.event.EventConstants; -import org.osgi.service.event.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -376,16 +376,19 @@ public abstract class AbstractSlingLaunc } @Test - public void testOsgiResourceEvents() throws RepositoryException { - final ResourceEventListener listener = new ResourceEventListener(); - final ServiceRegistration reg = listener.register(bundleContext, SlingConstants.TOPIC_RESOURCE_ADDED); + public void testResourceEvents() throws RepositoryException { + final AddedResourceChangeListener listener = new AddedResourceChangeListener(); + final Dictionary<String, Object> properties = new Hashtable<>(); + properties.put(ResourceChangeListener.PATHS, "/"); + properties.put(ResourceChangeListener.CHANGES, "ADDED"); // ChangeType.ADDED + final ServiceRegistration reg = bundleContext.registerService(ResourceChangeListener.class, listener, properties); final Session s = slingRepository.loginAdministrative(null); final int nPaths = 2500 * TEST_SCALE; final int timeoutMsec = 2 * nPaths; - final String prefix = uniqueName("testOsgiResourceEvents"); + final String prefix = uniqueName("testResourceObservationEvents"); // Create N nodes with a unique name under / - // and verify that ResourceEventListener gets an event + // and verify that ResourceChangeListener gets notified // for each of them try { for(int i=0; i < nPaths; i++) { @@ -393,7 +396,7 @@ public abstract class AbstractSlingLaunc } s.save(); - logger.info("Added {} nodes, checking what ResourceEventListener got...", nPaths); + logger.info("Added {} nodes, checking what ResourceChangeListener got...", nPaths); final long timeout = System.currentTimeMillis() + timeoutMsec; final Set<String> missing = new HashSet<String>(); while(System.currentTimeMillis() < timeout) { @@ -413,7 +416,7 @@ public abstract class AbstractSlingLaunc if(!missing.isEmpty()) { final String missingStr = missing.size() > 10 ? missing.size() + " paths missing" : missing.toString(); - fail("OSGi add resource events are missing for " + fail("resource added events are missing for " + missing.size() + "/" + nPaths + " paths after " + timeoutMsec + " msec: " + missingStr); } @@ -422,7 +425,7 @@ public abstract class AbstractSlingLaunc s.logout(); } - logger.info("Successfuly detected OSGi observation events for " + nPaths + " paths"); + logger.info("Successfully detected resource observation events for " + nPaths + " paths"); } @Test @@ -484,43 +487,37 @@ public abstract class AbstractSlingLaunc } - /** Keep track of OSGi events received on a given topic */ - public class ResourceEventListener implements EventHandler { + public class AddedResourceChangeListener implements ResourceChangeListener { - private final Logger log = LoggerFactory.getLogger(getClass()); - private final Set<String> paths = new HashSet<String>(); + private Set<String> paths = new LinkedHashSet<>(); - ServiceRegistration register(BundleContext ctx, String osgiEventTopic) { - final Hashtable<String, Object> props = new Hashtable<String, Object>(); - props.put(EventConstants.EVENT_TOPIC, osgiEventTopic); - return ctx.registerService(EventHandler.class.getName(), this, props); - } + private final Object lock = new Object(); - @Override - public void handleEvent(Event event) { - final String path = (String) event.getProperty("path"); - if(path != null) { - final int n = paths.size(); - synchronized (paths) { - if(n % 1000 == 0) { - log.info("Got events for {} paths so far, last path={}", n, path); - } - paths.add(path); - } - } - } + private final Logger logger = LoggerFactory.getLogger(AddedResourceChangeListener.class); - void clear() { - synchronized (paths) { - paths.clear(); - } + AddedResourceChangeListener() { } Set<String> getPaths() { - synchronized (paths) { + synchronized (lock) { return Collections.unmodifiableSet(paths); } } + + @Override + public void onChange(final List<ResourceChange> list) { + synchronized (lock) { + logger.info("{} resources added already", paths.size()); + logger.info("{} new resource changes", list.size()); + for (final ResourceChange resourceChange : list) { + if (resourceChange.getType() == ChangeType.ADDED) { + paths.add(resourceChange.getPath()); + } + } + logger.info("{} resources added in total", paths.size()); + } + } + } }