/*
* 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.Build;
import org.jboss.errai.forge.constant.ArtifactVault.DependencyArtifact;
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.maven.projects.MavenPluginFacet;
import org.jboss.forge.addon.projects.Project;
import org.junit.Test;
import javax.enterprise.context.Dependent;
import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.*;
public class AbstractPluginFacetTest extends BasePluginFacetTest {
@Dependent
public static class DefinitionOnly extends AbstractPluginFacet {
public DefinitionOnly() {
pluginArtifact = DependencyArtifact.Clean;
configurations = Collections.emptyList();
dependencies = Collections.emptyList();
executions = Collections.emptyList();
}
}
@Dependent
public static class DependencyHavingPlugin extends AbstractPluginFacet {
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 AbstractPluginFacet {
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"))
.addChild(ConfigurationElementBuilder.create().setName("child").setText("otherChildText")) });
executions = Collections.emptyList();
dependencies = Collections.emptyList();
}
}
@Dependent
public static class ExecutionHavingPlugin extends AbstractPluginFacet {
public ExecutionHavingPlugin() {
pluginArtifact = DependencyArtifact.Clean;
configurations = Collections.emptyList();
executions = Arrays.asList(new Execution[] { ExecutionBuilder
.create()
.setId("testExec")
.setPhase("compile")
.setConfig(
ConfigurationBuilder
.create()
.addConfigurationElement(
ConfigurationElementBuilder
.create()
.setName("parent")
.addChild(
ConfigurationElementBuilder.create().setName("child")
.setText("childText")))
.addConfigurationElement(
ConfigurationElementBuilder.create().setName("leaf").setText("leafText"))) });
dependencies = Collections.emptyList();
}
}
@Dependent
public static class InitHavingPlugin extends AbstractPluginFacet {
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 testEmptyPluginDefinition() throws Exception {
final Project project = initializeJavaProject();
final DefinitionOnly facet = facetFactory.install(project, DefinitionOnly.class);
checkPlugin(project, facet);
}
@Test
public void testWithDependencies() throws Exception {
final Project project = initializeJavaProject();
final DependencyHavingPlugin facet = facetFactory.install(project,
DependencyHavingPlugin.class);
checkPlugin(project, facet);
}
@Test
public void testIsInstalledWithDependencies() 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);
// Precondition
checkPlugin(project, facet);
// Actual test
assertTrue(testFacet.isInstalled());
}
@Test
public void testWithConfigurations() throws Exception {
final Project project = initializeJavaProject();
final ConfigHavingPlugin facet = facetFactory.install(project,
ConfigHavingPlugin.class);
checkPlugin(project, facet);
}
@Test
public void testIsInstalledWithConfigurations() 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);
// Precondition
checkPlugin(project, facet);
assertTrue(testFacet.isInstalled());
}
@Test
public void testWithExecutions() throws Exception {
final Project project = initializeJavaProject();
final ExecutionHavingPlugin facet = facetFactory.install(project,
ExecutionHavingPlugin.class);
checkPlugin(project, facet);
}
@Test
public void testIsInstalledWithExecutions() 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);
// Precondition
checkPlugin(project, facet);
assertTrue(testFacet.isInstalled());
}
@Test
public void testUninstall() throws Exception {
final Project project = initializeJavaProject();
final ExecutionHavingPlugin facet = facetFactory.install(project,
ExecutionHavingPlugin.class);
// Precondition
assertTrue(facet.isInstalled());
facet.uninstall();
final MavenPluginFacet pluginFacet = project.getFacet(MavenPluginFacet.class);
assertFalse(pluginFacet.hasPlugin(DependencyBuilder.create(facet.getPluginArtifact().toString()).getCoordinate()));
}
@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());
}
private void checkPlugin(Project project, AbstractPluginFacet facet) {
final String artifactDef = facet.getPluginArtifact().toString();
final MavenPluginFacet pluginFacet = project.getFacet(MavenPluginFacet.class);
final MavenFacet coreFacet = project.getFacet(MavenFacet.class);
checkHasPlugin(project, facet, artifactDef);
checkExecutions(pluginFacet.getPlugin(DependencyBuilder.create(artifactDef).getCoordinate()), facet.getExecutions());
Build build = coreFacet.getModel().getBuild();
if (build == null)
build = new Build();
checkDependencies(build, facet.getDependencies(), build.getPluginsAsMap().get(facet.getPluginArtifact().toString())
.getDependencies(), facet.getPluginArtifact().toString());
checkConfigurations(pluginFacet.getPlugin(DependencyBuilder.create(artifactDef).getCoordinate()).getConfig(),
facet.getConfigurations());
}
}