diff --git a/pom.xml b/pom.xml
index 76c80a8..ab3523b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -138,7 +138,7 @@
3.3.0
4.2.1
4.1.1
- 4.2.5
+ 4.2.6-SNAPSHOT
7.0.2
1.6.0
@@ -216,6 +216,13 @@
tests
test
+
+ org.janelia.saalfeldlab
+ n5-ij
+ ${n5-ij.version}
+ tests
+ test
+
diff --git a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java
index d50babe..99401fb 100644
--- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java
+++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java
@@ -1,12 +1,13 @@
package org.janelia.saalfeldlab.n5.bdv;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
-import java.net.URL;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -15,8 +16,8 @@
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
-import org.janelia.saalfeldlab.n5.N5Reader;
import org.janelia.saalfeldlab.n5.N5Writer;
+import org.janelia.saalfeldlab.n5.TestRunners;
import org.janelia.saalfeldlab.n5.ij.N5Importer;
import org.janelia.saalfeldlab.n5.ij.N5ScalePyramidExporter;
import org.janelia.saalfeldlab.n5.metadata.imagej.ImagePlusLegacyMetadataParser;
@@ -26,7 +27,9 @@
import org.janelia.saalfeldlab.n5.universe.N5Factory;
import org.janelia.saalfeldlab.n5.universe.N5TreeNode;
import org.janelia.saalfeldlab.n5.universe.metadata.axes.AxisUtils;
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@@ -46,17 +49,28 @@
import net.imglib2.realtransform.AffineTransform3D;
import net.imglib2.type.NativeType;
import net.imglib2.type.numeric.NumericType;
+import net.imglib2.util.ValuePair;
import net.imglib2.view.Views;
public class BdvMetadataIoTests {
- private File baseDir;
+ private static File baseDir;
- @Before
- public void before() {
+ @BeforeClass
+ public static void before() {
- final URL configUrl = BdvMetadataIoTests.class.getResource("/plugins.config");
- baseDir = new File(configUrl.getFile()).getParentFile();
+ try {
+ baseDir = Files.createTempDirectory("n5-ij-tests-").toFile();
+ baseDir.deleteOnExit();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterClass
+ public static void after() {
+
+ baseDir.delete();
}
public & NativeType, V extends Volatile & NumericType> void readWriteParseTest(
@@ -76,66 +90,91 @@ public & NativeType, V extends Volatile & Numeri
writer.setOverwrite(true); // overwrite on for this test
writer.run(); // run() closes the n5 writer
+ try {
+ Thread.sleep(20);
+ } catch (InterruptedException e) {}
+
final String readerDataset = dataset;
- final N5Reader n5 = new N5Factory().openReader(outputPath);
- final N5DatasetDiscoverer datasetDiscoverer = new N5DatasetDiscoverer(n5, Executors.newSingleThreadExecutor(), (x) -> true,
- Arrays.asList(N5ViewerCreator.n5vParsers),
- Arrays.asList(N5ViewerCreator.n5vGroupParsers));
-
- final N5TreeNode root = datasetDiscoverer.discoverAndParseRecursive("");
- final Optional metaOpt = root.getDescendant(readerDataset);
- if (!metaOpt.isPresent())
- fail("could not find metadata at: " + readerDataset);
-
- final List converterSetups = new ArrayList<>();
- final List> sourcesAndConverters = new ArrayList<>();
-
- final SharedQueue sharedQueue = new SharedQueue(1);
- final BdvOptions options = BdvOptions.options().frameTitle("N5 Viewer");
-
- final int numTimepoints = N5Viewer.buildN5Sources(
- n5,
- new DataSelection(n5, Collections.singletonList(metaOpt.get().getMetadata())),
- sharedQueue,
- converterSetups,
- sourcesAndConverters,
- options);
-
- assertEquals(String.format("channels for %s", dataset), imp.getNChannels(), sourcesAndConverters.size());
- assertEquals(String.format("time points for %s", dataset), imp.getNFrames(), numTimepoints);
-
- final Source src0 = sourcesAndConverters.get(0).getSpimSource();
- assertEquals(String.format("slices for %s", dataset), imp.getNSlices(),
- src0.getSource(0, 0).dimension(2));
-
- final AffineTransform3D tform = new AffineTransform3D();
- src0.getSourceTransform(0, 0, tform);
- final double rx = tform.get(0, 0);
- final double ry = tform.get(1, 1);
- final double rz = tform.get(2, 2);
- final String unit = src0.getVoxelDimensions().unit();
-
- if (testMeta) {
- final boolean resEqual = rx == imp.getCalibration().pixelWidth &&
- ry == imp.getCalibration().pixelHeight &&
- rz == imp.getCalibration().pixelDepth;
-
- assertTrue(String.format("%s resolutions ", dataset), resEqual);
- assertTrue(String.format("%s units ", dataset),
- unit.equals(imp.getCalibration().getUnit()));
+ try( final N5Writer n5 = new N5Factory().openWriter(outputPath) ) {
- }
+ final N5DatasetDiscoverer datasetDiscoverer = new N5DatasetDiscoverer(
+ n5,
+ Executors.newSingleThreadExecutor(),
+ (x) -> true,
+ Arrays.asList(N5ViewerCreator.n5vParsers),
+ Arrays.asList(N5ViewerCreator.n5vGroupParsers));
- if (testData) {
- final List> srcList = sourcesAndConverters.stream().map(sac -> sac.getSpimSource()).collect(Collectors.toList());
- assertTrue(String.format("%s data ", dataset), sourceDataIdentical(imp, srcList));
- }
- n5.close();
+ TestRunners.tryWaitRepeat(() -> {
+
+ N5TreeNode root;
+ try {
+ root = datasetDiscoverer.discoverAndParseRecursive("");
+ } catch (IOException e) {
+ return null; // to trigger retry
+ }
+
+ final Optional metaOpt = root.getDescendant(readerDataset);
+ final List converterSetups = new ArrayList<>();
+ final List> sourcesAndConverters = new ArrayList<>();
+
+ final SharedQueue sharedQueue = new SharedQueue(1);
+ final BdvOptions options = BdvOptions.options().frameTitle("N5 Viewer");
+
+ int numTimepoints;
+ try {
+ numTimepoints = N5Viewer.buildN5Sources(
+ n5,
+ new DataSelection(n5, Collections.singletonList(metaOpt.get().getMetadata())),
+ sharedQueue,
+ converterSetups,
+ sourcesAndConverters,
+ options);
+ } catch (IOException e) {
+ return null; // to trigger retry
+ }
+
+ return new ValuePair>, Integer>(sourcesAndConverters, numTimepoints);
+
+ }).ifPresent(sacAndNtime -> {
- // remove
- final N5Writer n5w = new N5Factory().openWriter(outputPath);
- n5w.remove();
+ final List> sourcesAndConverters = sacAndNtime.getA();
+ final int numTimepoints = sacAndNtime.getB();
+
+ assertEquals(String.format("channels for %s", dataset), imp.getNChannels(), sourcesAndConverters.size());
+ assertEquals(String.format("time points for %s", dataset), imp.getNFrames(), numTimepoints);
+
+ final Source src0 = sourcesAndConverters.get(0).getSpimSource();
+ assertEquals(String.format("slices for %s", dataset), imp.getNSlices(),
+ src0.getSource(0, 0).dimension(2));
+
+ final AffineTransform3D tform = new AffineTransform3D();
+ src0.getSourceTransform(0, 0, tform);
+ final double rx = tform.get(0, 0);
+ final double ry = tform.get(1, 1);
+ final double rz = tform.get(2, 2);
+ final String unit = src0.getVoxelDimensions().unit();
+
+ if (testMeta) {
+ final boolean resEqual = rx == imp.getCalibration().pixelWidth &&
+ ry == imp.getCalibration().pixelHeight &&
+ rz == imp.getCalibration().pixelDepth;
+
+ assertTrue(String.format("%s resolutions ", dataset), resEqual);
+ assertTrue(String.format("%s units ", dataset),
+ unit.equals(imp.getCalibration().getUnit()));
+
+ }
+
+ if (testData) {
+ final List> srcList = sourcesAndConverters.stream().map(sac -> sac.getSpimSource()).collect(Collectors.toList());
+ assertTrue(String.format("%s data ", dataset), sourceDataIdentical(imp, srcList));
+ }
+
+ });
+
+ n5.close();
+ }
}
/*
@@ -186,6 +225,11 @@ public void testMultiChannelHelper(final String metatype, final String suffix) t
final String dataset = String.format("/c%dz%dt%d", nc, nz, nt);
readWriteParseTest(imp, n5RootPath, dataset, blockSizeString, metatype, compressionString, true, true);
+
+ try {
+ Thread.sleep(20);
+ } catch (InterruptedException e) {}
+
}
}
}