| /******************************************************************************* |
| * Copyright (c) 2011, 2019 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Alexander Kurtakov - Bug 460787 |
| *******************************************************************************/ |
| |
| package org.eclipse.ua.tests.help.search; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| |
| import org.apache.lucene.index.CorruptIndexException; |
| import org.apache.lucene.index.DirectoryReader; |
| import org.apache.lucene.index.IndexFormatTooOldException; |
| import org.apache.lucene.search.IndexSearcher; |
| import org.apache.lucene.search.Query; |
| import org.apache.lucene.search.TopDocs; |
| import org.apache.lucene.store.Directory; |
| import org.apache.lucene.store.NIOFSDirectory; |
| import org.eclipse.core.runtime.FileLocator; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.help.internal.base.BaseHelpSystem; |
| import org.eclipse.help.internal.search.AnalyzerDescriptor; |
| import org.eclipse.help.internal.search.PluginIndex; |
| import org.eclipse.help.internal.search.QueryBuilder; |
| import org.eclipse.help.internal.search.SearchIndexWithIndexingProgress; |
| import org.eclipse.ua.tests.plugin.UserAssistanceTestPlugin; |
| import org.junit.Test; |
| import org.osgi.framework.Bundle; |
| |
| /** |
| * Verify that older versions of the index can be read by this |
| * version of Eclipse. |
| * |
| * How to maintain this test - if when upgrading to a new version |
| * of Lucene one of the IndexReadable tests fails you need to |
| * make the following changes: |
| * 1. Change the corresponding Compatible() test to expect a result of false |
| * 2. Comment out the failing test |
| * 3. Change the help system to recognize that version of Lucene as being incompatible |
| */ |
| |
| public class PrebuiltIndexCompatibility { |
| |
| /** |
| * Test index built with Lucene 1.9.1 |
| */ |
| @Test(expected = IndexFormatTooOldException.class) |
| public void test1_9_1_IndexUnReadable() throws Exception { |
| checkReadable("data/help/searchindex/index191"); |
| } |
| |
| /** |
| * Test index built with Lucene 2.9.1 |
| */ |
| @Test(expected = IndexFormatTooOldException.class) |
| public void test2_9_1_IndexUnReadable() throws Exception { |
| checkReadable("data/help/searchindex/index291"); |
| } |
| |
| /** |
| * Test index built with Lucene 3.5.0 |
| */ |
| @Test(expected = IndexFormatTooOldException.class) |
| public void test3_5_0_IndexUnReadable() throws Exception { |
| checkReadable("data/help/searchindex/index350"); |
| } |
| |
| /** |
| * Test index built with Lucene 6.1.0 |
| */ |
| @Test(expected = IndexFormatTooOldException.class) |
| public void test6_1_0_IndexUnReadable() throws Exception { |
| checkReadable("data/help/searchindex/index610"); |
| } |
| |
| /** |
| * Test index built with Lucene 7.0.0 |
| */ |
| @Test(expected = IndexFormatTooOldException.class) |
| public void test7_0_0_IndexUnReadable() throws Exception { |
| checkReadable("data/help/searchindex/index700"); |
| } |
| |
| /** |
| * Test index built with Lucene 8.0.0 |
| */ |
| @Test |
| public void test8_0_0_IndexReadable() throws Exception { |
| checkReadable("data/help/searchindex/index800"); |
| } |
| |
| /** |
| ** Test compatibility of Lucene 1.9.1 index with current Lucene |
| */ |
| @Test |
| public void test1_9_1Compatible() |
| { |
| checkCompatible("data/help/searchindex/index191", false); |
| } |
| |
| /** |
| ** Test compatibility of Lucene 2.9.1 index with current Lucene |
| */ |
| @Test |
| public void test2_9_1Compatible() |
| { |
| checkCompatible("data/help/searchindex/index291", false); |
| } |
| |
| /** |
| ** Test compatibility of Lucene 3.5.0 index with current Lucene |
| */ |
| @Test |
| public void test3_5_0Compatible() { |
| checkCompatible("data/help/searchindex/index350", false); |
| } |
| |
| /** |
| ** Test compatibility of Lucene 6.1.0 index with current Lucene |
| */ |
| @Test |
| public void test6_1_0Compatible() { |
| checkCompatible("data/help/searchindex/index610", false); |
| } |
| |
| /** |
| ** Test compatibility of Lucene 7.0.0 index with current Lucene |
| */ |
| @Test |
| public void test7_0_0Compatible() { |
| checkCompatible("data/help/searchindex/index700", false); |
| } |
| |
| @Test |
| public void test1_9_1LuceneCompatible() |
| { |
| checkLuceneCompatible("1.9.1", false); |
| } |
| |
| @Test |
| public void test1_4_103NotLuceneCompatible() |
| { |
| checkLuceneCompatible("1.4.103", false); |
| } |
| |
| @Test |
| public void test2_9_1LuceneCompatible() |
| { |
| checkLuceneCompatible("2.9.1", false); |
| } |
| |
| @Test |
| public void test3_5_0LuceneCompatible() { |
| checkLuceneCompatible("3.5.0", false); |
| } |
| |
| @Test |
| public void test6_1_0LuceneCompatible() { |
| checkLuceneCompatible("6.1.0", false); |
| } |
| |
| @Test |
| public void test7_0_0LuceneCompatible() { |
| checkLuceneCompatible("7.0.0", false); |
| } |
| |
| @Test |
| public void test8_0_0LuceneCompatible() { |
| checkLuceneCompatible("8.0.0", true); |
| } |
| |
| @Test |
| public void testPluginIndexEqualToItself() { |
| PluginIndex index = createPluginIndex("data/help/searchindex/index610"); |
| assertTrue(index.equals(index)); |
| } |
| |
| /** |
| * Verify that if the paths and plugins are the same two PluginIndex objects are equal |
| */ |
| @Test |
| public void testPluginIndexEquality() { |
| PluginIndex index1a = createPluginIndex("data/help/searchindex/index610"); |
| PluginIndex index1b = createPluginIndex("data/help/searchindex/index610"); |
| assertTrue(index1a.equals(index1b)); |
| } |
| |
| /** |
| * Verify that if the paths and plugins are the same two PluginIndex objects are equal |
| */ |
| @Test |
| public void testPluginIndexHash() { |
| PluginIndex index1a = createPluginIndex("data/help/searchindex/index610"); |
| PluginIndex index1b = createPluginIndex("data/help/searchindex/index610"); |
| assertEquals(index1a.hashCode(), index1b.hashCode()); |
| } |
| |
| /** |
| * Verify that if the paths are different two PluginIndex objects are not equal |
| */ |
| @Test |
| public void testPluginIndexInequality() { |
| PluginIndex index1 = createPluginIndex("data/help/searchindex/index610"); |
| PluginIndex index2 = createPluginIndex("data/help/searchindex/index350"); |
| assertFalse(index1.equals(index2)); |
| } |
| |
| /* |
| * Verifies that a prebuilt index can be searched |
| */ |
| private void checkReadable(String indexPath) throws IOException, |
| CorruptIndexException { |
| Path path = new Path(indexPath); |
| Bundle bundle = UserAssistanceTestPlugin.getDefault().getBundle(); |
| URL url = FileLocator.find(bundle, path, null); |
| URL resolved = FileLocator.resolve(url); |
| if ("file".equals(resolved.getProtocol())) { //$NON-NLS-1$ |
| String filePath = resolved.getFile(); |
| QueryBuilder queryBuilder = new QueryBuilder("eclipse", new AnalyzerDescriptor("en-us")); |
| Query luceneQuery = queryBuilder.getLuceneQuery(new ArrayList<String>() , false); |
| IndexSearcher searcher; |
| try (Directory luceneDirectory = new NIOFSDirectory(new File(filePath).toPath())) { |
| searcher = new IndexSearcher(DirectoryReader.open(luceneDirectory)); |
| TopDocs hits = searcher.search(luceneQuery, 500); |
| assertTrue(hits.totalHits.value >= 1); |
| } |
| } else { |
| fail("Cannot resolve to file protocol"); |
| } |
| } |
| |
| /* |
| * Tests the isCompatible method in PluginIndex |
| */ |
| private void checkCompatible(String versionDirectory, boolean expected) { |
| PluginIndex pluginIndex = createPluginIndex(versionDirectory); |
| Path path = new Path(versionDirectory); |
| assertEquals(expected, pluginIndex.isCompatible(UserAssistanceTestPlugin.getDefault().getBundle(), path)); |
| } |
| |
| public PluginIndex createPluginIndex(String versionDirectory) { |
| PluginIndex pluginIndex; |
| SearchIndexWithIndexingProgress index = BaseHelpSystem.getLocalSearchManager().getIndex("en_us".toString()); |
| BaseHelpSystem.getLocalSearchManager().ensureIndexUpdated( |
| new NullProgressMonitor(), |
| index); |
| pluginIndex = new PluginIndex("org.eclipse.ua.tests", "data/help/searchindex/" + versionDirectory, index); |
| return pluginIndex; |
| } |
| |
| /* |
| * Tests the isLuceneCompatible method in SearchIndex |
| */ |
| private void checkLuceneCompatible(String version, boolean expected) { |
| SearchIndexWithIndexingProgress index = BaseHelpSystem.getLocalSearchManager().getIndex("en_us".toString()); |
| BaseHelpSystem.getLocalSearchManager().ensureIndexUpdated( |
| new NullProgressMonitor(), |
| index); |
| assertEquals(expected, index.isLuceneCompatible(version)); |
| } |
| } |