Test Requirements and Assertions for WMS 1.1.1


ISSUE : v1.0

Copyright © 1999-2002 The Open Group Ltd. All Rights Reserved.



Preface

This document describes the requirements a WMS implementation must meet to be eligible for certification testing and the assertions that are tested.

For each assertion in the specifications, a corresponding entry in this test specification contains the following elements:

ID: The name by which the test is known
Class: An assertion Class as defined in IEEE Std 1003.3. These types are:
A A mandatory, testable assertion.
B A mandatory, but untestable assertion.
C An optional, testable assertion.
D An optional, but untestable assertion.
Scope: If an assertion is type C or D, this entry describes the option that needs to be supported in order to activate the test.
Text: The text of the assertion and a reference to the source specification from which the assertion is derived.
Note: Any supplementary information associated with the assertion. For example it may suggest a strategy for the test implementation of the assertion or it may propose rationale as to why a test is classified as untestable.

This specification uses the following conventions for convenience:

  • Element and attribute names are in UPPERCASE.
  • References to DTD entities are prefixed with percent sign (e.g. %PCDATA).
  • Literal text is enclosed in quotation marks.

Table of Contents

   I. Test Requirements
      A. Certification Requirements
      B. Test Data Definition
      C. Assumptions


   II. Variables and Scopes
      A. User supplied variables
      B. User supplied scopes
      C. Calculated variables
      D. Calculated scopes


   III. Test Assertions
      Certification Profiles
         Basic Profile
         Queryable Profile

      6 Basic Service Elements
         6.1 Version Numbering and Negotiation
            6.1.4 Version Number Negotiation

         6.4 Request Parameter Rules
            6.4.1 Parameter Ordering and Case


      7 Web Map Service Operations
         7.1 GetCapabilities
            7.1.3 Request Parameters
               7.1.3.1 VERSION
               7.1.3.3 REQUEST
               7.1.3.4 UPDATESEQUENCE

            7.1.4 GetCapabilities Response
               7.1.4.2 General Service Metadata
               7.1.4.3 Capability Metadata
               7.1.4.5 Layer Properties
                  7.1.4.5.4 Style
                  7.1.4.5.5 SRS
                  7.1.4.5.6 LatLonBoundingBox
                  7.1.4.5.7 BoundingBox
                  7.1.4.5.9 Dimension and Extent
                  7.1.4.5.10 MetadataURL
                  7.1.4.5.12 Identifier and AuthorityURL

               7.1.4.6 Layer Attributes
                  7.1.4.6.2 Cascaded layers
                  7.1.4.6.4 Subsettable and resizable layers


            7.1.5 Output Formats

         7.2 GetMap
            7.2.3 Request Parameters
               7.2.3.1 VERSION
               7.2.3.2 REQUEST
               7.2.3.3 LAYERS
               7.2.3.4 STYLES
               7.2.3.5 SRS
               7.2.3.6 BBOX
               7.2.3.7 FORMAT
               7.2.3.8 WIDTH, HEIGHT
               7.2.3.9 TRANSPARENT
               7.2.3.10 BGCOLOR
               7.2.3.11 EXCEPTIONS


         7.3 GetFeatureInfo
            7.3.3 Request Parameters
               7.3.3.5 QUERY_LAYERS
               7.2.3.6 INFO_FORMAT
               7.2.3.7 FEATURE_COUNT
               7.2.3.9 EXCEPTIONS



      Annex C Multi-Dimensional Data
         C.2 Declaring Dimensions



I. Test Requirements

A. Certification Requirements

To be certifiable as a BASIC WMS, an implementation must meet the following requirements:

  • It must support image/png or image/gif for GetMap requests.
  • It must contain the CITE dataset in layers that are subsetable and resizable and support EPSG:4326.
  • The EPSG:4326 support must be precise up to the ten-thousandth of a degree.
  • The default style for the cite:Lakes layer must fill in the polygon with non-white pixels.

To be certifiable as a QUERYABLE WMS, the implementation must also meet the following requirements:
  • GetFeatureInfo requests must be supported
  • The CITE dataset layers that contain polygons must be queryable.

B. Test Data Definition

The majority of the CITE standard dataset is based on the Conformance Test Guidelines for OpenGIS Simple Features Specification for SQL, Revision 1.0 . This set of features makes up a map of a fictional location called Blue Lake. The features are as described in the Simple Features Specification for SQL document, except they have been converted to WGS84 coordinates and have been reoriented so the area is centered at 0 degrees latitude, 0 degrees longitude. Figure 1 shows an overview map of the area with the prominent features labeled. Figure 2 shows the location of each of the data points.

Figure 1: Overview of Blue Lake vicinity features

Figure 2: Blue Lake vicinity data points

Additional features have also been defined to test data at a larger scale. These consist of a diamond and two overlapping squares, as shown in figure 3. It does not matter which square appears on top.

