/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2016-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.ui.spoon; import static org.mockito.Mockito.mock; import java.util.Collections; import java.util.UUID; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.apache.commons.vfs2.FileObject; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.mockito.Mockito.*; import org.pentaho.di.base.AbstractMeta; import org.pentaho.di.cluster.ClusterSchema; import org.pentaho.di.cluster.SlaveServer; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleXMLException; import org.pentaho.di.core.vfs.KettleVFS; import org.pentaho.di.job.JobMeta; import org.pentaho.di.partition.PartitionSchema; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectory; import org.pentaho.di.repository.StringObjectId; import org.pentaho.di.shared.SharedObjectInterface; import org.pentaho.di.shared.SharedObjects; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.ui.spoon.delegates.SpoonClustersDelegate; import org.pentaho.di.ui.spoon.delegates.SpoonDBDelegate; import org.pentaho.di.ui.spoon.delegates.SpoonDelegates; import org.pentaho.di.ui.spoon.delegates.SpoonJobDelegate; import org.pentaho.di.ui.spoon.delegates.SpoonPartitionsDelegate; import org.pentaho.di.ui.spoon.delegates.SpoonSlaveDelegate; import org.pentaho.di.ui.spoon.delegates.SpoonTransformationDelegate; /** * SharedObjectSyncUtil tests. * */ public class SharedObjectSyncUtilTest { private static final String BEFORE_SYNC_VALUE = "BeforeSync"; private static final String AFTER_SYNC_VALUE = "AfterSync"; private static final String SHARED_OBJECTS_FILE = "ram:/shared.xml"; private SpoonDelegates spoonDelegates; private SharedObjectSyncUtil sharedUtil; private Spoon spoon; private Repository repository; @BeforeClass public static void setUpBeforeClass() throws Exception { KettleEnvironment.init(); } @Before public void setUp() { spoon = mock( Spoon.class ); //when( spoon.getRepository() ).thenReturn( spoon.rep ); spoonDelegates = mock( SpoonDelegates.class ); spoonDelegates.jobs = new SpoonJobDelegate( spoon ); spoonDelegates.trans = new SpoonTransformationDelegate( spoon ); spoonDelegates.db = new SpoonDBDelegate( spoon ); spoonDelegates.slaves = new SpoonSlaveDelegate( spoon ); spoonDelegates.partitions = new SpoonPartitionsDelegate( spoon ); spoonDelegates.clusters = new SpoonClustersDelegate( spoon ); spoon.delegates = spoonDelegates; sharedUtil = new SharedObjectSyncUtil( spoon ); repository = mock( Repository.class ); } @After public void tearDown() throws Exception { FileObject sharedObjectsFile = KettleVFS.getFileObject( SHARED_OBJECTS_FILE ); if ( sharedObjectsFile.exists() ) { sharedObjectsFile.delete(); } } @Test public void synchronizeConnections() throws Exception { final String databaseName = "SharedDB"; DatabaseMeta sharedDB0 = createDatabaseMeta( databaseName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, sharedDB0 ); JobMeta job1 = createJobMeta(); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); DatabaseMeta sharedDB2 = job2.getDatabase( 0 ); assertEquals( databaseName, sharedDB2.getName() ); DatabaseMeta sharedDB1 = job1.getDatabase( 0 ); assertEquals( databaseName, sharedDB1.getName() ); assertTrue( sharedDB1 != sharedDB2 ); assertThat( sharedDB1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); sharedDB2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( sharedDB2, sharedDB2.getName() ); assertThat( sharedDB1.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizeConnections_sync_shared_only() throws Exception { final String databaseName = "DB"; DatabaseMeta sharedDB0 = createDatabaseMeta( databaseName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, sharedDB0 ); JobMeta job1 = createJobMeta(); DatabaseMeta sharedDB1 = job1.getDatabase( 0 ); spoonDelegates.jobs.addJob( job1 ); DatabaseMeta unsharedDB2 = createDatabaseMeta( databaseName, false ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); job2.removeDatabase( 0 ); job2.addDatabase( unsharedDB2 ); JobMeta job3 = createJobMeta(); DatabaseMeta sharedDB3 = job3.getDatabase( 0 ); spoonDelegates.jobs.addJob( job3 ); job3.addDatabase( sharedDB3 ); sharedDB3.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( sharedDB3, sharedDB3.getName() ); assertThat( sharedDB1.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); assertThat( unsharedDB2.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeConnections_should_not_sync_unshared() throws Exception { final String databaseName = "DB"; JobMeta job1 = createJobMeta(); DatabaseMeta sharedDB1 = createDatabaseMeta( databaseName, true ); job1.addDatabase( sharedDB1 ); spoonDelegates.jobs.addJob( job1 ); DatabaseMeta db2 = createDatabaseMeta( databaseName, false ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); job2.addDatabase( db2 ); db2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( db2, db2.getName() ); assertThat( sharedDB1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeConnections_use_case_sensitive_name() throws Exception { JobMeta job1 = createJobMeta(); DatabaseMeta sharedDB1 = createDatabaseMeta( "DB", true ); job1.addDatabase( sharedDB1 ); spoonDelegates.jobs.addJob( job1 ); DatabaseMeta sharedDB2 = createDatabaseMeta( "Db", true ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); job2.addDatabase( sharedDB2 ); sharedDB2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( sharedDB2, sharedDB2.getName() ); assertThat( sharedDB1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeConnectionsRename() throws Exception { final String databaseName = BEFORE_SYNC_VALUE; DatabaseMeta sharedDB0 = createDatabaseMeta( databaseName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, sharedDB0 ); JobMeta job1 = createJobMeta(); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); DatabaseMeta sharedDB2 = job2.getDatabase( 0 ); assertEquals( databaseName, sharedDB2.getName() ); DatabaseMeta sharedDB1 = job1.getDatabase( 0 ); assertEquals( databaseName, sharedDB1.getName() ); assertTrue( sharedDB1 != sharedDB2 ); assertThat( sharedDB1.getName(), equalTo( BEFORE_SYNC_VALUE ) ); sharedDB2.setName( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( sharedDB2, BEFORE_SYNC_VALUE ); assertThat( sharedDB1.getName(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizeConnectionsRenameBackAndForth() throws Exception { final String databaseName = "SharedDB"; DatabaseMeta sharedDB0 = createDatabaseMeta( databaseName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, sharedDB0 ); TransMeta t1 = createTransMeta(); spoonDelegates.trans.addTransformation( t1 ); TransMeta t2 = createTransMeta(); spoonDelegates.trans.addTransformation( t2 ); final String name2 = "NAME 2"; DatabaseMeta sharedDB1 = t1.getDatabase( 0 ); sharedDB1.setName( name2 ); when( spoon.getActiveMeta() ).thenReturn( t1 ); sharedUtil.synchronizeConnections( sharedDB1, databaseName ); DatabaseMeta sharedDB2 = t2.getDatabase( 0 ); assertTrue( sharedDB2.getName().equals( name2 ) ); when( spoon.getActiveMeta() ).thenReturn( t2 ); sharedDB2.setName( "name3" ); sharedUtil.synchronizeConnections( sharedDB2, name2 ); assertTrue( sharedDB1.getName().equals( sharedDB2.getName() ) ); } @Test public void synchronizeSlaveServerRenameBackAndForth() throws Exception { final String serverName = "SharedServer"; SlaveServer server0 = createSlaveServer( serverName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, server0 ); JobMeta j1 = createJobMeta(); spoonDelegates.jobs.addJob( j1 ); JobMeta j2 = createJobMeta(); spoonDelegates.jobs.addJob( j2 ); final String name2 = "NAME 2"; when( spoon.getActiveMeta() ).thenReturn( j1 ); SlaveServer server1 = j1.getSlaveServers().get( 0 ); server1.setName( name2 ); sharedUtil.synchronizeSlaveServers( server1, serverName ); SlaveServer server2 = j2.getSlaveServers().get( 0 ); assertTrue( server2.getName().equals( name2 ) ); when( spoon.getActiveMeta() ).thenReturn( j2 ); server2.setName( "name3" ); sharedUtil.synchronizeSlaveServers( server2, name2 ); assertTrue( server1.getName().equals( server2.getName() ) ); } @Test public void synchronizeSlaveServerRenameRepository() throws Exception { try { spoon.rep = repository; final String objectId = "object-id"; final String serverName = "SharedServer"; JobMeta job1 = createJobMeta(); job1.setRepository( repository ); job1.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); SlaveServer server1 = createSlaveServer( serverName, false ); server1.setObjectId( new StringObjectId( objectId ) ); job1.addOrReplaceSlaveServer( server1 ); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); job2.setRepository( repository ); job2.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); SlaveServer server2 = createSlaveServer( serverName, false ); server2.setObjectId( new StringObjectId( objectId ) ); spoonDelegates.jobs.addJob( job2 ); server2.setName( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSlaveServers( server2 ); job2.addOrReplaceSlaveServer( server2 ); assertEquals( AFTER_SYNC_VALUE, job1.getSlaveServers().get( 0 ).getName() ); } finally { spoon.rep = null; } } @Test public void synchronizeSlaveServerDeleteFromRepository() throws Exception { try { spoon.rep = repository; when( spoon.getRepository() ).thenReturn( repository ); final String objectId = "object-id"; final String serverName = "SharedServer"; TransMeta trans = createTransMeta(); trans.setRepository( repository ); trans.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); SlaveServer server1 = createSlaveServer( serverName, false ); server1.setObjectId( new StringObjectId( objectId ) ); trans.addOrReplaceSlaveServer( server1 ); spoon.delegates.trans.addTransformation( trans ); JobMeta job = createJobMeta(); job.setRepository( repository ); job.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); SlaveServer server3 = createSlaveServer( serverName, false ); server3.setObjectId( new StringObjectId( objectId ) ); job.addOrReplaceSlaveServer( server3 ); spoon.delegates.jobs.addJob( job ); TransMeta trans2 = createTransMeta(); trans2.setRepository( repository ); trans2.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); SlaveServer server2 = createSlaveServer( serverName, false ); server2.setObjectId( new StringObjectId( objectId ) ); trans2.addOrReplaceSlaveServer( server2 ); spoon.delegates.trans.addTransformation( trans2 ); assertFalse( trans.getSlaveServers().isEmpty() ); assertFalse( job.getSlaveServers().isEmpty() ); spoon.delegates.slaves.delSlaveServer( trans2, server2 ); verify( repository ).deleteSlave( server2.getObjectId() ); assertTrue( trans.getSlaveServers().isEmpty() ); assertTrue( job.getSlaveServers().isEmpty() ); } finally { spoon.rep = null; when( spoon.getRepository() ).thenReturn( null ); } } @Test public void synchronizePartitionSchemasDeleteFromRepository() throws Exception { try { spoon.rep = repository; when( spoon.getRepository() ).thenReturn( repository ); final String objectId = "object-id"; final String partitionName = "partsch"; TransMeta trans1 = createTransMeta(); trans1.setRepository( repository ); trans1.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); PartitionSchema part1 = createPartitionSchema( partitionName, false ); part1.setObjectId( new StringObjectId( objectId ) ); trans1.addOrReplacePartitionSchema( part1 ); spoon.delegates.trans.addTransformation( trans1 ); TransMeta trans2 = createTransMeta(); trans2.setRepository( repository ); trans2.setSharedObjects( createSharedObjects( SHARED_OBJECTS_FILE ) ); PartitionSchema part2 = createPartitionSchema( partitionName, false ); part2.setObjectId( new StringObjectId( objectId ) ); trans2.addOrReplacePartitionSchema( part2 ); spoon.delegates.trans.addTransformation( trans2 ); assertFalse( trans1.getPartitionSchemas().isEmpty() ); spoon.delegates.partitions.delPartitionSchema( trans2, part2 ); verify( repository ).deletePartitionSchema( part2.getObjectId() ); assertTrue( trans1.getPartitionSchemas().isEmpty() ); } finally { spoon.rep = null; when( spoon.getRepository() ).thenReturn( null ); } } @Test public void synchronizeConnectionsOpenNew() throws Exception { final String databaseName = "SharedDB"; DatabaseMeta sharedDB0 = createDatabaseMeta( databaseName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, sharedDB0 ); JobMeta job1 = createJobMeta(); spoonDelegates.jobs.addJob( job1 ); DatabaseMeta sharedDB1 = job1.getDatabase( 0 ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); DatabaseMeta sharedDB2 = job2.getDatabase( 0 ); assertThat( sharedDB1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); sharedDB2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeConnections( sharedDB2, sharedDB2.getName() ); assertThat( sharedDB1.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); JobMeta job3 = createJobMeta(); spoonDelegates.jobs.addJob( job3 ); DatabaseMeta sharedDB3 = job3.getDatabase( 0 ); assertThat( sharedDB3.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizeSlaveServers() throws Exception { final String slaveServerName = "SharedSlaveServer"; JobMeta job1 = createJobMeta(); SlaveServer slaveServer1 = createSlaveServer( slaveServerName, true ); job1.setSlaveServers( Collections.singletonList( slaveServer1 ) ); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); SlaveServer slaveServer2 = createSlaveServer( slaveServerName, true ); job2.setSlaveServers( Collections.singletonList( slaveServer2 ) ); spoonDelegates.jobs.addJob( job2 ); slaveServer2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSlaveServers( slaveServer2 ); assertThat( slaveServer1.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizeSlaveServers_sync_shared_only() throws Exception { final String slaveServerName = "SlaveServer"; JobMeta job1 = createJobMeta(); SlaveServer slaveServer1 = createSlaveServer( slaveServerName, true ); job1.setSlaveServers( Collections.singletonList( slaveServer1 ) ); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); SlaveServer unsharedSlaveServer2 = createSlaveServer( slaveServerName, false ); job2.setSlaveServers( Collections.singletonList( unsharedSlaveServer2 ) ); spoonDelegates.jobs.addJob( job2 ); JobMeta job3 = createJobMeta(); SlaveServer slaveServer3 = createSlaveServer( slaveServerName, true ); job3.setSlaveServers( Collections.singletonList( slaveServer3 ) ); spoonDelegates.jobs.addJob( job3 ); slaveServer3.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSlaveServers( slaveServer3 ); assertThat( slaveServer1.getHostname(), equalTo( AFTER_SYNC_VALUE ) ); assertThat( unsharedSlaveServer2.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSlaveServers_should_not_sync_unshared() throws Exception { final String slaveServerName = "SlaveServer"; JobMeta job1 = createJobMeta(); SlaveServer slaveServer1 = createSlaveServer( slaveServerName, true ); job1.setSlaveServers( Collections.singletonList( slaveServer1 ) ); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); SlaveServer slaveServer2 = createSlaveServer( slaveServerName, false ); job2.setSlaveServers( Collections.singletonList( slaveServer2 ) ); spoonDelegates.jobs.addJob( job2 ); slaveServer2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSlaveServers( slaveServer2 ); assertThat( slaveServer1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSlaveServers_use_case_sensitive_name() throws Exception { JobMeta job1 = createJobMeta(); SlaveServer slaveServer1 = createSlaveServer( "SlaveServer", true ); job1.setSlaveServers( Collections.singletonList( slaveServer1 ) ); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); SlaveServer slaveServer2 = createSlaveServer( "Slaveserver", true ); job2.setSlaveServers( Collections.singletonList( slaveServer2 ) ); spoonDelegates.jobs.addJob( job2 ); slaveServer2.setHostname( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSlaveServers( slaveServer2 ); assertThat( slaveServer1.getHostname(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSlaveServersRename() throws Exception { final String originalName = "slave"; SlaveServer slaveServer = createSlaveServer( originalName, true ); saveSharedObjects( SHARED_OBJECTS_FILE, slaveServer ); JobMeta job1 = createJobMeta(); spoonDelegates.jobs.addJob( job1 ); JobMeta job2 = createJobMeta(); spoonDelegates.jobs.addJob( job2 ); SlaveServer server1 = job1.getSlaveServers().get( 0 ); SlaveServer server2 = job2.getSlaveServers().get( 0 ); assertTrue( server1 != server2 ); final String newName = "spartacus"; server1.setName( newName ); sharedUtil.synchronizeSlaveServers( server1, originalName ); assertEquals( 1, job1.getSlaveServerNames().length ); server2 = job2.getSlaveServers().get( 0 ); assertEquals( newName, server2.getName() ); } @Test public void synchronizeClusterSchemas() throws Exception { final String clusterSchemaName = "SharedClusterSchema"; TransMeta transformarion1 = createTransMeta(); ClusterSchema clusterSchema1 = createClusterSchema( clusterSchemaName, true ); transformarion1.setClusterSchemas( Collections.singletonList( clusterSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); ClusterSchema clusterSchema2 = createClusterSchema( clusterSchemaName, true ); transformarion2.setClusterSchemas( Collections.singletonList( clusterSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); clusterSchema2.setDynamic( true ); sharedUtil.synchronizeClusterSchemas( clusterSchema2 ); assertThat( clusterSchema1.isDynamic(), equalTo( true ) ); } @Test public void synchronizeClusterSchemas_sync_shared_only() throws Exception { final String clusterSchemaName = "ClusterSchema"; TransMeta transformarion1 = createTransMeta(); ClusterSchema clusterSchema1 = createClusterSchema( clusterSchemaName, true ); transformarion1.setClusterSchemas( Collections.singletonList( clusterSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); ClusterSchema unsharedClusterSchema2 = createClusterSchema( clusterSchemaName, false ); transformarion2.setClusterSchemas( Collections.singletonList( unsharedClusterSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); TransMeta transformarion3 = createTransMeta(); ClusterSchema clusterSchema3 = createClusterSchema( clusterSchemaName, true ); transformarion3.setClusterSchemas( Collections.singletonList( clusterSchema3 ) ); spoonDelegates.trans.addTransformation( transformarion3 ); clusterSchema3.setDynamic( true ); sharedUtil.synchronizeClusterSchemas( clusterSchema3 ); assertThat( clusterSchema1.isDynamic(), equalTo( true ) ); assertThat( unsharedClusterSchema2.isDynamic(), equalTo( false ) ); } @Test public void synchronizeClusterSchemas_should_not_sync_unshared() throws Exception { final String clusterSchemaName = "ClusterSchema"; TransMeta transformarion1 = createTransMeta(); ClusterSchema clusterSchema1 = createClusterSchema( clusterSchemaName, true ); transformarion1.setClusterSchemas( Collections.singletonList( clusterSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); ClusterSchema clusterSchema2 = createClusterSchema( clusterSchemaName, false ); transformarion2.setClusterSchemas( Collections.singletonList( clusterSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); clusterSchema2.setDynamic( true ); sharedUtil.synchronizeClusterSchemas( clusterSchema2 ); assertThat( clusterSchema1.isDynamic(), equalTo( false ) ); } @Test public void synchronizeClusterSchemas_use_case_sensitive_name() throws Exception { TransMeta transformarion1 = createTransMeta(); ClusterSchema clusterSchema1 = createClusterSchema( "ClusterSchema", true ); transformarion1.setClusterSchemas( Collections.singletonList( clusterSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); ClusterSchema clusterSchema2 = createClusterSchema( "Clusterschema", true ); transformarion2.setClusterSchemas( Collections.singletonList( clusterSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); clusterSchema2.setDynamic( true ); sharedUtil.synchronizeClusterSchemas( clusterSchema2 ); assertThat( clusterSchema1.isDynamic(), equalTo( false ) ); } @Test public void synchronizePartitionSchemas() throws Exception { final String partitionSchemaName = "SharedPartitionSchema"; TransMeta transformarion1 = createTransMeta(); PartitionSchema partitionSchema1 = createPartitionSchema( partitionSchemaName, true ); transformarion1.setPartitionSchemas( Collections.singletonList( partitionSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); PartitionSchema partitionSchema2 = createPartitionSchema( partitionSchemaName, true ); transformarion2.setPartitionSchemas( Collections.singletonList( partitionSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); partitionSchema2.setNumberOfPartitionsPerSlave( AFTER_SYNC_VALUE ); sharedUtil.synchronizePartitionSchemas( partitionSchema2 ); assertThat( partitionSchema1.getNumberOfPartitionsPerSlave(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizePartitionSchemas_sync_shared_only() throws Exception { final String partitionSchemaName = "PartitionSchema"; TransMeta transformarion1 = createTransMeta(); PartitionSchema partitionSchema1 = createPartitionSchema( partitionSchemaName, true ); transformarion1.setPartitionSchemas( Collections.singletonList( partitionSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); PartitionSchema unsharedPartitionSchema2 = createPartitionSchema( partitionSchemaName, false ); transformarion2.setPartitionSchemas( Collections.singletonList( unsharedPartitionSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); TransMeta transformarion3 = createTransMeta(); PartitionSchema partitionSchema3 = createPartitionSchema( partitionSchemaName, true ); transformarion3.setPartitionSchemas( Collections.singletonList( partitionSchema3 ) ); spoonDelegates.trans.addTransformation( transformarion3 ); partitionSchema3.setNumberOfPartitionsPerSlave( AFTER_SYNC_VALUE ); sharedUtil.synchronizePartitionSchemas( partitionSchema3 ); assertThat( partitionSchema1.getNumberOfPartitionsPerSlave(), equalTo( AFTER_SYNC_VALUE ) ); assertThat( unsharedPartitionSchema2.getNumberOfPartitionsPerSlave(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizePartitionSchemas_should_not_sync_unshared() throws Exception { final String partitionSchemaName = "PartitionSchema"; TransMeta transformarion1 = createTransMeta(); PartitionSchema partitionSchema1 = createPartitionSchema( partitionSchemaName, true ); transformarion1.setPartitionSchemas( Collections.singletonList( partitionSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); PartitionSchema partitionSchema2 = createPartitionSchema( partitionSchemaName, false ); transformarion2.setPartitionSchemas( Collections.singletonList( partitionSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); partitionSchema2.setNumberOfPartitionsPerSlave( AFTER_SYNC_VALUE ); sharedUtil.synchronizePartitionSchemas( partitionSchema2 ); assertThat( partitionSchema1.getNumberOfPartitionsPerSlave(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizePartitionSchemas_use_case_sensitive_name() throws Exception { TransMeta transformarion1 = createTransMeta(); PartitionSchema partitionSchema1 = createPartitionSchema( "PartitionSchema", true ); transformarion1.setPartitionSchemas( Collections.singletonList( partitionSchema1 ) ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); PartitionSchema partitionSchema2 = createPartitionSchema( "Partitionschema", true ); transformarion2.setPartitionSchemas( Collections.singletonList( partitionSchema2 ) ); spoonDelegates.trans.addTransformation( transformarion2 ); partitionSchema2.setNumberOfPartitionsPerSlave( AFTER_SYNC_VALUE ); sharedUtil.synchronizePartitionSchemas( partitionSchema2 ); assertThat( partitionSchema1.getNumberOfPartitionsPerSlave(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSteps() throws Exception { final String stepName = "SharedStep"; TransMeta transformarion1 = createTransMeta(); StepMeta step1 = createStepMeta( stepName, true ); transformarion1.addStep( step1 ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); StepMeta step2 = createStepMeta( stepName, true ); transformarion2.addStep( step2 ); spoonDelegates.trans.addTransformation( transformarion2 ); step2.setDescription( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSteps( step2 ); assertThat( step1.getDescription(), equalTo( AFTER_SYNC_VALUE ) ); } @Test public void synchronizeSteps_sync_shared_only() throws Exception { final String stepName = "Step"; TransMeta transformarion1 = createTransMeta(); StepMeta step1 = createStepMeta( stepName, true ); transformarion1.addStep( step1 ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); StepMeta unsharedStep2 = createStepMeta( stepName, false ); transformarion2.addStep( unsharedStep2 ); spoonDelegates.trans.addTransformation( transformarion2 ); TransMeta transformarion3 = createTransMeta(); StepMeta step3 = createStepMeta( stepName, true ); transformarion3.addStep( step3 ); spoonDelegates.trans.addTransformation( transformarion3 ); step3.setDescription( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSteps( step3 ); assertThat( step1.getDescription(), equalTo( AFTER_SYNC_VALUE ) ); assertThat( unsharedStep2.getDescription(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSteps_should_not_sync_unshared() throws Exception { final String stepName = "Step"; TransMeta transformarion1 = createTransMeta(); StepMeta step1 = createStepMeta( stepName, true ); transformarion1.addStep( step1 ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); StepMeta step2 = createStepMeta( stepName, false ); transformarion2.addStep( step2 ); spoonDelegates.trans.addTransformation( transformarion2 ); step2.setDescription( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSteps( step2 ); assertThat( step1.getDescription(), equalTo( BEFORE_SYNC_VALUE ) ); } @Test public void synchronizeSteps_use_case_sensitive_name() throws Exception { TransMeta transformarion1 = createTransMeta(); StepMeta step1 = createStepMeta( "STEP", true ); transformarion1.addStep( step1 ); spoonDelegates.trans.addTransformation( transformarion1 ); TransMeta transformarion2 = createTransMeta(); StepMeta step2 = createStepMeta( "Step", true ); transformarion2.addStep( step2 ); spoonDelegates.trans.addTransformation( transformarion2 ); step2.setDescription( AFTER_SYNC_VALUE ); sharedUtil.synchronizeSteps( step2 ); assertThat( step1.getDescription(), equalTo( BEFORE_SYNC_VALUE ) ); } private JobMeta createJobMeta() throws Exception { JobMeta jobMeta = new JobMeta(); jobMeta.setName( UUID.randomUUID().toString() ); jobMeta.setFilename( UUID.randomUUID().toString() ); jobMeta.setRepositoryDirectory( mock( RepositoryDirectory.class ) ); // jobMeta.setSharedObjectsFile( SHARED_OBJECTS_FILE ); initSharedObjects( jobMeta, SHARED_OBJECTS_FILE ); when( spoon.getActiveMeta() ).thenReturn( jobMeta ); return jobMeta; } private TransMeta createTransMeta() throws KettleException { TransMeta transMeta = new TransMeta(); transMeta.setName( UUID.randomUUID().toString() ); transMeta.setFilename( UUID.randomUUID().toString() ); RepositoryDirectory repositoryDirectory = mock( RepositoryDirectory.class ); doCallRealMethod().when( repositoryDirectory ).setName( anyString() ); doCallRealMethod().when( repositoryDirectory ).getName(); transMeta.setRepositoryDirectory( repositoryDirectory ); initSharedObjects( transMeta, SHARED_OBJECTS_FILE ); when( spoon.getActiveMeta() ).thenReturn( transMeta ); return transMeta; } private static void initSharedObjects( AbstractMeta meta, String sharedObjectsFile ) throws KettleException { meta.setSharedObjectsFile( sharedObjectsFile ); meta.setSharedObjects( meta.readSharedObjects() ); } private static StepMeta createStepMeta( String name, boolean shared ) { StepMeta stepMeta = new StepMeta(); stepMeta.setName( name ); stepMeta.setDescription( BEFORE_SYNC_VALUE ); stepMeta.setShared( shared ); return stepMeta; } private static PartitionSchema createPartitionSchema( String name, boolean shared ) { PartitionSchema partitionSchema = new PartitionSchema(); partitionSchema.setName( name ); partitionSchema.setNumberOfPartitionsPerSlave( BEFORE_SYNC_VALUE ); partitionSchema.setShared( shared ); return partitionSchema; } private static SlaveServer createSlaveServer( String name, boolean shared ) { SlaveServer slaveServer = new SlaveServer(); slaveServer.setHostname( BEFORE_SYNC_VALUE ); slaveServer.setName( name ); slaveServer.setShared( shared ); return slaveServer; } private static ClusterSchema createClusterSchema( String name, boolean shared ) { ClusterSchema clusterSchema = new ClusterSchema(); clusterSchema.setName( name ); clusterSchema.setDescription( BEFORE_SYNC_VALUE ); clusterSchema.setDynamic( false ); clusterSchema.setShared( shared ); return clusterSchema; } private static DatabaseMeta createDatabaseMeta( String name, boolean shared ) { DatabaseMeta database = new DatabaseMeta(); database.setName( name ); database.setShared( shared ); database.setHostname( BEFORE_SYNC_VALUE ); return database; } private SharedObjects saveSharedObjects( String location, SharedObjectInterface...objects ) throws Exception { SharedObjects sharedObjects = createSharedObjects( location, objects ); sharedObjects.saveToFile(); return sharedObjects; } private static SharedObjects createSharedObjects( String location, SharedObjectInterface... objects ) throws KettleXMLException { SharedObjects sharedObjects = new SharedObjects( location ); for ( SharedObjectInterface sharedObject : objects ) { sharedObjects.storeObject( sharedObject ); } return sharedObjects; } }