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