/*

   Derby - Class org.apache.derbyTesting.functionTests.tests.lang.LuceneSuite

       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.derbyTesting.functionTests.tests.lang;

import java.util.Properties;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.TestConfiguration;

/**
 * Suite holding all of the tests for the Lucene plugin.
 *
 */
public class LuceneSuite extends BaseTestCase
{

	/**
	 * Use suite method instead.
	 */
	private LuceneSuite(String name) { super(name); }

	public static Test suite()
    {
        BaseTestSuite suite = new BaseTestSuite("LuceneSuite");
        Properties  properties = TestConfiguration.getSystemProperties();
        
        //
        // If we're told to omit the Lucene plugin tests, make sure
        // that the Lucene jar files aren't on the classpath.
        //
        if ( getBooleanProperty( properties, TestConfiguration.KEY_OMIT_LUCENE ) )
        {
            assertFalse( "Lucene core jar file should not be on the classpath!", JDBC.HAVE_LUCENE_CORE );
            assertFalse( "Lucene analyzer jar file should not be on the classpath!", JDBC.HAVE_LUCENE_ANALYZERS );
            assertFalse( "Lucene query parser jar file should not be on the classpath!", JDBC.HAVE_LUCENE_QUERYPARSER );
        }
        else if (JDBC.HAVE_LUCENE_CORE && suffersFromDerby6650())
        {
            alarm("Lucene tests are skipped on this platform because of "
                    + "DERBY-6650. Please upgrade to Lucene 4.8 or higher "
                    + "if you would like to run them.");
        }
        else
        {
            suite.addTest(LuceneSupportTest.suite());
            suite.addTest(LuceneSupportPermsTest.suite());
            suite.addTest(LuceneCollationTest.suite());
            suite.addTest(LuceneCoarseAuthorizationTest.suite());
            suite.addTest(LuceneInMemoryTest.suite());
            suite.addTest(LuceneBackupTest.suite());
            suite.addTest(LuceneJarLoadingTest.suite());
        }

        return suite;
	}

    /** Return the boolean value of a system property */
    private static  boolean getBooleanProperty( Properties properties, String key )
    {
        return Boolean.valueOf( properties.getProperty( key ) ).booleanValue();
    }

    /**
     * With Lucene versions up to 4.7, the Lucene plugin doesn't work on
     * platforms without JMX (in particular: Java SE 8 Compact Profile 2).
     * See DERBY-6650.
     */
    private static boolean suffersFromDerby6650() {
        if (JDBC.vmSupportsJMX()) {
            // Only platforms that lack JMX support have this problem.
            return false;
        }

        Class versionClass = null;
        try {
            versionClass = Class.forName("org.apache.lucene.util.Version");
        } catch (ClassNotFoundException cnfe) {
            fail("Could not check Lucene version", cnfe);
        }

        // Check if the version is at least 4.8. Do that by looking for the
        // existence of the LUCENE_48 field in the Version class. In 4.9
        // that field was deprecated and one called LUCENE_4_8 was added.
        // If we cannot find the former, look for the latter before giving up.
        try {
            versionClass.getField("LUCENE_48");
        } catch (NoSuchFieldException nsfe1) {
            try {
                versionClass.getField("LUCENE_4_8");
            } catch (NoSuchFieldException nsfe2) {
                // Neither the LUCENE_48 field nor the LUCENE_4_8 field is
                // present, so version is lower than 4.8. We suffer from
                // DERBY-6650.
                return true;
            }
        }

        // One of the fields indicating version 4.8 or higher was found,
        // so we don't suffer from DERBY-6650.
        return false;
    }
}
