/*- * Copyright 2016 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.processing.test.executionvisitor; import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.dawb.common.services.ServiceManager; import org.dawnsci.persistence.PersistenceServiceCreator; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.persistence.IPersistenceService; import org.eclipse.dawnsci.analysis.api.processing.ExecutionType; import org.eclipse.dawnsci.analysis.api.processing.ILiveOperationInfo; import org.eclipse.dawnsci.analysis.api.processing.IOperation; import org.eclipse.dawnsci.analysis.api.processing.IOperationContext; import org.eclipse.dawnsci.analysis.api.processing.IOperationService; import org.eclipse.dawnsci.analysis.api.processing.model.EmptyModel; import org.eclipse.dawnsci.analysis.api.processing.model.SleepModel; import org.eclipse.dawnsci.analysis.dataset.roi.RectangularROI; import org.eclipse.january.dataset.IDynamicDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.metadata.AxesMetadata; import org.eclipse.january.metadata.MetadataFactory; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import uk.ac.diamond.scisoft.analysis.io.LoaderFactory; import uk.ac.diamond.scisoft.analysis.processing.Activator; import uk.ac.diamond.scisoft.analysis.processing.operations.DataWrittenOperation; import uk.ac.diamond.scisoft.analysis.processing.operations.NoDataOperation; import uk.ac.diamond.scisoft.analysis.processing.operations.SleepOperation; import uk.ac.diamond.scisoft.analysis.processing.operations.roiprofile.BoxMeanOperation; import uk.ac.diamond.scisoft.analysis.processing.operations.roiprofile.BoxModel; import uk.ac.diamond.scisoft.analysis.processing.operations.twod.DownsampleImageModel; import uk.ac.diamond.scisoft.analysis.processing.operations.twod.DownsampleImageOperation; import uk.ac.diamond.scisoft.analysis.processing.runner.OperationRunnerImpl; import uk.ac.diamond.scisoft.analysis.processing.runner.SeriesRunner; import uk.ac.diamond.scisoft.analysis.processing.visitor.NexusFileExecutionVisitor; public class MockScanProcessTest { private static IOperationService service; @BeforeClass public static void before() throws Exception { OperationRunnerImpl.setRunner(ExecutionType.SERIES, new SeriesRunner()); OperationRunnerImpl.setRunner(ExecutionType.PARALLEL, new SeriesRunner()); ServiceManager.setService(IPersistenceService.class, PersistenceServiceCreator.createPersistenceService()); NexusFileExecutionVisitor.setPersistenceService(PersistenceServiceCreator.createPersistenceService()); service = (IOperationService)Activator.getService(IOperationService.class); service.createOperations(service.getClass().getClassLoader(), "uk.ac.diamond.scisoft.analysis.processing.test.executionvisitor"); } @Test public void test() throws Exception { int sleep = 200; int[] dataShape = {5,10,101,102}; ExecutorService ste = Executors.newSingleThreadExecutor(); final File tmp = File.createTempFile("Test", ".h5"); tmp.deleteOnExit(); tmp.createNewFile(); startMockScan(dataShape, sleep,ste,tmp); ste.shutdown(); ExecutorService ste2 = Executors.newSingleThreadExecutor(); final File tmpProc = File.createTempFile("Test", ".h5"); tmpProc.deleteOnExit(); tmpProc.createNewFile(); starProcessing(ste2, tmpProc, tmp, false); ste2.shutdown(); while (!ste.awaitTermination(200,TimeUnit.MILLISECONDS) || !ste2.awaitTermination(200,TimeUnit.MILLISECONDS)) { //nothing } ste.toString(); } @Test public void testNoDataOut() throws Exception { int sleep = 200; int[] dataShape = {5,10,101,102}; ExecutorService ste = Executors.newSingleThreadExecutor(); final File tmp = File.createTempFile("Test", ".h5"); tmp.deleteOnExit(); tmp.createNewFile(); startMockScan(dataShape, sleep,ste,tmp); ste.shutdown(); ExecutorService ste2 = Executors.newSingleThreadExecutor(); final File tmpProc = File.createTempFile("Test", ".h5"); tmpProc.deleteOnExit(); tmpProc.createNewFile(); starProcessing(ste2, tmpProc, tmp, true); ste2.shutdown(); while (!ste.awaitTermination(200,TimeUnit.MILLISECONDS) || !ste2.awaitTermination(200,TimeUnit.MILLISECONDS)) { //nothing } ste.toString(); } private void startMockScan(int[] shape, int sleep, ExecutorService ste, File tmp) throws Exception{ ILazyDataset lazy = ExecutionVisitorTestUtils.getLazyDataset(shape, 1); final IOperationContext context = service.createContext(); context.setData(lazy); context.setDataDimensions(new int[]{2,3}); SleepOperation ops = new SleepOperation(); ops.setModel(new SleepModel()); ops.getModel().setMilliseconds(sleep); DataWrittenOperation odo = new DataWrittenOperation(); odo.setModel(new EmptyModel()); //FIXME or rather fix swmr. Not currently testing swmr since wont read from a //different thread to writing thread context.setVisitor(new NexusFileExecutionVisitor(tmp.getAbsolutePath(),true)); context.setSeries(ops,odo); context.setExecutionType(ExecutionType.SERIES); ste.submit(new Runnable() { @Override public void run() { service.execute(context); } }); } private void starProcessing(ExecutorService ste, File tmpProc, File tmp, boolean noData) throws Exception{ String data = "/entry/result/data"; String key = "/entry/auxiliary/1-DataWritten/key/data"; String ax0 = "/entry/result/Axis_0"; String ax1 = "/entry/result/Axis_1"; String ax2 = "/entry/result/Axis_2"; String ax3 = "/entry/result/Axis_3"; final IOperationContext context = service.createContext(); IDataHolder dh = null; int count = 0; while (count < 100 && (dh == null || !dh.contains("/entry/result/data"))){ Thread.sleep(100); count++; dh = LoaderFactory.getData(tmp.getAbsolutePath()); } if (count == 100) Assert.fail("Couldnt read file!"); final IDataHolder fdh = dh; ILazyDataset lz = dh.getLazyDataset(data); AxesMetadata ax = MetadataFactory.createMetadata(AxesMetadata.class, 4); ax.addAxis(0, dh.getLazyDataset(ax0)); ax.addAxis(1, dh.getLazyDataset(ax1)); ax.addAxis(2, dh.getLazyDataset(ax2)); ax.addAxis(3, dh.getLazyDataset(ax3)); lz.addMetadata(ax); context.setData(lz); context.setDataDimensions(new int[]{2,3}); context.setLiveInfo(new ILiveOperationInfo() { @Override public IDynamicDataset[] getKeys() { ILazyDataset lazyDataset = fdh.getLazyDataset("/entry/auxiliary/1-DataWritten/key/data"); return new IDynamicDataset[]{(IDynamicDataset)lazyDataset}; } @Override public IDynamicDataset getComplete() { return (IDynamicDataset)fdh.getLazyDataset("/entry/live/finished"); } }); IOperation[] ops = new IOperation[noData ? 3 : 2]; BoxMeanOperation bmo = new BoxMeanOperation(); bmo.setName("BoxMean"); BoxModel bmm = new BoxModel(); bmm.setBox(new RectangularROI(10,10, 10, 10, 0)); bmo.setModel(bmm); ops[0] = bmo; DownsampleImageOperation dso = new DownsampleImageOperation(); DownsampleImageModel dsm = new DownsampleImageModel(); dsm.setDownsampleSizeY(10); dsm.setDownsampleSizeX(10); dso.setModel(dsm); ops[1] = dso; if (noData) { NoDataOperation ndo = new NoDataOperation(); ndo.setModel(new EmptyModel()); ops[2] = ndo; } //FIXME or rather fix swmr. Not currently testing swmr since wont read from a //different thread to writing thread context.setVisitor(new NexusFileExecutionVisitor(tmpProc.getAbsolutePath(),true)); context.setSeries(ops); context.setExecutionType(ExecutionType.SERIES); ste.submit(new Runnable() { @Override public void run() { service.execute(context); } }); } }