diff --git a/qa/messy-test-watcher-with-groovy/build.gradle b/qa/messy-test-watcher-with-groovy/build.gradle new file mode 100644 index 00000000000..26d927a16cd --- /dev/null +++ b/qa/messy-test-watcher-with-groovy/build.gradle @@ -0,0 +1,20 @@ + +/* + * Messy tests that depend on groovy directly. Fix these! + * https://github.com/elastic/x-plugins/issues/724 + */ + +apply plugin: 'elasticsearch.standalone-test' + +dependencies { + testCompile project(path: ':x-plugins:license:plugin', configuration: 'runtime') + testCompile project(path: ':x-plugins:shield', configuration: 'runtime') + testCompile project(path: ':x-plugins:watcher', configuration: 'testArtifacts') + testCompile project(path: ':plugins:lang-groovy', configuration: 'runtime') +} + +// TODO: remove this, its because gradle does not bring in plugin-metadata for lang-groovy +// into the test classpath: if it did, then things will work +test { + systemProperty 'tests.security.manager', 'false' +} diff --git a/watcher/src/test/java/org/elasticsearch/watcher/test/integration/ExecutionVarsIntegrationTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ExecutionVarsIntegrationTests.java similarity index 96% rename from watcher/src/test/java/org/elasticsearch/watcher/test/integration/ExecutionVarsIntegrationTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ExecutionVarsIntegrationTests.java index 404c1acc4bf..6ba797fa02e 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/test/integration/ExecutionVarsIntegrationTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ExecutionVarsIntegrationTests.java @@ -3,12 +3,13 @@ * 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.watcher.test.integration; +package org.elasticsearch.messy.tests; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.util.Callback; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; import org.elasticsearch.watcher.client.WatcherClient; import org.elasticsearch.watcher.support.xcontent.ObjectPath; import org.elasticsearch.watcher.support.xcontent.XContentSource; @@ -32,8 +33,15 @@ import static org.hamcrest.Matchers.notNullValue; /** */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class ExecutionVarsIntegrationTests extends AbstractWatcherIntegrationTestCase { + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } + @Override protected boolean timeWarped() { return true; diff --git a/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/GroovyManualExecutionTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/GroovyManualExecutionTests.java new file mode 100644 index 00000000000..3f54855c345 --- /dev/null +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/GroovyManualExecutionTests.java @@ -0,0 +1,118 @@ +/* + * 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.messy.tests; + +import static org.elasticsearch.watcher.actions.ActionBuilders.loggingAction; +import static org.elasticsearch.watcher.client.WatchSourceBuilders.watchBuilder; +import static org.elasticsearch.watcher.input.InputBuilders.simpleInput; +import static org.elasticsearch.watcher.trigger.TriggerBuilders.schedule; +import static org.elasticsearch.watcher.trigger.schedule.Schedules.cron; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.lessThan; + +import java.util.ArrayList; + +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; +import org.elasticsearch.watcher.client.WatchSourceBuilder; +import org.elasticsearch.watcher.condition.script.ScriptCondition; +import org.elasticsearch.watcher.execution.ManualExecutionContext; +import org.elasticsearch.watcher.execution.ManualExecutionTests.ExecutionRunner; +import org.elasticsearch.watcher.history.WatchRecord; +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.get.GetWatchRequest; +import org.elasticsearch.watcher.transport.actions.put.PutWatchRequest; +import org.elasticsearch.watcher.transport.actions.put.PutWatchResponse; +import org.elasticsearch.watcher.trigger.manual.ManualTriggerEvent; +import org.elasticsearch.watcher.trigger.schedule.ScheduleTriggerEvent; +import org.elasticsearch.watcher.watch.Watch; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; + +/** + * Two groovy-using methods from ManualExecutionTests. + * They appear to be using groovy as a way to sleep. + */ +public class GroovyManualExecutionTests extends AbstractWatcherIntegrationTestCase { + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } + + @Override + protected boolean enableShield() { + return false; + } + + public void testWatchExecutionDuration() throws Exception { + WatchSourceBuilder watchBuilder = watchBuilder() + .trigger(schedule(cron("0 0 0 1 * ? 2099"))) + .input(simpleInput("foo", "bar")) + .condition(new ScriptCondition((new Script.Builder.Inline("sleep 100; return true")).build())) + .addAction("log", loggingAction("foobar")); + + Watch watch = watchParser().parse("_id", false, watchBuilder.buildAsBytes(XContentType.JSON)); + ManualExecutionContext.Builder ctxBuilder = ManualExecutionContext.builder(watch, false, new ManualTriggerEvent("_id", new ScheduleTriggerEvent(new DateTime(DateTimeZone.UTC), new DateTime(DateTimeZone.UTC))), new TimeValue(1, TimeUnit.HOURS)); + WatchRecord record = executionService().execute(ctxBuilder.build()); + assertThat(record.result().executionDurationMs(), greaterThanOrEqualTo(100L)); + } + + public void testForceDeletionOfLongRunningWatch() throws Exception { + WatchSourceBuilder watchBuilder = watchBuilder() + .trigger(schedule(cron("0 0 0 1 * ? 2099"))) + .input(simpleInput("foo", "bar")) + .condition(new ScriptCondition((new Script.Builder.Inline("sleep 10000; return true")).build())) + .defaultThrottlePeriod(new TimeValue(1, TimeUnit.HOURS)) + .addAction("log", loggingAction("foobar")); + + int numberOfThreads = scaledRandomIntBetween(1, 5); + PutWatchResponse putWatchResponse = watcherClient().putWatch(new PutWatchRequest("_id", watchBuilder)).actionGet(); + assertThat(putWatchResponse.getVersion(), greaterThan(0L)); + refresh(); + assertThat(watcherClient().getWatch(new GetWatchRequest("_id")).actionGet().isFound(), equalTo(true)); + + CountDownLatch startLatch = new CountDownLatch(1); + + List threads = new ArrayList<>(); + for (int i = 0; i < numberOfThreads; ++i) { + threads.add(new Thread(new ExecutionRunner(watchService(), executionService(), "_id", startLatch))); + } + + for (Thread thread : threads) { + thread.start(); + } + DeleteWatchResponse deleteWatchResponse = watcherClient().prepareDeleteWatch("_id").setForce(true).get(); + assertThat(deleteWatchResponse.isFound(), is(true)); + + deleteWatchResponse = watcherClient().prepareDeleteWatch("_id").get(); + assertThat(deleteWatchResponse.isFound(), is(false)); + + startLatch.countDown(); + + long startJoin = System.currentTimeMillis(); + for (Thread thread : threads) { + thread.join(); + } + long endJoin = System.currentTimeMillis(); + TimeValue tv = new TimeValue(10 * (numberOfThreads+1), TimeUnit.SECONDS); + assertThat("Shouldn't take longer than [" + tv.getSeconds() + "] seconds for all the threads to stop", (endJoin - startJoin), lessThan(tv.getMillis())); + } + +} diff --git a/watcher/src/test/java/org/elasticsearch/watcher/history/HistoryTemplateTransformMappingsTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/HistoryTemplateTransformMappingsTests.java similarity index 93% rename from watcher/src/test/java/org/elasticsearch/watcher/history/HistoryTemplateTransformMappingsTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/HistoryTemplateTransformMappingsTests.java index bac674d7821..ff9830ca489 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/history/HistoryTemplateTransformMappingsTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/HistoryTemplateTransformMappingsTests.java @@ -3,19 +3,21 @@ * 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.watcher.history; +package org.elasticsearch.messy.tests; import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.collect.ImmutableOpenMap; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; import org.elasticsearch.watcher.execution.ExecutionState; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.transport.actions.put.PutWatchResponse; import java.io.IOException; +import java.util.List; import java.util.Map; import static org.elasticsearch.common.xcontent.support.XContentMapValues.extractValue; @@ -33,8 +35,15 @@ import static org.hamcrest.Matchers.notNullValue; * This test makes sure that the http host and path fields in the watch_record action result are * not analyzed so they can be used in aggregations */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class HistoryTemplateTransformMappingsTests extends AbstractWatcherIntegrationTestCase { + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } + @Override protected boolean timeWarped() { return true; // just to have better control over the triggers diff --git a/watcher/src/test/java/org/elasticsearch/watcher/actions/index/IndexActionIntegrationTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/IndexActionIntegrationTests.java similarity index 96% rename from watcher/src/test/java/org/elasticsearch/watcher/actions/index/IndexActionIntegrationTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/IndexActionIntegrationTests.java index 4fedd5b0d8a..719ac19ff0e 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/actions/index/IndexActionIntegrationTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/IndexActionIntegrationTests.java @@ -3,12 +3,13 @@ * 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.watcher.actions.index; +package org.elasticsearch.messy.tests; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.sort.SortOrder; @@ -21,6 +22,8 @@ import org.elasticsearch.watcher.trigger.schedule.ScheduleTriggerEvent; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; +import java.util.List; + import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.matchQuery; import static org.elasticsearch.search.aggregations.AggregationBuilders.dateHistogram; @@ -39,8 +42,15 @@ import static org.hamcrest.Matchers.is; /** * */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class IndexActionIntegrationTests extends AbstractWatcherIntegrationTestCase { + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } + public void testSimple() throws Exception { PutWatchResponse putWatchResponse = watcherClient().preparePutWatch("_id").setSource(watchBuilder() .trigger(schedule(cron("0/1 * * * * ? 2020"))) diff --git a/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/MessyTestUtils.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/MessyTestUtils.java new file mode 100644 index 00000000000..448f9a9074a --- /dev/null +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/MessyTestUtils.java @@ -0,0 +1,44 @@ +/* + * 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.messy.tests; + +import org.apache.lucene.util.LuceneTestCase; +import org.elasticsearch.common.SuppressForbidden; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.env.Environment; +import org.elasticsearch.script.ScriptContextRegistry; +import org.elasticsearch.script.ScriptEngineService; +import org.elasticsearch.script.ScriptService; +import org.elasticsearch.script.groovy.GroovyScriptEngineService; +import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.watcher.ResourceWatcherService; +import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; +import org.elasticsearch.watcher.support.text.xmustache.XMustacheScriptEngineService; +import org.junit.Ignore; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@Ignore // not a test. +@SuppressForbidden(reason = "gradle is broken and tries to run me as a test") +public final class MessyTestUtils { + public static ScriptServiceProxy getScriptServiceProxy(ThreadPool tp) throws Exception { + Settings settings = Settings.settingsBuilder() + .put("script.inline", "on") + .put("script.indexed", "on") + .put("path.home", LuceneTestCase.createTempDir()) + .build(); + XMustacheScriptEngineService mustacheScriptEngineService = new XMustacheScriptEngineService(settings); + GroovyScriptEngineService groovyScriptEngineService = new GroovyScriptEngineService(settings); + Set engineServiceSet = new HashSet<>(); + engineServiceSet.add(mustacheScriptEngineService); + engineServiceSet.add(groovyScriptEngineService); + ScriptContextRegistry registry = new ScriptContextRegistry(Arrays.asList(ScriptServiceProxy.INSTANCE)); + + return ScriptServiceProxy.of(new ScriptService(settings, new Environment(settings), engineServiceSet, new ResourceWatcherService(settings, tp), registry)); + } +} diff --git a/watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionSearchTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionSearchTests.java similarity index 88% rename from watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionSearchTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionSearchTests.java index 168796ec327..d5df78e57ea 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionSearchTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionSearchTests.java @@ -3,12 +3,13 @@ * 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.watcher.condition.script; +package org.elasticsearch.messy.tests; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.common.text.StringText; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; @@ -17,30 +18,39 @@ import org.elasticsearch.search.internal.InternalSearchHit; import org.elasticsearch.search.internal.InternalSearchHits; import org.elasticsearch.search.internal.InternalSearchResponse; import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.watcher.condition.script.ExecutableScriptCondition; +import org.elasticsearch.watcher.condition.script.ScriptCondition; import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; -import org.elasticsearch.watcher.test.WatcherTestUtils; import org.elasticsearch.watcher.watch.Payload; import org.junit.After; import org.junit.Before; +import java.util.List; + import static org.elasticsearch.watcher.test.WatcherTestUtils.mockExecutionContext; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.when; /** */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class ScriptConditionSearchTests extends AbstractWatcherIntegrationTestCase { private ThreadPool tp = null; private ScriptServiceProxy scriptService; + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } @Before public void init() throws Exception { tp = new ThreadPool(ThreadPool.Names.SAME); - scriptService = WatcherTestUtils.getScriptServiceProxy(tp); + scriptService = MessyTestUtils.getScriptServiceProxy(tp); } @After diff --git a/watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionTests.java similarity index 96% rename from watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionTests.java index f66a3de6ce2..6042f70eecf 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/condition/script/ScriptConditionTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/ScriptConditionTests.java @@ -3,10 +3,9 @@ * 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.watcher.condition.script; +package org.elasticsearch.messy.tests; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.ShardSearchFailure; @@ -21,6 +20,9 @@ import org.elasticsearch.search.internal.InternalSearchResponse; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.watcher.condition.Condition; +import org.elasticsearch.watcher.condition.script.ExecutableScriptCondition; +import org.elasticsearch.watcher.condition.script.ScriptCondition; +import org.elasticsearch.watcher.condition.script.ScriptConditionFactory; import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; @@ -35,18 +37,18 @@ import java.io.IOException; import static java.util.Collections.singletonMap; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.watcher.support.Exceptions.illegalArgument; -import static org.elasticsearch.watcher.test.WatcherTestUtils.getScriptServiceProxy; import static org.elasticsearch.watcher.test.WatcherTestUtils.mockExecutionContext; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.elasticsearch.messy.tests.MessyTestUtils.getScriptServiceProxy; + /** */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class ScriptConditionTests extends ESTestCase { ThreadPool tp = null; - + @Before public void init() { tp = new ThreadPool(ThreadPool.Names.SAME); diff --git a/watcher/src/test/java/org/elasticsearch/watcher/transform/TransformIntegrationTests.java b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/TransformIntegrationTests.java similarity index 96% rename from watcher/src/test/java/org/elasticsearch/watcher/transform/TransformIntegrationTests.java rename to qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/TransformIntegrationTests.java index f6be9b031da..018d5c52a4b 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/transform/TransformIntegrationTests.java +++ b/qa/messy-test-watcher-with-groovy/src/test/java/org/elasticsearch/messy/tests/TransformIntegrationTests.java @@ -3,14 +3,15 @@ * 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.watcher.transform; +package org.elasticsearch.messy.tests; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.script.groovy.GroovyPlugin; import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.test.WatcherTestUtils; @@ -21,6 +22,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; @@ -43,8 +45,15 @@ import static org.hamcrest.Matchers.is; /** */ -@AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") public class TransformIntegrationTests extends AbstractWatcherIntegrationTestCase { + + @Override + protected List> pluginTypes() { + List> types = super.pluginTypes(); + types.add(GroovyPlugin.class); + return types; + } + @Override public Settings nodeSettings(int nodeOrdinal) { Path configDir = createTempDir(); diff --git a/watcher/build.gradle b/watcher/build.gradle index 3a64e30bb84..bf34dd721bd 100644 --- a/watcher/build.gradle +++ b/watcher/build.gradle @@ -55,3 +55,16 @@ bundlePlugin { into 'bin' } } + +// TODO: don't publish test artifacts just to run messy tests, fix the tests! +// https://github.com/elastic/x-plugins/issues/724 +configurations { + testArtifacts.extendsFrom testRuntime +} +task testJar(type: Jar) { + classifier "test" + from sourceSets.test.output +} +artifacts { + testArtifacts testJar +} diff --git a/watcher/src/test/java/org/elasticsearch/watcher/execution/ManualExecutionTests.java b/watcher/src/test/java/org/elasticsearch/watcher/execution/ManualExecutionTests.java index 97114df413e..a745167271f 100644 --- a/watcher/src/test/java/org/elasticsearch/watcher/execution/ManualExecutionTests.java +++ b/watcher/src/test/java/org/elasticsearch/watcher/execution/ManualExecutionTests.java @@ -5,7 +5,6 @@ */ package org.elasticsearch.watcher.execution; -import org.apache.lucene.util.LuceneTestCase.AwaitsFix; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.common.unit.TimeValue; @@ -21,7 +20,6 @@ import org.elasticsearch.watcher.input.simple.SimpleInput; import org.elasticsearch.watcher.support.clock.SystemClock; import org.elasticsearch.watcher.support.xcontent.ObjectPath; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; -import org.elasticsearch.watcher.transport.actions.delete.DeleteWatchResponse; import org.elasticsearch.watcher.transport.actions.execute.ExecuteWatchRequest; import org.elasticsearch.watcher.transport.actions.execute.ExecuteWatchRequestBuilder; import org.elasticsearch.watcher.transport.actions.execute.ExecuteWatchResponse; @@ -302,63 +300,7 @@ public class ManualExecutionTests extends AbstractWatcherIntegrationTestCase { assertThat(ObjectPath.eval("state", executeWatchResult), equalTo(ExecutionState.THROTTLED.toString())); } - @AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") - public void testWatchExecutionDuration() throws Exception { - WatchSourceBuilder watchBuilder = watchBuilder() - .trigger(schedule(cron("0 0 0 1 * ? 2099"))) - .input(simpleInput("foo", "bar")) -// .condition(new ScriptCondition((new Script.Builder.Inline("sleep 100; return true")).build())) - .addAction("log", loggingAction("foobar")); - - Watch watch = watchParser().parse("_id", false, watchBuilder.buildAsBytes(XContentType.JSON)); - ManualExecutionContext.Builder ctxBuilder = ManualExecutionContext.builder(watch, false, new ManualTriggerEvent("_id", new ScheduleTriggerEvent(new DateTime(DateTimeZone.UTC), new DateTime(DateTimeZone.UTC))), new TimeValue(1, TimeUnit.HOURS)); - WatchRecord record = executionService().execute(ctxBuilder.build()); - assertThat(record.result().executionDurationMs(), greaterThanOrEqualTo(100L)); - } - - @AwaitsFix(bugUrl = "https://github.com/elastic/x-plugins/issues/724") - public void testForceDeletionOfLongRunningWatch() throws Exception { - WatchSourceBuilder watchBuilder = watchBuilder() - .trigger(schedule(cron("0 0 0 1 * ? 2099"))) - .input(simpleInput("foo", "bar")) -// .condition(new ScriptCondition((new Script.Builder.Inline("sleep 10000; return true")).build())) - .defaultThrottlePeriod(new TimeValue(1, TimeUnit.HOURS)) - .addAction("log", loggingAction("foobar")); - - int numberOfThreads = scaledRandomIntBetween(1, 5); - PutWatchResponse putWatchResponse = watcherClient().putWatch(new PutWatchRequest("_id", watchBuilder)).actionGet(); - assertThat(putWatchResponse.getVersion(), greaterThan(0L)); - refresh(); - assertThat(watcherClient().getWatch(new GetWatchRequest("_id")).actionGet().isFound(), equalTo(true)); - - CountDownLatch startLatch = new CountDownLatch(1); - - List threads = new ArrayList<>(); - for (int i = 0; i < numberOfThreads; ++i) { - threads.add(new Thread(new ExecutionRunner(watchService(), executionService(), "_id", startLatch))); - } - - for (Thread thread : threads) { - thread.start(); - } - DeleteWatchResponse deleteWatchResponse = watcherClient().prepareDeleteWatch("_id").setForce(true).get(); - assertThat(deleteWatchResponse.isFound(), is(true)); - - deleteWatchResponse = watcherClient().prepareDeleteWatch("_id").get(); - assertThat(deleteWatchResponse.isFound(), is(false)); - - startLatch.countDown(); - - long startJoin = System.currentTimeMillis(); - for (Thread thread : threads) { - thread.join(); - } - long endJoin = System.currentTimeMillis(); - TimeValue tv = new TimeValue(10 * (numberOfThreads+1), TimeUnit.SECONDS); - assertThat("Shouldn't take longer than [" + tv.getSeconds() + "] seconds for all the threads to stop", (endJoin - startJoin), lessThan(tv.getMillis())); - } - - private static class ExecutionRunner implements Runnable { + public static class ExecutionRunner implements Runnable { final WatcherService watcherService; final ExecutionService executionService; @@ -366,7 +308,7 @@ public class ManualExecutionTests extends AbstractWatcherIntegrationTestCase { final CountDownLatch startLatch; final ManualExecutionContext.Builder ctxBuilder; - private ExecutionRunner(WatcherService watcherService, ExecutionService executionService, String watchId, CountDownLatch startLatch) { + public ExecutionRunner(WatcherService watcherService, ExecutionService executionService, String watchId, CountDownLatch startLatch) { this.watcherService = watcherService; this.executionService = executionService; this.watchId = watchId;