diff --git a/docs/changelog/131391.yaml b/docs/changelog/131391.yaml new file mode 100644 index 0000000000000..acac2a5f4da96 --- /dev/null +++ b/docs/changelog/131391.yaml @@ -0,0 +1,6 @@ +pr: 131391 +summary: Fix bug in point in time response +area: Search +type: bug +issues: + - 131026 diff --git a/server/src/main/java/org/elasticsearch/action/search/OpenPointInTimeResponse.java b/server/src/main/java/org/elasticsearch/action/search/OpenPointInTimeResponse.java index b3ffc564d848c..f8243097e80a3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/OpenPointInTimeResponse.java +++ b/server/src/main/java/org/elasticsearch/action/search/OpenPointInTimeResponse.java @@ -59,7 +59,7 @@ public void writeTo(StreamOutput out) throws IOException { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field("id", Base64.getUrlEncoder().encodeToString(BytesReference.toBytes(pointInTimeId))); - buildBroadcastShardsHeader(builder, params, totalShards, successfulShards, failedShards, skippedShards, null); + buildBroadcastShardsHeader(builder, params, totalShards, successfulShards, skippedShards, failedShards, null); builder.endObject(); return builder; } diff --git a/server/src/test/java/org/elasticsearch/action/search/OpenPointInTimeResponseTests.java b/server/src/test/java/org/elasticsearch/action/search/OpenPointInTimeResponseTests.java new file mode 100644 index 0000000000000..3ed88419ab8d5 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/action/search/OpenPointInTimeResponseTests.java @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.action.search; + +import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.ToXContent; +import org.elasticsearch.xcontent.XContentBuilder; +import org.elasticsearch.xcontent.XContentType; + +import java.io.IOException; +import java.util.Base64; +import java.util.Locale; + +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent; + +public class OpenPointInTimeResponseTests extends ESTestCase { + + public void testIdCantBeNull() { + BytesReference pointInTimeId = null; + expectThrows(NullPointerException.class, () -> { new OpenPointInTimeResponse(pointInTimeId, 11, 8, 2, 1); }); + } + + public void testToXContent() throws IOException { + String id = "test-id"; + BytesReference pointInTimeId = new BytesArray(id); + + BytesReference actual; + try (XContentBuilder builder = XContentBuilder.builder(XContentType.JSON.xContent())) { + OpenPointInTimeResponse response = new OpenPointInTimeResponse(pointInTimeId, 11, 8, 2, 1); + response.toXContent(builder, ToXContent.EMPTY_PARAMS); + actual = BytesReference.bytes(builder); + } + + String encodedId = Base64.getUrlEncoder().encodeToString(BytesReference.toBytes(pointInTimeId)); + BytesReference expected = new BytesArray(String.format(Locale.ROOT, """ + { + "id": "%s", + "_shards": { + "total": 11, + "successful": 8, + "failed": 2, + "skipped": 1 + } + } + """, encodedId)); + assertToXContentEquivalent(expected, actual, XContentType.JSON); + } +}