/* Copyright (c) 2001 - 2010 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.wms_1_3;
import static org.custommonkey.xmlunit.XMLAssert.*;
import static org.custommonkey.xmlunit.XMLUnit.newXpathEngine;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import junit.framework.Test;
import org.custommonkey.xmlunit.NamespaceContext;
import org.custommonkey.xmlunit.SimpleNamespaceContext;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.XpathEngine;
import org.geoserver.catalog.AttributionInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.Keyword;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.config.ContactInfo;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.data.test.MockData;
import org.geoserver.wms.WMSInfo;
import org.geoserver.wms.WMSTestSupport;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* WMS 1.3 GetCapabilities integration tests
*
* <p>
* These tests are initialy ported from the 1.1.1 capabilities integration tests
* </p>
*
* @author Gabriel Roldan
*
*/
public class CapabilitiesIntegrationTest extends WMSTestSupport {
public CapabilitiesIntegrationTest() {
super();
}
/**
* This is a READ ONLY TEST so we can use one time setup
*/
public static Test suite() {
return new OneTimeTestSetup(new CapabilitiesIntegrationTest());
}
@Override
protected void oneTimeSetUp() throws Exception {
super.oneTimeSetUp();
GeoServerInfo global = getGeoServer().getGlobal();
global.setProxyBaseUrl("src/test/resources/geoserver");
getGeoServer().save(global);
}
@Override
protected void registerNamespaces(Map<String, String> namespaces) {
namespaces.put("wms", "http://www.opengis.net/wms");
namespaces.put("ows", "http://www.opengis.net/ows");
}
@Override
protected void populateDataDirectory(MockData dataDirectory) throws Exception {
super.populateDataDirectory(dataDirectory);
dataDirectory.addWcs11Coverages();
dataDirectory.disableDataStore(MockData.SF_PREFIX);
}
public void testCapabilities() throws Exception {
Document dom = dom(get("wms?request=getCapabilities&version=1.3.0"), false);
Element e = dom.getDocumentElement();
assertEquals("WMS_Capabilities", e.getLocalName());
}
public void testGetCapsContainsNoDisabledTypes() throws Exception {
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
// print(doc);
assertEquals("WMS_Capabilities", doc.getDocumentElement().getNodeName());
// see that disabled elements are disabled for good
assertXpathEvaluatesTo("0", "count(//Name[text()='sf:PrimitiveGeoFeature'])", doc);
}
public void testFilteredCapabilitiesCite() throws Exception {
Document dom = dom(get("wms?request=getCapabilities&version=1.3.0&namespace=cite"), true);
Element e = dom.getDocumentElement();
assertEquals("WMS_Capabilities", e.getLocalName());
XpathEngine xpath = XMLUnit.newXpathEngine();
assertTrue(xpath.getMatchingNodes("//wms:Layer/wms:Name[starts-with(., cite)]", dom)
.getLength() > 0);
assertEquals(0,
xpath.getMatchingNodes("//wms:Layer/wms:Name[not(starts-with(., cite))]", dom)
.getLength());
}
public void testLayerCount() throws Exception {
List<LayerInfo> layers = new ArrayList<LayerInfo>(getCatalog().getLayers());
for (ListIterator<LayerInfo> it = layers.listIterator(); it.hasNext();) {
LayerInfo next = it.next();
if (!next.enabled() || next.getName().equals(MockData.GEOMETRYLESS.getLocalPart())) {
it.remove();
}
}
List<LayerGroupInfo> groups = getCatalog().getLayerGroups();
Document dom = dom(get("wms?request=GetCapabilities&version=1.3.0"), true);
XpathEngine xpath = XMLUnit.newXpathEngine();
NodeList nodeLayers = xpath.getMatchingNodes(
"/wms:WMS_Capabilities/wms:Capability/wms:Layer/wms:Layer", dom);
assertEquals(layers.size() + groups.size(), nodeLayers.getLength());
}
public void testWorkspaceQualified() throws Exception {
Document dom = dom(get("cite/wms?request=getCapabilities&version=1.3.0"), true);
Element e = dom.getDocumentElement();
assertEquals("WMS_Capabilities", e.getLocalName());
XpathEngine xpath = XMLUnit.newXpathEngine();
assertTrue(xpath.getMatchingNodes("//wms:Layer/wms:Name[starts-with(., cite)]", dom)
.getLength() > 0);
assertEquals(0,
xpath.getMatchingNodes("//wms:Layer/wms:Name[not(starts-with(., cite))]", dom)
.getLength());
NodeList nodes = xpath.getMatchingNodes("//wms:Layer//wms:OnlineResource", dom);
assertTrue(nodes.getLength() > 0);
for (int i = 0; i < nodes.getLength(); i++) {
e = (Element) nodes.item(i);
String attribute = e.getAttribute("xlink:href");
assertTrue(attribute.contains("geoserver/cite/ows"));
}
}
public void testLayerQualified() throws Exception {
Document dom = dom(get("cite/Forests/wms?request=getCapabilities&version=1.3.0"), true);
Element e = dom.getDocumentElement();
assertEquals("WMS_Capabilities", e.getLocalName());
XpathEngine xpath = XMLUnit.newXpathEngine();
assertTrue(xpath
.getMatchingNodes("//wms:Layer/wms:Name[starts-with(., cite:Forests)]", dom)
.getLength() == 1);
assertEquals(1, xpath.getMatchingNodes("//wms:Layer/wms:Layer", dom).getLength());
NodeList nodes = xpath.getMatchingNodes("//wms:Layer//wms:OnlineResource", dom);
assertTrue(nodes.getLength() > 0);
for (int i = 0; i < nodes.getLength(); i++) {
e = (Element) nodes.item(i);
String attribute = e.getAttribute("xlink:href");
assertTrue(attribute.contains("geoserver/cite/Forests/ows"));
}
}
public void testAttribution() throws Exception {
// Uncomment the following lines if you want to use DTD validation for these tests
// (by passing false as the second param to getAsDOM())
// BUG: Currently, this doesn't seem to actually validate the document, although
// 'validation' fails if the DTD is missing
// GeoServerInfo global = getGeoServer().getGlobal();
// global.setProxyBaseUrl("src/test/resources/geoserver");
// getGeoServer().save(global);
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
assertXpathEvaluatesTo("0", "count(//wms:Attribution)", doc);
// Add attribution to one of the layers
LayerInfo points = getCatalog().getLayerByName(MockData.POINTS.getLocalPart());
AttributionInfo attr = points.getAttribution();
attr.setTitle("Point Provider");
getCatalog().save(points);
doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
assertXpathEvaluatesTo("1", "count(//wms:Attribution)", doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution/wms:Title)", doc);
// Add href to same layer
attr = points.getAttribution();
attr.setHref("http://example.com/points/provider");
getCatalog().save(points);
doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
// print(doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution)", doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution/wms:Title)", doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution/wms:OnlineResource)", doc);
// Add logo to same layer
attr = points.getAttribution();
attr.setLogoURL("http://example.com/points/logo");
attr.setLogoType("image/logo");
attr.setLogoHeight(50);
attr.setLogoWidth(50);
getCatalog().save(points);
doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
// print(doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution)", doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution/wms:Title)", doc);
assertXpathEvaluatesTo("1", "count(//wms:Attribution/wms:LogoURL)", doc);
}
public void testAlternateStyles() throws Exception {
// add an alternate style to Fifteen
StyleInfo pointStyle = getCatalog().getStyleByName("point");
LayerInfo layer = getCatalog().getLayerByName("Fifteen");
layer.getStyles().add(pointStyle);
getCatalog().save(layer);
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
// print(doc);
assertXpathEvaluatesTo("1", "count(//wms:Layer[wms:Name='cdf:Fifteen'])", doc);
assertXpathEvaluatesTo("2", "count(//wms:Layer[wms:Name='cdf:Fifteen']/wms:Style)", doc);
XpathEngine xpath = newXpathEngine();
String href = xpath
.evaluate(
"//wms:Layer[wms:Name='cdf:Fifteen']/wms:Style[wms:Name='Default']/wms:LegendURL/wms:OnlineResource/@xlink:href",
doc);
assertTrue(href.contains("GetLegendGraphic"));
assertTrue(href.contains("layer=Fifteen"));
assertFalse(href.contains("style"));
href = xpath
.evaluate(
"//wms:Layer[wms:Name='cdf:Fifteen']/wms:Style[wms:Name='point']/wms:LegendURL/wms:OnlineResource/@xlink:href",
doc);
assertTrue(href.contains("GetLegendGraphic"));
assertTrue(href.contains("layer=Fifteen"));
assertTrue(href.contains("style=point"));
}
public void testServiceMetadata() throws Exception {
final WMSInfo service = getGeoServer().getService(WMSInfo.class);
service.setTitle("test title");
service.setAbstract("test abstract");
service.setAccessConstraints("test accessConstraints");
service.setFees("test fees");
service.getKeywords().clear();
service.getKeywords().add(new Keyword("test keyword 1"));
service.getKeywords().add(new Keyword("test keyword 2"));
service.setMaintainer("test maintainer");
service.setOnlineResource("http://example.com/geoserver");
GeoServerInfo global = getGeoServer().getGlobal();
ContactInfo contact = global.getContact();
contact.setAddress("__address");
contact.setAddressCity("__city");
contact.setAddressCountry("__country");
contact.setAddressPostalCode("__ZIP");
contact.setAddressState("__state");
contact.setAddressType("__type");
contact.setContactEmail("e@mail");
contact.setContactOrganization("__org");
contact.setContactFacsimile("__fax");
contact.setContactPerson("__me");
contact.setContactPosition("__position");
contact.setContactVoice("__phone");
getGeoServer().save(global);
getGeoServer().save(service);
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
//print(doc);
String base = "wms:WMS_Capabilities/wms:Service/";
assertXpathEvaluatesTo("WMS", base + "wms:Name", doc);
assertXpathEvaluatesTo("test title", base + "wms:Title", doc);
assertXpathEvaluatesTo("test abstract", base + "wms:Abstract", doc);
assertXpathEvaluatesTo("test keyword 1", base + "wms:KeywordList/wms:Keyword[1]", doc);
assertXpathEvaluatesTo("test keyword 2", base + "wms:KeywordList/wms:Keyword[2]", doc);
assertXpathEvaluatesTo("http://example.com/geoserver", base + "wms:OnlineResource/@xlink:href", doc);
String cinfo = base + "wms:ContactInformation/";
assertXpathEvaluatesTo("__me", cinfo + "wms:ContactPersonPrimary/wms:ContactPerson", doc);
assertXpathEvaluatesTo("__org", cinfo + "wms:ContactPersonPrimary/wms:ContactOrganization", doc);
assertXpathEvaluatesTo("__position", cinfo + "wms:ContactPosition", doc);
assertXpathEvaluatesTo("__type", cinfo + "wms:ContactAddress/wms:AddressType", doc);
assertXpathEvaluatesTo("__address", cinfo + "wms:ContactAddress/wms:Address", doc);
assertXpathEvaluatesTo("__city", cinfo + "wms:ContactAddress/wms:City", doc);
assertXpathEvaluatesTo("__state", cinfo + "wms:ContactAddress/wms:StateOrProvince", doc);
assertXpathEvaluatesTo("__ZIP", cinfo + "wms:ContactAddress/wms:PostCode", doc);
assertXpathEvaluatesTo("__country", cinfo + "wms:ContactAddress/wms:Country", doc);
assertXpathEvaluatesTo("__phone", cinfo + "wms:ContactVoiceTelephone", doc);
assertXpathEvaluatesTo("__fax", cinfo + "wms:ContactFacsimileTelephone", doc);
assertXpathEvaluatesTo("e@mail", cinfo + "wms:ContactElectronicMailAddress", doc);
}
public void testQueryable() throws Exception {
LayerInfo lines = getCatalog().getLayerByName(MockData.LINES.getLocalPart());
lines.setQueryable(true);
getCatalog().save(lines);
LayerInfo points = getCatalog().getLayerByName(MockData.POINTS.getLocalPart());
points.setQueryable(false);
getCatalog().save(points);
String linesName = MockData.LINES.getPrefix() + ":" + MockData.LINES.getLocalPart();
String pointsName = MockData.POINTS.getPrefix() + ":" + MockData.POINTS.getLocalPart();
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
assertXpathEvaluatesTo("1", "//wms:Layer[wms:Name='" + linesName + "']/@queryable", doc);
assertXpathEvaluatesTo("0", "//wms:Layer[wms:Name='" + pointsName + "']/@queryable", doc);
}
public void testKeywordVocab() throws Exception {
FeatureTypeInfo lines = getFeatureTypeInfo(MockData.LINES);
Keyword kw = new Keyword("foo");
kw.setVocabulary("bar");
lines.getKeywords().add(kw);
getCatalog().save(lines);
WMSInfo wms = getGeoServer().getService(WMSInfo.class);
kw = new Keyword("baz");
kw.setVocabulary("bar");
wms.getKeywords().add(kw);
getGeoServer().save(wms);
String linesName = MockData.LINES.getPrefix() + ":" + MockData.LINES.getLocalPart();
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
String xpath = "//wms:Layer[wms:Name='" + linesName + "']/wms:KeywordList/wms:Keyword[@vocabulary='bar']";
assertXpathExists(xpath, doc);
assertXpathEvaluatesTo("foo", xpath, doc);
xpath = "//wms:Service/wms:KeywordList/wms:Keyword[@vocabulary='bar']";
assertXpathExists(xpath, doc);
assertXpathEvaluatesTo("baz", xpath, doc);
}
public void testBoundingBoxCRS84() throws Exception {
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
assertXpathExists("/wms:WMS_Capabilities/wms:Capability/wms:Layer/wms:BoundingBox[@CRS = 'CRS:84']", doc);
assertXpathExists("/wms:WMS_Capabilities/wms:Capability/wms:Layer//wms:Layer/wms:BoundingBox[@CRS = 'CRS:84']", doc);
}
}