/******************************************************************************* * Copyright (c) 2004, 2012 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 *******************************************************************************/ package org.eclipse.core.tests.resources.regression; import org.eclipse.core.internal.localstore.IHistoryStore; import org.eclipse.core.internal.resources.Workspace; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.tests.resources.ResourceTest; //NOTE: Should not hook this test up until the corresponding bug is fixed. public class Bug_079398 extends ResourceTest { public Bug_079398(String name) { super(name); } public void testBug79398() { IProject project = getWorkspace().getRoot().getProject("myproject"); IFile file1 = project.getFile("myFile.txt"); IFile file2 = project.getFile("copyOfMyFile.txt"); /* set local history policies */ // keep original IWorkspaceDescription originalDescription = getWorkspace().getDescription(); // get another copy for changes IWorkspaceDescription description = getWorkspace().getDescription(); // longevity set to 1 day description.setFileStateLongevity(1000 * 3600 * 24); // keep a max of 4 file states description.setMaxFileStates(4); // max size of file = 1 Mb description.setMaxFileStateSize(1024 * 1024); try { getWorkspace().setDescription(description); } catch (CoreException e) { fail("0.1", e); } try { ensureExistsInWorkspace(file1, getRandomContents()); try { for (int i = 0; i < 10; i++) { file1.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor()); } } catch (CoreException e) { fail("0.2", e); } IFileState[] sourceStates = null; try { sourceStates = file1.getHistory(getMonitor()); } catch (CoreException e) { fail("0.3", e); } // just make sure our assumptions are valid assertEquals("0.4", 10, sourceStates.length); // copy the file - the history should be shared, but the destination // will conform to the policy try { file1.copy(file2.getFullPath(), true, getMonitor()); } catch (CoreException e) { fail("0.4", e); } assertExistsInWorkspace("1.0", file2); try { sourceStates = file1.getHistory(getMonitor()); } catch (CoreException e) { fail("1.1", e); } // the source is unaffected so far assertEquals("1.2", 10, sourceStates.length); IFileState[] destinationStates = null; try { destinationStates = file2.getHistory(getMonitor()); } catch (CoreException e) { fail("1.3", e); } // but the destination conforms to the policy assertEquals("1.4", description.getMaxFileStates(), destinationStates.length); // now cause the destination to have many more states try { for (int i = 0; i <= description.getMaxFileStates(); i++) { file2.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor()); } } catch (CoreException e) { fail("1.5", e); } IHistoryStore history = ((Workspace) getWorkspace()).getFileSystemManager().getHistoryStore(); // clean history history.clean(getMonitor()); try { destinationStates = file2.getHistory(getMonitor()); } catch (CoreException e) { fail("1.6", e); } // cleaning will remove any states the destination had in common // with the source since they don't fit into the policy assertEquals("1.7", description.getMaxFileStates(), destinationStates.length); try { sourceStates = file1.getHistory(getMonitor()); } catch (CoreException e) { fail("1.8", e); } // the source should have any extra states removed as well, // but the ones left should still exist assertEquals("1.7", description.getMaxFileStates(), sourceStates.length); for (int i = 0; i < sourceStates.length; i++) { assertTrue("1.8." + i, sourceStates[i].exists()); } } finally { // restore the original description try { getWorkspace().setDescription(originalDescription); } catch (CoreException e) { // only log since we don't want to override with any test failure log(ResourceTest.PI_RESOURCES_TESTS, e); } } } }