package org.esa.snap.opendap.utils; import org.esa.snap.dataio.netcdf.util.NetcdfFileOpener; import org.esa.snap.opendap.ui.DownloadProgressBarPM; import org.esa.snap.util.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import ucar.nc2.Dimension; import ucar.nc2.NetcdfFile; import ucar.nc2.Variable; import ucar.nc2.dods.DODSNetcdfFile; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import static org.junit.Assert.*; public class DAPDownloaderTest { static final File TESTDATA_DIR = new File("target/dap_download_test"); @Before public void setUp() throws Exception { TESTDATA_DIR.mkdirs(); if (!TESTDATA_DIR.isDirectory()) { fail("Can't create test I/O directory: " + TESTDATA_DIR); } } @After public void tearDown() throws Exception { if (!FileUtils.deleteTree(TESTDATA_DIR)) { System.out.println("Warning: failed to completely delete test I/O directory:" + TESTDATA_DIR); } } @Test public void testDownloadFile() throws Exception { final Set<File> downloadedFiles = new HashSet<File>(); NullDownloadContext fileCountProvider = new NullDownloadContext() { @Override public void notifyFileDownloaded(File downloadedFile) { downloadedFiles.add(downloadedFile); } }; DAPDownloader dapDownloader = new DAPDownloader(new HashMap<String, Boolean>(), new ArrayList<String>(), fileCountProvider, new NullLabelledProgressBarPM()); String fileName = "fileToTextDownload.txt"; assertFalse(getTestFile(fileName).exists()); assertEquals(0, downloadedFiles.size()); URL resource = getClass().getResource(fileName); dapDownloader.downloadFile(TESTDATA_DIR, resource.toString()); assertEquals(1, downloadedFiles.size()); assertEquals(fileName, ((File) downloadedFiles.toArray()[0]).getName()); assertTrue(getTestFile(fileName).exists()); } @Test public void testGetVariableNames() throws Exception { List<String> variableNames = DAPDownloader.getVariableNames( "iop_a_total_443[0:1:717][0:1:308],iop_a_ys_443[0:1:717][0:1:308]"); String[] expected = {"iop_a_total_443", "iop_a_ys_443"}; assertArrayEquals(expected, variableNames.toArray(new String[variableNames.size()])); variableNames = DAPDownloader.getVariableNames(""); assertNull(variableNames); variableNames = DAPDownloader.getVariableNames(null); assertNull(variableNames); variableNames = DAPDownloader.getVariableNames("someUnconstrainedVariable"); expected = new String[]{"someUnconstrainedVariable"}; assertArrayEquals(expected, variableNames.toArray(new String[variableNames.size()])); variableNames = DAPDownloader.getVariableNames( "someUnconstrainedVariable,someConstrainedVariable[0:1:717][0:1:308]"); expected = new String[]{"someUnconstrainedVariable", "someConstrainedVariable"}; assertArrayEquals(expected, variableNames.toArray(new String[variableNames.size()])); } @Test public void testFilterVariables() throws Exception { final URL resource = getClass().getResource("test.nc"); final NetcdfFile netcdfFile = NetcdfFileOpener.open(resource.toString()); final List<Variable> variables = netcdfFile.getVariables(); final List<String> variableNames = new ArrayList<String>(); for (Variable variable : variables) { variableNames.add(variable.getFullName()); } String constraintExpression = null; List<String> filteredVariables = DAPDownloader.filterVariables(variableNames, constraintExpression); assertEquals(2, filteredVariables.size()); assertEquals("sst", filteredVariables.get(0)); assertEquals("wind", filteredVariables.get(1)); constraintExpression = "sst[0:1:10][0:1:10]"; filteredVariables = DAPDownloader.filterVariables(variableNames, constraintExpression); assertEquals(1, filteredVariables.size()); assertEquals("sst", filteredVariables.get(0)); constraintExpression = "bogusVariable[0:1:10][0:1:10]"; filteredVariables = DAPDownloader.filterVariables(variableNames, constraintExpression); assertEquals(2, filteredVariables.size()); assertEquals("sst", filteredVariables.get(0)); assertEquals("wind", filteredVariables.get(1)); constraintExpression = "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]"; filteredVariables = DAPDownloader.filterVariables(variableNames, constraintExpression); assertEquals(2, filteredVariables.size()); assertEquals("sst", filteredVariables.get(0)); assertEquals("wind", filteredVariables.get(1)); constraintExpression = "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10],sst"; filteredVariables = DAPDownloader.filterVariables(variableNames, constraintExpression); assertEquals(2, filteredVariables.size()); assertEquals("sst", filteredVariables.get(0)); assertEquals("wind", filteredVariables.get(1)); } @Test public void testFilterDimensions() throws Exception { final URL resource = getClass().getResource("test.nc"); final NetcdfFile netcdfFile = NetcdfFileOpener.open(resource.toString()); List<String> variableNames = new ArrayList<String>(); variableNames.add("sst"); variableNames.add("wind"); List<Dimension> dimensions = DAPDownloader.filterDimensions(variableNames, netcdfFile); Collections.sort(dimensions); assertEquals(3, dimensions.size()); assertEquals("COADSX", dimensions.get(0).getShortName()); assertEquals("COADSY", dimensions.get(1).getShortName()); assertEquals("TIME", dimensions.get(2).getShortName()); variableNames.clear(); variableNames.add("wind"); dimensions = DAPDownloader.filterDimensions(variableNames, netcdfFile); Collections.sort(dimensions); assertEquals(2, dimensions.size()); assertEquals("COADSX", dimensions.get(0).getShortName()); assertEquals("COADSY", dimensions.get(1).getShortName()); variableNames.clear(); variableNames.add("sst"); dimensions = DAPDownloader.filterDimensions(variableNames, netcdfFile); Collections.sort(dimensions); assertEquals("COADSX", dimensions.get(0).getShortName()); assertEquals("COADSY", dimensions.get(1).getShortName()); assertEquals("TIME", dimensions.get(2).getShortName()); } @Test public void testGetOrigin() throws Exception { int[] origin = DAPDownloader.getOrigin("sst", "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]", 3); assertArrayEquals(new int[]{0, 0, 0}, origin); origin = DAPDownloader.getOrigin("wind", "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]", 2); assertArrayEquals(new int[]{0, 0}, origin); origin = DAPDownloader.getOrigin("sst", "sst[5:1:10][10:1:10],wind[1:1:10][0:1:10]", 3); assertArrayEquals(new int[]{5, 10, 0}, origin); origin = DAPDownloader.getOrigin("sst", "", 3); assertArrayEquals(new int[]{0, 0, 0}, origin); } @Test public void testGetConstraintsExpressionForVariable() throws Exception { assertEquals("sst[0:1:10][0:1:10]", DAPDownloader.getConstraintExpression("sst", "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]")); assertEquals("wind[0:1:10][0:1:10]", DAPDownloader.getConstraintExpression("wind", "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]")); try { DAPDownloader.getConstraintExpression("pig_density", "sst[0:1:10][0:1:10],wind[0:1:10][0:1:10]"); fail(); } catch (IllegalArgumentException expected) { assertTrue(expected.getMessage().contains("must be included")); } assertEquals("sst[0:1:10]", DAPDownloader.getConstraintExpression("sst", "sst_flag[0:1:10][0:1:10],wind[0:1:10][0:1:10],sst[0:1:10]")); assertEquals("sst[0:1:10]", DAPDownloader.getConstraintExpression("sst", "flag_sst[0:1:10][0:1:10],wind[0:1:10][0:1:10],sst[0:1:10]")); } @Test public void testGetDownloadSpeed() { assertEquals(1024.0 / 60.0, DAPDownloader.getDownloadSpeed(60 * 1000, 1024), 1E-4); } @Ignore @Test public void testActualWriting() throws Exception { final DAPDownloader dapDownloader = new DAPDownloader(null, null, new NullDownloadContext(), new NullLabelledProgressBarPM()); final DODSNetcdfFile sourceNetcdfFile = new DODSNetcdfFile( "http://test.opendap.org:80/opendap/data/nc/coads_climatology.nc"); dapDownloader.writeNetcdfFile(TESTDATA_DIR, "deleteme.nc", "", sourceNetcdfFile, false); final File testFile = getTestFile("deleteme.nc"); assertTrue(testFile.exists()); assertTrue(NetcdfFile.canOpen(testFile.getAbsolutePath())); final NetcdfFile netcdfFile = NetcdfFileOpener.open(testFile.getAbsolutePath()); assertNotNull(netcdfFile.findVariable("SST")); } @Ignore @Test public void testActualWriting_WithConstraint() throws Exception { final DAPDownloader dapDownloader = new DAPDownloader(null, null, new NullDownloadContext(), new NullLabelledProgressBarPM()); final DODSNetcdfFile sourceNetcdfFile = new DODSNetcdfFile( "http://test.opendap.org:80/opendap/data/nc/coads_climatology.nc"); dapDownloader.writeNetcdfFile(TESTDATA_DIR, "deleteme.nc", "COADSX[0:1:4]", sourceNetcdfFile, false); final File testFile = getTestFile("deleteme.nc"); assertTrue(testFile.exists()); assertTrue(NetcdfFile.canOpen(testFile.getAbsolutePath())); final NetcdfFile netcdfFile = NetcdfFileOpener.open(testFile.getAbsolutePath()); assertNull(netcdfFile.findVariable("SST")); assertNotNull(netcdfFile.findVariable("COADSX")); } static File getTestFile(String fileName) { return new File(TESTDATA_DIR, fileName); } private static class NullLabelledProgressBarPM extends DownloadProgressBarPM { public NullLabelledProgressBarPM() { super(null, null, null, null); } @Override public void setPreMessage(String preMessageText) { } @Override public void setPostMessage(String postMessageText) { } @Override public int getTotalWork() { return 0; } @Override public int getCurrentWork() { return 0; } @Override public void setTooltip(String tooltip) { } @Override public void beginTask(String taskName, int totalWork) { } @Override public void done() { } @Override public void internalWorked(double work) { } @Override public boolean isCanceled() { return false; } @Override public void setCanceled(boolean canceled) { } @Override public void setTaskName(String taskName) { } @Override public void setSubTaskName(String subTaskName) { } @Override public void worked(int work) { } } private static class NullDownloadContext implements DAPDownloader.DownloadContext { @Override public int getAllFilesCount() { return 0; } @Override public int getAllDownloadedFilesCount() { return 0; } @Override public void notifyFileDownloaded(File downloadedFile) { } @Override public boolean mayOverwrite(String filename) { return true; } } }