/**
 * 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 com.datatorrent.stram.util;

import java.util.Map;

import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.slf4j.LoggerFactory;

import org.apache.log4j.Appender;
import org.apache.log4j.Category;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.spi.LoggingEvent;

import com.google.common.collect.Maps;

import com.datatorrent.api.Context;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class LoggerUtilTest
{
  private static final org.slf4j.Logger logger = LoggerFactory.getLogger(LoggerUtilTest.class);

  @BeforeClass
  public static void setup() throws Exception
  {
    logger.debug("Logger repository before LoggerUtil.changeLoggersLevel() {}", LogManager.getLoggerRepository());
    LoggerUtil.changeLoggersLevel(Maps.<String, String>newHashMap());
    logger.debug("Logger repository after LoggerUtil.changeLoggersLevel() {}", LogManager.getLoggerRepository());
  }

  @Test
  public void testGetPatternLevels()
  {
    Map<String, String> changes = Maps.newHashMap();
    changes.put("_.org.apache.*", "WARN");
    changes.put("_.com.datatorrent.io.fs.*", "DEBUG");
    changes.put("_.com.datatorrent.io.*", "ERROR");
    LoggerUtil.changeLoggersLevel(changes);

    Map<String, String> levels = LoggerUtil.getPatternLevels();

    assertEquals(3, levels.size());
    assertEquals(levels.get("_.org.apache.*"), "WARN");
    assertEquals(levels.get("_.com.datatorrent.io.fs.*"), "DEBUG");
    assertEquals(levels.get("_.com.datatorrent.io.*"), "ERROR");

    changes.clear();
    changes.put("_.com.datatorrent.*", "WARN");
    LoggerUtil.changeLoggersLevel(changes);

    levels = LoggerUtil.getPatternLevels();
    assertEquals(2, levels.size());
    assertEquals(levels.get("_.org.apache.*"), "WARN");
    assertNull(levels.get("_.com.datatorrent.io.fs.*"));
    assertNull(levels.get("_.com.datatorrent.io.*"));
    assertEquals(levels.get("_.com.datatorrent.*"), "WARN");
  }

  @Test
  public void testLoggerLevels()
  {
    org.slf4j.Logger sl4jLogger;
    org.apache.log4j.Logger log4jLogger;

    Map<String, String> changes = Maps.newHashMap();
    changes.put("_.org.apache.*", "WARN");
    changes.put("_.com.datatorrent.*", "WARN");
    changes.put("_.com.datatorrent.stram.client.*", "INFO");
    changes.put("_.com.datatorrent.stram.api.*", "DEBUG");
    LoggerUtil.changeLoggersLevel(changes);

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.client.DTConfiguration");
    assertTrue(sl4jLogger.isInfoEnabled());
    assertFalse(sl4jLogger.isDebugEnabled());

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.api.StramEvent");
    assertTrue(sl4jLogger.isInfoEnabled());
    assertTrue(sl4jLogger.isDebugEnabled());

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.StreamingAppMaster");
    assertFalse(sl4jLogger.isInfoEnabled());
    assertFalse(sl4jLogger.isDebugEnabled());

    log4jLogger = LogManager.getLogger("_.com.datatorrent.stram.client.DTConfiguration");
    assertSame(log4jLogger.getLevel(), Level.INFO);
    assertSame(log4jLogger.getEffectiveLevel(), Level.INFO);

    org.apache.log4j.Logger stramEventLogger = LogManager.getLogger("_.com.datatorrent.stram.api.StramEvent");
    assertSame(stramEventLogger.getLevel(), Level.DEBUG);
    assertSame(stramEventLogger.getEffectiveLevel(), Level.DEBUG);

    org.apache.log4j.Logger streamingAppMasterLogger = LogManager.getLogger("_.com.datatorrent.stram.StreamingAppMaster");
    assertSame(streamingAppMasterLogger.getLevel(), Level.WARN);
    assertSame(streamingAppMasterLogger.getEffectiveLevel(), Level.WARN);

    changes.clear();
    changes.put("_.com.datatorrent.*", "DEBUG");
    changes.put("_.com.datatorrent.stram.engine.*", "ERROR");
    LoggerUtil.changeLoggersLevel(changes);

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.client.DTConfiguration");
    assertTrue(sl4jLogger.isInfoEnabled());
    assertTrue(sl4jLogger.isDebugEnabled());

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.api.StramEvent");
    assertTrue(sl4jLogger.isInfoEnabled());
    assertTrue(sl4jLogger.isDebugEnabled());

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.StreamingAppMaster");
    assertTrue(sl4jLogger.isInfoEnabled());
    assertTrue(sl4jLogger.isDebugEnabled());

    sl4jLogger = LoggerFactory.getLogger("_.com.datatorrent.stram.engine.StreamingContainer");
    assertFalse(sl4jLogger.isInfoEnabled());
    assertFalse(sl4jLogger.isDebugEnabled());

    log4jLogger = LogManager.getLogger("_.com.datatorrent.stram.client.DTConfiguration");
    assertSame(log4jLogger.getLevel(), Level.DEBUG);
    assertSame(log4jLogger.getEffectiveLevel(), Level.DEBUG);

    log4jLogger = LogManager.getLogger("_.com.datatorrent.stram.api.StramEvent");
    assertSame(log4jLogger.getLevel(), Level.DEBUG);
    assertSame(log4jLogger.getEffectiveLevel(), Level.DEBUG);

    log4jLogger = LogManager.getLogger("_.com.datatorrent.stram.StreamingAppMaster");
    assertSame(log4jLogger.getLevel(), Level.DEBUG);
    assertSame(log4jLogger.getEffectiveLevel(), Level.DEBUG);

    log4jLogger = LogManager.getLogger("_.com.datatorrent.stram.engine.StreamingContainer");
    assertSame(log4jLogger.getLevel(), Level.ERROR);
    assertSame(log4jLogger.getEffectiveLevel(), Level.ERROR);
  }

  @Test
  public void testParentLevel()
  {
    org.apache.log4j.Logger log4jLogger = LogManager.getLogger("com.datatorrent.stram.util.Unknown");
    assertNull(log4jLogger.getLevel());
    Category parent = log4jLogger.getParent();
    while (parent.getLevel() == null) {
      parent = parent.getParent();
    }
    assertSame(log4jLogger.getEffectiveLevel(), parent.getLevel());
  }

  @Test
  public void testAppender()
  {
    logger.info("Running Appender Test");
    String appenderName = "testAppender";
    String appenderName1 = "testAppender1";
    String args = "log4j.appender.testAppender=com.datatorrent.stram.util.LoggerUtilTest$TestAppender"
        + ",log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout"
        + ",log4j.appender.testAppender.layout.ConversionPattern=%d %d{Z} [%t] %-5p (%F:%L) - %m%n"
        + ",log4j.appender.testAppender1=org.apache.log4j.ConsoleAppender"
        + ",log4j.appender.testAppender1.layout=org.apache.log4j.PatternLayout"
        + ",log4j.appender.testAppender1.layout.ConversionPattern=%d %d{Z} [%t] %-5p (%F:%L) - %m%n";

    assertTrue(LoggerUtil.addAppenders(new String[] {appenderName }, args, ","));
    TestAppender appender = (TestAppender)LogManager.getRootLogger().getAppender(appenderName);

    logger.info(args);
    assertEquals(args, appender.lastMessage);
    assertEquals(appender.level, Level.INFO);

    logger.warn(appenderName1);
    assertEquals(appenderName1, appender.lastMessage);
    assertEquals(appender.level, Level.WARN);

    // don't allow to add an appender with the same name
    assertFalse(LoggerUtil.addAppenders(new String[] {appenderName }, args, ","));
    logger.info("Test Appender is added: " + LoggerUtil.getAppendersNames());
    testAndRemoveAppender(appenderName);
    logger.info("Test Appender is removed: " + LoggerUtil.getAppendersNames());

    System.setProperty(Context.DAGContext.LOGGER_APPENDER.getLongName(), appenderName + "," + appenderName1 + ";" + args);
    assertTrue(LoggerUtil.addAppenders());
    logger.info("Test Appenders are added: " + LoggerUtil.getAppendersNames());

    testAndRemoveAppender(appenderName);
    testAndRemoveAppender(appenderName1);
    logger.info("Test Appenders are removed: " + LoggerUtil.getAppendersNames());
  }

  private static void testAndRemoveAppender(String name)
  {
    Appender appender = org.apache.log4j.Logger.getRootLogger().getAppender(name);
    assertNotNull(appender);
    assertTrue(LoggerUtil.getAppendersNames().contains(name));
    LoggerUtil.removeAppender(name);
    assertNull(org.apache.log4j.Logger.getRootLogger().getAppender(name));
  }

  public static class TestAppender extends ConsoleAppender
  {
    private String lastMessage = null;
    private Level level;

    @Override
    public void append(LoggingEvent event)
    {
      lastMessage = event.getRenderedMessage();
      level = event.getLevel();
      super.append(event);
    }
  }
}
