/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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.pentaho.di.trans.steps.syslog; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleStepException; import org.pentaho.di.core.logging.LoggingObjectInterface; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.StepDataInterface; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.trans.steps.mock.StepMockHelper; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class SyslogMessageConcurrentTest { AtomicInteger numOfErrors = null; CountDownLatch countDownLatch = null; private String testMessage = "message value"; int numOfTasks = 5; @Before public void setUp() throws Exception { numOfErrors = new AtomicInteger( 0 ); countDownLatch = new CountDownLatch( 1 ); } @Test( timeout = 10000 ) public void concurrentSyslogMessageTest() throws Exception { SyslogMessageTask syslogMessage = null; ExecutorService service = Executors.newFixedThreadPool( numOfTasks ); for ( int i = 0; i < numOfTasks; i++ ) { syslogMessage = createSyslogMessageTask(); service.execute( syslogMessage ); } service.shutdown(); countDownLatch.countDown(); service.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS ); Assert.assertTrue( numOfErrors.get() == 0 ); } private class SyslogMessageTask extends SyslogMessage implements Runnable { SyslogMessageMeta syslogMessageMeta = null; public SyslogMessageTask( StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta, Trans trans, SyslogMessageMeta processRowsStepMetaInterface ) { super( stepMeta, stepDataInterface, copyNr, transMeta, trans ); syslogMessageMeta = processRowsStepMetaInterface; } @Override public void run() { try { countDownLatch.await(); processRow( syslogMessageMeta, getStepDataInterface() ); } catch ( Exception e ) { e.printStackTrace(); numOfErrors.getAndIncrement(); } finally { try { dispose( syslogMessageMeta, getStepDataInterface() ); } catch ( Exception e ) { e.printStackTrace(); numOfErrors.getAndIncrement(); } } } @Override public void putRow( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException { Assert.assertNotNull( row ); Assert.assertTrue( row.length == 1 ); Assert.assertEquals( testMessage, row[0] ); } @Override public Object[] getRow() throws KettleException { return new Object[]{ testMessage }; } } private SyslogMessageTask createSyslogMessageTask() throws Exception { SyslogMessageData data = new SyslogMessageData(); StepMockHelper<SyslogMessageMeta, SyslogMessageData> stepMockHelper = new StepMockHelper<SyslogMessageMeta, SyslogMessageData>( "SYSLOG_MESSAGE TEST", SyslogMessageMeta.class, SyslogMessageData.class ); when( stepMockHelper.logChannelInterfaceFactory.create( any(), any( LoggingObjectInterface.class ) ) ).thenReturn( stepMockHelper.logChannelInterface ); when( stepMockHelper.processRowsStepMetaInterface.getServerName() ).thenReturn( "localhost" ); when( stepMockHelper.processRowsStepMetaInterface.getMessageFieldName() ).thenReturn( "message field" ); when( stepMockHelper.processRowsStepMetaInterface.getPort() ).thenReturn( "9988" ); when( stepMockHelper.processRowsStepMetaInterface.getPriority() ).thenReturn( "ERROR" ); RowMetaInterface inputRowMeta = mock( RowMetaInterface.class ); when( inputRowMeta.indexOfValue( any() ) ).thenReturn( 0 ); when( inputRowMeta.getString( any(), eq( 0 ) ) ).thenReturn( testMessage ); SyslogMessageTask syslogMessage = new SyslogMessageTask( stepMockHelper.stepMeta, data, 0, stepMockHelper.transMeta, stepMockHelper.trans, stepMockHelper.processRowsStepMetaInterface ); syslogMessage.init( stepMockHelper.processRowsStepMetaInterface, data ); syslogMessage.setInputRowMeta( inputRowMeta ); return syslogMessage; } }