Figure 3: Basic Polygon Features

The features are organized into layers as shown in table 1. The layers may be named in any fashion, but must be titled exactly as shown in table.

Table 1: Layer titles and features
Layer Title Features Contained
cite:BasicPolygons Contains all the featrues shown in figure 3
cite:Bridges Contains Cam Bridge
cite:Buildings Contains the two buildings along Main Street
cite:DividedRoutes Contains both lanes of Route 75
cite:Forests Contains the State Forest polygon
cite:Lakes Contains Blue Lake
cite:MapNeatline Contains the border surrounding the Blue Lake vicinity
cite:NamedPlaces Contains Ashton and Goose Island
cite:Ponds Contains both pools of Stock Pond
cite:RoadSegments Contains all the sections of Route 5, Main Street, and the dirt road
cite:Streams Contains Cam Stream and the unnamed stream south of Blue Lake

A sample capabilities document which implements these layers is available here.
The dataset is available in GML, MapInfo Interchange Format, and ESRI Shapefile format and can be downloaded here.

C. Assumptions

In some cases, the WMS 1.1.1 specification is a bit ambiguous. Where additional interpretation is needed, the tests described in this document assume the following:

  • The root Layer in the capabilities document must contain at least one SRS element.
  • Scientific notation is allowed in the LatLonBoundingBox element.
  • When scientific notation is used, the syntax used is the lexical representation for float values syntax from the XML Schema spec.
  • If the INFO_FORMAT parameter is not explicitly stated on a GetFeatureInfo request, the response must still be one of the formats advertised in the GetFeatureInfo Request section of the capabilities document.
  • For resizable layers, servers must be able to generate maps as large as 1024x768 and as small as 8x5.

II. Variables and Scopes

A. User supplied variables

These variables are supplied by the user.

Variable Name Prompt
VAR_HIGH_UPDATESEQUENCE A value that is lexically higher than the current updateSequence value
VAR_LOW_UPDATESEQUENCE A value that is lexically lower than the current updateSequence value

B. User supplied scopes

These scopes are options selected by the user.

Scope ID Description
auto_updatesequence The updateSequence tests use automatically generated updateSequence values
manual_updatesequence The updateSequence tests use the user supplied values
no_profile No tests for a certification profile were selected
basic_profile Tests for the BASIC profile were selected
queryable_profile Tests for the QUERYABLE profile were selected
recommended The recommendation support tests were selected
testgml Tests for GetFeatureInfo format application/vnd.ogc.gml were selected.
free The fees and access constraints tests were selected
loosebboxconstraints The LOOSE bounding box constraint test was selected
strictbboxconstraints The STRICT bounding box constraint test was selected
eitherbboxconstraint No bounding box constraint tests were selected

C. Calculated variables

These variables are extracted from the capabilities document using XPath expressions.

