blob: cdb5d03a87c761f8955e87990c6cd511b7418629 [file] [log] [blame]
/*
* 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.
*
*/
package org.apache.easyant.core;
import org.apache.easyant.core.ant.listerners.MultiModuleLogger;
import org.apache.easyant.core.configuration.EasyAntConfiguration;
import org.apache.easyant.core.ivy.IvyInstanceHelper;
import org.apache.easyant.core.services.DefaultPluginService;
import org.apache.ivy.Ivy;
import org.apache.ivy.ant.IvyAntSettings;
import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
import org.apache.easyant.core.ivy.EasyantResolutionCacheManager;
import org.apache.tools.ant.BuildLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.input.DefaultInputHandler;
import org.apache.tools.ant.input.PropertyFileInputHandler;
import org.apache.tools.ant.util.ProxySetup;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import static org.apache.easyant.CollectionTestUtil.containsClass;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class EasyAntEngineTest {
private EasyAntConfiguration easyAntConfiguration = new EasyAntConfiguration();
private EasyAntEngine easyantEngine = new EasyAntEngine(easyAntConfiguration);
private Project project = new Project();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Before
public void setUp() throws IOException {
File cache = temporaryFolder.newFolder("build-cache");
project.setProperty("ivy.cache.dir", cache.getAbsolutePath());
}
private void configureEasyAntIvyInstanceForTests() {
easyAntConfiguration.setEasyantIvySettingsUrl(this.getClass().getResource(
"/repositories/easyant-ivysettings-test.xml"));
project.setProperty(EasyAntMagicNames.IGNORE_USER_IVYSETTINGS, "true");
}
@Test
public void shouldAddBuildListener() {
easyAntConfiguration.getListeners().add(MultiModuleLogger.class.getCanonicalName());
easyantEngine.addBuildListeners(project);
assertTrue(containsClass(project.getBuildListeners(), MultiModuleLogger.class));
}
@Test
public void shouldSetInputHandler() {
easyAntConfiguration.setInputHandlerClassname(PropertyFileInputHandler.class.getCanonicalName());
easyantEngine.addInputHandler(project);
assertThat(project.getInputHandler(), instanceOf(PropertyFileInputHandler.class));
}
@Test
public void shouldSetDefaultInputHandler() {
easyantEngine.addInputHandler(project);
assertThat(project.getInputHandler(), instanceOf(DefaultInputHandler.class));
}
@Test
public void shouldCreateLogger() {
easyAntConfiguration.setLoggerClassname(MultiModuleLogger.class.getCanonicalName());
BuildLogger logger = easyantEngine.createLogger();
assertThat(logger, instanceOf(MultiModuleLogger.class));
}
@Test
public void shouldFailIfLoggerDoesntExists() {
expectedException
.expectMessage("The specified logger class a-missing-logger could not be used because Class not found");
easyAntConfiguration.setLoggerClassname("a-missing-logger");
easyantEngine.createLogger();
}
@Test
public void shouldFindFileInCurrentDirectory() throws URISyntaxException {
File startFile = new File(this.getClass().getResource("multimodule/myapp-core").toURI());
File foundFile = easyantEngine.findBuildModule(startFile.getAbsolutePath(), "module.ivy");
assertThat(foundFile.getName(), is("module.ivy"));
assertThat(foundFile.getParentFile().getName(), is("myapp-core"));
}
@Test
public void shouldFindFileInParentDirectory() throws URISyntaxException {
File startFile = new File(this.getClass().getResource("multimodule/myapp-core").toURI());
File foundFile = easyantEngine.findBuildModule(startFile.getAbsolutePath(), "parent.ivy");
assertThat(foundFile.getName(), is("parent.ivy"));
assertThat(foundFile.getParentFile().getName(), is("multimodule"));
}
@Test
public void shouldFailIfNotFound() throws URISyntaxException {
expectedException.expectMessage("Could not locate a build file!");
File startFile = new File(this.getClass().getResource("multimodule/myapp-core").toURI());
easyantEngine.findBuildModule(startFile.getAbsolutePath(), "a-missing-file");
}
@Test
public void shouldConfigurePluginService() throws URISyntaxException {
IvyAntSettings ivyAntSettings = new IvyAntSettings();
ivyAntSettings.setProject(project);
ivyAntSettings.setFile(new File(this.getClass().getResource("/repositories/easyant-ivysettings-test.xml")
.toURI()));
easyantEngine.configurePluginService(project, ivyAntSettings);
assertThat(project.getReference(EasyAntMagicNames.PLUGIN_SERVICE_INSTANCE),
instanceOf(DefaultPluginService.class));
assertThat(easyantEngine.getPluginService(), instanceOf(DefaultPluginService.class));
assertThat(easyantEngine.getPluginService(),
sameInstance(project.getReference(EasyAntMagicNames.PLUGIN_SERVICE_INSTANCE)));
}
@Test
public void shouldConfigureEasyAnt() {
configureEasyAntIvyInstanceForTests();
easyantEngine.configureEasyAnt(project);
assertThat(Thread.currentThread().getPriority(), is(Thread.NORM_PRIORITY));
assertThat(easyAntConfiguration.getCoreLoader(), nullValue());
assertThat(easyAntConfiguration.isProxy(), is(false));
assertEasyAntIsConfigured();
}
@Test
public void shouldConfigureEasyAntWithCustomPriority() {
configureEasyAntIvyInstanceForTests();
easyAntConfiguration.setThreadPriority(10);
easyantEngine.configureEasyAnt(project);
assertThat(Thread.currentThread().getPriority(), is(easyAntConfiguration.getThreadPriority()));
assertEasyAntIsConfigured();
}
@Test
public void shouldConfigureEasyAntWithCustomCoreLoader() {
configureEasyAntIvyInstanceForTests();
easyAntConfiguration.setCoreLoader(this.getClass().getClassLoader());
easyantEngine.configureEasyAnt(project);
assertEasyAntIsConfigured();
assertThat(project.getCoreLoader(), is(this.getClass().getClassLoader()));
}
@Test
public void shouldConfigureEasyAntWhenKeepGoingModeIsTrue() {
configureEasyAntIvyInstanceForTests();
easyAntConfiguration.setKeepGoingMode(true);
easyantEngine.configureEasyAnt(project);
assertEasyAntIsConfigured();
}
@Test
public void shouldEasyAntProjectWhenProxyIsTrue() {
configureEasyAntIvyInstanceForTests();
String oldValue = System.getProperty(ProxySetup.USE_SYSTEM_PROXIES);
System.getProperties().remove(ProxySetup.USE_SYSTEM_PROXIES);
easyAntConfiguration.setProxy(true);
easyantEngine.configureEasyAnt(project);
assertEasyAntIsConfigured();
if (oldValue != null) {
System.setProperty(ProxySetup.USE_SYSTEM_PROXIES, oldValue);
} else {
System.getProperties().remove(ProxySetup.USE_SYSTEM_PROXIES);
}
}
private void assertEasyAntIsConfigured() {
assertThat(project.getCoreLoader(), is(easyAntConfiguration.getCoreLoader()));
assertThat(project.isKeepGoingMode(), is(easyAntConfiguration.isKeepGoingMode()));
assertThat(Boolean.parseBoolean(System.getProperty(ProxySetup.USE_SYSTEM_PROXIES)),
is(easyAntConfiguration.isProxy()));
assertThat(project.getName(), is("EasyAnt"));
}
@Test
public void shouldConfigureEasyAntIvyInstanceWithSettingsFileFromConfiguration() throws URISyntaxException {
File f = new File(this.getClass().getResource("/repositories/easyant-ivysettings-test.xml").toURI());
easyAntConfiguration.setEasyantIvySettingsFile(f.getAbsolutePath());
IvyAntSettings configuredEasyAntIvyInstance = easyantEngine.configureEasyAntIvyInstance(project);
assertThat(project.getReference(EasyAntMagicNames.EASYANT_IVY_INSTANCE), instanceOf(IvyAntSettings.class));
assertThat(project.getProperty(EasyAntMagicNames.EASYANT_DEFAULT_IVYSETTINGS),
is(this.getClass().getResource("/org/apache/easyant/core/default-easyant-ivysettings.xml")
.toExternalForm()));
assertThat(Boolean.valueOf(project.getProperty(EasyAntMagicNames.IGNORE_USER_IVYSETTINGS)), is(false));
assertThat(project.getProperty(EasyAntMagicNames.OFFLINE_EASYANT_RESOLVER),
is(EasyAntConstants.DEFAULT_OFFLINE_EASYANT_RESOLVER));
assertThat(project.getProperty(EasyAntMagicNames.OFFLINE_BASE_DIRECTORY), is(project.getBaseDir()
.getAbsolutePath() + "/offline/"));
IvyAntSettings easyantIvySettings = IvyInstanceHelper.getEasyAntIvyAntSettings(project);
Ivy ivyInstance = easyantIvySettings.getConfiguredIvyInstance(null);
assertThat(ivyInstance.getResolutionCacheManager(), instanceOf(EasyantResolutionCacheManager.class));
assertTrue(containsClass(Arrays.asList(ivyInstance.getSettings().getRepositoryCacheManagers()), EasyAntRepositoryCacheManager.class));
assertThat(configuredEasyAntIvyInstance, sameInstance(easyantIvySettings));
}
@Test
public void shouldReturnDefaultUserEasyAntIvySettingsLocation() {
File userEasyAntIvySettings = easyantEngine.getUserEasyAntIvySettings(project);
assertThat(userEasyAntIvySettings.getAbsolutePath(),
endsWith(EasyAntConstants.DEFAULT_USER_EASYANT_IVYSETTINGS));
}
@Test
public void shouldReturnUserEasyAntIvySettingsLocationSpecifiedByProperty() {
String fakeLocation = "/path/to/userSettings.xml";
project.setNewProperty(EasyAntMagicNames.USER_EASYANT_IVYSETTINGS, fakeLocation);
File userEasyAntIvySettings = easyantEngine.getUserEasyAntIvySettings(project);
assertThat(userEasyAntIvySettings.getAbsolutePath(), is(fakeLocation));
}
@Test
public void shouldReturnNullGlobalEasyAntIvySettingsLocationIfNoDefaultGlobalExists() throws MalformedURLException {
// configure default global to missing directory
project.setNewProperty(EasyAntMagicNames.EASYANT_HOME, "/fake/path");
URL globalEasyAntIvySettings = easyantEngine.getGlobalEasyAntIvySettings(project);
assertThat(globalEasyAntIvySettings, nullValue());
}
@Test
public void shouldReturnDefaultGlobalEasyAntIvySettingsLocationIfExists() throws IOException {
File f = temporaryFolder.newFile("easyant-ivysettings.xml");
FileOutputStream fos = null;
try {
// write file
fos = new FileOutputStream(f);
project.setNewProperty(EasyAntMagicNames.EASYANT_HOME, f.getParent());
URL globalEasyAntIvySettings = easyantEngine.getGlobalEasyAntIvySettings(project);
assertThat(globalEasyAntIvySettings, notNullValue());
assertThat(globalEasyAntIvySettings, is(f.toURI().toURL()));
} finally {
if (fos != null) {
fos.close();
}
}
}
@Test
public void shouldReturnGlobalEasyAntIvySettingsLocationSpecifiedByConfigurationFile() throws MalformedURLException {
easyAntConfiguration.setEasyantIvySettingsFile("/path/to/fake/easyantIvySettingsFile.xml");
URL globalEasyAntIvySettings = easyantEngine.getGlobalEasyAntIvySettings(project);
assertThat(globalEasyAntIvySettings.toString(), endsWith(easyAntConfiguration.getEasyantIvySettingsFile()));
}
@Test
public void shouldReturnGlobalEasyAntIvySettingsLocationSpecifiedByConfigurationURLAsString()
throws MalformedURLException {
easyAntConfiguration.setEasyantIvySettingsUrl("file:/path/to/fake/easyantIvySettingsFile.xml");
URL globalEasyAntIvySettings = easyantEngine.getGlobalEasyAntIvySettings(project);
assertThat(globalEasyAntIvySettings.toString(), is(easyAntConfiguration.getEasyantIvySettingsUrl()));
}
@Test
public void shouldReturnGlobalEasyAntIvySettingsLocationSpecifiedByConfigurationURL() throws MalformedURLException {
easyAntConfiguration.setEasyantIvySettingsUrl(this.getClass().getResource(
"/repositories/easyant-ivysettings-test.xml"));
URL globalEasyAntIvySettings = easyantEngine.getGlobalEasyAntIvySettings(project);
assertThat(globalEasyAntIvySettings.toString(), is(easyAntConfiguration.getEasyantIvySettingsUrl()));
}
}