/*
* 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.service;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import org.guvnor.common.services.project.builder.model.BuildResults;
import org.guvnor.common.services.project.builder.model.IncrementalBuildResults;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.project.service.DeploymentMode;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.services.backend.builder.ala.BuildPipelineInvoker;
import org.kie.workbench.common.services.backend.builder.ala.LocalBinaryConfig;
import org.kie.workbench.common.services.backend.builder.ala.LocalBuildConfig;
import org.kie.workbench.common.services.backend.builder.core.DeploymentVerifier;
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 BuildServiceHelperTest {
@Mock
private BuildPipelineInvoker pipelineInvoker;
@Mock
private DeploymentVerifier deploymentVerifier;
private BuildServiceHelper serviceHelper;
@Mock
private Project project;
@Mock
private LocalBinaryConfig localBinaryConfig;
@Mock
private BuildResults buildResults;
@Mock
private IncrementalBuildResults incrementalBuildResults;
@Mock
private Map< Path, Collection< ResourceChange > > resourceChanges;
@Mock
private Path resource;
private BuildPipelineInvoker.LocalBuildRequest expectedRequest;
@Before
public void setUp( ) {
serviceHelper = new BuildServiceHelper( pipelineInvoker, deploymentVerifier );
}
@Test
public void testLocalBuild( ) {
prepareLocalFullBuild( );
when( localBinaryConfig.getBuildResults( ) ).thenReturn( buildResults );
BuildResults result = serviceHelper.localBuild( project );
assertEquals( buildResults, result );
verify( pipelineInvoker, times( 1 ) ).invokeLocalBuildPipeLine( eq( expectedRequest ), any( Consumer.class ) );
}
@Test
public void testLocalBuildWithConsumer( ) {
prepareLocalFullBuild( );
serviceHelper.localBuild( project, new Consumer< LocalBinaryConfig >( ) {
@Override
public void accept( LocalBinaryConfig result ) {
// the returned result should the same as the localBinaryConfig produced by the PipelineInvoker.
assertEquals( localBinaryConfig, result );
}
} );
verify( pipelineInvoker, times( 1 ) ).invokeLocalBuildPipeLine( eq( expectedRequest ), any( Consumer.class ) );
}
private void prepareLocalFullBuild( ) {
expectedRequest = BuildPipelineInvoker.LocalBuildRequest.newFullBuildRequest( project );
preparePipelineInvocation( expectedRequest );
}
@Test
public void testLocalBuildAndDeployForced( ) {
prepareBuildAndDeploy( project, LocalBuildConfig.DeploymentType.FORCED, false );
BuildResults result = serviceHelper.localBuildAndDeploy( project, DeploymentMode.FORCED, false );
verifyBuildAndDeploy( result );
}
@Test
public void testLocalBuildAndDeployValidated( ) {
prepareBuildAndDeploy( project, LocalBuildConfig.DeploymentType.VALIDATED, false );
BuildResults result = serviceHelper.localBuildAndDeploy( project, DeploymentMode.VALIDATED, false );
verifyBuildAndDeploy( result );
}
private void prepareBuildAndDeploy( Project project, LocalBuildConfig.DeploymentType deploymentType, boolean suppressHandlers ) {
expectedRequest = BuildPipelineInvoker.LocalBuildRequest.newFullBuildAndDeployRequest( project, deploymentType, suppressHandlers );
preparePipelineInvocation( expectedRequest );
when( localBinaryConfig.getBuildResults( ) ).thenReturn( buildResults );
}
private void verifyBuildAndDeploy( BuildResults result ) {
assertEquals( buildResults, result );
verify( pipelineInvoker, times( 1 ) ).invokeLocalBuildPipeLine( eq( expectedRequest ), any( Consumer.class ) );
}
@Test
public void testLocalBuildWithAddResource( ) {
testLocalBuildWithResource( project, LocalBuildConfig.BuildType.INCREMENTAL_ADD_RESOURCE, resource );
}
@Test
public void testLocalBuildWithDeleteResource( ) {
testLocalBuildWithResource( project, LocalBuildConfig.BuildType.INCREMENTAL_DELETE_RESOURCE, resource );
}
@Test
public void testLocalBuildWithUpdateResource( ) {
testLocalBuildWithResource( project, LocalBuildConfig.BuildType.INCREMENTAL_UPDATE_RESOURCE, resource );
}
private void testLocalBuildWithResource( Project project, LocalBuildConfig.BuildType buildType, Path resource ) {
BuildPipelineInvoker.LocalBuildRequest buildRequest =
BuildPipelineInvoker.LocalBuildRequest.newIncrementalBuildRequest( project, buildType, resource );
preparePipelineInvocation( buildRequest );
when( localBinaryConfig.getIncrementalBuildResults( ) ).thenReturn( incrementalBuildResults );
IncrementalBuildResults result = serviceHelper.localBuild( project, buildType, resource );
assertEquals( incrementalBuildResults, result );
verify( pipelineInvoker, times( 1 ) ).invokeLocalBuildPipeLine( eq( buildRequest ), any( Consumer.class ) );
}
@Test
public void testLocalBuildWithResourceChanges( ) {
BuildPipelineInvoker.LocalBuildRequest buildRequest =
BuildPipelineInvoker.LocalBuildRequest.newIncrementalBuildRequest( project, resourceChanges );
preparePipelineInvocation( buildRequest );
when( localBinaryConfig.getIncrementalBuildResults( ) ).thenReturn( incrementalBuildResults );
IncrementalBuildResults result = serviceHelper.localBuild( project, resourceChanges );
assertEquals( incrementalBuildResults, result );
verify( pipelineInvoker, times( 1 ) ).invokeLocalBuildPipeLine( eq( buildRequest ), any( Consumer.class ) );
}
private void preparePipelineInvocation( BuildPipelineInvoker.LocalBuildRequest buildRequest ) {
//emulate the pipeline invocation with the desired params.
doAnswer( new Answer< Void >( ) {
public Void answer( InvocationOnMock invocation ) {
Consumer consumer = ( Consumer ) invocation.getArguments( )[ 1 ];
consumer.accept( localBinaryConfig );
return null;
}
} ).when( pipelineInvoker ).invokeLocalBuildPipeLine( eq( buildRequest ), any( Consumer.class ) );
}
}