/* * Copyright 2015 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. * * 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.scanner.embedder; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.settings.Proxy; import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; import org.apache.maven.settings.building.DefaultSettingsBuildingRequest; import org.apache.maven.settings.building.SettingsBuilder; import org.apache.maven.settings.building.SettingsBuildingException; import org.apache.maven.settings.building.SettingsSource; import org.junit.Test; import org.kie.scanner.MavenRepositoryConfiguration; import static org.drools.core.util.IoUtils.readFileAsString; import static org.junit.Assert.*; import static org.kie.scanner.embedder.MavenSettings.CUSTOM_SETTINGS_PROPERTY; public class MavenEmbedderTest { private final String EMPTY_SETTINGS = "<settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0\n" + " http://maven.apache.org/xsd/settings-1.0.0.xsd\"/>\n"; @Test public void testExternalRepositories() { String oldSettingsXmlPath = System.getProperty( CUSTOM_SETTINGS_PROPERTY ); try { if (oldSettingsXmlPath != null) { System.clearProperty( CUSTOM_SETTINGS_PROPERTY ); } MavenSettings.reinitSettingsFromString(EMPTY_SETTINGS); final MavenRequest mavenRequest = createMavenRequest(null); final MavenEmbedder embedder = new MavenEmbedderWithRepoMock( mavenRequest ); final MavenExecutionRequest request = embedder.getMavenExecutionRequest(); assertNotNull( request ); final List<ArtifactRepository> remoteRepositories = request.getRemoteRepositories(); assertEquals( 2, remoteRepositories.size() ); for ( ArtifactRepository remoteRepository : remoteRepositories ) { assertTrue( remoteRepository.getId().equals( "central" ) || remoteRepository.getId().equals( "kie-wb-m2-repo" ) ); } } catch ( MavenEmbedderException mee ) { fail( mee.getMessage() ); } finally { if (oldSettingsXmlPath != null) { System.setProperty( CUSTOM_SETTINGS_PROPERTY, oldSettingsXmlPath ); } MavenSettings.reinitSettings(); } } @Test public void testCustomSettingSource() { try { final MavenRequest mavenRequest = createMavenRequest(new SettingsSourceMock( "<settings/>" ) ); final MavenEmbedder embedder = new MavenEmbedderWithRepoMock( mavenRequest ); final MavenExecutionRequest request = embedder.getMavenExecutionRequest(); assertNotNull( request ); assertEquals( "<settings/>", readFileAsString( request.getUserSettingsFile() ).trim() ); } catch ( MavenEmbedderException mee ) { fail( mee.getMessage() ); } } @Test public void testProxies() { String oldSettingsXmlPath = System.getProperty( CUSTOM_SETTINGS_PROPERTY ); try { if (oldSettingsXmlPath != null) { System.clearProperty( CUSTOM_SETTINGS_PROPERTY ); } MavenSettings.reinitSettingsFromString(EMPTY_SETTINGS); final MavenRequest mavenRequest = createMavenRequest(null); final MavenEmbedder embedder = new MavenEmbedderWithProxyMock( mavenRequest ); final MavenExecutionRequest request = embedder.getMavenExecutionRequest(); assertNotNull( request ); final List<Proxy> proxies = request.getProxies(); assertEquals( 1, proxies.size() ); assertEquals( "MyProxy", proxies.get(0).getId() ); } catch ( MavenEmbedderException mee ) { fail( mee.getMessage() ); } finally { if (oldSettingsXmlPath != null) { System.setProperty( CUSTOM_SETTINGS_PROPERTY, oldSettingsXmlPath ); } MavenSettings.reinitSettings(); } } public static abstract class MavenEmbedderMock extends MavenEmbedder { public MavenEmbedderMock( MavenRequest mavenRequest ) throws MavenEmbedderException { super( mavenRequest ); } @Override protected MavenRepositoryConfiguration getMavenRepositoryConfiguration() { return new MavenRepositoryConfiguration(getMavenSettings()); } private Settings getMavenSettings() { String path = getClass().getResource( "." ).toString().substring( "file:".length() ); File testSettingsFile = new File( path + getSettingsFile() ); assertTrue( testSettingsFile.exists() ); SettingsBuilder settingsBuilder = new DefaultSettingsBuilderFactory().newInstance(); DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); request.setUserSettingsFile( testSettingsFile ); try { return settingsBuilder.build( request ).getEffectiveSettings(); } catch ( SettingsBuildingException e ) { throw new RuntimeException( e ); } } protected abstract String getSettingsFile(); } public static class MavenEmbedderWithRepoMock extends MavenEmbedderMock { public MavenEmbedderWithRepoMock( MavenRequest mavenRequest ) throws MavenEmbedderException { super( mavenRequest ); } @Override protected String getSettingsFile() { return "settings_with_repositories.xml"; } } public static class MavenEmbedderWithProxyMock extends MavenEmbedderMock { public MavenEmbedderWithProxyMock( MavenRequest mavenRequest ) throws MavenEmbedderException { super( mavenRequest ); } @Override protected String getSettingsFile() { return "settings_with_proxies.xml"; } } private static MavenRequest createMavenRequest(SettingsSource settingsSource) { MavenRequest mavenRequest = new MavenRequest(); mavenRequest.setLocalRepositoryPath( MavenSettings.getSettings().getLocalRepository() ); mavenRequest.setUserSettingsSource(settingsSource != null ? settingsSource : MavenSettings.getUserSettingsSource()); mavenRequest.setResolveDependencies( true ); mavenRequest.setOffline( true ); return mavenRequest; } public static class SettingsSourceMock implements SettingsSource { private final String settings; public SettingsSourceMock( String settings ) { this.settings = settings; } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream( settings.getBytes( "UTF-8" ) ); } @Override public String getLocation() { return "test"; } } }