/*! ****************************************************************************** * * 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.core.database; import org.apache.commons.dbcp.BasicDataSource; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.pentaho.di.core.KettleClientEnvironment; import org.pentaho.di.core.exception.KettleDatabaseException; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LogChannelInterface; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.Properties; import java.util.logging.Logger; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.*; /** * User: Dzmitry Stsiapanau Date: 12/11/13 Time: 1:59 PM */ @RunWith( MockitoJUnitRunner.class ) public class ConnectionPoolUtilTest implements Driver { private static final String PASSWORD = "manager"; private static final String ENCR_PASSWORD = "Encrypted 2be98afc86aa7f2e4cb14af7edf95aac8"; @Mock( answer = Answers.RETURNS_MOCKS ) LogChannelInterface logChannelInterface; @Mock( answer = Answers.RETURNS_MOCKS ) DatabaseMeta dbMeta; @Mock BasicDataSource dataSource; final int INITIAL_SIZE = 1; final int MAX_SIZE = 10; public ConnectionPoolUtilTest() { try { DriverManager.registerDriver( this ); } catch ( SQLException e ) { e.printStackTrace(); } } @BeforeClass public static void setupBeforeClass() throws KettleException { KettleClientEnvironment.init(); } @Before public void setUp() throws Exception { when( dbMeta.getDriverClass() ).thenReturn( this.getClass().getCanonicalName() ); when( dbMeta.getConnectionPoolingProperties() ).thenReturn( new Properties() ); when( dbMeta.environmentSubstitute( anyString() ) ).thenAnswer( invocation -> invocation.getArguments()[0] ); } @After public void tearDown() throws Exception { DriverManager.deregisterDriver( this ); } @Test public void testGetConnection() throws Exception { when( dbMeta.getName() ).thenReturn( "CP1" ); when( dbMeta.getPassword() ).thenReturn( PASSWORD ); Connection conn = ConnectionPoolUtil.getConnection( logChannelInterface, dbMeta, "", 1, 2 ); assertTrue( conn != null ); } @Test public void testGetConnectionEncrypted() throws Exception { when( dbMeta.getName() ).thenReturn( "CP2" ); when( dbMeta.getPassword() ).thenReturn( ENCR_PASSWORD ); Connection conn = ConnectionPoolUtil.getConnection( logChannelInterface, dbMeta, "", 1, 2 ); assertTrue( conn != null ); } @Test public void testGetConnectionName() throws Exception { when( dbMeta.getName() ).thenReturn( "CP2" ); when( dbMeta.getPassword() ).thenReturn( ENCR_PASSWORD ); String connectionName = ConnectionPoolUtil.buildPoolName( dbMeta, "" ); assertTrue( connectionName.equals( "CP2" ) ); assertFalse( connectionName.equals( "CP2pentaho" ) ); when( dbMeta.getDatabaseName() ).thenReturn( "pentaho" ); connectionName = ConnectionPoolUtil.buildPoolName( dbMeta, "" ); assertTrue( connectionName.equals( "CP2pentaho" ) ); assertFalse( connectionName.equals( "CP2pentaholocal" ) ); when( dbMeta.getHostname() ).thenReturn( "local" ); connectionName = ConnectionPoolUtil.buildPoolName( dbMeta, "" ); assertTrue( connectionName.equals( "CP2pentaholocal" ) ); assertFalse( connectionName.equals( "CP2pentaholocal3306" ) ); when( dbMeta.getDatabasePortNumberString() ).thenReturn( "3306" ); connectionName = ConnectionPoolUtil.buildPoolName( dbMeta, "" ); assertTrue( connectionName.equals( "CP2pentaholocal3306" ) ); } @Test public void testConfigureDataSource() throws KettleDatabaseException { when( dbMeta.getURL( "partId" ) ).thenReturn( "jdbc:foo://server:111" ); when( dbMeta.getUsername() ).thenReturn( "suzy" ); when( dbMeta.getPassword() ).thenReturn( "password" ); ConnectionPoolUtil.configureDataSource( dataSource, dbMeta, "partId", INITIAL_SIZE, MAX_SIZE ); verify( dataSource ).setDriverClassName( "org.pentaho.di.core.database.ConnectionPoolUtilTest" ); verify( dataSource ).setDriverClassLoader( any( ClassLoader.class ) ); verify( dataSource ).setUrl( "jdbc:foo://server:111" ); verify( dataSource ).addConnectionProperty( "user", "suzy" ); verify( dataSource ).addConnectionProperty( "password", "password" ); verify( dataSource ).setInitialSize( INITIAL_SIZE ); verify( dataSource ).setMaxActive( MAX_SIZE ); } @Test public void testConfigureDataSourceWhenNoDatabaseInterface() throws KettleDatabaseException { when( dbMeta.getDatabaseInterface() ).thenReturn( null ); ConnectionPoolUtil.configureDataSource( dataSource, dbMeta, "partId", INITIAL_SIZE, MAX_SIZE ); verify( dataSource, never() ).setDriverClassLoader( any( ClassLoader.class ) ); } @Override public Connection connect( String url, Properties info ) throws SQLException { String password = info.getProperty( "password" ); return PASSWORD.equals( password ) ? mock( Connection.class ) : null; } @Override public boolean acceptsURL( String url ) throws SQLException { return true; } @Override public DriverPropertyInfo[] getPropertyInfo( String url, Properties info ) throws SQLException { return null; } @Override public int getMajorVersion() { return 0; } @Override public int getMinorVersion() { return 0; } @Override public boolean jdbcCompliant() { return false; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } }