/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.core.tests.internal.builders; import java.io.ByteArrayInputStream; import java.io.InputStream; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; /** * Tests relationship between natures and builders. Builders that are owned * by a nature can only be run if their owning nature is defined on the project * being built. */ public class BuilderNatureTest extends AbstractBuilderTest { public BuilderNatureTest() { super(null); } public BuilderNatureTest(String testName) { super(testName); } protected InputStream projectFileWithoutSnow() { String contents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<projectDescription>\n" + " <name>P1</name>\n" + " <comment></comment>\n" + " <projects>\n" + " </projects>\n" + " <buildSpec>\n" + " <buildCommand>\n" + " <name>org.eclipse.core.tests.resources.snowbuilder</name>\n" + " <arguments>\n" + " <dictionary>\n" + " <key>BuildID</key>\n" + " <value>SnowBuild</value>\n" + " </dictionary>\n" + " </arguments>\n" + " </buildCommand>\n" + " </buildSpec>\n" + " <natures>\n" + " <nature>org.eclipse.core.tests.resources.waterNature</nature>\n" + " </natures>\n" + "</projectDescription>"; return new ByteArrayInputStream(contents.getBytes()); } protected InputStream projectFileWithoutWater() { String contents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<projectDescription>\n" + " <name>P1</name>\n" + " <comment></comment>\n" + " <projects>\n" + " </projects>\n" + " <buildSpec>\n" + " <buildCommand>\n" + " <name>org.eclipse.core.tests.resources.snowbuilder</name>\n" + " <arguments>\n" + " <dictionary>\n" + " <key>BuildID</key>\n" + " <value>SnowBuild</value>\n" + " </dictionary>\n" + " </arguments>\n" + " </buildCommand>\n" + " </buildSpec>\n" + " <natures>\n" + " <nature>org.eclipse.core.tests.resources.snowNature</nature>\n" + " </natures>\n" + "</projectDescription>"; return new ByteArrayInputStream(contents.getBytes()); } public static Test suite() { return new TestSuite(BuilderNatureTest.class); // TestSuite suite = new TestSuite(); // suite.addTest(new BuilderNatureTest("testMissingNature")); // return suite; } public void testBasic() { //add the water and snow natures to the project, and ensure //the snow builder gets run IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("P1"); ensureExistsInWorkspace(project, true); SnowBuilder builder = SnowBuilder.getInstance(); builder.reset(); try { setAutoBuilding(true); IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("0.99", e); } builder.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); builder.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); builder.assertLifecycleEvents("1.0"); } /** * Get the project in a state where the snow nature is disabled, * then ensure the snow builder is not run but remains on the build spec */ public void testDisabledNature() { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("P1"); ensureExistsInWorkspace(project, true); try { setAutoBuilding(true); IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("0.99", e); } //remove the water nature, thus invalidating snow nature SnowBuilder builder = SnowBuilder.getInstance(); builder.reset(); IFile descFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME); try { //setting description file will also trigger build descFile.setContents(projectFileWithoutWater(), IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("1.99", e); } //assert that builder was skipped builder.assertLifecycleEvents("1.0"); //now re-enable the nature and ensure that the delta was null builder.reset(); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); try { IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("2.99", e); } builder.assertLifecycleEvents("2.0"); assertTrue("2.1", builder.wasDeltaNull()); } /** * Get the project in a state where the snow nature is missing, * then ensure the snow builder is removed from the build spec. */ public void testMissingNature() { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("P1"); ensureExistsInWorkspace(project, true); try { setAutoBuilding(true); IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("0.99", e); } //remove the snow nature through normal API SnowBuilder builder = SnowBuilder.getInstance(); builder.reset(); try { IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER}); project.setDescription(desc, IResource.NONE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("1.99", e); } //make sure the snow builder wasn't run builder.assertLifecycleEvents("2.0"); //make sure the build spec doesn't include snow builder try { ICommand[] commands = project.getDescription().getBuildSpec(); for (ICommand command : commands) { if (command.getBuilderName().equals(SnowBuilder.BUILDER_NAME)) { assertTrue("2.1", false); } } } catch (CoreException e) { fail("2.99", e); } //now add the snow nature back and ensure snow builder runs builder.reset(); builder.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); builder.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); try { IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.KEEP_HISTORY, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("3.99", e); } builder.assertLifecycleEvents("3.0"); //now remove the snow nature by hacking .project //the deconfigure method won't run, but the builder should still be removed. builder.reset(); IFile descFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME); try { //setting description file will also trigger build descFile.setContents(projectFileWithoutSnow(), IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("4.99", e); } //assert that builder was skipped builder.assertLifecycleEvents("4.0"); //make sure the build spec doesn't include snow builder try { ICommand[] commands = project.getDescription().getBuildSpec(); for (ICommand command : commands) { if (command.getBuilderName().equals(SnowBuilder.BUILDER_NAME)) { assertTrue("4.1", false); } } } catch (CoreException e) { fail("5.99", e); } //now re-enable the nature and ensure that the delta was null builder.reset(); builder.addExpectedLifecycleEvent(TestBuilder.SET_INITIALIZATION_DATA); builder.addExpectedLifecycleEvent(TestBuilder.STARTUP_ON_INITIALIZE); builder.addExpectedLifecycleEvent(SnowBuilder.SNOW_BUILD_EVENT); try { IProjectDescription desc = project.getDescription(); desc.setNatureIds(new String[] {NATURE_WATER, NATURE_SNOW}); project.setDescription(desc, IResource.FORCE, getMonitor()); waitForBuild(); } catch (CoreException e) { fail("6.99", e); } builder.assertLifecycleEvents("5.0"); assertTrue("5.1", builder.wasDeltaNull()); } }