001package org.apache.maven.toolchain;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import static org.junit.Assert.assertEquals;
023import static org.mockito.Matchers.anyMap;
024import static org.mockito.Matchers.isA;
025import static org.mockito.Mockito.mock;
026import static org.mockito.Mockito.verify;
027import static org.mockito.Mockito.when;
028
029import java.util.Arrays;
030import java.util.Collections;
031import java.util.HashMap;
032import java.util.List;
033import java.util.Map;
034
035import org.apache.maven.execution.DefaultMavenExecutionRequest;
036import org.apache.maven.execution.MavenExecutionRequest;
037import org.apache.maven.execution.MavenSession;
038import org.apache.maven.toolchain.model.ToolchainModel;
039import org.codehaus.plexus.logging.Logger;
040import org.junit.Before;
041import org.junit.Test;
042import org.mockito.InjectMocks;
043import org.mockito.Mock;
044import org.mockito.MockitoAnnotations;
045
046public class DefaultToolchainManagerTest
047{
048     // Mocks to inject into toolchainManager
049    @Mock
050    private Logger logger;
051
052    @InjectMocks
053    private DefaultToolchainManager toolchainManager;
054
055    @Mock
056    private ToolchainFactory toolchainFactory_basicType;
057
058    @Mock
059    private ToolchainFactory toolchainFactory_rareType;
060
061    @Before
062    public void onSetup() throws Exception
063    {
064        toolchainManager = new DefaultToolchainManager();
065
066        MockitoAnnotations.initMocks( this );
067
068        toolchainManager.factories = new HashMap<String, ToolchainFactory>();
069        toolchainManager.factories.put( "basic", toolchainFactory_basicType );
070        toolchainManager.factories.put( "rare", toolchainFactory_rareType );
071    }
072
073    @Test
074    public void testNoModels()
075    {
076        MavenSession session = mock( MavenSession.class );
077        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
078        when( session.getRequest() ).thenReturn( executionRequest );
079
080        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "unknown", null );
081
082        assertEquals( 0, toolchains.size() );
083    }
084
085    @Test
086    public void testModelNoFactory()
087    {
088        MavenSession session = mock( MavenSession.class );
089        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
090        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
091        toolchainModels.put( "unknown", Collections.singletonList( new ToolchainModel() ) );
092        executionRequest.setToolchains( toolchainModels );
093        when( session.getRequest() ).thenReturn( executionRequest );
094
095        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "unknown", null );
096
097        assertEquals( 0, toolchains.size() );
098        verify( logger ).error( "Missing toolchain factory for type: unknown. Possibly caused by misconfigured project." );
099    }
100
101    @Test
102    public void testModelAndFactory()
103    {
104        MavenSession session = mock( MavenSession.class );
105        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
106        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
107        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
108        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
109        executionRequest.setToolchains( toolchainModels );
110        when( session.getRequest() ).thenReturn( executionRequest );
111
112        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "rare", null );
113
114        assertEquals( 1, toolchains.size() );
115    }
116
117    @Test
118    public void testModelsAndFactory()
119    {
120        MavenSession session = mock( MavenSession.class );
121        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
122        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
123        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
124        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
125        executionRequest.setToolchains( toolchainModels );
126        when( session.getRequest() ).thenReturn( executionRequest );
127
128        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "basic", null );
129
130        assertEquals( 2, toolchains.size() );
131    }
132
133    @Test
134    public void testRequirements()
135        throws Exception
136    {
137        MavenSession session = mock( MavenSession.class );
138        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
139        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
140        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
141        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
142        executionRequest.setToolchains( toolchainModels );
143        when( session.getRequest() ).thenReturn( executionRequest );
144        ToolchainPrivate basicPrivate = mock( ToolchainPrivate.class );
145        when( basicPrivate.matchesRequirements( anyMap() ) ).thenReturn( false ).thenReturn( true );
146        when( toolchainFactory_basicType.createToolchain( isA( ToolchainModel.class ) ) ).thenReturn( basicPrivate );
147
148        List<Toolchain> toolchains =
149            toolchainManager.getToolchains( session, "basic", Collections.singletonMap( "key", "value" ) );
150
151        assertEquals( 1, toolchains.size() );
152    }
153}