package org.skywalking.apm.collector.worker.storage; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import org.skywalking.apm.collector.worker.config.EsConfig; import java.io.IOException; import java.util.HashSet; import java.util.Set; import static org.powermock.api.mockito.PowerMockito.*; /** * @author pengys5 */ @RunWith(PowerMockRunner.class) @PrepareForTest( {IndexCreator.class, IndexCreatorTestCase.TestIndex.class}) @PowerMockIgnore( {"javax.management.*"}) public class IndexCreatorTestCase { private IndexCreator indexCreator; private TestIndex testIndex; @Before public void init() throws Exception { testIndex = mock(TestIndex.class); indexCreator = mock(IndexCreator.class); doCallRealMethod().when(indexCreator).create(); Set<AbstractIndex> indexSet = new HashSet<>(); indexSet.add(testIndex); when(indexCreator, "loadIndex").thenReturn(indexSet); } @Test public void testLoadIndex() throws Exception { IndexCreator indexCreator = spy(IndexCreator.INSTANCE); Set<AbstractIndex> indexSet = Whitebox.invokeMethod(indexCreator, "loadIndex"); Assert.assertEquals(8, indexSet.size()); Set<String> indexName = new HashSet<>(); for (AbstractIndex index : indexSet) { indexName.add(index.index()); } Assert.assertEquals(true, indexName.contains("node_ref_idx")); Assert.assertEquals(true, indexName.contains("node_ref_res_sum_idx")); Assert.assertEquals(true, indexName.contains("global_trace_idx")); Assert.assertEquals(true, indexName.contains("segment_cost_idx")); Assert.assertEquals(true, indexName.contains("node_mapping_idx")); Assert.assertEquals(true, indexName.contains("segment_idx")); Assert.assertEquals(true, indexName.contains("segment_exp_idx")); Assert.assertEquals(true, indexName.contains("node_comp_idx")); } @Test public void testCreateOptionManual() throws Exception { EsConfig.Es.Index.Initialize.MODE = EsConfig.IndexInitMode.MANUAL; indexCreator.create(); Mockito.verify(testIndex, Mockito.never()).createIndex(); Mockito.verify(testIndex, Mockito.never()).deleteIndex(); } @Test public void testCreateOptionForcedIndexIsExists() throws Exception { EsConfig.Es.Index.Initialize.MODE = EsConfig.IndexInitMode.FORCED; when(testIndex.isExists()).thenReturn(true); indexCreator.create(); Mockito.verify(testIndex).createIndex(); Mockito.verify(testIndex).deleteIndex(); } @Test public void testCreateOptionForcedIndexNotExists() throws Exception { EsConfig.Es.Index.Initialize.MODE = EsConfig.IndexInitMode.FORCED; when(testIndex.isExists()).thenReturn(false); indexCreator.create(); Mockito.verify(testIndex).createIndex(); Mockito.verify(testIndex, Mockito.never()).deleteIndex(); } @Test public void testCreateOptionAutoIndexNotExists() throws Exception { EsConfig.Es.Index.Initialize.MODE = EsConfig.IndexInitMode.AUTO; when(testIndex.isExists()).thenReturn(false); indexCreator.create(); Mockito.verify(testIndex).createIndex(); Mockito.verify(testIndex, Mockito.never()).deleteIndex(); } @Test public void testCreateOptionAutoIndexExists() throws Exception { EsConfig.Es.Index.Initialize.MODE = EsConfig.IndexInitMode.AUTO; when(testIndex.isExists()).thenReturn(true); indexCreator.create(); Mockito.verify(testIndex, Mockito.never()).createIndex(); Mockito.verify(testIndex, Mockito.never()).deleteIndex(); } class TestIndex extends AbstractIndex { @Override public String index() { return "TestIndex"; } @Override public boolean isRecord() { return false; } @Override public int refreshInterval() { return 0; } @Override public XContentBuilder createMappingBuilder() throws IOException { return XContentFactory.jsonBuilder(); } } }