/*
 * 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.log4j.plugins;

import junit.framework.TestCase;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.LoggerRepositoryExImpl;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.util.Compare;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;


public class PluginTestCase extends TestCase {

    static String FILE = "plugins.PluginTestCase";
    static String WITNESS = "witness/plugins.PluginTestCase";
    private static boolean verbosePluginOutput = true;
    private static HashMap repositoryMap = new HashMap();

    PluginRegistry pluginRegistry;
    public PluginTestCase(String name) {
        super(name);
    }

    public void setUp() {
        pluginRegistry = new LoggerRepositoryExImpl(
                LogManager.getLoggerRepository()).getPluginRegistry();

        // delete the output file if they happen to exist
        new File(getOutputFile("test1")).delete();
    }

    private String getOutputFile(String caseName) {

        return FILE + "." + caseName + ".txt";
    }

    private String getWitnessFile(String caseName) {

        return WITNESS + "." + caseName + ".txt";
    }

    private void setupAppender(String caseName) throws IOException {

        Logger root = Logger.getRootLogger();
        root.removeAllAppenders();

        // set up appender
        FileAppender appender = new FileAppender(new SimpleLayout(),
                getOutputFile(caseName), false);

        //FileAppender appender = new FileAppender(new PatternLayout("%c{1}: %m%n"),
        //  getOutputFile(caseName), false);
        root.addAppender(appender);
        root.setLevel(Level.DEBUG);
    }

    // basic test of plugin in standalone mode
    public void test1() throws Exception {

        String testName = "test1";
        Logger logger = Logger.getLogger(testName);

        setupAppender(testName);

        PluginTester plugin1 = new PluginTester1("plugin1", 1);
        PluginTester plugin2 = new PluginTester1("plugin1", 2);
        PluginTester plugin3 = new PluginTester2("plugin1", 3);
        PluginTester plugin4 = new PluginTester2("plugin2", 4);
        PluginTester retPlugin;

        repositoryMap.clear();
        repositoryMap.put(LogManager.getLoggerRepository(),
            "default repository");

        // test basic starting/stopping
        logger.info("test 1.1 - basic starting/stopping");
        logger.info("starting " + plugin1.getIdentifier());
        pluginRegistry.addPlugin(plugin1);
        logger.info("stopping " + plugin1.getIdentifier() +
            " using plugin object");
        pluginRegistry.stopPlugin(plugin1.getName());

        // test restarting and starting when already started
        logger.info("test 1.2 - restarting and starting when already started");
        logger.info("restarting " + plugin1.getIdentifier());
        pluginRegistry.addPlugin(plugin1);
        logger.info("restarting " + plugin1.getIdentifier() + " again");
        pluginRegistry.addPlugin(plugin1);

        // test stopping and stopping when already stopped
        logger.info("test 1.3- stopping and stopping when already stopped");
        logger.info("stopping " + plugin1.getIdentifier());
        pluginRegistry.stopPlugin(plugin1.getName());
        logger.info("stopping " + plugin1.getIdentifier() + " again");
        pluginRegistry.stopPlugin(plugin1.getName());

        logger.info("test 1.4 - restarting then stopping by plugin name");
        logger.info("starting " + plugin1.getIdentifier());
        pluginRegistry.addPlugin(plugin1);
        logger.info("stopping " + plugin1.getIdentifier() +
            " using plugin name");
        pluginRegistry.stopPlugin(plugin1.getName());

//        // test starting of an "equal" plugin
//        logger.info("test 1.5 - starting of an \"equal\" plugin");
//        logger.info("starting " + plugin1.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin1);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("starting " + plugin2.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin2);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("stopping " + retPlugin.getIdentifier());
//        pluginRegistry.stopPlugin(retPlugin.getName());
//
//        // test starting an "equal" plugin after original stopped
//        logger.info(
//            "test 1.6 - starting an \"equal\" plugin after original stopped");
//        logger.info("starting " + plugin2.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin2);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("stopping " + retPlugin.getIdentifier());
//        pluginRegistry.stopPlugin(retPlugin.getName());
//
//        // test starting of an "unequal" plugin with same name
//        logger.info(
//            "test 1.7 - starting of an \"unequal\" plugin with same name");
//        logger.info("starting " + plugin1.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin1);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("starting " + plugin3.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin3);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("stopping " + retPlugin.getIdentifier());
//        pluginRegistry.stopPlugin(retPlugin.getName());
//
//        // test starting of multiple plugins and stopAll
//        logger.info("test 1.8 - starting of multiple plugins and stopAll");
//        logger.info("starting " + plugin1.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin1);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("starting " + plugin4.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin4);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        verbosePluginOutput = false;
//        logger.info("stopping all plugins");
//        pluginRegistry.stopAllPlugins();
//        verbosePluginOutput = true;
//        logger.info(plugin1.getIdentifier() + " is " +
//            (plugin1.isActive() ? "active" : "inactive"));
//        logger.info(plugin4.getIdentifier() + " is " +
//            (plugin4.isActive() ? "active" : "inactive"));
//        logger.info("stopping all plugins again");
//        pluginRegistry.stopAllPlugins();
//
//        // test starting of multiple plugins and stopAll
//        logger.info(
//            "test 1.9 - starting of multiple plugins, stopping, and stopAll");
//        logger.info("starting " + plugin1.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin1);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
//        logger.info("starting " + plugin4.getIdentifier());
//        retPlugin = (PluginTester) pluginRegistry.startPlugin(plugin4);
//        logger.info("returned plugin is " + retPlugin.getIdentifier());
        logger.info("stopping " + plugin1.getIdentifier() +
            " using plugin object");
        pluginRegistry.stopPlugin(plugin1.getName());
        verbosePluginOutput = false;
        logger.info("stopping all plugins");
        pluginRegistry.stopAllPlugins();
        verbosePluginOutput = true;
        logger.info(plugin1.getIdentifier() + " is " +
            (plugin1.isActive() ? "active" : "inactive"));
        logger.info(plugin4.getIdentifier() + " is " +
            (plugin4.isActive() ? "active" : "inactive"));
        logger.info("stopping all plugins again");
        //
        //  Warning about removing non-registered LoggerRepositoryEventListener
        //     goes to console on log4j 1.2 instead of log file with log4j 1.3.
        //
        pluginRegistry.stopAllPlugins();

        assertTrue(Compare.compare(PluginTestCase.class,
                getOutputFile(testName),
                getWitnessFile(testName)));
    }

    // basic test of plugin with repositories
    public void test2() throws Exception {
//
//        String testName = "test2";
//        Logger logger = Logger.getLogger(testName);
//
//        setupAppender(testName);
//
//        PluginTester plugin1 = new PluginTester1("plugin1", 1);
//        PluginTester plugin2 = new PluginTester1("plugin2", 2);
//        PluginTester retPlugin;
//        LoggerRepository repo1 = new Hierarchy(new RootLogger(Level.DEBUG));
//        LoggerRepository repo2 = new Hierarchy(new RootLogger(Level.DEBUG));
//        
//        PluginRegistry pr1 = repo1.getPluginRegistry();
//        PluginRegistry pr2 = repo2.getPluginRegistry();
//        
//        repositoryMap.clear();
//        repositoryMap.put(repo1, "repository1");
//        repositoryMap.put(repo2, "repository2");
//
//        logger.info("test 2.1 - starting plugins in multiple repositories");
//        logger.info("starting " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(repo1));
//        retPlugin = (PluginTester) pr1.startPlugin(plugin1);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("starting " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(repo2));
//        retPlugin = (PluginTester) pr2.startPlugin(plugin2);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//
//        logger.info("test 2.2 - stopping plugins in multiple repositories");
//        logger.info("stopping " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(plugin1.getLoggerRepository()));
//        retPlugin = (PluginTester) pr1.stopPlugin(plugin1.getName());
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("stopping " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(plugin2.getLoggerRepository()));
//        retPlugin = (PluginTester) pr2.stopPlugin(plugin2.getName());
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//
//        logger.info("test 2.3 - restarting plugins in different repositories");
//        logger.info("starting " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(repo2));
//        retPlugin = (PluginTester) pr2.startPlugin(plugin1);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("starting " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(repo1));
//        retPlugin = (PluginTester) pr1.startPlugin(plugin2);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//
//        logger.info("test 2.4 - stopping plugins using stopAll");
//        logger.info("stopping all plugins in " + repositoryMap.get(repo1));
//        pr1.stopAllPlugins();
//        logger.info("stopping all plugins in " + repositoryMap.get(repo2));
//        pr2.stopAllPlugins();
//
//        logger.info(
//            "test 2.5 - starting a plugin already active in another repository");
//        logger.info("starting " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(repo1));
//        retPlugin = (PluginTester) pr1.startPlugin(plugin1);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("starting " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(repo2));
//        retPlugin = (PluginTester) pr2.startPlugin(plugin2);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("restarting " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(repo2));
//        retPlugin = (PluginTester) pr2.startPlugin(plugin1);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("restarting " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(repo1));
//        retPlugin = (PluginTester) pr1.startPlugin(plugin2);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//
//        logger.info("test 2.6 - handle repository reset");
//        logger.info("resetting " + repositoryMap.get(repo1));
//        repo1.resetConfiguration();
//        logger.info("resetting " + repositoryMap.get(repo2));
//        repo2.resetConfiguration();
//
//        logger.info("test 2.7 - handle repository shutdown");
//        logger.info("starting " + plugin1.getIdentifier() + " in " +
//            repositoryMap.get(repo1));
//        retPlugin = (PluginTester) pr1.startPlugin(plugin1);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("starting " + plugin2.getIdentifier() + " in " +
//            repositoryMap.get(repo2));
//        retPlugin = (PluginTester) pr2.startPlugin(plugin2);
//        logger.info(
//            "returned plugin is " + retPlugin.getIdentifier() + " in " +
//            repositoryMap.get(retPlugin.getLoggerRepository()));
//        logger.info("shutting down " + repositoryMap.get(repo1));
//        repo1.shutdown();
//        logger.info("shutting down " + repositoryMap.get(repo2));
//        repo2.shutdown();
//
//        assertTrue(Compare.compare(getOutputFile(testName),
//                getWitnessFile(testName)));
    }

    public void testPluginListeners() {

        Plugin p = new PluginTester1("MyNewPlugin", 1);
        PluginListenerLatch l = new PluginListenerLatch();
        pluginRegistry.stopAllPlugins();
        pluginRegistry.addPluginListener(l);
        pluginRegistry.addPlugin(p);

        PluginEvent e = l.LastEvent;

        assertTrue("PluginListener should have been notified of start",
            l.StartLatch);
        assertTrue("PluginListener stop latch should not be activated",
            !l.StopLatch);
        assertTrue("PluginListener should be given reference to Plugin",
            e.getPlugin() == p);

        l.reset();
        pluginRegistry.stopAllPlugins();
        assertTrue("PluginListener should have been notified of stop",
            l.StopLatch);
        assertTrue("PluginListener should not have been notified of start",
            !l.StartLatch);
        assertTrue("PluginListener should be given reference to Plugin",
            l.LastEvent.getPlugin() == p);
        assertTrue(
            "PluginListener should have received a distinct event object",
            l.LastEvent != e);
    }

    public void testPropertyChangeListeners() {

        Plugin plugin = new PluginTester1("PluginTest1", 1);

        final PropertyChangeListenerLatch l = new PropertyChangeListenerLatch();
        plugin.addPropertyChangeListener(l);

        /**
         * Test the basic properties and ensure they get latched by notification
         */
        plugin.setName("NewName");
        assertTrue("PropertyChange latch should have been detected",
            l.isLatched());
        assertTrue("Old value unexpected: '" + l.getLastEvent().getOldValue() +
            "'", l.getLastEvent().getOldValue().equals("PluginTest1"));
        assertTrue("New value unexpected: '" + l.getLastEvent().getNewValue() +
            "'", l.getLastEvent().getNewValue().equals("NewName"));

        l.reset();

        plugin.removePropertyChangeListener(l);
        plugin.setName("SecondNewName");

        assertTrue("Should not have been notified/latched", !l.isLatched());

        l.reset();

        /**
         * Test when only listening for specific property
         */
        plugin.addPropertyChangeListener("name", l);

        plugin.setName("NewName2");
        assertTrue("PropertyChange latch should have been detected",
            l.isLatched());
        assertTrue("Old value unexpected: '" + l.getLastEvent().getOldValue() +
            "'", l.getLastEvent().getOldValue().equals("SecondNewName"));
        assertTrue("New value unexpected: '" + l.getLastEvent().getNewValue() +
            "'", l.getLastEvent().getNewValue().equals("NewName2"));

        plugin.removePropertyChangeListener("name", l);

        l.reset();

        /**
         * setup some assertions before continuing testing to make sure the test code isn't broken
         */
        assertTrue("Plugin should not be active just yet", !plugin.isActive());
        assertTrue("Latch should not be latched", !l.isLatched());

        plugin.addPropertyChangeListener("active", l);

        pluginRegistry.addPlugin(plugin);
