package org.apache.maven.it;

/*
 * 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 java.io.File;

import org.apache.maven.it.Verifier;
import org.apache.maven.it.util.ResourceExtractor;

/**
 * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-3729">MNG-3729</a>.
 * <br/><br/>
 * Complicated use case, but say
 * you have an aggregator plugin that forks a lifecycle, and this aggregator is bound to the main lifecycle in a
 * multimodule build. Further, say you call another plugin directly from the command line for this multimodule build,
 * which forks a new lifecycle (like assembly:assembly).
 * <br/><br/>
 * When the directly invoked aggregator forks, it will force the
 * forked lifecycle phase to be run for each project in the reactor, regardless of whether this causes the bound
 * aggregator mojo to run multiple times. When the bound aggregator executes for the first project (this will be in an
 * inner fork, two levels removed from the main lifecycle execution) it will set the executionProject to null for the
 * current project (which is one of the reactorProjects member instances). On the second pass, as it tries to execute
 * the inner aggregator's forked lifecycle for the second project in the reactor, one of the reactorProjects'
 * project.getExecutionProject() results will be null. If any of the mojos in this inner lifecycle fork requires
 * dependency resolution, it will cause a NullPointerException in the DefaultPluginManager when it tries to resolve the
 * dependencies for the current project. This happened in 2.0.10-RC11 (which was the predecessor to 2.1.0-RC12, since
 * the version was renamed while the release process was in mid-execution). It did not happen in 2.0.9, and was fixed in
 * 2.1.0-RC12.
 *
 * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
 * @author jdcasey
 */
public class MavenITmng3729MultiForkAggregatorsTest
    extends AbstractMavenIntegrationTestCase
{
    public MavenITmng3729MultiForkAggregatorsTest()
    {
        super( "(2.0.8,3.0-alpha-1),[3.0-alpha-3,)" ); // only test in 2.0.9+
    }

    public void testitMNG3729 ()
        throws Exception
    {
        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-3729" );
        File pluginDir = new File( testDir, "maven-mng3729-plugin" );
        File projectDir = new File( testDir, "projects" );

        Verifier verifier;

        verifier = newVerifier( pluginDir.getAbsolutePath(), "remote" );

        verifier.executeGoal( "install" );
        verifier.verifyErrorFreeLog();
        verifier.resetStreams();

        verifier = newVerifier( projectDir.getAbsolutePath() );

        verifier.executeGoal( "package" );
        verifier.verifyErrorFreeLog();
        verifier.resetStreams();
    }
}
