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);
-    }
-
 }


Reply via email to