/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 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.checksum;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.trans.RowProducer;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStep;
import org.pentaho.di.trans.step.RowAdapter;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.dummytrans.DummyTransMeta;
public class CheckSumTest {
@BeforeClass
public static void setUpBeforeClass() throws KettleException {
KettleEnvironment.init();
}
private Trans buildHexadecimalChecksumTrans( int checkSumType, boolean compatibilityMode ) throws Exception {
// Create a new transformation...
TransMeta transMeta = new TransMeta();
transMeta.setName( getClass().getName() );
// Create a CheckSum Step
String checkSumStepname = "CheckSum";
CheckSumMeta meta = new CheckSumMeta();
// Set the compatibility mode and other required fields
meta.setCompatibilityMode( compatibilityMode );
meta.setResultFieldName( "hex" );
meta.setCheckSumType( checkSumType );
meta.setResultType( CheckSumMeta.result_TYPE_HEXADECIMAL );
meta.setFieldName( new String[] { "test" } );
String checkSumPluginPid = PluginRegistry.getInstance().getPluginId( StepPluginType.class, meta );
StepMeta checkSumStep = new StepMeta( checkSumPluginPid, checkSumStepname, meta );
transMeta.addStep( checkSumStep );
// Create a Dummy step
String dummyStepname = "Output";
DummyTransMeta dummyMeta = new DummyTransMeta();
String dummyStepPid = PluginRegistry.getInstance().getPluginId( StepPluginType.class, dummyMeta );
StepMeta dummyStep = new StepMeta( dummyStepPid, dummyStepname, dummyMeta );
transMeta.addStep( dummyStep );
// Create a hop from CheckSum to Output
TransHopMeta hop = new TransHopMeta( checkSumStep, dummyStep );
transMeta.addTransHop( hop );
return new Trans( transMeta );
}
private RowMeta createStringRowMeta() throws Exception {
RowMeta rowMeta = new RowMeta();
ValueMetaInterface meta = new ValueMetaString( "test" );
rowMeta.addValueMeta( meta );
return rowMeta;
}
private class MockRowListener extends RowAdapter {
private List<Object[]> written;
private List<Object[]> read;
private List<Object[]> error;
public MockRowListener() {
written = new ArrayList<Object[]>();
read = new ArrayList<Object[]>();
error = new ArrayList<Object[]>();
}
public List<Object[]> getWritten() {
return written;
}
@Override
public void rowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {
written.add( row );
}
@Override
public void rowReadEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {
read.add( row );
}
@Override
public void errorRowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {
error.add( row );
}
}
/**
* Create, execute, and return the row listener attached to the output step with complete results from the execution.
*
* @param checkSumType
* Type of checksum to use (the array index of {@link CheckSumMeta#checksumtypeCodes})
* @param compatibilityMode
* Use compatibility mode for CheckSum
* @param input
* String to calculate checksum for
* @return RowListener with results.
*/
private MockRowListener executeHexTest( int checkSumType, boolean compatibilityMode, String input ) throws Exception {
Trans trans = buildHexadecimalChecksumTrans( checkSumType, compatibilityMode );
trans.prepareExecution( null );
StepInterface output = trans.getRunThread( "Output", 0 );
MockRowListener listener = new MockRowListener();
output.addRowListener( listener );
RowProducer rp = trans.addRowProducer( "CheckSum", 0 );
RowMeta inputRowMeta = createStringRowMeta();
( (BaseStep) trans.getRunThread( "CheckSum", 0 ) ).setInputRowMeta( inputRowMeta );
trans.startThreads();
rp.putRow( inputRowMeta, new Object[] { input } );
rp.finished();
trans.waitUntilFinished();
trans.stopAll();
trans.cleanup();
return listener;
}
@Test
public void testHexOutput_md5() throws Exception {
MockRowListener results = executeHexTest( 2, false, "xyz" );
assertEquals( 1, results.getWritten().size() );
assertEquals( "d16fb36f0911f878998c136191af705e", results.getWritten().get( 0 )[1] );
}
@Test
public void testHexOutput_md5_compatibilityMode() throws Exception {
MockRowListener results = executeHexTest( 2, true, "xyz" );
assertEquals( 1, results.getWritten().size() );
assertEquals( "FD6FFD6F0911FD78FDFD1361FDFD705E", results.getWritten().get( 0 )[1] );
}
@Test
public void testHexOutput_sha1() throws Exception {
MockRowListener results = executeHexTest( 3, false, "xyz" );
assertEquals( 1, results.getWritten().size() );
assertEquals( "66b27417d37e024c46526c2f6d358a754fc552f3", results.getWritten().get( 0 )[1] );
}
@Test
public void testHexOutput_sha1_compatibilityMode() throws Exception {
MockRowListener results = executeHexTest( 3, true, "xyz" );
assertEquals( 1, results.getWritten().size() );
assertEquals( "66FD7417FD7E024C46526C2F6D35FD754FFD52FD", results.getWritten().get( 0 )[1] );
}
@Test
public void testHexOutput_sha256() throws Exception {
MockRowListener results = executeHexTest( 4, false, "xyz" );
assertEquals( 1, results.getWritten().size() );
assertEquals( "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282",
results.getWritten().get( 0 )[1] );
}
@Test
public void testHexOutput_sha256_compatibilityMode() throws Exception {
try {
executeHexTest( 4, true, "xyz" );
fail();
} catch ( KettleException e ) {
// expected, SHA-256 is not supported for compatibility mode
}
}
}