package ucar.nc2.ncml;
import org.apache.commons.io.filefilter.NotFileFilter;
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.experimental.categories.Category;
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.category.NeedsCdmUnitTest;
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 TestNcmlWriteAndCompareLocal, except that we're using shared datasets.
*
* @author caron
* @since 11/2/13
*/
@RunWith(Parameterized.class)
@Category(NeedsCdmUnitTest.class)
public class TestNcmlWriteAndCompareShared {
@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() {
String datadir = TestDir.cdmUnitTestDir;
List<Object[]> result = new ArrayList<>(500);
//result.add(new Object[]{datadir + "formats/netcdf4/tst/test_enum_type.nc", false});
result.add(new Object[]{datadir + "conventions/atd-radar/rgg.20020411.000000.lel.ll.nc", false});
result.add(new Object[]{datadir + "conventions/atd-radar/SPOL_3Volumes.nc", false});
result.add(new Object[]{datadir + "conventions/awips/19981109_1200.nc", false});
result.add(new Object[]{datadir + "conventions/cf/ccsm2.nc", false}); //
result.add(new Object[]{datadir + "conventions/coards/cldc.mean.nc", false});
result.add(new Object[]{datadir + "conventions/csm/o3monthly.nc", false});
result.add(new Object[]{datadir + "conventions/gdv/OceanDJF.nc", false});
result.add(new Object[]{datadir + "conventions/gief/coamps.wind_uv.nc", false});
result.add(new Object[]{datadir + "conventions/mars/temp_air_01082000.nc", true});
result.add(new Object[]{datadir + "conventions/nuwg/eta.nc", false});
result.add(new Object[]{datadir + "conventions/nuwg/ocean.nc", true});
result.add(new Object[]{datadir + "conventions/wrf/wrfout_v2_Lambert.nc", false});
result.add(new Object[]{datadir + "formats/grib2/eta2.wmo", false}); //
result.add(new Object[]{datadir + "formats/grib2/ndfd.wmo", false}); //
result.add(new Object[]{datadir + "formats/gini/n0r_20041013_1852-compress", false}); //
result.add(new Object[]{datadir + "formats/gini/ntp_20041206_2154", true}); //
result.add(new Object[]{datadir + "formats/dmsp/F14200307192230.n.OIS", false}); //
result.add(new Object[]{datadir + "formats/nexrad/level2/6500KHGX20000610_000110", false});
result.add(new Object[]{datadir + "formats/nexrad/level2/Level2_KYUX_20060527_2335.ar2v", true});
// try everything from these directories
try {
addFromScan(result, TestDir.cdmUnitTestDir + "formats/netcdf4/", new NotFileFilter( new SuffixFileFilter(".cdl")), false);
} 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 TestNcmlWriteAndCompareShared(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();
}
}
}