diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/test/rest/YamlRestCompatTestPluginFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/test/rest/YamlRestCompatTestPluginFuncTest.groovy index be0fc2420168a..31bb124c8a9cd 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/test/rest/YamlRestCompatTestPluginFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/test/rest/YamlRestCompatTestPluginFuncTest.groovy @@ -250,7 +250,12 @@ class YamlRestCompatTestPluginFuncTest extends AbstractRestResourcesFuncTest { - is_false: "value_to_replace" - is_true: "value_not_to_replace" - is_false: "value_not_to_replace" - + --- + "use cat with no header": + - do: + cat.indices: + {} + - match: {} """.stripIndent() when: def result = gradleRunner("yamlRestCompatTest").build() @@ -337,6 +342,16 @@ class YamlRestCompatTestPluginFuncTest extends AbstractRestResourcesFuncTest { - is_false: "replaced_value" - is_true: "value_not_to_replace" - is_false: "value_not_to_replace" + --- + "use cat with no header": + - do: + cat.indices: + {} + allowed_warnings: + - "added allowed warning" + allowed_warnings_regex: + - "added allowed warning regex .* [0-9]" + - match: {} """.stripIndent()).readAll() expectedAll.eachWithIndex{ ObjectNode expected, int i -> diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/rest/compat/RestCompatTestTransformTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/rest/compat/RestCompatTestTransformTask.java index 74a870cbdd1fa..69733f7fd9514 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/rest/compat/RestCompatTestTransformTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/rest/compat/RestCompatTestTransformTask.java @@ -53,6 +53,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -94,7 +95,18 @@ public RestCompatTestTransformTask( // always inject compat headers headers.put("Content-Type", "application/vnd.elasticsearch+json;compatible-with=" + compatibleVersion); headers.put("Accept", "application/vnd.elasticsearch+json;compatible-with=" + compatibleVersion); - transformations.add(new InjectHeaders(headers)); + transformations.add(new InjectHeaders(headers, Set.of(RestCompatTestTransformTask::doesNotHaveCatOperation))); + } + + private static boolean doesNotHaveCatOperation(ObjectNode doNodeValue) { + final Iterator fieldNamesIterator = doNodeValue.fieldNames(); + while (fieldNamesIterator.hasNext()) { + final String fieldName = fieldNamesIterator.next(); + if (fieldName.startsWith("cat.")) { + return false; + } + } + return true; } /** diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/test/rest/transform/headers/InjectHeaders.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/test/rest/transform/headers/InjectHeaders.java index 27c54a5426cbd..c61a0a860d1ec 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/test/rest/transform/headers/InjectHeaders.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/test/rest/transform/headers/InjectHeaders.java @@ -18,6 +18,9 @@ import org.gradle.api.tasks.Internal; import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Function; /** * A {@link RestTestTransform} that injects HTTP headers into a REST test. This includes adding the necessary values to the "do" section @@ -28,25 +31,37 @@ public class InjectHeaders extends FeatureInjector implements RestTestTransformB private static JsonNodeFactory jsonNodeFactory = JsonNodeFactory.withExactBigDecimals(false); private final Map headers; + private final Set> applyConditions; /** * @param headers The headers to inject + * @param applyConditions a set of conditions that has to be satisfied in order to apply headers + * If the Set is empty then headers are always applied. */ - public InjectHeaders(Map headers) { + public InjectHeaders(Map headers, Set> applyConditions) { this.headers = headers; + this.applyConditions = applyConditions; } @Override public void transformTest(ObjectNode doNodeParent) { ObjectNode doNodeValue = (ObjectNode) doNodeParent.get(getKeyToFind()); - ObjectNode headersNode = (ObjectNode) doNodeValue.get("headers"); - if (headersNode == null) { - headersNode = new ObjectNode(jsonNodeFactory); - } - for (Map.Entry entry : headers.entrySet()) { - headersNode.set(entry.getKey(), TextNode.valueOf(entry.getValue())); + + if (shouldApplyHeaders(doNodeValue)) { + ObjectNode headersNode = (ObjectNode) doNodeValue.get("headers"); + if (headersNode == null) { + headersNode = new ObjectNode(jsonNodeFactory); + } + + for (Map.Entry entry : headers.entrySet()) { + headersNode.set(entry.getKey(), TextNode.valueOf(entry.getValue())); + } + doNodeValue.set("headers", headersNode); } - doNodeValue.set("headers", headersNode); + } + + private boolean shouldApplyHeaders(ObjectNode doNodeValue) { + return applyConditions.stream().allMatch(f -> f.apply(doNodeValue)); } @Override diff --git a/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/TransformTests.java b/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/TransformTests.java index c3f13b1a02c4c..62ed726ae949d 100644 --- a/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/TransformTests.java +++ b/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/TransformTests.java @@ -34,6 +34,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.LongAdder; +import java.util.function.Consumer; import java.util.stream.Collectors; public abstract class TransformTests extends GradleUnitTestCase { @@ -125,8 +126,8 @@ protected List getKnownFeatures() { protected List> getTransformations() { List> transformations = new ArrayList<>(); - transformations.add(new InjectHeaders(headers1)); - transformations.add(new InjectHeaders(headers2)); + transformations.add(new InjectHeaders(headers1, Collections.emptySet())); + transformations.add(new InjectHeaders(headers2, Collections.emptySet())); return transformations; } diff --git a/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/header/InjectHeaderTests.java b/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/header/InjectHeaderTests.java index 34d1273a086a2..07881a0f48678 100644 --- a/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/header/InjectHeaderTests.java +++ b/build-tools-internal/src/test/java/org/elasticsearch/gradle/internal/test/rest/transform/header/InjectHeaderTests.java @@ -14,9 +14,12 @@ import org.elasticsearch.gradle.internal.test.rest.transform.headers.InjectHeaders; import org.junit.Test; +import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; public class InjectHeaderTests extends InjectFeatureTests { @@ -57,6 +60,34 @@ public void testInjectHeadersWithPreExisting() throws Exception { validateBodyHasHeaders(transformedTests, headers); } + + @Test + public void testNotInjectingHeaders() throws Exception { + String testName = "/rest/transform/header/with_operation_to_skip_adding_headers.yml"; + List tests = getTests(testName); + validateSetupExist(tests); + validateBodyHasHeaders(tests, Map.of("foo", "bar")); + + List> transformations = + Collections.singletonList(new InjectHeaders(headers, Set.of(InjectHeaderTests::applyCondition))); + List transformedTests = transformTests(tests, transformations); + printTest(testName, transformedTests); + validateSetupAndTearDown(transformedTests); + validateBodyHasHeaders(tests, Map.of("foo", "bar")); + validateBodyHasHeaders(transformedTests, Map.of("foo", "bar")); + } + + private static boolean applyCondition(ObjectNode doNodeValue) { + final Iterator fieldNamesIterator = doNodeValue.fieldNames(); + while (fieldNamesIterator.hasNext()) { + final String fieldName = fieldNamesIterator.next(); + if (fieldName.startsWith("something_to_skip")) { + return false; + } + } + return true; + } + @Override protected List getKnownFeatures() { return Collections.singletonList("headers"); @@ -64,7 +95,7 @@ protected List getKnownFeatures() { @Override protected List> getTransformations() { - return Collections.singletonList(new InjectHeaders(headers)); + return Collections.singletonList(new InjectHeaders(headers, Collections.emptySet())); } @Override diff --git a/build-tools-internal/src/test/resources/rest/transform/header/with_operation_to_skip_adding_headers.yml b/build-tools-internal/src/test/resources/rest/transform/header/with_operation_to_skip_adding_headers.yml new file mode 100644 index 0000000000000..9387dbe2d6b31 --- /dev/null +++ b/build-tools-internal/src/test/resources/rest/transform/header/with_operation_to_skip_adding_headers.yml @@ -0,0 +1,13 @@ +--- +setup: + - skip: + features: headers +--- +"Test without a setup": + - do: + headers: + foo: "bar" + something_to_skip: + id: "something" + - match: { acknowledged: true } +