package com.rackspacecloud.blueflood.io; import com.datastax.driver.core.ConsistencyLevel; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.RegularStatement; import com.datastax.driver.core.Session; import com.rackspacecloud.blueflood.io.astyanax.AMetadataIO; import com.rackspacecloud.blueflood.io.astyanax.AShardStateIO; import com.rackspacecloud.blueflood.io.datastax.DatastaxIO; import com.rackspacecloud.blueflood.io.datastax.DMetadataIO; import com.rackspacecloud.blueflood.io.datastax.DShardStateIO; import com.rackspacecloud.blueflood.service.Configuration; import com.rackspacecloud.blueflood.service.CoreConfig; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Mockito.*; import static org.junit.Assert.*; /** * This is the test class for {@link IOContainer} */ // we ignore MBeans and Metrics stuff because a lot of them have static // initializer that don't work well when the caller of those classes // (such as AstyanaxIO) are being mocked @PowerMockIgnore({"javax.management.*", "com.rackspacecloud.blueflood.utils.Metrics", "com.codahale.metrics.*"}) @PrepareForTest({Configuration.class}) @SuppressStaticInitializationFor( { "com.rackspacecloud.blueflood.io.datastax.DatastaxIO", "com.rackspacecloud.blueflood.cache.MetadataCache", "com.rackspacecloud.blueflood.io.datastax.DAbstractMetricsRW", "com.rackspacecloud.blueflood.io.datastax.DBasicMetricsRW"} ) @RunWith(PowerMockRunner.class) public class IOContainerTest { private static Configuration mockConfiguration; @BeforeClass public static void setupClass() throws Exception { // this is how you mock singleton whose instance is declared // as private static final, as the case for Configuration.class PowerMockito.suppress(PowerMockito.constructor(Configuration.class)); mockConfiguration = PowerMockito.mock(Configuration.class); PowerMockito.mockStatic(Configuration.class); when(Configuration.getInstance()).thenReturn(mockConfiguration); } @Before public void setup() throws Exception { // mock DatastaxIO.getSession() & Session PowerMockito.mockStatic( DatastaxIO.class ); Session mockSession = mock( Session.class ); when( DatastaxIO.getSession()).thenReturn(mockSession); PreparedStatement mockPreparedStatement = mock( PreparedStatement.class ); when( mockSession.prepare( any( RegularStatement.class ) ) ).thenReturn( mockPreparedStatement ); when( mockSession.prepare( anyString() ) ).thenReturn(mockPreparedStatement); when( mockPreparedStatement.setConsistencyLevel(any(ConsistencyLevel.class)) ).thenReturn( mockPreparedStatement ); } @Test public void testNullDriverConfig() throws Exception { when(mockConfiguration.getStringProperty(eq(CoreConfig.CASSANDRA_DRIVER))).thenReturn(null); IOContainer.resetInstance(); IOContainer ioContainer = IOContainer.fromConfig(); ShardStateIO shardStateIO = ioContainer.getShardStateIO(); assertTrue("ShardStateIO instance is Astyanax", shardStateIO instanceof AShardStateIO); MetadataIO metadataIO = ioContainer.getMetadataIO(); assertTrue("MetadataIO instance is Astyanax", metadataIO instanceof AMetadataIO); } @Test public void testEmptyStringDriverConfig() throws Exception { when(mockConfiguration.getStringProperty(eq(CoreConfig.CASSANDRA_DRIVER))).thenReturn(""); IOContainer.resetInstance(); IOContainer ioContainer = IOContainer.fromConfig(); ShardStateIO shardStateIO = ioContainer.getShardStateIO(); assertTrue("ShardStateIO instance is Astyanax", shardStateIO instanceof AShardStateIO); MetadataIO metadataIO = ioContainer.getMetadataIO(); assertTrue("MetadataIO instance is Astyanax", metadataIO instanceof AMetadataIO); } @Test public void testAstyanaxDriverConfig() throws Exception { when(mockConfiguration.getStringProperty(eq(CoreConfig.CASSANDRA_DRIVER))).thenReturn("astyanax"); IOContainer.resetInstance(); IOContainer ioContainer = IOContainer.fromConfig(); ShardStateIO shardStateIO = ioContainer.getShardStateIO(); assertTrue("ShardStateIO instance is Astyanax", shardStateIO instanceof AShardStateIO); MetadataIO metadataIO = ioContainer.getMetadataIO(); assertTrue("MetadataIO instance is Astyanax", metadataIO instanceof AMetadataIO); } @Test public void testDatastaxDriverConfig() { when(mockConfiguration.getStringProperty(eq(CoreConfig.CASSANDRA_DRIVER))).thenReturn("datastax"); IOContainer.resetInstance(); IOContainer ioContainer = IOContainer.fromConfig(); ShardStateIO shardStateIO = ioContainer.getShardStateIO(); assertTrue("ShardStateIO instance is Datastax", shardStateIO instanceof DShardStateIO); MetadataIO metadataIO = ioContainer.getMetadataIO(); assertTrue("MetadataIO instance is Datastax", metadataIO instanceof DMetadataIO); } /** * This class is the test class for {@link com.rackspacecloud.blueflood.io.IOContainer.DriverType} */ public static class DriverTypeTest { @Test public void testNullDriver() { IOContainer.DriverType driver = IOContainer.DriverType.getDriverType(null); assertEquals("null driver config means astyanax", IOContainer.DriverType.ASTYANAX, driver); } @Test public void testEmptyStringDriver() { IOContainer.DriverType driver = IOContainer.DriverType.getDriverType(null); assertEquals("empty string driver config means astyanax", IOContainer.DriverType.ASTYANAX, driver); } @Test public void testAstyanaxDriver() { IOContainer.DriverType driver = IOContainer.DriverType.getDriverType("astyanax"); assertEquals("astyanax driver config", IOContainer.DriverType.ASTYANAX, driver); } @Test public void testDatastaxDriver() { IOContainer.DriverType driver = IOContainer.DriverType.getDriverType("datastax"); assertEquals("datastax driver config", IOContainer.DriverType.DATASTAX, driver); } } }