| /* |
| * 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.base.its.setup.mock; |
| |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Iterator; |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import org.apache.sling.discovery.TopologyEvent; |
| import org.apache.sling.discovery.TopologyEvent.Type; |
| import org.apache.sling.discovery.TopologyEventListener; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| public class AssertingTopologyEventListener implements TopologyEventListener { |
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
| private final List<TopologyEventAsserter> expectedEvents = new LinkedList<TopologyEventAsserter>(); |
| |
| private String debugInfo = null; |
| |
| private String errorMsg = null; |
| |
| public AssertingTopologyEventListener() { |
| } |
| |
| public AssertingTopologyEventListener(String debugInfo) { |
| this.debugInfo = debugInfo; |
| } |
| |
| @Override |
| public String toString() { |
| return super.toString()+"-[debugInfo="+debugInfo+"]"; |
| } |
| |
| private List<TopologyEvent> events_ = new LinkedList<TopologyEvent>(); |
| |
| private List<TopologyEvent> unexpectedEvents_ = new LinkedList<TopologyEvent>(); |
| |
| public void handleTopologyEvent(TopologyEvent event) { |
| final String logPrefix = "handleTopologyEvent["+(debugInfo!=null ? debugInfo : "this="+this) +"] "; |
| logger.info(logPrefix + "got event=" + event); |
| TopologyEventAsserter asserter = null; |
| synchronized (expectedEvents) { |
| if (expectedEvents.size() == 0) { |
| unexpectedEvents_.add(event); |
| throw new IllegalStateException( |
| "no expected events anymore. But got: " + event); |
| } |
| asserter = expectedEvents.remove(0); |
| } |
| if (asserter == null) { |
| throw new IllegalStateException("this should not occur"); |
| } |
| try{ |
| asserter.assertOk(event); |
| logger.info(logPrefix + "event matched expectations (" + event+")"); |
| } catch(RuntimeException re) { |
| synchronized(expectedEvents) { |
| unexpectedEvents_.add(event); |
| } |
| throw re; |
| } catch(Error er) { |
| synchronized(expectedEvents) { |
| unexpectedEvents_.add(event); |
| } |
| throw er; |
| } |
| try{ |
| switch(event.getType()) { |
| case PROPERTIES_CHANGED: { |
| assertNotNull(event.getOldView()); |
| assertNotNull(event.getNewView()); |
| assertTrue(event.getNewView().isCurrent()); |
| assertFalse(event.getOldView().isCurrent()); |
| break; |
| } |
| case TOPOLOGY_CHANGED: { |
| assertNotNull(event.getOldView()); |
| assertNotNull(event.getNewView()); |
| assertTrue(event.getNewView().isCurrent()); |
| assertFalse(event.getOldView().isCurrent()); |
| break; |
| } |
| case TOPOLOGY_CHANGING: { |
| assertNotNull(event.getOldView()); |
| assertNull(event.getNewView()); |
| assertFalse(event.getOldView().isCurrent()); |
| break; |
| } |
| case TOPOLOGY_INIT: { |
| assertNull(event.getOldView()); |
| assertNotNull(event.getNewView()); |
| // cannot make any assertions on event.getNewView().isCurrent() |
| // as that can be true or false |
| break; |
| } |
| } |
| } catch(RuntimeException re) { |
| logger.error("RuntimeException: "+re, re); |
| throw re; |
| } catch(AssertionError e) { |
| logger.error("AssertionError: "+e, e); |
| throw e; |
| } |
| events_.add(event); |
| } |
| |
| public List<TopologyEvent> getEvents() { |
| return events_; |
| } |
| |
| public void addExpected(Type expectedType) { |
| addExpected(new AcceptsParticularTopologyEvent(expectedType)); |
| } |
| |
| public void addExpected(TopologyEventAsserter topologyEventAsserter) { |
| expectedEvents.add(topologyEventAsserter); |
| } |
| |
| public int getRemainingExpectedCount() { |
| return expectedEvents.size(); |
| } |
| |
| public int getUnexpectedCount() { |
| return unexpectedEvents_.size(); |
| } |
| |
| public void dump() { |
| StringBuffer ue = new StringBuffer(); |
| if (unexpectedEvents_.size()>0) { |
| for (Iterator<TopologyEvent> it = unexpectedEvents_.iterator(); it.hasNext();) { |
| TopologyEvent topologyEvent = it.next(); |
| ue.append(topologyEvent+", "); |
| } |
| unexpectedEvents_.iterator(); |
| } |
| logger.info("dump: got "+events_.size()+" events, "+unexpectedEvents_.size()+" (details: "+ue+") thereof unexpected. My list of expected events contains "+expectedEvents.size()); |
| } |
| } |