/* * #%L * BSD implementations of Bio-Formats readers and writers * %% * Copyright (C) 2005 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * #L% */ package loci.formats.utests; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.io.File; import java.util.UUID; import loci.formats.FormatTools; import loci.formats.Memoizer; import loci.formats.in.FakeReader; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** */ public class MemoizerTest { private static final String TEST_FILE = "test&pixelType=int8&sizeX=20&sizeY=20&sizeC=1&sizeZ=1&sizeT=1.fake"; private File idDir; private String id; private FakeReader reader; private Memoizer memoizer; private static int fullPlaneCallIndex; private int sizeX; private int sizeY; private int bpp; private int planeSize; @BeforeMethod public void setUp() throws Exception { fullPlaneCallIndex = 1; // No mapping. // Location.mapId(TEST_FILE, TEST_FILE); reader = new FakeReader(); try { String uuid = UUID.randomUUID().toString(); idDir = new File(System.getProperty("java.io.tmpdir"), uuid); idDir.mkdirs(); File tempFile = new File(idDir, TEST_FILE); tempFile.createNewFile(); id = tempFile.getAbsolutePath(); reader.setId(id); sizeX = reader.getSizeX(); sizeY = reader.getSizeY(); bpp = FormatTools.getBytesPerPixel(reader.getPixelType()); planeSize = sizeY * sizeY * bpp; } finally { reader.close(); } reader = new FakeReader(); // No setId ! } @AfterMethod public void tearDown() throws Exception { memoizer.close(); reader.close(); } @Test public void testSimple() throws Exception { memoizer = new Memoizer(reader); File f = memoizer.getMemoFile(id); if (f != null && f.exists()) { f.delete(); } // At this point we're sure that there's no memo file. reader.setId(id); reader.close(); memoizer.setId(id); memoizer.close(); memoizer.setId(id); memoizer.close(); } public void testDefaultConstructor() throws Exception { memoizer = new Memoizer(); File f = memoizer.getMemoFile(id); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); } @Test public void testConstructorTimeElapsed() throws Exception { memoizer = new Memoizer(0); File f = memoizer.getMemoFile(id); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); // Test multiple setId invocations memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); memoizer.close(); memoizer.setId(id); assertTrue(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testConstructorReader() throws Exception { memoizer = new Memoizer(reader); File f = memoizer.getMemoFile(id); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); } @Test public void testConstructorReaderTimeElapsed() throws Exception { memoizer = new Memoizer(reader, 0); File f = memoizer.getMemoFile(id); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); // Test multiple setId invocations memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); memoizer.close(); memoizer.setId(id); assertTrue(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testConstructorTimeElapsedDirectory() throws Exception { String uuid = UUID.randomUUID().toString(); File directory = new File(System.getProperty("java.io.tmpdir"), uuid); memoizer = new Memoizer(0, directory); // Check non-existing memo directory returns null assertEquals(memoizer.getMemoFile(id), null); // Create memoizer directory and memoizer reader directory.mkdirs(); String memoDir = idDir.getAbsolutePath(); memoDir = memoDir.substring(memoDir.indexOf(File.separator) + 1); File memoFile = new File(directory, memoDir); memoFile = new File(memoFile, "." + TEST_FILE + ".bfmemo"); File f = memoizer.getMemoFile(id); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); // Test multiple setId invocations memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); memoizer.close(); memoizer.setId(id); assertTrue(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testConstructorTimeElapsedNull() throws Exception { memoizer = new Memoizer(0, null); // Check null memo directory returns null assertEquals(memoizer.getMemoFile(id), null); // Test setId invocation memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testConstructorReaderTimeElapsedDirectory() throws Exception { String uuid = UUID.randomUUID().toString(); File directory = new File(System.getProperty("java.io.tmpdir"), uuid); memoizer = new Memoizer(reader, 0, directory); // Check non-existing memo directory returns null assertEquals(memoizer.getMemoFile(id), null); // Create memoizer directory and memoizer reader directory.mkdirs(); String memoDir = idDir.getAbsolutePath(); memoDir = memoDir.substring(memoDir.indexOf(File.separator) + 1); File memoFile = new File(directory, memoDir); memoFile = new File(memoFile, "." + TEST_FILE + ".bfmemo"); File f = memoizer.getMemoFile(id); assertEquals(f.getAbsolutePath(), memoFile.getAbsolutePath()); // Test multiple setId invocations memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); memoizer.close(); memoizer.setId(id); assertTrue(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testConstructorReaderTimeElapsedNull() throws Exception { memoizer = new Memoizer(reader, 0, null); // Check null memo directory returns null assertEquals(memoizer.getMemoFile(id), null); // Test setId invocation memoizer.setId(id); assertFalse(memoizer.isLoadedFromMemo()); assertFalse(memoizer.isSavedToMemo()); memoizer.close(); } @Test public void testGetMemoFilePermissionsDirectory() throws Exception { String uuid = UUID.randomUUID().toString(); File directory = new File(System.getProperty("java.io.tmpdir"), uuid); memoizer = new Memoizer(reader, 0, directory); // Check non-existing memo directory returns null assertEquals(memoizer.getMemoFile(id), null); // Create memoizer directory and memoizer reader directory.mkdirs(); memoizer = new Memoizer(reader, 0, directory); // Check existing non-writeable memo directory returns null if (File.separator.equals("/")) { // File.setWritable() does not work properly on Windows directory.setWritable(false); assertEquals(memoizer.getMemoFile(id), null); } // Check existing writeable memo diretory returns a memo file directory.setWritable(true); String memoDir = idDir.getAbsolutePath(); memoDir = memoDir.substring(memoDir.indexOf(File.separator) + 1); File memoFile = new File(directory, memoDir); memoFile = new File(memoFile, "." + TEST_FILE + ".bfmemo"); assertEquals(memoizer.getMemoFile(id).getAbsolutePath(), memoFile.getAbsolutePath()); } @Test public void testGetMemoFilePermissionsInPlaceDirectory() throws Exception { String rootPath = id.substring(0, id.indexOf(File.separator) + 1); memoizer = new Memoizer(reader, 0, new File(rootPath)); // Check non-writeable file directory returns null for in-place caching if (File.separator.equals("/")) { // File.setWritable() does not work properly on Windows idDir.setWritable(false); assertEquals(memoizer.getMemoFile(id), null); } // Check writeable file directory returns memo file beside file idDir.setWritable(true); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(memoizer.getMemoFile(id).getAbsolutePath(), memoFile.getAbsolutePath()); } @Test public void testGetMemoFilePermissionsInPlace() throws Exception { memoizer = new Memoizer(reader); // Check non-writeable file directory returns null for in-place caching if (File.separator.equals("/")) { // File.setWritable() does not work properly on Windows idDir.setWritable(false); assertEquals(memoizer.getMemoFile(id), null); } // Check writeable file directory returns memo file beside file idDir.setWritable(true); File memoFile = new File(idDir, "." + TEST_FILE + ".bfmemo"); assertEquals(memoizer.getMemoFile(id).getAbsolutePath(), memoFile.getAbsolutePath()); } @Test public void testRelocate() throws Exception { // Create an in-place memo file memoizer = new Memoizer(reader, 0); memoizer.setId(id); memoizer.close(); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); // Rename the directory (including the file and the memo file) String uuid = UUID.randomUUID().toString(); File newidDir = new File(System.getProperty("java.io.tmpdir"), uuid); idDir.renameTo(newidDir); File newtempFile = new File(newidDir, TEST_FILE); String newid = newtempFile.getAbsolutePath(); // Try to reopen the file with the Memoizer memoizer.setId(newid); memoizer.close(); assertFalse(memoizer.isLoadedFromMemo()); assertTrue(memoizer.isSavedToMemo()); } public static void main(String[] args) throws Exception { MemoizerTest t = new MemoizerTest(); t.setUp(); try { t.testSimple(); } finally { t.tearDown(); } } }