You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ng...@apache.org on 2020/04/24 07:36:05 UTC

svn commit: r1876917 - in /jackrabbit/oak/trunk/oak-search-elastic/src: main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/

Author: ngupta
Date: Fri Apr 24 07:36:04 2020
New Revision: 1876917

URL: http://svn.apache.org/viewvc?rev=1876917&view=rev
Log:
OAK-9014 | Refactor Oak-Search-Elastic tests to make them more modularized

Added:
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java   (with props)
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java   (with props)
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java
    jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java Fri Apr 24 07:36:04 2020
@@ -230,7 +230,7 @@ public class ElasticsearchConnection imp
             }
 
             @Override
-            public BuildStep withApiKeys(@NotNull String id, @NotNull String secret) {
+            public BuildStep withApiKeys(String id, String secret) {
                 this.apiKeyId = id;
                 this.apiKeySecret = secret;
                 return this;

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticIndexAggregationNtFileTest.java Fri Apr 24 07:36:04 2020
@@ -67,49 +67,21 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static org.apache.jackrabbit.JcrConstants.NT_FILE;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
 import static org.apache.jackrabbit.oak.plugins.memory.BinaryPropertyState.binaryProperty;
 import static org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeNotNull;
 
-public class ElasticIndexAggregationNtFileTest extends AbstractQueryTest {
-    private static final Logger LOG = LoggerFactory.getLogger(ElasticIndexAggregationNtFileTest.class);
+public class ElasticIndexAggregationNtFileTest extends ElasticsearchAbstractQueryTest {
     private static final String NT_TEST_ASSET = "test:Asset";
 
-    @Rule
-    public final ElasticsearchContainer elastic =
-            new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
-
-    @BeforeClass
-    public static void beforeMethod() {
-        DockerClient client = null;
-        try {
-            client = DockerClientFactory.instance().client();
-        } catch (Exception e) {
-            LOG.warn("Docker is not available, ElasticsearchPropertyIndexTest will be skipped");
-        }
-        assumeNotNull(client);
-    }
-
     @Override
-    protected ContentRepository createRepository() {
-        ElasticsearchConnection connection = ElasticsearchConnection.newBuilder()
-                .withIndexPrefix("" + System.nanoTime())
-                .withConnectionParameters(
-                        ElasticsearchConnection.DEFAULT_SCHEME,
-                        elastic.getContainerIpAddress(),
-                        elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT)
-                ).build();
-
-        ElasticsearchIndexEditorProvider editorProvider = new ElasticsearchIndexEditorProvider(connection,
-                new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
-        ElasticsearchIndexProvider provider = new ElasticsearchIndexProvider(connection);
-
-        return new Oak()
-                .with(new InitialContent() {
+    protected InitialContent getInitialContent() {
+        return new InitialContent() {
 
-                    @Override
-                    public void initialize(@NotNull NodeBuilder builder) {
+            @Override
+            public void initialize(@NotNull NodeBuilder builder) {
                         super.initialize(builder);
                         // registering additional node types for wider testing
                         InputStream stream = null;
@@ -137,14 +109,10 @@ public class ElasticIndexAggregationNtFi
                                     LOG.debug("Ignoring exception on stream closing.", e);
                                 }
                             }
-                        }
-                    }
+                }
+            }
 
-                })
-                .with(new OpenSecurityProvider())
-                .with(editorProvider)
-                .with(provider)
-                .createContentRepository();
+        };
     }
 
     /**
@@ -195,7 +163,11 @@ public class ElasticIndexAggregationNtFi
                 "the quick brown fox jumps over the lazy dog."));
         root.commit();
         expected.add("/content/asset");
-        Thread.sleep(5000);
-        assertQuery(statement, "xpath", expected);
+
+        assertEventually(()-> {
+            assertQuery(statement, "xpath", expected);
+        });
+
+
     }
 }

Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.elasticsearch;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.InitialContent;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.commons.PerfLogger;
+import org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate;
+import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.TrackingCorruptIndexHandler;
+import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.index.ElasticsearchIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.query.ElasticsearchIndexProvider;
+import org.apache.jackrabbit.oak.plugins.index.elasticsearch.util.ElasticsearchIndexDefinitionBuilder;
+import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
+import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
+import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
+import org.apache.jackrabbit.oak.query.AbstractQueryTest;
+import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.jetbrains.annotations.NotNull;
+import org.junit.After;
+import org.junit.ClassRule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider.compose;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.elasticsearch.ElasticsearchIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT;
+
+public abstract class ElasticsearchAbstractQueryTest extends AbstractQueryTest {
+
+    protected static final Logger LOG = LoggerFactory.getLogger(ElasticsearchAbstractQueryTest.class);
+
+    protected static final PerfLogger PERF_LOGGER =
+            new PerfLogger(LoggerFactory.getLogger(ElasticsearchAbstractQueryTest.class.getName() + ".perf"));
+
+
+    // Set this connection string as
+    // <scheme>://<hostname>:<port>?key_id=<>,key_secret=<>
+    // key_id and key_secret are optional in case the ES server
+    // needs authentication
+    // Do not set this if docker is running and you want to run the tests on docker instead.
+    private static final String elasticConnectionString = System.getProperty("elasticConnectionString");
+    private ElasticsearchConnection esConnection;
+
+    // This is instantiated during repo creation but not hooked up to the async indexing lane
+    // This can be used by the extending classes to trigger the async index update as per need (not having to wait for async indexing cycle)
+    protected AsyncIndexUpdate asyncIndexUpdate;
+    protected long INDEX_CORRUPT_INTERVAL_IN_MILLIS = 100;
+    protected ElasticsearchIndexEditorProvider editorProvider;
+    protected NodeStore nodeStore;
+    protected int DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS = 5;
+
+
+    @ClassRule
+    public static ElasticsearchConnectionRule elasticRule = new ElasticsearchConnectionRule(elasticConnectionString);
+
+    /*
+    Close the ES connection after every test method execution
+     */
+    @After
+    public void cleanup() throws IOException {
+        elasticRule.closeElasticSearchConnection();
+    }
+
+    // Override this in extending test class to provide different ExtractedTextCache if needed
+    protected ElasticsearchIndexEditorProvider getElasticIndexEditorProvider(ElasticsearchConnection esConnection) {
+        return new ElasticsearchIndexEditorProvider(esConnection,
+                new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
+    }
+
+    protected AsyncIndexUpdate getAsyncIndexUpdate(String asyncName, NodeStore store, IndexEditorProvider editorProvider) {
+        return new AsyncIndexUpdate(asyncName, store, editorProvider);
+    }
+
+    /*
+    Override this to create some other repo initializer if needed
+    // Make sure to call super.initialize(builder)
+     */
+    protected InitialContent getInitialContent() {
+        return new InitialContent() {
+            @Override
+            public void initialize(@NotNull NodeBuilder builder) {
+                super.initialize(builder);
+                // remove all indexes to avoid cost competition (essentially a TODO for fixing cost ES cost estimation)
+                NodeBuilder oiBuilder = builder.child(INDEX_DEFINITIONS_NAME);
+                oiBuilder.getChildNodeNames().forEach(idxName -> oiBuilder.child(idxName).remove());
+            }
+        };
+    }
+
+    // Override this to provide a different flavour of node store
+    // like segment or mongo mk
+    // Tests would need to handle the cleanup accordingly.
+    // TODO provide a util here so that test classes simply need to mention the type of store they want to create
+    // for now, memory store should suffice.
+    protected NodeStore getNodeStore() {
+        if (nodeStore == null) {
+            nodeStore = new MemoryNodeStore();
+        }
+        return nodeStore;
+    }
+
+    protected boolean useAsyncIndexing() {
+        return false;
+    }
+
+    protected Oak addAsyncIndexingLanesToOak(Oak oak) {
+        // Override this in extending clases to configure different
+        // indexing lanes with different time limits.
+        return oak.withAsyncIndexing("async", DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS);
+    }
+
+
+    @Override
+    protected ContentRepository createRepository() {
+
+        esConnection = elasticRule.useDocker() ? elasticRule.getElasticSearchConnectionForDocker() :
+                elasticRule.getElasticsearchConnectionFromString();
+        ElasticsearchIndexEditorProvider editorProvider = getElasticIndexEditorProvider(esConnection);
+        ElasticsearchIndexProvider indexProvider = new ElasticsearchIndexProvider(esConnection);
+
+        nodeStore = getNodeStore();
+
+        asyncIndexUpdate = getAsyncIndexUpdate("async", nodeStore, compose(newArrayList(
+                editorProvider,
+                new NodeCounterEditorProvider()
+        )));
+
+        TrackingCorruptIndexHandler trackingCorruptIndexHandler = new TrackingCorruptIndexHandler();
+        trackingCorruptIndexHandler.setCorruptInterval(INDEX_CORRUPT_INTERVAL_IN_MILLIS, TimeUnit.MILLISECONDS);
+        asyncIndexUpdate.setCorruptIndexHandler(trackingCorruptIndexHandler);
+
+
+        Oak oak = new Oak(nodeStore)
+                .with(getInitialContent())
+                .with(new OpenSecurityProvider())
+                .with(editorProvider)
+                .with(indexProvider)
+                .with(new PropertyIndexEditorProvider())
+                .with(new NodeTypeIndexProvider());
+
+        if (useAsyncIndexing()) {
+            oak = addAsyncIndexingLanesToOak(oak);
+        }
+        return oak.createContentRepository();
+    }
+
+
+    protected static void assertEventually(Runnable r) {
+        ElasticsearchTestUtils.assertEventually(r, BULK_FLUSH_INTERVAL_MS_DEFAULT * 5);
+    }
+
+    protected IndexDefinitionBuilder createIndex(String... propNames) {
+        IndexDefinitionBuilder builder = new ElasticsearchIndexDefinitionBuilder();
+        if (!useAsyncIndexing()) {
+            builder = builder.noAsync();
+        }
+        IndexDefinitionBuilder.IndexRule indexRule = builder.indexRule("nt:base");
+        for (String propName : propNames) {
+            indexRule.property(propName).propertyIndex();
+        }
+        return builder;
+    }
+
+    protected void setIndex(String idxName, IndexDefinitionBuilder builder) {
+        builder.build(root.getTree("/").addChild(INDEX_DEFINITIONS_NAME).addChild(idxName));
+    }
+
+    protected String explain(String query) {
+        return explain(query, SQL2);
+    }
+
+    protected String explain(String query, String language) {
+        String explain = "explain " + query;
+        return executeQuery(explain, language).get(0);
+    }
+
+    @Override
+    protected void createTestIndexNode() throws Exception {
+        setTraversalEnabled(false);
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchAbstractQueryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.elasticsearch;
+
+
+import com.github.dockerjava.api.DockerClient;
+import org.elasticsearch.Version;
+import org.junit.rules.ExternalResource;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.DockerClientFactory;
+import org.testcontainers.elasticsearch.ElasticsearchContainer;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import static org.junit.Assume.assumeNotNull;
+
+/*
+To be used as a @ClassRule
+ */
+public class ElasticsearchConnectionRule extends ExternalResource {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchConnectionRule.class);
+    private ElasticsearchConnection elasticSearchConnection;
+    private final String elasticSearchConnectionString;
+    private static final String INDEX_PREFIX = "ElasticTest_";
+    private static boolean useDocker = false;
+
+    public ElasticsearchConnectionRule(String elasticSearchConnectionString) {
+        this.elasticSearchConnectionString = elasticSearchConnectionString;
+    }
+
+    public ElasticsearchContainer elastic;
+
+    /*
+    Executed once in the test class' execution lifecycle, after the execution of apply()
+     */
+    @Override
+    protected void before() {
+        if (useDocker()) {
+            elasticSearchConnection = getElasticSearchConnectionForDocker();
+        }
+    }
+
+    /*
+    This is the first method to be executed. It gets executed exactly once at the beginning of the test class execution.
+     */
+    @Override
+    public Statement apply(Statement base, Description description) {
+        Statement s = super.apply(base, description);
+        // see if docker is to be used or not... initialize docker rule only if that's the case.
+
+        if (elasticSearchConnectionString == null || getElasticsearchConnectionFromString() == null) {
+            checkIfDockerClientAvailable();
+            elastic = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
+            s = elastic.apply(s, description);
+            setUseDocker(true);
+        }
+        return s;
+    }
+
+    @Override
+    protected void after() {
+        //TODO: See if something needs to be cleaned up at test class level ??
+    }
+
+    public ElasticsearchConnection getElasticsearchConnectionFromString() {
+        if (elasticSearchConnection == null) {
+            try {
+                URI uri = new URI(elasticSearchConnectionString);
+                String host = uri.getHost();
+                String scheme = uri.getScheme();
+                int port = uri.getPort();
+                String query = uri.getQuery();
+
+                String api_key = null;
+                String api_secret = null;
+                if (query != null) {
+                    api_key = query.split(",")[0].split("=")[1];
+                    api_secret = query.split(",")[1].split("=")[1];
+                }
+                elasticSearchConnection = ElasticsearchConnection.newBuilder()
+                        .withIndexPrefix(INDEX_PREFIX + System.currentTimeMillis())
+                        .withConnectionParameters(scheme, host, port)
+                        .withApiKeys(api_key, api_secret)
+                        .build();
+            } catch (URISyntaxException e) {
+                return null;
+            }
+        }
+        return elasticSearchConnection;
+    }
+
+    public ElasticsearchConnection getElasticSearchConnectionForDocker() {
+        if (elasticSearchConnection == null) {
+            elasticSearchConnection = ElasticsearchConnection.newBuilder()
+                    .withIndexPrefix(INDEX_PREFIX + System.currentTimeMillis())
+                    .withConnectionParameters(ElasticsearchConnection.DEFAULT_SCHEME,
+                            elastic.getContainerIpAddress(),
+                            elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT))
+                    .withApiKeys(null, null)
+                    .build();
+        }
+        return elasticSearchConnection;
+    }
+
+    public void closeElasticSearchConnection() throws IOException {
+        if (elasticSearchConnection != null) {
+            elasticSearchConnection.close();
+            // Make this object null otherwise tests after the first test would
+            // receive an client that is closed.
+            elasticSearchConnection = null;
+        }
+    }
+
+
+    private void checkIfDockerClientAvailable() {
+        DockerClient client = null;
+        try {
+            client = DockerClientFactory.instance().client();
+        } catch (Exception e) {
+            LOG.warn("Docker is not available and elasticConnectionDetails sys prop not specified or incorrect" +
+                    ", Elastic tests will be skipped");
+        }
+        assumeNotNull(client);
+    }
+
+    private void setUseDocker(boolean useDocker) {
+        this.useDocker = useDocker;
+    }
+
+    public boolean useDocker() {
+        return useDocker;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnectionRule.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java?rev=1876917&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java (added)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java Fri Apr 24 07:36:04 2020
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index.elasticsearch;
+
+
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ElasticsearchFullTextAsyncTest extends ElasticsearchAbstractQueryTest {
+
+    @Override
+    protected boolean useAsyncIndexing() {
+        return true;
+    }
+
+    @Test
+    public void testFullTextQuery() throws Exception {
+        IndexDefinitionBuilder builder = createIndex("propa");
+        builder.async("async");
+        builder.indexRule("nt:base").property("propa").analyzed();
+
+        setIndex("test1", builder);
+        root.commit();
+
+        //add content
+        Tree test = root.getTree("/").addChild("test");
+
+        test.addChild("a").setProperty("propa", "Hello World!");
+        test.addChild("c").setProperty("propa", "Hello everyone. This is an elastic test");
+        test.addChild("b").setProperty("propa", "Simple test");
+        root.commit();
+		// Wait for DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS
+		// This is needed in addition to assertEventually to make the 
+		// test reliable, otherwise they seem to fail sometimes even
+		// with assertEventually wait in place, due to minor delay in async 
+		// cycle exec.
+        Thread.sleep(DEFAULT_ASYNC_INDEXING_TIME_IN_SECONDS * 1000);
+		
+        String query = "//*[jcr:contains(@propa, 'Hello')] ";
+
+        assertEventually(() -> {
+            assertThat(explain(query, XPATH), containsString("elasticsearch:test1"));
+            assertQuery(query, XPATH, Arrays.asList("/test/a", "/test/c"));
+        });
+
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchFullTextAsyncTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java?rev=1876917&r1=1876916&r2=1876917&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java Fri Apr 24 07:36:04 2020
@@ -16,95 +16,20 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.elasticsearch;
 
-import com.github.dockerjava.api.DockerClient;
-import org.apache.commons.io.FileUtils;
-import org.apache.jackrabbit.oak.InitialContentHelper;
-import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.index.ElasticsearchIndexEditorProvider;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.query.ElasticsearchIndexProvider;
-import org.apache.jackrabbit.oak.plugins.index.elasticsearch.util.ElasticsearchIndexDefinitionBuilder;
-import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
-import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
-import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
 import org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
-import org.apache.jackrabbit.oak.query.AbstractQueryTest;
-import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
-import org.elasticsearch.Version;
-import org.junit.BeforeClass;
-import org.junit.Rule;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.elasticsearch.ElasticsearchContainer;
 
 import java.util.Arrays;
 
 import static java.util.Collections.singletonList;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
-import static org.apache.jackrabbit.oak.plugins.index.elasticsearch.ElasticsearchIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT;
 import static org.apache.jackrabbit.oak.plugins.index.search.FulltextIndexConstants.PROPDEF_PROP_NODE_NAME;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assume.assumeNotNull;
 
-public class ElasticsearchPropertyIndexTest extends AbstractQueryTest {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchPropertyIndexTest.class);
-
-    @Rule
-    public final ElasticsearchContainer elastic =
-            new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + Version.CURRENT);
-
-    @BeforeClass
-    public static void beforeMethod() {
-        DockerClient client = null;
-        try {
-            client = DockerClientFactory.instance().client();
-        } catch (Exception e) {
-            LOG.warn("Docker is not available, ElasticsearchPropertyIndexTest will be skipped");
-        }
-        assumeNotNull(client);
-    }
-
-    @Override
-    protected ContentRepository createRepository() {
-        ElasticsearchConnection connection = ElasticsearchConnection.newBuilder()
-                .withIndexPrefix("" + System.nanoTime())
-                .withConnectionParameters(
-                        ElasticsearchConnection.DEFAULT_SCHEME,
-                        elastic.getContainerIpAddress(),
-                        elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT)
-                ).build();
-        ElasticsearchIndexEditorProvider editorProvider = new ElasticsearchIndexEditorProvider(connection,
-                new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
-        ElasticsearchIndexProvider indexProvider = new ElasticsearchIndexProvider(connection);
-
-        // remove all indexes to avoid cost competition (essentially a TODO for fixing cost ES cost estimation)
-        NodeBuilder builder = InitialContentHelper.INITIAL_CONTENT.builder();
-        NodeBuilder oiBuilder = builder.child(INDEX_DEFINITIONS_NAME);
-        oiBuilder.getChildNodeNames().forEach(idxName -> oiBuilder.child(idxName).remove());
-
-        NodeStore nodeStore = new MemoryNodeStore(builder.getNodeState());
-
-        return new Oak(nodeStore)
-                .with(new OpenSecurityProvider())
-                .with(editorProvider)
-                .with(indexProvider)
-                .with(new PropertyIndexEditorProvider())
-                .with(new NodeTypeIndexProvider())
-                .createContentRepository();
-    }
-
-    @Override
-    protected void createTestIndexNode() {
-        setTraversalEnabled(false);
-    }
+public class ElasticsearchPropertyIndexTest extends ElasticsearchAbstractQueryTest {
 
     @Test
     public void testBulkProcessorFlushLimit() throws Exception {
@@ -232,26 +157,4 @@ public class ElasticsearchPropertyIndexT
                 Arrays.asList("/test/a", "/test/b")));
     }
 
-    private static IndexDefinitionBuilder createIndex(String... propNames) {
-        IndexDefinitionBuilder builder = new ElasticsearchIndexDefinitionBuilder().noAsync();
-        IndexDefinitionBuilder.IndexRule indexRule = builder.indexRule("nt:base");
-        for (String propName : propNames) {
-            indexRule.property(propName).propertyIndex();
-        }
-        return builder;
-    }
-
-    private void setIndex(String idxName, IndexDefinitionBuilder builder) {
-        builder.build(root.getTree("/").addChild(INDEX_DEFINITIONS_NAME).addChild(idxName));
-    }
-
-    private String explain(String query) {
-        String explain = "explain " + query;
-        return executeQuery(explain, "JCR-SQL2").get(0);
-    }
-
-    private static void assertEventually(Runnable r) {
-        ElasticsearchTestUtils.assertEventually(r, BULK_FLUSH_INTERVAL_MS_DEFAULT * 3);
-    }
-
 }