blob: 7647775ecef8062723a91dbdf78703a1da8a55ee [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
*******************************************************************************/
package org.eclipse.core.tests.internal.resources;
import java.util.*;
import junit.framework.*;
import org.eclipse.core.internal.resources.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.resources.ResourceTest;
public class WorkspacePreferencesTest extends ResourceTest {
private IWorkspace workspace;
private Preferences preferences;
/**
* Constructor for WorkspacePreferencesTest.
* @param name
*/
public WorkspacePreferencesTest(String name) {
super(name);
}
/**
* @see TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
workspace = ResourcesPlugin.getWorkspace();
preferences = ResourcesPlugin.getPlugin().getPluginPreferences();
workspace.setDescription(Workspace.defaultWorkspaceDescription());
}
/**
* @see TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
workspace.setDescription(Workspace.defaultWorkspaceDescription());
}
/**
* Tests properties state in a brand new workspace (must match defaults).
*/
public void testDefaults() {
IWorkspaceDescription description = Workspace.defaultWorkspaceDescription();
assertEquals("1.0", description, preferences);
// ensures that all properties in the default workspace description
// appear as non-default-default properties in the property store
// Don't include the default build order here as it is equivalent to the
// String default-default (ResourcesPlugin.PREF_BUILD_ORDER).
String[] descriptionProperties = {ResourcesPlugin.PREF_AUTO_BUILDING, ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER, ResourcesPlugin.PREF_FILE_STATE_LONGEVITY, ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS, ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE, ResourcesPlugin.PREF_MAX_FILE_STATES, ResourcesPlugin.PREF_SNAPSHOT_INTERVAL};
List<String> defaultPropertiesList = Arrays.asList(preferences.defaultPropertyNames());
for (String property : descriptionProperties) {
assertTrue("2.0 - Description property is not default: " + property, defaultPropertiesList.contains(property));
}
}
/**
* Makes changes in the preferences and ensure they are reflected in the
* workspace description.
*/
public void testSetPreferences() {
preferences.setValue(ResourcesPlugin.PREF_AUTO_BUILDING, true);
assertTrue("1.0", workspace.getDescription().isAutoBuilding());
preferences.setValue(ResourcesPlugin.PREF_AUTO_BUILDING, false);
assertTrue("1.1", !workspace.getDescription().isAutoBuilding());
preferences.setValue(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER, true);
assertTrue("2.0", workspace.getDescription().getBuildOrder() == null);
preferences.setValue(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER, false);
assertTrue("2.1", workspace.getDescription().getBuildOrder() != null);
preferences.setValue(ResourcesPlugin.PREF_BUILD_ORDER, "x/y,:z/z");
List<String> expectedList = Arrays.asList(new String[] {"x", "y,:z", "z"});
List<String> actualList = Arrays.asList(workspace.getDescription().getBuildOrder());
assertEquals("2.2", expectedList, actualList);
preferences.setValue(ResourcesPlugin.PREF_BUILD_ORDER, "");
assertTrue("2.3", workspace.getDescription().getBuildOrder().length == 0);
long snapshotInterval = 800000000L;
preferences.setValue(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL, snapshotInterval);
assertEquals("3.0", snapshotInterval, workspace.getDescription().getSnapshotInterval());
long defaultSnapshotInterval = preferences.getDefaultLong(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL);
preferences.setValue(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL, defaultSnapshotInterval);
assertEquals("3.1", defaultSnapshotInterval, workspace.getDescription().getSnapshotInterval());
preferences.setToDefault(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL);
assertEquals("3.2", defaultSnapshotInterval, workspace.getDescription().getSnapshotInterval());
assertEquals("Description not synchronized", workspace.getDescription(), preferences);
}
/**
* Ensures property change events are properly fired when setting workspace description.
*/
public void testEvents() {
IWorkspaceDescription original = workspace.getDescription();
IWorkspaceDescription modified = workspace.getDescription();
// 1 - PREF_AUTO_BUILDING
modified.setAutoBuilding(!original.isAutoBuilding());
// 2 - PREF_DEFAULT_BUILD_ORDER and 3 - PREF_BUILD_ORDER
modified.setBuildOrder(new String[] {"a", "b", "c"});
// 3 - PREF_APPLY_FILE_STATE_POLICY
modified.setApplyFileStatePolicy(!original.isApplyFileStatePolicy());
// 4 - PREF_FILE_STATE_LONGEVITY
modified.setFileStateLongevity((original.getFileStateLongevity() + 1) * 2);
// 5 - PREF_MAX_BUILD_ITERATIONS
modified.setMaxBuildIterations((original.getMaxBuildIterations() + 1) * 2);
// 6 - PREF_MAX_FILE_STATES
modified.setMaxFileStates((original.getMaxFileStates() + 1) * 2);
// 7 - PREF_MAX_FILE_STATE_SIZE
modified.setMaxFileStateSize((original.getMaxFileStateSize() + 1) * 2);
// 8 - PREF_SNAPSHOT_INTERVAL
modified.setSnapshotInterval((original.getSnapshotInterval() + 1) * 2);
final List<String> changedProperties = new LinkedList<>();
Preferences.IPropertyChangeListener listener = event -> changedProperties.add(event.getProperty());
try {
preferences.addPropertyChangeListener(listener);
try {
workspace.setDescription(original);
} catch (CoreException e) {
fail("1.0", e);
}
// no events should have been fired
assertEquals("1.1 - wrong number of properties changed ", 0, changedProperties.size());
try {
workspace.setDescription(modified);
} catch (CoreException e) {
fail("2.0", e);
}
// the right number of events should have been fired
assertEquals("2.1 - wrong number of properties changed ", 9, changedProperties.size());
} finally {
preferences.removePropertyChangeListener(listener);
}
}
/**
* Ensures preferences with both default/non-default values are properly exported/imported.
*/
public void testImportExport() {
IPath originalPreferencesFile = getRandomLocation().append("original.epf");
IPath modifiedPreferencesFile = getRandomLocation().append("modified.epf");
try {
// saves the current preferences (should be the default ones)
IWorkspaceDescription original = workspace.getDescription();
// sets a non-used preference to a non-default value so a
// preferences file can be generated
preferences.setValue("foo.bar", getRandomString());
// exports original preferences (only default values - except for bogus preference above)
try {
Preferences.exportPreferences(originalPreferencesFile);
} catch (CoreException e) {
fail("1.0", e);
}
// creates a modified description
IWorkspaceDescription modified = workspace.getDescription();
modified.setAutoBuilding(!original.isAutoBuilding());
modified.setBuildOrder(new String[] {"a", "b", "c"});
modified.setApplyFileStatePolicy(!original.isApplyFileStatePolicy());
modified.setFileStateLongevity((original.getFileStateLongevity() + 1) * 2);
modified.setMaxBuildIterations((original.getMaxBuildIterations() + 1) * 2);
modified.setMaxFileStates((original.getMaxFileStates() + 1) * 2);
modified.setMaxFileStateSize((original.getMaxFileStateSize() + 1) * 2);
modified.setSnapshotInterval((original.getSnapshotInterval() + 1) * 2);
// sets modified description
try {
workspace.setDescription(modified);
} catch (CoreException ce) {
fail("2.0", ce);
}
assertEquals("2.1", modified, workspace.getDescription());
// exports modified preferences
try {
Preferences.exportPreferences(modifiedPreferencesFile);
} catch (CoreException e) {
fail("3.0", e);
}
// imports original preferences
try {
Preferences.importPreferences(originalPreferencesFile);
} catch (CoreException e) {
fail("4.0", e);
}
// ensures preferences exported match the imported ones
assertEquals("4.1", original, workspace.getDescription());
// imports modified preferences
try {
Preferences.importPreferences(modifiedPreferencesFile);
} catch (CoreException e) {
fail("5.0", e);
}
// ensures preferences exported match the imported ones
assertEquals("5.1", modified, workspace.getDescription());
} finally {
ensureDoesNotExistInFileSystem(originalPreferencesFile.removeLastSegments(1).toFile());
ensureDoesNotExistInFileSystem(modifiedPreferencesFile.removeLastSegments(1).toFile());
}
}
/**
* Makes changes through IWorkspace#setDescription and checks if the changes
* are reflected in the preferences.
*/
public void testSetDescription() {
IWorkspaceDescription description = workspace.getDescription();
description.setAutoBuilding(false);
description.setBuildOrder(new String[] {"a", "b,c", "c"});
description.setFileStateLongevity(60000 * 5);
description.setMaxBuildIterations(35);
description.setMaxFileStates(16);
description.setMaxFileStateSize(100050);
description.setSnapshotInterval(1234567);
try {
workspace.setDescription(description);
} catch (CoreException ce) {
fail("2.0", ce);
}
assertEquals("2.1 - Preferences not synchronized", description, preferences);
// try to make changes without committing them
// sets current state to a known value
description.setFileStateLongevity(90000);
try {
workspace.setDescription(description);
} catch (CoreException ce) {
fail("3.0", ce);
}
// try to make a change
description.setFileStateLongevity(100000);
// the original value should remain set
assertEquals("3.1", 90000, workspace.getDescription().getFileStateLongevity());
assertEquals("3.2", 90000, preferences.getLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY));
}
/**
* Checks if a legacy workspace description is correctly loaded and
* its file discarded.
*/
public void testMigration() {
WorkspaceDescription description = new WorkspaceDescription("Legacy workspace");
description.setAutoBuilding(false);
final String[] buildOrder = new String[] {"g", "r", "e", "p"};
description.setBuildOrder(buildOrder);
description.setFileStateLongevity(Math.abs((long) (Math.random() * 100000L)));
description.setMaxFileStates(Math.abs((int) (Math.random() * 100000L)));
description.setMaxFileStateSize(Math.abs((long) (Math.random() * 100000L)));
description.setSnapshotInterval(Math.abs((long) (Math.random() * 100000L)));
LocalMetaArea localMetaArea = ((Workspace) workspace).getMetaArea();
try {
localMetaArea.write(description);
} catch (CoreException ce) {
fail("1.0", ce);
}
assertTrue("2.0 - file .description does not exist", localMetaArea.getOldWorkspaceDescriptionLocation().toFile().isFile());
WorkspaceDescription descriptionFromDisk = localMetaArea.readOldWorkspace();
assertTrue("2.1 - file .description still exists", !localMetaArea.getOldWorkspaceDescriptionLocation().toFile().isFile());
assertEquals("3.0", description, descriptionFromDisk);
}
/**
* Compares the values in a workspace description with the corresponding
* properties in a preferences object.
*/
public void assertEquals(String message, IWorkspaceDescription description, Preferences preferences) throws ComparisonFailure {
assertEquals(message + " - 1", description.isAutoBuilding(), preferences.getBoolean(ResourcesPlugin.PREF_AUTO_BUILDING));
assertEquals(message + " - 2", description.getBuildOrder() == null, preferences.getBoolean(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER));
assertEquals(message + " - 3", WorkspacePreferences.convertStringArraytoString(description.getBuildOrder()), preferences.getString(ResourcesPlugin.PREF_BUILD_ORDER));
assertEquals(message + " - 4", description.isApplyFileStatePolicy(), preferences.getBoolean(ResourcesPlugin.PREF_APPLY_FILE_STATE_POLICY));
assertEquals(message + " - 5", description.getFileStateLongevity(), preferences.getLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY));
assertEquals(message + " - 6", description.getMaxFileStates(), preferences.getInt(ResourcesPlugin.PREF_MAX_FILE_STATES));
assertEquals(message + " - 7", description.getMaxFileStateSize(), preferences.getLong(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE));
assertEquals(message + " - 8", description.getSnapshotInterval(), preferences.getLong(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL));
assertEquals(message + " - 9", description.getMaxBuildIterations(), preferences.getLong(ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS));
}
/**
* Compares two workspace description objects..
*/
public void assertEquals(String message, IWorkspaceDescription description1, IWorkspaceDescription description2) throws ComparisonFailure {
assertEquals(message + " - 1", description1.isAutoBuilding(), description2.isAutoBuilding());
assertEquals(message + " - 2", description1.getBuildOrder(), description2.getBuildOrder());
assertEquals(message + " - 3", WorkspacePreferences.convertStringArraytoString(description1.getBuildOrder()), WorkspacePreferences.convertStringArraytoString(description2.getBuildOrder()));
assertEquals(message + " - 4", description1.isApplyFileStatePolicy(), description2.isApplyFileStatePolicy());
assertEquals(message + " - 5", description1.getFileStateLongevity(), description2.getFileStateLongevity());
assertEquals(message + " - 6", description1.getMaxFileStates(), description2.getMaxFileStates());
assertEquals(message + " - 7", description1.getMaxFileStateSize(), description2.getMaxFileStateSize());
assertEquals(message + " - 8", description1.getSnapshotInterval(), description2.getSnapshotInterval());
assertEquals(message + " - 9", description1.getMaxBuildIterations(), description2.getMaxBuildIterations());
}
public static Test suite() {
// TestSuite suite = new TestSuite();
// suite.addTest(new WorkspacePreferencesTest("testImportExport"));
// return suite;
return new TestSuite(WorkspacePreferencesTest.class);
}
}