Skip to content

Commit a2c9418

Browse files
authored
Tests: Add support for custom contexts to mock scripts (#34100)
This commit adds the ability to plug in compilation of custom contexts in mock script engine. This is needed for testing plugins which add custom contexts like watcher.
1 parent 73ee721 commit a2c9418

File tree

15 files changed

+52
-34
lines changed

15 files changed

+52
-34
lines changed

modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorTests.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@
1919

2020
package org.elasticsearch.ingest.common;
2121

22-
import java.util.Collections;
23-
import java.util.HashMap;
24-
import java.util.Map;
25-
2622
import org.elasticsearch.common.settings.Settings;
2723
import org.elasticsearch.ingest.IngestDocument;
2824
import org.elasticsearch.ingest.RandomDocumentPicks;
@@ -33,6 +29,10 @@
3329
import org.elasticsearch.script.ScriptType;
3430
import org.elasticsearch.test.ESTestCase;
3531

32+
import java.util.Collections;
33+
import java.util.HashMap;
34+
import java.util.Map;
35+
3636
import static org.hamcrest.Matchers.hasKey;
3737
import static org.hamcrest.core.Is.is;
3838

@@ -52,7 +52,8 @@ Script.DEFAULT_SCRIPT_LANG, new MockScriptEngine(
5252
ctx.put("bytes_total", randomBytesTotal);
5353
return null;
5454
}
55-
)
55+
),
56+
Collections.emptyMap()
5657
)
5758
),
5859
new HashMap<>(ScriptModule.CORE_CONTEXTS)

server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public void setUp() throws Exception {
132132
return null;
133133
});
134134
scripts.put("return", vars -> null);
135-
final MockScriptEngine engine = new MockScriptEngine("mock", scripts);
135+
final MockScriptEngine engine = new MockScriptEngine("mock", scripts, Collections.emptyMap());
136136
Map<String, ScriptEngine> engines = Collections.singletonMap(engine.getType(), engine);
137137
ScriptService scriptService = new ScriptService(baseSettings, engines, ScriptModule.CORE_CONTEXTS);
138138
final Settings settings = settings(Version.CURRENT).build();

server/src/test/java/org/elasticsearch/ingest/ConditionalProcessorTests.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,6 @@
1919

2020
package org.elasticsearch.ingest;
2121

22-
import java.util.ArrayList;
23-
import java.util.Collections;
24-
import java.util.HashMap;
25-
import java.util.List;
26-
import java.util.Map;
27-
import java.util.concurrent.CompletableFuture;
28-
import java.util.function.Consumer;
2922
import org.elasticsearch.common.settings.Settings;
3023
import org.elasticsearch.script.MockScriptEngine;
3124
import org.elasticsearch.script.Script;
@@ -34,6 +27,14 @@
3427
import org.elasticsearch.script.ScriptType;
3528
import org.elasticsearch.test.ESTestCase;
3629

30+
import java.util.ArrayList;
31+
import java.util.Collections;
32+
import java.util.HashMap;
33+
import java.util.List;
34+
import java.util.Map;
35+
import java.util.concurrent.CompletableFuture;
36+
import java.util.function.Consumer;
37+
3738
import static org.hamcrest.Matchers.hasKey;
3839
import static org.hamcrest.Matchers.instanceOf;
3940
import static org.hamcrest.Matchers.not;
@@ -52,7 +53,8 @@ public void testChecksCondition() throws Exception {
5253
Script.DEFAULT_SCRIPT_LANG,
5354
Collections.singletonMap(
5455
scriptName, ctx -> trueValue.equals(ctx.get(conditionalField))
55-
)
56+
),
57+
Collections.emptyMap()
5658
)
5759
),
5860
new HashMap<>(ScriptModule.CORE_CONTEXTS)
@@ -120,7 +122,8 @@ private static void assertMutatingCtxThrows(Consumer<Map<String, Object>> mutati
120122
}
121123
return false;
122124
}
123-
)
125+
),
126+
Collections.emptyMap()
124127
)
125128
),
126129
new HashMap<>(ScriptModule.CORE_CONTEXTS)

