/******************************************************************************* * Copyright (c) 2010, 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 * Alexander Kurtakov <akurtako@redhat.com> - Bug 459343 *******************************************************************************/ package org.eclipse.core.tests.resources.session; import java.io.IOException; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.util.Map; import junit.framework.Test; import org.eclipse.core.internal.resources.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.core.tests.harness.BundleTestingHelper; import org.eclipse.core.tests.resources.AutomatedTests; import org.eclipse.core.tests.resources.WorkspaceSessionTest; import org.eclipse.core.tests.resources.content.ContentTypeTest; import org.eclipse.core.tests.session.WorkspaceSessionTestSuite; import org.osgi.framework.*; /** * Tests regression of bug 297635 */ public class TestBug297635 extends WorkspaceSessionTest implements ISaveParticipant { private static final String BUNDLE01_ID = "org.eclipse.bundle01"; public static Test suite() { return new WorkspaceSessionTestSuite(AutomatedTests.PI_RESOURCES_TESTS, TestBug297635.class); } public BundleContext getContext() { return Platform.getBundle(PI_RESOURCES_TESTS).getBundleContext(); } public void test1() { // install a bundle try { Bundle b = BundleTestingHelper.installBundle("1", getContext(), ContentTypeTest.TEST_FILES_ROOT + "content/bundle01"); BundleTestingHelper.resolveBundles(getContext(), new Bundle[] {b}); b.start(Bundle.START_TRANSIENT); } catch (MalformedURLException e) { fail("1.0", e); } catch (BundleException e) { fail("1.1", e); } catch (IOException e) { fail("1.2", e); } // register a save participant for the bundle try { getWorkspace().addSaveParticipant(BUNDLE01_ID, TestBug297635.this); } catch (CoreException e) { fail("2.0", e); } // create a project with a file IProject project = getWorkspace().getRoot().getProject("Project1"); IFile file = project.getFile("file1.txt"); ensureExistsInWorkspace(project, true); ensureExistsInWorkspace(file, getRandomContents()); // perform a full save try { getWorkspace().save(true, getMonitor()); } catch (CoreException e) { fail("3.0", e); } } @SuppressWarnings("unchecked") public void test2() { // install the bundle again // we need to restart the org.eclipse.core.resources bundle to read the tree file again // we rely on the fact that the core.resources bundle doesn't save the tree when it is stopped try { Bundle coreResourcesBundle = Platform.getBundle(ResourcesPlugin.PI_RESOURCES); coreResourcesBundle.stop(Bundle.STOP_TRANSIENT); Bundle b = BundleTestingHelper.installBundle("1", getContext(), ContentTypeTest.TEST_FILES_ROOT + "content/bundle01"); BundleTestingHelper.resolveBundles(getContext(), new Bundle[] {b}); coreResourcesBundle.start(Bundle.START_TRANSIENT); } catch (MalformedURLException e2) { fail("1.0", e2); } catch (BundleException e2) { fail("1.1", e2); } catch (IOException e2) { fail("1.2", e2); } // create yet another file in the existing project IProject project = getWorkspace().getRoot().getProject("Project1"); IFile file = project.getFile("file2.txt"); ensureExistsInWorkspace(file, getRandomContents()); // get access to SaveManager#savedStates to verify that tress are being kept there Map<String, SavedState> savedStates = null; try { Field field = SaveManager.class.getDeclaredField("savedStates"); field.setAccessible(true); savedStates = (Map<String, SavedState>) field.get(((Workspace) getWorkspace()).getSaveManager()); } catch (IllegalArgumentException e) { fail("2.0", e); } catch (IllegalAccessException e) { fail("2.1", e); } catch (SecurityException e) { fail("2.2", e); } catch (NoSuchFieldException e) { fail("2.3", e); } // register a save participant for the bundle try { getWorkspace().addSaveParticipant(BUNDLE01_ID, TestBug297635.this); } catch (CoreException e) { fail("3.0", e); } // assert the saved state for Bundle01, trees should not be null assertStateTrees(savedStates.get(BUNDLE01_ID), false); try { ((Workspace) getWorkspace()).getSaveManager().save(ISaveContext.SNAPSHOT, true, null, getMonitor()); } catch (CoreException e) { fail("4.0", e); } // assert the saved state for Bundle01, trees should be null after a snapshot save assertStateTrees(savedStates.get(BUNDLE01_ID), true); } private void assertStateTrees(SavedState savedState, boolean isNull) { Object oldTree = null; Object newTree = null; try { Field oldTreeField = SavedState.class.getDeclaredField("oldTree"); oldTreeField.setAccessible(true); oldTree = oldTreeField.get(savedState); Field newTreeField = SavedState.class.getDeclaredField("newTree"); newTreeField.setAccessible(true); newTree = newTreeField.get(savedState); } catch (SecurityException e) { fail("1.0", e); } catch (NoSuchFieldException e) { fail("2.0", e); } catch (IllegalArgumentException e) { fail("3.0", e); } catch (IllegalAccessException e) { fail("4.0", e); } if (isNull) { assertNull(oldTree); assertNull(newTree); } else { assertNotNull(oldTree); assertNotNull(newTree); } } // ISaveParticipant methods @Override public void doneSaving(ISaveContext context) { // nothing to do } @Override public void prepareToSave(ISaveContext context) { context.needDelta(); context.needSaveNumber(); } @Override public void rollback(ISaveContext context) { // nothing to do } @Override public void saving(ISaveContext context) { // nothing to do } }