/* * Copyright 2006 the original author or authors. * * Licensed 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.wamblee.test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Tracks the occurence of certain events in a test environment. Threads in a * test environment tell the event tracker of the occurrence of certain events * using {@link #eventOccurred(Event)}. Test code inspects the events sent by a * thread using {@link #isEventSent(Thread, Event)}. * * A record is kept of every event which is sent. Therefore, the occurrence of a * new event does not erase a previously sent event. * * @param * Type of event sent from test code. Usually String will be * sufficient. The event type must provide a sensible implementation * of {@link java.lang.Object#equals(java.lang.Object)}. * * @author Erik Brakkee */ public class EventTracker { private static final Log LOG = LogFactory.getLog(EventTracker.class); /** * Map of Thread object to a list of events. */ private Map> events; /** * Constructs the event tracker. * */ public EventTracker() { clear(); } public void clear() { events = new HashMap>(); } /** * Called by a thread to inform that an event has occurred. * * @param aEvent * Event that was sent. */ public synchronized void eventOccurred(Event aEvent) { LOG.info("Event '" + aEvent + "' sent."); Thread current = Thread.currentThread(); List eventList = events.get(current); if (eventList == null) { eventList = new ArrayList(); events.put(current, eventList); } eventList.add(aEvent); } /** * Checks if a specific event has happened in a specific thread. * * @param aThread * Thread to check. * @param aEvent * Event to check for. * @return Whether or not the event was sent. */ public synchronized boolean isEventSent(Thread aThread, Event aEvent) { List eventList = events.get(aThread); if (eventList == null) { return false; } return eventList.contains(aEvent); } /** * Gets the events for a thread in the order they were sent * * @param aThread * Thread to get events for. * @return Events that were sent. A zero-sized array is returned if no * events were sent. */ public synchronized List getEvents(Thread aThread) { List eventList = events.get(aThread); if (eventList == null) { eventList = Collections.emptyList(); } return Collections.unmodifiableList(eventList); } /** * Gets the number of times an event was sent summed up * over all threads. * * @param aEvent * Event to check. * @return Number of times it was reached. */ public synchronized int getEventCount(Event aEvent) { int count = 0; for (Thread thread : events.keySet()) { List eventList = events.get(thread); for (Event event : eventList) { if (event.equals(aEvent)) { count++; } } } return count; } /** * Gets the total event count over all threads. * @return */ public synchronized int getEventCount() { int count = 0; for (Thread thread : events.keySet()) { count += events.get(thread).size(); } return count; } }