org.eclipse.ajdt.ui.tests.builder.BuilderTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.ui.tests.builder.BuilderTest.java

Source

/*******************************************************************************
 * Copyright (c) 2004 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
 *     Helen Hawkins   - iniital version
 *******************************************************************************/
package org.eclipse.ajdt.ui.tests.builder;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;

import org.eclipse.ajdt.core.AspectJPlugin;
import org.eclipse.ajdt.internal.ui.refactoring.ReaderInputStream;
import org.eclipse.ajdt.ui.tests.UITestCase;
import org.eclipse.ajdt.ui.tests.testutils.TestLogger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;

/**
 * @author hawkinsh
 */
public class BuilderTest extends UITestCase {

    /*
     * @see TestCase#setUp()
     */
    protected void setUp() throws Exception {
        super.setUp();
    }

    /*
     * @see TestCase#tearDown()
     */
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    /**
     * Test for bug 78579 - creating a new file (non java/aj) in a package
     * copies the file over to the bin directory - deleting it should
     * remove it from the bin directory
     * 
     * @throws CoreException
     */
    public void testCopyAndRemoveNewNonSrcFile() throws CoreException {
        // test setup.....
        IProject simpleProject = createPredefinedProject("AnotherSimpleAJProject"); //$NON-NLS-1$
        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();
        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "p1" //$NON-NLS-1$
                + File.separator + "newFile.txt"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "p1" //$NON-NLS-1$
                + File.separator + "newFile.txt"; //$NON-NLS-1$

        assertFalse("newFile.txt should not exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        assertFalse("newFile.txt should not exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());

        // start of test
        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        IFolder p1 = src.getFolder("p1"); //$NON-NLS-1$
        if (!p1.exists()) {
            p1.create(true, true, null);
        }
        assertNotNull("src folder should not be null", src); //$NON-NLS-1$
        assertNotNull("package p1 should not be null", p1); //$NON-NLS-1$

        waitForJobsToComplete();

        IFile newFile = null;

        IFile f = p1.getFile("newFile.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = p1.getFile("newFile.txt"); //$NON-NLS-1$

        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile.txt should exist under src tree! (path=" + srcPath + ")", new File(srcPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$
        assertTrue("newFile.txt should exist under bin tree! (path=" + binPath + ")", new File(binPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        // check that the .java file hasn't been copied over...
        String binPathToMain = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "bin" + File.separator + "p1" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "Main.java"; //$NON-NLS-1$
        assertFalse("Main.java should not exist under bin tree! (path=" + binPathToMain + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPathToMain).exists());

        // now delete the file
        newFile.delete(true, null);
        waitForJobsToComplete();

        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile.txt should NOT exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();
        assertFalse("newFile.txt should NOT exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());
    }

    /**
     * Test for bug 78579 - creating a new file (non java/aj) in the default package
     * copies the file over to the bin directory - deleting the file in the src tree
     * should then delete it from the bin dir.
     * 
     * @throws CoreException
     */
    public void testCreateAndRemoveNewNonSrcFileFromDefaultPackage() throws CoreException {
        IProject simpleProject = createPredefinedProject("AnotherSimpleAJProject"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "newFile2.txt"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "newFile2.txt"; //$NON-NLS-1$

        assertFalse("newFile2.txt should not exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        assertFalse("newFile2.txt should not exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());

        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        assertNotNull("src folder should not be null", src); //$NON-NLS-1$

        waitForJobsToComplete();

        IFile newFile = null;
        IFile f = src.getFile("newFile2.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = src.getFile("newFile2.txt"); //$NON-NLS-1$

        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile2.txt should exist under src tree! (path=" + srcPath + ")", new File(srcPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        assertTrue("newFile2.txt should exist under bin tree! (path=" + binPath + ")", new File(binPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        // check that the .java file hasn't been copied over...
        String binPathToMain = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "bin" + File.separator + "p1" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "Main.java"; //$NON-NLS-1$
        assertFalse("Main.java should not exist under bin tree! (path=" + binPathToMain + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPathToMain).exists());

        // now delete the file for cleanup
        newFile.delete(true, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile2.txt should NOT exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        waitForJobsToComplete();
        assertFalse("newFile2.txt should NOT exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());
    }

    /**
     * Test for bug 78579 - creating a new file (non java/aj) in a package
     * copies the file over to the bin directory - when there are multiple
     * src dirs. Deleting this file should then remove it from the bin dir.
     * 
     * @throws CoreException
     */
    public void testCopyAndRemoveNewNonSrcFileWithMultipleSrcDirs() throws CoreException {
        IProject simpleProject = createPredefinedProject("MultipleSourceFolders"); //$NON-NLS-1$
        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src2" //$NON-NLS-1$
                + File.separator + "pack" //$NON-NLS-1$
                + File.separator + "newFile.txt"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "pack" //$NON-NLS-1$
                + File.separator + "newFile.txt"; //$NON-NLS-1$
        assertFalse("newFile.txt should not exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        assertFalse("newFile.txt should not exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());

        IFolder src2 = simpleProject.getFolder("src2"); //$NON-NLS-1$
        if (!src2.exists()) {
            src2.create(true, true, null);
        }
        IFolder pack = src2.getFolder("pack"); //$NON-NLS-1$
        if (!pack.exists()) {
            pack.create(true, true, null);
        }
        assertNotNull("src2 folder should not be null", src2); //$NON-NLS-1$
        assertNotNull("package pack should not be null", pack); //$NON-NLS-1$

        waitForJobsToComplete();

        IFile newFile = null;
        IFile f = pack.getFile("newFile.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = pack.getFile("newFile.txt"); //$NON-NLS-1$

        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile.txt should exist under src2 tree! (path=" + srcPath + ")", new File(srcPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        assertTrue("newFile.txt should exist under bin tree! (path=" + binPath + ")", new File(binPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        // check that the .java file hasn't been copied over...
        String binPathToMain = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "bin" + File.separator + "pack" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "Class3.java"; //$NON-NLS-1$
        assertFalse("Class3.java should not exist under bin tree! (path=" + binPathToMain + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPathToMain).exists());

        // now delete the file for cleanup
        newFile.delete(true, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile.txt should NOT exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        waitForJobsToComplete();
        assertFalse("newFile.txt should NOT exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());
    }

    /**
     * Test for bug 78579 - creating a new file (non java/aj) in a package
     * copies the file over to the bin directory - when the output directory
     * is a non standard one (ie not called "bin").
     * 
     * @throws CoreException
     */
    public void testCopyAndRemoveNewNonSrcFileWithNonStandardOutputDir() throws CoreException {
        IProject simpleProject = createPredefinedProject("NonStandardOutputLocation"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "pack" //$NON-NLS-1$
                + File.separator + "newFile.txt"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "nonStandardBin" + File.separator + "pack" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "newFile.txt"; //$NON-NLS-1$
        assertFalse("newFile.txt should not exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        assertFalse("newFile.txt should not exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());

        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        IFolder pack = src.getFolder("pack"); //$NON-NLS-1$
        if (!pack.exists()) {
            pack.create(true, true, null);
        }
        assertNotNull("src folder should not be null", src); //$NON-NLS-1$
        assertNotNull("package pack should not be null", pack); //$NON-NLS-1$

        waitForJobsToComplete();

        IFile newFile = null;
        IFile f = pack.getFile("newFile.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = pack.getFile("newFile.txt"); //$NON-NLS-1$

        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile.txt should exist under src2 tree! (path=" + srcPath + ")", new File(srcPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        assertTrue("newFile.txt should exist under bin tree! (path=" + binPath + ")", new File(binPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        // check that the .java file hasn't been copied over...
        String binPathToMain = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "nonStandardBin" + File.separator + "pack" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "Main.java"; //$NON-NLS-1$
        assertFalse("Main.java should not exist under bin tree! (path=" + binPathToMain + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPathToMain).exists());

        // now delete the file for cleanup
        newFile.delete(true, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile.txt should NOT exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        waitForJobsToComplete();
        assertFalse("newFile.txt should NOT exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());
    }

    /**
     * Test for bug 78579 - updating a nonsrc file (non java/aj) in a package
     * copies over the updated version to the bin dir
     * 
     * @throws CoreException
     */
    public void testUpdateNonSrcFile() throws CoreException, IOException {
        // create the project and the new file
        IProject simpleProject = createPredefinedProject("AnotherSimpleAJProject"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "p1" //$NON-NLS-1$
                + File.separator + "newFile4.txt"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "p1" //$NON-NLS-1$
                + File.separator + "newFile4.txt"; //$NON-NLS-1$
        assertFalse("newFile4.txt should not exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        assertFalse("newFile4.txt should not exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());

        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        IFolder p1 = src.getFolder("p1"); //$NON-NLS-1$
        if (!p1.exists()) {
            p1.create(true, true, null);
        }
        assertNotNull("src folder should not be null", src); //$NON-NLS-1$
        assertNotNull("package p1 should not be null", p1); //$NON-NLS-1$

        waitForJobsToComplete();

        IFile newFile = null;
        IFile f = p1.getFile("newFile4.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = p1.getFile("newFile4.txt"); //$NON-NLS-1$
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile4.txt should exist under src tree! (path=" + srcPath + ")", new File(srcPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();

        assertTrue("newFile4.txt should exist under bin tree! (path=" + binPath + ")", new File(binPath).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        // check that the .java file hasn't been copied over...
        String binPathToMain = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "bin" + File.separator + "p1" //$NON-NLS-1$ //$NON-NLS-2$
                + File.separator + "Main.java"; //$NON-NLS-1$
        assertFalse("Main.java should not exist under bin tree! (path=" + binPathToMain + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPathToMain).exists());

        IFolder bin = simpleProject.getFolder("bin"); //$NON-NLS-1$
        if (!bin.exists()) {
            bin.create(true, true, null);
        }
        IFolder binp1 = bin.getFolder("p1"); //$NON-NLS-1$
        if (!binp1.exists()) {
            binp1.create(true, true, null);
        }
        IFile binNewFile = binp1.getFile("newFile4.txt"); //$NON-NLS-1$

        // get the contents of the file - shouldn't be anything in there
        InputStream fileContents = newFile.getContents();
        BufferedReader reader = new BufferedReader(new InputStreamReader(fileContents));
        String line = reader.readLine();
        assertNull("File should not contain anything", line); //$NON-NLS-1$
        reader.close();
        fileContents.close();

        waitForJobsToComplete();

        // get the contents of the file under "bin" tree - should contain nothing
        InputStream fileContents4 = binNewFile.getContents();
        BufferedReader reader4 = new BufferedReader(new InputStreamReader(fileContents4));
        String line4 = reader4.readLine();
        assertNull("File should not contain anything", line4); //$NON-NLS-1$
        reader4.close();
        fileContents4.close();

        waitForJobsToComplete();

        // write "blah blah blah" to the file
        StringBuffer sb = new StringBuffer("blah blah blah"); //$NON-NLS-1$
        StringReader sr = new StringReader(sb.toString());
        newFile.setContents(new ReaderInputStream(sr), IResource.FORCE, null);
        sr.close();

        waitForJobsToComplete();

        // get the contents of the file under "src" tree - should contain "blah blah blah"
        InputStream fileContents2 = newFile.getContents();
        BufferedReader reader2 = new BufferedReader(new InputStreamReader(fileContents2));
        String line2 = reader2.readLine();
        assertEquals("file under src should contain 'blah blah blah'", "blah blah blah", line2); //$NON-NLS-1$ //$NON-NLS-2$
        reader2.close();
        fileContents2.close();

        waitForJobsToComplete();

        // get the contents of the file under "bin" tree - should contain "blah blah blah"
        InputStream fileContents3 = binNewFile.getContents();
        BufferedReader reader3 = new BufferedReader(new InputStreamReader(fileContents3));
        String line3 = reader3.readLine();
        assertEquals("file under bin should contain 'blah blah blah'", "blah blah blah", line3); //$NON-NLS-1$ //$NON-NLS-2$
        reader3.close();
        fileContents3.close();
        waitForJobsToComplete();

        // now delete the file for cleanup
        newFile.delete(true, null);
        waitForJobsToComplete();
        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile4.txt should NOT exist under src tree! (path=" + srcPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(srcPath).exists());
        waitForJobsToComplete();
        assertFalse("newFile4.txt should NOT exist under bin tree! (path=" + binPath + ")", //$NON-NLS-1$//$NON-NLS-2$
                new File(binPath).exists());
    }

    /**
     * Test for bug 78579 - creating a nonsrc file (non java/aj) in a 
     * project which has the same output and src directories
     * 
     * @throws CoreException
     */
    public void testCopyAndRemoveResourceWithoutSrcFolder() throws CoreException {
        IProject project = createPredefinedProject("WithoutSourceFolder"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(project);
        waitForJobsToComplete();

        String path = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator
                + "newFile.txt"; //$NON-NLS-1$

        assertFalse("newFile.txt should not exist under src tree! (path=" + path + ")", new File(path).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        waitForJobsToComplete();

        IFile newFile = null;
        IFile f = project.getFile("newFile.txt"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(new ByteArrayInputStream(new byte[0]), true, null);
        }
        newFile = project.getFile("newFile.txt"); //$NON-NLS-1$

        project.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If this fails, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertTrue("newFile.txt should exist in the top dir (path=" + path + ")", new File(path).exists()); //$NON-NLS-1$ //$NON-NLS-2$

        newFile.delete(true, null);
        waitForJobsToComplete();
        // If this fails, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        assertFalse("newFile.txt should NOT exist in the top dir(path=" + path + ")", new File(path).exists()); //$NON-NLS-1$ //$NON-NLS-2$
    }

    /**
     * Test for bug 78579 - when you create a package, this should be copied
     * over to the bin dir. Similarly, when you delete the package, the bin
     * dir should be updated.
     * 
     * @throws Exception
     */
    public void testCreateAndDeleteNewPackage() throws Exception {
        IProject simpleProject = createPredefinedProject("AnotherSimpleAJProject"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "newPackage"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "newPackage"; //$NON-NLS-1$

        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        waitForJobsToComplete();

        IFolder newPackage = src.getFolder("newPackage"); //$NON-NLS-1$
        assertFalse("newPackage should not exist under src tree! (path=" + srcPath + ")", newPackage.exists()); //$NON-NLS-1$ //$NON-NLS-2$

        IFolder bin = simpleProject.getFolder("bin"); //$NON-NLS-1$
        if (!bin.exists()) {
            bin.create(true, true, null);
        }
        waitForJobsToComplete();
        IFolder newBinPackage = bin.getFolder("newPackage"); //$NON-NLS-1$
        assertFalse("newPackage should not exist under bin tree! (path=" + binPath + ")", newBinPackage.exists()); //$NON-NLS-1$ //$NON-NLS-2$

        waitForJobsToComplete();

        String str = "AnotherSimpleAJProject" + File.separator + "src"; //$NON-NLS-1$ //$NON-NLS-2$
        IPath path = new Path(str);
        IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
        IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(res);
        root.createPackageFragment("newPackage", true, null); //$NON-NLS-1$

        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        IFolder newPackage2 = src.getFolder("newPackage"); //$NON-NLS-1$
        assertTrue("newPackage should exist under src tree! (path=" + srcPath + ")", newPackage2.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();
        IFolder newBinPackage2 = bin.getFolder("newPackage"); //$NON-NLS-1$
        assertTrue("newPackage should exist under bin tree! (path=" + binPath + ")", newBinPackage2.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();

        newPackage.delete(true, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        IFolder newPackage3 = src.getFolder("newPackage"); //$NON-NLS-1$
        assertFalse("newPackage should not exist under src tree! (path=" + srcPath + ")", newPackage3.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();
        IFolder newBinPackage3 = bin.getFolder("newPackage"); //$NON-NLS-1$
        assertFalse("newPackage should not exist under bin tree! (path=" + binPath + ")", newBinPackage3.exists()); //$NON-NLS-1$ //$NON-NLS-2$

        waitForJobsToComplete();
    }

    public void testCreateAndDeleteNewFolder() throws CoreException {
        IProject simpleProject = createPredefinedProject("AnotherSimpleAJProject"); //$NON-NLS-1$

        IJavaProject javaProject = JavaCore.create(simpleProject);
        waitForJobsToComplete();

        String srcPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "src" //$NON-NLS-1$
                + File.separator + "newFolder"; //$NON-NLS-1$

        String binPath = javaProject.getUnderlyingResource().getLocation().toOSString() + File.separator + "bin" //$NON-NLS-1$
                + File.separator + "newFolder"; //$NON-NLS-1$
        IFolder src = simpleProject.getFolder("src"); //$NON-NLS-1$
        if (!src.exists()) {
            src.create(true, true, null);
        }
        waitForJobsToComplete();

        IFolder newFolder = src.getFolder("newFolder"); //$NON-NLS-1$
        assertFalse("newFolder should not exist under src tree! (path=" + srcPath + ")", newFolder.exists()); //$NON-NLS-1$ //$NON-NLS-2$

        IFolder bin = simpleProject.getFolder("bin"); //$NON-NLS-1$
        if (!bin.exists()) {
            bin.create(true, true, null);
        }
        waitForJobsToComplete();
        IFolder newBinFolder = bin.getFolder("newFolder"); //$NON-NLS-1$
        assertFalse("newFolder should not exist under bin tree! (path=" + binPath + ")", newBinFolder.exists()); //$NON-NLS-1$ //$NON-NLS-2$

        waitForJobsToComplete();

        IFolder f = src.getFolder("newFolder"); //$NON-NLS-1$
        if (!f.exists()) {
            f.create(true, true, null);
        }

        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        waitForJobsToComplete();

        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        IFolder newFolder2 = src.getFolder("newFolder"); //$NON-NLS-1$
        assertTrue("newFolder should exist under src tree! (path=" + srcPath + ")", newFolder2.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        //monitor.waitForCompletion();
        IFolder newBinFolder2 = bin.getFolder("newFolder"); //$NON-NLS-1$
        assertTrue("newFolder should exist under bin tree! (path=" + binPath + ")", newBinFolder2.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();

        newFolder.delete(true, null);
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        // If either of these fail, then it's more likely than not to be
        // down to the timings of driving this programatically (this is
        // why there is a sleep above.
        IFolder newFolder3 = src.getFolder("newFolder"); //$NON-NLS-1$
        assertFalse("newFolder should not exist under src tree! (path=" + srcPath + ")", newFolder3.exists()); //$NON-NLS-1$ //$NON-NLS-2$
        waitForJobsToComplete();
        simpleProject.refreshLocal(IResource.DEPTH_INFINITE, null);
        //monitor.waitForCompletion();
        IFolder newBinFolder3 = bin.getFolder("newFolder"); //$NON-NLS-1$
        assertFalse("newFolder should not exist under bin tree! (path=" + binPath + ")", newBinFolder3.exists()); //$NON-NLS-1$ //$NON-NLS-2$
    }

    public void testIncrementalBuildWithSrcFolder() throws Exception {
        TestLogger testLog = new TestLogger();
        AspectJPlugin.getDefault().setAJLogger(testLog);
        IProject project = createPredefinedProject("TJP Example"); //$NON-NLS-1$
        try {
            assertFalse("project should have no errors", testLog //$NON-NLS-1$
                    .containsMessage("error")); //$NON-NLS-1$

            IFolder src = project.getFolder("src"); //$NON-NLS-1$
            if (!src.exists()) {
                src.create(true, true, null);
            }
            IFolder pack = src.getFolder("tjp"); //$NON-NLS-1$
            if (!pack.exists()) {
                pack.create(true, true, null);
            }
            IFile c = pack.getFile("Demo.java"); //$NON-NLS-1$
            assertNotNull("src folder should not be null", src); //$NON-NLS-1$
            assertNotNull("package tjp should not be null", pack); //$NON-NLS-1$
            assertNotNull("class Demo should not be null", c); //$NON-NLS-1$
            assertTrue("java file should exist", c.exists()); //$NON-NLS-1$

            IFolder bin = project.getFolder("bin"); //$NON-NLS-1$
            if (!bin.exists()) {
                bin.create(true, true, null);
            }
            IFolder binPack = bin.getFolder("tjp"); //$NON-NLS-1$
            if (!binPack.exists()) {
                binPack.create(true, true, null);
            }
            IFile binC = binPack.getFile("Demo.class"); //$NON-NLS-1$
            assertTrue("class file should exist", binC.exists()); //$NON-NLS-1$

            String rep = testLog.getMostRecentMatchingMessage("AspectJ reports build successful"); //$NON-NLS-1$
            System.out.println("rep: " + rep); //$NON-NLS-1$

            // add a comment to the class
            StringReader sr = new StringReader("/* blah blah blah */"); //$NON-NLS-1$
            c.appendContents(new ReaderInputStream(sr), IResource.FORCE, null);

            waitForJobsToComplete();

            assertTrue("Successful build should have occurred", testLog //$NON-NLS-1$
                    .containsMessage("AspectJ reports build successful")); //$NON-NLS-1$

            rep = testLog.getMostRecentMatchingMessage("AspectJ reports build successful"); //$NON-NLS-1$
            assertNotNull("Successful build should have been reported", rep); //$NON-NLS-1$

            assertTrue("The build should have been an incremental one", wasIncrementalBuild(rep)); //$NON-NLS-1$
        } finally {
            AspectJPlugin.getDefault().setAJLogger(null);
        }
    }

    public void testIncrementalBuildWithoutSrcFolder() throws Exception {
        TestLogger testLog = new TestLogger();
        AspectJPlugin.getDefault().setAJLogger(testLog);
        IProject project = createPredefinedProject("bug102652"); //$NON-NLS-1$
        try {
            assertFalse("project should have no errors", testLog //$NON-NLS-1$
                    .containsMessage("error")); //$NON-NLS-1$

            IFolder pack = project.getFolder("tjp"); //$NON-NLS-1$
            if (!pack.exists()) {
                pack.create(true, true, null);
            }
            IFile c = pack.getFile("Demo.java"); //$NON-NLS-1$
            assertNotNull("package tjp should not be null", pack); //$NON-NLS-1$
            assertNotNull("class Demo should not be null", c); //$NON-NLS-1$
            assertTrue("java file should exist", c.exists()); //$NON-NLS-1$

            IFile binC = pack.getFile("Demo.class"); //$NON-NLS-1$
            assertTrue("class file should exist", binC.exists()); //$NON-NLS-1$

            // add a comment to the class
            StringReader sr = new StringReader("/* blah blah blah */"); //$NON-NLS-1$
            c.appendContents(new ReaderInputStream(sr), IResource.FORCE, null);

            waitForJobsToComplete();

            assertFalse("Source file changes should have been detected", testLog //$NON-NLS-1$
                    .containsMessage("no source file changes for project bug102652")); //$NON-NLS-1$

            assertTrue("Successful build should have occurred", testLog //$NON-NLS-1$
                    .containsMessage("AspectJ reports build successful")); //$NON-NLS-1$

            String rep = testLog.getMostRecentMatchingMessage("AspectJ reports build successful"); //$NON-NLS-1$
            assertNotNull("Successful build should have been reported", rep); //$NON-NLS-1$
            assertTrue("The build should have been an incremental one", wasIncrementalBuild(rep)); //$NON-NLS-1$
        } finally {
            AspectJPlugin.getDefault().setAJLogger(null);
        }
    }

    private boolean wasIncrementalBuild(String msg) {
        return msg.toLowerCase().indexOf("was: incremental") != -1; //$NON-NLS-1$
    }
}