VAR_WMS_VERSION =
string('1.1.1')
VAR_WMS_GET_CAPABILITIES_HTTP_GET_URL =
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetCapabilities/DCPType
/HTTP/Get/OnlineResource/@*[local-name() = 'href'], '')
VAR_WMS_GET_MAP_HTTP_GET_URL =
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetMap/DCPType/HTTP/Get
/OnlineResource/@*[local-name() = 'href'], '')
VAR_WMS_GET_FEATURE_INFO_HTTP_GET_URL =
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/DCPType/
HTTP/Get/OnlineResource/@*[local-name() = 'href'], '')
VAR_CURRENT_UPDATESEQUENCE =
string(/WMT_MS_Capabilities/@updateSequence)
VAR_AUTO_HIGH_UPDATESEQUENCE =
citef:inc(/WMT_MS_Capabilities/@updateSequence, 1)
VAR_AUTO_LOW_UPDATESEQUENCE =
citef:inc(/WMT_MS_Capabilities/@updateSequence, -1)
VAR_IMAGE_FORMAT =
string(/WMT_MS_Capabilities/Capability/Request/GetMap/Format[1])
VAR_LOSSLESS_FORMAT =
string((/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or F
ormat='image/png'])/Format[1])
VAR_TRANSPARENT_FORMAT =
string((/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or F
ormat='image/png'])/Format[1])
VAR_INHERENT_STYLE =
string(//Layer[starts-with(Title, 'cite') and Style]/Style[1]/Name)
VAR_LAYER_WITH_INHERENT_STYLE =
string(//Layer[starts-with(Title, 'cite') and Style]/Name)
VAR_INHERITED_STYLE =
string(//Layer[starts-with(Title, 'cite') and not(Style)]/ancestor::Layer/Style[
1]/Name)
VAR_LAYER_WITH_INHERITED_STYLE =
string(//Layer[starts-with(Title, 'cite') and not(Style) and ancestor::Layer/Sty
le]/Name)
VAR_STYLE =
string(//Layer[starts-with(Title, 'cite')]/ancestor-or-self::Layer/Style[1]/Name
)
VAR_LAYER_WITH_STYLE =
string(//Layer[starts-with(Title, 'cite') and ancestor-or-self::Layer/Style]/Nam
e)
VAR_LAYER_WITH_INHERENT_SRS =
string((//Layer[starts-with(Title, 'cite') and SRS[contains(., 'EPSG:4326')]])[1
]/Name)
VAR_LAYER_WITH_INHERITED_SRS =
string((//Layer[starts-with(Title, 'cite') and not(SRS[contains(., 'EPSG:4326')]
)])[1]/Name)
VAR_UNQUERYABLE_LAYER =
string(//Layer[starts-with(Title, 'cite') and @queryable='0'][1]/Name)
VAR_STDDATA_EXISTS =
count(//Layer[(Title = 'cite:BasicPolygons' or Title = 'cite:Bridges' or Title =
 'cite:Buildings' or Title = 'cite:DividedRoutes' or Title = 'cite:Forests' or T
itle = 'cite:Lakes' or Title = 'cite:MapNeatline' or Title = 'cite:NamedPlaces' 
or Title = 'cite:Ponds' or Title = 'cite:RoadSegments' or Title = 'cite:Streams'
) and ancestor-or-self::Layer/SRS[contains(., 'EPSG:4326')] and not(@noSubsets =
 1) and (not(@fixedWidth) or @fixedWidth = 0) and (not(@fixedHeight) or @fixedHe
ight = 0)]) = 11
VAR_QUERYABLE_LAYERS_EXIST =
count(//Layer[Title = 'cite:BasicPolygons' and @queryable = '1']) > 0 and count(
//Layer[Title = 'cite:Forests' and @queryable = '1']) > 0 and count(//Layer[Titl
e = 'cite:Lakes' and @queryable = '1']) > 0 and count(//Layer[Title = 'cite:Name
dPlaces' and @queryable = '1']) > 0 and count(//Layer[Title = 'cite:Ponds' and @
queryable = '1']) > 0 and count(/WMT_MS_Capabilities/Capability/Request/GetFeatu
reInfo) > 0
VAR_BASIC_POLYGONS =
string(//Layer[Title = 'cite:BasicPolygons']/Name)
VAR_BRIDGES =
string(//Layer[Title = 'cite:Bridges']/Name)
VAR_BUILDINGS =
string(//Layer[Title = 'cite:Buildings']/Name)
VAR_DIVIDED_ROUTES =
string(//Layer[Title = 'cite:DividedRoutes']/Name)
VAR_FORESTS =
string(//Layer[Title = 'cite:Forests']/Name)
VAR_LAKES =
string(//Layer[Title = 'cite:Lakes']/Name)
VAR_MAP_NEATLINE =
string(//Layer[Title = 'cite:MapNeatline']/Name)
VAR_NAMED_PLACES =
string(//Layer[Title = 'cite:NamedPlaces']/Name)
VAR_PONDS =
string(//Layer[Title = 'cite:Ponds']/Name)
VAR_ROAD_SEGMENTS =
string(//Layer[Title = 'cite:RoadSegments']/Name)
VAR_STREAMS =
string(//Layer[Title = 'cite:Streams']/Name)
VAR_GET_FEATURE_INFO_FORMAT =
string((/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/Format[(position(
) = 1 and last() = 1) or . != 'application/vnd.ogc.gml'])[1])

D. Calculated scopes

These scopes are extracted from the capabilities document using XPath expressions.

wms:updatesequence -
string-length('[[VAR_CURRENT_UPDATESEQUENCE]]') > 0
wms:stddata -
[[VAR_STDDATA_EXISTS]]()
wms:queryable -
[[VAR_QUERYABLE_LAYERS_EXIST]]()
wms:namedstyle -
string-length('[[VAR_STYLE]]') > 0
wms:inherentstyle -
string-length('[[VAR_INHERENT_STYLE]]') > 0
wms:inheritedstyle -
string-length('[[VAR_INHERITED_STYLE]]') > 0
wms:inherentsrs -
string-length('[[VAR_LAYER_WITH_INHERENT_SRS]]') > 0
wms:inheritedsrs -
string-length('[[VAR_LAYER_WITH_INHERITED_SRS]]') > 0
wms:gif -
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif']) > 0
wms:jpeg -
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/jpeg']) > 0
wms:png -
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/png']) > 0
wms:transparency -
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or For
mat = 'image/png']) > 0
wms:lossless -
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or For
mat = 'image/png']) > 0
wms:se_inimage -
count(/WMT_MS_Capabilities/Capability/Exception[Format = 'application/vnd.ogc.se
_inimage']) > 0
wms:se_blank -
count(/WMT_MS_Capabilities/Capability/Exception[Format = 'application/vnd.ogc.se
_blank']) > 0
wms:getfeatureinfo -
count(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo) > 0
wms:unqueryablelayer -
string-length('[[VAR_UNQUERYABLE_LAYER]]') > 0
wms:gml -
count(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/Format[. = 'applica
tion/vnd.ogc.gml']) > 0

III. Test Assertions

Certification Profiles

Basic Profile

ID: wms/profiles/basic/1
Class: C
Scope: Tests for the BASIC profile were selected
Text: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326. [Test Requirements and Assertions for WMS 1.1.1 section A.-Certification Requirements]
Note:
boolean([[VAR_STDDATA_EXISTS]]())

ID: wms/profiles/basic/2
Class: C
Scope: Tests for the BASIC profile were selected
Text: The server supports GetMap format image/gif and/or image/png. [Test Requirements and Assertions for WMS 1.1.1 section A.-Certification Requirements]
Note:
string-length("[[VAR_LOSSLESS_FORMAT]]") > 0

Queryable Profile

ID: wms/profiles/queryable/1
Class: C
Scope: Tests for the QUERYABLE profile were selected
Text: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326. [Test Requirements and Assertions for WMS 1.1.1 section A.-Certification Requirements]
Note:
boolean([[VAR_STDDATA_EXISTS]]())

ID: wms/profiles/queryable/2
Class: C
Scope: Tests for the QUERYABLE profile were selected
Text: The server supports GetMap format image/gif and/or image/png. [Test Requirements and Assertions for WMS 1.1.1 section A.-Certification Requirements]
Note:
string-length("[[VAR_LOSSLESS_FORMAT]]") > 0

ID: wms/profiles/queryable/3
Class: C
Scope: Tests for the QUERYABLE profile were selected
Text: The server supports GetFeatureInfo requests and the CITE standard dataset layers containing polygons are queryable. [Test Requirements and Assertions for WMS 1.1.1 section A.-Certification Requirements]
Note:
boolean([[VAR_QUERYABLE_LAYERS_EXIST]]() and string-length("[[VAR_WMS_GET_FEATURE_INFO_HTTP_GET_URL]]") > 0)

6 Basic Service Elements

6.1 Version Numbering and Negotiation

6.1.4 Version Number Negotiation

ID: wms/basic_elements/version/negotiation/1
Class: B
Text: When a GetCapabilities request is made without a version number, then the response is the highest version supported. [WMS 1.1.1 Specification section basic_elements.version.negotiation]
Note:
Not testable since the capabilities XML for highest version supported may have an unknown structure.

ID: wms/basic_elements/version/negotiation/2
Class: A
Text: When a GetCapabilities request is made for a supported version, then the response is the requested version. [WMS 1.1.1 Specification section basic_elements.version.negotiation]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]

ID: wms/basic_elements/version/negotiation/3
Class: B
Text: When a GetCapabilities request is made for version 100.0.0, the response is between [[VAR_WMS_VERSION]] and 100.0.0, inclusive. [WMS 1.1.1 Specification section basic_elements.version.negotiation]
Note:
Not testable since the capabilities XML returned may have an unknown structure.

ID: wms/basic_elements/version/negotiation/4
Class: A
Text: When a GetCapabilities request is made for version 0.0.0, the response is between 0.0.0 and [[VAR_WMS_VERSION]], inclusive. [WMS 1.1.1 Specification section basic_elements.version.negotiation]
Note:
Request:
VERSION = 0.0.0
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version <= [[VAR_WMS_VERSION]]

6.4 Request Parameter Rules

6.4.1 Parameter Ordering and Case

ID: wms/basic_elements/param_rules/order_and_case/1
Class: B
Text: Parameter names are not case sensitive. [WMS 1.1.1 Specification section basic_elements.param_rules.order_and_case]
Note:
Not completely testable without an extremely large number of requests. However, the other tests will use MiXeD case for parameter names to ensure that implementations haven't hardcoded for upper or lower case.

ID: wms/basic_elements/param_rules/order_and_case/2
Class: B
Text: Parameters in a request may be specified in any order. [WMS 1.1.1 Specification section basic_elements.param_rules.order_and_case]
Note:
Not completely testable without an extremely large number of requests. However, the other tests will use a random order for parameter names rather than using alphabetical order or the order in which the spec lists the parameters.

ID: wms/basic_elements/param_rules/order_and_case/3
Class: A
Text: When a GetCapabilities request contains a parameter which is not defined by the spec, the result is valid. [WMS 1.1.1 Specification section basic_elements.param_rules.order_and_case]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
BOGUS = ignored
Results: XML where /WMT_MS_Capabilities exists.

ID: wms/basic_elements/param_rules/order_and_case/4
Class: C
Scope: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request contains a parameter which is not defined by the spec, the result is valid. [WMS 1.1.1 Specification section basic_elements.param_rules.order_and_case]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = 0, -0.0020, 0.0040, 0
WIDTH = 200
HEIGHT = 100
FORMAT = [[VAR_IMAGE_FORMAT]]
BOGUS = ignored
Results: Content-type header = [[VAR_IMAGE_FORMAT]]

ID: wms/basic_elements/param_rules/order_and_case/5
Class: C
Scope: The server supports GetFeatureInfo requests and the CITE standard dataset layers containing polygons are queryable
Text: When a GetFeatureInfo request contains a parameter which is not defined by the spec, the result is valid. [WMS 1.1.1 Specification section basic_elements.param_rules.order_and_case]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetFeatureInfo
LAYERS = [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = 0, -0.0020, 0.0040, 0
WIDTH = 200
HEIGHT = 100
FORMAT = [[VAR_IMAGE_FORMAT]]
QUERY_LAYERS = [[VAR_LAKES]]
INFO_FORMAT = [[VAR_GET_FEATURE_INFO_FORMAT]]
X = 60
Y = 60
BOGUS = ignored
Results: Content-type header = [[VAR_GET_FEATURE_INFO_FORMAT]]

7 Web Map Service Operations

7.1 GetCapabilities

7.1.3 Request Parameters

7.1.3.1 VERSION
ID: wms/wmsops/getcapabilities/params/version/1
Class: A
Text: When a GetCapabilities request is made for the version in test using WMTVER instead of VERSION, then the response is the requested version. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request:
WMTVER = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]

ID: wms/wmsops/getcapabilities/params/version/2
Class: A
Text: When a GetCapabilities request is made for a supported version other than [[VAR_WMS_VERSION]] using WMTVER instead of VERSION, then the version returned is the version requested. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request#1:
VERSION = 0.0.0
SERVICE = WMS
REQUEST = GetCapabilities
Request#2:
VERSION = 100.0.0
SERVICE = WMS
REQUEST = GetCapabilities
Request#3:
WMTVER = [[VAR_OTHER_VERSION]]
SERVICE = WMS
REQUEST = [[VAR_REQUEST_NAME]]
Results: VAR_OTHER_VERSION will be set to the version returned from request 1 if it is not ther version in test. Otherwise, it will be set to the version returned from request 2. The result from request 3 must be XML where /WMT_MS_Capabilities/@version = [[VAR_OTHER_VERSION]]

ID: wms/wmsops/getcapabilities/params/version/3
Class: A
Text: When a GetCapabilities request is made with VERSION set to [[VAR_WMS_VERSION]] and WMTVER set to 0.0.0 and VERSION precedes WMTVER, then the version returned is [[VAR_WMS_VERSION]]. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
WMTVER = 0.0.0
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]

ID: wms/wmsops/getcapabilities/params/version/4
Class: A
Text: When a GetCapabilities request is made with VERSION set to [[VAR_WMS_VERSION]] and WMTVER set to 100.0.0 and VERSION precedes WMTVER, then the version returned is [[VAR_WMS_VERSION]]. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
WMTVER = 100.0.0
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]

ID: wms/wmsops/getcapabilities/params/version/5
Class: A
Text: When a GetCapabilities request is made with VERSION set to [[VAR_WMS_VERSION]] and WMTVER set to 0.0.0 and WMTVER precedes VERSION, then the version returned is [[VAR_WMS_VERSION]]. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request:
WMTVER = 0.0.0
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]

ID: wms/wmsops/getcapabilities/params/version/6
Class: A
Text: When a GetCapabilities request is made with VERSION set to [[VAR_WMS_VERSION]] and WMTVER set to 100.0.0 and WMTVER precedes VERSION, then the version returned is [[VAR_WMS_VERSION]]. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.version]
Note:
Request:
WMTVER = 100.0.0
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/@version = [[VAR_WMS_VERSION]]
7.1.3.3 REQUEST
ID: wms/wmsops/getcapabilities/params/request/1
Class: A
Text: When REQUEST is "capabilities", then the response is capabilities XML. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.request]
Note:
Request:
SERVICE = WMS
REQUEST = capabilities
Results: XML where /WMT_MS_Capabilities exists
7.1.3.4 UPDATESEQUENCE
ID: wms/wmsops/getcapabilities/params/updatesequence/1
Class: C
Scope: The server does not advertise an UpdateSequence number
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter, then the UPDATESEQUENCE parameter is ignored. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = ignored
Results: XML where /WMT_MS_Capabilities exists

ID: wms/wmsops/getcapabilities/params/updatesequence/2
Class: C
Scope: The server advertises an UpdateSequence number
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter set to the current update sequence value, then the server returns a valid exception (code=CurrentUpdateSequence). [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = [[VAR_CURRENT_UPDATESEQUENCE]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="CurrentUpdateSequence"] exists

ID: wms/wmsops/getcapabilities/params/updatesequence/3
Class: C
Scopes:
  • The server advertises an UpdateSequence number
  • The updateSequence tests use the user supplied values
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter set to a value lower than the current update sequence value, then the server returns capabilities XML. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = [[VAR_LOW_UPDATESEQUENCE]]
Results: XML where /WMT_MS_Capabilities exists

ID: wms/wmsops/getcapabilities/params/updatesequence/4
Class: C
Scopes:
  • The server advertises an UpdateSequence number
  • The updateSequence tests use the user supplied values
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter set to a value higher than the current update sequence value, then the server returns an InvalidUpdateSequence exception. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = [[VAR_HIGH_UPDATESEQUENCE]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="InvalidUpdateSequence"] exists

ID: wms/wmsops/getcapabilities/params/updatesequence/5
Class: C
Scopes:
  • The server advertises an UpdateSequence number
  • The updateSequence tests use automatically generated updateSequence values
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter set to a value lower than the current update sequence value, then the server returns capabilities XML. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = [[VAR_AUTO_LOW_UPDATESEQUENCE]]
Results: XML where /WMT_MS_Capabilities exists

ID: wms/wmsops/getcapabilities/params/updatesequence/6
Class: C
Scopes:
  • The server advertises an UpdateSequence number
  • The updateSequence tests use automatically generated updateSequence values
Text: When a GetCapabilities request is made with an UPDATESEQUENCE parameter set to a value higher than the current update sequence value, then the server returns an InvalidUpdateSequence exception. [WMS 1.1.1 Specification section wmsops.getcapabilities.params.updatesequence]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
UPDATESEQUENCE = [[VAR_AUTO_HIGH_UPDATESEQUENCE]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="InvalidUpdateSequence"] exists

7.1.4 GetCapabilities Response

ID: wms/wmsops/getcapabilities/response/1
Class: A
Text: When a GetCapabilities request is made, then the content-type header of the response is application/vnd.ogc.wms_xml [WMS 1.1.1 Specification section wmsops.getcapabilities.response], [WMS 1.1.1 Specification section basic_elements.result], [WMS 1.1.1 Specification section basic_elements.params.srs.undefined]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: Content-type header = application/vnd.ogc.wms_xml

ID: wms/wmsops/getcapabilities/response/2
Class: A
Text: The response to a GetCapabilities request references a valid copy of the DTD in Annex A.1 at a fully-quallified and accessible location and validates with the DTD. [WMS 1.1.1 Specification section wmsops.getcapabilities.response]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML that validates with the properly configured Galdos validator
7.1.4.2 General Service Metadata
ID: wms/wmsops/getcapabilities/response/general_metadata/1
Class: A
Text: The Service Name element in the capabilities document has the value "OGC:WMS". [WMS 1.1.1 Specification section wmsops.getcapabilities.response.general_metadata]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/Service/Name = "OGC:WMS"

ID: wms/wmsops/getcapabilities/response/general_metadata/2
Class: A
Text: The word "none" (case-insensitive) is used in the content of the Fees element and the AccessConstraints element of the capabilities document. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.general_metadata]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where LowerCase(/WMT_MS_Capabilities/Service/Fees) = "none" and LowerCase(/WMT_MS_Capabilities/Service/AccessConstraints) = "none"
7.1.4.3 Capability Metadata
ID: wms/wmsops/getcapabilities/response/capability_metadata/1
Class: A
Text: Each OnlineResource URL intended for HTTP Get requests in the capabilities document is a URL prefix [WMS 1.1.1 Specification section wmsops.getcapabilities.response.capability_metadata], [WMS 1.1.1 Specification section basic_elements.request_rules.get]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where each /WMT_MS_Capabilities/Capability/Request//OnlineResource@xlink:href ends in a ? or both contains a ? and ends in an &.

ID: wms/wmsops/getcapabilities/response/capability_metadata/2
Class: C
Scope: Tests for GetFeatureInfo format application/vnd.ogc.gml were selected.
Text: The output format application/vnd.ogc.gml is listed for the GetFeatureInfo operation. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.capability_metadata]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where count(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/Format[. = 'application/vnd.ogc.gml']) > 0
7.1.4.5 Layer Properties
7.1.4.5.4 Style
ID: wms/wmsops/getcapabilities/response/layer_properties/style/1
Class: A
Text: There are no child layers in the capabilities document that redefine a Style with the same name as one inherited from one of its parents. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.style]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where no //Layer/Style/Name is redefined
7.1.4.5.5 SRS
ID: wms/wmsops/getcapabilities/response/layer_properties/srs/1
Class: A
Text: The root layer in the capabilities document has at least one SRS element. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.srs]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where at least one /WMT_MS_Capabilities/Capability/Layer/SRS exists
7.1.4.5.6 LatLonBoundingBox
ID: wms/wmsops/getcapabilities/response/layer_properties/latlonbbox/1
Class: A
Text: The root layer in the capabilities document has a LatLonBoundingBox. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.latlonbbox]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where /WMT_MS_Capabilities/Capability/Layer/LatLonBoundingBox exists

ID: wms/wmsops/getcapabilities/response/layer_properties/latlonbbox/2
Class: A
Text: The minx, miny, maxx, and maxy attributes on each LatLonBoundingBox are expressed in decimal degrees. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.latlonbbox]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where the attributes on each //LatLonBoundingBox are numeric (scientific notation is OK).
7.1.4.5.7 BoundingBox
ID: wms/wmsops/getcapabilities/response/layer_properties/bbox/1
Class: A
Text: For each of the layer elements in the capabilities document, each BoundingBox on the layer states a different SRS. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.bbox]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where count(//Layer/BoundingBox[@SRS = following-sibling::*/@SRS]) = 0
7.1.4.5.9 Dimension and Extent
ID: wms/wmsops/getcapabilities/response/layer_properties/dim_and_extent/1
Class: A
Text: There are no child Dimension elements in the capabilities document that use a name attribute that is defined in a parent layer. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.dim_and_extent], [WMS 1.1.1 Specification section dims.declaring]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where no //Layer/Dimension/@name is redefined

ID: wms/wmsops/getcapabilities/response/layer_properties/dim_and_extent/2
Class: A
Text: Each Extent element in the capabilities document uses a name that has been declared or inherited in a corresponding Dimension element. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.dim_and_extent]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where every //Layer/Extent/@name has a corresponding Layer/Dimension/@name
7.1.4.5.10 MetadataURL
ID: wms/wmsops/getcapabilities/response/layer_properties/metadataurl/1
Class: B
Text: Each MetadataURL element in the capabilities document references metadata in the standard format indicated by its type parameter. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.metadataurl]
Note:
Not testable
7.1.4.5.12 Identifier and AuthorityURL
ID: wms/wmsops/getcapabilities/response/layer_properties/identifier_and_authorityurl/1
Class: A
Text: There are no child Layer elements in the capabilities document that define an AuthorityURL with the same name attribute as one inherited from a parent layer. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.identifier_and_authorityurl]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where no //Layer/AuthorityURL/@name is redefined

