/******************************************************************************* * Copyright (c) 2005, 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.session; import junit.framework.Test; import org.eclipse.core.internal.resources.ContentDescriptionManager; import org.eclipse.core.internal.resources.Workspace; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.content.IContentTypeManager; import org.eclipse.core.tests.resources.ContentDescriptionManagerTest; import org.eclipse.core.tests.resources.WorkspaceSessionTest; import org.eclipse.core.tests.session.WorkspaceSessionTestSuite; /** * Tests that the content description cache is preserved across sessions. * * Note that this test is sensitive to the platform state stamp. If the test * starts failing, it might mean bundles are being re-installed unnecessarily * in the second session. For details, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=94859. * @since 3.2 * */ public class TestBug93473 extends WorkspaceSessionTest { public static Test suite() { return new WorkspaceSessionTestSuite(PI_RESOURCES_TESTS, TestBug93473.class); } public TestBug93473(String name) { super(name); } public void test1stSession() { final IWorkspace workspace = getWorkspace(); // cache is invalid at this point (does not match platform timestamp), no flush job has been scheduled (should not have to wait) ContentDescriptionManagerTest.waitForCacheFlush(); assertEquals("0.0", ContentDescriptionManager.INVALID_CACHE, ((Workspace) workspace).getContentDescriptionManager().getCacheState()); IProject project = workspace.getRoot().getProject("proj1"); assertDoesNotExistInWorkspace("0.1", project); Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT); IFile file = project.getFile("foo.txt"); assertDoesNotExistInWorkspace("0.2", file); ensureExistsInWorkspace(file, getRandomContents()); try { // this will also cause the cache flush job to be scheduled file.getContentDescription(); } catch (CoreException e) { fail("1.0", e); } // after waiting cache flushing, cache should be new ContentDescriptionManagerTest.waitForCacheFlush(); assertEquals("2.0", ContentDescriptionManager.EMPTY_CACHE, ((Workspace) workspace).getContentDescriptionManager().getCacheState()); try { // obtains a content description again - should come from cache file.getContentDescription(); } catch (CoreException e) { fail("3.0", e); } // cache now is not empty anymore (should not have to wait) ContentDescriptionManagerTest.waitForCacheFlush(); assertEquals("4.0", ContentDescriptionManager.USED_CACHE, ((Workspace) workspace).getContentDescriptionManager().getCacheState()); try { workspace.save(true, getMonitor()); } catch (CoreException e) { fail("5.0", e); } } public void test2ndSession() { // cache should preserve state across sessions assertEquals("1.0", ContentDescriptionManager.USED_CACHE, ((Workspace) getWorkspace()).getContentDescriptionManager().getCacheState()); } }