Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[wtp-dev] JUnit tip: How to delete projects


Some of our JUnits suites require that projects or other resources be deleted during the test, for various reasons, and I think some of the "random errors" we see are because it's hard to delete a project, or file, in a multi-threaded Eclipse. If there is a file from the project open in another thread, for example, perhaps in a thread that's running validation, hence reading files, the delete will fail ("randomly") and then that might cause a JUnit test to fail, directly or indirectly (by having an unexpected state).

I had to solve this, just this evening, and took me a while, reading platform test examples, and googling around, to find a solution that I think is fairly good ... for JUnit tests, at least.

I've pasted the code below ... just in case it helps anyone. Hopefully the constants are obvious, but if anyone wants to see the whole class, it is
org.eclipse.jst.jsp.core.tests.taglibindex.TestIndex

And ... as always the case in open development ... if anyone has other tips/tricks, or better ways, feel free to let us know.

Thanks,




        /**
         * It's not easy to delete projects. If any of it's files are open by another thread,
         * the operation will fail. So, this method will make several attempts before giving up.
         * @param project
         * @throws CoreException
         * @throws InterruptedException
         */
        private void deleteProject(IProject project) throws CoreException, InterruptedException {
                int nTrys = 0;
                while (project != null && project.exists() && nTrys < MAX_RETRYS) {
                        try {
                                nTrys++;
                                project.delete(true, true, null);
                        }
                        catch (ResourceException e) {
                                if (DEBUG) {
                                        System.out.println();
                                        System.out.println("Could not delete project on attempt number: "+ nTrys);
                                        IStatus eStatus = e.getStatus();
                                        // should always be MultiStatus, but we'll check
                                        if (eStatus instanceof MultiStatus) {
                                                MultiStatus mStatus = (MultiStatus) eStatus;
                                                IStatus[] iStatus = mStatus.getChildren();
                                                for (int j = 0; j < iStatus.length; j++) {
                                                        System.out.println("Status: " + j + " " + iStatus[j]);
                                                }
                                        }
                                        else {
                                                System.out.println("Status: " + eStatus);
                                        }
                                }
                                /*
                                 * If we could not delete the first time, wait a bit and
                                 * re-try. If we could not delete, it is likely because
                                 * another thread has a file open, or similar (such as the
                                 * validation thread).
                                 */
                                Thread.sleep(PAUSE_TIME);
                        }
                }
               
                if (project != null && project.exists()) {
                        fail("Error in test infrastructure. Could not delete project " + project + " after " + MAX_RETRYS + "attempts.");
                }
        }

Back to the top