/******************************************************************************* * Copyright (c) 2005, 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 *******************************************************************************/ package org.eclipse.core.tests.filesystem; import java.io.*; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.core.tests.internal.filesystem.ram.MemoryFileStore; import org.eclipse.core.tests.internal.filesystem.ram.MemoryTree; /** * Tests the file caching provided by FileStore.toLocalFile. */ public class FileCacheTest extends FileSystemTest { public static Test suite() { return new TestSuite(FileCacheTest.class); } public FileCacheTest(String name) { super(name); } /** * Overrides generic method from Assert to perform proper array equality test. */ public void assertEquals(String message, byte[] expected, byte[] actual) { if (expected.length != actual.length) { fail(message + " arrays of different length"); } assertEquals(message + " different length", expected.length, actual.length); for (int i = 0; i < actual.length; i++) { if (expected[i] != actual[i]) { fail(message + " arrays differ at position " + i + "; expected: " + expected[i] + " but was: " + actual[i]); } } } /** * Overrides generic method from Assert to perform proper array equality test. */ public void assertNotSame(String message, byte[] expected, byte[] actual) { if (expected.length != actual.length) { return; } for (int i = 0; i < actual.length; i++) { if (expected[i] != actual[i]) { return; } } fail(message + " arrays should be different, but they are not: " + expected); } /** * Returns the byte[] contents of the given file. */ private byte[] getBytes(File cachedFile) { FileInputStream in = null; ByteArrayOutputStream out = null; try { in = new FileInputStream(cachedFile); out = new ByteArrayOutputStream(); transferData(in, out); in.close(); out.close(); return out.toByteArray(); } catch (IOException e) { fail("Exception in FileCacheTest.getBytes", e); } return new byte[0]; } @Override protected void setUp() throws Exception { super.setUp(); MemoryTree.TREE.deleteAll(); } @Override protected void tearDown() throws Exception { super.tearDown(); MemoryTree.TREE.deleteAll(); } public void testCacheFile() { try { IFileStore store = new MemoryFileStore(new Path("testCacheFile")); OutputStream out = store.openOutputStream(EFS.NONE, getMonitor()); byte[] contents = "test".getBytes(); out.write(contents); out.close(); File cachedFile = store.toLocalFile(EFS.CACHE, getMonitor()); assertTrue("1.0", cachedFile.exists()); assertTrue("1.1", !cachedFile.isDirectory()); assertEquals("1.2", contents, getBytes(cachedFile)); //write out new file contents byte[] newContents = "newContents".getBytes(); out = store.openOutputStream(EFS.NONE, getMonitor()); out.write(newContents); out.close(); //old cache will be out of date assertNotSame("2.0", newContents, getBytes(cachedFile)); //fetching the cache again should return up to date file cachedFile = store.toLocalFile(EFS.CACHE, getMonitor()); assertTrue("3.0", cachedFile.exists()); assertTrue("3.1", !cachedFile.isDirectory()); assertEquals("3.2", newContents, getBytes(cachedFile)); } catch (IOException e) { fail("1.99", e); } catch (CoreException e) { fail("1.99", e); } } public void testCacheFolder() { try { IFileStore store = new MemoryFileStore(new Path("testCacheFolder")); store.mkdir(EFS.NONE, getMonitor()); File cachedFile = store.toLocalFile(EFS.CACHE, getMonitor()); assertTrue("1.0", cachedFile.exists()); assertTrue("1.1", cachedFile.isDirectory()); } catch (CoreException e) { fail("1.99", e); } } /** * Tests invoking the toLocalFile method without the CACHE option flag. */ public void testNoCacheFlag() { try { IFileStore store = new MemoryFileStore(new Path("testNoCacheFlag")); store.mkdir(EFS.NONE, getMonitor()); File cachedFile = store.toLocalFile(EFS.NONE, getMonitor()); assertNull("1.0", cachedFile); } catch (CoreException e) { fail("4.99", e); } } /** * Tests caching a non-existing file */ public void testNonExisting() { try { IFileStore store = new MemoryFileStore(new Path("testNonExisting")); File cachedFile = store.toLocalFile(EFS.CACHE, getMonitor()); assertTrue("1.0", !cachedFile.exists()); } catch (CoreException e) { fail("4.99", e); } } }