/*
 * 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.geode.internal.logging;

import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_LOG_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_LOG_LEVEL;
import static org.apache.geode.internal.logging.LogWriterLevel.CONFIG;
import static org.apache.geode.internal.logging.LogWriterLevel.ERROR;
import static org.apache.geode.internal.logging.LogWriterLevel.FINE;
import static org.apache.geode.internal.logging.LogWriterLevel.FINER;
import static org.apache.geode.internal.logging.LogWriterLevel.FINEST;
import static org.apache.geode.internal.logging.LogWriterLevel.INFO;
import static org.apache.geode.internal.logging.LogWriterLevel.SEVERE;
import static org.apache.geode.internal.logging.LogWriterLevel.WARNING;
import static org.apache.geode.internal.logging.log4j.Log4jAgent.getLoggerConfig;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.assertj.core.api.Assertions.assertThat;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;

import org.apache.geode.LogWriter;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.internal.logging.log4j.FastLogger;
import org.apache.geode.internal.logging.log4j.Log4jAgent;
import org.apache.geode.internal.logging.log4j.LogWriterLogger;
import org.apache.geode.test.assertj.LogFileAssert;
import org.apache.geode.test.junit.categories.LoggingTest;

/**
 * Integration tests for logging with {@link InternalDistributedSystem} lifecycle.
 */
@Category(LoggingTest.class)
public class LoggingWithDistributedSystemIntegrationTest {

  private static final String APPLICATION_LOGGER_NAME = "com.application";
  private static final AtomicInteger COUNTER = new AtomicInteger();

  private String currentWorkingDirPath;
  private File mainLogFile;
  private String mainLogFilePath;
  private File securityLogFile;
  private String securityLogFilePath;
  private InternalDistributedSystem system;
  private String prefix;

  private Logger geodeLogger;
  private Logger applicationLogger;

  @Rule
  public TemporaryFolder temporaryFolder = new TemporaryFolder();

  @Rule
  public TestName testName = new TestName();

  @Before
  public void setUp() {
    File currentWorkingDir = new File("");
    currentWorkingDirPath = currentWorkingDir.getAbsolutePath();

    String name = testName.getMethodName();
    mainLogFile = new File(temporaryFolder.getRoot(), name + "-main.log");
    mainLogFilePath = mainLogFile.getAbsolutePath();
    securityLogFile = new File(temporaryFolder.getRoot(), name + "-security.log");
    securityLogFilePath = securityLogFile.getAbsolutePath();

    prefix = "ExpectedStrings: " + testName.getMethodName() + " message logged at level ";

    geodeLogger = LogService.getLogger();
    applicationLogger = LogManager.getLogger(APPLICATION_LOGGER_NAME);

    Log4jAgent.updateLogLevel(Level.INFO, getLoggerConfig(applicationLogger));
  }

  @After
  public void tearDown() throws Exception {
    if (system != null) {
      system.disconnect();
    }
  }

  @Test
  public void applicationLoggerLevelIsInfo() {
    assertThat(applicationLogger.getLevel()).isEqualTo(Level.INFO);
  }

  @Test
  public void defaultConfigForLogging() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    LogConfig logConfig = system.getLogConfig();

    assertThat(logConfig.getName()).isEqualTo("");
    assertThat(logConfig.getLogFile().getAbsolutePath()).isEqualTo(currentWorkingDirPath);
    assertThat(logConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(logConfig.getLogDiskSpaceLimit()).isEqualTo(0);
    assertThat(logConfig.getLogFileSizeLimit()).isEqualTo(0);
    assertThat(logConfig.getSecurityLogFile().getAbsolutePath()).isEqualTo(currentWorkingDirPath);
    assertThat(logConfig.getSecurityLogLevel()).isEqualTo(CONFIG.intLevel());
  }

