/* * Copyright (C) 2015 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.aggregate; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.Profile; import org.jboss.errai.forge.config.ProjectConfig; import org.jboss.errai.forge.config.ProjectProperty; import org.jboss.errai.forge.config.SerializableSet; import org.jboss.errai.forge.constant.ArtifactVault.DependencyArtifact; import org.jboss.errai.forge.facet.aggregate.BaseAggregatorFacet.UninstallationExecption; import org.jboss.errai.forge.facet.base.AbstractBaseFacet; import org.jboss.errai.forge.test.base.ForgeTest; import org.jboss.forge.addon.facets.Facet; import org.jboss.forge.addon.facets.MutableFaceted; import org.jboss.forge.addon.facets.constraints.FacetConstraint; import org.jboss.forge.addon.maven.projects.MavenFacet; import org.jboss.forge.addon.projects.Project; import org.jboss.forge.addon.projects.ProjectFacet; import org.junit.Test; import java.util.*; import static org.junit.Assert.*; @SuppressWarnings({ "unchecked", "rawtypes" }) public class AggregatorFacetTest extends ForgeTest { @Test public void testUninstallRemovesConstraints() throws Exception { final Project project = createErraiTestProject(); addFeature(project, ErraiIocFacet.class); assertTrue(removeFeature(project, ErraiIocFacet.class)); final Set<Class<? extends Facet>> coreFacetTypes = getCoreFacetConstraints(); for (final Class<? extends Facet> facetType : ErraiIocFacet.class.getAnnotation(FacetConstraint.class).value()) { if (!coreFacetTypes.contains(facetType)) { assertFalse(facetType.getSimpleName() + " was not uninstalled.", project.hasFacet((Class<? extends ProjectFacet>) facetType)); assertFalse(facetType.getSimpleName() + " was not uninstalled.", facetFactory.create(project, facetType) .isInstalled()); } else { assertTrue(facetType.getSimpleName() + " was uninstalled.", project.hasFacet((Class<? extends ProjectFacet>) facetType)); assertTrue(facetType.getSimpleName() + " was uninstalled.", facetFactory.create(project, facetType) .isInstalled()); } } } @Test public void testAggregatorDoesNotUninstallCore() throws Exception { final Project project = createErraiTestProject(); final CoreFacet coreFacet = facetFactory.install(project, CoreFacet.class); addFeature(project, ErraiMessagingFacet.class); // Precondition assertTrue(removeFeature(project, ErraiMessagingFacet.class)); // Actual test assertTrue(project.hasFacet(CoreFacet.class)); assertTrue(coreFacet.isInstalled()); for (final Class<? extends ProjectFacet> facetType : CoreFacet.coreFacets) { assertTrue(facetType.getSimpleName() + " was uninstalled.", project.hasFacet(facetType)); assertTrue(facetType.getSimpleName() + " was uninstalled.", facetFactory.create(project, facetType).isInstalled()); } for (final Class<? extends ProjectFacet> facetType : (Class<? extends ProjectFacet>[]) CoreFacet.class .getAnnotation(FacetConstraint.class).value()) { assertTrue(facetType.getSimpleName() + " was uninstalled.", project.hasFacet(facetType)); assertTrue(facetType.getSimpleName() + " was uninstalled.", facetFactory.create(project, facetType).isInstalled()); } } @Test public void testUninstallDoesNotRemoveOtherDirectlyInstalled() throws Exception { final Project project = createErraiTestProject(); addFeature(project, ErraiIocFacet.class); addFeature(project, ErraiUiFacet.class); assertTrue(removeFeature(project, ErraiUiFacet.class)); assertTrue("ErraiIocFacet was uninstalled.", project.hasFacet(ErraiIocFacet.class)); assertTrue("ErraiIocFacet was uninstalled.", facetFactory.create(project, ErraiIocFacet.class).isInstalled()); } @Test public void testUninstallDoesRemoveOtherNotDirectlyInstalled() throws Exception { final Project project = createErraiTestProject(); addFeature(project, ErraiUiFacet.class); final ErraiIocFacet iocFacet = project.getFacet(ErraiIocFacet.class); // Precondition assertTrue(iocFacet.isInstalled()); assertTrue(removeFeature(project, ErraiUiFacet.class)); assertFalse(project.hasFacet(ErraiIocFacet.class)); assertFalse(iocFacet.isInstalled()); } @Test public void testCanInstallThenUninstallTwoRelatedFeatures() throws Exception { final Project project = createErraiTestProject(); final ErraiIocFacet iocFacet = addFeature(project, ErraiIocFacet.class); final ErraiUiFacet uiFacet = addFeature(project, ErraiUiFacet.class); assertTrue(removeFeature(project, ErraiUiFacet.class)); assertTrue("ErraiIocFacet was uninstalled.", project.hasFacet(ErraiIocFacet.class)); assertTrue("ErraiIocFacet was uninstalled.", iocFacet.isInstalled()); assertFalse("ErraiUiFacet was not uninstalled.", project.hasFacet(ErraiUiFacet.class)); assertFalse("ErraiUiFacet was not uninstalled.", uiFacet.isInstalled()); assertTrue(removeFeature(project, ErraiIocFacet.class)); assertFalse("ErraiUiFacet was not uninstalled.", project.hasFacet(ErraiUiFacet.class)); assertFalse("ErraiUiFacet was not uninstalled.", uiFacet.isInstalled()); assertFalse("ErraiIocFacet was not uninstalled.", project.hasFacet(ErraiIocFacet.class)); assertFalse("ErraiIocFacet was not uninstalled.", iocFacet.isInstalled()); } @Test public void regressionTestForErrai726() throws Exception { final Project project = createErraiTestProject(); final ErraiIocFacet iocFacet = addFeature(project, ErraiIocFacet.class); final ErraiUiFacet uiFacet = addFeature(project, ErraiUiFacet.class); assertTrue(removeFeature(project, ErraiUiFacet.class)); // Preconditions assertTrue("ErraiIocFacet was uninstalled.", project.hasFacet(ErraiIocFacet.class)); assertTrue("ErraiIocFacet was uninstalled.", iocFacet.isInstalled()); assertFalse("ErraiUiFacet was not uninstalled.", project.hasFacet(ErraiUiFacet.class)); assertFalse("ErraiUiFacet was not uninstalled.", uiFacet.isInstalled()); final MavenFacet mavenFacet = project.getFacet(MavenFacet.class); final Model pom = mavenFacet.getModel(); Profile profile = null; for (final Profile p : pom.getProfiles()) { if (p.getId() != null && p.getId().equals(AbstractBaseFacet.MAIN_PROFILE)) { profile = p; break; } } assertNotNull(profile); for (final Dependency dep : profile.getDependencies()) { assertNotEquals(DependencyArtifact.ErraiUi.getArtifactId(), dep.getArtifactId()); assertNotEquals(DependencyArtifact.ErraiDataBinding.getArtifactId(), dep.getArtifactId()); } } private boolean removeFeature(final Project project, Class<? extends BaseAggregatorFacet> featureType) throws IllegalStateException, UninstallationExecption { final BaseAggregatorFacet facet = project.getFacet(featureType); final ProjectConfig projectConfig = project.getFacet(ProjectConfig.class); final SerializableSet installedFeatures = projectConfig.getProjectProperty(ProjectProperty.INSTALLED_FEATURES, SerializableSet.class); installedFeatures.remove(facet.getShortName()); projectConfig.setProjectProperty(ProjectProperty.INSTALLED_FEATURES, installedFeatures); boolean success = facet.uninstallRequirements(); if (!success) return false; success = ((MutableFaceted<ProjectFacet>)project).uninstall(facet); return success; } private <T extends BaseAggregatorFacet> T addFeature(final Project project, Class<T> facetType) { final T aggregatorFacet = facetFactory.install(project, facetType); final ProjectConfig projectConfig = project.getFacet(ProjectConfig.class); final SerializableSet installedFeatures = projectConfig.getProjectProperty(ProjectProperty.INSTALLED_FEATURES, SerializableSet.class); installedFeatures.add(aggregatorFacet.getShortName()); projectConfig.setProjectProperty(ProjectProperty.INSTALLED_FEATURES, installedFeatures); return aggregatorFacet; } private Set<Class<? extends Facet>> getCoreFacetConstraints() { final Set<Class<? extends Facet>> coreFacetTypes = new HashSet(); coreFacetTypes.add(CoreFacet.class); final Queue<Class<? extends Facet>> toVisit = new LinkedList<Class<? extends Facet>>(); toVisit.addAll((Collection) Arrays.asList(CoreFacet.class.getAnnotation(FacetConstraint.class).value())); toVisit.addAll(Arrays.asList(CoreFacet.coreFacets)); while (!toVisit.isEmpty()) { final Class<? extends Facet> facetType = toVisit.poll(); if (facetType.isAnnotationPresent(FacetConstraint.class)) { for (final Class<? extends Facet> foundFacetType : facetType.getAnnotation(FacetConstraint.class).value()) { if (!coreFacetTypes.contains(foundFacetType)) { toVisit.add(foundFacetType); } } } coreFacetTypes.add(facetType); } return coreFacetTypes; } }