Fix AbstractQueryTestCase.testUnknownObjectException()
When need to check the whole hierarchy of objects to know if the newly inserted "newField" object is part of an arbitrary holding object or not. Reproduced with `gradle :modules:percolator:test -Dtests.seed=736B0B67DA7A3632 -Dtests.class=org.elasticsearch.percolator.PercolateQueryBuilderTests -Dtests.method="testUnknownObjectException" -Dtests.security.manager=true -Dtests.locale=es-ES -Dtests.timezone=ART`
This commit is contained in:
parent
3f350f33f1
commit
fbcfddbb77
|
@ -114,9 +114,12 @@ import java.lang.reflect.InvocationHandler;
|
|||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Deque;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
@ -400,7 +403,9 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
|||
int mutation = 0;
|
||||
|
||||
while (true) {
|
||||
boolean expectedException = true;
|
||||
// Track the objects hierarchy
|
||||
Deque<String> hierarchy = new LinkedList<>();
|
||||
|
||||
BytesStreamOutput out = new BytesStreamOutput();
|
||||
try (
|
||||
XContentGenerator generator = XContentType.JSON.xContent().createGenerator(out);
|
||||
|
@ -414,10 +419,8 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
|||
if (token == XContentParser.Token.START_OBJECT) {
|
||||
objectIndex++;
|
||||
|
||||
if (hasArbitraryContent) {
|
||||
// The query has one or more fields that hold arbitrary content. If the current
|
||||
// field is one of those, no exception is expected when parsing the mutated query.
|
||||
expectedException = arbitraryMarkers.contains(parser.currentName()) == false;
|
||||
if (objectIndex <= mutation) {
|
||||
hierarchy.push(parser.currentName());
|
||||
}
|
||||
|
||||
if (objectIndex == mutation) {
|
||||
|
@ -439,15 +442,28 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
|||
// Check that the parser consumed all the tokens
|
||||
assertThat(token, nullValue());
|
||||
|
||||
if (objectIndex == mutation) {
|
||||
// We reached the expected insertion point, so next time we'll try one level deeper
|
||||
mutation++;
|
||||
} else {
|
||||
if (objectIndex < mutation) {
|
||||
// We did not reached the insertion point, there's no more mutation to try
|
||||
break;
|
||||
} else {
|
||||
// We reached the expected insertion point, so next time we'll try one step further
|
||||
mutation++;
|
||||
}
|
||||
}
|
||||
|
||||
boolean expectException = true;
|
||||
if (hasArbitraryContent) {
|
||||
// The query has one or more fields that hold arbitrary content. If the current
|
||||
// field is one (or a child) of those, no exception is expected when parsing the mutated query.
|
||||
for (String marker : arbitraryMarkers) {
|
||||
if (hierarchy.contains(marker)) {
|
||||
expectException = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
results.add(new Tuple<>(out.bytes().utf8ToString(), expectedException));
|
||||
}
|
||||
|
||||
results.add(new Tuple<>(out.bytes().utf8ToString(), expectException));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
|
|
|
@ -57,6 +57,23 @@ public class AbstractQueryTestCaseTests extends ESTestCase {
|
|||
hasEntry("{\"bool\":{\"must\":[{\"newField\":{\"match\":{\"field\":\"value\"}}}]}}", true),
|
||||
hasEntry("{\"bool\":{\"must\":[{\"match\":{\"newField\":{\"field\":\"value\"}}}]}}", true)
|
||||
));
|
||||
|
||||
alterations = alterateQueries(singleton("{\"function_score\":" +
|
||||
"{\"query\": {\"term\":{\"foo\": \"bar\"}}, \"script_score\": {\"script\":\"a + 1\", \"params\": {\"a\":0}}}}"), null);
|
||||
assertAlterations(alterations, allOf(
|
||||
hasEntry("{\"newField\":{\"function_score\":{\"query\":{\"term\":{\"foo\":\"bar\"}},\"script_score\":{\"script\":\"a + " +
|
||||
"1\",\"params\":{\"a\":0}}}}}", true),
|
||||
hasEntry("{\"function_score\":{\"newField\":{\"query\":{\"term\":{\"foo\":\"bar\"}},\"script_score\":{\"script\":\"a + " +
|
||||
"1\",\"params\":{\"a\":0}}}}}", true),
|
||||
hasEntry("{\"function_score\":{\"query\":{\"newField\":{\"term\":{\"foo\":\"bar\"}}},\"script_score\":{\"script\":\"a + " +
|
||||
"1\",\"params\":{\"a\":0}}}}", true),
|
||||
hasEntry("{\"function_score\":{\"query\":{\"term\":{\"newField\":{\"foo\":\"bar\"}}},\"script_score\":{\"script\":\"a + " +
|
||||
"1\",\"params\":{\"a\":0}}}}", true),
|
||||
hasEntry("{\"function_score\":{\"query\":{\"term\":{\"foo\":\"bar\"}},\"script_score\":{\"newField\":{\"script\":\"a + " +
|
||||
"1\",\"params\":{\"a\":0}}}}}", true),
|
||||
hasEntry("{\"function_score\":{\"query\":{\"term\":{\"foo\":\"bar\"}},\"script_score\":{\"script\":\"a + 1\"," +
|
||||
"\"params\":{\"newField\":{\"a\":0}}}}}", true)
|
||||
));
|
||||
}
|
||||
|
||||
public void testAlterateQueriesWithArbitraryContent() throws IOException {
|
||||
|
|
Loading…
Reference in New Issue