ID: wms/wmsops/getcapabilities/response/layer_properties/identifier_and_authorityurl/2
Class: A
Text: There are no Layer elements in the capabilities document that declare an Identifier without also declaring or inheriting a corresponding AuthorityURL. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.identifier_and_authorityurl]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where each //Layer/Identifier/@authority has a corresponding //Layer/AuthorityURL/@name
7.1.4.6 Layer Attributes
7.1.4.6.2 Cascaded layers
ID: wms/wmsops/getcapabilities/response/layer_attributes/cascaded/1
Class: D
Scope: The server cascades the content of another WMS
Text: For each layer in the capabilities document that is cascaded from another WMS, the value of the cascaded attribute is the value of the cascaded attribute from the originating WMS's Capabilities document incremented by one, or is one if there is no cascaded attribute in the originating WMS's Capabilities document. [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_attributes.cascaded]
Note:
Not testable because there is no way of knowing whether or not a cascaded layer is actually cascaded, or how deeply.
7.1.4.6.4 Subsettable and resizable layers
ID: wms/wmsops/getcapabilities/response/layer_attributes/subsettable_and_resizable/1
Class: B
Text: For each layer that does not have a well-defined coordinate system the SRS is declared as NONE (case-insensitive) [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_attributes.subsettable_and_resizable], [WMS 1.1.1 Specification section basic_elements.params.srs.undefined]
Note:
Not testable because there is no way of knowing whether the data has a a well-defined coordinate system or not.

