blob: 01323cc4baf27a5c64853ab1ef57966807f89821 [file] [log] [blame]
/*******************************************************************************
* 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));
}
}