/*
        assertTrue(
            "Should have been notified of activation when pluginRegistry.start(plugin)",
            l.isLatched());
        assertTrue("Active old value should have been false",
            l.getLastEvent().getOldValue().equals(Boolean.FALSE));
        assertTrue("Active New value should have been true",
            l.getLastEvent().getNewValue().equals(Boolean.TRUE));

        pluginRegistry.stopAllPlugins();
        l.reset();
        assertTrue("Latch should have been reset", !l.isLatched());
*/

        /**
         * start afresh
         */
/*
        plugin = new PluginTester1("LoggerRepositoryProperty", 2);

        LoggerRepository oldValue = plugin.getLoggerRepository();
        plugin.addPropertyChangeListener("loggerRepository", l);

        LoggerRepository rep = new Hierarchy(new RootLogger(Level.DEBUG));
        plugin.setLoggerRepository(rep);

        assertTrue("Should be notified of LoggerRepository property change",
            l.isLatched());
        assertTrue("LoggerRepository Old value mismatch",
            l.getLastEvent().getOldValue() == oldValue);
        assertTrue("LoggerRepository New vale mismatch",
            l.getLastEvent().getNewValue() == rep);
*/
    }

    private static class PluginListenerLatch implements PluginListener {

        private boolean StartLatch;
        private boolean StopLatch;
        private PluginEvent LastEvent;

        /* (non-Javadoc)
         * @see org.apache.log4j.plugins.PluginListener#pluginStarted(org.apache.log4j.plugins.PluginEvent)
         */
        public void pluginStarted(PluginEvent e) {
            StartLatch = true;
            LastEvent = e;
        }

        /* (non-Javadoc)
         * @see org.apache.log4j.plugins.PluginListener#pluginStopped(org.apache.log4j.plugins.PluginEvent)
         */
        public void pluginStopped(PluginEvent e) {
            StopLatch = true;
            LastEvent = e;
        }

        void reset() {
            StartLatch = false;
            StopLatch = false;
            LastEvent = null;
        }
    }

    private static class PropertyChangeListenerLatch
        implements PropertyChangeListener {

        boolean latch = false;
        PropertyChangeEvent lastEvent = null;

        /* (non-Javadoc)
         * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
         */
        public void propertyChange(PropertyChangeEvent evt) {
            latch = true;
            lastEvent = evt;
        }

        boolean isLatched() {

            return latch;
        }

        void reset() {
            latch = false;
            lastEvent = null;
        }

        PropertyChangeEvent getLastEvent() {

            return lastEvent;
        }
    }

    /**
      Class to test the Plugin and PluginRegistry functionality. */
    private static class PluginTester extends PluginSkeleton {

        protected Logger logger;
        private boolean active = false;
        public int id;

        public synchronized boolean isActive() {
            logger.debug(this.getIdentifier() + " is " +
                (active ? "active" : "inactive"));

            return active;
        }

        private synchronized boolean setActive(boolean _active) {

            boolean oldValue = active;

            if (active != _active) {
                active = _active;
                firePropertyChange("active", oldValue, active);

                return true;
            } else {

                return false;
            }
        }

        public String getIdentifier() {

            if (verbosePluginOutput) {

                return this.getName() + "-id" + id;
            } else {

                return "plugin in " +
                repositoryMap.get(this.getLoggerRepository());
            }
        }

        public void activateOptions() {

            if (setActive(true)) {
                logger.debug(this.getIdentifier() + " activated");
            } else {
                logger.debug(this.getIdentifier() + " already activated");
            }
        }

        public void shutdown() {

            if (setActive(false)) {
                logger.debug(this.getIdentifier() + " shutdown");
            } else {
                logger.debug(this.getIdentifier() + " already shutdown");
            }
        }

        /* (non-Javadoc)
         * @see org.apache.log4j.plugins.Plugin#isEquivalent(org.apache.log4j.plugins.Plugin)
         */
        public boolean isEquivalent(Plugin testPlugin) {

            boolean equiv = super.isEquivalent(testPlugin);

            if (equiv) {
                logger.debug("plugin equal");
            } else if (!(testPlugin.getClass() == this.getClass())) {
                logger.debug(
                    "plugin not equal, different class: " +
                    this.getClass().getName() + " != " +
                    testPlugin.getClass().getName());

            } else if (!this.getName().equals(testPlugin.getName())) {
                logger.debug(
                    "plugin not equal, different name: " + this.getName() +
                    " != " + testPlugin.getName());

            } else if (!this.getLoggerRepository().equals(
                        testPlugin.getLoggerRepository())) {
                logger.debug(
                    "plugin not equal, different repository: " +
                    repositoryMap.get(this.getLoggerRepository()) + " != " +
                    repositoryMap.get(testPlugin.getLoggerRepository()));
            }

            return equiv;
        }
    }

    /**
      Class to test the Plugin and PluginRegistry functionality. */
    private static class PluginTester1 extends PluginTester {
        public PluginTester1(String _name, int _id) {
            logger = Logger.getLogger(this.getClass());
            setName(_name);
            id = _id;
        }
    }

    /**
      Class to test the Plugin and PluginRegistry functionality. */
    private static class PluginTester2 extends PluginTester {
        public PluginTester2(String _name, int _id) {
            logger = Logger.getLogger(this.getClass());
            setName(_name);
            id = _id;
        }
    }
}
