/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.
*/
package org.kie.workbench.common.services.backend.builder.ala;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import org.guvnor.ala.pipeline.Input;
import org.guvnor.ala.pipeline.Pipeline;
import org.guvnor.ala.pipeline.execution.PipelineExecutor;
import org.guvnor.ala.registry.PipelineRegistry;
import org.guvnor.common.services.project.model.Project;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.uberfire.backend.vfs.Path;
import org.uberfire.workbench.events.ResourceChange;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith( MockitoJUnitRunner.class )
public class BuildPipelineInvokerTest
extends BuildPipelineTestBase {
@Mock
private BuildPipelineInitializer pipelineInitializer;
@Mock
private PipelineRegistry pipelineRegistry;
private BuildPipelineInvoker pipelineInvoker;
@Mock
private PipelineExecutor pipelineExecutor;
@Mock
private Pipeline pipeline;
@Mock
private BuildPipelineInvoker.LocalBuildRequest buildRequest;
@Mock
private Project project;
@Mock
private Path rootPath;
@Mock
private Path resource;
@Mock
private LocalBinaryConfig localBinaryConfig;
private Input input;
@Before
public void setUp( ) {
pipelineInvoker = new BuildPipelineInvoker( pipelineExecutor, pipelineRegistry );
when( pipelineRegistry.getPipelineByName( BuildPipelineInitializer.LOCAL_BUILD_PIPELINE ) ).thenReturn( pipeline );
when( buildRequest.getProject( ) ).thenReturn( project );
when( project.getRootPath( ) ).thenReturn( rootPath );
when( rootPath.toURI( ) ).thenReturn( ROOT_PATH_URI );
when( resource.toURI( ) ).thenReturn( RESOURCE_URI_1 );
}
@Test
public void testFullBuildRequest( ) {
when( buildRequest.getBuildType( ) ).thenReturn( LocalBuildConfig.BuildType.FULL_BUILD );
// the pipeline should be invoked with this input.
input = createFullBuildInput( ROOT_PATH_URI );
preparePipeline( input );
LocalBinaryConfig result = pipelineInvoker.invokeLocalBuildPipeLine( buildRequest );
verifyPipelineInvocation( localBinaryConfig, result );
}
@Test
public void testFullBuildAndDeployValidatedRequest( ) {
testFullBuildAndDeployRequest( LocalBuildConfig.DeploymentType.VALIDATED );
}
@Test
public void testFullBuildAndDeployForcedRequest( ) {
testFullBuildAndDeployRequest( LocalBuildConfig.DeploymentType.FORCED );
}
private void testFullBuildAndDeployRequest( LocalBuildConfig.DeploymentType deploymentType ) {
when( buildRequest.getBuildType( ) ).thenReturn( LocalBuildConfig.BuildType.FULL_BUILD_AND_DEPLOY );
when( buildRequest.getDeploymentType( ) ).thenReturn( deploymentType );
when( buildRequest.isSuppressHandlers( ) ).thenReturn( false );
// the pipeline should be invoked with this input.
input = createFullBuildAndDeployInput( ROOT_PATH_URI, deploymentType.name( ), false );
preparePipeline( input );
LocalBinaryConfig result = pipelineInvoker.invokeLocalBuildPipeLine( buildRequest );
verifyPipelineInvocation( localBinaryConfig, result );
}
@Test
public void testIncrementalBuildAddResource( ) {
testIncrementalBuildResourceRequest( LocalBuildConfig.BuildType.INCREMENTAL_ADD_RESOURCE, resource );
}
@Test
public void testIncrementalBuildDeleteResource( ) {
testIncrementalBuildResourceRequest( LocalBuildConfig.BuildType.INCREMENTAL_DELETE_RESOURCE, resource );
}
@Test
public void testIncrementalBuildUpdateResource( ) {
testIncrementalBuildResourceRequest( LocalBuildConfig.BuildType.INCREMENTAL_UPDATE_RESOURCE, resource );
}
@Test
public void testIncrementalBuildResourceChanges( ) {
Map< Path, Collection< ResourceChange > > resourceChanges = createResourceChanges( changes );
when( buildRequest.getBuildType( ) ).thenReturn( LocalBuildConfig.BuildType.INCREMENTAL_BATCH_CHANGES );
when( buildRequest.isSingleResource( ) ).thenReturn( false );
when( buildRequest.getResourceChanges( ) ).thenReturn( resourceChanges );
// the pipeline should be invoked with this input.
input = createBatchChangesInput( ROOT_PATH_URI, LocalBuildConfig.BuildType.INCREMENTAL_BATCH_CHANGES.name( ), changes );
preparePipeline( input );
LocalBinaryConfig result = pipelineInvoker.invokeLocalBuildPipeLine( buildRequest );
verifyPipelineInvocation( localBinaryConfig, result );
}
private void testIncrementalBuildResourceRequest( LocalBuildConfig.BuildType buildType, Path resource ) {
when( buildRequest.getBuildType( ) ).thenReturn( buildType );
when( buildRequest.getResource( ) ).thenReturn( resource );
when( buildRequest.isSingleResource( ) ).thenReturn( true );
// the pipeline should be invoked with this input.
input = createIncrementalBuildInput( ROOT_PATH_URI, RESOURCE_URI_1, buildType.name( ) );
preparePipeline( input );
LocalBinaryConfig result = pipelineInvoker.invokeLocalBuildPipeLine( buildRequest );
verifyPipelineInvocation( localBinaryConfig, result );
}
private void preparePipeline( Input input ) {
doAnswer( new Answer< Void >( ) {
public Void answer( InvocationOnMock invocation ) {
Consumer consumer = ( Consumer ) invocation.getArguments( )[ 2 ];
consumer.accept( localBinaryConfig );
return null;
}
} ).when( pipelineExecutor ).execute( eq( input ), eq( pipeline ), any( Consumer.class ) );
}
private void verifyPipelineInvocation( LocalBinaryConfig expectedResult, LocalBinaryConfig result ) {
assertEquals( expectedResult, result );
verify( pipelineExecutor, times( 1 ) ).execute( eq( input ), eq( pipeline ), any( Consumer.class ) );
}
}