/* * ome.io.nio.itests.PlaneIOUnitTest * * Copyright 2006 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.io.nio.itests; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import ome.io.nio.DimensionsOutOfBoundsException; import ome.io.nio.PixelBuffer; import ome.util.PixelData; import ome.io.nio.PixelsService; import ome.model.core.Pixels; import ome.server.itests.AbstractManagedContextTest; import org.apache.commons.codec.binary.Hex; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * @author callan * */ public class PlaneReadUnitTest extends AbstractManagedContextTest { private Integer planeCount; private Integer planeSize; private byte[][] originalDigests; private String path; private Pixels pixels; private PixbufIOFixture baseFixture; private String ROOT; private int getDigestOffset(int z, int c, int t) { int planeCountT = pixels.getSizeZ().intValue() * pixels.getSizeC().intValue(); return planeCountT * t + pixels.getSizeZ() * c + z; } private String getPlaneCheckErrStr(int z, int c, int t) { StringBuilder sb = new StringBuilder(); sb.append("Error with plane: "); sb.append("Z["); sb.append(z); sb.append("] "); sb.append("C["); sb.append(c); sb.append("] "); sb.append("T["); sb.append(t); sb.append("]."); return sb.toString(); } private byte[] createPlane(int planeSize, byte planeNo) { byte[] plane = new byte[planeSize]; for (int i = 0; i < planeSize; i++) { plane[i] = planeNo; } return plane; } private void createPlanes() throws IOException { int byteWidth = PixelData.getBitDepth(pixels.getPixelsType().getValue()) / 8; planeCount = pixels.getSizeZ() * pixels.getSizeC() * pixels.getSizeT(); planeSize = pixels.getSizeX() * pixels.getSizeY() * byteWidth; path = new PixelsService(ROOT).getPixelsPath(pixels.getId()); originalDigests = new byte[planeCount][]; FileOutputStream stream = new FileOutputStream(path); for (int i = 0; i < planeCount; i++) { byte[] plane = createPlane(planeSize.intValue(), (byte) (i - 128)); originalDigests[i] = Helper.calculateMessageDigest(plane); stream.write(plane); } } @BeforeClass protected void setup() throws Exception { ROOT = getOmeroDataDir(); // Create set up the base fixture which sets up the database for us baseFixture = new PixbufIOFixture(this.iContainer, this.iUpdate); pixels = baseFixture.setUp(); // "Our" fixture which creates the planes needed for this test case. createPlanes(); } @Test public void testInitialPlane() throws IOException, DimensionsOutOfBoundsException { PixelsService service = new PixelsService(ROOT); PixelBuffer pixbuf = service.getPixelBuffer(pixels); PixelData plane = pixbuf.getPlane(0, 0, 0); byte[] messageDigest = Helper.calculateMessageDigest(plane.getData()); assertEquals(Hex.encodeHexString(originalDigests[0]), Hex .encodeHexString(messageDigest)); } @Test public void testLastPlane() throws IOException, DimensionsOutOfBoundsException { PixelsService service = new PixelsService(ROOT); PixelBuffer pixbuf = service.getPixelBuffer(pixels); PixelData plane = pixbuf.getPlane(pixels.getSizeZ() - 1, pixels .getSizeC() - 1, pixels.getSizeT() - 1); int digestOffset = getDigestOffset(pixels.getSizeZ() - 1, pixels .getSizeC() - 1, pixels.getSizeT() - 1); byte[] messageDigest = Helper.calculateMessageDigest(plane.getData()); assertEquals(Hex.encodeHexString(originalDigests[digestOffset]), Hex .encodeHexString(messageDigest)); } @Test public void testAllPlanes() throws IOException, DimensionsOutOfBoundsException { PixelsService service = new PixelsService(ROOT); PixelBuffer pixbuf = service.getPixelBuffer(pixels); String newMessageDigest; String oldMessageDigest; int digestOffset; for (int t = 0; t < pixels.getSizeT(); t++) { for (int c = 0; c < pixels.getSizeC(); c++) { for (int z = 0; z < pixels.getSizeZ(); z++) { digestOffset = getDigestOffset(z, c, t); PixelData plane = pixbuf.getPlane(z, c, t); newMessageDigest = Hex.encodeHexString(Helper .calculateMessageDigest(plane.getData())); oldMessageDigest = Hex .encodeHexString(originalDigests[digestOffset]); assertEquals(getPlaneCheckErrStr(z, c, t), oldMessageDigest, newMessageDigest); } } } } @AfterClass protected void tearDown() throws Exception { // Tear down the resources created as part of the base fixture baseFixture.tearDown(); // Tear down the resources create in this fixture File f = new File(path); f.delete(); } }