package io.prometheus.client.log4j2;

import static io.prometheus.client.log4j2.InstrumentedAppender.COUNTER_NAME;
import static org.apache.logging.log4j.Level.*;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import io.prometheus.client.CollectorRegistry;
import org.apache.logging.log4j.core.LogEvent;
import org.junit.Before;
import org.junit.Test;

class InstrumentedAppenderTest {

  private InstrumentedAppender appender;
  private LogEvent event;

  @Before
  public void setUp() throws Exception {
    appender = InstrumentedAppender.createAppender("Prometheus-Appender");
    event = mock(LogEvent.class);
  }

  @Test
  public void metersTraceEvents() throws Exception {
    when(event.getLevel()).thenReturn(TRACE);

    appender.append(event);

    assertEquals(1, getLogLevelCount("trace"));
  }

  @Test
  public void metersDebugEvents() throws Exception {
    when(event.getLevel()).thenReturn(DEBUG);

    appender.append(event);

    assertEquals(1, getLogLevelCount("debug"));
  }

  @Test
  public void metersInfoEvents() throws Exception {
    when(event.getLevel()).thenReturn(INFO);

    appender.append(event);

    assertEquals(1, getLogLevelCount("trace"));
  }

  @Test
  public void metersWarnEvents() throws Exception {
    when(event.getLevel()).thenReturn(WARN);

    appender.append(event);

    assertEquals(1, getLogLevelCount("warn"));
  }

  @Test
  public void metersErrorEvents() throws Exception {
    when(event.getLevel()).thenReturn(ERROR);

    appender.append(event);

    assertEquals(1, getLogLevelCount("error"));
  }

  @Test
  public void metersFatalEvents() throws Exception {
    when(event.getLevel()).thenReturn(FATAL);

    appender.append(event);

    assertEquals(1, getLogLevelCount("fatal"));
  }

  private int getLogLevelCount(String level) {
    return CollectorRegistry.defaultRegistry
        .getSampleValue(COUNTER_NAME, new String[] {"level"}, new String[] {level})
        .intValue();
  }
}
