// // OMETiffWriterTest.java // /* OME Bio-Formats package for reading and converting biological file formats. Copyright (C) 2005-@year@ UW-Madison LOCI and Glencoe Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package loci.formats.utests.tiff; import static org.testng.AssertJUnit.*; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import loci.common.RandomAccessInputStream; import loci.common.services.ServiceFactory; import loci.formats.ImageWriter; import loci.formats.ome.OMEXMLMetadata; import loci.formats.services.OMEXMLService; import ome.xml.model.enums.DimensionOrder; import ome.xml.model.enums.PixelType; import ome.xml.model.primitives.PositiveInteger; import org.apache.log4j.Appender; import org.apache.log4j.Layout; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.ErrorHandler; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * <dl><dt><b>Source code:</b></dt> * <dd><a href="http://trac.openmicroscopy.org.uk/ome/browser/bioformats.git/components/bio-formats/test/loci/formats/utests/tiff/OMETiffWriterTest.java">Trac</a>, * <a href="http://git.openmicroscopy.org/?p=bioformats.git;a=blob;f=components/bio-formats/test/loci/formats/utests/tiff/OMETiffWriterTest.java;hb=HEAD">Gitweb</a></dd></dl> * * @author callan */ public class OMETiffWriterTest { public static final int SIZE_Z = 100; public static final int SIZE_C = 1; public static final int SIZE_T = 20; private static final byte[] buf = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; private File target; private FileHandleTrackingAppender app = new FileHandleTrackingAppender(); private OMEXMLMetadata ms; @BeforeClass public void setUp() throws Exception { target = File.createTempFile("OMETiffWriterTest", ".ome.tiff"); Logger l = Logger.getLogger(RandomAccessInputStream.class); l.setLevel(Level.TRACE); l.addAppender(app); ServiceFactory sf = new ServiceFactory(); OMEXMLService service = sf.getInstance(OMEXMLService.class); ms = service.createOMEXMLMetadata(); ms.setImageID("Image:1", 0); ms.setPixelsID("Pixels:1", 0); ms.setPixelsDimensionOrder(DimensionOrder.XYZCT, 0); ms.setPixelsSizeX(new PositiveInteger(4), 0); ms.setPixelsSizeY(new PositiveInteger(4), 0); ms.setPixelsSizeZ(new PositiveInteger(SIZE_Z), 0); ms.setPixelsSizeC(new PositiveInteger(SIZE_C), 0); ms.setPixelsSizeT(new PositiveInteger(SIZE_T), 0); ms.setPixelsType(PixelType.UINT8, 0); ms.setPixelsBinDataBigEndian(true, 0, 0); ms.setChannelID("Channel:1", 0, 0); ms.setChannelSamplesPerPixel(new PositiveInteger(1), 0, 0); } @AfterClass public void tearDown() throws Exception { target.delete(); } @Test public void testFileHandleClosure() throws Exception { ImageWriter writer = new ImageWriter(); writer.setMetadataRetrieve(ms); writer.setId(target.getAbsolutePath()); for (int i = 0; i < (SIZE_Z * SIZE_C * SIZE_T); i++) { writer.saveBytes(i, buf); } writer.close(); for (Entry<Long, Boolean> entry : app.map.entrySet()) { if (!entry.getValue()) { fail("RandomAccessInputStream " + entry.getKey() + " not closed!"); } } System.err.println("Tracker length: " + app.map.size()); } class FileHandleTrackingAppender implements Appender { public Map<Long, Boolean> map = new HashMap<Long, Boolean>(); /* (non-Javadoc) * @see org.apache.log4j.Appender#addFilter(org.apache.log4j.spi.Filter) */ public void addFilter(Filter arg0) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.apache.log4j.Appender#clearFilters() */ public void clearFilters() { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.apache.log4j.Appender#close() */ public void close() { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.apache.log4j.Appender#doAppend(org.apache.log4j.spi.LoggingEvent) */ public void doAppend(LoggingEvent event) { String[] result = event.getMessage().toString().split("\\s"); if (result.length == 3) { Long hashCode = Long.parseLong(result[1]); Boolean closed = "CLOSE".equals(result[2]); map.put(hashCode, closed); } } /* (non-Javadoc) * @see org.apache.log4j.Appender#getErrorHandler() */ public ErrorHandler getErrorHandler() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.apache.log4j.Appender#getFilter() */ public Filter getFilter() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.apache.log4j.Appender#getLayout() */ public Layout getLayout() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.apache.log4j.Appender#getName() */ public String getName() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.apache.log4j.Appender#requiresLayout() */ public boolean requiresLayout() { // TODO Auto-generated method stub return false; } /* (non-Javadoc) * @see org.apache.log4j.Appender#setErrorHandler(org.apache.log4j.spi.ErrorHandler) */ public void setErrorHandler(ErrorHandler handler) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.apache.log4j.Appender#setLayout(org.apache.log4j.Layout) */ public void setLayout(Layout layout) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.apache.log4j.Appender#setName(java.lang.String) */ public void setName(String name) { // TODO Auto-generated method stub } } }