/**
 * 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.oozie.service;

import org.apache.hadoop.conf.Configuration;
import org.apache.oozie.action.hadoop.CredentialsProviderFactory;
import org.apache.oozie.action.hadoop.DistcpActionExecutor;
import org.apache.oozie.action.hadoop.LauncherAMUtils;
import org.apache.oozie.command.coord.CoordActionInputCheckXCommand;
import org.apache.oozie.command.coord.CoordSubmitXCommand;
import org.apache.oozie.command.wf.JobXCommand;
import org.apache.oozie.compression.CodecFactory;
import org.apache.oozie.event.listener.ZKConnectionListener;
import org.apache.oozie.executor.jpa.CoordActionGetForInfoJPAExecutor;
import static org.apache.oozie.service.ConfigurationService.HADOOP_SECURITY_CREDENTIAL_PROVIDER_PATH;
import org.apache.oozie.servlet.AuthFilter;
import org.apache.oozie.servlet.V1JobServlet;
import org.apache.oozie.sla.service.SLAService;
import org.apache.oozie.test.XTestCase;
import org.apache.oozie.util.ConfigUtils;
import org.apache.oozie.util.IOUtils;
import org.apache.oozie.util.XLogFilter;
import org.apache.oozie.util.XLogStreamer;
import org.apache.oozie.workflow.lite.LiteWorkflowAppParser;
import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileOutputStream;

public class TestConfigurationService extends XTestCase {

    Services services;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        services = new Services();
        services.init();
    }

    @Override
    protected void tearDown() throws Exception {
        services.destroy();
        super.tearDown();
    }

    private void prepareOozieConfDir(String oozieSite) throws Exception {
        prepareOozieConfDir(oozieSite, ConfigurationService.SITE_CONFIG_FILE);
    }

    private void prepareOozieConfDir(String oozieSite, String alternateSiteFile) throws Exception {
        if (!alternateSiteFile.equals(ConfigurationService.SITE_CONFIG_FILE)) {
            setSystemProperty(ConfigurationService.OOZIE_CONFIG_FILE, alternateSiteFile);
        }
        File siteFile = new File(getTestCaseConfDir(), alternateSiteFile);
        IOUtils.copyStream(IOUtils.getResourceAsStream(oozieSite, -1),
                           new FileOutputStream(siteFile));
    }

    public void testValueFromDefault() throws Exception {
        prepareOozieConfDir("oozie-site1.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("oozie-" + System.getProperty("user.name"), cl.getConf().get("oozie.system.id"));
        assertNull(cl.getConf().get("oozie.dummy"));
        cl.destroy();
    }

    public void testMissingSite() throws Exception {
        prepareOozieConfDir("oozie-site2.xml");
        setSystemProperty(ConfigurationService.OOZIE_CONFIG_FILE, "oozie-site-missing.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("oozie-" + System.getProperty("user.name"), cl.getConf().get("oozie.system.id"));
        assertNull(cl.getConf().get("oozie.dummy"));
        cl.destroy();
    }

    public void testValueFromSite() throws Exception {
        prepareOozieConfDir("oozie-site2.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("SITE1", cl.getConf().get("oozie.system.id"));
        assertEquals("SITE2", cl.getConf().get("oozie.dummy"));
        cl.destroy();
    }

    public void testValueFromSiteAlternate() throws Exception {
        prepareOozieConfDir("oozie-sitealternate.xml", "oozie-alternate.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("ALTERNATE1", cl.getConf().get("oozie.system.id"));
        assertEquals("ALTERNATE2", cl.getConf().get("oozie.dummy"));
        cl.destroy();
    }

    public void testSysPropOverride() throws Exception {
        prepareOozieConfDir("oozie-site2.xml");
        setSystemProperty("oozie.dummy", "OVERRIDE");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("OVERRIDE", cl.getConf().get("oozie.dummy"));
        cl.destroy();
    }

    public void testAlternateConfDir() throws Exception {
        String customConfDir = createTestCaseSubDir("xconf");
        setSystemProperty(ConfigurationService.OOZIE_CONFIG_DIR, customConfDir);

        IOUtils.copyStream(IOUtils.getResourceAsStream("oozie-site1.xml", -1),
                           new FileOutputStream(new File(customConfDir, "oozie-site.xml")));

        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("oozie-" + System.getProperty("user.name"), cl.getConf().get("oozie.system.id"));
        assertNull(cl.getConf().get("oozie.dummy"));
        cl.destroy();

    }

    public void testMaskProperties() throws Exception {
        prepareOozieConfDir("oozie-site-mask.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        Configuration conf = cl.getConf();
        assertEquals("my-secret", conf.get("oozie.authentication.signature.secret"));
        assertEquals("my-password", conf.get("oozie.service.JPAService.jdbc.password"));
        assertEquals("true", conf.get("oozie.is.awesome"));
        conf = cl.getMaskedConfiguration();
        assertEquals("**MASKED**", conf.get("oozie.authentication.signature.secret"));
        assertEquals("**MASKED**", conf.get("oozie.service.JPAService.jdbc.password"));
        assertEquals("true", conf.get("oozie.is.awesome"));
        cl.destroy();
    }

    public void testOozieConfig() throws Exception{
        prepareOozieConfDir("oozie-site2.xml");
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals("SITE1", cl.getConf().get("oozie.system.id"));
        assertEquals("SITE2", cl.getConf().get("oozie.dummy"));
        assertEquals("SITE1", ConfigurationService.get(cl.getConf(), "oozie.system.id"));
        assertEquals("SITE2", ConfigurationService.get(cl.getConf(), "oozie.dummy"));

        assertNull(cl.getConf().get("oozie.test.nonexist"));
        assertEquals(ConfigUtils.STRING_DEFAULT, ConfigurationService.get(cl.getConf(), "oozie.test.nonexist"));
        assertEquals(ConfigUtils.BOOLEAN_DEFAULT, ConfigurationService.getBoolean(cl.getConf(), "oozie.test.nonexist"));

        Configuration testConf = new Configuration(false);
        assertEquals(ConfigUtils.STRING_DEFAULT, ConfigurationService.get("test.nonexist"));
        assertEquals(ConfigUtils.STRING_DEFAULT, ConfigurationService.get(testConf, "test.nonexist"));
        testConf.set("test.nonexist", "another-conf");
        assertEquals(ConfigUtils.STRING_DEFAULT, ConfigurationService.get("test.nonexist"));
        assertEquals("another-conf", ConfigurationService.get(testConf, "test.nonexist"));
        Services.get().getConf().set("test.nonexist", "oozie-conf");
        assertEquals("oozie-conf", ConfigurationService.get("test.nonexist"));
        assertEquals("another-conf", ConfigurationService.get(testConf, "test.nonexist"));
        testConf.clear();
        assertEquals("oozie-conf", ConfigurationService.get("test.nonexist"));
        assertEquals(ConfigUtils.STRING_DEFAULT, ConfigurationService.get(testConf, "test.nonexist"));

        assertEquals("http://0.0.0.0:11000/oozie/callback", ConfigurationService.get(CallbackService.CONF_BASE_URL));
        assertEquals(5, ConfigurationService.getInt(CallbackService.CONF_EARLY_REQUEUE_MAX_RETRIES));
        assertEquals("gz", ConfigurationService.get(CodecFactory.COMPRESSION_OUTPUT_CODEC));
        assertEquals(4096, ConfigurationService.getInt(XLogStreamer.STREAM_BUFFER_LEN));
        assertEquals(10000,  ConfigurationService.getLong(JvmPauseMonitorService.WARN_THRESHOLD_KEY));
        assertEquals(60, ConfigurationService.getInt(InstrumentationService.CONF_LOGGING_INTERVAL));
        assertEquals(30, ConfigurationService.getInt(PurgeService.CONF_OLDER_THAN));
        assertEquals(7, ConfigurationService.getInt(PurgeService.COORD_CONF_OLDER_THAN));
        assertEquals(7, ConfigurationService.getInt(PurgeService.BUNDLE_CONF_OLDER_THAN));
        assertEquals(100, ConfigurationService.getInt(PurgeService.PURGE_LIMIT));
        assertEquals(3600, ConfigurationService.getInt(PurgeService.CONF_PURGE_INTERVAL));
        assertEquals(300, ConfigurationService.getInt(CoordMaterializeTriggerService.CONF_LOOKUP_INTERVAL));
        assertEquals(0, ConfigurationService.getInt(CoordMaterializeTriggerService.CONF_SCHEDULING_INTERVAL));
        assertEquals(300, cl.getConf().getInt(
                CoordMaterializeTriggerService.CONF_SCHEDULING_INTERVAL,
                ConfigurationService.getInt(CoordMaterializeTriggerService.CONF_LOOKUP_INTERVAL)));
        assertEquals(3600, ConfigurationService.getInt(CoordMaterializeTriggerService.CONF_MATERIALIZATION_WINDOW));
        assertEquals(10, ConfigurationService.getInt(CoordMaterializeTriggerService.CONF_CALLABLE_BATCH_SIZE));
        assertEquals(50, ConfigurationService.getInt(CoordMaterializeTriggerService
                .CONF_MATERIALIZATION_SYSTEM_LIMIT));
        assertEquals(0.05f, ConfigurationService.getFloat(CoordSubmitXCommand.CONF_MAT_THROTTLING_FACTOR));

        assertEquals("oozie", ConfigurationService.get(JPAService.CONF_DB_SCHEMA));
        assertEquals("jdbc:hsqldb:mem:oozie-db;create=true", ConfigurationService.get(JPAService.CONF_URL));
        assertEquals("org.hsqldb.jdbcDriver", ConfigurationService.get(JPAService.CONF_DRIVER));
        assertEquals("sa", ConfigurationService.get(JPAService.CONF_USERNAME));
        assertEquals("", ConfigurationService.get(JPAService.CONF_PASSWORD).trim());
        assertEquals("10", ConfigurationService.get(JPAService.CONF_MAX_ACTIVE_CONN).trim());
        assertEquals("org.apache.oozie.util.db.BasicDataSourceWrapper",
                ConfigurationService.get(JPAService.CONF_CONN_DATA_SOURCE));
        assertEquals("", ConfigurationService.get(JPAService.CONF_CONN_PROPERTIES).trim());
        assertEquals("300000", ConfigurationService.get(JPAService.CONF_VALIDATE_DB_CONN_EVICTION_INTERVAL).trim());
        assertEquals("10", ConfigurationService.get(JPAService.CONF_VALIDATE_DB_CONN_EVICTION_NUM).trim());

        assertEquals(2048, ConfigurationService.getInt(LauncherAMUtils.CONF_OOZIE_ACTION_MAX_OUTPUT_DATA));
        assertEquals("http://0.0.0.0:11000/oozie?job=", ConfigurationService.get(JobXCommand.CONF_CONSOLE_URL));
        assertEquals(false, ConfigurationService.getBoolean(HadoopAccessorService.KERBEROS_AUTH_ENABLED));

        assertEquals(0, ConfigurationService.getStrings("no.defined").length);
        assertEquals(0, ConfigurationService.getStrings(CredentialsProviderFactory.CRED_KEY).length);
        assertEquals(1, ConfigurationService.getStrings(DistcpActionExecutor.CLASS_NAMES).length);
        assertEquals("distcp=org.apache.hadoop.tools.DistCp",
                ConfigurationService.getStrings(DistcpActionExecutor.CLASS_NAMES)[0]);
        assertEquals(1, ConfigurationService.getInt(CoordActionInputCheckXCommand.COORD_EXECUTION_NONE_TOLERANCE));
        assertEquals(1000, ConfigurationService.getInt(V1JobServlet.COORD_ACTIONS_DEFAULT_LENGTH));

        assertEquals(cl.getConf().get(LiteWorkflowStoreService.CONF_USER_RETRY_ERROR_CODE), ConfigurationService.get
                (LiteWorkflowStoreService.CONF_USER_RETRY_ERROR_CODE));
        assertEquals(cl.getConf().get(LiteWorkflowStoreService.CONF_USER_RETRY_ERROR_CODE_EXT),
                ConfigurationService.get(LiteWorkflowStoreService.CONF_USER_RETRY_ERROR_CODE_EXT));

        assertEquals("simple", cl.getConf().get(AuthFilter.OOZIE_PREFIX + AuthFilter.AUTH_TYPE));
        assertEquals("36000", cl.getConf().get(AuthFilter.OOZIE_PREFIX + AuthFilter.AUTH_TOKEN_VALIDITY));
        // The cookie.domain config is in oozie-default.xml mostly for documentation purposes, but it needs to have an empty string
        // value by default, which Configuration parses as null
        assertNull(cl.getConf().get(AuthFilter.OOZIE_PREFIX + AuthFilter.COOKIE_DOMAIN));
        assertEquals("true", cl.getConf().get(AuthFilter.OOZIE_PREFIX + "simple.anonymous.allowed"));
        assertEquals("HTTP/localhost@LOCALHOST", cl.getConf().get(AuthFilter.OOZIE_PREFIX + "kerberos.principal"));
        assertEquals(cl.getConf().get(HadoopAccessorService.KERBEROS_KEYTAB),
                cl.getConf().get(AuthFilter.OOZIE_PREFIX + "kerberos.keytab"));
        assertEquals("DEFAULT", cl.getConf().get(AuthFilter.OOZIE_PREFIX + "kerberos.name.rules"));

        assertEquals(true, ConfigurationService.getBoolean(LiteWorkflowAppParser.VALIDATE_FORK_JOIN));
        assertEquals(false,
                ConfigurationService.getBoolean(CoordActionGetForInfoJPAExecutor.COORD_GET_ALL_COLS_FOR_ACTION));
        assertEquals(1, ConfigurationService.getStrings(URIHandlerService.URI_HANDLERS).length);
        assertEquals("org.apache.oozie.dependency.FSURIHandler",
                ConfigurationService.getStrings(URIHandlerService.URI_HANDLERS)[0]);
        assertEquals(cl.getConf().getBoolean("oozie.hadoop-2.0.2-alpha.workaround.for.distributed.cache", false),
                ConfigurationService.getBoolean(LauncherAMUtils.HADOOP2_WORKAROUND_DISTRIBUTED_CACHE));

        assertEquals("org.apache.oozie.event.MemoryEventQueue",
                (ConfigurationService.getClass(cl.getConf(), EventHandlerService.CONF_EVENT_QUEUE).getName()));
        assertEquals(-1, ConfigurationService.getInt(XLogFilter.MAX_SCAN_DURATION));
        assertEquals(-1, ConfigurationService.getInt(XLogFilter.MAX_ACTIONLIST_SCAN_DURATION));
        assertEquals(10000, ConfigurationService.getLong(JvmPauseMonitorService.WARN_THRESHOLD_KEY));
        assertEquals(1000, ConfigurationService.getLong(JvmPauseMonitorService.INFO_THRESHOLD_KEY));

        assertEquals(10000, ConfigurationService.getInt(CallableQueueService.CONF_QUEUE_SIZE));
        assertEquals(10, ConfigurationService.getInt(CallableQueueService.CONF_THREADS));
        assertEquals(3, ConfigurationService.getInt(CallableQueueService.CONF_CALLABLE_CONCURRENCY));
        assertEquals(120, ConfigurationService.getInt(CoordSubmitXCommand.CONF_DEFAULT_TIMEOUT_NORMAL));

        assertEquals(300, ConfigurationService.getInt(ZKLocksService.REAPING_THRESHOLD));
        assertEquals(2, ConfigurationService.getInt(ZKLocksService.REAPING_THREADS));
        assertEquals(10000, ConfigurationService.getInt(JobXCommand.DEFAULT_REQUEUE_DELAY));

        assertEquals(0, ConfigurationService.getStrings(AbandonedCoordCheckerService.TO_ADDRESS).length);
        assertEquals(25, ConfigurationService.getInt(AbandonedCoordCheckerService.CONF_FAILURE_LEN));
        assertEquals(false, ConfigurationService.getBoolean(AbandonedCoordCheckerService.CONF_JOB_KILL));
        assertEquals(60, ConfigurationService.getInt(AbandonedCoordCheckerService.CONF_CHECK_DELAY));
        assertEquals(1440, ConfigurationService.getInt(AbandonedCoordCheckerService.CONF_CHECK_INTERVAL));
        assertEquals(2880, ConfigurationService.getInt(AbandonedCoordCheckerService.CONF_JOB_OLDER_THAN));

        assertEquals(true, ConfigurationService.getBoolean(ZKConnectionListener.CONF_SHUTDOWN_ON_TIMEOUT));

        assertEquals(7, ConfigurationService.getInt(ShareLibService.LAUNCHERJAR_LIB_RETENTION));
        assertEquals(5000, ConfigurationService.getInt(SLAService.CONF_CAPACITY));
        assertEquals(11000, ConfigurationService.getInt("oozie.http.port"));
        assertEquals(11443, ConfigurationService.getInt("oozie.https.port"));
        assertFalse(ConfigurationService.getBoolean("oozie.https.enabled"));
        assertEquals(65536, ConfigurationService.getInt("oozie.http.response.header.size"));
        assertEquals(65536, ConfigurationService.getInt("oozie.http.request.header.size"));
        assertEquals("TLSv1,SSLv2Hello,TLSv1.1,TLSv1.2", ConfigurationService.get("oozie.https.include.protocols"));
        assertEquals("", ConfigurationService.get("oozie.https.exclude.protocols"));
        assertEquals("", ConfigurationService.get("oozie.https.include.cipher.suites"));
        assertEquals("TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA," +
                "SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA," +
                "SSL_RSA_WITH_RC4_128_MD5", ConfigurationService.get("oozie.https.exclude.cipher.suites"));
        assertEquals(150, ConfigurationService.getInt("oozie.server.threadpool.max.threads"));

        cl.destroy();
    }

    public void testDocumentBuilderFactorySystemPropertyDefault() throws Exception {
        verifyDocumentBuilderFactoryClass(DocumentBuilderFactoryImpl.class.getName(), DocumentBuilderFactoryImpl.class);
    }

    public void testDocumentBuilderFactorySystemPropertyCustom() throws Exception {
        prepareOozieConfDir("oozie-site-documentbuilderfactory.xml");
        verifyDocumentBuilderFactoryClass(DummyDocumentBuilderFactoryImpl.class.getName(), DummyDocumentBuilderFactoryImpl.class);
    }

    public void testDocumentBuilderFactorySystemPropertyEmpty() throws Exception {
        // Determine the class that the JVM would provide if we don't set the property
        setSystemProperty("javax.xml.parsers.DocumentBuilderFactory", null);
        assertNull(System.getProperty("javax.xml.parsers.DocumentBuilderFactory"));
        Class<?> dbfClass = DocumentBuilderFactory.newInstance().getClass();

        prepareOozieConfDir("oozie-site-documentbuilderfactory-empty.xml");
        verifyDocumentBuilderFactoryClass(null, dbfClass);
    }

    public void testJceksUrlReplacement() throws Exception {
        assertForJceksReplacement(
                "oozie-site-with-jceks.xml",
                "localjceks://file/somewhere/on/local/filesystem");
    }

    public void testJceksLocaljceksUrlReplacement() throws Exception {
        assertForJceksReplacement(
                "oozie-site-with-localjceks.xml",
                "localjceks://file/somewhere/on/local/filesystem");
    }

    public void testJceksUrlReplacementWithNonFileContinuation() throws Exception {
        assertForJceksReplacement(
                "oozie-site-with-jceks-nonfile.xml",
                "jceks://something/somewhere/on/local/filesystem");
    }

    public void testJceksUrlReplacementWithFilesomethingContinuation() throws Exception {
        assertForJceksReplacement(
                "oozie-site-with-jceks-filesomething.xml",
                "jceks://filesomething/somewhere/on/local/filesystem");
    }

    private void assertForJceksReplacement(String siteXml, String expectedResult) throws Exception{
        prepareOozieConfDir(siteXml);
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals(expectedResult, cl.getConf().get(HADOOP_SECURITY_CREDENTIAL_PROVIDER_PATH));
        cl.destroy();
    }

    private void verifyDocumentBuilderFactoryClass(String expectedPropertyValue, Class<?> expectedClass) throws Exception {
        setSystemProperty("javax.xml.parsers.DocumentBuilderFactory", null);
        assertNull(System.getProperty("javax.xml.parsers.DocumentBuilderFactory"));
        ConfigurationService cl = new ConfigurationService();
        cl.init(null);
        assertEquals(expectedPropertyValue, System.getProperty("javax.xml.parsers.DocumentBuilderFactory"));
        DocumentBuilderFactory docFac = DocumentBuilderFactory.newInstance();
        assertTrue("Expected DocumentBuilderFactory to be of class [" + expectedClass.getName() + "] but was ["
                + docFac.getClass().getName() + "]", expectedClass.isInstance(docFac));
        cl.destroy();
    }

}

