/* * Copyright (C) 2014 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. * 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.jboss.errai.forge.facet.plugin; import org.apache.maven.model.BuildBase; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginExecution; import org.apache.maven.model.Profile; import org.jboss.errai.forge.constant.ArtifactVault.DependencyArtifact; import org.jboss.errai.forge.facet.base.AbstractBaseFacet; import org.jboss.forge.addon.dependencies.builder.DependencyBuilder; import org.jboss.forge.addon.maven.plugins.*; import org.jboss.forge.addon.maven.projects.MavenFacet; import org.jboss.forge.addon.projects.Project; import org.junit.Assert; import org.junit.Test; import javax.enterprise.context.Dependent; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import static org.junit.Assert.*; public class AbstractProfilePluginFacetTest extends BasePluginFacetTest { public static abstract class BaseTestAbstractProfilePluginFacet extends AbstractProfilePluginFacet { @Override public DependencyArtifact getPluginArtifact() { return pluginArtifact; } @Override public Collection<ConfigurationElement> getConfigurations() { return configurations; } @Override public Collection<DependencyBuilder> getDependencies() { return dependencies; } @Override public Collection<PluginExecution> getPluginExecutions() { return executions; } } @Dependent public static class DefinitionOnly extends BaseTestAbstractProfilePluginFacet { public DefinitionOnly() { pluginArtifact = DependencyArtifact.Clean; configurations = Collections.emptyList(); dependencies = Collections.emptyList(); executions = Collections.emptyList(); } } @Dependent public static class DependencyHavingPlugin extends BaseTestAbstractProfilePluginFacet { public DependencyHavingPlugin() { pluginArtifact = DependencyArtifact.Clean; configurations = Collections.emptyList(); executions = Collections.emptyList(); // Do not put errai dependencies here. They will fail because the // errai.version propery is not set. dependencies = Arrays.asList(new DependencyBuilder[] { DependencyBuilder.create(DependencyArtifact.Guava .toString()) }); } } @Dependent public static class ConfigHavingPlugin extends BaseTestAbstractProfilePluginFacet { public ConfigHavingPlugin() { pluginArtifact = DependencyArtifact.Clean; configurations = Arrays.asList(new ConfigurationElement[] { ConfigurationElementBuilder.create().setName("configName").setText("configText"), ConfigurationElementBuilder.create().setName("parent") .addChild(ConfigurationElementBuilder.create().setName("child").setText("childText")) }); executions = Collections.emptyList(); dependencies = Collections.emptyList(); } } @Dependent public static class ExecutionHavingPlugin extends BaseTestAbstractProfilePluginFacet { public ExecutionHavingPlugin() { pluginArtifact = DependencyArtifact.Clean; configurations = Collections.emptyList(); dependencies = Collections.emptyList(); final PluginExecution exec = new PluginExecution(); exec.setId("testExec"); exec.setGoals(Arrays.asList(new String[] { "compile" })); exec.setPhase("test"); final MavenPluginAdapter adapter = new MavenPluginAdapter(MavenPluginBuilder.create().setCoordinate( DependencyBuilder.create("maven-clean-plugin").getCoordinate())); adapter.setConfig(ConfigurationBuilder .create() .addConfigurationElement( ConfigurationElementBuilder.create().setName("parent") .addChild(ConfigurationElementBuilder.create().setName("child").setText("childText"))) .addConfigurationElement(ConfigurationElementBuilder.create().setName("leaf").setText("leafText"))); exec.setConfiguration(adapter.getConfiguration()); executions = Arrays.asList(new PluginExecution[] { exec }); } } @Dependent public static class InitHavingPlugin extends BaseTestAbstractProfilePluginFacet { private int initCalls; private Project initProject; public InitHavingPlugin() { pluginArtifact = DependencyArtifact.Clean; configurations = Collections.emptyList(); executions = Collections.emptyList(); dependencies = Collections.emptyList(); } public Project getInitProject() { return initProject; } @Override protected void init() { initCalls++; initProject = getProject(); } public int getInitCallCount() { return initCalls; } } @Test public void testEmptyPlugin() throws Exception { final Project project = initializeJavaProject(); final DefinitionOnly facet = facetFactory.install(project, DefinitionOnly.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); } @Test public void testDependencyHavingPlugin() throws Exception { final Project project = initializeJavaProject(); final DependencyHavingPlugin facet = facetFactory.install(project, DependencyHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); } @Test public void testDependencyHavingPluginIsInstalled() throws Exception { final Project project = initializeJavaProject(); final DependencyHavingPlugin testFacet = facetFactory.create(project, DependencyHavingPlugin.class); assertFalse(testFacet.isInstalled()); final DependencyHavingPlugin facet = facetFactory.install(project, DependencyHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); assertTrue(testFacet.isInstalled()); } @Test public void testUninstall() throws Exception { final Project project = initializeJavaProject(); final DependencyHavingPlugin facet = facetFactory.install(project, DependencyHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); facet.uninstall(); checkUninstalled(project, facet, AbstractBaseFacet.MAIN_PROFILE); } @Test public void testConfigHavingPlugin() throws Exception { final Project project = initializeJavaProject(); final ConfigHavingPlugin facet = facetFactory.install(project, ConfigHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); } @Test public void testConfigHavingPluginIsInstalled() throws Exception { final Project project = initializeJavaProject(); final ConfigHavingPlugin testFacet = facetFactory.create(project, ConfigHavingPlugin.class); assertFalse(testFacet.isInstalled()); final ConfigHavingPlugin facet = facetFactory.install(project, ConfigHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); assertTrue(testFacet.isInstalled()); } @Test public void testExecutionHavingPlugin() throws Exception { final Project project = initializeJavaProject(); final ExecutionHavingPlugin facet = facetFactory.install(project, ExecutionHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); } @Test public void testExecutionHavingPluginIsInstalled() throws Exception { final Project project = initializeJavaProject(); final ExecutionHavingPlugin testFacet = facetFactory.create(project, ExecutionHavingPlugin.class); assertFalse(testFacet.isInstalled()); final ExecutionHavingPlugin facet = facetFactory.install(project, ExecutionHavingPlugin.class); checkPlugin(project, facet, AbstractBaseFacet.MAIN_PROFILE); assertTrue(testFacet.isInstalled()); } @Test public void initShouldBeCalledExactlyOnce() throws Exception { final Project project = initializeJavaProject(); final InitHavingPlugin facet = facetFactory.create(project, InitHavingPlugin.class); assertEquals(0 , facet.getInitCallCount()); facetFactory.install(project, facet); assertTrue(facet.isInstalled()); assertEquals(1 , facet.getInitCallCount()); facet.uninstall(); assertFalse(facet.isInstalled()); assertEquals(1 , facet.getInitCallCount()); } protected void checkPlugin(Project project, AbstractProfilePluginFacet facet, String profileId) { final MavenFacet coreFacet = project.getFacet(MavenFacet.class); Profile profile = null; for (final Profile prof : coreFacet.getModel().getProfiles()) { if (profileId.equals(prof.getId())) { profile = prof; break; } } Assert.assertNotNull("Could not find profile with matching id, " + profileId, profile); final BuildBase build = profile.getBuild(); Assert.assertNotNull("No build for profile " + profileId, build); final Plugin plugin = build.getPluginsAsMap().get(facet.getPluginArtifact().toString()); final MavenPluginAdapter adapter = new MavenPluginAdapter(plugin); // This is hack to go from maven to forge configurations final MavenPluginAdapter configAdapter = new MavenPluginAdapter(MavenPluginBuilder.create().setCoordinate( DependencyBuilder.create("maven-clean-plugin").getCoordinate())); final Collection<Execution> executions = new ArrayList<Execution>(); for (final PluginExecution plugExec : facet.getPluginExecutions()) { configAdapter.setConfiguration(plugExec.getConfiguration()); ExecutionBuilder newExec = ExecutionBuilder.create().setId(plugExec.getId()).setPhase(plugExec.getPhase()) .setConfig(configAdapter.getConfig()); for (final String goal : plugExec.getGoals()) newExec.addGoal(goal); executions.add(newExec); } checkExecutions(adapter, executions); checkDependencies(build, facet.getDependencies(), plugin.getDependencies(), facet.getPluginArtifact().toString()); checkConfigurations(adapter.getConfig(), facet.getConfigurations()); } private void checkUninstalled(Project project, AbstractProfilePluginFacet facet, String profileId) { final MavenFacet coreFacet = project.getFacet(MavenFacet.class); Profile profile = null; for (final Profile prof : coreFacet.getModel().getProfiles()) { if (profileId.equals(prof.getId())) { profile = prof; break; } } Assert.assertNotNull("Could not find profile with matching id, " + profileId, profile); final BuildBase build = profile.getBuild(); Assert.assertNotNull("No build for profile " + profileId, build); final Plugin plugin = build.getPluginsAsMap().get(facet.getPluginArtifact().toString()); assertNull("Plugin was not uninstalled.", plugin); } }