package io.searchbox.core;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.google.gson.JsonElement;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesAction;
import org.elasticsearch.test.ESIntegTestCase;
import org.json.JSONException;
import org.junit.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import com.google.gson.JsonArray;
import io.searchbox.common.AbstractIntegrationTest;
import org.skyscreamer.jsonassert.JSONCompare;
import org.skyscreamer.jsonassert.JSONCompareMode;
/**
* @author Bartosz Polnik
*/
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.TEST, numDataNodes = 1)
public class CatIntegrationTest extends AbstractIntegrationTest {
final static String INDEX = "catintegrationindex";
final static String ALIAS = "catintegrationalias";
final static String INDEX2 = "catintegrationindex2";
@Test
public void shouldReturnEmptyPlainTextForIndices() throws IOException {
CatResult result = client.execute(new Cat.IndicesBuilder().build());
assertEquals(new JsonArray(), result.getJsonObject().get(result.getPathToResult()));
assertArrayEquals(new String[0][0], result.getPlainText());
}
@Test
public void shouldProperlyMapSingleResult() throws IOException, JSONException {
createIndex(INDEX);
ensureSearchable(INDEX);
CatResult result = client.execute(new Cat.IndicesBuilder().setParameter("h", "index,docs.count").build());
assertArrayEquals(new String[][]{
new String[]{"index", "docs.count"},
new String[]{INDEX, "0"},
}, result.getPlainText());
JSONAssert.assertEquals("[{\"index\":\"catintegrationindex\",\"docs.count\":\"0\"}]", result.getSourceAsString(), false);
}
@Test
public void shouldFilterResultsToASingleIndex() throws IOException, JSONException {
createIndex(INDEX, INDEX2);
ensureSearchable(INDEX, INDEX2);
CatResult result = client.execute(new Cat.IndicesBuilder().setParameter("h", "index,docs.count").addIndex(INDEX2).build());
assertArrayEquals(new String[][]{
new String[]{"index", "docs.count"},
new String[]{INDEX2, "0"},
}, result.getPlainText());
JSONAssert.assertEquals("[{\"index\":\"catintegrationindex2\",\"docs.count\":\"0\"}]", result.getSourceAsString(), false);
}
@Test
public void shouldDisplayAliasForSingleResult() throws IOException, JSONException {
createIndex(INDEX);
ensureSearchable(INDEX);
IndicesAliasesAction.INSTANCE.newRequestBuilder(client().admin().indices()).addAlias(INDEX, ALIAS).get();
CatResult result = client.execute(new Cat.AliasesBuilder().setParameter("h", "alias,index").build());
assertArrayEquals(new String[][]{
new String[]{"alias", "index"},
new String[]{ALIAS, INDEX},
}, result.getPlainText());
JSONAssert.assertEquals("[{\"alias\":\"catintegrationalias\",\"index\":\"catintegrationindex\"}]", result.getSourceAsString(), false);
}
@Test
public void shouldChangeOrderOfColumnsByspecifyingParameters() throws IOException, JSONException {
createIndex(INDEX);
ensureSearchable(INDEX);
IndicesAliasesAction.INSTANCE.newRequestBuilder(client().admin().indices()).addAlias(INDEX, ALIAS).get();
CatResult result = client.execute(new Cat.AliasesBuilder().setParameter("h", "index,alias").build());
assertArrayEquals(new String[][]{
new String[]{"index", "alias"},
new String[]{INDEX, ALIAS},
}, result.getPlainText());
JSONAssert.assertEquals("[{\"index\":\"catintegrationindex\",\"alias\":\"catintegrationalias\"}]", result.getSourceAsString(), false);
}
@Test
public void catAllShards() throws IOException, JSONException {
createIndex(INDEX);
createIndex(INDEX2);
ensureSearchable(INDEX);
ensureSearchable(INDEX2);
CatResult catResult = client.execute(new Cat.ShardsBuilder().setParameter("h", "index,docs").build());
JsonArray shards = catResult.getJsonObject().get("result").getAsJsonArray();
assertEquals(shards.size(), getNumShards(INDEX).totalNumShards + getNumShards(INDEX2).totalNumShards);
int index1Count = 0;
int index2Count = 0;
for (JsonElement shard : shards) {
index1Count += JSONCompare.compareJSON("{\"index\":\"" + INDEX + "\",\"docs\":\"0\"}", shard.toString(), JSONCompareMode.LENIENT).passed() ? 1 : 0;
index2Count += JSONCompare.compareJSON("{\"index\":\"" + INDEX2 + "\",\"docs\":\"0\"}", shard.toString(), JSONCompareMode.LENIENT).passed() ? 1 : 0;
}
assertTrue(index1Count > 0);
assertTrue(index2Count > 0);
assertEquals(index1Count + index2Count, shards.size());
}
@Test
public void catShardsSingleIndex() throws IOException, JSONException {
createIndex(INDEX);
createIndex(INDEX2);
ensureSearchable(INDEX);
ensureSearchable(INDEX2);
CatResult catResult = client.execute(new Cat.ShardsBuilder().addIndex(INDEX).setParameter("h", "index,docs").build());
JsonArray shards = catResult.getJsonObject().get("result").getAsJsonArray();
assertEquals(shards.size(), getNumShards(INDEX).totalNumShards);
for (JsonElement shard : shards) {
JSONAssert.assertEquals("{\"index\":\"catintegrationindex\",\"docs\":\"0\"}", shard.toString(), false);
}
}
@Test
public void catNodes() throws IOException {
CatResult catResult = client.execute(new Cat.NodesBuilder().setParameter("h", "name").build());
JsonArray nodes = catResult.getJsonObject().get("result").getAsJsonArray();
Set<String> expectedNodeNames = new HashSet<>(Arrays.asList(internalCluster().getNodeNames()));
Set<String> actualNodeNames = new HashSet<>();
for (JsonElement node : nodes) {
actualNodeNames.add(node.getAsJsonObject().get("name").getAsString());
}
assertEquals(actualNodeNames, expectedNodeNames);
}
}