package org.geoserver.wcs.kvp;
import static org.geoserver.data.test.MockData.TASMANIA_BM;
import static org.vfny.geoserver.wcs.WcsException.WcsExceptionCode.InvalidParameterValue;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Test;
import net.opengis.wcs11.AxisSubsetType;
import net.opengis.wcs11.FieldSubsetType;
import net.opengis.wcs11.GetCoverageType;
import net.opengis.wcs11.RangeSubsetType;
import org.geoserver.catalog.Catalog;
import org.geoserver.wcs.test.WCSTestSupport;
import org.vfny.geoserver.wcs.WcsException;
public class GetCoverageReaderTest extends WCSTestSupport {
static GetCoverageRequestReader reader;
/**
* This is a READ ONLY TEST so we can use one time setup
*/
public static Test suite() {
return new OneTimeTestSetup(new GetCoverageReaderTest());
}
@Override
protected void oneTimeSetUp() throws Exception {
super.oneTimeSetUp();
Catalog catalog = (Catalog) applicationContext.getBean("catalog");
reader = new GetCoverageRequestReader(catalog);
}
// protected String getDefaultLogConfiguration() {
// return "/DEFAULT_LOGGING.properties";
// }
Map<String, Object> baseMap() {
Map<String, Object> raw = new HashMap<String, Object>();
raw.put("service", "WCS");
raw.put("version", "1.1.1");
raw.put("request", "GetCoverage");
return raw;
}
public void testMissingParams() throws Exception {
Map<String, Object> raw = baseMap();
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("Hey, format is missing, this should have failed");
} catch (WcsException e) {
assertEquals("MissingParameterValue", e.getCode());
}
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("Hey, format is missing, this should have failed");
} catch (WcsException e) {
assertEquals("MissingParameterValue", e.getCode());
}
raw.put("format", "image/tiff");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("Hey, boundingBox is missing, this should have failed");
} catch (WcsException e) {
assertEquals("MissingParameterValue", e.getCode());
}
raw.put("BoundingBox", "-45,146,-42,147");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
} catch (WcsException e) {
fail("This time all mandatory params where provided?");
assertEquals("MissingParameterValue", e.getCode());
}
}
public void testUnknownCoverageParams() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = "fairyTales:rumpelstilskin";
raw.put("identifier", layerId);
raw.put("format", "SuperCoolFormat");
raw.put("BoundingBox", "-45,146,-42,147");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("That coverage is not registered???");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.toString(), e.getCode());
assertEquals("identifier", e.getLocator());
}
}
public void testBasic() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
raw.put("store", "false");
raw.put("GridBaseCRS", "urn:ogc:def:crs:EPSG:6.6:4326");
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(),
parseKvp(raw), raw);
assertEquals(layerId, getCoverage.getIdentifier().getValue());
assertEquals("image/tiff", getCoverage.getOutput().getFormat());
assertFalse(getCoverage.getOutput().isStore());
assertEquals("urn:ogc:def:crs:EPSG:6.6:4326", getCoverage.getOutput().getGridCRS()
.getGridBaseCRS());
}
public void testUnsupportedCRS() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("GridBaseCRS", "urn:ogc:def:crs:EPSG:6.6:-1000");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals("GridBaseCRS", e.getLocator());
assertEquals("InvalidParameterValue", e.getCode());
}
}
public void testGridTypes() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
raw.put("gridType", GridType.GT2dGridIn2dCrs.getXmlConstant());
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(),
parseKvp(raw), raw);
assertEquals(GridType.GT2dGridIn2dCrs.getXmlConstant(), getCoverage.getOutput()
.getGridCRS().getGridType());
raw.put("gridType", GridType.GT2dSimpleGrid.getXmlConstant());
getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
assertEquals(GridType.GT2dSimpleGrid.getXmlConstant(), getCoverage.getOutput().getGridCRS()
.getGridType());
// try with different case
raw.put("gridType", GridType.GT2dSimpleGrid.getXmlConstant().toUpperCase());
getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
assertEquals(GridType.GT2dSimpleGrid.getXmlConstant(), getCoverage.getOutput().getGridCRS()
.getGridType());
raw.put("gridType", GridType.GT2dGridIn3dCrs.getXmlConstant());
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridType", e.getLocator());
}
raw.put("gridType", "Hoolabaloola");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridType", e.getLocator());
}
}
public void testGridCS() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
raw.put("GridCS", GridCS.GCSGrid2dSquare.getXmlConstant());
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(),
parseKvp(raw), raw);
assertEquals(GridCS.GCSGrid2dSquare.getXmlConstant(), getCoverage.getOutput().getGridCRS()
.getGridCS());
raw.put("GridCS", GridCS.GCSGrid2dSquare.getXmlConstant().toUpperCase());
getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
assertEquals(GridCS.GCSGrid2dSquare.getXmlConstant(), getCoverage.getOutput().getGridCRS()
.getGridCS());
raw.put("GridCS", "Hoolabaloola");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridCS", e.getLocator());
}
}
public void testGridOrigin() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
raw.put("GridOrigin", "10.5,-30.2");
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
Double[] origin = (Double[]) getCoverage.getOutput().getGridCRS().getGridOrigin();
assertEquals(2, origin.length);
assertEquals(10.5, origin[0]);
assertEquals(-30.2, origin[1]);
raw.put("GridOrigin", "12");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridOrigin", e.getLocator());
}
raw.put("GridOrigin", "12,a");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridOrigin", e.getLocator());
}
}
public void testGridOffsets() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
raw.put("GridOffsets", "10.5,-30.2");
raw.put("GridType", GridType.GT2dSimpleGrid.getXmlConstant());
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
Double[] offsets = (Double[]) getCoverage.getOutput().getGridCRS().getGridOffsets();
assertEquals(2, offsets.length);
assertEquals(10.5, offsets[0]);
assertEquals(-30.2, offsets[1]);
raw.put("GridOffsets", "12");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridOffsets", e.getLocator());
}
raw.put("GridOffsets", "12,a");
try {
reader.read(reader.createRequest(), parseKvp(raw), raw);
fail("We should have had a WcsException here?");
} catch (WcsException e) {
assertEquals(InvalidParameterValue.name(), e.getCode());
assertEquals("GridOffsets", e.getLocator());
}
}
/**
* Tests valid range subset expressions, but with a mix of valid and invalid identifiers
* @throws Exception
*/
public void testRangeSubset() throws Exception {
Map<String, Object> raw = baseMap();
final String layerId = getLayerId(TASMANIA_BM);
raw.put("identifier", layerId);
raw.put("format", "image/tiff");
raw.put("BoundingBox", "-45,146,-42,147");
// ok, finally something we can parse
raw.put("rangeSubset", "BlueMarble:nearest[Bands[Red_band]]");
GetCoverageType getCoverage = (GetCoverageType) reader.read(reader.createRequest(), parseKvp(raw), raw);
RangeSubsetType rs = getCoverage.getRangeSubset();
assertNotNull(rs);
assertEquals(1, rs.getFieldSubset().size());
FieldSubsetType field = (FieldSubsetType) rs.getFieldSubset().get(0);
assertEquals("BlueMarble", field.getIdentifier().getValue());
assertEquals(1, field.getAxisSubset().size());
AxisSubsetType axis = (AxisSubsetType) field.getAxisSubset().get(0);
assertEquals("Bands", axis.getIdentifier());
List keys = axis.getKey();
assertEquals(1, keys.size());
assertEquals("Red_band", keys.get(0));
}
}