/* * Copyright 2012 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.server.utests; import java.io.File; import java.util.HashMap; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import ome.io.nio.BackOff; import ome.io.nio.ConfiguredTileSizes; import ome.io.nio.FilePathResolver; import ome.io.nio.PixelsService; import ome.io.nio.TileSizes; import ome.model.core.Channel; import ome.model.core.Pixels; import ome.model.enums.DimensionOrder; import ome.model.enums.PixelsType; import ome.model.meta.EventLog; import ome.services.pixeldata.PersistentEventLogLoader; import ome.services.pixeldata.PixelDataHandler; import ome.services.pixeldata.PixelDataThread; import ome.services.sessions.SessionManager; import ome.services.util.Executor; import ome.system.Principal; import ome.system.ServiceFactory; import ome.util.SqlAction; import org.apache.commons.io.FileUtils; import org.jmock.Mock; import org.jmock.MockObjectTestCase; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Tests the effects of running multiple pixel data threads * at the same time. */ @Test(groups = { "pixeldata", "broken" }, timeOut=10000) public class MTPixelDataTest extends MockObjectTestCase { String uuid; String path; @BeforeMethod public void setup() { uuid = UUID.randomUUID().toString(); path = dir(uuid); } @AfterMethod public void teardown() throws Exception { FileUtils.deleteDirectory(new File(path)); } public void testBasic() throws Exception { final AtomicInteger pixelsId = new AtomicInteger(); final int numThreads = 4; final String path = dir(uuid); // MT items ExecutorService threads = Executors.newFixedThreadPool(numThreads); // nio mocks Mock boMock = mock(BackOff.class); BackOff backOff = (BackOff) boMock.proxy(); Mock fprMock = mock(FilePathResolver.class); FilePathResolver resolver = (FilePathResolver) fprMock.proxy(); fprMock.expects(atLeastOnce()).method("getOriginalFilePath") .will(returnValue(tiny(path))); fprMock.expects(atLeastOnce()).method("getPixelsParams") .will(returnValue(new HashMap<String, String>())); // nio settings TileSizes tileSizes = new ConfiguredTileSizes(5, 5, 10, 10); PixelsService service = new PixelsService(path, resolver, backOff, tileSizes, null); // session mocks Mock mgrMock = mock(SessionManager.class); Mock sqlMock = mock(SqlAction.class); SessionManager mgr = (SessionManager) mgrMock.proxy(); Executor ex = new DummyExecutor(null, null, threads); SqlAction sql = (SqlAction) sqlMock.proxy(); sqlMock.expects(atLeastOnce()).method("setStatsInfo").will( returnValue(1L)); // pixeldata PersistentEventLogLoader loader = new PersistentEventLogLoader("REPO", numThreads) { @Override protected EventLog query() { long id = (long) pixelsId.incrementAndGet(); EventLog log = new EventLog(); log.setEntityId(id); return log; } }; PixelDataHandler handler = new PixelDataHandler(loader, service) { @Override protected Pixels getPixels(Long id, ServiceFactory sf) { Pixels pix = new Pixels(id, true); pix.setSizeX(20); pix.setSizeY(20); pix.setSizeZ(2); pix.setSizeC(1); pix.setSizeT(2); pix.setDimensionOrder(new DimensionOrder("XYZCT")); pix.setPixelsType(new PixelsType("int8")); pix.addChannel(new Channel()); return pix; } }; handler.setSqlAction(sql); PixelDataThread thread = new PixelDataThread(true, mgr, ex, handler, new Principal("test"), uuid, numThreads) { @Override protected void onExecutionException(ExecutionException ee) { Throwable t = ee.getCause(); if (t instanceof RuntimeException) { throw (RuntimeException) t; } else { throw new RuntimeException(t); } } }; // test thread.doRun(); } String tiny(String dir) throws Exception { File fake = new File(new File(dir), "test&sizeX=20&sizeY=20&sizeZ=2&sizeC=1&sizeT=2&.fake"); return fake.getAbsolutePath(); } String dir(String uuid) { File here = new File("."); File target = new File(here, "target"); File test = new File(target, "test"); File Pixels = new File(test, uuid); if (!Pixels.exists()) { Pixels.mkdirs(); } return Pixels.getAbsolutePath(); } }