blob: 079922df5d9d2644ce67b8d3fa0cac9d7bfaa620 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}