/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.notifications.cachelistener;
import org.infinispan.notifications.IncorrectListenerException;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
import org.infinispan.notifications.cachelistener.event.CacheEntryRemovedEvent;
import org.infinispan.notifications.cachelistener.event.Event;
import org.infinispan.test.AbstractInfinispanTest;
import static org.testng.AssertJUnit.*;
import org.testng.annotations.Test;
import java.util.List;
@Test(groups = "unit", testName = "notifications.cachelistener.ListenerRegistrationTest")
public class ListenerRegistrationTest extends AbstractInfinispanTest {
public void testControl() {
Object l = new TestControlListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
assertEquals(1, n.getListeners().size());
}
public void testCacheListenerNoMethods() {
Object l = new TestCacheListenerNoMethodsListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
assertEquals("Hello", l.toString());
assertTrue("No listeners should be registered.", n.getListeners().isEmpty()); // since the valid listener has no methods to listen
}
public void testNonAnnotatedListener() {
Object l = new TestNonAnnotatedListener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept an un-annotated cache listener");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testNonPublicListener() {
Object l = new TestNonPublicListener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a private callback class");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testNonPublicListenerMethod() {
Object l = new TestNonPublicListenerMethodListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
// should not fail, should just not register anything
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testNonVoidReturnTypeMethod() {
Object l = new TestNonVoidReturnTypeMethodListener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a listener method with a return type");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testIncorrectMethodSignature1() {
Object l = new TestIncorrectMethodSignature1Listener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a cache listener with a bad method signature");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testIncorrectMethodSignature2() {
Object l = new TestIncorrectMethodSignature2Listener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a cache listener with a bad method signature");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testIncorrectMethodSignature3() {
Object l = new TestIncorrectMethodSignature3Listener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a cache listener with a bad method signature");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testUnassignableMethodSignature() {
Object l = new TestUnassignableMethodSignatureListener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a cache listener with a bad method signature");
}
catch (IncorrectListenerException icle) {
// expected
}
assertTrue("No listeners should be registered.", n.getListeners().isEmpty());
}
public void testPartlyUnassignableMethodSignature() {
Object l = new TestPartlyUnassignableMethodSignatureListener();
CacheNotifierImpl n = new CacheNotifierImpl();
try {
n.addListener(l);
fail("Should not accept a cache listener with a bad method signature");
}
catch (IncorrectListenerException icle) {
// expected
}
}
public void testMultipleMethods() {
Object l = new TestMultipleMethodsListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
List invocations = n.cacheEntryVisitedListeners;
assertEquals(1, invocations.size());
invocations = n.cacheEntryRemovedListeners;
assertEquals(1, invocations.size());
assertEquals(1, n.getListeners().size());
}
public void testMultipleAnnotationsOneMethod() {
Object l = new TestMultipleAnnotationsOneMethodListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
List invocations = n.cacheEntryVisitedListeners;
assertEquals(1, invocations.size());
invocations = n.cacheEntryRemovedListeners;
assertEquals(1, invocations.size());
assertEquals(1, n.getListeners().size());
}
public void testMultipleMethodsOneAnnotation() {
Object l = new TestMultipleMethodsOneAnnotationListener();
CacheNotifierImpl n = new CacheNotifierImpl();
n.addListener(l);
List invocations = n.cacheEntryVisitedListeners;
assertEquals(2, invocations.size());
assertEquals(1, n.getListeners().size());
}
@Listener
static public class TestControlListener {
@CacheEntryVisited
@CacheEntryRemoved
public void callback(Event e) {
}
}
@Listener
static public class TestCacheListenerNoMethodsListener {
public String toString() {
return "Hello";
}
}
static public class TestNonAnnotatedListener {
public String toString() {
return "Hello";
}
}
@Listener
static protected class TestNonPublicListener {
@CacheEntryVisited
public void callback() {
}
}
@Listener
static public class TestNonPublicListenerMethodListener {
@CacheEntryVisited
protected void callback(Event e) {
}
}
@Listener
static public class TestNonVoidReturnTypeMethodListener {
@CacheEntryVisited
public String callback(Event e) {
return "Hello";
}
}
@Listener
static public class TestIncorrectMethodSignature1Listener {
@CacheEntryVisited
public void callback() {
}
}
@Listener
static public class TestIncorrectMethodSignature2Listener {
@CacheEntryVisited
public void callback(Event e, String s) {
}
}
@Listener
static public class TestIncorrectMethodSignature3Listener {
@CacheEntryVisited
public void callback(Event e, String... s) {
}
}
@Listener
static public class TestUnassignableMethodSignatureListener {
@CacheEntryVisited
public void callback(CacheEntryRemovedEvent e) {
}
}
@Listener
static public class TestPartlyUnassignableMethodSignatureListener {
@CacheEntryVisited
@CacheEntryRemoved
public void callback(CacheEntryRemovedEvent e) {
}
}
@Listener
static public class TestMultipleMethodsListener {
@CacheEntryVisited
public void callback1(Event e) {
}
@CacheEntryRemoved
public void callback2(Event e) {
}
}
@Listener
static public class TestMultipleAnnotationsOneMethodListener {
@CacheEntryRemoved
@CacheEntryVisited
public void callback(Event nme) {
}
}
@Listener
static public class TestMultipleMethodsOneAnnotationListener {
@CacheEntryVisited
public void callback1(Event e) {
}
@CacheEntryVisited
public void callback2(Event e) {
}
}
}