7.1.5 Output Formats

ID: wms/wmsops/getcapabilities/output_formats/1
Class: A
Text: The application/vnd.ogc.se_xml exception format is listed in the capabilities document. [WMS 1.1.1 Specification section wmsops.getcapabilities.output_formats], [WMS 1.1.1 Specification section wmsops.getmap.params.exceptions]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
SERVICE = WMS
REQUEST = GetCapabilities
Results: XML where a /WMT_MS_Capabilities/Capability/Exception/Format = "application/vnd.ogc.se_xml"

7.2 GetMap

7.2.3 Request Parameters

7.2.3.1 VERSION
ID: wms/wmsops/getmap/params/version/1
Class: C
Scopes:
  • The recommendation support tests were selected
  • The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request is made using WMTVER instead of VERSION, the response is valid. [WMS 1.1.1 Specification section wmsops.getmap.params.version]
Note:
Request:
WMTVER = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = 0, -0.0020, 0.0040, 0
WIDTH = 200
HEIGHT = 100
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Content-type header = [[VAR_IMAGE_FORMAT]]
7.2.3.2 REQUEST
ID: wms/wmsops/getmap/params/request/1
Class: C
Scopes:
  • The recommendation support tests were selected
  • The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request is made using REQUEST=map instead of REQUEST=GetMap, the response is valid. [WMS 1.1.1 Specification section wmsops.getmap.params.request]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = map
