backported history clean-up tests to 2.1.3
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
index e69f7bc..11f8eaf 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials 
  * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,6 +12,8 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.eclipse.core.internal.localstore.HistoryStore;
+import org.eclipse.core.internal.resources.Workspace;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.tests.harness.PerformanceTestRunner;
@@ -20,7 +22,7 @@
 
 /**
  * Contains a set of use case-oriented performance tests for the local history.
- *  
+ * 
  * @since 3.1
  */
 public class LocalHistoryPerformanceTest extends ResourceTest {
@@ -28,12 +30,13 @@
 	private IWorkspaceDescription original;
 
 	public static Test suite() {
-		//		TestSuite suite = new TestSuite(LocalHistoryPerformanceTest.class.getName());
-		//		suite.addTest(new LocalHistoryPerformanceTest("testCopyHistory100x4"));		
-		//		suite.addTest(new LocalHistoryPerformanceTest("testCopyHistory20x20"));
-		//		suite.addTest(new LocalHistoryPerformanceTest("testCopyHistory4x100"));
-		//		suite.addTest(new LocalHistoryPerformanceTest("testGetHistory"));
-		//		return suite;
+		// TestSuite suite = new
+		// TestSuite(LocalHistoryPerformanceTest.class.getName());
+		// suite.addTest(new
+		// LocalHistoryPerformanceTest("testHistoryCleanUp100x4"));
+		// suite.addTest(new
+		// LocalHistoryPerformanceTest("testHistoryCleanUp4x100"));
+		// return suite;
 		return new TestSuite(LocalHistoryPerformanceTest.class);
 	}
 
@@ -41,28 +44,40 @@
 		super(name);
 	}
 
+	private void cleanHistory() {
+		((Workspace) getWorkspace()).getFileSystemManager().getHistoryStore().clean();
+	}
+
 	/**
-	 * Creates a tree of resources containing history. 
+	 * Creates a tree of resources containing history.
 	 */
-	private void createTree(IFolder base, int filesPerFolder, int statesPerFile) {
-		IFolder[] folders = new IFolder[5];
+	private void createTree(IFolder base, final int filesPerFolder, final int statesPerFile) {
+		final IFolder[] folders = new IFolder[5];
 		folders[0] = base.getFolder("folder1");
 		folders[1] = base.getFolder("folder2");
 		folders[2] = folders[0].getFolder("folder3");
 		folders[3] = folders[2].getFolder("folder4");
 		folders[4] = folders[3].getFolder("folder5");
-		ensureExistsInWorkspace(folders, true);
-		for (int i = 0; i < folders.length; i++) {
-			for (int j = 0; j < filesPerFolder; j++) {
-				IFile file = folders[i].getFile("file" + j);
-				ensureExistsInWorkspace(file, getRandomContents());
-				try {
-					for (int k = 0; k < statesPerFile; k++)
-						file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
-				} catch (CoreException ce) {
-					fail("0.5", ce);
+		final IWorkspace workspace = getWorkspace();
+		try {
+			workspace.run(new IWorkspaceRunnable() {
+				public void run(org.eclipse.core.runtime.IProgressMonitor monitor) throws CoreException {
+					ensureExistsInWorkspace(folders, true);
+					for (int i = 0; i < folders.length; i++)
+						for (int j = 0; j < filesPerFolder; j++) {
+							IFile file = folders[i].getFile("file" + j);
+							ensureExistsInWorkspace(file, getRandomContents());
+							try {
+								for (int k = 0; k < statesPerFile; k++)
+									file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
+							} catch (CoreException ce) {
+								fail("0.5", ce);
+							}
+						}
 				}
-			}
+			}, getMonitor());
+		} catch (CoreException e) {
+			fail("#createTree at : " + base.getFullPath(), e);
 		}
 	}
 
@@ -140,7 +155,12 @@
 			protected void tearDown() {
 				try {
 					ensureDoesNotExistInWorkspace(getWorkspace().getRoot());
-					HistoryStoreTest.wipeHistoryStore();
+					HistoryStore store = ((Workspace) getWorkspace()).getFileSystemManager().getHistoryStore();
+					// Remove all the entries from the history store index. Note that 
+					// this does not cause the history store states to be removed.
+					store.removeAll(getWorkspace().getRoot());
+					// Now make sure all the states are really removed.
+					store.removeGarbage();
 				} catch (Exception e) {
 					fail("2.0", e);
 				}
@@ -162,12 +182,22 @@
 		final IFolder base = project.getFolder("base");
 		ensureDoesNotExistInWorkspace(base);
 		new PerformanceTestRunner() {
+			private IWorkspaceDescription original;
 
 			protected void setUp() {
+				original = setMaxFileStates("0.1", 1);
+				// make sure we start with no garbage				
+				HistoryStoreTest.wipeHistoryStore();
+				// create our own garbage							
 				createTree(base, filesPerFolder, statesPerFile);
 				ensureDoesNotExistInWorkspace(base);
 			}
 
+			protected void tearDown() throws CoreException {
+				if (original != null)
+					getWorkspace().setDescription(original);
+			}
+
 			protected void test() {
 				try {
 					base.clearHistory(getMonitor());
@@ -272,4 +302,44 @@
 			}
 		}.run(this, 1, 150);
 	}
+
+	private void testHistoryCleanUp(final int filesPerFolder, final int statesPerFile) {
+		IProject project = getWorkspace().getRoot().getProject("proj1");
+		final IFolder base = project.getFolder("base");
+		ensureDoesNotExistInWorkspace(base);
+		new PerformanceTestRunner() {
+			private IWorkspaceDescription original;
+
+			protected void setUp() {
+				original = setMaxFileStates("0.1", 1);
+				// make sure we start with no garbage
+				HistoryStoreTest.wipeHistoryStore();
+				// create our own garbage
+				createTree(base, filesPerFolder, statesPerFile);
+				ensureDoesNotExistInWorkspace(base);
+			}
+
+			protected void tearDown() throws CoreException {
+				if (original != null)
+					getWorkspace().setDescription(original);
+			}
+
+			protected void test() {
+				cleanHistory();
+			}
+
+		}.run(this, 5, 1);
+	}
+
+	public void testHistoryCleanUp100x4() {
+		testHistoryCleanUp(100, 4);
+	}
+
+	public void testHistoryCleanUp20x20() {
+		testHistoryCleanUp(20, 20);
+	}
+
+	public void testHistoryCleanUp4x100() {
+		testHistoryCleanUp(4, 100);
+	}
 }