/* * JBoss, Home of Professional Open Source. * Copyright 2014, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.wildfly.plugin.common; import static org.junit.Assert.*; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.Map; import org.apache.maven.plugin.Mojo; import org.apache.maven.plugin.logging.Log; import org.apache.maven.settings.Settings; import org.apache.maven.settings.io.DefaultSettingsReader; import org.apache.maven.settings.io.SettingsParseException; import org.apache.maven.settings.io.SettingsReader; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import org.wildfly.plugin.deployment.DeployMojo; import org.wildfly.plugin.tests.AbstractWildFlyMojoTest; /** * @author stevemoyer * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ public class AbstractServerConnectionTest extends AbstractWildFlyMojoTest { Log log; /** * @throws Exception */ @Before public void setUp() throws Exception { log = mock(Log.class); } /** * Tests that if there is an <id> provided in the pom.xml file but no * username and password, and there is no settings.xml file in the * plugin's context, then the plugin falls back to prompting for * credentials on the CLI. */ @Test public void testIdProvidedInPomButDefaultSettingsFile() throws Exception { final DeployMojo mojo = lookupMojoVerifyAndApplySettings("deploy", "id-provided-pom.xml", "default-settings.xml"); mojo.setLog(log); mojo.getClientConfiguration(); verify(log).debug(DeployMojo.DEBUG_MESSAGE_NO_SERVER_SECTION); } /** * Tests that if there is an <id> provided in the pom.xml file but no * username and password, and there is a settings.xml file that doesn't * match the id of the server, then the plugin falls back to prompting * for credentials on the CLI. */ @Test public void testIdProvidedInPomButNoServerSection() throws Exception { final DeployMojo mojo = lookupMojoVerifyAndApplySettings("deploy", "id-provided-pom.xml", "missing-id-settings.xml"); mojo.setLog(log); mojo.getClientConfiguration(); verify(log).debug(DeployMojo.DEBUG_MESSAGE_NO_SERVER_SECTION); } /** * Tests that if there is an <id> provided in the pom.xml file but no * username and password, and there is a settings.xml file that has a * <server> section that matches the id, but there is no username and * password specified, then the plugin falls back to prompting for * credentials on the CLI. */ @Test public void testIdProvidedInPomButNoCredentials() throws Exception { final DeployMojo mojo = lookupMojoVerifyAndApplySettings("deploy", "id-provided-pom.xml", "id-provided-settings.xml"); mojo.setLog(log); mojo.getClientConfiguration(); final InOrder inOrder = inOrder(log); inOrder.verify(log).debug(DeployMojo.DEBUG_MESSAGE_SETTINGS_HAS_ID); inOrder.verify(log).debug(DeployMojo.DEBUG_MESSAGE_NO_CREDS); } /** * Test that if credentials are provided in the pom.xml file, they are used * regardless of whether an <id> element is also present. */ @Test public void testCredentialsProvidedInPom() throws Exception { final DeployMojo mojo = lookupMojoAndVerify("deploy", "credentials-provided-pom.xml"); mojo.setLog(log); mojo.getClientConfiguration(); } /** * Tests that if there is an <id> provided in the pom.xml file but no * username and password, and there is a settings.xml file that has a * <server> section that matches the id, and the section includes * credentials, then they are used by the plugin. */ @Test public void testCredentialsProvidedInSettings() throws Exception { final DeployMojo mojo = lookupMojoVerifyAndApplySettings("deploy", "id-provided-pom.xml", "credentials-provided-settings.xml"); mojo.setLog(log); mojo.getClientConfiguration(); final InOrder inOrder = inOrder(log); inOrder.verify(log).debug(DeployMojo.DEBUG_MESSAGE_SETTINGS_HAS_ID); inOrder.verify(log).debug(DeployMojo.DEBUG_MESSAGE_SETTINGS_HAS_CREDS); } /** * Test that if there is no <id> element and no credentials in the pom.xml * file, then it falls back to prompting for them on the CLI. */ @Test public void testNoCredentialsOrIdInPom() throws Exception { final DeployMojo mojo = lookupMojoAndVerify("deploy", "missing-id-pom.xml"); mojo.setLog(log); mojo.getClientConfiguration(); verify(log).debug(DeployMojo.DEBUG_MESSAGE_NO_ID); } /** * Looks up the specified mojo by name, passing it the POM file that * references it and a settings file that configures it, then verifying * that the lookup was successful. * * @param mojoName the name of the mojo being tested * @param pomFileName the name of the pom.xml file to be used during testing * @param settingsFileName the settings.xml file to be used during testing * * @return the Mojo object under test * * @throws Exception if the mojo can not be found */ @SuppressWarnings("unchecked") private <T extends Mojo> T lookupMojoVerifyAndApplySettings(final String mojoName, final String pomFileName, final String settingsFileName) throws Exception { T mojo = lookupMojoAndVerify(mojoName, pomFileName); rule.setVariableValueToObject(mojo, "settings", getSettingsFile(settingsFileName)); return mojo; } /** * Gets a settings.xml file from the input File and prepares it to be * attached to a pom.xml * * @param fileName file object pointing to the candidate settings file * * @return the settings object * * @throws java.io.IOException - if the settings file can't be read */ private Settings getSettingsFile(final String fileName) throws IOException { Map<String, ?> options = Collections.singletonMap(SettingsReader.IS_STRICT, Boolean.TRUE); SettingsReader reader = new DefaultSettingsReader(); final File settingsFile = new File(BASE_CONFIG_DIR, fileName); assertTrue("Could not find settings file: " + settingsFile.getAbsolutePath(), settingsFile.exists()); Settings settings = null; try { settings = reader.read(settingsFile, options); } catch (SettingsParseException e) { } return settings; } }