server/src/test/java/org/elasticsearch/script/ScriptServiceTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ public void setup() throws IOException {
6666
scripts.put(i + "+" + i, p -> null); // only care about compilation, not execution
6767
}
6868
scripts.put("script", p -> null);
69-
scriptEngine = new MockScriptEngine(Script.DEFAULT_SCRIPT_LANG, scripts);
69+
scriptEngine = new MockScriptEngine(Script.DEFAULT_SCRIPT_LANG, scripts, Collections.emptyMap());
7070
//prevent duplicates using map
7171
contexts = new HashMap<>(ScriptModule.CORE_CONTEXTS);
7272
engines = new HashMap<>();
7373
engines.put(scriptEngine.getType(), scriptEngine);
74-
engines.put("test", new MockScriptEngine("test", scripts));
74+
engines.put("test", new MockScriptEngine("test", scripts, Collections.emptyMap()));
7575
logger.info("--> setup script service");
7676
}
7777

server/src/test/java/org/elasticsearch/search/aggregations/metrics/InternalScriptedMetricTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import org.elasticsearch.script.ScriptType;
3131
import org.elasticsearch.search.aggregations.Aggregation.CommonFields;
3232
import org.elasticsearch.search.aggregations.ParsedAggregation;
33-
import org.elasticsearch.search.aggregations.metrics.InternalScriptedMetric;
34-
import org.elasticsearch.search.aggregations.metrics.ParsedScriptedMetric;
3533
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
3634
import org.elasticsearch.test.InternalAggregationTestCase;
3735

@@ -118,7 +116,8 @@ protected ScriptService mockScriptService() {
118116
// mock script always retuns the size of the input aggs list as result
119117
@SuppressWarnings("unchecked")
120118
MockScriptEngine scriptEngine = new MockScriptEngine(MockScriptEngine.NAME,
121-
Collections.singletonMap(REDUCE_SCRIPT_NAME, script -> ((List<Object>) script.get("states")).size()));
119+
Collections.singletonMap(REDUCE_SCRIPT_NAME, script -> ((List<Object>) script.get("states")).size()),
120+
Collections.emptyMap());
122121
Map<String, ScriptEngine> engines = Collections.singletonMap(scriptEngine.getType(), scriptEngine);
123122
return new ScriptService(Settings.EMPTY, engines, ScriptModule.CORE_CONTEXTS);
124123
}

server/src/test/java/org/elasticsearch/search/aggregations/metrics/ScriptedMetricAggregatorTests.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
import org.elasticsearch.script.ScriptService;
3636
import org.elasticsearch.script.ScriptType;
3737
import org.elasticsearch.search.aggregations.AggregatorTestCase;
38-
import org.elasticsearch.search.aggregations.metrics.ScriptedMetric;
39-
import org.elasticsearch.search.aggregations.metrics.ScriptedMetricAggregationBuilder;
4038
import org.junit.BeforeClass;
4139

