77
88package org .elasticsearch .xpack .migrate .task ;
99
10+ import org .elasticsearch .cluster .metadata .Metadata ;
1011import org .elasticsearch .common .bytes .BytesReference ;
1112import org .elasticsearch .common .io .stream .Writeable ;
1213import org .elasticsearch .test .AbstractXContentSerializingTestCase ;
14+ import org .elasticsearch .xcontent .ToXContent ;
1315import org .elasticsearch .xcontent .XContentBuilder ;
1416import org .elasticsearch .xcontent .XContentParser ;
17+ import org .elasticsearch .xcontent .XContentType ;
1518import org .elasticsearch .xcontent .json .JsonXContent ;
1619
1720import java .io .IOException ;
@@ -29,7 +32,26 @@ protected Writeable.Reader<ReindexDataStreamTaskParams> instanceReader() {
2932
3033 @ Override
3134 protected ReindexDataStreamTaskParams createTestInstance () {
32- return new ReindexDataStreamTaskParams (randomAlphaOfLength (50 ), randomLong (), randomNonNegativeInt (), randomNonNegativeInt ());
35+ return createTestInstance (randomBoolean ());
36+ }
37+
38+ @ Override
39+ protected ReindexDataStreamTaskParams createXContextTestInstance (XContentType xContentType ) {
40+ /*
41+ * Since we filter out headers from xcontent in some cases, we can't use them in the standard xcontent round trip testing.
42+ * Headers are covered in testToXContentContextMode
43+ */
44+ return createTestInstance (false );
45+ }
46+
47+ private ReindexDataStreamTaskParams createTestInstance (boolean withHeaders ) {
48+ return new ReindexDataStreamTaskParams (
49+ randomAlphaOfLength (50 ),
50+ randomLong (),
51+ randomNonNegativeInt (),
52+ randomNonNegativeInt (),
53+ getTestHeaders (withHeaders )
54+ );
3355 }
3456
3557 @ Override
@@ -38,21 +60,35 @@ protected ReindexDataStreamTaskParams mutateInstance(ReindexDataStreamTaskParams
3860 long startTime = instance .startTime ();
3961 int totalIndices = instance .totalIndices ();
4062 int totalIndicesToBeUpgraded = instance .totalIndicesToBeUpgraded ();
41- switch (randomIntBetween (0 , 3 )) {
63+ Map <String , String > headers = instance .headers ();
64+ switch (randomIntBetween (0 , 4 )) {
4265 case 0 -> sourceDataStream = randomAlphaOfLength (50 );
4366 case 1 -> startTime = randomLong ();
4467 case 2 -> totalIndices = totalIndices + 1 ;
4568 case 3 -> totalIndices = totalIndicesToBeUpgraded + 1 ;
69+ case 4 -> headers = headers .isEmpty () ? getTestHeaders (true ) : getTestHeaders ();
4670 default -> throw new UnsupportedOperationException ();
4771 }
48- return new ReindexDataStreamTaskParams (sourceDataStream , startTime , totalIndices , totalIndicesToBeUpgraded );
72+ return new ReindexDataStreamTaskParams (sourceDataStream , startTime , totalIndices , totalIndicesToBeUpgraded , headers );
4973 }
5074
5175 @ Override
5276 protected ReindexDataStreamTaskParams doParseInstance (XContentParser parser ) {
5377 return ReindexDataStreamTaskParams .fromXContent (parser );
5478 }
5579
80+ private Map <String , String > getTestHeaders () {
81+ return getTestHeaders (randomBoolean ());
82+ }
83+
84+ private Map <String , String > getTestHeaders (boolean nonEmpty ) {
85+ if (nonEmpty ) {
86+ return Map .of (randomAlphaOfLength (20 ), randomAlphaOfLength (30 ));
87+ } else {
88+ return Map .of ();
89+ }
90+ }
91+
5692 public void testToXContent () throws IOException {
5793 ReindexDataStreamTaskParams params = createTestInstance ();
5894 try (XContentBuilder builder = XContentBuilder .builder (JsonXContent .jsonXContent )) {
@@ -65,4 +101,41 @@ public void testToXContent() throws IOException {
65101 }
66102 }
67103 }
104+
105+ public void testToXContentContextMode () throws IOException {
106+ ReindexDataStreamTaskParams params = createTestInstance (true );
107+
108+ // We do not expect to get headers if the "content_mode" is "api"
109+ try (XContentBuilder builder = XContentBuilder .builder (JsonXContent .jsonXContent )) {
110+ builder .humanReadable (true );
111+ ToXContent .Params xContentParams = new ToXContent .MapParams (
112+ Map .of (Metadata .CONTEXT_MODE_PARAM , Metadata .XContentContext .API .toString ())
113+ );
114+ params .toXContent (builder , xContentParams );
115+ try (XContentParser parser = createParser (JsonXContent .jsonXContent , BytesReference .bytes (builder ))) {
116+ Map <String , Object > parserMap = parser .map ();
117+ assertThat (parserMap .get ("source_data_stream" ), equalTo (params .sourceDataStream ()));
118+ assertThat (((Number ) parserMap .get ("start_time" )).longValue (), equalTo (params .startTime ()));
119+ assertThat (parserMap .containsKey ("headers" ), equalTo (false ));
120+ }
121+ }
122+
123+ // We do expect to get headers if the "content_mode" is anything but "api"
124+ try (XContentBuilder builder = XContentBuilder .builder (JsonXContent .jsonXContent )) {
125+ builder .humanReadable (true );
126+ ToXContent .Params xContentParams = new ToXContent .MapParams (
127+ Map .of (
128+ Metadata .CONTEXT_MODE_PARAM ,
129+ randomFrom (Metadata .XContentContext .GATEWAY .toString (), Metadata .XContentContext .SNAPSHOT .toString ())
130+ )
131+ );
132+ params .toXContent (builder , xContentParams );
133+ try (XContentParser parser = createParser (JsonXContent .jsonXContent , BytesReference .bytes (builder ))) {
134+ Map <String , Object > parserMap = parser .map ();
135+ assertThat (parserMap .get ("source_data_stream" ), equalTo (params .sourceDataStream ()));
136+ assertThat (((Number ) parserMap .get ("start_time" )).longValue (), equalTo (params .startTime ()));
137+ assertThat (parserMap .get ("headers" ), equalTo (params .getHeaders ()));
138+ }
139+ }
140+ }
68141}
0 commit comments