blob: 6ad434433b783187a2226d35919cf1c7c801ad53 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2015 webtekie@gmail.com, 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:
* webtekie@gmail.com - initial API and implementation
* IBM Corporation - fixed dead code warning
* Thibault Le Ouay <thibaultleouay@gmail.com> - Bug 457870
*******************************************************************************/
package org.eclipse.ui.tests.navigator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.text.DecimalFormat;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.navigator.ICommonViewerMapper;
import org.eclipse.ui.navigator.resources.ProjectExplorer;
import org.eclipse.ui.tests.harness.util.DisplayHelper;
import org.eclipse.ui.tests.harness.util.EditorTestHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* A test to see if created projects are reflected in Project Explorer
*/
public class PerformanceTest extends NavigatorTestBase {
private int _numProjects = 50; // number of projects to
private int _numFiles = 1000;
private static final boolean DEBUG = false;
DecimalFormat _df = new DecimalFormat("000");
public PerformanceTest() {
_navigatorInstanceId = ProjectExplorer.VIEW_ID;
_initTestData = false;
}
@Override
@Before
public void setUp() {
super.setUp();
}
@Override
@After
public void tearDown() {
super.tearDown();
}
protected void createProjects() {
Job createJob = new Job("Create projects") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = 0; i < _numProjects; i++) {
String name = _df.format(i);
IProject p1 = ResourcesPlugin.getWorkspace().getRoot()
.getProject("p" + name);
p1.create(null);
p1.open(null);
IFile f1 = p1.getFile("f" + _df.format(0));
f1.create(new ByteArrayInputStream(new byte[] {}),
true, null);
}
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected exception: " + ex);
}
return Status.OK_STATUS;
}
};
createJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
createJob.schedule();
try {
createJob.join();
} catch (InterruptedException e) {
fail("Should not throw an exception");
}
assertEquals(createJob.getResult(), Status.OK_STATUS);
DisplayHelper.runEventLoop(Display.getCurrent(), 10);
int numOfProjects = _viewer.getTree().getItemCount();
System.out.println("Projects created: " + numOfProjects);
if (DEBUG)
DisplayHelper.sleep(Display.getCurrent(), 10000000);
assertEquals(_numProjects, numOfProjects);
}
protected void deleteProjects() {
Job deleteJob = new Job("Delete Projects") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = 0; i < _numProjects; i++) {
String name = _df.format(i);
IProject p1 = ResourcesPlugin.getWorkspace().getRoot()
.getProject("p" + name);
p1.delete(true, null);
}
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected exception: " + ex);
}
return Status.OK_STATUS;
}
};
deleteJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
deleteJob.schedule();
try {
deleteJob.join();
} catch (InterruptedException e) {
fail("Should not throw an exception");
}
assertEquals(deleteJob.getResult(), Status.OK_STATUS);
DisplayHelper.runEventLoop(Display.getCurrent(), 10);
}
protected void createFiles(final IProject project, final int startNumber)
{
Job createJob = new Job("Create Files") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = startNumber; i < _numFiles; i++) {
String name = _df.format(i);
IFile f1 = project.getFile("f" + name);
f1.create(new ByteArrayInputStream(new byte[] {}),
true, null);
}
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected exception: " + ex);
}
return Status.OK_STATUS;
}
};
createJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
createJob.schedule();
try {
createJob.join();
} catch (InterruptedException e) {
fail("Should not throw an exception");
}
assertEquals(createJob.getResult(), Status.OK_STATUS);
}
protected void touchFiles(final IProject p1) throws Exception {
Job touchJob = new Job("Touch Files") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = 0; i < _numFiles; i++) {
String name = _df.format(i);
IFile f1 = p1.getFile("f" + name);
f1.touch(null);
}
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected exception: " + ex);
}
return Status.OK_STATUS;
}
};
touchJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
touchJob.schedule();
touchJob.join();
assertEquals(touchJob.getResult(), Status.OK_STATUS);
}
// bug 159828 deleting large number of projects takes too long
@Test
public void testCreateAndDeleteProjects() {
_numProjects = 100;
createProjects();
// Hide it
try {
EditorTestHelper.showView(_navigatorInstanceId, false);
} catch (PartInitException e) {
fail("Should not throw an exception");
}
long start = System.currentTimeMillis();
deleteProjects();
DisplayHelper.sleep(500);
System.out.println("No project explorer delete " + _numProjects + " Time: "
+ (System.currentTimeMillis() - start));
showNavigator();
DisplayHelper.sleep(100);
createProjects();
DisplayHelper.sleep(200);
start = System.currentTimeMillis();
deleteProjects();
DisplayHelper.sleep(500);
System.out.println("Project explorer " + _numProjects + " Time: "
+ (System.currentTimeMillis() - start));
DisplayHelper.sleep(500);
}
public void XXXtestCreateAndTouchFiles() throws Exception {
final IProject p1 = ResourcesPlugin.getWorkspace().getRoot()
.getProject("p1");
p1.create(null);
p1.open(null);
createFiles(p1, 0);
_viewer.collapseAll();
if (DEBUG)
DisplayHelper.sleep(Display.getCurrent(), 10000000);
long start = System.currentTimeMillis();
Job touchJob = new Job("Touch Files") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
for (int i = 0; i < _numFiles; i++) {
String name = _df.format(i);
IFile f1 = p1.getFile("f" + name);
f1.touch(null);
}
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected exception: " + ex);
}
return Status.OK_STATUS;
}
};
touchJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
touchJob.schedule();
touchJob.join();
assertEquals(touchJob.getResult(), Status.OK_STATUS);
System.out.println("Touch " + _numFiles + " Time: "
+ (System.currentTimeMillis() - start));
}
protected void createFilesForProjects() {
for (int i = 0; i < _numProjects; i++) {
String name = _df.format(i);
IProject p1 = ResourcesPlugin.getWorkspace().getRoot().getProject(
"p" + name);
createFiles(p1, 1);
}
}
// bug 194209 updating lots of label providers does not scale well
@Test
public void testLabelProviderMapping() throws Exception {
ICommonViewerMapper mapper = _viewer.getMapper();
_numProjects = 1;
_numFiles = 2000;
createProjects();
createFilesForProjects();
// Warm up
final IProject p1 = ResourcesPlugin.getWorkspace().getRoot()
.getProject("p000");
try {
p1.close(null);
} catch (CoreException e) {
fail("Should not throw an exception");
}
long start = System.currentTimeMillis();
_viewer.setMapper(null);
p1.open(null);
// Let the updates run
DisplayHelper.sleep(200);
long createUnMappedTime = System.currentTimeMillis() - start;
System.out.println("Unmapped Time: " + createUnMappedTime);
p1.close(null);
DisplayHelper.sleep(200);
_viewer.setMapper(mapper);
start = System.currentTimeMillis();
p1.open(null);
// Let the updates run
DisplayHelper.sleep(200);
long createMappedTime = System.currentTimeMillis() - start;
System.out.println("Mapped Time: " + createMappedTime);
assertTrue(createMappedTime < createUnMappedTime);
}
}