LAYERS = [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = 0, -0.0020, 0.0040, 0
WIDTH = 200
HEIGHT = 100
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Content-type header = [[VAR_IMAGE_FORMAT]]
7.2.3.3 LAYERS
ID: wms/wmsops/getmap/params/layers/1
Class: C
Scope: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request contains a single layer name, then the response is valid. [WMS 1.1.1 Specification section wmsops.getmap.params.layers]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = 0, -0.0020, 0.0040, 0
WIDTH = 200
HEIGHT = 100
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Content-type header = [[VAR_IMAGE_FORMAT]]

ID: wms/wmsops/getmap/params/layers/2
Class: C
Scope: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request contains two layer names (separated by a comma), then the response is valid. [WMS 1.1.1 Specification section wmsops.getmap.params.layers]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_LAKES]], [[VAR_STREAMS]]
STYLES =
SRS = EPSG:4326
BBOX = -0.0042, -0.0024, 0.0042, 0.0024
WIDTH = 168
HEIGHT = 96
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Content-type header = [[VAR_IMAGE_FORMAT]]

ID: wms/wmsops/getmap/params/layers/3
Class: C
Scope: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request contains three layer names (separated by commas), then the response is valid. [WMS 1.1.1 Specification section wmsops.getmap.params.layers]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_MAP_NEATLINE]], [[VAR_ROAD_SEGMENTS]], [[VAR_DIVIDED_ROUTES]]
STYLES =
SRS = EPSG:4326
BBOX = -0.0042, -0.0024, 0.0042, 0.0024
WIDTH = 168
HEIGHT = 96
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Content-type header = [[VAR_IMAGE_FORMAT]]

