package com.constellio.data.dao.services.solr.serverFactories;
import static org.mockito.BDDMockito.willReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.util.Arrays;
import org.apache.solr.client.solrj.SolrClient;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.constellio.data.io.IOServicesFactory;
import com.constellio.data.io.concurrent.filesystem.AtomicFileSystem;
@RunWith(value = Parameterized.class)
public class SolrServerFactoryTest {
public static final int TIMES = 3;
public static String CORE_1 = "core1";
public static String CORE_2 = "core2";
public static String CORE_ADMIN = "";
@Parameters(name = "{index}: Test {0}")
public static Iterable<Object[]> setUpParameters() throws Exception {
IOServicesFactory ioServicesFactory = Mockito.mock(IOServicesFactory.class);
Object[][] params = new Object[][]{new Object[]{new HttpSolrServerFactory("http://localhost/", ioServicesFactory)}, new Object[]{new CloudSolrServerFactory("http://zkhost.com")}};
return Arrays.asList(params);
}
private AbstractSolrServerFactory solrServerFactoryUnderTest;
private @Mock SolrClient solrClient1;
private @Mock SolrClient solrClient2;
private @Mock SolrClient solrClientAdmin;
private @Mock AtomicFileSystem atomicFileSystem1;
private @Mock AtomicFileSystem atomicFileSystem2;
private @Mock AtomicFileSystem atomicFileSystemAdmin;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
String[] cores = new String[]{CORE_1, CORE_2, CORE_ADMIN};
SolrClient[] solrClients = new SolrClient[]{solrClient1, solrClient2, solrClientAdmin};
AtomicFileSystem[] atomicFileSystems = new AtomicFileSystem[]{atomicFileSystem1, atomicFileSystem2, atomicFileSystemAdmin};
for (int i = 0; i < cores.length; i++){
willReturn(solrClients[i]).given(solrServerFactoryUnderTest).getSolrClient(cores[i]);
willReturn(atomicFileSystems[i]).given(solrServerFactoryUnderTest).getAtomicFileSystem(cores[i]);
}
for (int i = 0; i < TIMES; i++){
solrServerFactoryUnderTest.getAdminServer();
solrServerFactoryUnderTest.getConfigFileSystem();
for (String core: cores){
if (core.isEmpty()) //it is admin not an ordinary core.
continue;
solrServerFactoryUnderTest.newSolrServer(core);
solrServerFactoryUnderTest.getConfigFileSystem(core);
}
}
}
public SolrServerFactoryTest(AbstractSolrServerFactory solrServerFactory) {
solrServerFactoryUnderTest = spy(solrServerFactory);
}
@Test
public void whenClearingSolrServerFactoryThenAllSolrClientAndAtomicFileSystemAreClosed() throws IOException {
solrServerFactoryUnderTest.clear();
verify(atomicFileSystem1, times(TIMES)).close();
verify(atomicFileSystem2, times(TIMES)).close();
verify(atomicFileSystemAdmin, times(TIMES)).close();
verify(solrClient1, times(TIMES)).close();
verify(solrClient2, times(TIMES)).close();
verify(solrClientAdmin, times(TIMES)).close();
}
}