blob: 01978da1d9a5676f688afa1ceffa1bac0f59d21e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2017 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.resources.perf;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.localstore.IHistoryStore;
import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.tests.harness.PerformanceTestRunner;
import org.eclipse.core.tests.internal.localstore.HistoryStoreTest;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Contains a set of use case-oriented performance tests for the local history.
*
* @since 3.1
*/
public class LocalHistoryPerformanceTest extends ResourceTest {
private IWorkspaceDescription original;
public static Test 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);
}
public LocalHistoryPerformanceTest(String name) {
super(name);
}
void cleanHistory() {
((Workspace) getWorkspace()).getFileSystemManager().getHistoryStore().clean(getMonitor());
}
/**
* Creates a tree of resources containing history.
*/
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");
final IWorkspace workspace = getWorkspace();
try {
workspace.run((IWorkspaceRunnable) monitor -> {
ensureExistsInWorkspace(folders, true);
for (IFolder folder : folders) {
for (int j = 0; j < filesPerFolder; j++) {
IFile file = folder.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);
}
}
}
}, workspace.getRuleFactory().modifyRule(workspace.getRoot()), IWorkspace.AVOID_UPDATE, getMonitor());
} catch (CoreException e) {
fail("#createTree at : " + base.getFullPath(), e);
}
}
IWorkspaceDescription setMaxFileStates(String failureMessage, int maxFileStates) {
IWorkspaceDescription currentDescription = getWorkspace().getDescription();
IWorkspaceDescription testDescription = getWorkspace().getDescription();
testDescription.setMaxFileStates(maxFileStates);
try {
getWorkspace().setDescription(testDescription);
} catch (CoreException e) {
fail(failureMessage, e);
}
return currentDescription;
}
@Override
protected void setUp() throws Exception {
super.setUp();
original = getWorkspace().getDescription();
}
@Override
protected void tearDown() throws Exception {
getWorkspace().setDescription(original);
super.tearDown();
HistoryStoreTest.wipeHistoryStore(getMonitor());
}
public void testAddState() {
setMaxFileStates("0.01", 100);
final IFile file = getWorkspace().getRoot().getProject("proj1").getFile("file.txt");
new PerformanceTestRunner() {
@Override
protected void setUp() {
ensureExistsInWorkspace(file, getRandomContents());
}
@Override
protected void tearDown() {
try {
file.clearHistory(getMonitor());
file.delete(IResource.FORCE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
}
@Override
protected void test() {
try {
file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
} catch (CoreException e) {
fail("", e);
}
}
}.run(LocalHistoryPerformanceTest.this, 10, 30);
}
public void testBug28603() {
final IProject project = getWorkspace().getRoot().getProject("myproject");
final IFolder folder1 = project.getFolder("myfolder1");
final IFolder folder2 = project.getFolder("myfolder2");
final IFile file1 = folder1.getFile("myfile.txt");
final IFile file2 = folder2.getFile(file1.getName());
new PerformanceTestRunner() {
@Override
protected void setUp() {
ensureExistsInWorkspace(new IResource[] {project, folder1, folder2}, true);
try {
file1.create(getRandomContents(), IResource.FORCE, getMonitor());
file1.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor());
file1.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor());
file1.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor());
} catch (CoreException e) {
fail("0.0", e);
}
}
@Override
protected void tearDown() {
try {
ensureDoesNotExistInWorkspace(getWorkspace().getRoot());
IHistoryStore 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.remove(Path.ROOT, getMonitor());
// Now make sure all the states are really removed.
store.removeGarbage();
} catch (Exception e) {
fail("2.0", e);
}
}
@Override
protected void test() {
try {
file1.move(file2.getFullPath(), true, true, getMonitor());
file2.move(file1.getFullPath(), true, true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
}
}.run(this, 10, 5);
}
private void testClearHistory(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;
@Override
protected void setUp() {
original = setMaxFileStates("0.1", 1);
// make sure we start with no garbage
cleanHistory();
// create our own garbage
createTree(base, filesPerFolder, statesPerFile);
ensureDoesNotExistInWorkspace(base);
}
@Override
protected void tearDown() throws CoreException {
if (original != null) {
getWorkspace().setDescription(original);
}
}
@Override
protected void test() {
try {
base.clearHistory(getMonitor());
} catch (CoreException e) {
fail("", e);
}
}
}.run(this, 4, 3);
}
public void testClearHistory100x4() {
testClearHistory(100, 4);
}
public void testClearHistory20x20() {
testClearHistory(20, 20);
}
public void testClearHistory4x100() {
testClearHistory(4, 100);
}
private void testCopyHistory(int filesPerFolder, int statesPerFile) {
IProject project = getWorkspace().getRoot().getProject("proj1");
IFolder base = project.getFolder("base");
createTree(base, filesPerFolder, statesPerFile);
// need a final reference so the inner class can see it
final IProject[] tmpProject = new IProject[] {project};
new PerformanceTestRunner() {
@Override
protected void test() {
try {
String newProjectName = getUniqueString();
IProject newProject = getWorkspace().getRoot().getProject(newProjectName);
tmpProject[0].copy(newProject.getFullPath(), true, getMonitor());
tmpProject[0] = newProject;
} catch (CoreException e) {
fail("", e);
}
}
}.run(this, 10, 1);
}
public void testCopyHistory100x4() {
testCopyHistory(100, 4);
}
public void testCopyHistory20x20() {
testCopyHistory(20, 20);
}
public void testCopyHistory4x100() {
testCopyHistory(4, 100);
}
private void testGetDeletedMembers(int filesPerFolder, int statesPerFile) {
IProject project = getWorkspace().getRoot().getProject("proj1");
IFolder base = project.getFolder("base");
createTree(base, filesPerFolder, statesPerFile);
ensureDoesNotExistInWorkspace(base);
// need a final reference so the inner class can see it
final IProject tmpProject = project;
new PerformanceTestRunner() {
@Override
protected void test() {
try {
tmpProject.findDeletedMembersWithHistory(IResource.DEPTH_INFINITE, getMonitor());
} catch (CoreException e) {
fail("", e);
}
}
}.run(this, 2, 5);
}
public void testGetDeletedMembers100x4() {
testGetDeletedMembers(100, 4);
}
public void testGetDeletedMembers20x20() {
testGetDeletedMembers(20, 20);
}
public void testGetDeletedMembers4x100() {
testGetDeletedMembers(4, 100);
}
public void testGetHistory() {
IProject project = getWorkspace().getRoot().getProject("proj1");
final IFile file = project.getFile("file.txt");
ensureExistsInWorkspace(file, getRandomContents());
try {
for (int i = 0; i < 100; i++) {
file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
}
} catch (CoreException ce) {
fail("0.5", ce);
}
new PerformanceTestRunner() {
@Override
protected void test() {
try {
file.getHistory(getMonitor());
} catch (CoreException e) {
fail("", e);
}
}
}.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;
@Override
protected void setUp() {
original = setMaxFileStates("0.1", 1);
// make sure we start with no garbage
cleanHistory();
// create our own garbage
createTree(base, filesPerFolder, statesPerFile);
ensureDoesNotExistInWorkspace(base);
}
@Override
protected void tearDown() throws CoreException {
if (original != null) {
getWorkspace().setDescription(original);
}
}
@Override
protected void test() {
cleanHistory();
}
}.run(this, 5, 1);
}
public void testHistoryCleanUp100x4() {
testHistoryCleanUp(100, 4);
}
public void testHistoryCleanUp20x20() {
testHistoryCleanUp(20, 20);
}
}