/*! ******************************************************************************
*
* 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.step;
import java.util.List;
import org.junit.Test;
import org.pentaho.di.core.database.Database;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.trans.step.errorhandling.Stream;
import org.pentaho.di.trans.step.errorhandling.StreamInterface;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doReturn;
public class BaseStepMetaCloningTest {
@Test
public void testClone() throws Exception {
final Database db1 = mock( Database.class );
final Database db2 = mock( Database.class );
final Repository repository = mock( Repository.class );
final StepMeta stepMeta = mock( StepMeta.class );
BaseStepMeta meta = new BaseStepMeta();
meta.setChanged( true );
meta.databases = new Database[] { db1, db2 };
meta.ioMeta = new StepIOMeta( true, false, false, false, false, false );
meta.repository = repository;
meta.parentStepMeta = stepMeta;
BaseStepMeta clone = (BaseStepMeta) meta.clone();
assertTrue( clone.hasChanged() );
// is it OK ?
assertTrue( clone.databases == meta.databases );
assertArrayEquals( meta.databases, clone.databases );
assertEquals( meta.repository, clone.repository );
assertEquals( meta.parentStepMeta, clone.parentStepMeta );
assertNotNull( clone.ioMeta );
assertEquals( meta.ioMeta.isInputAcceptor(), clone.ioMeta.isInputAcceptor() );
assertEquals( meta.ioMeta.isInputDynamic(), clone.ioMeta.isInputDynamic() );
assertEquals( meta.ioMeta.isInputOptional(), clone.ioMeta.isInputOptional() );
assertEquals( meta.ioMeta.isOutputDynamic(), clone.ioMeta.isOutputDynamic() );
assertEquals( meta.ioMeta.isOutputProducer(), clone.ioMeta.isOutputProducer() );
assertEquals( meta.ioMeta.isSortedDataRequired(), clone.ioMeta.isSortedDataRequired() );
assertNotNull( clone.ioMeta.getInfoStreams() );
assertEquals( 0, clone.ioMeta.getInfoStreams().size() );
}
@Test
public void testCloneWithInfoSteps() throws Exception {
final Database db1 = mock( Database.class );
final Database db2 = mock( Database.class );
final Repository repository = mock( Repository.class );
final StepMeta stepMeta = mock( StepMeta.class );
BaseStepMeta meta = new BaseStepMeta();
meta.setChanged( true );
meta.databases = new Database[] { db1, db2 };
meta.ioMeta = new StepIOMeta( true, false, false, false, false, false );
final String refStepName = "referenced step";
final StepMeta refStepMeta = mock( StepMeta.class );
doReturn( refStepName ).when( refStepMeta ).getName();
StreamInterface stream = new Stream( StreamInterface.StreamType.INFO, refStepMeta, null, null, refStepName );
meta.ioMeta.addStream( stream );
meta.repository = repository;
meta.parentStepMeta = stepMeta;
BaseStepMeta clone = (BaseStepMeta) meta.clone();
assertTrue( clone.hasChanged() );
// is it OK ?
assertTrue( clone.databases == meta.databases );
assertArrayEquals( meta.databases, clone.databases );
assertEquals( meta.repository, clone.repository );
assertEquals( meta.parentStepMeta, clone.parentStepMeta );
assertNotNull( clone.ioMeta );
assertEquals( meta.ioMeta.isInputAcceptor(), clone.ioMeta.isInputAcceptor() );
assertEquals( meta.ioMeta.isInputDynamic(), clone.ioMeta.isInputDynamic() );
assertEquals( meta.ioMeta.isInputOptional(), clone.ioMeta.isInputOptional() );
assertEquals( meta.ioMeta.isOutputDynamic(), clone.ioMeta.isOutputDynamic() );
assertEquals( meta.ioMeta.isOutputProducer(), clone.ioMeta.isOutputProducer() );
assertEquals( meta.ioMeta.isSortedDataRequired(), clone.ioMeta.isSortedDataRequired() );
final List<StreamInterface> clonedInfoStreams = clone.ioMeta.getInfoStreams();
assertNotNull( clonedInfoStreams );
assertEquals( 1, clonedInfoStreams.size() );
final StreamInterface clonedStream = clonedInfoStreams.get( 0 );
assertNotSame( stream, clonedStream );
assertEquals( stream.getStreamType(), clonedStream.getStreamType() );
assertEquals( refStepName, clonedStream.getStepname() );
assertSame( refStepMeta, clonedStream.getStepMeta() ); // PDI-15799
}
}