/*
* Copyright 2002-2016 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.springframework.context.event.test;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import static org.junit.Assert.*;
/**
* Test utility to collect and assert events.
*
* @author Stephane Nicoll
* @author Juergen Hoeller
*/
@Component
public class EventCollector {
private final MultiValueMap<String, Object> content = new LinkedMultiValueMap<>();
/**
* Register an event for the specified listener.
*/
public void addEvent(Identifiable listener, Object event) {
this.content.add(listener.getId(), event);
}
/**
* Return the events that the specified listener has received. The list of events
* is ordered according to their reception order.
*/
public List<Object> getEvents(Identifiable listener) {
return this.content.get(listener.getId());
}
/**
* Assert that the listener identified by the specified id has not received any event.
*/
public void assertNoEventReceived(String listenerId) {
List<Object> events = this.content.getOrDefault(listenerId, Collections.emptyList());
assertEquals("Expected no events but got " + events, 0, events.size());
}
/**
* Assert that the specified listener has not received any event.
*/
public void assertNoEventReceived(Identifiable listener) {
assertNoEventReceived(listener.getId());
}
/**
* Assert that the listener identified by the specified id has received the
* specified events, in that specific order.
*/
public void assertEvent(String listenerId, Object... events) {
List<Object> actual = this.content.getOrDefault(listenerId, Collections.emptyList());
assertEquals("Wrong number of events", events.length, actual.size());
for (int i = 0; i < events.length; i++) {
assertEquals("Wrong event at index " + i, events[i], actual.get(i));
}
}
/**
* Assert that the specified listener has received the specified events, in
* that specific order.
*/
public void assertEvent(Identifiable listener, Object... events) {
assertEvent(listener.getId(), events);
}
/**
* Assert the number of events received by this instance. Checks that
* unexpected events have not been received. If an event is handled by
* several listeners, each instance will be registered.
*/
public void assertTotalEventsCount(int number) {
int actual = 0;
for (Map.Entry<String, List<Object>> entry : this.content.entrySet()) {
actual += entry.getValue().size();
}
assertEquals("Wrong number of total events (" + this.content.size() +
") registered listener(s)", number, actual);
}
/**
* Clear the collected events, allowing for reuse of the collector.
*/
public void clear() {
this.content.clear();
}
}