/*******************************************************************************
 * Copyright (c) 2011, 2016 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * 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
	public void test6_1_0_IndexReadable() throws Exception {
		checkReadable("data/help/searchindex/index610");
	}

	/**
	 ** 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", true);
	}

	@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", 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 >= 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));
	}

}
