/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.action.bulk; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.bulk.BulkItemResponse.Failure; import org.elasticsearch.action.delete.DeleteResponseTests; import org.elasticsearch.action.index.IndexResponseTests; import org.elasticsearch.action.update.UpdateResponseTests; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; import java.io.IOException; import static org.elasticsearch.ElasticsearchExceptionTests.assertDeepEquals; import static org.elasticsearch.ElasticsearchExceptionTests.randomExceptions; import static org.hamcrest.Matchers.containsString; public class BulkItemResponseTests extends ESTestCase { public void testFailureToString() { Failure failure = new Failure("index", "type", "id", new RuntimeException("test")); String toString = failure.toString(); assertThat(toString, containsString("\"type\":\"runtime_exception\"")); assertThat(toString, containsString("\"reason\":\"test\"")); assertThat(toString, containsString("\"status\":500")); } public void testToAndFromXContent() throws IOException { final XContentType xContentType = randomFrom(XContentType.values()); for (DocWriteRequest.OpType opType : DocWriteRequest.OpType.values()) { int bulkItemId = randomIntBetween(0, 100); boolean humanReadable = randomBoolean(); Tuple<? extends DocWriteResponse, ? extends DocWriteResponse> randomDocWriteResponses = null; if (opType == DocWriteRequest.OpType.INDEX || opType == DocWriteRequest.OpType.CREATE) { randomDocWriteResponses = IndexResponseTests.randomIndexResponse(); } else if (opType == DocWriteRequest.OpType.DELETE) { randomDocWriteResponses = DeleteResponseTests.randomDeleteResponse(); } else if (opType == DocWriteRequest.OpType.UPDATE) { randomDocWriteResponses = UpdateResponseTests.randomUpdateResponse(xContentType); } else { fail("Test does not support opType [" + opType + "]"); } BulkItemResponse bulkItemResponse = new BulkItemResponse(bulkItemId, opType, randomDocWriteResponses.v1()); BulkItemResponse expectedBulkItemResponse = new BulkItemResponse(bulkItemId, opType, randomDocWriteResponses.v2()); BytesReference originalBytes = toShuffledXContent(bulkItemResponse, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); BulkItemResponse parsedBulkItemResponse; try (XContentParser parser = createParser(xContentType.xContent(), originalBytes)) { assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); parsedBulkItemResponse = BulkItemResponse.fromXContent(parser, bulkItemId); assertNull(parser.nextToken()); } assertBulkItemResponse(expectedBulkItemResponse, parsedBulkItemResponse); } } public void testFailureToAndFromXContent() throws IOException { final XContentType xContentType = randomFrom(XContentType.values()); int itemId = randomIntBetween(0, 100); String index = randomAlphaOfLength(5); String type = randomAlphaOfLength(5); String id = randomAlphaOfLength(5); DocWriteRequest.OpType opType = randomFrom(DocWriteRequest.OpType.values()); final Tuple<Throwable, ElasticsearchException> exceptions = randomExceptions(); Exception bulkItemCause = (Exception) exceptions.v1(); Failure bulkItemFailure = new Failure(index, type, id, bulkItemCause); BulkItemResponse bulkItemResponse = new BulkItemResponse(itemId, opType, bulkItemFailure); Failure expectedBulkItemFailure = new Failure(index, type, id, exceptions.v2(), ExceptionsHelper.status(bulkItemCause)); BulkItemResponse expectedBulkItemResponse = new BulkItemResponse(itemId, opType, expectedBulkItemFailure); BytesReference originalBytes = toShuffledXContent(bulkItemResponse, xContentType, ToXContent.EMPTY_PARAMS, randomBoolean()); // Shuffle the XContent fields if (randomBoolean()) { try (XContentParser parser = createParser(xContentType.xContent(), originalBytes)) { originalBytes = shuffleXContent(parser, randomBoolean()).bytes(); } } BulkItemResponse parsedBulkItemResponse; try (XContentParser parser = createParser(xContentType.xContent(), originalBytes)) { assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); parsedBulkItemResponse = BulkItemResponse.fromXContent(parser, itemId); assertNull(parser.nextToken()); } assertBulkItemResponse(expectedBulkItemResponse, parsedBulkItemResponse); } public static void assertBulkItemResponse(BulkItemResponse expected, BulkItemResponse actual) { assertEquals(expected.getItemId(), actual.getItemId()); assertEquals(expected.getIndex(), actual.getIndex()); assertEquals(expected.getType(), actual.getType()); assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getOpType(), actual.getOpType()); assertEquals(expected.getVersion(), actual.getVersion()); assertEquals(expected.isFailed(), actual.isFailed()); if (expected.isFailed()) { BulkItemResponse.Failure expectedFailure = expected.getFailure(); BulkItemResponse.Failure actualFailure = actual.getFailure(); assertEquals(expectedFailure.getIndex(), actualFailure.getIndex()); assertEquals(expectedFailure.getType(), actualFailure.getType()); assertEquals(expectedFailure.getId(), actualFailure.getId()); assertEquals(expectedFailure.getMessage(), actualFailure.getMessage()); assertEquals(expectedFailure.getStatus(), actualFailure.getStatus()); assertDeepEquals((ElasticsearchException) expectedFailure.getCause(), (ElasticsearchException) actualFailure.getCause()); } else { if (expected.getOpType() == DocWriteRequest.OpType.UPDATE) { UpdateResponseTests.assertUpdateResponse(expected.getResponse(), actual.getResponse()); } else { // assertDocWriteResponse check the result for INDEX/CREATE and DELETE operations IndexResponseTests.assertDocWriteResponse(expected.getResponse(), actual.getResponse()); } } } }