/* * 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.jackrabbit.core.fs; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import junit.framework.TestCase; /** * Tests a file system implementation. */ public abstract class AbstractFileSystemTest extends TestCase { private FileSystem fs; private byte[] sampleBytes = new byte[]{(byte)0x12, (byte)0x0F, (byte)0xF0}; protected abstract FileSystem getFileSystem() throws Exception; protected void setUp() throws Exception { fs = getFileSystem(); fs.init(); } protected void tearDown() throws Exception { fs.close(); } public void testEverything() throws Exception { String[] list; // At beginning the file system should contain only the root folder assertTrue(fs.exists("/")); assertTrue(fs.isFolder("/")); assertFalse(fs.isFile("/")); assertEquals(0, fs.list("/").length); // Create a folder fs.createFolder("/folder"); assertTrue(fs.exists("/folder")); assertTrue(fs.isFolder("/folder")); assertFalse(fs.isFile("/folder")); assertEquals(0, fs.list("/folder").length); list = fs.list("/"); assertEquals(1, list.length); assertEquals("folder", list[0]); // Create a file inside the folder createFile("/folder/file", sampleBytes); assertTrue(fs.exists("/folder/file")); assertFalse(fs.isFolder("/folder/file")); assertTrue(fs.isFile("/folder/file")); list = fs.list("/folder"); assertEquals(1, list.length); assertEquals("file", list[0]); assertEquals(3, fs.length("/folder/file")); verifyStreamInput(fs.getInputStream("/folder/file"), sampleBytes); // Create a subfolder fs.createFolder("/folder2/subfolder"); createFile("/folder2/file2", sampleBytes); assertTrue(fs.exists("/folder2/subfolder")); assertTrue(fs.isFolder("/folder2/subfolder")); assertFalse(fs.isFile("/folder2/subfolder")); assertEquals(0, fs.list("/folder2/subfolder").length); list = fs.list("/folder2"); Arrays.sort(list); assertEquals(2, list.length); assertEquals("file2", list[0]); assertEquals("subfolder", list[1]); list = fs.listFiles("/folder2"); assertEquals(1, list.length); assertEquals("file2", list[0]); list = fs.listFolders("/folder2"); assertEquals(1, list.length); assertEquals("subfolder", list[0]); // Try to create a file colliding with an existing folder try { createFile("/folder2/subfolder", sampleBytes); fail("FileSystemException expected"); } catch (FileSystemException e) { // ok } // Delete the subfolder fs.deleteFolder("/folder2/subfolder"); assertFalse(fs.exists("/folder2/subfolder")); assertFalse(fs.isFolder("/folder2/subfolder")); assertFalse(fs.isFile("/folder2/subfolder")); list = fs.list("/folder2"); assertEquals(1, list.length); assertEquals("file2", list[0]); list = fs.listFiles("/folder2"); assertEquals(1, list.length); assertEquals("file2", list[0]); assertEquals(0, fs.listFolders("/folder2").length); // Delete the folder fs.deleteFolder("/folder"); fs.deleteFolder("/folder2"); assertFalse(fs.exists("/folder2")); assertFalse(fs.isFolder("/folder2")); assertFalse(fs.isFile("/folder2")); assertFalse(fs.exists("/folder2/file2")); assertFalse(fs.isFolder("/folder2/file2")); assertFalse(fs.isFile("/folder2/file2")); assertEquals(0, fs.list("/").length); // Test last modified time stamps createFile("/file1", sampleBytes); Thread.sleep(100); createFile("/file2", sampleBytes); assertTrue(fs.lastModified("/file1") <= fs.lastModified("/file2")); // Try to create a file inside a nonexistent folder try { createFile("/missing/file", sampleBytes); fail("FileSystemException expected"); } catch (FileSystemException e) { // ok } // Try to create a folder inside a nonexistent folder fs.createFolder("/missing/subfolder"); assertTrue(fs.exists("/missing")); assertTrue(fs.isFolder("/missing")); assertFalse(fs.isFile("/missing")); assertTrue(fs.exists("/missing/subfolder")); assertTrue(fs.isFolder("/missing/subfolder")); assertFalse(fs.isFile("/missing/subfolder")); assertEquals(0, fs.list("/missing/subfolder").length); list = fs.list("/missing"); assertEquals(1, list.length); assertEquals("subfolder", list[0]); } private void verifyStreamInput( InputStream inputStream, byte[] expectedBytes) throws IOException { byte[] resultBytes = new byte[3]; assertEquals(3, inputStream.read(resultBytes)); inputStream.close(); assertEquals(expectedBytes[0], resultBytes[0]); assertEquals(expectedBytes[1], resultBytes[1]); assertEquals(expectedBytes[2], resultBytes[2]); } private void createFile(String fileName, byte[] bytes) throws IOException, FileSystemException { OutputStream outputStream = fs.getOutputStream(fileName); outputStream.write(bytes); outputStream.close(); } }