Package org.apache.continuum.buildagent.taskqueue.execution

Source Code of org.apache.continuum.buildagent.taskqueue.execution.BuildProjectTaskExecutorTest

package org.apache.continuum.buildagent.taskqueue.execution;

/*
* 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.continuum.buildagent.build.execution.ContinuumAgentBuildExecutor;
import org.apache.continuum.buildagent.build.execution.manager.BuildAgentBuildExecutorManager;
import org.apache.continuum.buildagent.buildcontext.BuildContext;
import org.apache.continuum.buildagent.buildcontext.manager.BuildContextManager;
import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
import org.apache.continuum.buildagent.manager.BuildAgentManager;
import org.apache.continuum.buildagent.model.Installation;
import org.apache.continuum.buildagent.model.LocalRepository;
import org.apache.continuum.buildagent.utils.ContinuumBuildAgentUtil;
import org.apache.continuum.taskqueue.BuildProjectTask;
import org.apache.continuum.utils.build.BuildTrigger;
import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
import org.apache.maven.continuum.model.project.BuildDefinition;
import org.apache.maven.continuum.model.scm.ScmResult;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.spring.PlexusInSpringTestCase;
import org.codehaus.plexus.taskqueue.execution.TaskExecutor;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit3.JUnit3Mockery;
import org.jmock.lib.legacy.ClassImposteriser;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BuildProjectTaskExecutorTest
    extends PlexusInSpringTestCase
{
    private Mockery context;

    private BuildContextManager buildContextManager;

    private BuildAgentBuildExecutorManager buildAgentBuildExecutorManager;

    private BuildAgentConfigurationService buildAgentConfigurationService;

    private BuildAgentManager buildAgentManager;

    protected void setUp()
        throws Exception
    {
        super.setUp();

        context = new JUnit3Mockery();
        context.setImposteriser( ClassImposteriser.INSTANCE );

        buildContextManager = context.mock( BuildContextManager.class );

        buildAgentBuildExecutorManager = context.mock( BuildAgentBuildExecutorManager.class );

        buildAgentConfigurationService = context.mock( BuildAgentConfigurationService.class );

        buildAgentManager = context.mock( BuildAgentManager.class );
    }

    // CONTINUUM-2391
    // Note: The checking of the local repo set in the context is in ContinuumActionStub. If the
    // local repo path is incorrect, an exception will be thrown by the action stub.
    public void testBuildProjectLocalRepository()
        throws Exception
    {
        BuildProjectTaskExecutor buildProjectExecutor = (BuildProjectTaskExecutor) lookup( TaskExecutor.class,
                                                                                           "build-agent" );

        buildProjectExecutor.setBuildAgentBuildExecutorManager( buildAgentBuildExecutorManager );

        buildProjectExecutor.setBuildAgentConfigurationService( buildAgentConfigurationService );

        buildProjectExecutor.setBuildContextManager( buildContextManager );

        buildProjectExecutor.setBuildAgentManager( buildAgentManager );

        final BuildContext buildContext = createBuildContext();

        final List<LocalRepository> localRepos = new ArrayList<LocalRepository>();

        LocalRepository localRepo = createLocalRepository( "temp", "/tmp/.m2/repository", "default" );
        localRepos.add( localRepo );

        localRepo = createLocalRepository( "default", "/home/user/.m2/repository", "default" );
        localRepos.add( localRepo );

        final Map<String, String> masterBuildEnvironments = new HashMap<String, String>();
        masterBuildEnvironments.put( "M2_HOME", "/tmp/apache-maven-2.2.1" );

        final List<Installation> slaveBuildEnvironments = new ArrayList<Installation>();

        final ContinuumAgentBuildExecutor executor = context.mock( ContinuumAgentBuildExecutor.class );
        final File workingDir = new File( "/tmp/data/working-directory/project-test" );
        final MavenProject project = new MavenProject();
        final File outputFile = new File( "/tmp/data/build-output-directory/output.txt" );

        context.checking( new Expectations()
        {
            {
                one( buildContextManager ).getBuildContext( 1 );
                will( returnValue( buildContext ) );

                one( buildAgentManager ).getEnvironments( 1, "maven2" );
                will( returnValue( masterBuildEnvironments ) );

                one( buildAgentConfigurationService ).getAvailableInstallations();
                will( returnValue( slaveBuildEnvironments ) );

                one( buildAgentConfigurationService ).getLocalRepositories();
                will( returnValue( localRepos ) );

                one( buildAgentManager ).shouldBuild( with( any( Map.class ) ) );
                will( returnValue( true ) );

                one( buildAgentBuildExecutorManager ).getBuildExecutor(
                    ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
                will( returnValue( executor ) );

                one( buildAgentConfigurationService ).getWorkingDirectory( 1 );
                will( returnValue( workingDir ) );

                one( executor ).getMavenProject( with( any( File.class ) ), with( any( BuildDefinition.class ) ) );
                will( returnValue( project ) );

                one( buildAgentManager ).startProjectBuild( 1 );

                one( buildAgentConfigurationService ).getBuildOutputFile( 1 );
                will( returnValue( outputFile ) );

                one( buildAgentManager ).returnBuildResult( with( any( Map.class ) ) );

                one( buildContextManager ).removeBuildContext( 1 );
            }
        } );

        try
        {
            buildProjectExecutor.executeTask( createBuildProjectTask() );
        }
        catch ( Exception e )
        {
            fail( "An exception should not have been thrown!" );
        }
    }

    public void testBuildProjectWithConfiguredInstallationsFromBuildAgent()
        throws Exception
    {
        BuildProjectTaskExecutor buildProjectExecutor = (BuildProjectTaskExecutor) lookup( TaskExecutor.class,
                                                                                           "build-agent" );

        buildProjectExecutor.setBuildAgentBuildExecutorManager( buildAgentBuildExecutorManager );

        buildProjectExecutor.setBuildAgentConfigurationService( buildAgentConfigurationService );

        buildProjectExecutor.setBuildContextManager( buildContextManager );

        buildProjectExecutor.setBuildAgentManager( buildAgentManager );

        final BuildContext buildContext = createBuildContext();

        final List<LocalRepository> localRepos = new ArrayList<LocalRepository>();

        LocalRepository localRepo = createLocalRepository( "temp", "/tmp/.m2/repository", "default" );
        localRepos.add( localRepo );

        localRepo = createLocalRepository( "default", "/home/user/.m2/repository", "default" );
        localRepos.add( localRepo );

        final Map<String, String> masterBuildEnvironments = new HashMap<String, String>();
        masterBuildEnvironments.put( "M2_HOME", "/tmp/apache-maven-2.2.1" );

        final List<Installation> slaveBuildEnvironments = new ArrayList<Installation>();

        Installation slaveBuildEnvironment = createInstallation( "M2_HOME", "/home/user/apache-maven-2.2.1" );
        slaveBuildEnvironments.add( slaveBuildEnvironment );

        slaveBuildEnvironment = createInstallation( "EXTRA_VAR", "/home/user/extra" );
        slaveBuildEnvironments.add( slaveBuildEnvironment );

        final ContinuumAgentBuildExecutor executor = context.mock( ContinuumAgentBuildExecutor.class );
        final File workingDir = new File( "/tmp/data/working-directory/project-test" );
        final MavenProject project = new MavenProject();
        final File outputFile = new File( "/tmp/data/build-output-directory/output.txt" );

        context.checking( new Expectations()
        {
            {
                one( buildContextManager ).getBuildContext( 1 );
                will( returnValue( buildContext ) );

                one( buildAgentManager ).getEnvironments( 1, "maven2" );
                will( returnValue( masterBuildEnvironments ) );

                one( buildAgentConfigurationService ).getAvailableInstallations();
                will( returnValue( slaveBuildEnvironments ) );

                one( buildAgentConfigurationService ).getLocalRepositories();
                will( returnValue( localRepos ) );

                one( buildAgentManager ).shouldBuild( with( any( Map.class ) ) );
                will( returnValue( true ) );

                one( buildAgentBuildExecutorManager ).getBuildExecutor(
                    ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
                will( returnValue( executor ) );

                one( buildAgentConfigurationService ).getWorkingDirectory( 1 );
                will( returnValue( workingDir ) );

                one( executor ).getMavenProject( with( any( File.class ) ), with( any( BuildDefinition.class ) ) );
                will( returnValue( project ) );

                one( buildAgentManager ).startProjectBuild( 1 );

                one( buildAgentConfigurationService ).getBuildOutputFile( 1 );
                will( returnValue( outputFile ) );

                one( buildAgentManager ).returnBuildResult( with( any( Map.class ) ) );

                one( buildContextManager ).removeBuildContext( 1 );
            }
        } );

        try
        {
            buildProjectExecutor.executeTask( createBuildProjectTask() );

            Map<String, String> environments = (Map<String, String>) buildContext.getActionContext().get(
                ContinuumBuildAgentUtil.KEY_ENVIRONMENTS );
            assertEquals( 2, environments.size() );
            assertTrue( environments.containsKey( "M2_HOME" ) );
            assertTrue( environments.containsKey( "EXTRA_VAR" ) );
            // shows that build agent's environment variables overwrites Continuum Master's environment variables
            assertEquals( "/home/user/apache-maven-2.2.1", environments.get( "M2_HOME" ) );
            assertEquals( "/home/user/extra", environments.get( "EXTRA_VAR" ) );
        }
        catch ( Exception e )
        {
            fail( "An exception should not have been thrown!" );
        }
    }

    public void testBuildProjectWithNoConfiguredInstallationsFromBuildAgent()
        throws Exception
    {
        BuildProjectTaskExecutor buildProjectExecutor = (BuildProjectTaskExecutor) lookup( TaskExecutor.class,
                                                                                           "build-agent" );

        buildProjectExecutor.setBuildAgentBuildExecutorManager( buildAgentBuildExecutorManager );

        buildProjectExecutor.setBuildAgentConfigurationService( buildAgentConfigurationService );

        buildProjectExecutor.setBuildContextManager( buildContextManager );

        buildProjectExecutor.setBuildAgentManager( buildAgentManager );

        final BuildContext buildContext = createBuildContext();

        final List<LocalRepository> localRepos = new ArrayList<LocalRepository>();

        LocalRepository localRepo = createLocalRepository( "temp", "/tmp/.m2/repository", "default" );
        localRepos.add( localRepo );

        localRepo = createLocalRepository( "default", "/home/user/.m2/repository", "default" );
        localRepos.add( localRepo );

        final Map<String, String> masterBuildEnvironments = new HashMap<String, String>();
        masterBuildEnvironments.put( "M2_HOME", "/tmp/apache-maven-2.2.1" );

        final List<Installation> slaveBuildEnvironments = new ArrayList<Installation>();

        final ContinuumAgentBuildExecutor executor = context.mock( ContinuumAgentBuildExecutor.class );
        final File workingDir = new File( "/tmp/data/working-directory/project-test" );
        final MavenProject project = new MavenProject();
        final File outputFile = new File( "/tmp/data/build-output-directory/output.txt" );

        context.checking( new Expectations()
        {
            {
                one( buildContextManager ).getBuildContext( 1 );
                will( returnValue( buildContext ) );

                one( buildAgentManager ).getEnvironments( 1, "maven2" );
                will( returnValue( masterBuildEnvironments ) );

                one( buildAgentConfigurationService ).getAvailableInstallations();
                will( returnValue( slaveBuildEnvironments ) );

                one( buildAgentConfigurationService ).getLocalRepositories();
                will( returnValue( localRepos ) );

                one( buildAgentManager ).shouldBuild( with( any( Map.class ) ) );
                will( returnValue( true ) );

                one( buildAgentBuildExecutorManager ).getBuildExecutor(
                    ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
                will( returnValue( executor ) );

                one( buildAgentConfigurationService ).getWorkingDirectory( 1 );
                will( returnValue( workingDir ) );

                one( executor ).getMavenProject( with( any( File.class ) ), with( any( BuildDefinition.class ) ) );
                will( returnValue( project ) );

                one( buildAgentManager ).startProjectBuild( 1 );

                one( buildAgentConfigurationService ).getBuildOutputFile( 1 );
                will( returnValue( outputFile ) );

                one( buildAgentManager ).returnBuildResult( with( any( Map.class ) ) );

                one( buildContextManager ).removeBuildContext( 1 );
            }
        } );

        try
        {
            buildProjectExecutor.executeTask( createBuildProjectTask() );

            Map<String, String> environments = (Map<String, String>) buildContext.getActionContext().get(
                ContinuumBuildAgentUtil.KEY_ENVIRONMENTS );
            assertEquals( 1, environments.size() );
            assertTrue( environments.containsKey( "M2_HOME" ) );
            assertEquals( "/tmp/apache-maven-2.2.1", environments.get( "M2_HOME" ) );
        }
        catch ( Exception e )
        {
            fail( "An exception should not have been thrown!" );
        }
    }

    private BuildProjectTask createBuildProjectTask()
    {
        BuildProjectTask task = new BuildProjectTask( 1, 1, new BuildTrigger( 1 ), "Test Project",
                                                      "Default Build Definition", new ScmResult(), 1 );
        return task;
    }

    private BuildContext createBuildContext()
    {
        BuildContext context = new BuildContext();
        context.setProjectId( 1 );
        context.setProjectVersion( "1.0-SNAPSHOT" );
        context.setBuildDefinitionId( 1 );
        context.setBuildFile( "pom.xml" );
        context.setExecutorId( ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
        context.setGoals( "clean intall" );
        context.setArguments( "--batch --non-recursive" );
        context.setScmUrl( "scm:svn:http://svn.example.com/repos/dummy/trunk" );
        context.setScmUsername( "" );
        context.setScmPassword( "" );
        context.setBuildFresh( false );
        context.setProjectGroupId( 1 );
        context.setProjectGroupName( "Test Project Group" );
        context.setScmRootAddress( "scm:svn:http://svn.example.com/repos/dummy" );
        context.setScmRootId( 1 );
        context.setProjectName( "Test Project" );
        context.setProjectState( 1 );
        context.setTrigger( 1 );
        context.setUsername( "" );
        context.setLocalRepository( "default" );
        context.setBuildNumber( 1 );

        ScmResult scmResult = new ScmResult();
        scmResult.setSuccess( true );

        context.setScmResult( scmResult );
        context.setLatestUpdateDate( Calendar.getInstance().getTime() );
        context.setBuildAgentUrl( "http://localhost:8181/continuum-buildagent/xmlrpc" );
        context.setMaxExecutionTime( 7200 );
        context.setBuildDefinitionLabel( "Default Build Definition" );
        context.setScmTag( "scm:svn:http://svn.example.com/repos/dummy/tags" );

        return context;
    }

    private LocalRepository createLocalRepository( String name, String locataion, String layout )
    {
        LocalRepository localRepository = new LocalRepository();
        localRepository.setName( name );
        localRepository.setLocation( locataion );
        localRepository.setLayout( layout );
        return localRepository;
    }

    private Installation createInstallation( String varName, String varValue )
    {
        Installation installation = new Installation();
        installation.setVarName( varName );
        installation.setVarValue( varValue );
        return installation;
    }
}
TOP

Related Classes of org.apache.continuum.buildagent.taskqueue.execution.BuildProjectTaskExecutorTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.