/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.load.storage.fs; import junit.framework.TestCase; import org.exoplatform.services.jcr.util.SIDGenerator; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; /** * Created by The eXo Platform SAS 10.07.2007 * * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a> * @version $Id: TestFSReadWrite.java 34801 2009-07-31 15:44:50Z dkatayev $ */ public class TestFSReadWrite extends TestCase { private static Logger log = Logger.getLogger("exo.jcr.component.core.TestFSReadWrite"); public static final int FILES_COUNT = 50000; protected File testRoot = null; protected List<File> files = null; static { try { FileHandler fh = new FileHandler("target/fstest.log"); fh.setFormatter(new SimpleFormatter()); fh.setEncoding(System.getProperty("file.encoding")); // Send logger output to our FileHandler. log.addHandler(fh); // Request that every detail gets logged. log.setLevel(Level.ALL); } catch (Throwable e) { e.printStackTrace(); } } protected class NameFilter implements FilenameFilter { private final String name; private final File dir; protected String getName() { return name; } protected File getDir() { return dir; } protected NameFilter(File dir, String name) { this.name = name; this.dir = dir; } protected NameFilter(String name) { this(null, name); } public boolean accept(File dir, String name) { return (this.dir != null ? this.dir.equals(dir) : true) && this.name.equals(name); } } protected void setUp() throws Exception { super.setUp(); testRoot = new File("target/fstest"); testRoot.mkdirs(); testRoot.deleteOnExit(); } protected void tearDown() throws Exception { long time = System.currentTimeMillis(); if (testRoot.exists()) { deleteDir(testRoot); // deleteFiles(files); testRoot.delete(); log.info("Tear down of " + getName() + ",\t" + (System.currentTimeMillis() - time)); } super.tearDown(); } protected void deleteFiles(List<File> filesList) { for (File f : filesList) { f.delete(); deleteFileParent(new File(f.getParent())); } } protected void deleteFileParent(File fp) { if (fp.getAbsolutePath().startsWith(testRoot.getAbsolutePath())) if (fp.isDirectory()) { String[] ls = fp.list(); if (ls.length <= 0) { // log.info("del " + fp.getAbsolutePath()); fp.delete(); deleteFileParent(new File(fp.getParent())); } } else fail("Dir can't be a file but found " + fp.getAbsolutePath()); } protected void deleteDir(File dir) { String[] ls = dir.list(); if (ls == null) { log.log(Level.WARNING, "Dir not found " + dir.getAbsolutePath()); fail("Dir not found " + dir.getAbsolutePath()); } for (String fn : ls) { File f = new File(dir.getAbsolutePath() + File.separator + fn); if (f.isDirectory()) { deleteDir(f); f.delete(); } else f.delete(); } } protected List<File> createPlainCase() { List<File> files = new ArrayList<File>(); for (int i = 0; i < FILES_COUNT; i++) { File f = new File(testRoot.getAbsolutePath() + File.separator + SIDGenerator.generate()); try { // f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); try { fos.write(("File content " + f.getAbsolutePath()).getBytes()); } finally { fos.close(); files.add(f); } } catch (IOException e) { log.log(Level.WARNING, "File can't be created " + f, e); } } return this.files = files; } protected List<File> createTreeXCase() { List<File> files = new ArrayList<File>(); for (int i = 0; i < FILES_COUNT; i++) { String fileName = SIDGenerator.generate(); File dir = new File(testRoot.getAbsolutePath() + buildPathX(fileName)); dir.mkdirs(); File f = new File(dir.getAbsolutePath() + File.separator + fileName); try { // f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); try { fos.write(("File content " + f.getAbsolutePath()).getBytes()); } finally { fos.close(); files.add(f); } } catch (IOException e) { log.log(Level.WARNING, "File can't be created " + f, e); } } return this.files = files; } protected String buildPathX(String fileName) { char[] chs = fileName.toCharArray(); String path = ""; for (char ch : chs) { path += File.separator + ch; } return path; } protected List<File> createTreeXXCase() { List<File> files = new ArrayList<File>(); for (int i = 0; i < FILES_COUNT; i++) { String fileName = SIDGenerator.generate(); File dir = new File(testRoot.getAbsolutePath() + buildPathXX(fileName)); dir.mkdirs(); File f = new File(dir.getAbsolutePath() + File.separator + fileName); try { // f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); try { fos.write(("File content " + f.getAbsolutePath()).getBytes()); } finally { fos.close(); files.add(f); } } catch (IOException e) { log.log(Level.WARNING, "File can't be created " + f, e); } } return this.files = files; } protected String buildPathXX(String fileName) { char[] chs = fileName.toCharArray(); String path = ""; boolean block = true; for (char ch : chs) { path += block ? File.separator + ch : ch; block = !block; } return path; } protected List<File> createTreePrefixXCase() { List<File> files = new ArrayList<File>(); for (int i = 0; i < FILES_COUNT; i++) { String fileName = SIDGenerator.generate(); String prefix = fileName.substring(0, 24); // time + addr hash prefix String rnd = fileName.substring(24); // random name File dir = new File(testRoot.getAbsolutePath() + File.separator + prefix + File.separator + buildPathX(rnd)); dir.mkdirs(); File f = new File(dir.getAbsolutePath() + File.separator + fileName); try { // f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); try { fos.write(("File content " + f.getAbsolutePath()).getBytes()); } finally { fos.close(); files.add(f); } } catch (IOException e) { log.log(Level.WARNING, "File can't be created " + f, e); } } return this.files = files; } protected String buildPathX8(String fileName) { char[] chs = fileName.toCharArray(); String path = ""; final int xLength = 8; for (int i = 0; i < xLength; i++) { path += File.separator + chs[i]; } path += File.separator + fileName.substring(xLength); return path; } protected List<File> createTreeX8Case() { List<File> files = new ArrayList<File>(); for (int i = 0; i < FILES_COUNT; i++) { String fileName = SIDGenerator.generate(); File dir = new File(testRoot.getAbsolutePath() + File.separator + buildPathX8(fileName)); dir.mkdirs(); File f = new File(dir.getAbsolutePath() + File.separator + fileName); try { FileOutputStream fos = new FileOutputStream(f); try { fos.write(("qazws").getBytes()); } finally { fos.close(); files.add(f); } } catch (IOException e) { log.log(Level.WARNING, "File can't be created " + f, e); } } return this.files = files; } protected void readFiles(NameFilter filter) { readFiles(testRoot, filter); } protected void readFiles(File root, NameFilter filter) { // long time = System.currentTimeMillis(); // log.info(">>> Step into directory " + root.getAbsolutePath() + // (filter != null ? ", searched file " + filter.getName() : "")); String[] ls = filter != null ? root.list(filter) : root.list(); for (String file : ls) { File f = new File(testRoot.getAbsolutePath() + File.separator + file); if (f.isDirectory()) { // dir readFiles(f, filter); } else { // file try { FileInputStream fis = new FileInputStream(f); fis.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, "File not found " + file, e); } catch (IOException e) { log.log(Level.WARNING, "File IO error " + file, e); } } } // log.info("<<< Exit from directory " + root.getAbsolutePath() + ",\t" + // (System.currentTimeMillis() - time)); } protected void readTreeXFiles(NameFilter filter) { readTreeXFiles(testRoot, filter); } protected void readTreeXFiles(File root, NameFilter filter) { String dirPath = root.getAbsolutePath() + buildPathX(filter.getName()); File dir = new File(dirPath); String[] ls = filter != null ? dir.list(filter) : dir.list(); if (ls == null) { log.log(Level.WARNING, "Dir not found " + dir.getAbsolutePath()); fail("Dir not found " + dir.getAbsolutePath()); } for (String file : ls) { File f = new File(dir.getAbsolutePath() + File.separator + file); if (f.isDirectory()) { // dir fail("The file can't be a dir but found " + f.getAbsolutePath()); } else { // file try { FileInputStream fis = new FileInputStream(f); fis.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, "File not found " + file, e); } catch (IOException e) { log.log(Level.WARNING, "File IO error " + file, e); } } } } protected void readTreeX8Files(File root, NameFilter filter) { String dirPath = root.getAbsolutePath() + buildPathX8(filter.getName()); File dir = new File(dirPath); String[] ls = filter != null ? dir.list(filter) : dir.list(); if (ls == null) { log.log(Level.WARNING, "Dir not found " + dir.getAbsolutePath()); fail("Dir not found " + dir.getAbsolutePath()); } for (String file : ls) { File f = new File(dir.getAbsolutePath() + File.separator + file); if (f.isDirectory()) { // dir fail("The file can't be a dir but found " + f.getAbsolutePath()); } else { // file try { FileInputStream fis = new FileInputStream(f); fis.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, "File not found " + file, e); } catch (IOException e) { log.log(Level.WARNING, "File IO error " + file, e); } } } } protected void readTreeXXFiles(NameFilter filter) { readTreeXXFiles(testRoot, filter); } protected void readTreeXXFiles(File root, NameFilter filter) { String dirPath = root.getAbsolutePath() + buildPathXX(filter.getName()); File dir = new File(dirPath); String[] ls = filter != null ? dir.list(filter) : dir.list(); if (ls == null) { log.log(Level.WARNING, "Dir not found " + dir.getAbsolutePath()); fail("Dir not found " + dir.getAbsolutePath()); } for (String file : ls) { File f = new File(dir.getAbsolutePath() + File.separator + file); if (f.isDirectory()) { // dir fail("The file can't be a dir but found " + f.getAbsolutePath()); } else { // file try { FileInputStream fis = new FileInputStream(f); fis.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, "File not found " + file, e); } catch (IOException e) { log.log(Level.WARNING, "File IO error " + file, e); } } } } protected void readTreePrefixXFiles(NameFilter filter) { readTreeFrefixXFiles(testRoot, filter); } protected void readTreeFrefixXFiles(File root, NameFilter filter) { String fileName = filter.getName(); String prefix = fileName.substring(0, 24); // time + addr hash prefix String rnd = fileName.substring(24); // random name File dir = new File(testRoot.getAbsolutePath() + File.separator + prefix + File.separator + buildPathX(rnd)); String[] ls = filter != null ? dir.list(filter) : dir.list(); if (ls == null) { log.log(Level.WARNING, "Dir not found " + dir.getAbsolutePath()); fail("Dir not found " + dir.getAbsolutePath()); } for (String file : ls) { File f = new File(dir.getAbsolutePath() + File.separator + file); if (f.isDirectory()) { // dir fail("The file can't be a dir but found " + f.getAbsolutePath()); } else { // file try { FileInputStream fis = new FileInputStream(f); fis.close(); } catch (FileNotFoundException e) { log.log(Level.WARNING, "File not found " + file, e); } catch (IOException e) { log.log(Level.WARNING, "File IO error " + file, e); } } } } public void _testPlainReadAll() { createPlainCase(); long time = System.currentTimeMillis(); readFiles(null); log.info(getName() + " -- " + (System.currentTimeMillis() - time)); } public void _testPlainReadName() { List<File> files = createPlainCase(); // readFiles(new NameFilter(files.get(FILES_COUNT - (FILES_COUNT>>1)).getAbsolutePath())); long time = System.currentTimeMillis(); for (File f : files) { readFiles(new NameFilter(f.getName())); } log.info(getName() + " -- " + (System.currentTimeMillis() - time)); } public void _testHierarchyTreeXReadName() { List<File> files = createTreeXCase(); long time = System.currentTimeMillis(); for (File f : files) { readTreeXFiles(new NameFilter(f.getName())); } log.info(getName() + " -- " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); deleteFiles(files); log.info("Delete -- " + (System.currentTimeMillis() - time)); } public void _testHierarchyTreeXXReadName() { List<File> files = createTreeXXCase(); long time = System.currentTimeMillis(); for (File f : files) { readTreeXXFiles(new NameFilter(f.getName())); } log.info(getName() + " -- " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); deleteFiles(files); log.info("Delete -- " + (System.currentTimeMillis() - time)); } public void _testHierarchyTreePrefixXReadName() { List<File> files = createTreePrefixXCase(); long time = System.currentTimeMillis(); for (File f : files) { readTreePrefixXFiles(new NameFilter(f.getName())); } log.info(getName() + " -- " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); deleteFiles(files); log.info("Delete -- " + (System.currentTimeMillis() - time)); } public void testHierarchyTreeX8ReadName() { long time = System.currentTimeMillis(); List<File> files = createTreeX8Case(); log.info(getName() + " ADD -- " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); for (File f : files) { readTreeX8Files(testRoot, new NameFilter(f.getName())); } log.info(getName() + " READ -- " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); deleteFiles(files); log.info(getName() + " DELETE -- " + (System.currentTimeMillis() - time)); } }