package org.geoserver.wcs2_0.kvp; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.custommonkey.xmlunit.exceptions.XpathException; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.DimensionPresentation; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.impl.CoverageDimensionImpl; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.wcs2_0.WCSTestSupport; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.springframework.mock.web.MockHttpServletResponse; public class DescribeCoverageTest extends WCSTestSupport { protected final static String DESCRIBE_URL = "wcs?service=WCS&version="+VERSION+"&request=DescribeCoverage"; private static final QName MOSAIC = new QName(MockData.SF_URI, "rasterFilter", MockData.SF_PREFIX); private static final QName RAIN = new QName(MockData.SF_URI, "rain", MockData.SF_PREFIX); protected static QName WATTEMP = new QName(MockData.SF_URI, "watertemp", MockData.SF_PREFIX); protected static QName TIMERANGES = new QName(MockData.SF_URI, "timeranges", MockData.SF_PREFIX); protected static QName MULTIDIM = new QName(MockData.SF_URI, "multidim", MockData.SF_PREFIX); protected static QName PK50095 = new QName(MockData.SF_URI, "pk50095", MockData.SF_PREFIX); @Before public void clearDimensions() { clearDimensions(getLayerId(WATTEMP)); clearDimensions(getLayerId(TIMERANGES)); clearDimensions(getLayerId(MULTIDIM)); } @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); testData.addRasterLayer(MOSAIC, "raster-filter-test.zip", null, getCatalog()); testData.addRasterLayer(RAIN, "rain.zip", "asc", getCatalog()); testData.addRasterLayer(WATTEMP, "watertemp.zip", null, null, SystemTestData.class, getCatalog()); testData.addRasterLayer(TIMERANGES, "timeranges.zip", null, null, SystemTestData.class, getCatalog()); testData.addRasterLayer(MULTIDIM, "multidim.zip", null, null, SystemTestData.class, getCatalog()); testData.addRasterLayer(PK50095, "wi-utm.zip", null, null, SystemTestData.class, getCatalog()); } @Test public void testBasicKVP() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=wcs__BlueMarble"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testProjectectedKVP() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=wcs__utm11"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("E N", "//gml:boundedBy/gml:Envelope/@axisLabels", dom); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testCustomUnit() throws Exception { CoverageInfo ciRain = getCatalog().getCoverageByName(getLayerId(RAIN)); ciRain.getDimensions().get(0).setUnit("mm"); getCatalog().save(ciRain); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__rain"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription/gmlcov:rangeType/swe:DataRecord/swe:field)", dom); assertXpathEvaluatesTo("rain", "//wcs:CoverageDescription/gmlcov:rangeType//swe:DataRecord/swe:field/@name", dom); assertXpathEvaluatesTo("mm", "//wcs:CoverageDescription/gmlcov:rangeType/swe:DataRecord/swe:field/swe:Quantity/swe:uom/@code", dom); assertXpathEvaluatesTo("text/plain", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testAxisOrderUtm() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__pk50095"); assertNotNull(dom); print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("347660.5162105911 5191763.949937257", "//gml:boundedBy/gml:Envelope/gml:lowerCorner", dom); assertXpathEvaluatesTo("353440.1129425911 5196950.767517257", "//gml:boundedBy/gml:Envelope/gml:upperCorner", dom); assertXpathEvaluatesTo("+1 +2", "//gml:coverageFunction/gml:GridFunction/gml:sequenceRule/@axisOrder", dom); assertXpathEvaluatesTo("347671.1015525911 5196940.182175256", "//gml:domainSet/gml:RectifiedGrid/gml:origin/gml:Point/gml:pos", dom); } @Test public void testCustomNullValue() throws Exception { CoverageInfo ciRain = getCatalog().getCoverageByName(getLayerId(RAIN)); CoverageDimensionImpl dimension = (CoverageDimensionImpl) ciRain.getDimensions().get(0); List<Double> nullValues = new ArrayList<Double>(); nullValues.add(-999.9); dimension.setNullValues(nullValues); getCatalog().save(ciRain); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__rain"); assertNotNull(dom); print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription/gmlcov:rangeType/swe:DataRecord/swe:field)", dom); assertXpathEvaluatesTo("rain", "//wcs:CoverageDescription/gmlcov:rangeType//swe:DataRecord/swe:field/@name", dom); assertXpathEvaluatesTo("-999.9", "//wcs:CoverageDescription/gmlcov:rangeType/swe:DataRecord/swe:field/swe:Quantity/swe:nilValues/swe:NilValues/swe:nilValue", dom); } @Test public void testMultiBandKVP() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=wcs__multiband"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultiBandKVPNoWs() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=multiband"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultiBandKVPLocalWs() throws Exception { Document dom = getAsDOM("wcs/" + DESCRIBE_URL + "&coverageId=multiband"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultipleCoverages() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=wcs__multiband,wcs__BlueMarble"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("2", "count(//wcs:CoverageDescription)", dom); assertXpathEvaluatesTo("wcs__multiband", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]/@gml:id", dom); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription[1]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); assertXpathEvaluatesTo("wcs__BlueMarble", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]/@gml:id", dom); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription[2]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultipleCoveragesNoWs() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=multiband,wcs__BlueMarble"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("2", "count(//wcs:CoverageDescription)", dom); assertXpathEvaluatesTo("wcs__multiband", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]/@gml:id", dom); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription[1]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); assertXpathEvaluatesTo("wcs__BlueMarble", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]/@gml:id", dom); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription[2]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultipleCoveragesLocalWs() throws Exception { Document dom = getAsDOM("wcs/" + DESCRIBE_URL + "&coverageId=multiband,BlueMarble"); assertNotNull(dom); // print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("2", "count(//wcs:CoverageDescription)", dom); assertXpathEvaluatesTo("wcs__multiband", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]/@gml:id", dom); assertXpathEvaluatesTo("9", "count(//wcs:CoverageDescription[1]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); assertXpathEvaluatesTo("wcs__BlueMarble", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]/@gml:id", dom); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription[2]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[2]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testMultipleCoveragesOneNotExists() throws Exception { MockHttpServletResponse response = getAsServletResponse(DESCRIBE_URL + "&coverageId=wcs__multiband,wcs__IAmNotThere"); checkOws20Exception(response, 404, "NoSuchCoverage", "coverageId"); } @Test public void testNativeFormatMosaic() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__rasterFilter"); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription)", dom); assertXpathEvaluatesTo("sf__rasterFilter", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]/@gml:id", dom); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription[1]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void gridCellCenterEnforce() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=wcs__BlueMarble"); assertNotNull(dom); print(dom, System.out); checkValidationErrors(dom, WCS20_SCHEMA); assertXpathEvaluatesTo("3", "count(//wcs:CoverageDescription//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("image/tiff", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); // enforce pixel center assertXpathEvaluatesTo("-43.0020833333312 146.5020833333281", "//wcs:CoverageDescriptions//wcs:CoverageDescription[1]//gml:domainSet//gml:RectifiedGrid//gml:origin//gml:Point//gml:pos", dom); } @Test public void testNativeFormatArcGrid() throws Exception { Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__rain"); // print(dom); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription)", dom); assertXpathEvaluatesTo("sf__rain", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]/@gml:id", dom); assertXpathEvaluatesTo("1", "count(//wcs:CoverageDescription[1]//gmlcov:rangeType//swe:DataRecord//swe:field)", dom); assertXpathEvaluatesTo("text/plain", "//wcs:CoverageDescriptions/wcs:CoverageDescription[1]//wcs:ServiceParameters//wcs:nativeFormat", dom); } @Test public void testDescribeTimeList() throws Exception { setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.TIME, DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__watertemp"); // print(dom); checkWaterTempTimeEnvelope(dom); // check that metadata contains a list of times assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant)", dom); assertXpathEvaluatesTo("sf__watertemp_td_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[1]/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[1]/gml:timePosition", dom); assertXpathEvaluatesTo("sf__watertemp_td_1", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[2]/@gml:id", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[2]/gml:timePosition", dom); } @Test public void testDescribeTimeContinousInterval() throws Exception { setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.TIME, DimensionPresentation.CONTINUOUS_INTERVAL, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__watertemp"); // print(dom); checkWaterTempTimeEnvelope(dom); // check that metadata contains a list of times assertXpathEvaluatesTo("1", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod)", dom); assertXpathEvaluatesTo("sf__watertemp_tp_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:endPosition", dom); assertXpathEvaluatesTo("0", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:TimeInterval)", dom); } @Test public void testDescribeTimeDiscreteInterval() throws Exception { setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.TIME, DimensionPresentation.DISCRETE_INTERVAL, 1000 * 60 * 60 * 24d); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__watertemp"); // print(dom); checkWaterTempTimeEnvelope(dom); // check that metadata contains a list of times assertXpathEvaluatesTo("1", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod)", dom); assertXpathEvaluatesTo("sf__watertemp_tp_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:endPosition", dom); assertXpathEvaluatesTo("1", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:TimeInterval", dom); assertXpathEvaluatesTo("day", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod/gml:TimeInterval/@unit", dom); } @Test public void testDescribeTimeRangeList() throws Exception { setupRasterDimension(getLayerId(TIMERANGES), ResourceInfo.TIME, DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__timeranges"); // print(dom); // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long time", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg s", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-07T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:endPosition", dom); // check that metadata contains a list of times assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod)", dom); assertXpathEvaluatesTo("sf__timeranges_td_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-04T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/gml:endPosition", dom); assertXpathEvaluatesTo("sf__timeranges_td_1", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/@gml:id", dom); assertXpathEvaluatesTo("2008-11-05T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-07T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/gml:endPosition", dom); } @Test public void testDescribeElevationDiscreteInterval() throws Exception { setupRasterDimension(getLayerId(TIMERANGES), ResourceInfo.ELEVATION, DimensionPresentation.DISCRETE_INTERVAL, 50d, "m"); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__timeranges"); // print(dom); checkElevationRangesEnvelope(dom); // check that metadata contains a list of elevations assertXpathEvaluatesTo("1", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range)", dom); assertXpathEvaluatesTo("20.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:start", dom); assertXpathEvaluatesTo("150.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:end", dom); assertXpathEvaluatesTo("50.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:Interval", dom); assertXpathEvaluatesTo("m", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:Interval/@unit", dom); } @Test public void testDescribeElevationContinuousInterval() throws Exception { setupRasterDimension(getLayerId(TIMERANGES), ResourceInfo.ELEVATION, DimensionPresentation.CONTINUOUS_INTERVAL, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__timeranges"); // print(dom); checkElevationRangesEnvelope(dom); // check that metadata contains elevation range assertXpathEvaluatesTo("1", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range)", dom); assertXpathEvaluatesTo("20.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:start", dom); assertXpathEvaluatesTo("150.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range/wcsgs:end", dom); } @Test public void testDescribeElevationValuesList() throws Exception { setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__watertemp"); // print(dom); checkWaterTempElevationEnvelope(dom); // check that metadata contains a list of elevations assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue)", dom); assertXpathEvaluatesTo("0.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue[1]", dom); assertXpathEvaluatesTo("100.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue[2]", dom); } @Test public void testDescribeElevationRangeList() throws Exception { setupRasterDimension(getLayerId(TIMERANGES), ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__timeranges"); // print(dom); checkElevationRangesEnvelope(dom); // check that metadata contains a list of elevations assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range)", dom); assertXpathEvaluatesTo("20.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[1]/wcsgs:start", dom); assertXpathEvaluatesTo("99.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[1]/wcsgs:end", dom); assertXpathEvaluatesTo("100.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[2]/wcsgs:start", dom); assertXpathEvaluatesTo("150.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[2]/wcsgs:end", dom); } @Test public void testDescribeTimeElevationList() throws Exception { setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.TIME, DimensionPresentation.LIST, null); setupRasterDimension(getLayerId(WATTEMP), ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__watertemp"); // print(dom); checkWaterTempTimeElevationEnvelope(dom); // check that metadata contains a list of times assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant)", dom); assertXpathEvaluatesTo("sf__watertemp_td_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[1]/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[1]/gml:timePosition", dom); assertXpathEvaluatesTo("sf__watertemp_td_1", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[2]/@gml:id", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimeInstant[2]/gml:timePosition", dom); // check that metadata contains a list of elevations assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue)", dom); assertXpathEvaluatesTo("0.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue[1]", dom); assertXpathEvaluatesTo("100.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:SingleValue[2]", dom); } @Test public void testDescribeCustomDimensionsList() throws Exception { setupRasterDimension(getLayerId(MULTIDIM), ResourceInfo.TIME, DimensionPresentation.LIST, null); setupRasterDimension(getLayerId(MULTIDIM), ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); setupRasterDimension(getLayerId(MULTIDIM), ResourceInfo.CUSTOM_DIMENSION_PREFIX + "WAVELENGTH", DimensionPresentation.LIST, null); setupRasterDimension(getLayerId(MULTIDIM), ResourceInfo.CUSTOM_DIMENSION_PREFIX + "DATE", DimensionPresentation.LIST, null); Document dom = getAsDOM(DESCRIBE_URL + "&coverageId=sf__multidim"); // print(dom); checkTimeElevationRangesEnvelope(dom); // check that metadata contains a list of times assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod)", dom); assertXpathEvaluatesTo("sf__multidim_td_0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/@gml:id", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-04T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[1]/gml:endPosition", dom); assertXpathEvaluatesTo("sf__multidim_td_1", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/@gml:id", dom); assertXpathEvaluatesTo("2008-11-05T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-07T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:TimeDomain/gml:TimePeriod[2]/gml:endPosition", dom); assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range)", dom); assertXpathEvaluatesTo("20.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[1]/wcsgs:start", dom); assertXpathEvaluatesTo("99.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[1]/wcsgs:end", dom); assertXpathEvaluatesTo("100.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[2]/wcsgs:start", dom); assertXpathEvaluatesTo("150.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:ElevationDomain/wcsgs:Range[2]/wcsgs:end", dom); // check the additional domains assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain)", dom); // Check the date domain assertXpathEvaluatesTo("DATE", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/@name", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/@default", dom); assertXpathEvaluatesTo("3", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/gml:TimeInstant)", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/gml:TimeInstant[1]/gml:timePosition", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/gml:TimeInstant[2]/gml:timePosition", dom); assertXpathEvaluatesTo("2008-11-05T00:00:00.000Z", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[1]/gml:TimeInstant[3]/gml:timePosition", dom); // check the waveLength range domain assertXpathEvaluatesTo("WAVELENGTH", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/@name", dom); assertXpathEvaluatesTo("12", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/@default", dom); assertXpathEvaluatesTo("2", "count(//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/wcsgs:Range)", dom); assertXpathEvaluatesTo("12.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/wcsgs:Range[1]/wcsgs:start", dom); assertXpathEvaluatesTo("24.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/wcsgs:Range[1]/wcsgs:end", dom); assertXpathEvaluatesTo("25.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/wcsgs:Range[2]/wcsgs:start", dom); assertXpathEvaluatesTo("80.0", "//gmlcov:metadata/gmlcov:Extension/wcsgs:DimensionDomain[2]/wcsgs:Range[2]/wcsgs:end", dom); } private void checkWaterTempTimeEnvelope(Document dom) throws XpathException { // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long time", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg s", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:endPosition", dom); } private void checkWaterTempTimeElevationEnvelope(Document dom) throws XpathException { // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long elevation time", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg m s", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("3", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsDimension", dom); assertXpathEvaluatesTo("40.562080748421806 0.23722068851276978 0.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:lowerCorner", dom); assertXpathEvaluatesTo("44.55808294568743 14.592757149389236 100.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:upperCorner", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-01T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:endPosition", dom); } private void checkWaterTempElevationEnvelope(Document dom) throws XpathException { // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long elevation", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg m", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("3", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsDimension", dom); assertXpathEvaluatesTo("40.562080748421806 0.23722068851276978 0.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:lowerCorner", dom); assertXpathEvaluatesTo("44.55808294568743 14.592757149389236 100.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:upperCorner", dom); } private void checkElevationRangesEnvelope(Document dom) throws XpathException { // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long elevation", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg m", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("3", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsDimension", dom); assertXpathEvaluatesTo("40.562080748421806 0.23722068851276978 20.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:lowerCorner", dom); assertXpathEvaluatesTo("44.55808294568743 14.592757149389236 150.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:upperCorner", dom); } private void checkTimeElevationRangesEnvelope(Document dom) throws XpathException { // check the envelope with time assertXpathEvaluatesTo("1", "count(//gml:boundedBy/gml:EnvelopeWithTimePeriod)", dom); assertXpathEvaluatesTo("Lat Long elevation time", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@axisLabels", dom); assertXpathEvaluatesTo("Deg Deg m s", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@uomLabels", dom); assertXpathEvaluatesTo("3", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/@srsDimension", dom); assertXpathEvaluatesTo("40.562080748421806 0.23722068851276978 20.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:lowerCorner", dom); assertXpathEvaluatesTo("44.55808294568743 14.592757149389236 150.0", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:upperCorner", dom); assertXpathEvaluatesTo("2008-10-31T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:beginPosition", dom); assertXpathEvaluatesTo("2008-11-07T00:00:00.000Z", "//gml:boundedBy/gml:EnvelopeWithTimePeriod/gml:endPosition", dom); } }