/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.globalconfig; import static org.hamcrest.Matchers.either; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertThat; import static org.mule.runtime.globalconfig.api.GlobalConfigLoader.getMavenConfig; import static org.mule.tck.MuleTestUtils.testWithSystemProperties; import static org.mule.tck.MuleTestUtils.testWithSystemProperty; import static org.mule.test.allure.AllureConstants.RuntimeGlobalConfiguration.MavenGlobalConfiguration.MAVEN_GLOBAL_CONFIGURATION_STORY; import static org.mule.test.allure.AllureConstants.RuntimeGlobalConfiguration.RUNTIME_GLOBAL_CONFIGURATION; import org.mule.maven.client.api.model.MavenConfiguration; import org.mule.maven.client.api.model.RemoteRepository; import org.mule.runtime.globalconfig.api.GlobalConfigLoader; import org.mule.runtime.globalconfig.api.exception.RuntimeGlobalConfigException; import org.mule.tck.junit4.AbstractMuleTestCase; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import ru.yandex.qatools.allure.annotations.Description; import ru.yandex.qatools.allure.annotations.Features; import ru.yandex.qatools.allure.annotations.Stories; @Features(RUNTIME_GLOBAL_CONFIGURATION) @Stories(MAVEN_GLOBAL_CONFIGURATION_STORY) public class MavenConfigTestCase extends AbstractMuleTestCase { private static final String MAVEN_CENTRAL_REPO_ID = "mavenCentral"; private static final String MAVEN_CENTRAL_URL = "https://repo.maven.apache.org/maven2/"; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Rule public ExpectedException expectedException = ExpectedException.none(); @Description("Test a single file loaded from the classpath and verifies that the mule.conf and mule.properties json are not taken into account.") @Test public void loadFromFileOnly() throws MalformedURLException { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); List<RemoteRepository> remoteRepositories = mavenConfig.getMavenRemoteRepositories(); assertThat(remoteRepositories, hasSize(1)); RemoteRepository remoteRepository = remoteRepositories.get(0); assertThat(remoteRepository.getId(), is(MAVEN_CENTRAL_REPO_ID)); assertThat(remoteRepository.getUrl(), is(new URL(MAVEN_CENTRAL_URL))); assertThat(remoteRepository.getAuthentication().get().getPassword(), is("password")); assertThat(remoteRepository.getAuthentication().get().getUsername(), is("username")); } @Description("Loads the configuration from mule-config.json and overrides the maven repository location using a system property") @Test public void loadFromFileWithOverrideFromSystemPropertyOfSimpleValue() throws Exception { String repoLocation = temporaryFolder.getRoot().getAbsolutePath(); testWithSystemProperty("muleRuntimeConfig.maven.repositoryLocation", repoLocation, () -> { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); String configuredRepoLocation = mavenConfig.getLocalMavenRepositoryLocation().getAbsolutePath(); assertThat(configuredRepoLocation, is(repoLocation)); }); } @Description("Loads the configuration from mule-config.json and adds an additional maven repository using system properties") @Test public void loadFromFileWithAdditionalRepoFromSystemProperty() throws Exception { String additionalRepositoryUrl = "http://localhost/host"; testWithSystemProperty("muleRuntimeConfig.maven.repositories.customRepo.url", additionalRepositoryUrl, () -> { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); List<RemoteRepository> mavenRemoteRepositories = mavenConfig.getMavenRemoteRepositories(); assertThat(mavenRemoteRepositories, hasSize(2)); assertThat(mavenRemoteRepositories.get(0).getId(), is("customRepo")); assertThat(mavenRemoteRepositories.get(0).getUrl(), is(new URL(additionalRepositoryUrl))); assertThat(mavenRemoteRepositories.get(1).getId(), is("mavenCentral")); assertThat(mavenRemoteRepositories.get(1).getUrl(), is(new URL(MAVEN_CENTRAL_URL))); }); } @Description("Loads the configuration from mule-config.json and adds an additional maven repository using system properties with order for remote repositories") @Test public void loadFromFileWithAdditionalRepoFromSystemPropertyInOrder() throws Exception { String additionalRepositoryUrl = "http://localhost/host"; Map<String, String> systemProperties = new HashMap<>(); systemProperties.put("muleRuntimeConfig.maven.repositories.firstCustomRepo.url", additionalRepositoryUrl); systemProperties.put("muleRuntimeConfig.maven.repositories.firstCustomRepo.position", "1"); systemProperties.put("muleRuntimeConfig.maven.repositories.secondCustomRepo.url", additionalRepositoryUrl); systemProperties.put("muleRuntimeConfig.maven.repositories.secondCustomRepo.position", "2"); testWithSystemProperties(systemProperties, () -> { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); List<RemoteRepository> mavenRemoteRepositories = mavenConfig.getMavenRemoteRepositories(); assertThat(mavenRemoteRepositories, hasSize(3)); assertThat(mavenRemoteRepositories.get(0).getId(), is("firstCustomRepo")); assertThat(mavenRemoteRepositories.get(0).getUrl(), is(new URL(additionalRepositoryUrl))); assertThat(mavenRemoteRepositories.get(1).getId(), is("secondCustomRepo")); assertThat(mavenRemoteRepositories.get(1).getUrl(), is(new URL(additionalRepositoryUrl))); assertThat(mavenRemoteRepositories.get(2).getId(), is("mavenCentral")); assertThat(mavenRemoteRepositories.get(2).getUrl(), is(new URL(MAVEN_CENTRAL_URL))); }); } @Description("Loads the configuration from mule-config.json and adds an additional maven repository using system properties with order for remote repositories with same position") @Test public void loadFromFileWithAdditionalRepoFromSystemPropertyInOrderSamePosition() throws Exception { String additionalRepositoryUrl = "http://localhost/host"; Map<String, String> systemProperties = new HashMap<>(); systemProperties.put("muleRuntimeConfig.maven.repositories.firstCustomRepo.url", additionalRepositoryUrl); systemProperties.put("muleRuntimeConfig.maven.repositories.firstCustomRepo.position", "1"); systemProperties.put("muleRuntimeConfig.maven.repositories.secondCustomRepo.url", additionalRepositoryUrl); systemProperties.put("muleRuntimeConfig.maven.repositories.secondCustomRepo.position", "1"); testWithSystemProperties(systemProperties, () -> { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); List<RemoteRepository> mavenRemoteRepositories = mavenConfig.getMavenRemoteRepositories(); assertThat(mavenRemoteRepositories, hasSize(3)); assertThat(mavenRemoteRepositories.get(0).getId(), either(is("firstCustomRepo")).or(is("secondCustomRepo"))); assertThat(mavenRemoteRepositories.get(0).getUrl(), is(new URL(additionalRepositoryUrl))); assertThat(mavenRemoteRepositories.get(1).getId(), either(is("firstCustomRepo")).or(is("secondCustomRepo"))); assertThat(mavenRemoteRepositories.get(1).getUrl(), is(new URL(additionalRepositoryUrl))); assertThat(mavenRemoteRepositories.get(2).getId(), is("mavenCentral")); assertThat(mavenRemoteRepositories.get(2).getUrl(), is(new URL(MAVEN_CENTRAL_URL))); }); } @Description("Loads the configuration from mule-config.json and overrides a single attribute of a complex value") @Test public void loadFromFileWithOverrideFromSystemPropertyOfComplexValue() throws Exception { String mavenCentralOverriddenUrl = "http://localhost/host"; testWithSystemProperty("muleRuntimeConfig.maven.repositories.mavenCentral.url", mavenCentralOverriddenUrl, () -> { GlobalConfigLoader.reset(); MavenConfiguration mavenConfig = getMavenConfig(); List<RemoteRepository> mavenRemoteRepositories = mavenConfig.getMavenRemoteRepositories(); assertThat(mavenRemoteRepositories, hasSize(1)); assertThat(mavenRemoteRepositories.get(0).getId(), is("mavenCentral")); assertThat(mavenRemoteRepositories.get(0).getUrl(), is(new URL(mavenCentralOverriddenUrl))); }); } @Description("Loads the configuration from mule-config.json and defines the maven local repository location wrongly") @Test public void wrongLocalRepositoryLocationConfig() throws Exception { String repoLocation = "badLocation"; testWithSystemProperty("muleRuntimeConfig.maven.repositoryLocation", repoLocation, () -> { expectedException.expect(instanceOf(RuntimeGlobalConfigException.class)); expectedException.expectMessage("Repository folder badLocation configured for the mule runtime does not exists"); GlobalConfigLoader.reset(); }); } }