blob: 3a4cf0f0a0f8aa5b0cf6fcc8d5ed90e4cd805ca2 [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
* Francis Lynch (Wind River) - [301563] adapted from RefreshLocalPerformanceTest
*******************************************************************************/
package org.eclipse.core.tests.resources;
import java.io.File;
import java.net.URI;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.harness.PerformanceTestRunner;
/**
* Measure speed of a project "Import with Snapshot" operation compared
* to a normal "Project Import" operation, as per bug 301563.
*
* This test is meant to be run manually, and not integrated into the
* automated test suite. Requires large project data (thousands of folders)
* to be available on a slow file system (bigSiteLocation). Modify
* bigSiteLocation to suit your needs, then run-as > JUnit Plug-in Test.
*/
public class ProjectSnapshotPerfManualTest extends ResourceTest {
/** big site default volume (windows) */
public static final String bigSiteDevice = "c:";
/** big site initial location. Modify to suit your needs */
public static final IPath bigSiteLocation = new Path(bigSiteDevice, "/test");
/** settings directory name */
private static final String DIR_NAME = ".settings";
/** location of refresh snapshot file */
private static final String REFRESH_SNAPSHOT_FILE_LOCATION = ".settings/resource-index.zip";
public ProjectSnapshotPerfManualTest() {
super();
}
public ProjectSnapshotPerfManualTest(String name) {
super(name);
}
protected int countChildren(File root) {
String[] children = root.list();
if (children == null) {
return 0;
}
int result = 0;
for (String element : children) {
File child = new File(root, element);
if (child.isDirectory()) {
result += countChildren(child);
}
result++;
}
return result;
}
// this test should not be in AllTests because it is only a performance test
public static Test suite() {
TestSuite suite = new TestSuite(ProjectSnapshotPerfManualTest.class.getName());
suite.addTest(new ProjectSnapshotPerfManualTest("testSnapshotImportPerformance"));
return suite;
}
/**
* Open a project and export a refresh snapshot. Re-open the project using
* the snapshot and compare the times for opening with and without the
* snapshot.
*/
public void testSnapshotImportPerformance() throws Exception {
// test if the test can be done in this machine
if (!bigSiteLocation.toFile().isDirectory()) {
return;
}
// create common objects
final IProject project = getWorkspace().getRoot().getProject("MyTestProject");
IProjectDescription description = getWorkspace().newProjectDescription(project.getName());
description.setLocation(bigSiteLocation);
// report the number of files to be refreshed
int numberOfFiles = countChildren(bigSiteLocation.toFile());
System.out.println("Number of local resources: " + numberOfFiles);
// create the project from the location
project.create(description, null);
// open the project, timing the initial refresh
new PerformanceTestRunner() {
@Override
protected void test() {
try {
project.open(null);
} catch (CoreException e) {
fail("Original open", e);
}
}
}.run(new ProjectSnapshotPerfManualTest("Original open"), 1, 1);
// dump the snapshot refresh info
ensureExistsInWorkspace(project.getFolder(DIR_NAME), true);
IPath projPath = project.getLocation();
projPath = projPath.append(REFRESH_SNAPSHOT_FILE_LOCATION);
final URI snapshotLocation = org.eclipse.core.filesystem.URIUtil.toURI(projPath);
project.saveSnapshot(IProject.SNAPSHOT_TREE, snapshotLocation, null);
// close and delete project but leave contents
project.close(null);
project.delete(false, false, null);
// open the project and import refresh snapshot
project.create(description, null);
new PerformanceTestRunner() {
@Override
protected void test() {
try {
project.loadSnapshot(IProject.SNAPSHOT_TREE, snapshotLocation, null);
project.open(IResource.NONE, null);
} catch (CoreException e) {
fail("Snapshot open", e);
}
}
}.run(new ProjectSnapshotPerfManualTest("Snapshot open"), 1, 1);
// now refresh the project, verifying zero resource delta
// (except for the creation of .settings/resource-index.zip)
final ResourceDeltaVerifier[] verifier = new ResourceDeltaVerifier[1];
new PerformanceTestRunner() {
@Override
protected void test() {
try {
verifier[0] = new ResourceDeltaVerifier();
ResourcesPlugin.getWorkspace().addResourceChangeListener(verifier[0]);
verifier[0].reset();
IFolder settings = project.getFolder(DIR_NAME);
IFile snapshot = project.getFile(REFRESH_SNAPSHOT_FILE_LOCATION);
verifier[0].addExpectedChange(settings, IResourceDelta.CHANGED, 0);
verifier[0].addExpectedChange(snapshot, IResourceDelta.ADDED, 0);
project.refreshLocal(IResource.DEPTH_INFINITE, null);
} catch (CoreException e) {
fail("Forced refresh only", e);
}
}
}.run(new ProjectSnapshotPerfManualTest("Forced refresh only"), 1, 1);
verifier[0].verifyDelta(null);
assertTrue("1.0 " + verifier[0].getMessage(), verifier[0].isDeltaValid());
// close and delete project but leave contents
project.close(null);
project.delete(false, false, null);
IPath snapshotFile = bigSiteLocation.append(REFRESH_SNAPSHOT_FILE_LOCATION);
snapshotFile.toFile().delete();
// open the project again with standard refresh
project.create(description, null);
new PerformanceTestRunner() {
@Override
protected void test() {
try {
project.open(null);
} catch (CoreException e) {
fail("Second refresh open", e);
}
}
}.run(new ProjectSnapshotPerfManualTest("Second refresh open"), 1, 1);
// delete project to avoid getting content deleted in tearDown()
project.close(null);
project.delete(false, false, null);
}
}