package org.apache.maven.plugins.help;
/*
* 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 static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.monitor.logging.DefaultLog;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.components.interactivity.InputHandler;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.LoggerManager;
/**
* Test class for the evaluate mojo of the Help Plugin.
*/
public class EvaluateMojoTest
extends AbstractMojoTestCase
{
private InterceptingLog interceptingLogger;
@Override
protected void setUp()
throws Exception
{
super.setUp();
interceptingLogger =
new InterceptingLog( getContainer().lookup( LoggerManager.class ).getLoggerForComponent( Mojo.ROLE ) );
}
/**
* Tests evaluation of an expression in interactive mode with a mock input handler.
* @throws Exception in case of errors.
*/
public void testEvaluateWithoutExpression()
throws Exception
{
File testPom = new File( getBasedir(), "target/test-classes/unit/evaluate/plugin-config.xml" );
EvaluateMojo mojo = (EvaluateMojo) lookupMojo( "evaluate", testPom );
InputHandler inputHandler = mock( InputHandler.class );
when( inputHandler.readLine() ).thenReturn( "${project.groupId}", "0" );
ExpressionEvaluator expressionEvaluator = mock( PluginParameterExpressionEvaluator.class );
when( expressionEvaluator.evaluate( anyString() ) ).thenReturn( "My result" );
setUpMojo( mojo, inputHandler, expressionEvaluator );
mojo.execute();
String ls = System.getProperty( "line.separator" );
assertTrue( interceptingLogger.infoLogs.contains( ls + "My result" ) );
assertTrue( interceptingLogger.warnLogs.isEmpty() );
verify( expressionEvaluator ).evaluate( "${project.groupId}" );
verify( inputHandler, times( 2 ) ).readLine();
}
/**
* Tests evaluation of an expression in interactive mode with a mock input handler, when "output" is set.
* @throws Exception in case of errors.
*/
public void testEvaluateWithoutExpressionWithOutput()
throws Exception
{
File testPom = new File( getBasedir(), "target/test-classes/unit/evaluate/plugin-config-output.xml" );
EvaluateMojo mojo = (EvaluateMojo) lookupMojo( "evaluate", testPom );
InputHandler inputHandler = mock( InputHandler.class );
when( inputHandler.readLine() ).thenReturn( "${project.artifactId}", "0" );
ExpressionEvaluator expressionEvaluator = mock( PluginParameterExpressionEvaluator.class );
when( expressionEvaluator.evaluate( anyString() ) ).thenReturn( "My result" );
setUpMojo( mojo, inputHandler, expressionEvaluator );
mojo.execute();
String ls = System.getProperty( "line.separator" );
assertTrue( interceptingLogger.infoLogs.contains( ls + "My result" ) );
assertFalse( interceptingLogger.warnLogs.isEmpty() );
verify( expressionEvaluator ).evaluate( "${project.artifactId}" );
verify( inputHandler, times( 2 ) ).readLine();
}
private void setUpMojo( EvaluateMojo mojo, InputHandler inputHandler, ExpressionEvaluator expressionEvaluator )
throws IllegalAccessException
{
setVariableValueToObject( mojo, "inputHandler", inputHandler );
setVariableValueToObject( mojo, "log", interceptingLogger );
setVariableValueToObject( mojo, "settings", new Settings() );
setVariableValueToObject( mojo, "project", new MavenProjectStub() );
setVariableValueToObject( mojo, "evaluator", expressionEvaluator );
}
private static final class InterceptingLog
extends DefaultLog
{
List<String> infoLogs = new ArrayList<String>();
List<String> warnLogs = new ArrayList<String>();
public InterceptingLog( Logger logger )
{
super( logger );
}
@Override
public void info( CharSequence content )
{
super.info( content );
infoLogs.add( content.toString() );
}
@Override
public void warn( CharSequence content )
{
super.warn( content );
warnLogs.add( content.toString() );
}
}
}