package ucar.nc2.ncml; import org.apache.commons.io.filefilter.SuffixFileFilter; import org.junit.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import ucar.ma2.DataType; import ucar.nc2.Attribute; import ucar.nc2.NetcdfFile; import ucar.nc2.Variable; import ucar.nc2.constants.CDM; import ucar.nc2.dataset.NetcdfDataset; import ucar.nc2.iosp.netcdf4.Nc4; import ucar.nc2.jni.netcdf.Nc4Iosp; import ucar.nc2.util.CompareNetcdf2; import ucar.unidata.util.test.TestDir; import ucar.unidata.util.StringUtil2; import java.io.*; import java.util.ArrayList; import java.util.Formatter; import java.util.List; /** * TestWrite NcML, read back and compare with original. * * This is identical to TestNcmlWriteAndCompareShared, except that we're using local datasets. * * @author caron * @since 11/2/13 */ @RunWith(Parameterized.class) public class TestNcmlWriteAndCompareLocal { @Before public void setLibrary() { // Ignore this class's tests if NetCDF-4 isn't present. // We're using @Before because it shows these tests as being ignored. // @BeforeClass shows them as *non-existent*, which is not what we want. Assume.assumeTrue("NetCDF-4 C library not present.", Nc4Iosp.isClibraryPresent()); // make sure writeDirs exists File writeDir = new File(TestDir.temporaryLocalDataDir); writeDir.mkdirs(); } @Parameterized.Parameters(name="{0}") public static List<Object[]> getTestParameters() { List<Object[]> result = new ArrayList<>(500); // try everything from these directories try { addFromScan(result, TestDir.cdmLocalTestDataDir + "point/", new SuffixFileFilter(".ncml"), true); addFromScan(result, TestDir.cdmLocalTestDataDir + "ncml/standalone/", new SuffixFileFilter(".ncml"), true); } catch (IOException e) { e.printStackTrace(); } // */ return result; } // FIXME: This method sucks: it doesn't fail when dirName can't be read. static void addFromScan(final List<Object[]> list, String dirName, FileFilter ff, final boolean compareData) throws IOException { TestDir.actOnAll(dirName, ff, new TestDir.Act() { public int doAct(String filename) throws IOException { list.add(new Object[]{filename, compareData}); return 1; } }, true); } ///////////////////////////////////////////////////////////// boolean showFiles = true; boolean compareData = false; public TestNcmlWriteAndCompareLocal(String location, boolean compareData) { this.location = StringUtil2.replace(location, '\\', "/"); this.compareData = compareData; } String location; int fail = 0; int success = 0; @Test public void compareNcML() throws IOException { compareNcML(true, true, true); compareNcML(true, false, false); compareNcML(false, true, false); compareNcML(false, false, true); compareNcML(false, false, false); } public void compareNcML(boolean useRecords, boolean explicit, boolean openDataset) throws IOException { if (compareData) useRecords = false; if (showFiles) { System.out.println("-----------"); System.out.println(" input filename= " + location); } NetcdfFile org; if (openDataset) org = NetcdfDataset.openDataset(location, false, null); else org = NetcdfDataset.acquireFile(location, null); if (useRecords) org.sendIospMessage(NetcdfFile.IOSP_MESSAGE_ADD_RECORD_STRUCTURE); NcMLWriter writer = new NcMLWriter(); // create a file and write it out int pos = location.lastIndexOf("/"); String filenameTmp = location.substring(pos + 1); String ncmlOut = TestDir.temporaryLocalDataDir + filenameTmp + ".ncml"; if (showFiles) System.out.println(" output filename= " + ncmlOut); try { OutputStream out = new BufferedOutputStream(new FileOutputStream(ncmlOut, false)); if (explicit) writer.writeXMLexplicit(org, out, null); else writer.writeXML(org, out, null); out.close(); } catch (IOException ioe) { // ioe.printStackTrace(); assert false : ioe.getMessage(); } // read it back in NetcdfFile copy; if (openDataset) copy = NetcdfDataset.openDataset(ncmlOut, false, null); else copy = NetcdfDataset.acquireFile(ncmlOut, null); if (useRecords) copy.sendIospMessage(NetcdfFile.IOSP_MESSAGE_ADD_RECORD_STRUCTURE); try { Formatter f = new Formatter(); CompareNetcdf2 mind = new CompareNetcdf2(f, false, false, compareData); boolean ok = mind.compare(org, copy, new CompareNetcdf2.Netcdf4ObjectFilter(), false, false, compareData); if (!ok) { fail++; System.out.printf("--Compare %s, useRecords=%s explicit=%s openDataset=%s compareData=%s %n", location, useRecords, explicit, openDataset, compareData); System.out.printf(" %s%n", f); } else { System.out.printf("--Compare %s is OK (useRecords=%s explicit=%s openDataset=%s compareData=%s)%n", location, useRecords, explicit, openDataset, compareData); success++; } Assert.assertTrue(location, ok); } finally { org.close(); copy.close(); } } }