/*! ******************************************************************************
*
* 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.step;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.junit.Test;
import org.pentaho.di.cluster.ClusterSchema;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.partition.PartitionSchema;
import org.pentaho.di.trans.steps.abort.AbortMeta;
import org.pentaho.di.utils.TestUtils;
import org.pentaho.di.trans.steps.missing.MissingTrans;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* @author Andrey Khayrutdinov
*/
public class StepMetaTest {
private static final Random rand = new Random();
private static final String STEP_ID = "step_id";
@Test
public void cloning() throws Exception {
StepMeta meta = createTestMeta();
StepMeta clone = (StepMeta) meta.clone();
assertEquals( meta, clone );
}
@Test
public void testEqualsHashCodeConsistency() throws Exception {
StepMeta step = new StepMeta();
step.setName( "step" );
TestUtils.checkEqualsHashCodeConsistency( step, step );
StepMeta stepSame = new StepMeta();
stepSame.setName( "step" );
assertTrue( step.equals( stepSame ) );
TestUtils.checkEqualsHashCodeConsistency( step, stepSame );
StepMeta stepCaps = new StepMeta();
stepCaps.setName( "STEP" );
TestUtils.checkEqualsHashCodeConsistency( step, stepCaps );
StepMeta stepOther = new StepMeta();
stepOther.setName( "something else" );
TestUtils.checkEqualsHashCodeConsistency( step, stepOther );
}
@Test
public void stepMetaXmlConsistency() throws Exception {
StepMeta meta = new StepMeta( "id", "name", null );
StepMetaInterface smi = new MissingTrans( meta.getName(), meta.getStepID() );
meta.setStepMetaInterface( smi );
StepMeta fromXml = StepMeta.fromXml( meta.getXML() );
assertThat( meta.getXML(), is( fromXml.getXML() ) );
}
private static StepMeta createTestMeta() throws Exception {
StepMetaInterface stepMetaInterface = mock( AbortMeta.class );
when( stepMetaInterface.clone() ).thenReturn( stepMetaInterface );
StepMeta meta = new StepMeta( STEP_ID, "stepname", stepMetaInterface );
meta.setSelected( true );
meta.setDistributes( false );
meta.setCopiesString( "2" );
meta.setLocation( 1, 2 );
meta.setDraw( true );
meta.setDescription( "description" );
meta.setTerminator( true );
meta.setClusterSchemaName( "clusterSchemaName" );
boolean shouldDistribute = rand.nextBoolean();
meta.setDistributes( shouldDistribute );
if ( shouldDistribute ) {
meta.setRowDistribution( selectRowDistribution() );
}
Map<String, Map<String, String>> attributes = new HashMap<String, Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put( "1", "1" );
Map<String, String> map2 = new HashMap<String, String>();
map2.put( "2", "2" );
attributes.put( "qwerty", map1 );
attributes.put( "asdfg", map2 );
meta.setAttributesMap( attributes );
meta.setStepPartitioningMeta( createStepPartitioningMeta( "stepMethod", "stepSchema" ) );
meta.setTargetStepPartitioningMeta( createStepPartitioningMeta( "targetMethod", "targetSchema" ) );
meta.setClusterSchema( new ClusterSchema( "cluster_schema", Collections.<SlaveServer>emptyList() ) );
return meta;
}
private static RowDistributionInterface selectRowDistribution() {
return new FakeRowDistribution();
}
private static StepPartitioningMeta createStepPartitioningMeta( String method, String schemaName ) throws Exception {
StepPartitioningMeta meta = new StepPartitioningMeta( method, new PartitionSchema( schemaName,
Collections.<String>emptyList() ) );
meta.setPartitionSchemaName( "schema_name" );
return meta;
}
private static void assertEquals( StepMeta meta, StepMeta another ) {
assertTrue( EqualsBuilder.reflectionEquals( meta, another, false, StepMeta.class,
new String[] { "location", "targetStepPartitioningMeta" } ) );
boolean manualCheck = new EqualsBuilder()
.append( meta.getLocation().x, another.getLocation().x )
.append( meta.getLocation().y, another.getLocation().y )
.isEquals();
assertTrue( manualCheck );
}
}