From 677aa0229fef9a23026a65bcbd49f2e0077238c4 Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Fri, 4 Oct 2024 10:43:37 -0400 Subject: [PATCH 1/5] test: BdvMetadataIoTests improvements * use temp folder * use try-with n5writer --- .../n5/bdv/BdvMetadataIoTests.java | 118 +++++++++--------- 1 file changed, 60 insertions(+), 58 deletions(-) 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 e5f5462..2200061 100644 --- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java +++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java @@ -7,6 +7,7 @@ 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,7 +16,6 @@ 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.ij.N5Importer; import org.janelia.saalfeldlab.n5.ij.N5ScalePyramidExporter; @@ -54,8 +54,12 @@ public class BdvMetadataIoTests { @Before public 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(); + } } public & NativeType, V extends Volatile & NumericType> void readWriteParseTest( @@ -77,64 +81,62 @@ public & NativeType, V extends Volatile & Numeri 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(); + 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); - // remove - final N5Writer n5w = new N5Factory().openWriter(outputPath); - n5w.remove(); + 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.remove(); + } } /* From 2bd25337aa9c73377cbef93ca7959921d8ec9a8b Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Fri, 4 Oct 2024 10:54:49 -0400 Subject: [PATCH 2/5] wip/test: BdvMetadataIoTests temporarily don't clean up --- .../n5/bdv/BdvMetadataIoTests.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) 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 2200061..4196111 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,12 @@ 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; @@ -26,7 +26,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.Test; import bdv.cache.SharedQueue; @@ -49,10 +51,10 @@ public class BdvMetadataIoTests { - private File baseDir; + private static File baseDir; - @Before - public void before() { + @BeforeClass + public static void before() { try { baseDir = Files.createTempDirectory("n5-ij-tests-").toFile(); @@ -62,6 +64,12 @@ public void before() { } } + @AfterClass + public static void after() { + +// baseDir.delete(); + } + public & NativeType, V extends Volatile & NumericType> void readWriteParseTest( final ImagePlus imp, final String outputPath, @@ -83,11 +91,16 @@ public & NativeType, V extends Volatile & Numeri try( final N5Writer n5 = new N5Factory().openWriter(outputPath) ) { - final N5DatasetDiscoverer datasetDiscoverer = new N5DatasetDiscoverer(n5, Executors.newSingleThreadExecutor(), (x) -> true, + final N5DatasetDiscoverer datasetDiscoverer = new N5DatasetDiscoverer( + n5, + Executors.newSingleThreadExecutor(), + (x) -> true, Arrays.asList(N5ViewerCreator.n5vParsers), Arrays.asList(N5ViewerCreator.n5vGroupParsers)); final N5TreeNode root = datasetDiscoverer.discoverAndParseRecursive(""); + assertNotNull("root is null", root); + final Optional metaOpt = root.getDescendant(readerDataset); if (!metaOpt.isPresent()) fail("could not find metadata at: " + readerDataset); @@ -135,7 +148,6 @@ public & NativeType, V extends Volatile & Numeri final List> srcList = sourcesAndConverters.stream().map(sac -> sac.getSpimSource()).collect(Collectors.toList()); assertTrue(String.format("%s data ", dataset), sourceDataIdentical(imp, srcList)); } - n5.remove(); } } From 989ec729bb7d9a4d0d96548a4540b82e40ce8b44 Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Fri, 4 Oct 2024 11:02:34 -0400 Subject: [PATCH 3/5] test/wip: BdvMetadataIoTests clearer assertions --- .../janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 4196111..32cbfd5 100644 --- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java +++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java @@ -99,11 +99,11 @@ public & NativeType, V extends Volatile & Numeri Arrays.asList(N5ViewerCreator.n5vGroupParsers)); final N5TreeNode root = datasetDiscoverer.discoverAndParseRecursive(""); - assertNotNull("root is null", root); + assertNotNull("Root node is null", root); final Optional metaOpt = root.getDescendant(readerDataset); - if (!metaOpt.isPresent()) - fail("could not find metadata at: " + readerDataset); + assertTrue( String.format( "[%s] Could not find descendant node: %s ", outputPath, readerDataset ), + metaOpt.isPresent()); final List converterSetups = new ArrayList<>(); final List> sourcesAndConverters = new ArrayList<>(); @@ -148,6 +148,8 @@ public & NativeType, V extends Volatile & Numeri final List> srcList = sourcesAndConverters.stream().map(sac -> sac.getSpimSource()).collect(Collectors.toList()); assertTrue(String.format("%s data ", dataset), sourceDataIdentical(imp, srcList)); } + + n5.close(); } } From cfe8e3638aeed2f74fea13ed3f2583a66db2e14e Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Fri, 4 Oct 2024 11:12:18 -0400 Subject: [PATCH 4/5] wip/tests: omg add sleeps!? --- .../janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 32cbfd5..09f9c27 100644 --- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java +++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java @@ -87,6 +87,10 @@ 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; try( final N5Writer n5 = new N5Factory().openWriter(outputPath) ) { @@ -200,6 +204,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) {} + } } } From 7f474d855732262a3dbb9d4739da73f206f4db19 Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Tue, 8 Oct 2024 14:05:35 -0400 Subject: [PATCH 5/5] test: BdvMetadataIoTests use tryWaitRepeat --- pom.xml | 9 +- .../n5/bdv/BdvMetadataIoTests.java | 109 ++++++++++-------- 2 files changed, 72 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 60155cd..45177e0 100644 --- a/pom.xml +++ b/pom.xml @@ -138,7 +138,7 @@ 3.3.0 4.2.1 4.1.1 - 4.2.3 + 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 09f9c27..3f7c8ac 100644 --- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java +++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/BdvMetadataIoTests.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; 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; @@ -47,6 +48,7 @@ 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 { @@ -67,7 +69,7 @@ public static void before() { @AfterClass public static void after() { -// baseDir.delete(); + baseDir.delete(); } public & NativeType, V extends Volatile & NumericType> void readWriteParseTest( @@ -102,56 +104,73 @@ public & NativeType, V extends Volatile & Numeri Arrays.asList(N5ViewerCreator.n5vParsers), Arrays.asList(N5ViewerCreator.n5vGroupParsers)); - final N5TreeNode root = datasetDiscoverer.discoverAndParseRecursive(""); - assertNotNull("Root node is null", root); + TestRunners.tryWaitRepeat(() -> { - final Optional metaOpt = root.getDescendant(readerDataset); - assertTrue( String.format( "[%s] Could not find descendant node: %s ", outputPath, readerDataset ), - metaOpt.isPresent()); + N5TreeNode root; + try { + root = datasetDiscoverer.discoverAndParseRecursive(""); + } catch (IOException e) { + return null; // to trigger retry + } - final List converterSetups = new ArrayList<>(); - final List> sourcesAndConverters = new ArrayList<>(); + 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 + } - final SharedQueue sharedQueue = new SharedQueue(1); - final BdvOptions options = BdvOptions.options().frameTitle("N5 Viewer"); + return new ValuePair>, Integer>(sourcesAndConverters, numTimepoints); - 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())); + }).ifPresent(sacAndNtime -> { - } + final List> sourcesAndConverters = sacAndNtime.getA(); + final int numTimepoints = sacAndNtime.getB(); - if (testData) { - final List> srcList = sourcesAndConverters.stream().map(sac -> sac.getSpimSource()).collect(Collectors.toList()); - assertTrue(String.format("%s data ", dataset), sourceDataIdentical(imp, srcList)); - } + 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(); }