From 46b0fdae33868bbeab142b1dc8d12402ba3308fd Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 10 Apr 2019 07:59:17 +0200 Subject: [PATCH] Add realistic hlrc request serialization test base class and (#40362) changed hlrc ccr request tests to use AbstractRequestTestCase base class. This way the request classes are tested in a more realistic setting. Note this change also adds a test dependency on xpack core module. Similar to #39844 but then for hlrc request serialization tests. Removed iterators from hlrc parsing tests. Use empty xcontent registries. Relates to #39745 --- .../client/AbstractRequestTestCase.java | 65 ++++++++++++++ .../client/AbstractResponseTestCase.java | 25 +++--- .../ccr/PutAutoFollowPatternRequestTests.java | 77 +++++------------ .../client/ccr/PutFollowRequestTests.java | 85 +++++++------------ .../client/ccr/ResumeFollowRequestTests.java | 66 ++++---------- 5 files changed, 147 insertions(+), 171 deletions(-) create mode 100644 client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractRequestTestCase.java diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractRequestTestCase.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractRequestTestCase.java new file mode 100644 index 00000000000..8a10831c477 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractRequestTestCase.java @@ -0,0 +1,65 @@ +/* + * 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.client; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContent; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +/** + * Base class for HLRC request parsing tests. + * + * This case class facilitates generating client side request test instances and + * verifies that they are correctly parsed into server side request instances. + * + * @param The class representing the request on the client side. + * @param The class representing the request on the server side. + */ +public abstract class AbstractRequestTestCase extends ESTestCase { + + public final void testFromXContent() throws IOException { + final C clientTestInstance = createClientTestInstance(); + + final XContentType xContentType = randomFrom(XContentType.values()); + final BytesReference bytes = toShuffledXContent(clientTestInstance, xContentType, ToXContent.EMPTY_PARAMS, randomBoolean()); + + final XContent xContent = XContentFactory.xContent(xContentType); + final XContentParser parser = xContent.createParser( + NamedXContentRegistry.EMPTY, + LoggingDeprecationHandler.INSTANCE, + bytes.streamInput()); + final S serverInstance = doParseToServerInstance(parser); + assertInstances(serverInstance, clientTestInstance); + } + + protected abstract C createClientTestInstance(); + + protected abstract S doParseToServerInstance(XContentParser parser) throws IOException; + + protected abstract void assertInstances(S serverInstance, C clientTestInstance); + +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractResponseTestCase.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractResponseTestCase.java index ebdbfc05035..8565ca14a90 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractResponseTestCase.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/AbstractResponseTestCase.java @@ -18,7 +18,6 @@ */ package org.elasticsearch.client; -import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.NamedXContentRegistry; @@ -42,23 +41,19 @@ import java.io.IOException; */ public abstract class AbstractResponseTestCase extends ESTestCase { - private static final int NUMBER_OF_TEST_RUNS = 20; - public final void testFromXContent() throws IOException { - for (int i = 0; i < NUMBER_OF_TEST_RUNS; i++) { - final S serverTestInstance = createServerTestInstance(); + final S serverTestInstance = createServerTestInstance(); - final XContentType xContentType = randomFrom(XContentType.values()); - final BytesReference bytes = toShuffledXContent(serverTestInstance, xContentType, ToXContent.EMPTY_PARAMS, randomBoolean()); + final XContentType xContentType = randomFrom(XContentType.values()); + final BytesReference bytes = toShuffledXContent(serverTestInstance, xContentType, ToXContent.EMPTY_PARAMS, randomBoolean()); - final XContent xContent = XContentFactory.xContent(xContentType); - final XContentParser parser = xContent.createParser( - new NamedXContentRegistry(ClusterModule.getNamedXWriteables()), - LoggingDeprecationHandler.INSTANCE, - bytes.streamInput()); - final C clientInstance = doParseToClientInstance(parser); - assertInstances(serverTestInstance, clientInstance); - } + final XContent xContent = XContentFactory.xContent(xContentType); + final XContentParser parser = xContent.createParser( + NamedXContentRegistry.EMPTY, + LoggingDeprecationHandler.INSTANCE, + bytes.streamInput()); + final C clientInstance = doParseToClientInstance(parser); + assertInstances(serverTestInstance, clientInstance); } protected abstract S createServerTestInstance(); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequestTests.java index 429cc4a9f90..b9ee34c8bda 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequestTests.java @@ -19,71 +19,24 @@ package org.elasticsearch.client.ccr; +import org.elasticsearch.client.AbstractRequestTestCase; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.common.xcontent.ConstructingObjectParser; -import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.test.AbstractXContentTestCase; +import org.elasticsearch.xpack.core.ccr.action.PutAutoFollowPatternAction; import java.io.IOException; import java.util.Arrays; -import java.util.List; -public class PutAutoFollowPatternRequestTests extends AbstractXContentTestCase { +import static org.elasticsearch.client.ccr.PutFollowRequestTests.assertFollowConfig; +import static org.hamcrest.Matchers.equalTo; - @SuppressWarnings("unchecked") - private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("test_parser", - true, (args) -> new PutAutoFollowPatternRequest("name", (String) args[0], (List) args[1])); - - static { - PARSER.declareString(ConstructingObjectParser.constructorArg(), PutFollowRequest.REMOTE_CLUSTER_FIELD); - PARSER.declareStringArray(ConstructingObjectParser.constructorArg(), PutAutoFollowPatternRequest.LEADER_PATTERNS_FIELD); - PARSER.declareString(PutAutoFollowPatternRequest::setFollowIndexNamePattern, PutAutoFollowPatternRequest.FOLLOW_PATTERN_FIELD); - PARSER.declareInt(PutAutoFollowPatternRequest::setMaxReadRequestOperationCount, FollowConfig.MAX_READ_REQUEST_OPERATION_COUNT); - PARSER.declareField( - PutAutoFollowPatternRequest::setMaxReadRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_READ_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_READ_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(PutAutoFollowPatternRequest::setMaxOutstandingReadRequests, FollowConfig.MAX_OUTSTANDING_READ_REQUESTS); - PARSER.declareInt(PutAutoFollowPatternRequest::setMaxWriteRequestOperationCount, FollowConfig.MAX_WRITE_REQUEST_OPERATION_COUNT); - PARSER.declareField( - PutAutoFollowPatternRequest::setMaxWriteRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_WRITE_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(PutAutoFollowPatternRequest::setMaxOutstandingWriteRequests, FollowConfig.MAX_OUTSTANDING_WRITE_REQUESTS); - PARSER.declareInt(PutAutoFollowPatternRequest::setMaxWriteBufferCount, FollowConfig.MAX_WRITE_BUFFER_COUNT); - PARSER.declareField( - PutAutoFollowPatternRequest::setMaxWriteBufferSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_WRITE_BUFFER_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_BUFFER_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareField( - PutAutoFollowPatternRequest::setMaxRetryDelay, - (p, c) -> TimeValue.parseTimeValue(p.text(), FollowConfig.MAX_RETRY_DELAY_FIELD.getPreferredName()), - PutFollowRequest.MAX_RETRY_DELAY_FIELD, - ObjectParser.ValueType.STRING); - PARSER.declareField( - PutAutoFollowPatternRequest::setReadPollTimeout, - (p, c) -> TimeValue.parseTimeValue(p.text(), FollowConfig.READ_POLL_TIMEOUT.getPreferredName()), - PutFollowRequest.READ_POLL_TIMEOUT, - ObjectParser.ValueType.STRING); - } +public class PutAutoFollowPatternRequestTests extends AbstractRequestTestCase< + PutAutoFollowPatternRequest, + PutAutoFollowPatternAction.Request> { @Override - protected PutAutoFollowPatternRequest doParseInstance(XContentParser parser) throws IOException { - return PARSER.apply(parser, null); - } - - @Override - protected boolean supportsUnknownFields() { - return true; - } - - @Override - protected PutAutoFollowPatternRequest createTestInstance() { + protected PutAutoFollowPatternRequest createClientTestInstance() { // Name isn't serialized, because it specified in url path, so no need to randomly generate it here. PutAutoFollowPatternRequest putAutoFollowPatternRequest = new PutAutoFollowPatternRequest("name", randomAlphaOfLength(4), Arrays.asList(generateRandomStringArray(4, 4, false))); @@ -123,4 +76,18 @@ public class PutAutoFollowPatternRequestTests extends AbstractXContentTestCase

{ +import static org.hamcrest.Matchers.equalTo; - private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("test_parser", - true, (args) -> new PutFollowRequest((String) args[0], (String) args[1], "followerIndex")); - - static { - PARSER.declareString(ConstructingObjectParser.constructorArg(), PutFollowRequest.REMOTE_CLUSTER_FIELD); - PARSER.declareString(ConstructingObjectParser.constructorArg(), PutFollowRequest.LEADER_INDEX_FIELD); - PARSER.declareInt(PutFollowRequest::setMaxReadRequestOperationCount, PutFollowRequest.MAX_READ_REQUEST_OPERATION_COUNT); - PARSER.declareField( - PutFollowRequest::setMaxReadRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), PutFollowRequest.MAX_READ_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_READ_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(PutFollowRequest::setMaxOutstandingReadRequests, PutFollowRequest.MAX_OUTSTANDING_READ_REQUESTS); - PARSER.declareInt(PutFollowRequest::setMaxWriteRequestOperationCount, PutFollowRequest.MAX_WRITE_REQUEST_OPERATION_COUNT); - PARSER.declareField( - PutFollowRequest::setMaxWriteRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), PutFollowRequest.MAX_WRITE_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(PutFollowRequest::setMaxOutstandingWriteRequests, PutFollowRequest.MAX_OUTSTANDING_WRITE_REQUESTS); - PARSER.declareInt(PutFollowRequest::setMaxWriteBufferCount, PutFollowRequest.MAX_WRITE_BUFFER_COUNT); - PARSER.declareField( - PutFollowRequest::setMaxWriteBufferSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), PutFollowRequest.MAX_WRITE_BUFFER_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_BUFFER_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareField( - PutFollowRequest::setMaxRetryDelay, - (p, c) -> TimeValue.parseTimeValue(p.text(), PutFollowRequest.MAX_RETRY_DELAY_FIELD.getPreferredName()), - PutFollowRequest.MAX_RETRY_DELAY_FIELD, - ObjectParser.ValueType.STRING); - PARSER.declareField( - PutFollowRequest::setReadPollTimeout, - (p, c) -> TimeValue.parseTimeValue(p.text(), PutFollowRequest.READ_POLL_TIMEOUT.getPreferredName()), - PutFollowRequest.READ_POLL_TIMEOUT, - ObjectParser.ValueType.STRING); - } +public class PutFollowRequestTests extends AbstractRequestTestCase { @Override - protected PutFollowRequest doParseInstance(XContentParser parser) throws IOException { - return PARSER.apply(parser, null); - } - - @Override - protected boolean supportsUnknownFields() { - return false; - } - - @Override - protected PutFollowRequest createTestInstance() { + protected PutFollowRequest createClientTestInstance() { PutFollowRequest putFollowRequest = new PutFollowRequest(randomAlphaOfLength(4), randomAlphaOfLength(4), "followerIndex"); if (randomBoolean()) { @@ -115,4 +70,30 @@ public class PutFollowRequestTests extends AbstractXContentTestCase { +import static org.elasticsearch.client.ccr.PutFollowRequestTests.assertFollowConfig; +import static org.hamcrest.Matchers.equalTo; - private static final ObjectParser PARSER = new ObjectParser<>("test_parser", - true, () -> new ResumeFollowRequest("followerIndex")); - - static { - PARSER.declareInt(ResumeFollowRequest::setMaxReadRequestOperationCount, FollowConfig.MAX_READ_REQUEST_OPERATION_COUNT); - PARSER.declareField( - ResumeFollowRequest::setMaxReadRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_READ_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_READ_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(ResumeFollowRequest::setMaxOutstandingReadRequests, FollowConfig.MAX_OUTSTANDING_READ_REQUESTS); - PARSER.declareInt(ResumeFollowRequest::setMaxWriteRequestOperationCount, FollowConfig.MAX_WRITE_REQUEST_OPERATION_COUNT); - PARSER.declareField( - ResumeFollowRequest::setMaxWriteRequestSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_WRITE_REQUEST_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_REQUEST_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareInt(ResumeFollowRequest::setMaxOutstandingWriteRequests, FollowConfig.MAX_OUTSTANDING_WRITE_REQUESTS); - PARSER.declareInt(ResumeFollowRequest::setMaxWriteBufferCount, FollowConfig.MAX_WRITE_BUFFER_COUNT); - PARSER.declareField( - ResumeFollowRequest::setMaxWriteBufferSize, - (p, c) -> ByteSizeValue.parseBytesSizeValue(p.text(), FollowConfig.MAX_WRITE_BUFFER_SIZE.getPreferredName()), - PutFollowRequest.MAX_WRITE_BUFFER_SIZE, - ObjectParser.ValueType.STRING); - PARSER.declareField( - ResumeFollowRequest::setMaxRetryDelay, - (p, c) -> TimeValue.parseTimeValue(p.text(), FollowConfig.MAX_RETRY_DELAY_FIELD.getPreferredName()), - PutFollowRequest.MAX_RETRY_DELAY_FIELD, - ObjectParser.ValueType.STRING); - PARSER.declareField( - ResumeFollowRequest::setReadPollTimeout, - (p, c) -> TimeValue.parseTimeValue(p.text(), FollowConfig.READ_POLL_TIMEOUT.getPreferredName()), - PutFollowRequest.READ_POLL_TIMEOUT, - ObjectParser.ValueType.STRING); - } +public class ResumeFollowRequestTests extends AbstractRequestTestCase { @Override - protected ResumeFollowRequest doParseInstance(XContentParser parser) throws IOException { - return PARSER.apply(parser, null); - } - - @Override - protected boolean supportsUnknownFields() { - return true; - } - - @Override - protected ResumeFollowRequest createTestInstance() { + protected ResumeFollowRequest createClientTestInstance() { ResumeFollowRequest resumeFollowRequest = new ResumeFollowRequest("followerIndex"); if (randomBoolean()) { resumeFollowRequest.setMaxOutstandingReadRequests(randomIntBetween(0, Integer.MAX_VALUE)); @@ -111,4 +68,15 @@ public class ResumeFollowRequestTests extends AbstractXContentTestCase