JlineJansiConsoleAppenderTest.java

package ch.qos.logback.core.blackbox.appender;

import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;

import ch.qos.logback.core.testUtil.DummyEncoder;
import ch.qos.logback.core.testUtil.XTeeOutputStream;
import org.jline.jansi.AnsiConsole;
import org.jline.jansi.AnsiPrintStream;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.FilterOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;


public class JlineJansiConsoleAppenderTest {

    Context context = new ContextBase();
    ConsoleAppender<Object> ca = new ConsoleAppender<Object>();

    XTeeOutputStream teeOut;
    XTeeOutputStream teeErr;
    PrintStream originalOut;
    PrintStream originalErr;

    @BeforeEach
    public void setUp() {
        originalOut = System.out;
        originalErr = System.err;
    }

    @AfterEach
    public void tearDown() {
        AnsiConsole.systemUninstall();
        System.setOut(originalOut);
        //replace(AnsiConsole.out(), originalOut);
        System.setErr(originalErr);
        //replace(AnsiConsole.err(), originalErr);

    }

    private void replace(AnsiPrintStream ansiPrintStream, OutputStream os) {
        try {
            Field field = FilterOutputStream.class.getDeclaredField("out");
            field.setAccessible(true);
            OutputStream oldOs = (OutputStream) field.get(ansiPrintStream);
            field.set(ansiPrintStream, os);
        } catch (Throwable t) {
            throw new IllegalStateException("Unable to initialize Jansi for testing", t);
        }
    }

    public Appender<Object> getAppender() {
        return new ConsoleAppender<>();
    }

    @Test
    public void jansiSystemOut() {

        DummyEncoder<Object> dummyEncoder = new DummyEncoder<>();
        ca.setEncoder(dummyEncoder);
        ca.setTarget("System.out");
        ca.setContext(context);
        ca.setWithJansi(true);
        //ca.setPreferredJansiClassName(ConsoleAppender.JLINE_JANSI_ANSI_CONSOLE_CLASS_NAME);
        ca.start();
        Assertions.assertTrue(ca.getOutputStream() instanceof AnsiPrintStream);
        ca.doAppend(new Object());
        // broken in Jansi 2.x as it uses java.io.FileDescriptor instead of System.out
        //Assertions.assertEquals("dummy", teeOut.toString().trim());
    }

    @Test
    public void jansiSystemErr() {
        DummyEncoder<Object> dummyEncoder = new DummyEncoder<>();
        ca.setEncoder(dummyEncoder);
        ca.setTarget("System.err");
        ca.setContext(context);
        ca.setWithJansi(true);
        //ca.setPreferredJansiClassName(ConsoleAppender.FUSESOURCE_JANSI_ANSI_CONSOLE_CLASS_NAME);
        ca.start();
        Assertions.assertTrue(ca.getOutputStream() instanceof AnsiPrintStream);
        ca.doAppend(new Object());
        // broken in Jansi 2.x as it uses java.io.FileDescriptor instead of System.err
        //Assertions.assertEquals("dummy", teeErr.toString().trim());
    }

}