package org.graylog2.log4j2;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;

public class GelfAppenderTest {
    private Logger logger;

    @Before
    public void setUp() {
        logger = LogManager.getLogger("test");
    }

    @Test
    public void testLog() {
        logger.info("Hello World");
    }

    @Test
    public void testMarker() {
        final Marker parent = MarkerManager.getMarker("PARENT");
        final Marker marker = MarkerManager.getMarker("TEST").addParents(parent);
        logger.info(marker, "Hello World");
    }

    @Test
    public void testException() {
        try {
            throw new Exception("Test", new Exception("Cause", new RuntimeException("Inner Cause")));
        } catch (Exception e) {
            e.fillInStackTrace();
            logger.error("Hello World", e);
        }
    }

    @Test
    public void testThreadContext() {
        ThreadContext.push("Message only");
        ThreadContext.push("int", 1);
        ThreadContext.push("int-long-string", 1, 2L, "3");
        ThreadContext.put("key", "value");

        logger.info("Hello World");

        ThreadContext.clearAll();
    }

    @Test
    public void testIsFqdn() {
        assertThat(GelfAppender.isFQDN("host"), equalTo(false));
        assertThat(GelfAppender.isFQDN("123.123.56.53"), equalTo(false));
        assertThat(GelfAppender.isFQDN("::1"), equalTo(false));
        assertThat(GelfAppender.isFQDN("1080:0:0:0:8:800:200C:417A"), equalTo(false));
        assertThat(GelfAppender.isFQDN("2001:cdba::3257:9652"), equalTo(false));
        assertThat(GelfAppender.isFQDN("::ffff:0:10.0.0.3"), equalTo(false));
        assertThat(GelfAppender.isFQDN("2001:db8:122:344::192.0.2.33"), equalTo(false));
        assertThat(GelfAppender.isFQDN("host.example.com"), equalTo(true));
    }

    @AfterClass
    public static void shutdown() throws InterruptedException {
        //need to wait to hope the underlying gelf client pushes the messages.
        Thread.sleep(500);
    }
}