blob: ad978d471fd814db472c85662b21c27106a648e5 [file] [log] [blame]
/*******************************************************************************
* 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 junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
/**
* Tests that deltas supplied to the builder are accurate
*/
public class BuildDeltaVerificationTest extends AbstractBuilderTest {
DeltaVerifierBuilder verifier;
/* some random resource handles */
protected static final String PROJECT1 = "Project1";
protected static final String PROJECT2 = "Project2";
protected static final String FOLDER1 = "Folder1";
protected static final String FOLDER2 = "Folder2";
protected static final String FILE1 = "File1";
protected static final String FILE2 = "File2";
protected static final String FILE3 = "File3";
IProject project1;
IProject project2;
IFolder folder1;//below project2
IFolder folder2;//below folder1
IFolder folder3;//same as file1
IFile file1;//below folder1
IFile file2;//below folder1
IFile file3;//below folder2
public BuildDeltaVerificationTest() {
super(null);
}
/**
* Creates a new instance of BuildDeltaVerificationTest.
* @param name java.lang.String
*/
public BuildDeltaVerificationTest(String name) {
super(name);
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void assertDelta() {
if (!verifier.isDeltaValid()) {
// System.out.println(verifier.getMessage());
}
assertTrue("Should be an incremental build", verifier.wasIncrementalBuild());
assertTrue(verifier.getMessage(), verifier.isDeltaValid());
}
/**
* Runs code to handle a core exception
*/
protected void handleCoreException(CoreException e) {
assertTrue("CoreException: " + e.getMessage(), false);
}
/**
* Rebuilds the solution.
*/
protected void rebuild() throws CoreException {
project1.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
project2.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
}
/**
* Sets up the fixture, for example, open a network connection.
* This method is called before a test is executed.
*/
@Override
protected void setUp() throws Exception {
super.setUp();
// Turn auto-building off
IWorkspace workspace = getWorkspace();
setAutoBuilding(false);
// Create some resource handles
project1 = workspace.getRoot().getProject(PROJECT1);
project2 = workspace.getRoot().getProject(PROJECT2);
folder1 = project1.getFolder(FOLDER1);
folder2 = folder1.getFolder(FOLDER2);
folder3 = folder1.getFolder(FILE1);
file1 = folder1.getFile(FILE1);
file2 = folder1.getFile(FILE2);
file3 = folder2.getFile(FILE1);
// Create and open a project, folder and file
try {
project1.create(getMonitor());
project1.open(getMonitor());
folder1.create(true, true, getMonitor());
file1.create(getRandomContents(), true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
// Create and set a build spec for the project
try {
IProjectDescription desc = project1.getDescription();
ICommand command = desc.newCommand();
command.setBuilderName(DeltaVerifierBuilder.BUILDER_NAME);
desc.setBuildSpec(new ICommand[] {command});
project1.setDescription(desc, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
// Build the project
try {
project1.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("3.3", e);
}
verifier = DeltaVerifierBuilder.getInstance();
assertNotNull("Builder was not instantiated", verifier);
assertTrue("First build should be a batch build", verifier.wasFullBuild());
}
public static Test suite() {
TestSuite suite = new TestSuite(BuildDeltaVerificationTest.class);
// suite.addTest(new BuildDeltaVerificationTest("testCloseOpenReplaceFile"));
return suite;
}
/**
* Tears down the fixture, for example, close a network connection.
* This method is called after a test is executed.
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
getWorkspace().getRoot().delete(true, getMonitor());
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddAndRemoveFile() {
try {
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file2.create(in, true, getMonitor());
file2.delete(true, getMonitor());
rebuild();
//builder for project1 may not even be called (empty delta)
if (verifier.wasFullBuild()) {
verifier.emptyBuild();
}
assertTrue(verifier.getMessage(), verifier.isDeltaValid());
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddAndRemoveFolder() {
try {
folder2.create(true, true, getMonitor());
folder2.delete(true, getMonitor());
rebuild();
//builder for project1 may not even be called (empty delta)
if (verifier.wasFullBuild()) {
verifier.emptyBuild();
}
assertTrue(verifier.getMessage(), verifier.isDeltaValid());
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddFile() {
try {
verifier.addExpectedChange(file2, project1, IResourceDelta.ADDED, 0);
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file2.create(in, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddFileAndFolder() {
try {
verifier.addExpectedChange(folder2, project1, IResourceDelta.ADDED, 0);
verifier.addExpectedChange(file3, project1, IResourceDelta.ADDED, 0);
folder2.create(true, true, getMonitor());
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file3.create(in, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddFolder() {
try {
verifier.addExpectedChange(folder2, project1, IResourceDelta.ADDED, 0);
folder2.create(true, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testAddProject() {
try {
//should not affect project1's delta
project2.create(getMonitor());
rebuild();
//builder for project1 should not even be called
assertTrue(verifier.getMessage(), verifier.isDeltaValid());
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testChangeFile() {
try {
/* change file1's contents */
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file1.setContents(in, true, false, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testChangeFileToFolder() {
try {
/* change file1 into a folder */
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.CONTENT | IResourceDelta.TYPE | IResourceDelta.REPLACED);
file1.delete(true, getMonitor());
folder3.create(true, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testChangeFolderToFile() {
try {
/* change to a folder */
file1.delete(true, getMonitor());
folder3.create(true, true, getMonitor());
rebuild();
/* now change back to a file and verify */
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.CONTENT | IResourceDelta.TYPE | IResourceDelta.REPLACED);
folder3.delete(true, getMonitor());
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {1, 2});
file1.create(in, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testCloseOpenReplaceFile() {
try {
rebuild();
project1.close(null);
project1.open(null);
/* change file1's contents */
verifier = DeltaVerifierBuilder.getInstance();
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.REPLACED | IResourceDelta.CONTENT);
file1.delete(true, null);
file1.create(getRandomContents(), true, null);
rebuild();
//new builder gets instantiated so grab a reference to the latest builder
verifier = DeltaVerifierBuilder.getInstance();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testMoveFile() {
try {
verifier.addExpectedChange(folder2, project1, IResourceDelta.ADDED, 0);
verifier.addExpectedChange(file1, project1, IResourceDelta.REMOVED, IResourceDelta.MOVED_TO, null, file3.getFullPath());
verifier.addExpectedChange(file3, project1, IResourceDelta.ADDED, IResourceDelta.MOVED_FROM, file1.getFullPath(), null);
folder2.create(true, true, getMonitor());
file1.move(file3.getFullPath(), true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testRemoveFile() {
try {
verifier.addExpectedChange(file1, project1, IResourceDelta.REMOVED, 0);
file1.delete(true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testRemoveFileAndFolder() {
try {
verifier.addExpectedChange(folder1, project1, IResourceDelta.REMOVED, 0);
verifier.addExpectedChange(file1, project1, IResourceDelta.REMOVED, 0);
folder1.delete(true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testReplaceFile() {
try {
/* change file1's contents */
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.REPLACED | IResourceDelta.CONTENT);
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file1.delete(true, getMonitor());
file1.create(in, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
/**
* Tests that the builder is receiving an appropriate delta
* @see SortBuilderPlugin
* @see SortBuilder
*/
public void testTwoFileChanges() {
try {
verifier.addExpectedChange(file1, project1, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
verifier.addExpectedChange(file2, project1, IResourceDelta.ADDED, 0);
ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {4, 5, 6});
file1.setContents(in, true, false, getMonitor());
ByteArrayInputStream in2 = new ByteArrayInputStream(new byte[] {4, 5, 6});
file2.create(in2, true, getMonitor());
rebuild();
assertDelta();
} catch (CoreException e) {
handleCoreException(e);
}
}
}