package org.apache.maven.surefire.api.booter;

/*
 * 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.
 */

import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
import org.apache.maven.surefire.api.report.ConsoleOutputReceiver;
import org.apache.maven.surefire.api.report.ConsoleStream;
import org.apache.maven.surefire.api.report.ReportEntry;
import org.apache.maven.surefire.api.report.RunListener;
import org.apache.maven.surefire.api.report.RunMode;
import org.apache.maven.surefire.api.report.TestSetReportEntry;

import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN;
import static java.util.Objects.requireNonNull;

/**
 * Encodes the full output of the test run to the stdout stream.
 * <br>
 * This class and the ForkClient contain the full definition of the
 * "wire-level" protocol used by the forked process. The protocol
 * is *not* part of any public api and may change without further
 * notice.
 * <br>
 * This class is threadsafe.
 * <br>
 * The synchronization in the underlying PrintStream (target instance)
 * is used to preserve thread safety of the output stream. To perform
 * multiple writes/prints for a single request, they must
 * synchronize on "target.out" variable in this class.
 *
 * @author Kristian Rosenvold
 */
public class ForkingRunListener
    implements RunListener, ConsoleLogger, ConsoleOutputReceiver, ConsoleStream
{
    private final MasterProcessChannelEncoder target;

    private final boolean trim;

    private volatile RunMode runMode = NORMAL_RUN;

    public ForkingRunListener( MasterProcessChannelEncoder target, boolean trim )
    {
        this.target = target;
        this.trim = trim;
    }

    @Override
    public void testSetStarting( TestSetReportEntry report )
    {
        target.testSetStarting( report, trim );
    }

    @Override
    public void testSetCompleted( TestSetReportEntry report )
    {
        target.sendSystemProperties( report.getSystemProperties() );
        target.testSetCompleted( report, trim );
    }

    @Override
    public void testStarting( ReportEntry report )
    {
        target.testStarting( report, trim );
    }

    @Override
    public void testSucceeded( ReportEntry report )
    {
        target.testSucceeded( report, trim );
    }

    @Override
    public void testAssumptionFailure( ReportEntry report )
    {
        target.testAssumptionFailure( report, trim );
    }

    @Override
    public void testError( ReportEntry report )
    {
        target.testError( report, trim );
    }

    @Override
    public void testFailed( ReportEntry report )
    {
        target.testFailed( report, trim );
    }

    @Override
    public void testSkipped( ReportEntry report )
    {
        target.testSkipped( report, trim );
    }

    @Override
    public void testExecutionSkippedByUser()
    {
        target.stopOnNextTest();
    }

    @Override
    public RunMode markAs( RunMode currentRunMode )
    {
        RunMode runMode = this.runMode;
        this.runMode = requireNonNull( currentRunMode );
        return runMode;
    }

    @Override
    public void writeTestOutput( String output, boolean newLine, boolean stdout )
    {
        if ( stdout )
        {
            target.stdOut( output, newLine );
        }
        else
        {
            target.stdErr( output, newLine );
        }
    }

    @Override
    public boolean isDebugEnabled()
    {
        return true;
    }

    @Override
    public void debug( String message )
    {
        target.consoleDebugLog( message );
    }

    @Override
    public boolean isInfoEnabled()
    {
        return true;
    }

    @Override
    public void info( String message )
    {
        target.consoleInfoLog( message );
    }

    @Override
    public boolean isWarnEnabled()
    {
        return true;
    }

    @Override
    public void warning( String message )
    {
        target.consoleWarningLog( message );
    }

    @Override
    public boolean isErrorEnabled()
    {
        return true;
    }

    @Override
    public void error( String message )
    {
        target.consoleErrorLog( message );
    }

    @Override
    public void error( String message, Throwable t )
    {
        target.consoleErrorLog( message, t );
    }

    @Override
    public void error( Throwable t )
    {
        error( null, t );
    }

    @Override
    public void println( String message )
    {
        writeTestOutput( message, true, true );
    }
}
