| /* |
| * 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.impl; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import org.apache.sling.api.resource.ResourceResolver; |
| import org.apache.sling.api.resource.ResourceResolverFactory; |
| import org.apache.sling.discovery.base.its.AbstractDiscoveryServiceTest; |
| import org.apache.sling.discovery.base.its.setup.VirtualInstance; |
| import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; |
| import org.apache.sling.discovery.commons.providers.base.DummyListener; |
| import org.apache.sling.discovery.impl.DiscoveryServiceImpl; |
| import org.apache.sling.discovery.impl.common.heartbeat.HeartbeatHandler; |
| import org.apache.sling.discovery.impl.setup.FullJR2VirtualInstanceBuilder; |
| import org.junit.Test; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| public class DiscoveryServiceImplTest extends AbstractDiscoveryServiceTest { |
| |
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
| |
| @Override |
| public VirtualInstanceBuilder newBuilder() { |
| return new FullJR2VirtualInstanceBuilder(); |
| } |
| |
| @Test |
| public void testLocalClusterSyncTokenIdChange() throws Exception { |
| logger.info("testLocalClusterSyncTokenIdChange: start"); |
| logger.info("testLocalClusterSyncTokenIdChange: creating instance1..."); |
| FullJR2VirtualInstanceBuilder builder1 = |
| (FullJR2VirtualInstanceBuilder) new FullJR2VirtualInstanceBuilder() |
| .setDebugName("instance1") |
| .newRepository("/var/testLocalClusterSyncTokenIdChange/", true) |
| .setConnectorPingInterval(999) |
| .setConnectorPingTimeout(999) |
| .setMinEventDelay(0); |
| VirtualInstance instance1 = builder1.build(); |
| logger.info("testLocalClusterSyncTokenIdChange: creating instance2..."); |
| FullJR2VirtualInstanceBuilder builder2 = |
| (FullJR2VirtualInstanceBuilder) new FullJR2VirtualInstanceBuilder() |
| .setDebugName("instance2") |
| .useRepositoryOf(instance1) |
| .setConnectorPingInterval(999) |
| .setConnectorPingTimeout(999) |
| .setMinEventDelay(0); |
| VirtualInstance instance2 = builder2.build(); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: registering listener..."); |
| DummyListener listener = new DummyListener(); |
| DiscoveryServiceImpl discoveryService = (DiscoveryServiceImpl) instance1.getDiscoveryService(); |
| discoveryService.bindTopologyEventListener(listener); |
| |
| assertEquals(0, discoveryService.getViewStateManager().waitForAsyncEvents(2000)); |
| assertEquals(0, listener.countEvents()); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: doing some heartbeating..."); |
| instance1.heartbeatsAndCheckView(); |
| instance2.heartbeatsAndCheckView(); |
| Thread.sleep(1000); |
| instance1.heartbeatsAndCheckView(); |
| instance2.heartbeatsAndCheckView(); |
| Thread.sleep(1000); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: expecting to have received the INIT..."); |
| assertEquals(0, discoveryService.getViewStateManager().waitForAsyncEvents(2000)); |
| assertEquals(1, listener.countEvents()); |
| |
| ResourceResolverFactory factory = instance1.getResourceResolverFactory(); |
| ResourceResolver resolver = factory.getAdministrativeResourceResolver(null); |
| |
| instance1.heartbeatsAndCheckView(); |
| instance2.heartbeatsAndCheckView(); |
| Thread.sleep(1000); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: after another heartbeat nothing more should have been triggered..."); |
| assertEquals(0, discoveryService.getViewStateManager().waitForAsyncEvents(2000)); |
| assertEquals(1, listener.countEvents()); |
| |
| // simulate a change in the establishedView's viewId - which can be |
| // achieved by triggering a revoting - which should result with the |
| // same view cos the instances have not changed |
| HeartbeatHandler heartbeatHandler = (HeartbeatHandler) instance1.getViewChecker(); |
| logger.info("testLocalClusterSyncTokenIdChange: forcing a new voting to start..."); |
| heartbeatHandler.startNewVoting(); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: doing some heartbeats to finish the voting..."); |
| instance1.heartbeatsAndCheckView(); |
| instance2.heartbeatsAndCheckView(); |
| Thread.sleep(1000); |
| instance1.heartbeatsAndCheckView(); |
| instance2.heartbeatsAndCheckView(); |
| Thread.sleep(1000); |
| |
| logger.info("testLocalClusterSyncTokenIdChange: now we should have gotten a CHANGING/CHANGED pair additionally..."); |
| assertEquals(0, discoveryService.getViewStateManager().waitForAsyncEvents(2000)); |
| assertEquals(3, listener.countEvents()); |
| } |
| } |