blob: bc0b7e07b76e46e89cf5c69bcb9706c15666f63e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.vfs2.provider.ram.test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.vfs2.FileContent;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.impl.DefaultFileSystemManager;
import org.apache.commons.vfs2.provider.ram.RamFileProvider;
import org.apache.commons.vfs2.provider.ram.RamFileSystemConfigBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Custom tests
*
* @version $Id$
*/
public class CustomRamProviderTest
{
private static final byte[] NON_EMPTY_FILE_CONTENT = new byte[]{ 1, 2, 3 };
private final List<Closeable> closeables = new ArrayList<Closeable>();
FileSystemOptions defaultRamFso = new FileSystemOptions();
DefaultFileSystemManager manager;
FileSystemOptions smallSizedFso = new FileSystemOptions();
FileSystemOptions zeroSizedFso = new FileSystemOptions();
/**
* Closes the given {@link Closeable} during the tearDown phase.
*/
private <C extends Closeable> C closeOnTearDown(final C closeable)
{
this.closeables.add(closeable);
return closeable;
}
private InputStream createEmptyFile() throws FileSystemException, IOException
{
final FileObject root = manager.resolveFile("ram://file");
root.createFile();
return this.closeOnTearDown(root.getContent().getInputStream());
}
private InputStream createNonEmptyFile() throws FileSystemException, IOException
{
final FileObject root = manager.resolveFile("ram://file");
root.createFile();
final FileContent content = root.getContent();
final OutputStream output = this.closeOnTearDown(content.getOutputStream());
output.write(1);
output.write(2);
output.write(3);
output.flush();
output.close();
return this.closeOnTearDown(content.getInputStream());
}
@Before
public void setUp() throws Exception
{
manager = new DefaultFileSystemManager();
manager.addProvider("ram", new RamFileProvider());
manager.init();
// File Systems Options
RamFileSystemConfigBuilder.getInstance().setMaxSize(zeroSizedFso, 0L);
RamFileSystemConfigBuilder.getInstance().setMaxSize(smallSizedFso, 10L);
}
@After
public void tearDown() throws Exception
{
for (final Closeable closeable : this.closeables)
{
try
{
closeable.close();
} catch (final Exception e)
{
// ignore
}
}
manager.close();
}
@Test
public void testReadEmptyFileByteByByte() throws FileSystemException, IOException
{
final InputStream input = this.createEmptyFile();
assertEquals("Empty file didnt return EOF -1", -1, input.read());
}
@Test
public void testReadEmptyFileIntoBuffer() throws FileSystemException, IOException
{
final InputStream input = this.createEmptyFile();
final byte[] buffer = new byte[100];
assertEquals("Empty file didnt return when filling buffer", -1, input.read(buffer));
assertArrayEquals("Buffer was written too", new byte[100], buffer);
}
@Test
public void testReadEmptyFileIntoBufferWithOffsetAndLength() throws FileSystemException, IOException
{
final InputStream input = this.createEmptyFile();
final byte[] buffer = new byte[100];
assertEquals("Empty file didnt return when filling buffer", -1, input.read(buffer, 10, 90));
assertArrayEquals("Buffer was written too", new byte[100], buffer);
}
@Test
public void testReadNonEmptyFileByteByByte() throws FileSystemException, IOException
{
final InputStream input = this.createNonEmptyFile();
assertEquals("Read 1st byte failed", 1, input.read());
assertEquals("Rread 2st byte failed", 2, input.read());
assertEquals("Read 3st byte failed", 3, input.read());
assertEquals("File should be empty", -1, input.read());
}
@Test
public void testReadNonEmptyFileIntoBuffer() throws FileSystemException, IOException
{
final InputStream input = this.createNonEmptyFile();
final byte[] buffer = new byte[100];
assertEquals("Filling buffer failed when file is not empty", NON_EMPTY_FILE_CONTENT.length, input.read(buffer));
final byte[] expectedBuffer = new byte[100];
System.arraycopy(NON_EMPTY_FILE_CONTENT, 0, expectedBuffer, 0, NON_EMPTY_FILE_CONTENT.length);
assertArrayEquals("Buffer not filled", expectedBuffer, buffer);
Arrays.fill(buffer, (byte) 0);
Arrays.fill(expectedBuffer, (byte) 0);
assertEquals("File should be empty after filling buffer", -1, input.read(buffer));
assertArrayEquals("Buffer was written when empty", expectedBuffer, buffer);
}
@Test
public void testReadNonEmptyFileIntoBufferWithOffsetAndLength() throws FileSystemException, IOException
{
final InputStream input = this.createNonEmptyFile();
final byte[] buffer = new byte[100];
final int offset = 10;
assertEquals("Filling buffer failed when file is not empty", NON_EMPTY_FILE_CONTENT.length,
input.read(buffer, offset, 100 - offset));
final byte[] expectedBuffer = new byte[100];
System.arraycopy(NON_EMPTY_FILE_CONTENT, 0, expectedBuffer, offset, NON_EMPTY_FILE_CONTENT.length);
assertArrayEquals("Buffer not filled", expectedBuffer, buffer);
Arrays.fill(buffer, (byte) 0);
Arrays.fill(expectedBuffer, (byte) 0);
assertEquals("File should be empty after filling buffer", -1, input.read(buffer, 10, 90));
assertArrayEquals("Buffer was written when empty", expectedBuffer, buffer);
}
/**
*
* Checks root folder exists
*
* @throws FileSystemException
*/
@Test
public void testRootFolderExists() throws FileSystemException
{
final FileObject root = manager.resolveFile("ram:///", defaultRamFso);
assertTrue(root.getType().hasChildren());
try
{
root.delete();
fail();
} catch (final FileSystemException e)
{
// Expected
}
}
@Test
public void testFSOptions() throws Exception
{
// Default FS
final FileObject fo1 = manager.resolveFile("ram:/");
final FileObject fo2 = manager.resolveFile("ram:/");
assertTrue("Both files should exist in the same fs instance.", fo1.getFileSystem() == fo2.getFileSystem());
FileSystemOptions fsOptions = fo1.getFileSystem().getFileSystemOptions();
long maxFilesystemSize = RamFileSystemConfigBuilder.getInstance().getLongMaxSize(fsOptions);
assertEquals("Filesystem option maxSize must be unlimited", Long.MAX_VALUE, maxFilesystemSize);
// Small FS
final FileObject fo3 = manager.resolveFile("ram:/fo3", smallSizedFso);
final FileObject fo4 = manager.resolveFile("ram:/", smallSizedFso);
assertTrue("Both files should exist in the same FileSystem instance.", fo3.getFileSystem() == fo4.getFileSystem());
assertTrue("Both files should exist in different FileSystem instance.", fo1.getFileSystem() != fo3.getFileSystem());
fsOptions = fo3.getFileSystem().getFileSystemOptions();
maxFilesystemSize = RamFileSystemConfigBuilder.getInstance().getLongMaxSize(fsOptions);
assertEquals("Filesystem option maxSize must be set", 10, maxFilesystemSize);
}
@Test
public void testSmallFS() throws Exception
{
// Small FS
final FileObject fo3 = manager.resolveFile("ram:/fo3", smallSizedFso);
fo3.createFile();
try
{
final OutputStream os = fo3.getContent().getOutputStream();
os.write(new byte[10]);
os.close();
} catch (final FileSystemException e)
{
fail("Test should be able to save such a small file");
}
try
{
final OutputStream os = fo3.getContent().getOutputStream();
os.write(new byte[11]);
os.close();
fail("It shouldn't save such a big file");
} catch (final FileSystemException e)
{
// Expected
}
}
}