/* * RHQ Management Platform * Copyright 2013, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.server.metrics.migrator.workers; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import com.datastax.driver.core.Query; import com.datastax.driver.core.ResultSetFuture; import com.datastax.driver.core.Session; import org.hibernate.SessionFactory; import org.hibernate.StatelessSession; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockObjectFactory; import org.testng.Assert; import org.testng.IObjectFactory; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import org.rhq.server.metrics.migrator.DataMigrator.DataMigratorConfiguration; import org.rhq.server.metrics.migrator.DataMigrator.DatabaseType; import org.rhq.server.metrics.migrator.datasources.ScrollableDataSource; @PrepareForTest({ RawDataMigrator.class }) public class RawDataMigratorTest { @ObjectFactory public IObjectFactory getObjectFactory() { return new PowerMockObjectFactory(); } @Test public void testEstimateTask() throws Exception { //tell the method story as it happens: mock or create dependencies and configure //those dependencies to get the method under test to completion DatabaseType databaseType = DatabaseType.Oracle; DataMigratorConfiguration mockConfig = mock(DataMigratorConfiguration.class); when(mockConfig.getDatabaseType()).thenReturn(databaseType); MetricsIndexMigrator mockMetricsIndexUpdateAccumulator = mock(MetricsIndexMigrator.class); PowerMockito.whenNew(MetricsIndexMigrator.class).withArguments(eq(MigrationTable.RAW), eq(mockConfig)) .thenReturn(mockMetricsIndexUpdateAccumulator); EntityManager mockEntityManager = mock(EntityManager.class); when(mockConfig.getEntityManager()).thenReturn(mockEntityManager); org.hibernate.Session mockHibernateSession = mock(org.hibernate.Session.class); when(mockEntityManager.getDelegate()).thenReturn(mockHibernateSession); SessionFactory mockSessionFactory = mock(SessionFactory.class); when(mockHibernateSession.getSessionFactory()).thenReturn(mockSessionFactory); StatelessSession mockStatelessSession = mock(StatelessSession.class); when(mockSessionFactory.openStatelessSession()).thenReturn(mockStatelessSession); org.hibernate.SQLQuery mockQuery = mock(org.hibernate.SQLQuery.class); when(mockStatelessSession.createSQLQuery(any(String.class))).thenReturn(mockQuery); when(mockQuery.uniqueResult()).thenReturn("1000"); ScrollableDataSource mockDataSource = mock(ScrollableDataSource.class); PowerMockito.whenNew(ScrollableDataSource.class) .withArguments(eq(mockEntityManager), eq(databaseType), any(), anyInt()).thenReturn(mockDataSource); when(mockDataSource.getData(eq(0), anyInt())).thenReturn(new ArrayList<Object[]>()); //create object to test and inject required dependencies RawDataMigrator objectUnderTest = new RawDataMigrator(mockConfig); //run code under test long estimateActual = objectUnderTest.estimate(); //verify the results (assert and mock verification) PowerMockito.verifyNew(MetricsIndexMigrator.class).withArguments(eq(MigrationTable.RAW), eq(mockConfig)); PowerMockito.verifyNew(ScrollableDataSource.class, times(15)).withArguments(eq(mockEntityManager), eq(databaseType), any(), anyInt()); verify(mockStatelessSession, times(15)).createSQLQuery(any(String.class)); verify(mockDataSource, times(15)).initialize(); verify(mockDataSource, times(15)).getData(eq(0), anyInt()); verify(mockDataSource, times(15)).close(); verify(mockMetricsIndexUpdateAccumulator, times(1)).drain(); verifyNoMoreInteractions(mockDataSource); verifyNoMoreInteractions(mockMetricsIndexUpdateAccumulator); Assert.assertNotEquals(estimateActual, 0); } @Test public void testMigrateTask() throws Exception { //tell the method story as it happens: mock or create dependencies and configure //those dependencies to get the method under test to completion DatabaseType databaseType = DatabaseType.Oracle; DataMigratorConfiguration mockConfig = mock(DataMigratorConfiguration.class); when(mockConfig.getDatabaseType()).thenReturn(databaseType); Session mockCassandraSession = mock(Session.class); when(mockConfig.getSession()).thenReturn(mockCassandraSession); MetricsIndexMigrator mockMetricsIndexUpdateAccumulator = mock(MetricsIndexMigrator.class); PowerMockito.whenNew(MetricsIndexMigrator.class).withArguments(eq(MigrationTable.RAW), eq(mockConfig)) .thenReturn(mockMetricsIndexUpdateAccumulator); EntityManager mockEntityManager = mock(EntityManager.class); when(mockConfig.getEntityManager()).thenReturn(mockEntityManager); org.hibernate.Session mockHibernateSession = mock(org.hibernate.Session.class); when(mockEntityManager.getDelegate()).thenReturn(mockHibernateSession); SessionFactory mockSessionFactory = mock(SessionFactory.class); when(mockHibernateSession.getSessionFactory()).thenReturn(mockSessionFactory); StatelessSession mockStatelessSession = mock(StatelessSession.class); when(mockSessionFactory.openStatelessSession()).thenReturn(mockStatelessSession); org.hibernate.SQLQuery mockQuery = mock(org.hibernate.SQLQuery.class); when(mockStatelessSession.createSQLQuery(any(String.class))).thenReturn(mockQuery); when(mockQuery.uniqueResult()).thenReturn("1000"); ScrollableDataSource mockDataSource = mock(ScrollableDataSource.class); PowerMockito.whenNew(ScrollableDataSource.class).withArguments(eq(mockEntityManager), eq(databaseType), any()) .thenReturn(mockDataSource); List<Object[]> resultList = new ArrayList<Object[]>(); resultList.add(new Object[] { 100, 100, 100 }); resultList.add(new Object[] { 100, System.currentTimeMillis() - 100l, 100 }); for (int index = 0; index < 15; index++) { when(mockDataSource.getData(eq(0), anyInt())).thenReturn(resultList); when(mockDataSource.getData(eq(2), anyInt())).thenReturn(new ArrayList<Object[]>()); } ResultSetFuture mockResultSetFuture = mock(ResultSetFuture.class); when(mockCassandraSession.executeAsync(any(Query.class))).thenReturn(mockResultSetFuture); //create object to test and inject required dependencies RawDataMigrator objectUnderTest = new RawDataMigrator(mockConfig); //run code under test objectUnderTest.migrate(); //verify the results (assert and mock verification) PowerMockito.verifyNew(MetricsIndexMigrator.class).withArguments(eq(MigrationTable.RAW), eq(mockConfig)); PowerMockito.verifyNew(ScrollableDataSource.class, times(15)).withArguments(eq(mockEntityManager), eq(databaseType), any()); verify(mockDataSource, times(15)).initialize(); verify(mockDataSource, times(15)).getData(eq(0), anyInt()); verify(mockDataSource, times(15)).getData(eq(2), anyInt()); verify(mockDataSource, times(15)).close(); verify(mockMetricsIndexUpdateAccumulator, times(15)).add(eq(100), anyInt()); verify(mockMetricsIndexUpdateAccumulator, times(1)).drain(); verify(mockCassandraSession, times(15)).executeAsync(any(Query.class)); verify(mockResultSetFuture, times(15)).get(); verifyNoMoreInteractions(mockDataSource); verifyNoMoreInteractions(mockCassandraSession); verifyNoMoreInteractions(mockResultSetFuture); verifyNoMoreInteractions(mockMetricsIndexUpdateAccumulator); } }