ID: wms/wmsops/getmap/params/layers/4
Class: C
Scope: The server implements the CITE standard dataset in subsettable, resizable layers that support EPSG:4326
Text: When a GetMap request contains multiple layers, then the response renders the requested layers by drawing the leftmost in the list bottommost, and the next one over that. [WMS 1.1.1 Specification section wmsops.getmap.params.layers]
Note:
The user will be asked to manually verify that for request #1, Goose Island, Blue Lake, and Ashton are above State Forest. For request #2, State Forest is above Ashton, and Blue Lake and Goose Island are not visible. If it is not be possible to tell which feature is on top of another, the test will pass.

ID: wms/wmsops/getmap/params/layers/5
Class: A
Text: When the layer in a GetMap request is invalid, then the response is an exception (code="LayerNotDefined"). [WMS 1.1.1 Specification section wmsops.getmap.params.layers], [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.name]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = NonExistant
STYLES =
SRS = EPSG:4326
BBOX = -0.0042, -0.0024, 0.0042, 0.0024
WIDTH = 168
HEIGHT = 96
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="LayerNotDefined"] exists

ID: wms/wmsops/getmap/params/layers/6
Class: A
Text: When a GetMap request contains two layers where the first is valid and the second is invalid, then the response is an exception (code="LayerNotDefined"). [WMS 1.1.1 Specification section wmsops.getmap.params.layers], [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.name]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = [[VAR_LAKES]], NonExistant
STYLES =
SRS = EPSG:4326
BBOX = -0.0042, -0.0024, 0.0042, 0.0024
WIDTH = 168
HEIGHT = 96
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="LayerNotDefined"] exists

ID: wms/wmsops/getmap/params/layers/7
Class: A
Text: When a GetMap request contains two layers where the first is invalid and the second is valid, then the response is an exception (code="LayerNotDefined"). [WMS 1.1.1 Specification section wmsops.getmap.params.layers], [WMS 1.1.1 Specification section wmsops.getcapabilities.response.layer_properties.name]
Note:
Request:
VERSION = [[VAR_WMS_VERSION]]
REQUEST = GetMap
LAYERS = NonExistant, [[VAR_LAKES]]
STYLES =
SRS = EPSG:4326
BBOX = -0.0042, -0.0024, 0.0042, 0.0024
WIDTH = 168
HEIGHT = 96
FORMAT = [[VAR_IMAGE_FORMAT]]
Results: Valid XML where /ServiceExceptionReport/ServiceException[@code="LayerNotDefined"] exists

<
ID: wms/wmsops/getmap/params/layers/8
Class: B