/*! ******************************************************************************
*
* 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.repository.kdr;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.Database;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.database.OracleDatabaseMeta;
import org.pentaho.di.core.encryption.Encr;
import org.pentaho.di.core.encryption.TwoWayPasswordEncoderPluginType;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.KettleLogStore;
import org.pentaho.di.core.logging.LogChannel;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryConnectionDelegate;
/**
* @author Tatsiana_Kasiankova
*
*/
public class KettleDatabaseRepositoryCreationHelperTest {
private static final int EXPECTED_ORACLE_DB_REPO_STRING = 1999;
private static final int EXPECTED_DEFAULT_DB_REPO_STRING = KettleDatabaseRepository.REP_ORACLE_STRING_LENGTH;
private KettleDatabaseRepositoryMeta repositoryMeta;
private KettleDatabaseRepository repository;
LogChannelInterface log = LogChannel.GENERAL;
KettleDatabaseRepositoryCreationHelper helper;
static String INDEX = "INDEX ";
private AnswerSecondArgument lan = new AnswerSecondArgument();
@Before
public void setUp() throws Exception {
KettleLogStore.init();
KettleDatabaseRepositoryConnectionDelegate delegate = mock( KettleDatabaseRepositoryConnectionDelegate.class );
repository = mock( KettleDatabaseRepository.class );
repository.connectionDelegate = delegate;
helper = new KettleDatabaseRepositoryCreationHelper( repository );
when( repository.getLog() ).thenReturn( log );
}
/**
* PDI-10237 test index name length.
*
* @throws KettleException
*/
@Test
public void testCreateIndexLenghts() throws KettleException {
DatabaseMeta meta = mock( DatabaseMeta.class );
when( meta.getStartQuote() ).thenReturn( "" );
when( meta.getEndQuote() ).thenReturn( "" );
when( meta.getQuotedSchemaTableCombination( anyString(), anyString() ) ).thenAnswer(
new Answer<String>() {
@Override
public String answer( InvocationOnMock invocation ) throws Throwable {
return invocation.getArguments()[1].toString();
}
} );
when( meta.getDatabaseInterface() ).thenReturn( new OracleDatabaseMeta() );
Database db = mock( Database.class );
when( db.getDatabaseMeta() ).thenReturn( meta );
// always return some create sql.
when( db.getDDL( anyString(), any( RowMetaInterface.class ), anyString(), anyBoolean(), anyString(), anyBoolean() ) ).thenReturn( "### CREATE TABLE;" );
when( repository.getDatabase() ).thenReturn( db );
when( repository.getDatabaseMeta() ).thenReturn( meta );
when( db.getCreateIndexStatement( anyString(), anyString(), any( String[].class ), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean() ) ).thenAnswer( lan );
KettleDatabaseRepositoryCreationHelper helper = new KettleDatabaseRepositoryCreationHelper( repository );
PluginRegistry.addPluginType( TwoWayPasswordEncoderPluginType.getInstance() );
PluginRegistry.init( true );
String passwordEncoderPluginID = Const.NVL( EnvUtil.getSystemProperty( Const.KETTLE_PASSWORD_ENCODER_PLUGIN ), "Kettle" );
Encr.init( passwordEncoderPluginID );
List<String> statements = new ArrayList<String>();
helper.createRepositorySchema( null, false, statements, true );
for ( String st : statements ) {
if ( st == null || st.startsWith( "#" ) ) {
continue;
}
assertTrue( "Index name is not overlenght!: " + st, st.length() <= 30 );
}
}
@Test
public void testOracleDBRepoStringLength() throws Exception {
KettleEnvironment.init();
DatabaseMeta databaseMeta = new DatabaseMeta( "OraRepo", "ORACLE", "JDBC", null, "test", null, null, null );
repositoryMeta =
new KettleDatabaseRepositoryMeta( "KettleDatabaseRepository", "OraRepo", "Ora Repository", databaseMeta );
repository = new KettleDatabaseRepository();
repository.init( repositoryMeta );
KettleDatabaseRepositoryCreationHelper helper = new KettleDatabaseRepositoryCreationHelper( repository );
int repoStringLength = helper.getRepoStringLength();
assertEquals( EXPECTED_ORACLE_DB_REPO_STRING, repoStringLength );
}
@Test
public void testDefaultDBRepoStringLength() throws Exception {
KettleEnvironment.init();
DatabaseMeta databaseMeta = new DatabaseMeta();
databaseMeta.setDatabaseInterface( new TestDatabaseMeta() );
repositoryMeta =
new KettleDatabaseRepositoryMeta( "KettleDatabaseRepository", "TestRepo", "Test Repository", databaseMeta );
repository = new KettleDatabaseRepository();
repository.init( repositoryMeta );
KettleDatabaseRepositoryCreationHelper helper = new KettleDatabaseRepositoryCreationHelper( repository );
int repoStringLength = helper.getRepoStringLength();
assertEquals( EXPECTED_DEFAULT_DB_REPO_STRING, repoStringLength );
}
class TestDatabaseMeta extends OracleDatabaseMeta {
@Override
public int getMaxVARCHARLength() {
return 1;
}
}
static class AnswerSecondArgument implements Answer<String> {
@Override
public String answer( InvocationOnMock invocation ) throws Throwable {
if ( invocation.getArguments().length < 2 ) {
throw new RuntimeException( "no cookies!" );
}
return String.valueOf( invocation.getArguments()[1] );
}
}
}