/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2015 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.job.entries.trans;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import org.apache.commons.vfs2.FileObject;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.di.TestUtilities;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.ObjectLocationSpecificationMethod;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobHopMeta;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.job.entries.special.JobEntrySpecial;
import org.pentaho.di.job.entry.JobEntryCopy;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransTestFactory;
import org.pentaho.di.trans.steps.rowgenerator.RowGeneratorMeta;
import org.pentaho.di.utils.TestUtils;
public class JobEntryTransIntTest {
@BeforeClass
public static void setUpBeforeClass() throws KettleException {
KettleEnvironment.init( false );
}
private String createPDI14676Transformation() throws IOException, KettleException {
// Setup Transformation
String rowGenStepName = "Generate Rows";
RowGeneratorMeta rowGenMeta = new RowGeneratorMeta();
rowGenMeta.setRowLimit( String.valueOf( Integer.MAX_VALUE ) );
rowGenMeta.setNeverEnding( true );
rowGenMeta.setIntervalInMs( "0" );
rowGenMeta.allocate( 0 );
TransMeta tMeta = TransTestFactory.generateTestTransformation( new Variables(), rowGenMeta, rowGenStepName );
// Remove the Injector step, as it's not needed for this transformation
TransHopMeta hopToRemove = tMeta.findTransHop( tMeta.findStep( TransTestFactory.INJECTOR_STEPNAME ), tMeta.findStep( rowGenStepName ) );
tMeta.removeTransHop( tMeta.indexOfTransHop( hopToRemove ) );
tMeta.removeStep( tMeta.indexOfStep( tMeta.findStep( TransTestFactory.INJECTOR_STEPNAME ) ) );
// Write transformation to temp file, for use within a job
String transFilename = TestUtilities.createEmptyTempFile( this.getClass().getSimpleName() + "_PDI14676_", ".ktr" );
FileObject transFile = TestUtils.getFileObject( transFilename );
OutputStream outStream = transFile.getContent().getOutputStream();
PrintWriter pw = new PrintWriter( outStream );
pw.write( tMeta.getXML() );
pw.close();
outStream.close();
return transFilename;
}
/*
* Tests whether the job can force a transformation to stop, when the job is asked to stop.
* A timeout parameter is required, to avoid a failed unit test from running forever.
*/
@Test(timeout=30000)
public void testPDI14676() throws KettleException, IOException, InterruptedException {
String transFilename = createPDI14676Transformation();
// Setup Job
JobEntrySpecial startEntry = new JobEntrySpecial( "Start", true, false );
JobEntryCopy startCopy = new JobEntryCopy( startEntry );
startCopy.setLocation( 50, 50 );
startCopy.setDrawn();
JobEntryTrans transEntry = new JobEntryTrans( "PDI-13676 example" );
transEntry.setSpecificationMethod( ObjectLocationSpecificationMethod.FILENAME );
transEntry.setFileName( transFilename );
JobEntryCopy transCopy = new JobEntryCopy( transEntry );
transCopy.setLocation( 200, 50 );
transCopy.setDrawn();
JobMeta jobMeta = new JobMeta();
jobMeta.addJobEntry( startCopy );
jobMeta.addJobEntry( transCopy );
jobMeta.addJobHop( new JobHopMeta( startCopy, transCopy ) );
// Run job
Job jobInstance = new Job( null, jobMeta );
jobInstance.start();
// Allow job startup time
while ( !jobInstance.isActive() ) {
if ( jobInstance.isStopped() || jobInstance.isFinished() ) {
break;
}
Thread.sleep( 10 );
}
// Let the job run for a short period
Thread.sleep( 300 );
assertFalse( jobInstance.isStopped() );
assertFalse( jobInstance.isFinished() );
// Tell the job to stop.
jobInstance.stopAll();
assertTrue( jobInstance.isStopped() );
// Allow the job's thread to stop and be cleaned up
while ( !jobInstance.isFinished() || jobInstance.isActive() ) {
Thread.sleep( 10 );
}
// Ensure that the job and the thread have both stopped
assertTrue( jobInstance.isFinished() );
assertFalse( jobInstance.isAlive() );
}
}