+++ /dev/null
-/*
- * Copyright 2005-2011 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.xmlrouter.impl;
-
-import static org.mockito.Matchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.UUID;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.transform.dom.DOMSource;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.wamblee.general.SystemClock;
-import org.wamblee.xmlrouter.common.Id;
-import org.wamblee.xmlrouter.config.DocumentType;
-import org.wamblee.xmlrouter.config.Filter;
-import org.wamblee.xmlrouter.config.Transformation;
-import org.wamblee.xmlrouter.listener.EventInfo;
-import org.wamblee.xmlrouter.listener.EventListener;
-import org.wamblee.xmlrouter.listener.LoggingEventListener;
-import org.wamblee.xmlrouter.subscribe.Destination;
-
-public class XMLRouterTest {
-
- public static class MyDestination implements Destination {
-
- private boolean receiveResult;
- private Collection<String> types;
-
- public MyDestination(boolean aReceiveResult, Collection<String> aTypes) {
- receiveResult = aReceiveResult;
- types = aTypes;
- }
-
- @Override
- public Collection<String> chooseFromTargetTypes(
- Collection<String> aPossibleTargetTypes) {
- return types;
- }
-
- @Override
- public String getName() {
- return "xxx";
- }
-
- @Override
- public boolean receive(DOMSource aEvent) {
- return receiveResult;
- }
- }
-
- private ExtendedRouterConfig routerConfig;
- private XMLRouterConfiguration config;
- private XMLRouter router;
- private DOMSource source1;
- private DOMSource source2;
- private DOMSource source3;
-
- private Destination destinationSpy;
- private Id<Destination> destinationId;
- private EventListener listener;
-
- @Before
- public void setUp() {
-
- Logger logger = Logger.getLogger(XMLRouter.class.getName());
- setLogLevel(logger, Level.FINEST);
-
- routerConfig = new SingleRouterConfig("routerconfig");
- config = new XMLRouterConfigurationImpl(routerConfig);
- EventListener logListener = new LoggingEventListener(Level.INFO);
- listener = spy(logListener);
- router = new XMLRouter(new SystemClock(), config, listener);
- source1 = mock(DOMSource.class);
- source2 = mock(DOMSource.class);
- source3 = mock(DOMSource.class);
- }
-
- private void setLogLevel(Logger aLogger, Level aLevel) {
- aLogger.setLevel(aLevel);
- for (Handler handler : aLogger.getHandlers()) {
- handler.setLevel(Level.FINEST);
- }
- Logger parent = aLogger.getParent();
- if (parent != null) {
- setLogLevel(parent, aLevel);
- }
- }
-
- @Test
- public void testNoInputDocumentsRegistered() {
- Destination destination = new MyDestination(true, Arrays.asList("any"));
- destinationSpy = spy(destination);
-
- destinationId = router.registerDestination(destinationSpy);
- router.publish("any", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- }
-
- @Test
- public void testMisBehavingDocumentType() {
- DocumentType type = mockDocument("docid");
- doThrow(new RuntimeException("x")).when(type).isInstance(
- any(DOMSource.class));
- routerConfig.documentTypeConfig().add(type);
- router.publish("xx", mock(DOMSource.class));
- verify(listener).notDelivered(any(EventInfo.class));
- // no exception should occur.
- }
-
- private DocumentType mockDocument(String docid) {
- DocumentType type = mock(DocumentType.class);
- when(type.getId()).thenReturn(new Id<DocumentType>(docid));
- return type;
- }
-
- @Test
- public void testMisBehavingFilter() {
- registerDocumentType("any");
- Filter filter = mockFilter("filterid");
- doThrow(new RuntimeException("x")).when(filter).isAllowed(anyString(),
- any(DOMSource.class));
- routerConfig.filterConfig().add(filter);
- router.publish("xx", mock(DOMSource.class));
- verify(listener).notDelivered(any(EventInfo.class));
- // no exception should occur.
- }
-
- private Filter mockFilter(String filterId) {
- Filter filter = mock(Filter.class);
- when(filter.getId()).thenReturn(new Id<Filter>(filterId));
- return filter;
- }
-
- @Test
- public void testOneDestinationNoTransformationSuccess() {
- destinationSpy = registerDestination(true, "any");
- registerDocumentType("any");
-
- router.publish("any", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
- verify(destinationSpy).receive(same(source1));
-
- // Unregister the destination.
- router.unregisterDestination(destinationId);
- resetMocks();
- router.publish("any", source2);
- verify(listener).notDelivered(any(EventInfo.class));
- verifyNoMoreInteractions(destinationSpy);
- }
-
- private void resetMocks() {
- reset(destinationSpy);
- reset(listener);
- }
-
- private void registerDocumentType(String aType) {
- DocumentType type = mockDocument(UUID.randomUUID().toString());
- when(type.isInstance(any(DOMSource.class))).thenReturn(true);
- when(type.getName()).thenReturn(aType);
- routerConfig.documentTypeConfig().add(type);
- }
-
- private void registerDocumentType(String aType, DOMSource aSource) {
- DocumentType type = mock(DocumentType.class);
- when(type.isInstance(same(aSource))).thenReturn(true);
- when(type.getName()).thenReturn(aType);
- when(type.getId()).thenReturn(new Id<DocumentType>(aType));
- routerConfig.documentTypeConfig().add(type);
- }
-
- private Destination registerDestination(boolean aResult, String... types) {
- Destination destination = new MyDestination(aResult,
- Arrays.asList(types));
- Destination myspy = spy(destination);
- destinationId = router.registerDestination(myspy);
- return myspy;
- }
-
- @Test
- public void testOneDestinationNotMatches() {
- destinationSpy = registerDestination(true);
- registerDocumentType("any");
-
- router.publish("any", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- verify(destinationSpy, never()).receive(any(DOMSource.class));
- }
-
- @Test
- public void testOneDestinationThrowsException() {
- destinationSpy = registerDestination(true, "any");
- registerDocumentType("any");
-
- doThrow(new RuntimeException()).when(destinationSpy).receive(
- any(DOMSource.class));
-
- router.publish("any", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- verify(destinationSpy).receive(same(source1));
- }
-
- @Test
- public void testOneDestinationThrowsExceptionSecondDestinationStillHandled() {
- testOneDestinationThrowsException();
- Destination destination2 = new MyDestination(true, Arrays.asList("any"));
- Destination destinationSpy2 = spy(destination2);
- Id<Destination> destinationId2 = router
- .registerDestination(destinationSpy2);
-
- router.publish("any", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(destinationSpy2).receive(same(source1));
-
- }
-
- @Test
- public void testDestinationChooseFromTargetTypesThrowsException() {
- destinationSpy = registerDestination(true, "any");
- registerDocumentType("any");
-
- doThrow(new RuntimeException()).when(destinationSpy)
- .chooseFromTargetTypes((Collection<String>) anyObject());
-
- router.publish("any", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- verify(destinationSpy, never()).receive(same(source1));
- }
-
- @Test
- public void testDestinationChooseFromTargetTypesThrowsExceptionSecondDestinationStillOk() {
- testDestinationChooseFromTargetTypesThrowsException();
-
- Destination destination2 = new MyDestination(true, Arrays.asList("any"));
- Destination destinationSpy2 = spy(destination2);
- Id<Destination> destinationId2 = router
- .registerDestination(destinationSpy2);
- router.publish("any", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(destinationSpy, never()).receive(same(source1));
- verify(destinationSpy2).receive(same(source1));
- }
-
- @Test
- public void testDestinationChooseFromTargetTypesReturnsNull() {
- destinationSpy = registerDestination(true, "any");
- registerDocumentType("any");
-
- when(
- destinationSpy
- .chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(null);
-
- router.publish("any", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- verify(destinationSpy, never()).receive(same(source1));
- }
-
- @Test
- public void testDestinationChooseFromTargetTypesReturnsNullSecondDestinationStillOk() {
- testDestinationChooseFromTargetTypesReturnsNull();
-
- Destination destination2 = new MyDestination(true, Arrays.asList("any"));
- Destination destinationSpy2 = spy(destination2);
- Id<Destination> destinationId2 = router
- .registerDestination(destinationSpy2);
- router.publish("any", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(destinationSpy, never()).receive(same(source1));
- verify(destinationSpy2).receive(same(source1));
- }
-
- @Test
- public void testOneTransformationOneDestination() {
- registerDocumentType("any");
- Transformation transformation = mock(Transformation.class);
- when(transformation.getId())
- .thenReturn(new Id<Transformation>("trans"));
- when(transformation.getFromType()).thenReturn("any");
- when(transformation.getToType()).thenReturn("bla");
- when(transformation.transform(same(source1))).thenReturn(source2);
- routerConfig.transformationConfig().add(transformation);
- config.setRouterConfig(routerConfig);
-
- Destination destination = mock(Destination.class);
- when(
- destination.chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(Arrays.asList("bla"));
-
- router.registerDestination(destination);
-
- when(destination.receive(any(DOMSource.class))).thenReturn(true);
- router.publish("bla", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(transformation).transform(source1);
- verify(destination).receive(same(source2));
-
- // now the same when the destination rejects the event.
- when(destination.receive(any(DOMSource.class))).thenReturn(false);
- router.publish("bla", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- }
-
- @Test
- public void testOneTransformationOneDestinationFilterRejectsDestinationDocType() {
- registerDocumentType("any");
-
- Transformation transformation = mock(Transformation.class);
- when(transformation.getId())
- .thenReturn(new Id<Transformation>("trans"));
- when(transformation.getFromType()).thenReturn("any");
- when(transformation.getToType()).thenReturn("bla");
- when(transformation.transform(same(source1))).thenReturn(source2);
- routerConfig.transformationConfig().add(transformation);
-
- Filter filter = mock(Filter.class);
- when(filter.getId()).thenReturn(new Id<Filter>("f"));
- when(filter.isAllowed(anyString(), same(source2))).thenReturn(false);
- when(filter.isAllowed(anyString(), same(source1))).thenReturn(true);
- routerConfig.filterConfig().add(filter);
-
- config.setRouterConfig(routerConfig);
-
- Destination destination = mock(Destination.class);
- when(
- destination.chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(Arrays.asList("bla"));
-
- router.registerDestination(destination);
-
- when(destination.receive(any(DOMSource.class))).thenReturn(true);
- router.publish("bla", source1);
- verify(listener).notDelivered(any(EventInfo.class));
-
- verify(transformation).transform(source1);
- verify(destination, never()).receive(any(DOMSource.class));
- }
-
- @Test
- public void testMisbehavingTransformationOneDestination() {
- registerDocumentType("any");
- Transformation transformation = mock(Transformation.class);
- when(transformation.getId())
- .thenReturn(new Id<Transformation>("trans"));
- when(transformation.getFromType()).thenReturn("any");
- when(transformation.getToType()).thenReturn("bla");
- doThrow(new RuntimeException("x")).when(transformation).transform(
- same(source1));
- routerConfig.transformationConfig().add(transformation);
-
- Destination destination = mock(Destination.class);
- when(
- destination.chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(Arrays.asList("bla"));
-
- router.registerDestination(destination);
-
- when(destination.receive(any(DOMSource.class))).thenReturn(true);
- router.publish("bla", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- }
-
- private Transformation createTransformation(String aFrom, String aTo,
- DOMSource aSource, DOMSource aTarget) {
- Transformation transformation = mock(Transformation.class);
- when(transformation.getId()).thenReturn(
- new Id<Transformation>(UUID.randomUUID().toString()));
- when(transformation.getFromType()).thenReturn(aFrom);
- when(transformation.getToType()).thenReturn(aTo);
- when(transformation.transform(same(aSource))).thenReturn(aTarget);
- return transformation;
- }
-
- @Test
- public void testOneTransformationReturnsNull() {
- registerDocumentType("any");
- Transformation transformation = createTransformation("any", "bla",
- source1, null);
-
- routerConfig.transformationConfig().add(transformation);
- config.setRouterConfig(routerConfig);
- Destination destination = mock(Destination.class);
- when(
- destination.chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(Arrays.asList("bla"));
- router.registerDestination(destination);
-
- router.publish("bla", source1);
- verify(listener).notDelivered(any(EventInfo.class));
-
- verify(transformation).transform(source1);
- verify(destination, never()).receive(any(DOMSource.class));
-
- // add second transformation that behaves normally
- Transformation transformation2 = createTransformation("any", "bla2",
- source1, source2);
-
- routerConfig.transformationConfig().add(transformation2);
- config.setRouterConfig(routerConfig);
- when(
- destination.chooseFromTargetTypes((Collection<String>) anyObject()))
- .thenReturn(Arrays.asList("bla", "bla2"));
-
- reset(transformation);
- when(transformation.getId())
- .thenReturn(new Id<Transformation>("trans"));
- when(transformation.getFromType()).thenReturn("any");
- when(transformation.getToType()).thenReturn("bla");
- when(transformation.transform(same(source1))).thenReturn(null);
-
- when(destination.receive(any(DOMSource.class))).thenReturn(true);
- router.publish("bla", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(transformation).transform(source1);
- verify(transformation2).transform(source1);
-
- verify(destination).receive(same(source2));
-
- }
-
- @Test
- public void testChooseMultipleDestinationsOneType() {
- Destination dest1 = registerDestination(true, "any");
- Destination dest2 = registerDestination(true, "any");
- registerDocumentType("any");
-
- router.publish("source", source1);
- verify(listener, times(2)).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(dest1).receive(same(source1));
- verify(dest2).receive(same(source1));
- }
-
- @Test
- public void testMultipleDeliveryToOneDestination() {
- Destination dest = registerDestination(true, "any", "other");
- registerDocumentType("any", source1);
- registerDocumentType("other", source2);
- Transformation transformation = createTransformation("any", "other",
- source1, source2);
- routerConfig.transformationConfig().add(transformation);
- config.setRouterConfig(routerConfig);
-
- router.publish("source", source1);
- verify(listener, times(2)).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(dest).receive(same(source1));
- verify(dest).receive(same(source2));
- }
-
- @Test
- public void testMultipleTransformations() {
- Destination dest = registerDestination(true, "other");
- registerDocumentType("any", source1);
- registerDocumentType("other", source3);
-
- Transformation t1 = createTransformation("any", "intermediate",
- source1, source2);
- routerConfig.transformationConfig().add(t1);
- Transformation t2 = createTransformation("intermediate", "other",
- source2, source3);
- routerConfig.transformationConfig().add(t2);
- config.setRouterConfig(routerConfig);
-
- router.publish("source", source1);
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(true));
-
- verify(dest).receive(same(source3));
- }
-
- @Test
- public void testMultipleTransformationsFilterRejectsIntermediateDocument() {
- Destination dest = registerDestination(true, "other");
- registerDocumentType("any", source1);
- registerDocumentType("other", source3);
-
- Transformation t1 = createTransformation("any", "intermediate",
- source1, source2);
- routerConfig.transformationConfig().add(t1);
- Transformation t2 = createTransformation("intermediate", "other",
- source2, source3);
- routerConfig.transformationConfig().add(t2);
- config.setRouterConfig(routerConfig);
-
- Filter filter = mock(Filter.class);
- when(filter.getId()).thenReturn(new Id<Filter>("f"));
- when(filter.isAllowed(anyString(), same(source1))).thenReturn(true);
- when(filter.isAllowed(anyString(), same(source2))).thenReturn(false);
- when(filter.isAllowed(anyString(), same(source3))).thenReturn(true);
- routerConfig.filterConfig().add(filter);
-
- router.publish("source", source1);
- verify(listener).notDelivered(any(EventInfo.class));
- verify(dest, never()).receive(any(DOMSource.class));
- }
-
- @Test
- public void testDestinationGivesError() {
- Destination destination = mock(Destination.class);
- when(destination.getName()).thenReturn("name");
- when(destination.chooseFromTargetTypes(anyCollectionOf(String.class)))
- .thenReturn(Arrays.asList("any"));
- doThrow(new RuntimeException("x")).when(destination).receive(
- any(DOMSource.class));
- router.registerDestination(destination);
-
- registerDocumentType("any");
-
- router.publish("source", source1);
-
- verify(listener).delivered(any(EventInfo.class),
- anyListOf(Transformation.class), anyString(), eq(false));
-
- }
-}