package org.pentaho.platform.engine.services.connection.datasource.dbcp; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.mockito.Mockito; import org.pentaho.database.model.DatabaseAccessType; import org.pentaho.database.model.IDatabaseConnection; import org.pentaho.platform.api.data.DBDatasourceServiceException; import org.pentaho.platform.api.repository.datasource.DatasourceMgmtServiceException; import org.pentaho.platform.api.repository.datasource.IDatasourceMgmtService; import javax.sql.DataSource; import java.util.Arrays; import java.util.Collection; import static org.mockito.Mockito.*; /** * Created by gmoran on 5/2/14. */ @RunWith( Parameterized.class ) public class DynamicConnectionDatasourceServiceTest { private BaseDatasourceService spyService; private BaseDatasourceService pooledSpyService; private BaseDatasourceService nonPooledSpyService; private IDatabaseConnection mockConnection; private String dsName; @Parameterized.Parameters public static Collection<Object[]> services() { return Arrays.asList( new Object[][] { { new PooledDatasourceService(), new NonPooledDatasourceService(), "test1" }, { new PooledOrJndiDatasourceService(), new NonPooledOrJndiDatasourceService(), "test3" } } ); } @Before public void setUp() { mockConnection = mock( IDatabaseConnection.class ); // Set it up - this is a NATIVE connection when( mockConnection.getAccessType() ).thenReturn( DatabaseAccessType.NATIVE ); when( mockConnection.getDatabaseName() ).thenReturn( dsName ); DataSource mockDs = mock( DataSource.class ); IDatasourceMgmtService mockMgmtService = mock( IDatasourceMgmtService.class ); DynamicallyPooledOrJndiDatasourceService dynamic = new DynamicallyPooledOrJndiDatasourceService(); dynamic.setNonPooledDatasourceService( nonPooledSpyService ); dynamic.setPooledDatasourceService( pooledSpyService ); spyService = spy(dynamic ); try { when( mockMgmtService.getDatasourceByName( dsName ) ).thenReturn( mockConnection ); } catch ( DatasourceMgmtServiceException e ) { e.printStackTrace(); } try { doReturn( mockDs ).when( nonPooledSpyService ).resolveDatabaseConnection( mockConnection ); doReturn( mockDs ).when( pooledSpyService ).resolveDatabaseConnection( mockConnection ); } catch ( DBDatasourceServiceException e ) { e.printStackTrace(); } doReturn( mockMgmtService ).when( nonPooledSpyService ).getDatasourceMgmtService(); doReturn( mockMgmtService ).when( pooledSpyService ).getDatasourceMgmtService(); doReturn( mockMgmtService ).when( spyService ).getDatasourceMgmtService(); spyService.clearCache(); } public DynamicConnectionDatasourceServiceTest( BaseDatasourceService pooled, BaseDatasourceService nonpooled, String name ) { this.pooledSpyService = spy( pooled ); this.nonPooledSpyService = spy( nonpooled ); this.dsName = name; } @Test public void testUsePoolingConnectionServices( ) { try { when( mockConnection.isUsingConnectionPool() ).thenReturn( true ); spyService.getDataSource( dsName ); verify( pooledSpyService ).resolveDatabaseConnection( mockConnection ); verify( nonPooledSpyService, Mockito.never() ).resolveDatabaseConnection( mockConnection ); } catch ( DBDatasourceServiceException e ) { e.printStackTrace(); } } @Test public void testUseNonPoolingConnectionServices( ) { try { when( mockConnection.isUsingConnectionPool() ).thenReturn( false ); spyService.getDataSource( dsName ); verify( nonPooledSpyService ).resolveDatabaseConnection( mockConnection ); verify( pooledSpyService, Mockito.never() ).resolveDatabaseConnection( mockConnection ); } catch ( DBDatasourceServiceException e ) { e.printStackTrace(); } } @Test public void testCacheClearinginDynamicConnectionServices( ) { try { when( mockConnection.isUsingConnectionPool() ).thenReturn( true ); spyService.getDataSource( dsName ); spyService.clearCache(); spyService.getDataSource( dsName ); verify( pooledSpyService, Mockito.times( 2 ) ).resolveDatabaseConnection( mockConnection ); } catch ( DBDatasourceServiceException e ) { e.printStackTrace(); } } }