/* * Copyright 2006-2007 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.batch.core.listener; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.scope.context.ChunkContext; /** * @author Dave Syer * */ public class MulticasterBatchListenerTests { private MulticasterBatchListener<Integer, String> multicast = new MulticasterBatchListener<Integer, String>(); private int count = 0; private boolean error = false; @Before public void setUp() { multicast.register(new CountingStepListenerSupport()); } @Test public void testSetListeners() { JobExecution jobExecution = new JobExecution(1L); StepExecution stepExecution = new StepExecution("s1", jobExecution); multicast.setListeners(Arrays.asList(new StepListenerSupport<Integer, String>() { @Override public ExitStatus afterStep(StepExecution stepExecution) { count++; return super.afterStep(stepExecution); } })); multicast.afterStep(stepExecution); // setListeners is cumulative (should be OK if used for DI) assertEquals(2, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#register(org.springframework.batch.core.StepListener)} * . */ @Test public void testRegister() { JobExecution jobExecution = new JobExecution(1L); StepExecution stepExecution = new StepExecution("s1", jobExecution); multicast.register(new StepListenerSupport<Integer, String>() { @Override public ExitStatus afterStep(StepExecution stepExecution) { count++; return super.afterStep(stepExecution); } }); multicast.afterStep(stepExecution); assertEquals(2, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterStep(org.springframework.batch.core.StepExecution)} * . */ @Test public void testAfterStepFails() { error = true; try { multicast.afterStep(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)} * . */ @Test public void testBeforeStep() { multicast.beforeStep(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)} * . */ @Test public void testBeforeStepFails() { error = true; try { multicast.beforeStep(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk(ChunkContext context)} * . */ @Test public void testAfterChunk() { multicast.afterChunk(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk(ChunkContext context)} * . */ @Test public void testAfterChunkFails() { error = true; try { multicast.afterChunk(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk(ChunkContext context)} * . */ @Test public void testBeforeChunk() { multicast.beforeChunk(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk(ChunkContext context)} * . */ @Test public void testBeforeChunkFails() { error = true; try { multicast.beforeChunk(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)} * . */ @Test public void testAfterRead() { multicast.afterRead(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)} * . */ @Test public void testAfterReadFails() { error = true; try { multicast.afterRead(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()} * . */ @Test public void testBeforeRead() { multicast.beforeRead(); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()} * . */ @Test public void testBeforeReadFails() { error = true; try { multicast.beforeRead(); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)} * . */ @Test public void testOnReadError() { multicast.onReadError(new RuntimeException("foo")); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)} * . */ @Test public void testOnReadErrorFails() { error = true; try { multicast.onReadError(new RuntimeException("foo")); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.util.List)} * . */ @Test public void testAfterWrite() { multicast.afterWrite(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.util.List)} * . */ @Test public void testAfterWriteFails() { error = true; try { multicast.afterWrite(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(List)} * . */ @Test public void testBeforeWrite() { multicast.beforeWrite(null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(List)} * . */ @Test public void testBeforeWriteFails() { error = true; try { multicast.beforeWrite(null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(Exception, java.util.List)} * . */ @Test public void testOnWriteError() { multicast.onWriteError(new RuntimeException("foo"), null); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(Exception, java.util.List)} * . */ @Test public void testOnWriteErrorFails() { error = true; try { multicast.onWriteError(new RuntimeException("foo"), null); fail("Expected StepListenerFailedException"); } catch (StepListenerFailedException e) { // expected String message = e.getCause().getMessage(); assertEquals("Wrong message: " + message, "listener error", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)} * . */ @Test public void testOnSkipInRead() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInRead(Throwable t) { count++; super.onSkipInRead(t); } }); multicast.onSkipInRead(new RuntimeException("foo")); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)} * . */ @Test public void testOnSkipInReadFails() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInRead(Throwable t) { count++; throw new RuntimeException("foo"); } }); try { multicast.onSkipInRead(new RuntimeException("bar")); fail("Expected RuntimeException"); } catch (RuntimeException e) { // expected String message = e.getMessage(); assertEquals("Wrong message: " + message, "foo", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)} * . */ @Test public void testOnSkipInWrite() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInWrite(Object item, Throwable t) { count++; super.onSkipInWrite(item, t); } }); multicast.onSkipInWrite(null, new RuntimeException("foo")); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)} * . */ @Test public void testOnSkipInWriteFails() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInWrite(Object item, Throwable t) { count++; throw new RuntimeException("foo"); } }); try { multicast.onSkipInWrite(null, new RuntimeException("bar")); fail("Expected RuntimeException"); } catch (RuntimeException e) { // expected String message = e.getMessage(); assertEquals("Wrong message: " + message, "foo", message); } assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)} * . */ @Test public void testOnSkipInProcess() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInProcess(Object item, Throwable t) { count++; super.onSkipInWrite(item, t); } }); multicast.onSkipInProcess(null, new RuntimeException("foo")); assertEquals(1, count); } /** * Test method for * {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)} * . */ @Test public void testOnSkipInProcessFails() { multicast.register(new SkipListenerSupport<Object,Object>() { @Override public void onSkipInProcess(Object item, Throwable t) { count++; throw new RuntimeException("foo"); } }); try { multicast.onSkipInProcess(null, new RuntimeException("bar")); fail("Expected RuntimeException"); } catch (RuntimeException e) { // expected String message = e.getMessage(); assertEquals("Wrong message: " + message, "foo", message); } assertEquals(1, count); } /** * @author Dave Syer * */ private final class CountingStepListenerSupport extends StepListenerSupport<Integer, String> { @Override public void onReadError(Exception ex) { count++; if (error) { throw new RuntimeException("listener error"); } super.onReadError(ex); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#afterChunk * () */ @Override public void afterChunk(ChunkContext context) { count++; if (error) { throw new RuntimeException("listener error"); } super.afterChunk(context); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#afterRead * (java.lang.Object) */ @Override public void afterRead(Integer item) { count++; if (error) { throw new RuntimeException("listener error"); } super.afterRead(item); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#afterStep * (org.springframework.batch.core.StepExecution) */ @Override public ExitStatus afterStep(StepExecution stepExecution) { count++; if (error) { throw new RuntimeException("listener error"); } return super.afterStep(stepExecution); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#beforeChunk * () */ @Override public void beforeChunk(ChunkContext context) { count++; if (error) { throw new RuntimeException("listener error"); } super.beforeChunk(context); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#beforeRead * () */ @Override public void beforeRead() { count++; if (error) { throw new RuntimeException("listener error"); } super.beforeRead(); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#beforeStep * (org.springframework.batch.core.StepExecution) */ @Override public void beforeStep(StepExecution stepExecution) { count++; if (error) { throw new RuntimeException("listener error"); } super.beforeStep(stepExecution); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#afterWrite * (java.util.List) */ @Override public void afterWrite(List<? extends String> items) { count++; if (error) { throw new RuntimeException("listener error"); } super.afterWrite(items); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#beforeWrite * (java.util.List) */ @Override public void beforeWrite(List<? extends String> items) { count++; if (error) { throw new RuntimeException("listener error"); } super.beforeWrite(items); } /* * (non-Javadoc) * * @see * org.springframework.batch.core.listener.StepListenerSupport#onWriteError * (java.lang.Exception, java.util.List) */ @Override public void onWriteError(Exception exception, List<? extends String> items) { count++; if (error) { throw new RuntimeException("listener error"); } super.onWriteError(exception, items); } } }