4240
import java.io.IOException;
@@ -345,7 +343,7 @@ public void testSelfReferencingAggStateAfterCombine() throws IOException {
345343
*/
346344
@Override
347345
protected QueryShardContext queryShardContextMock(MapperService mapperService) {
348-
MockScriptEngine scriptEngine = new MockScriptEngine(MockScriptEngine.NAME, SCRIPTS);
346+
MockScriptEngine scriptEngine = new MockScriptEngine(MockScriptEngine.NAME, SCRIPTS, Collections.emptyMap());
349347
Map<String, ScriptEngine> engines = Collections.singletonMap(scriptEngine.getType(), scriptEngine);
350348
ScriptService scriptService = new ScriptService(Settings.EMPTY, engines, ScriptModule.CORE_CONTEXTS);
351349
return new QueryShardContext(0, mapperService.getIndexSettings(), null, null, mapperService, null, scriptService,

server/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public static void init() {
8484
.put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString())
8585
.build();
8686
Map<String, Function<Map<String, Object>, Object>> scripts = Collections.singletonMap(MOCK_SCRIPT_NAME, p -> null);
87-
ScriptEngine engine = new MockScriptEngine(MockScriptEngine.NAME, scripts);
87+
ScriptEngine engine = new MockScriptEngine(MockScriptEngine.NAME, scripts, Collections.emptyMap());
8888
scriptService = new ScriptService(baseSettings, Collections.singletonMap(engine.getType(), engine), ScriptModule.CORE_CONTEXTS);
8989

9090
SearchModule searchModule = new SearchModule(Settings.EMPTY, false, emptyList());

test/framework/src/main/java/org/elasticsearch/ingest/TestTemplateService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ public static ScriptService instance(boolean compilationException) {
4343
}
4444

4545
private TestTemplateService(boolean compilationException) {
46-
super(Settings.EMPTY, Collections.singletonMap(DEFAULT_TEMPLATE_LANG,
47-
new MockScriptEngine(MockScriptEngine.NAME, Collections.emptyMap())), Collections.emptyMap());
46+
super(Settings.EMPTY, Collections.singletonMap(DEFAULT_TEMPLATE_LANG, new MockScriptEngine()), Collections.emptyMap());
4847
this.compilationException = compilationException;
4948
}
5049

test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,26 @@
5353
*/
5454
public class MockScriptEngine implements ScriptEngine {
5555

56+
/** A non-typed compiler for a single custom context */
57+
public interface ContextCompiler {
58+
Object compile(Function<Map<String, Object>, Object> script, Map<String, String> params);
59+
}
60+
5661
public static final String NAME = "mockscript";
5762

5863
private final String type;
5964
private final Map<String, Function<Map<String, Object>, Object>> scripts;
65+
private final Map<ScriptContext<?>, ContextCompiler> contexts;
6066

61-
public MockScriptEngine(String type, Map<String, Function<Map<String, Object>, Object>> scripts) {
67+
public MockScriptEngine(String type, Map<String, Function<Map<String, Object>, Object>> scripts,
68+
Map<ScriptContext<?>, ContextCompiler> contexts) {
6269
this.type = type;
6370
this.scripts = Collections.unmodifiableMap(scripts);
71+
this.contexts = Collections.unmodifiableMap(contexts);
6472
}
6573

6674
public MockScriptEngine() {
67-
this(NAME, Collections.emptyMap());
75+
this(NAME, Collections.emptyMap(), Collections.emptyMap());
6876
}
6977

7078
@Override
@@ -198,6 +206,10 @@ public String execute() {
198206
ScriptedMetricAggContexts.ReduceScript.Factory factory = mockCompiled::createMetricAggReduceScript;
199207
return context.factoryClazz.cast(factory);
200208
}
209+
ContextCompiler compiler = contexts.get(context);
210+
if (compiler != null) {
211+
return context.factoryClazz.cast(compiler.compile(script, params));
212+
}
201213
throw new IllegalArgumentException("mock script engine does not know how to handle context [" + context.name + "]");
202214
}
203215

test/framework/src/main/java/org/elasticsearch/script/MockScriptPlugin.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.elasticsearch.plugins.ScriptPlugin;
2525

2626
import java.util.Collection;
27+
import java.util.Collections;
2728
import java.util.Map;
2829
import java.util.function.Function;
2930

@@ -36,11 +37,15 @@ public abstract class MockScriptPlugin extends Plugin implements ScriptPlugin {
3637

3738
@Override
3839
public ScriptEngine getScriptEngine(Settings settings, Collection<ScriptContext<?>> contexts) {
39-
return new MockScriptEngine(pluginScriptLang(), pluginScripts());
40+
return new MockScriptEngine(pluginScriptLang(), pluginScripts(), pluginContextCompilers());
4041
}
4142

4243
protected abstract Map<String, Function<Map<String, Object>, Object>> pluginScripts();
4344

45+
protected Map<ScriptContext<?>, MockScriptEngine.ContextCompiler> pluginContextCompilers() {
46+
return Collections.emptyMap();
47+
}
48+
4449
public String pluginScriptLang() {
4550
return NAME;
4651
}

0 commit comments

Comments
 (0)