Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakClusterTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakClusterTest.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakClusterTest.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakClusterTest.java Wed Oct 21 15:50:37 2015 @@ -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.discovery.oak.its; + +import org.apache.sling.discovery.base.its.AbstractClusterTest; +import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; +import org.apache.sling.discovery.oak.its.setup.OakVirtualInstanceBuilder; + +public class OakClusterTest extends AbstractClusterTest { + + @Override + protected VirtualInstanceBuilder newBuilder() { + return new OakVirtualInstanceBuilder(); + } + +}
Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakClusterTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakSingleInstanceTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakSingleInstanceTest.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakSingleInstanceTest.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakSingleInstanceTest.java Wed Oct 21 15:50:37 2015 @@ -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.discovery.oak.its; + +import org.apache.sling.discovery.base.its.AbstractSingleInstanceTest; +import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; +import org.apache.sling.discovery.oak.its.setup.OakVirtualInstanceBuilder; + +public class OakSingleInstanceTest extends AbstractSingleInstanceTest { + + @Override + protected VirtualInstanceBuilder newBuilder() { + return new OakVirtualInstanceBuilder(); + } + +} Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakSingleInstanceTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakTopologyEventTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakTopologyEventTest.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakTopologyEventTest.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakTopologyEventTest.java Wed Oct 21 15:50:37 2015 @@ -0,0 +1,43 @@ +/* + * 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.discovery.oak.its; + +import static org.junit.Assert.assertNotNull; + +import org.apache.sling.discovery.TopologyView; +import org.apache.sling.discovery.base.its.AbstractTopologyEventTest; +import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; +import org.apache.sling.discovery.oak.its.setup.OakVirtualInstanceBuilder; + +public class OakTopologyEventTest extends AbstractTopologyEventTest { + + @Override + public VirtualInstanceBuilder newBuilder() { + return new OakVirtualInstanceBuilder(); + } + + @Override + public void assertEarlyAndFirstClusterViewIdMatches(TopologyView earlyTopo, TopologyView secondTopo) { + // for the oak discovery-lite variant there's nothing we can assert here + // except perhaps that they shouldn't be null.. + assertNotNull(earlyTopo); + assertNotNull(secondTopo); + } + +} Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/OakTopologyEventTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakTestConfig.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakTestConfig.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakTestConfig.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakTestConfig.java Wed Oct 21 15:50:37 2015 @@ -0,0 +1,80 @@ +/* + * 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.discovery.oak.its.setup; + +import org.apache.sling.discovery.base.its.setup.ModifiableTestBaseConfig; +import org.apache.sling.discovery.oak.Config; + +public class OakTestConfig extends Config implements ModifiableTestBaseConfig { + + public OakTestConfig() { + // empty + } + + public void setDiscoveryResourcePath(String discoveryResourcePath) { + this.discoveryResourcePath = discoveryResourcePath; + } + + public void setMinEventDelay(int minEventDelay) { + this.minEventDelay = minEventDelay; + } + + public void addTopologyConnectorWhitelistEntry(String whitelistEntry) { + if (topologyConnectorWhitelist==null) { + topologyConnectorWhitelist = new String[] {whitelistEntry}; + } else { + String[] list = topologyConnectorWhitelist; + topologyConnectorWhitelist = new String[list.length+1]; + System.arraycopy(list, 0, topologyConnectorWhitelist, 0, list.length); + topologyConnectorWhitelist[topologyConnectorWhitelist.length-1] = whitelistEntry; + } + } + + @Override + public int getBackoffStableFactor() { + return 1; + } + + @Override + public int getBackoffStandbyFactor() { + return 1; + } + + public void setConnectorInterval(long connectorInterval) { + this.connectorPingInterval = connectorInterval; + } + + public void setConnectorTimeout(long connectorTimeout) { + this.connectorPingTimeout = connectorTimeout; + } + + @Override + public void setViewCheckTimeout(int viewCheckTimeout) { + setConnectorTimeout(viewCheckTimeout); + } + + @Override + public void setViewCheckInterval(int viewCheckInterval) { + setConnectorInterval(viewCheckInterval); + } + + public long getViewCheckerTimeout() { + return connectorPingTimeout; + } +} \ No newline at end of file Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakTestConfig.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java Wed Oct 21 15:50:37 2015 @@ -0,0 +1,259 @@ +/* + * 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.discovery.oak.its.setup; + +import static org.junit.Assert.fail; + +import javax.jcr.Session; + +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.discovery.base.commons.BaseDiscoveryService; +import org.apache.sling.discovery.base.commons.ClusterViewService; +import org.apache.sling.discovery.base.commons.ViewChecker; +import org.apache.sling.discovery.base.its.setup.ModifiableTestBaseConfig; +import org.apache.sling.discovery.base.its.setup.VirtualInstance; +import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; +import org.apache.sling.discovery.base.its.setup.mock.MockFactory; +import org.apache.sling.discovery.commons.providers.spi.base.IdMapService; +import org.apache.sling.discovery.commons.providers.spi.base.OakSyncTokenConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.RepositoryTestHelper; +import org.apache.sling.discovery.oak.OakDiscoveryService; +import org.apache.sling.discovery.oak.cluster.OakClusterViewService; +import org.apache.sling.discovery.oak.pinger.OakViewChecker; +import org.apache.sling.jcr.api.SlingRepository; +import org.osgi.service.component.ComponentContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junitx.util.PrivateAccessor; + +public class OakVirtualInstanceBuilder extends VirtualInstanceBuilder { + + NodeStore nodeStore; + private String path; + private OakTestConfig config; + private IdMapService idMapService; + private OakViewChecker oakViewChecker; + private SimulatedLeaseCollection leaseCollection; + private OakSyncTokenConsistencyService consistencyService; + + @Override + public VirtualInstanceBuilder createNewRepository() throws Exception { + nodeStore = new MemoryNodeStore(); + SlingRepository repository = RepositoryTestHelper.newOakRepository(nodeStore); + factory = MockFactory.mockResourceResolverFactory(repository); + leaseCollection = new SimulatedLeaseCollection(); + return this; + } + + @Override + public VirtualInstanceBuilder useRepositoryOf(VirtualInstanceBuilder other) throws Exception { + if (!(other instanceof OakVirtualInstanceBuilder)) { + throw new IllegalArgumentException("other must be of type OakVirtualInstanceBuilder but is: "+other); + } + OakVirtualInstanceBuilder otherOakbuilder = (OakVirtualInstanceBuilder)other; + nodeStore = otherOakbuilder.nodeStore; + SlingRepository repository = RepositoryTestHelper.newOakRepository(nodeStore); + factory = MockFactory.mockResourceResolverFactory(repository); + leaseCollection = otherOakbuilder.leaseCollection; + hookedToBuilder = other; + ownRepository = false; + return this; + } + + @Override + public VirtualInstanceBuilder setPath(String path) { + this.path = path; + return this; + } + + @Override + public Object[] getAdditionalServices(VirtualInstance instance) throws Exception { + return null; + } + + public IdMapService getIdMapService() { + if (idMapService==null) { + idMapService = createIdMapService(); + } + return idMapService; + } + + private IdMapService createIdMapService() { + return IdMapService.testConstructor(getConfig(), getSlingSettingsService(), getResourceResolverFactory()); + } + + @Override + protected ClusterViewService createClusterViewService() { + return OakClusterViewService.testConstructor(getSlingSettingsService(), getResourceResolverFactory(), getIdMapService(), getConfig()); + } + + OakTestConfig getConfig() { + if (config==null) { + config = createConfig(); + } + return config; + } + + @Override + public ModifiableTestBaseConfig getConnectorConfig() { + return getConfig(); + } + + private OakTestConfig createConfig() { + OakTestConfig c = new OakTestConfig(); + c.setDiscoveryResourcePath(path); + return c; + } + + @Override + protected ViewChecker createViewChecker() throws Exception { + getOakViewChecker(); + return new ViewChecker() { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private SimulatedLease lease = new SimulatedLease(getResourceResolverFactory(), leaseCollection, getSlingId()); + + protected void activate(ComponentContext c) throws Throwable { + OakViewChecker pinger = getOakViewChecker(); + PrivateAccessor.invoke(pinger, "activate", new Class[] {ComponentContext.class}, new Object[] {c}); + } + + @Override + public void checkView() { + try { + lease.updateDescriptor(getConfig()); + } catch (Exception e) { + logger.error("run: could not update lease: "+e); + } + } + + public void run() { + heartbeatAndCheckView(); + } + + @Override + public void heartbeatAndCheckView() { +// next step is try to simulate the logic +// where no heartbeat means no descriptor yet +// one heartbeat means i'm visible for others +// as soon as I see others the descriptor is updated + try { + lease.updateLeaseAndDescriptor(getConfig()); + } catch (Exception e) { + logger.error("run: could not update lease: "+e, e); + } + try{ + getOakViewChecker().run(); + } catch(Exception e) { + logger.error("run: could not ping: "+e, e); + } + if (!getIdMapService().isInitialized()) { + if (!getIdMapService().waitForInit(1500)) { + fail("init didnt work"); + } + } + } + }; + } + + private OakViewChecker getOakViewChecker() throws Exception { + if (oakViewChecker==null) { + oakViewChecker = createOakViewChecker() ; + } + return oakViewChecker; + } + + private OakViewChecker createOakViewChecker() throws Exception { + return OakViewChecker.testConstructor(getSlingSettingsService(), getResourceResolverFactory(), getConnectorRegistry(), getAnnouncementRegistry(), getScheduler(), getConfig()); + } + + private OakSyncTokenConsistencyService getConsistencyService() throws Exception { + if (consistencyService == null) { + consistencyService = createConsistencyService(); + } + return consistencyService; + } + + private OakSyncTokenConsistencyService createConsistencyService() { + return OakSyncTokenConsistencyService.testConstructorAndActivate(getConfig(), getIdMapService(), getSlingSettingsService(), getResourceResolverFactory()); + } + + @Override + protected BaseDiscoveryService createDiscoveryService() throws Exception { + return OakDiscoveryService.testConstructor( + getSlingSettingsService(), + getAnnouncementRegistry(), + getConnectorRegistry(), + getClusterViewService(), + getConfig(), + getOakViewChecker(), + getScheduler(), + getIdMapService(), + getConsistencyService(), + getResourceResolverFactory()); + } + + @Override + public VirtualInstance build() throws Exception { + if (path==null) { + if (ownRepository) { + setPath("/var/discovery/impl/"); + getConfig().setDiscoveryResourcePath("/var/discovery/impl/"); + } else { + OakVirtualInstanceBuilder other = (OakVirtualInstanceBuilder) hookedToBuilder; + this.path = other.path; + getConfig().setDiscoveryResourcePath(other.path); + } + } + if (path==null) { + throw new IllegalStateException("no path set"); + } + if (!path.startsWith("/")) { + throw new IllegalStateException("path must start with /: "+path); + } + if (!path.endsWith("/")) { + throw new IllegalStateException("path must end with /: "+path); + } + VirtualInstance result = new VirtualInstance(this) { + + }; + return result; + } + + @Override + protected void resetRepo() throws Exception { + leaseCollection.reset(); + ResourceResolver rr = null; + Session l = null; + try { + rr = factory.getAdministrativeResourceResolver(null); + l = rr.adaptTo(Session.class); + l.removeItem("/var"); + l.save(); + l.logout(); + } catch (Exception e) { + l.refresh(false); + l.logout(); + } + } +} Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLease.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLease.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLease.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLease.java Wed Oct 21 15:50:37 2015 @@ -0,0 +1,59 @@ +/* + * 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.discovery.oak.its.setup; + +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.discovery.commons.providers.spi.base.DescriptorHelper; +import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptorBuilder; + +public class SimulatedLease { + + private final SimulatedLeaseCollection collection; + private final ResourceResolverFactory factory; + private final String slingId; + + public SimulatedLease(ResourceResolverFactory factory, + SimulatedLeaseCollection collection, + String slingId) { + this.factory = factory; + this.collection = collection; + collection.hooked(this); + this.slingId = slingId; + } + + @Override + public String toString() { + return "a SimulatedLease[slingId="+slingId+"]"; + } + + public String getSlingId() { + return slingId; + } + + public void updateDescriptor(OakTestConfig config) throws Exception { + DiscoveryLiteDescriptorBuilder builder = collection.getDescriptorFor(this, config); + DescriptorHelper.setDiscoveryLiteDescriptor(factory, builder); + } + + public void updateLeaseAndDescriptor(OakTestConfig config) throws Exception { + DiscoveryLiteDescriptorBuilder builder = collection.updateAndGetDescriptorFor(this, config); + DescriptorHelper.setDiscoveryLiteDescriptor(factory, builder); + } + +} Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLease.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLeaseCollection.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLeaseCollection.java?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLeaseCollection.java (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLeaseCollection.java Wed Oct 21 15:50:37 2015 @@ -0,0 +1,102 @@ +/* + * 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.discovery.oak.its.setup; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptorBuilder; +import org.apache.sling.discovery.oak.Config; + +public class SimulatedLeaseCollection { + + private final Map<String,Long> leaseUpdates = + new HashMap<String, Long>(); + + private final Map<String,Integer> clusterNodeIds = + new HashMap<String, Integer>(); + + private int highestId = 0; + + private final String viewId = UUID.randomUUID().toString(); + + List<SimulatedLease> leases = new LinkedList<SimulatedLease>(); + + public SimulatedLeaseCollection() { + // empty + } + + public synchronized void hooked(SimulatedLease lease) { + leases.add(lease); + } + + public synchronized DiscoveryLiteDescriptorBuilder getDescriptorFor(SimulatedLease simulatedLease, OakTestConfig config) { + return doUpdateAndGet(simulatedLease, config, false); + } + + public synchronized DiscoveryLiteDescriptorBuilder updateAndGetDescriptorFor(SimulatedLease simulatedLease, OakTestConfig config) { + return doUpdateAndGet(simulatedLease, config, true); + } + + private DiscoveryLiteDescriptorBuilder doUpdateAndGet(SimulatedLease simulatedLease, OakTestConfig config, boolean updateLease) { + int clusterNodeId = getClusterNodeId(simulatedLease.getSlingId()); + if (updateLease) { + leaseUpdates.put(simulatedLease.getSlingId(), System.currentTimeMillis()); + } + DiscoveryLiteDescriptorBuilder discoBuilder = + new DiscoveryLiteDescriptorBuilder(); + discoBuilder.me(clusterNodeId); + discoBuilder.id(viewId); + discoBuilder.setFinal(true); + List<Integer> actives = new LinkedList<Integer>(); + List<Integer> inactives = new LinkedList<Integer>(); + for (Map.Entry<String, Long> entry : leaseUpdates.entrySet()) { + int id = getClusterNodeId(entry.getKey()); + if (isTimedout(entry.getValue(), config)) { + inactives.add(id); + } else { + actives.add(id); + } + } + discoBuilder.activeIds(actives.toArray(new Integer[0])); + discoBuilder.inactiveIds(inactives.toArray(new Integer[0])); + return discoBuilder; + } + + private boolean isTimedout(Long lastHeartbeat, OakTestConfig config) { + return System.currentTimeMillis() > lastHeartbeat + (1000 * config.getViewCheckerTimeout()); + } + + private int getClusterNodeId(String slingId) { + Integer id = clusterNodeIds.get(slingId); + if (id==null) { + id = ++highestId; + clusterNodeIds.put(slingId, id); + } + return id; + } + + public void reset() { + clusterNodeIds.clear(); + } + +} Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/java/org/apache/sling/discovery/oak/its/setup/SimulatedLeaseCollection.java ------------------------------------------------------------------------------ svn:eol-style = native Added: sling/trunk/bundles/extensions/discovery/oak/src/test/resources/log4j.properties URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/oak/src/test/resources/log4j.properties?rev=1709867&view=auto ============================================================================== --- sling/trunk/bundles/extensions/discovery/oak/src/test/resources/log4j.properties (added) +++ sling/trunk/bundles/extensions/discovery/oak/src/test/resources/log4j.properties Wed Oct 21 15:50:37 2015 @@ -0,0 +1,26 @@ +# 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. + +log4j.rootLogger=INFO, stdout + +log4j.logger.org.apache.jackrabbit.core.TransientRepository=WARN +#log4j.logger.org.apache.sling.discovery.impl=DEBUG + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +#log4j.appender.stdout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m (%F, line %L)\n +log4j.appender.stdout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m\n Propchange: sling/trunk/bundles/extensions/discovery/oak/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn:eol-style = native