diff --git a/watcher/src/test/java/org/elasticsearch/script/SleepScriptEngine.java b/watcher/src/test/java/org/elasticsearch/script/SleepScriptEngine.java new file mode 100644 index 00000000000..064fa1a83d6 --- /dev/null +++ b/watcher/src/test/java/org/elasticsearch/script/SleepScriptEngine.java @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.script; + +import org.elasticsearch.common.Nullable; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.search.lookup.SearchLookup; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; + +/** + * A dummy script engine used for testing. Scripts must be a number. Running the script + */ +public class SleepScriptEngine implements ScriptEngineService { + public static final String NAME = "sleep"; + + public static class TestPlugin extends Plugin { + + public TestPlugin() { + } + + @Override + public String name() { + return NAME; + } + + @Override + public String description() { + return "Mock script engine for integration tests"; + } + + public void onModule(ScriptModule module) { + module.addScriptEngine(SleepScriptEngine.class); + } + + } + + @Override + public String[] types() { + return new String[]{ NAME }; + } + + @Override + public String[] extensions() { + return types(); + } + + @Override + public boolean sandboxed() { + return true; + } + + @Override + public Object compile(String script) { + return script; + } + + @Override + public ExecutableScript executable(CompiledScript compiledScript, @Nullable Map vars) { + return new AbstractSearchScript() { + @Override + public Object run() { + try { + Thread.sleep(((Number) vars.get("millis")).longValue()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return true; + } + }; + } + + @Override + public SearchScript search(CompiledScript compiledScript, SearchLookup lookup, @Nullable Map vars) { + return null; + } + + @Override + public void scriptRemoved(@Nullable CompiledScript script) { + } + + @Override + public void close() throws IOException { + } + + public static org.elasticsearch.watcher.support.Script sleepScript(long millis) { + return new org.elasticsearch.watcher.support.Script.Builder.Inline("") + .lang("sleep") + .params(Collections.singletonMap("millis", millis)).build(); + } + +} diff --git a/watcher/src/test/java/org/elasticsearch/watcher/transport/action/delete/ForceDeleteWatchTests.java b/watcher/src/test/java/org/elasticsearch/watcher/transport/action/delete/ForceDeleteWatchTests.java index 379671420ef..704910a5a50 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/transport/action/delete/ForceDeleteWatchTests.java +++ b/watcher/src/test/java/org/elasticsearch/watcher/transport/action/delete/ForceDeleteWatchTests.java @@ -6,13 +6,22 @@ package org.elasticsearch.watcher.transport.action.delete; import org.apache.lucene.util.LuceneTestCase.AwaitsFix; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.SleepScriptEngine; import org.elasticsearch.test.junit.annotations.TestLogging; +import org.elasticsearch.watcher.condition.Condition; +import org.elasticsearch.watcher.condition.ConditionBuilders; import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.transport.actions.delete.DeleteWatchResponse; import org.elasticsearch.watcher.transport.actions.put.PutWatchResponse; import org.elasticsearch.watcher.transport.actions.service.WatcherServiceResponse; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + import static org.elasticsearch.watcher.actions.ActionBuilders.loggingAction; import static org.elasticsearch.watcher.client.WatchSourceBuilders.watchBuilder; import static org.elasticsearch.watcher.condition.ConditionBuilders.scriptCondition; @@ -23,7 +32,6 @@ import static org.hamcrest.Matchers.is; /** */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class ForceDeleteWatchTests extends AbstractWatcherIntegrationTestCase { //Disable time warping for the force delete long running watch test @Override @@ -36,11 +44,18 @@ public class ForceDeleteWatchTests extends AbstractWatcherIntegrationTestCase { return false; } + @Override + protected Collection> nodePlugins() { + List> plugins = new ArrayList<>(super.nodePlugins()); + plugins.add(SleepScriptEngine.TestPlugin.class); + return plugins; + } + @TestLogging("_root:DEBUG") public void testForceDeleteLongRunningWatch() throws Exception { PutWatchResponse putResponse = watcherClient().preparePutWatch("_name").setSource(watchBuilder() .trigger(schedule(interval("3s"))) - .condition(scriptCondition(Script.inline("sleep 5000; return true"))) + .condition(scriptCondition(SleepScriptEngine.sleepScript(5000))) .addAction("_action1", loggingAction("executed action: {{ctx.id}}"))) .get(); assertThat(putResponse.getId(), equalTo("_name")); diff --git a/watcher/src/test/java/org/elasticsearch/watcher/transport/action/stats/SlowWatchStatsTests.java b/watcher/src/test/java/org/elasticsearch/watcher/transport/action/stats/SlowWatchStatsTests.java index 8beef6d405e..157a8220d99 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/transport/action/stats/SlowWatchStatsTests.java +++ b/watcher/src/test/java/org/elasticsearch/watcher/transport/action/stats/SlowWatchStatsTests.java @@ -8,17 +8,26 @@ package org.elasticsearch.watcher.transport.action.stats; import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.EsExecutors; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.ScriptService; +import org.elasticsearch.script.SleepScriptEngine; import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.watcher.WatcherState; import org.elasticsearch.watcher.actions.ActionBuilders; +import org.elasticsearch.watcher.condition.Condition; import org.elasticsearch.watcher.condition.ConditionBuilders; import org.elasticsearch.watcher.execution.ExecutionPhase; import org.elasticsearch.watcher.execution.QueuedWatch; import org.elasticsearch.watcher.input.InputBuilders; +import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.transport.actions.stats.WatcherStatsResponse; import org.joda.time.DateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.concurrent.TimeUnit; import static org.elasticsearch.test.ESIntegTestCase.Scope.TEST; @@ -33,13 +42,19 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @ESIntegTestCase.ClusterScope(scope = TEST, numClientNodes = 0, transportClientRatio = 0, randomDynamicTemplates = false, numDataNodes = 2) -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class SlowWatchStatsTests extends AbstractWatcherIntegrationTestCase { @Override protected boolean timeWarped() { return false; } + @Override + protected Collection> nodePlugins() { + List> plugins = new ArrayList<>(super.nodePlugins()); + plugins.add(SleepScriptEngine.TestPlugin.class); + return plugins; + } + @Override protected Settings nodeSettings(int nodeOrdinal) { return Settings.builder() @@ -53,7 +68,7 @@ public class SlowWatchStatsTests extends AbstractWatcherIntegrationTestCase { watcherClient().preparePutWatch("_id").setSource(watchBuilder() .trigger(schedule(interval("1s"))) .input(InputBuilders.simpleInput("key", "value")) - .condition(ConditionBuilders.scriptCondition("sleep 10000; return true")) + .condition(ConditionBuilders.scriptCondition(SleepScriptEngine.sleepScript(10000))) .addAction("_action", ActionBuilders.loggingAction("hello {{ctx.watch_id}}!")) ).get(); @@ -78,7 +93,7 @@ public class SlowWatchStatsTests extends AbstractWatcherIntegrationTestCase { watcherClient().preparePutWatch("_id" + i).setSource(watchBuilder() .trigger(schedule(interval("1s"))) .input(InputBuilders.simpleInput("key", "value")) - .condition(ConditionBuilders.scriptCondition("sleep 10000; return true")) + .condition(ConditionBuilders.scriptCondition(SleepScriptEngine.sleepScript(10000))) .addAction("_action", ActionBuilders.loggingAction("hello {{ctx.watch_id}}!")) ).get(); }