/******************************************************************************* * 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); } }