blob: a76ec564e524e7b5f8efc4be247334cf08236ee3 [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
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
*******************************************************************************/
package org.eclipse.core.tests.resources.perf;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.tests.harness.PerformanceTestRunner;
import org.eclipse.core.tests.resources.ResourceTest;
public class PropertyManagerPerformanceTest extends ResourceTest {
public static String getPropertyValue(int size) {
StringBuffer value = new StringBuffer(size);
for (int i = 0; i < size; i++) {
value.append((char) (Math.random() * Character.MAX_VALUE));
}
return value.toString();
}
public static Test suite() {
// TestSuite suite = new TestSuite();
// suite.addTest(new PropertyManagerTest("testProperties"));
// return suite;
return new TestSuite(PropertyManagerPerformanceTest.class);
}
public PropertyManagerPerformanceTest(String name) {
super(name);
}
/**
* Creates a tree of resources.
*/
private List<IResource> createTree(IFolder base, int filesPerFolder) {
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");
List<IResource> resources = new ArrayList<>(filesPerFolder * folders.length);
for (IFolder folder : folders) {
resources.add(folder);
}
ensureExistsInWorkspace(folders, true);
for (IFolder folder : folders) {
for (int j = 0; j < filesPerFolder; j++) {
IFile file = folder.getFile("file" + j);
ensureExistsInWorkspace(file, getRandomContents());
resources.add(file);
}
}
return resources;
}
private void testGetProperty(int filesPerFolder, final int properties, int measurements, int repetitions) {
IProject proj1 = getWorkspace().getRoot().getProject("proj1");
final IFolder folder1 = proj1.getFolder("folder1");
final List<IResource> allResources = createTree(folder1, filesPerFolder);
for (IResource resource : allResources) {
for (int j = 0; j < properties; j++) {
try {
resource.setPersistentProperty(new QualifiedName(PI_RESOURCES_TESTS, "prop" + j), getPropertyValue(200));
} catch (CoreException ce) {
fail("0.2", ce);
}
}
}
new PerformanceTestRunner() {
@Override
protected void test() {
for (int j = 0; j < properties; j++) {
for (IResource resource : allResources) {
try {
assertNotNull(resource.getPersistentProperty(new QualifiedName(PI_RESOURCES_TESTS, "prop" + j)));
} catch (CoreException ce) {
fail("0.2", ce);
}
}
}
}
}.run(this, measurements, repetitions);
try {
((Workspace) getWorkspace()).getPropertyManager().deleteProperties(folder1, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
fail("0.1", e);
}
}
public void testGetProperty100x4() {
testGetProperty(100, 4, 10, 2);
}
public void testGetProperty20x20() {
testGetProperty(20, 20, 10, 2);
}
public void testGetProperty4x100() {
testGetProperty(4, 100, 10, 1);
}
private void testSetProperty(int filesPerFolder, int properties, int measurements, int repetitions) {
IProject proj1 = getWorkspace().getRoot().getProject("proj1");
final IFolder folder1 = proj1.getFolder("folder1");
final List<IResource> allResources = createTree(folder1, filesPerFolder);
new PerformanceTestRunner() {
@Override
protected void tearDown() {
try {
((Workspace) getWorkspace()).getPropertyManager().deleteProperties(folder1, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
fail("0.1", e);
}
}
@Override
protected void test() {
for (IResource resource : allResources) {
try {
resource.setPersistentProperty(new QualifiedName(PI_RESOURCES_TESTS, "prop" + ((int) Math.random() * 50)), getPropertyValue(200));
} catch (CoreException ce) {
fail("0.2", ce);
}
}
}
}.run(this, measurements, repetitions);
}
public void testSetProperty100x4() {
testSetProperty(100, 4, 10, 1);
}
public void testSetProperty20x20() {
testSetProperty(20, 20, 10, 4);
}
public void testSetProperty4x100() {
testSetProperty(4, 100, 10, 20);
}
}