package org.fcrepo.server.utilities.rebuild;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import org.fcrepo.server.Server;
import org.fcrepo.server.config.ServerConfiguration;
import org.fcrepo.server.storage.ConnectionPool;
import org.fcrepo.server.storage.ConnectionPoolManagerImpl;
import org.fcrepo.server.storage.lowlevel.DefaultLowlevelStorageModule;
import org.fcrepo.server.utilities.SQLUtility;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"org.slf4j.*", "org.apache.xerces.*", "javax.xml.*",
"org.xml.sax.*", "javax.management.*"})
@PrepareForTest({Rebuild.class, SQLUtility.class})
public class SQLRebuilderTest {
@Mock
private Connection mockDefaultConnection;
@Mock
private Connection mockRWConnection;
@Mock
private ConnectionPool mockPool;
@Mock
private ConnectionPoolManagerImpl mockCPM;
@Mock
private DatabaseMetaData mockDBM;
@Mock
private DefaultLowlevelStorageModule mockLLS;
@Mock
private PreparedStatement mockCreateStmt;
@Mock
private PreparedStatement mockUpdateStmt;
@Mock
private ResultSet mockResults;
@Mock
private Server mockServer;
@Mock
private ServerConfiguration mockConfig;
private SQLRebuilder test = new SQLRebuilder();
@Before
public void setUp() throws Exception {
mockStatic(Rebuild.class);
when(Rebuild.getServer()).thenReturn(mockServer);
when(mockServer.getModule("org.fcrepo.server.storage.lowlevel.ILowlevelStorage"))
.thenReturn(mockLLS);
when(mockServer.getModule("org.fcrepo.server.storage.ConnectionPoolManager"))
.thenReturn(mockCPM);
when(mockCPM.getPool()).thenReturn(mockPool);
when(mockPool.getReadWriteConnection()).thenReturn(mockRWConnection);
mockStatic(SQLUtility.class);
when(SQLUtility.getDefaultConnection(any(ServerConfiguration.class)))
.thenReturn(mockDefaultConnection);
when(mockDefaultConnection.getMetaData()).thenReturn(mockDBM);
when(mockDBM.getTables(anyString(), anyString(), anyString(), any(String[].class)))
.thenReturn(mockResults);
when(mockRWConnection.prepareStatement(SQLRebuilder.CREATE_REBUILD_STATUS))
.thenReturn(mockCreateStmt);
when(mockRWConnection.prepareStatement(SQLRebuilder.UPDATE_REBUILD_STATUS))
.thenReturn(mockUpdateStmt);
test.setServerConfiguration(mockConfig);
}
@Test
public void testGoodRebuild() throws Exception {
test.start(new HashMap<String, String>());
// expects to get a SQL msg with false on start
verify(mockCreateStmt).setBoolean(1, false);
verify(mockCreateStmt).execute();
// expects to get a SQL msg with true when finished
test.finish();
verify(mockUpdateStmt).setBoolean(1, true);
verify(mockUpdateStmt).execute();
}
@Test
public void testBadRebuild() throws Exception {
test.start(new HashMap<String, String>());
// expects to get a SQL msg with false on start
verify(mockCreateStmt).setBoolean(1, false);
verify(mockCreateStmt).execute();
// should not update without finishing normally
verify(mockUpdateStmt, never()).setBoolean(1, true);
verify(mockUpdateStmt, never()).execute();
}
}