  @Test
  public void bothLogFilesConfigured() throws Exception {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(SECURITY_LOG_FILE, securityLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriterLogger = (LogWriterLogger) system.getLogWriter();
    LogWriterLogger securityLogWriterLogger = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> {
      system.getLogWriter().info("log another line");

      assertThat(mainLogFile).exists();
      assertThat(securityLogFile).exists();

      // assertThat mainLogFile is not empty
      try (FileInputStream fis = new FileInputStream(mainLogFile)) {
        assertThat(fis.available()).isGreaterThan(0);
      }
    });

    assertThat(distributionConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(CONFIG.intLevel());

    assertThat(distributionConfig.getLogFile().getAbsolutePath()).isEqualTo(mainLogFilePath);
    assertThat(distributionConfig.getSecurityLogFile().getAbsolutePath())
        .isEqualTo(securityLogFilePath);

    assertThat(system.getLogWriter()).isInstanceOf(LogWriterLogger.class);
    assertThat(system.getSecurityLogWriter()).isInstanceOf(LogWriterLogger.class);

    assertThat(logWriterLogger.getLogWriterLevel()).isEqualTo(INFO.intLevel());
    assertThat(securityLogWriterLogger.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    securityLogWriterLogger.info("test: security log file created at info");

    // assertThat securityLogFile is not empty
    try (FileInputStream fis = new FileInputStream(securityLogFile)) {
      assertThat(fis.available()).isGreaterThan(0);
    }

    LogWriter logWriter = logWriterLogger;
    assertThat(logWriter.finestEnabled()).isFalse();
    assertThat(logWriter.finerEnabled()).isFalse();
    assertThat(logWriter.fineEnabled()).isFalse();
    assertThat(logWriter.configEnabled()).isTrue();
    assertThat(logWriter.infoEnabled()).isTrue();
    assertThat(logWriter.warningEnabled()).isTrue();
    assertThat(logWriter.errorEnabled()).isTrue();
    assertThat(logWriter.severeEnabled()).isTrue();

    FastLogger logWriterFastLogger = logWriterLogger;
    assertThat(logWriterFastLogger.isDelegating()).isFalse();
    assertThat(logWriterFastLogger.isTraceEnabled()).isFalse();
    assertThat(logWriterFastLogger.isDebugEnabled()).isFalse();
    assertThat(logWriterFastLogger.isInfoEnabled()).isTrue();
    assertThat(logWriterFastLogger.isWarnEnabled()).isTrue();
    assertThat(logWriterFastLogger.isErrorEnabled()).isTrue();
    assertThat(logWriterFastLogger.isFatalEnabled()).isTrue();

    LogWriter securityLogWriter = securityLogWriterLogger;
    assertThat(securityLogWriter.finestEnabled()).isFalse();
    assertThat(securityLogWriter.finerEnabled()).isFalse();
    assertThat(securityLogWriter.fineEnabled()).isFalse();
    assertThat(securityLogWriter.configEnabled()).isTrue();
    assertThat(securityLogWriter.infoEnabled()).isTrue();
    assertThat(securityLogWriter.warningEnabled()).isTrue();
    assertThat(securityLogWriter.errorEnabled()).isTrue();
    assertThat(securityLogWriter.severeEnabled()).isTrue();

    FastLogger securityLogWriterFastLogger = logWriterLogger;
    assertThat(securityLogWriterFastLogger.isDelegating()).isFalse();
    assertThat(securityLogWriterFastLogger.isTraceEnabled()).isFalse();
    assertThat(securityLogWriterFastLogger.isDebugEnabled()).isFalse();
    assertThat(securityLogWriterFastLogger.isInfoEnabled()).isTrue();
    assertThat(securityLogWriterFastLogger.isWarnEnabled()).isTrue();
    assertThat(securityLogWriterFastLogger.isErrorEnabled()).isTrue();
    assertThat(securityLogWriterFastLogger.isFatalEnabled()).isTrue();
  }

  @Test
  public void mainLogWriterLogsToMainLogFile() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // CONFIG level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // FINE level

    distributionConfig.setLogLevel(FINE.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());

    message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(ERROR.intLevel());

    message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void securityLogWriterLogsToMainLogFile() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // CONFIG level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // FINE level

    distributionConfig.setLogLevel(FINE.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void geodeLoggerLogsToMainLogFile() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // CONFIG level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.INFO);

    String message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // FINE level

    distributionConfig.setLogLevel(FINE.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.ERROR);

    message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void applicationLoggerLogsToMainLogFile() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // CONFIG level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(CONFIG.intLevel());
    assertThat(applicationLogger.getLevel()).isEqualTo(Level.INFO);

    String message = createMessage(Level.TRACE);
    applicationLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    applicationLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    applicationLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    applicationLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    applicationLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    applicationLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // FINE level

    distributionConfig.setLogLevel(FINE.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(applicationLogger.getLevel()).isEqualTo(Level.INFO);

    message = createMessage(Level.TRACE);
    applicationLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    applicationLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    applicationLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    applicationLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    applicationLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    applicationLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(applicationLogger.getLevel()).isEqualTo(Level.INFO);

    message = createMessage(Level.TRACE);
    applicationLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    applicationLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    applicationLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    applicationLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    applicationLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    applicationLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void mainLogWriterLogsToMainLogFileWithMainLogLevelFine() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // FINE level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());

    String message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(ERROR.intLevel());

    message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void securityLogWriterLogsToMainLogFileWithMainLogLevelFine() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void geodeLoggerLogsToMainLogFileWithMainLogLevelFine() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // FINE level

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    String message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR level

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.ERROR);

    message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void mainLogWriterLogsToMainLogFileWithMainLogLevelDebug() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, Level.DEBUG.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // DEBUG LEVEL

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());

    String message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR LEVEL

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(logWriter.getLogWriterLevel()).isEqualTo(ERROR.intLevel());

    message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void securityLogWriterLogsToMainLogFileWithMainLogLevelDebug() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, Level.DEBUG.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void geodeLoggerLogsToMainLogFileWithMainLogLevelDebug() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, Level.DEBUG.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    // DEBUG LEVEL

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    String message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    // ERROR LEVEL

    distributionConfig.setLogLevel(ERROR.intLevel());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(ERROR.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.ERROR);

    message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void logsToDifferentLogFilesWithMainLogLevelFine() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());
    config.setProperty(SECURITY_LOG_FILE, securityLogFilePath);

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> {
      assertThat(mainLogFile).exists();
      assertThat(securityLogFile).exists();
    });

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(CONFIG.intLevel());

    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  @Test
  public void logsToDifferentLogFilesWithBothLogLevelsFine() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());
    config.setProperty(SECURITY_LOG_FILE, securityLogFilePath);
    config.setProperty(SECURITY_LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> {
      assertThat(mainLogFile).exists();
      assertThat(securityLogFile).exists();
    });

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(FINE.intLevel());

    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());
    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());
    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(securityLogFile).contains(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(securityLogFile).doesNotContain(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a less granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void mainLogWriterLogsToMainLogFileWithHigherSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());
    config.setProperty(SECURITY_LOG_LEVEL, INFO.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(INFO.intLevel());

    assertThat(logWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());

    String message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a less granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void securityLogWriterLogsToMainLogFileWithHigherSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());
    config.setProperty(SECURITY_LOG_LEVEL, INFO.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(INFO.intLevel());

    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a less granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void geodeLoggerLogsToMainLogFileWithHigherSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, FINE.name());
    config.setProperty(SECURITY_LOG_LEVEL, INFO.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(FINE.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(INFO.intLevel());

    assertThat(geodeLogger.getLevel()).isEqualTo(Level.DEBUG);

    String message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a more granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void mainLogWriterLogsToMainLogFileWithLowerSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, INFO.name());
    config.setProperty(SECURITY_LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger logWriter = (LogWriterLogger) system.getLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(INFO.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(FINE.intLevel());

    assertThat(logWriter.getLogWriterLevel()).isEqualTo(INFO.intLevel());

    String message = createMessage(FINEST);
    logWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    logWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    logWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(CONFIG);
    logWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    logWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    logWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    logWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    logWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a more granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void securityLogWriterLogsToMainLogFileWithLowerSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, INFO.name());
    config.setProperty(SECURITY_LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();
    LogWriterLogger securityLogWriter = (LogWriterLogger) system.getSecurityLogWriter();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(INFO.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(FINE.intLevel());

    assertThat(securityLogWriter.getLogWriterLevel()).isEqualTo(FINE.intLevel());

    String message = createMessage(FINEST);
    securityLogWriter.finest(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINER);
    securityLogWriter.finer(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(FINE);
    securityLogWriter.fine(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(CONFIG);
    securityLogWriter.config(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(INFO);
    securityLogWriter.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(WARNING);
    securityLogWriter.warning(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(ERROR);
    securityLogWriter.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(SEVERE);
    securityLogWriter.severe(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  /**
   * tests scenario where security log has not been set but a level has been set to a more granular
   * level than that of the regular log. Verifies that the correct logs for security show up in the
   * regular log as expected
   */
  @Test
  public void geodeLoggerLogsToMainLogFileWithLowerSecurityLogLevel() {
    Properties config = new Properties();
    config.setProperty(LOCATORS, "");
    config.setProperty(LOG_FILE, mainLogFilePath);
    config.setProperty(LOG_LEVEL, INFO.name());
    config.setProperty(SECURITY_LOG_LEVEL, FINE.name());

    system = (InternalDistributedSystem) DistributedSystem.connect(config);

    DistributionConfig distributionConfig = system.getConfig();

    await().untilAsserted(() -> assertThat(mainLogFile).exists());

    assertThat(distributionConfig.getLogLevel()).isEqualTo(INFO.intLevel());
    assertThat(distributionConfig.getSecurityLogLevel()).isEqualTo(FINE.intLevel());

    assertThat(geodeLogger.getLevel()).isEqualTo(Level.INFO);

    String message = createMessage(Level.TRACE);
    geodeLogger.trace(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.DEBUG);
    geodeLogger.debug(message);
    LogFileAssert.assertThat(mainLogFile).doesNotContain(message);

    message = createMessage(Level.INFO);
    geodeLogger.info(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.WARN);
    geodeLogger.warn(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.ERROR);
    geodeLogger.error(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);

    message = createMessage(Level.FATAL);
    geodeLogger.fatal(message);
    LogFileAssert.assertThat(mainLogFile).contains(message);
  }

  private String createMessage(LogWriterLevel logLevel) {
    return prefix + logLevel.name() + " [" + COUNTER.incrementAndGet() + "]";
  }

  private String createMessage(Level level) {
    return prefix + level.name() + " [" + COUNTER.incrementAndGet() + "]";
  }
}
