/* * Copyright 2014 The Sculptor Project Team, including 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.sculptor.framework.event.annotation; import static org.junit.Assert.assertTrue; import static org.junit.Assert.*; import org.junit.Test; import org.sculptor.framework.event.Event; import org.sculptor.framework.event.EventBus; import org.sculptor.framework.event.EventSubscriber; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; public class SubscribeBeanPostProcessorTest { @Test public void testWithValidEventSubscriber() { final DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("eventBus", BeanDefinitionBuilder.genericBeanDefinition(TestEventBus.class) .getBeanDefinition()); factory.registerBeanDefinition("eventListener", BeanDefinitionBuilder.genericBeanDefinition(ValidEventSubscriber.class).getBeanDefinition()); final SubscribeBeanPostProcessor bpp = new SubscribeBeanPostProcessor(); bpp.setBeanFactory(factory); factory.addBeanPostProcessor(bpp); factory.preInstantiateSingletons(); TestEventBus eventBus = factory.getBean(TestEventBus.class); assertNotNull(eventBus); assertEquals(1, eventBus.subscriptions); factory.destroySingletons(); assertEquals(1, eventBus.unsubscriptions); } @Test public void testWithMissingTopic() { try { final DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("eventListener", BeanDefinitionBuilder.genericBeanDefinition(EventSubscriberWithoutTopic.class) .getBeanDefinition()); final SubscribeBeanPostProcessor bpp = new SubscribeBeanPostProcessor(); bpp.setBeanFactory(factory); factory.addBeanPostProcessor(bpp); factory.preInstantiateSingletons(); fail("Should have thrown BeanCreationException"); } catch (BeanCreationException e) { String message = e.getCause().getMessage(); assertTrue(message.contains("No topic specified")); } } @Test public void testWithMissingEventBus() { try { final DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("eventListener", BeanDefinitionBuilder.genericBeanDefinition(EventSubscriberWithoutEventBus.class) .getBeanDefinition()); final SubscribeBeanPostProcessor bpp = new SubscribeBeanPostProcessor(); bpp.setBeanFactory(factory); factory.addBeanPostProcessor(bpp); factory.preInstantiateSingletons(); fail("Should have thrown BeanCreationException"); } catch (BeanCreationException e) { String message = e.getCause().getMessage(); assertTrue(message.contains("No event bus specified")); } } @Test public void testWithUnknownEventBus() { try { final DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("eventBus", BeanDefinitionBuilder.genericBeanDefinition(TestEventBus.class) .getBeanDefinition()); factory.registerBeanDefinition("eventListener", BeanDefinitionBuilder.genericBeanDefinition(EventSubscriberWithUnknownEventBus.class) .getBeanDefinition()); final SubscribeBeanPostProcessor bpp = new SubscribeBeanPostProcessor(); bpp.setBeanFactory(factory); factory.addBeanPostProcessor(bpp); factory.preInstantiateSingletons(); fail("Should have thrown BeanCreationException"); } catch (BeanCreationException e) { String message = e.getCause().getMessage(); assertTrue(message.contains("Event bus")); assertTrue(message.contains("is not available")); } } @Test public void testWithInvalidEventBus() { try { final DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); factory.registerBeanDefinition("eventBus", BeanDefinitionBuilder.genericBeanDefinition(Object.class) .getBeanDefinition()); factory.registerBeanDefinition("eventListener", BeanDefinitionBuilder.genericBeanDefinition(ValidEventSubscriber.class).getBeanDefinition()); final SubscribeBeanPostProcessor bpp = new SubscribeBeanPostProcessor(); bpp.setBeanFactory(factory); factory.addBeanPostProcessor(bpp); factory.preInstantiateSingletons(); fail("Should have thrown BeanCreationException"); } catch (BeanCreationException e) { String message = e.getCause().getMessage(); assertTrue(message.contains("Event bus")); assertTrue(message.contains("is not of type")); } } @Subscribe(topic = "test", eventBus = "eventBus") private static class ValidEventSubscriber implements EventSubscriber { @Override public void receive(Event event) { } } @Subscribe(eventBus = "eventBus") private static class EventSubscriberWithoutTopic implements EventSubscriber { @Override public void receive(Event event) { } } @Subscribe(topic = "test", eventBus = "") private static class EventSubscriberWithoutEventBus implements EventSubscriber { @Override public void receive(Event event) { } } @Subscribe(topic = "test", eventBus = "unknown") private static class EventSubscriberWithUnknownEventBus implements EventSubscriber { @Override public void receive(Event event) { } } private static class TestEventBus implements EventBus { int subscriptions = 0; int unsubscriptions = 0; @Override public boolean publish(String topic, Event event) { return true; } @Override public boolean subscribe(String topic, EventSubscriber subscriber) { subscriptions++; return true; } @Override public boolean unsubscribe(String topic, EventSubscriber subscriber) { unsubscriptions++; return true; } } }