diff --git a/botocore/serialize.py b/botocore/serialize.py
index 82ed58d09a..6d27b87a19 100644
--- a/botocore/serialize.py
+++ b/botocore/serialize.py
@@ -180,7 +180,11 @@ def _expand_host_prefix(self, parameters, operation_model):
return None
host_prefix_expression = operation_endpoint['hostPrefix']
- input_members = operation_model.input_shape.members
+ input_members = (
+ operation_model.input_shape.members
+ if operation_model.input_shape
+ else {}
+ )
host_labels = [
member
for member, shape in input_members.items()
@@ -203,6 +207,9 @@ def _expand_host_prefix(self, parameters, operation_model):
)
return host_prefix_expression.format(**format_kwargs)
+ def _is_shape_flattened(self, shape):
+ return shape.serialization.get('flattened')
+
class QuerySerializer(Serializer):
TIMESTAMP_FORMAT = 'iso8601'
@@ -308,9 +315,6 @@ def _serialize_type_boolean(self, serialized, value, shape, prefix=''):
def _default_serialize(self, serialized, value, shape, prefix=''):
serialized[prefix] = value
- def _is_shape_flattened(self, shape):
- return shape.serialization.get('flattened')
-
class EC2Serializer(QuerySerializer):
"""EC2 specific customizations to the query protocol serializers.
@@ -324,7 +328,7 @@ class EC2Serializer(QuerySerializer):
def _get_serialized_name(self, shape, default_name):
# Returns the serialized name for the shape if it exists.
- # Otherwise it will return the passed in default_name.
+ # Otherwise it will return the passed in capitalized default_name.
if 'queryName' in shape.serialization:
return shape.serialization['queryName']
elif 'name' in shape.serialization:
@@ -394,6 +398,9 @@ def _serialize_type_structure(self, serialized, value, shape, key):
serialized = new_serialized
members = shape.members
for member_key, member_value in value.items():
+ if member_value is None:
+ # Don't serialize any parameter with a None value.
+ continue
member_shape = members[member_key]
if 'name' in member_shape.serialization:
member_key = member_shape.serialization['name']
@@ -442,6 +449,7 @@ class BaseRestSerializer(Serializer):
"""
+ URI_TIMESTAMP_FORMAT = 'iso8601'
QUERY_STRING_TIMESTAMP_FORMAT = 'iso8601'
HEADER_TIMESTAMP_FORMAT = 'rfc822'
# This is a list of known values for the "location" key in the
@@ -455,6 +463,11 @@ def serialize_to_request(self, parameters, operation_model):
'method', self.DEFAULT_METHOD
)
shape = operation_model.input_shape
+
+ host_prefix = self._expand_host_prefix(parameters, operation_model)
+ if host_prefix is not None:
+ serialized['host_prefix'] = host_prefix
+
if shape is None:
serialized['url_path'] = operation_model.http['requestUri']
return serialized
@@ -502,10 +515,6 @@ def serialize_to_request(self, parameters, operation_model):
)
self._serialize_content_type(serialized, shape, shape_members)
- host_prefix = self._expand_host_prefix(parameters, operation_model)
- if host_prefix is not None:
- serialized['host_prefix'] = host_prefix
-
return serialized
def _render_uri_template(self, uri_template, params):
@@ -551,7 +560,10 @@ def _serialize_payload(
body_params, shape_members[payload_member]
)
else:
- serialized['body'] = self._serialize_empty_body()
+ if shape_members[payload_member].is_tagged_union:
+ serialized['body'] = b''
+ else:
+ serialized['body'] = self._serialize_empty_body()
elif partitioned['body_kwargs']:
serialized['body'] = self._serialize_body_params(
partitioned['body_kwargs'], shape
@@ -600,30 +612,38 @@ def _partition_parameters(
location = member.serialization.get('location')
key_name = member.serialization.get('name', param_name)
if location == 'uri':
- partitioned['uri_path_kwargs'][key_name] = param_value
- elif location == 'querystring':
- if isinstance(param_value, dict):
- partitioned['query_string_kwargs'].update(param_value)
- elif isinstance(param_value, bool):
+ if isinstance(param_value, bool):
bool_str = str(param_value).lower()
- partitioned['query_string_kwargs'][key_name] = bool_str
+ partitioned['uri_path_kwargs'][key_name] = bool_str
elif member.type_name == 'timestamp':
timestamp_format = member.serialization.get(
- 'timestampFormat', self.QUERY_STRING_TIMESTAMP_FORMAT
+ 'timestampFormat', self.URI_TIMESTAMP_FORMAT
)
timestamp = self._convert_timestamp_to_str(
param_value, timestamp_format
)
- partitioned['query_string_kwargs'][key_name] = timestamp
+ partitioned['uri_path_kwargs'][key_name] = timestamp
+ else:
+ partitioned['uri_path_kwargs'][key_name] = param_value
+ elif location == 'querystring':
+ if isinstance(param_value, dict):
+ # Add only new query string key/value pairs.
+ # Named query parameters should take precedence.
+ for key, value in param_value.items():
+ partitioned['query_string_kwargs'].setdefault(key, value)
+ elif member.type_name == 'list':
+ new_param = [
+ self._get_query_string_value(value, member.member)
+ for value in param_value
+ ]
+ partitioned['query_string_kwargs'][key_name] = new_param
else:
- partitioned['query_string_kwargs'][key_name] = param_value
+ new_param = self._get_query_string_value(param_value, member)
+ partitioned['query_string_kwargs'][key_name] = new_param
elif location == 'header':
shape = shape_members[param_name]
- if not param_value and shape.type_name == 'list':
- # Empty lists should not be set on the headers
- return
value = self._convert_header_value(shape, param_value)
- partitioned['headers'][key_name] = str(value)
+ partitioned['headers'][key_name] = value
elif location == 'headers':
# 'headers' is a bit of an oddball. The ``key_name``
# is actually really a prefix for the header names:
@@ -638,6 +658,19 @@ def _partition_parameters(
else:
partitioned['body_kwargs'][param_name] = param_value
+ def _get_query_string_value(self, param_value, member):
+ if isinstance(param_value, bool):
+ return str(param_value).lower()
+ elif member.type_name == 'timestamp':
+ timestamp_format = member.serialization.get(
+ 'timestampFormat', self.QUERY_STRING_TIMESTAMP_FORMAT
+ )
+ return self._convert_timestamp_to_str(
+ param_value, timestamp_format
+ )
+ else:
+ return param_value
+
def _do_serialize_header_map(self, header_prefix, headers, user_input):
for key, val in user_input.items():
full_key = header_prefix + key
@@ -647,24 +680,41 @@ def _serialize_body_params(self, params, shape):
raise NotImplementedError('_serialize_body_params')
def _convert_header_value(self, shape, value):
- if shape.type_name == 'timestamp':
+ if isinstance(value, bool):
+ return str(value).lower()
+ elif shape.type_name == 'timestamp':
datetime_obj = parse_to_aware_datetime(value)
timestamp = calendar.timegm(datetime_obj.utctimetuple())
timestamp_format = shape.serialization.get(
'timestampFormat', self.HEADER_TIMESTAMP_FORMAT
)
- return self._convert_timestamp_to_str(timestamp, timestamp_format)
+ return str(
+ self._convert_timestamp_to_str(timestamp, timestamp_format)
+ )
elif shape.type_name == 'list':
- converted_value = [
- self._convert_header_value(shape.member, v)
- for v in value
- if v is not None
- ]
- return ",".join(converted_value)
+ if shape.member.type_name == "string":
+ converted_value = [
+ self._escape_header_list_string(v)
+ for v in value
+ if v is not None
+ ]
+ else:
+ converted_value = [
+ self._convert_header_value(shape.member, v)
+ for v in value
+ if v is not None
+ ]
+ return ", ".join(converted_value)
elif is_json_value_header(shape):
# Serialize with no spaces after separators to save space in
# the header.
return self._get_base64(json.dumps(value, separators=(',', ':')))
+ else:
+ return str(value)
+
+ def _escape_header_list_string(self, value):
+ if '"' in value or ',' in value:
+ return '"' + value.replace('"', '\\"') + '"'
else:
return value
@@ -685,19 +735,29 @@ def _requires_empty_body(self, shape):
def _serialize_content_type(self, serialized, shape, shape_members):
"""Set Content-Type to application/json for all structured bodies."""
+ has_content_type = has_header('Content-Type', serialized['headers'])
+ if has_content_type:
+ return
payload = shape.serialization.get('payload')
if self._has_streaming_payload(payload, shape_members):
- # Don't apply content-type to streaming bodies
- return
-
- has_body = serialized['body'] != b''
- has_content_type = has_header('Content-Type', serialized['headers'])
- if has_body and not has_content_type:
- serialized['headers']['Content-Type'] = 'application/json'
+ if shape_members[payload].type_name == 'string':
+ serialized['headers']['Content-Type'] = 'text/plain'
+ elif shape_members[payload].type_name == 'blob':
+ serialized['headers']['Content-Type'] = (
+ 'application/octet-stream'
+ )
+ else:
+ if serialized['body'] != b'':
+ serialized['headers']['Content-Type'] = 'application/json'
def _serialize_body_params(self, params, shape):
serialized_body = self.MAP_TYPE()
self._serialize(serialized_body, params, shape)
+ # Handle document types as a payload
+ if list(serialized_body.keys()) == [None] and shape.metadata.get(
+ 'document'
+ ):
+ serialized_body = serialized_body[None]
return json.dumps(serialized_body).encode(self.DEFAULT_ENCODING)
@@ -722,12 +782,7 @@ def _serialize(self, shape, params, xmlnode, name):
def _serialize_type_structure(self, xmlnode, params, shape, name):
structure_node = ElementTree.SubElement(xmlnode, name)
- if 'xmlNamespace' in shape.serialization:
- namespace_metadata = shape.serialization['xmlNamespace']
- attribute_name = 'xmlns'
- if namespace_metadata.get('prefix'):
- attribute_name += f":{namespace_metadata['prefix']}"
- structure_node.attrib[attribute_name] = namespace_metadata['uri']
+ self._add_xml_namespace(shape, structure_node)
for key, value in params.items():
member_shape = shape.members[key]
member_name = member_shape.serialization.get('name', key)
@@ -735,9 +790,9 @@ def _serialize_type_structure(self, xmlnode, params, shape, name):
# xmlAttribute. Rather than serializing into an XML child node,
# we instead serialize the shape to an XML attribute of the
# *current* node.
- if value is None:
- # Don't serialize any param whose value is None.
- return
+ # if value is None:
+ # # Don't serialize any param whose value is None.
+ # return
if member_shape.serialization.get('xmlAttribute'):
# xmlAttributes must have a serialization name.
xml_attribute_name = member_shape.serialization['name']
@@ -753,6 +808,7 @@ def _serialize_type_list(self, xmlnode, params, shape, name):
else:
element_name = member_shape.serialization.get('name', 'member')
list_node = ElementTree.SubElement(xmlnode, name)
+ self._add_xml_namespace(shape, list_node)
for item in params:
self._serialize(member_shape, item, list_node, element_name)
@@ -765,16 +821,22 @@ def _serialize_type_map(self, xmlnode, params, shape, name):
#
The example tests how requests and responses are serialized when there's no request or response members.
While this should be rare, code generators must support this.
" + }, + "description": "Empty input serializes no extra query params", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EmptyInputAndEmptyOutput&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EndpointOperation operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "Foo": "val1", - "Bar": "val2", - "Yuck": "val3" - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Foo=val1&BarLocationName=val2&yuckQueryName=val3" - } - } - ] - }, - { - "description": "Nested structure members", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "StructArg": { - "shape": "StructType", - "locationName": "Struct" - } - } - }, - "StructType": { - "type": "structure", - "members": { - "ScalarArg": { - "shape": "StringType", - "locationName": "Scalar" - } - } - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "Ec2QueryEndpointTrait", + "given": { + "name": "EndpointOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "endpoint": { + "hostPrefix": "foo." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EndpointOperation&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "host": "foo.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EndpointWithHostLabelOperation operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "StructArg": { - "ScalarArg": "foo" - } + "shapes": { + "HostLabelInput": { + "type": "structure", + "required": [ + "label" + ], + "members": { + "label": { + "shape": "String", + "hostLabel": true + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Struct.Scalar=foo" - } - } - ] - }, - { - "description": "List types", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "Ec2QueryEndpointTraitWithHostLabel", + "given": { + "name": "EndpointWithHostLabelOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "HostLabelInput" + }, + "endpoint": { + "hostPrefix": "foo.{label}." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait, and can use the host label trait to define\nfurther customization based on user input.", + "params": { + "label": "bar" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EndpointWithHostLabelOperation&Version=2020-01-08&Label=bar", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "host": "foo.bar.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListArg": { - "shape": "ListType" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "Strings" - } - }, - "Strings": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "ListArg": [ - "foo", - "bar", - "baz" - ] + { + "description": "Test cases for HostWithPathOperation operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListArg.1=foo&ListArg.2=bar&ListArg.3=baz" - } - } - ] - }, - { - "description": "List with location name applied to member", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" + "shapes": {}, + "cases": [ + { + "id": "Ec2QueryHostWithPath", + "given": { + "name": "HostWithPathOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Custom endpoints supplied by users can have paths", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/custom/", + "body": "Action=HostWithPathOperation&Version=2020-01-08", + "host": "example.com/custom" + } + } + ], + "clientEndpoint": "https://example.com/custom" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListArg": { - "shape": "ListType", - "locationName": "ListMemberName" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "StringType", - "LocationName": "item" - } - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for NestedStructures operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "ListArg": [ - "a", - "b", - "c" - ] + "shapes": { + "NestedStructuresInput": { + "type": "structure", + "members": { + "Nested": { + "shape": "StructArg" + } + } + }, + "StructArg": { + "type": "structure", + "members": { + "StringArg": { + "shape": "String" + }, + "OtherArg": { + "shape": "Boolean" + }, + "RecursiveArg": { + "shape": "StructArg" + } + } + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListMemberName.1=a&ListMemberName.2=b&ListMemberName.3=c" - } - } - ] - }, - { - "description": "List with locationName and queryName", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListArg": { - "shape": "ListType", - "locationName": "ListMemberName", - "queryName": "ListQueryName" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "StringType", - "LocationName": "item" - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "Ec2NestedStructures", + "given": { + "name": "NestedStructures", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "NestedStructuresInput" + }, + "documentation": "This test serializes nested and recursive structure members.
" + }, + "description": "Serializes nested structures using dots", + "params": { + "Nested": { + "StringArg": "foo", + "OtherArg": true, + "RecursiveArg": { + "StringArg": "baz" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=NestedStructures&Version=2020-01-08&Nested.StringArg=foo&Nested.OtherArg=true&Nested.RecursiveArg.StringArg=baz", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for NoInputAndOutput operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "ListArg": [ - "a", - "b", - "c" - ] - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListQueryName.1=a&ListQueryName.2=b&ListQueryName.3=c" - } - } - ] - }, - { - "description": "Base64 encoded Blobs", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "BlobArg": { - "shape": "BlobType" - } - } - }, - "BlobType": { - "type": "blob" - } + "shapes": {}, + "cases": [ + { + "id": "Ec2QueryNoInputAndOutput", + "given": { + "name": "NoInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request payload or response members.
While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=NoInputAndOutput&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "BlobArg": "foo" + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&BlobArg=Zm9v" - } - } - ] - }, - { - "description": "Timestamp values", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "SDKAppliedContentEncoding_ec2Query", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "RjCEL3kBwqPivZUXGiyA5JCujtWgJAkKRlnTEsNYfBRGOS0f7LT6R3bCSOXeJ4auSHzQ4BEZZTklUyj5\n1HEojihShQC2jkQJrNdGOZNSW49yRO0XbnGmeczUHbZqZRelLFKW4xjru9uTuB8lFCtwoGgciFsgqTF8\n5HYcoqINTRxuAwGuRUMoNO473QT0BtCQoKUkAyVaypG0hBZdGNoJhunBfW0d3HWTYlzz9pXElyZhq3C1\n2PDB17GEoOYXmTxDecysmPOdo5z6T0HFhujfeJFIQQ8dirmXcG4F3v0bZdf6AZ3jsiVh6RnEXIPxPbOi\ngIXDWTMUr4Pg3f2LdYCM01eAb2qTdgsEN0MUDhEIfn68I2tnWvcozyUFpg1ez6pyWP8ssWVfFrckREIM\nMb0cTUVqSVSM8bnFiF9SoXM6ZoGMKfX1mT708OYk7SqZ1JlCTkecDJDoR5ED2q2MWKUGR6jjnEV0GtD8\nWJO6AcF0DptY9Hk16Bav3z6c5FeBvrGDrxTFVgRUk8SychzjrcqJ4qskwN8rL3zslC0oqobQRnLFOvwJ\nprSzBIwdH2yAuxokXAdVRa1u9NGNRvfWJfKkwbbVz8yV76RUF9KNhAUmwyYDrLnxNj8ROl8B7dv8Gans\n7Bit52wcdiJyjBW1pAodB7zqqVwtBx5RaSpF7kEMXexYXp9N0J1jlXzdeg5Wgg4pO7TJNr2joiPVAiFf\nefwMMCNBkYx2z7cRxVxCJZMXXzxSKMGgdTN24bJ5UgE0TxyV52RC0wGWG49S1x5jGrvmxKCIgYPs0w3Z\n0I3XcdB0WEj4x4xRztB9Cx2Mc4qFYQdzS9kOioAgNBti1rBySZ8lFZM2zqxvBsJTTJsmcKPr1crqiXjM\noVWdM4ObOO6QA7Pu4c1hT68CrTmbcecjFcxHkgsqdixnFtN6keMGL9Z2YMjZOjYYzbUEwLJqUVWalkIB\nBkgBRqZpzxx5nB5t0qDH35KjsfKM5cinQaFoRq9y9Z82xdCoKZOsUbxZkk1kVmy1jPDCBhkhixkc5PKS\nFoSKTbeK7kuCEZCtR9OfF2k2MqbygGFsFu2sgb1Zn2YdDbaRwRGeaLhswta09UNSMUo8aTixgoYVHxwy\nvraLB6olPSPegeLOnmBeWyKmEfPdbpdGm4ev4vA2AUFuLIeFz0LkCSN0NgQMrr8ALEm1UNpJLReg1ZAX\nzZh7gtQTZUaBVdMJokaJpLk6FPxSA6zkwB5TegSqhrFIsmvpY3VNWmTUq7H0iADdh3dRQ8Is97bTsbwu\nvAEOjh4FQ9wPSFzEtcSJeYQft5GfWYPisDImjjvHVFshFFkNy2nN18pJmhVPoJc456tgbdfEIdGhIADC\n6UPcSSzE1FxlPpILqZrp3i4NvvKoiOa4a8tnALd2XRHHmsvALn2Wmfu07b86gZlu4yOyuUFNoWI6tFvd\nbHnqSJYNQlFESv13gJw609DBzNnrIgBGYBAcDRrIGAnflRKwVDUnDFrUQmE8xNG6jRlyb1p2Y2RrfBtG\ncKqhuGNiT2DfxpY89ektZ98waPhJrFEPJToNH8EADzBorh3T0h4YP1IeLmaI7SOxeuVrk1kjRqMK0rUB\nlUJgJNtCE35jCyoHMwPQlyi78ZaVv8COVQ24zcGpw0MTy6JUsDzAC3jLNY6xCb40SZV9XzG7nWvXA5Ej\nYC1gTXxF4AtFexIdDZ4RJbtYMyXt8LsEJerwwpkfqvDwsiFuqYC6vIn9RoZO5kI0F35XtUITDQYKZ4eq\nWBV0itxTyyR5Rp6g30pZEmEqOusDaIh96CEmHpOBYAQZ7u1QTfzRdysIGMpzbx5gj9Dxm2PO1glWzY7P\nlVqQiBlXSGDOkBkrB6SkiAxknt9zsPdTTsf3r3nid4hdiPrZmGWNgjOO1khSxZSzBdltrCESNnQmlnP5\nZOHA0eSYXwy8j4od5ZmjA3IpFOEPW2MutMbxIbJpg5dIx2x7WxespftenRLgl3CxcpPDcnb9w8LCHBg7\nSEjrEer6Y8wVLFWsQiv6nTdCPZz9cGqwgtCaiHRy8lTWFgdfWd397vw9rduGld3uUFeFRGjYrphqEmHi\nhiG0GhE6wRFVUsGJtvOCYkVREvbEdxPFeJvlAvOcs9HKbtptlTusvYB86vR2bNcIY4f5JZu2X6sGa354\n7LRk0ps2zqYjat3hMR7XDC8KiKceBteFsXoDjfVxTYKelpedTxqWAafrKhaoAVuNM98PSnkuIWGzjSUC\nNsDJTt6vt1D1afBVPWVmnQ7ZQdtEtLIEwAWYjemAztreELIr1E9fPEILm1Ke4KctP9I0I72Dh4eylNZD\n0DEr2Hg7cWFckuZ0Av5d0IPRARXikEGDHl8uh12TXL9v2Uh0ZVSJMEYvxGSbZvkWz8TjWSk3hKA2a7GL\nJm3Ho7e1C34gE1XRGcEthxvURxt4OKBqN3ZNaMIuDTWinoQAutMcUqtm4MoL7RGPiCHUrvTwQPSirsmA\nQmOEu8nOpnP77Fivh9jLGx5ta7nL6jrsWUsBqiN1lzpdPYLRR4mUIAj6sNWiDEk4pkbHSMEcqbWw6Zl7\npsEyPDHalCNhWMA3RSK3skURzQDZ0oBV5W7vjVIZ4d3uCKsk6zrzEI9u5mx7p9RdNKodXfzqYt0ULdtc\n3RW0hIfw2KvrO3BD2QrtgAkfrFBGVvlJSUoh0MvLz8DeXxfuiuq9Ttu7wvsqVI4Piah6WNEXtHHGPJO3\nGhc75Bnv2To4VS2v8rmyKAPIIVTuYBHZN6sZ4FhFzbrslCIdk0eadaU60naqiNWU3CsxplIYGyeThmJ7\n9u4h6Y2OmiPZjFPS2bAzwgAozYTVefII9aEaWZ0hxHZeu1FW7r79dkdO73ZqRfas9u8Z7LLBPCw5pV0F\n5I0pHDgNb6MogoxF4NZJfVtIX1vCHhhVLrXjrYNJU2fD9Fw8kT8Ie2HDBJnqAvYKmryQ1r9ulo3Me3rH\nq9s2Y5uCDxu9iQNhnpwIm57WYGFeqd2fnQeY2IziD3Jgx0KSrmOH0jgi0RwJyfGXaORPq3bQQqljuACo\nkO6io9t5VI8PbNxSHTRbtYiPciUslbT0g7SpCLrRPOBRJ4DDk56pjghpeoUagJ5xJ4wjBzBuXnAGkNnP\nTfpiuz2r3oSBAi8sB9wiYK2z9sp4gZyQsqdVNzAEgKatOxBRBmJCBYpjO98ZQrF83XApPpfFg0ujB2PW\n1iYF9NkgwIKB5oB6KVTOmSKJk11mVermPgeugHbzdd2zUP6fP8fWbhseqk2t8ahGvqjs2CDHFIWXl5jc\nfCknbykE3ANt7lnAfJQ2ddduLGiqrX4HWx6jcWw08Es6BkleO0IDbaWrb95d5isvFlzJsf0TyDIXF4uq\nbBDCi0XPWqtRJ2iqmnJa2GbBe9GmAOWMkBFSilMyC4sR395WSDpD56fx0NGoU6cHrRu9xF2Bgh7RGSfl\nch2GXEeE02fDpSHFNvJBlOEqqfkIX6oCa6KY9NThqeIjYsT184XR2ZI7akXRaw1gMOGpk4FmUxk6WIuX\n4ei1SLQgSdl7OEdRtJklZ76eFrMbkJQ2TDhu8f7mVuiy53GUMIvCrP9xYGZGmCIDm2e4U2BDi3F7C5xK\n3bDZXwlQp6z4BSqTy2OVEWxXUJfjPMOL5Mc7AvDeKtxAS73pVIv0HgHIa4NBAdC7uLG0zXuu1FF6z2XY\nyUhk03fMZhYe7vVxsul3WE7U01fuN8z2y0eKwBW1RFBE1eKIaR9Y01sIWQWbSrfHfDrdZiElhmhHehfs\n0EfrR4sLYdQshJuvhTeKGJDaEhtPQwwJ9mUYGtuCL9RozWx1XI4bHNlzBTW0BVokYiJGlPe7wdxNzJD7\nJgS7Lwv6jGKngVf86imGZyzqwiteWFPdNUoWdTvUPSMO5xIUK9mo5QpwbBOAmyYzVq42o3Qs90N9khEV\nU36LB99fw8PtGHH5wsCHshfauwnNPj0blGXzke0kQ4JNCVH7Jtn0Y0aeejkSxFtwtxoYs6zHl1Lxxpsd\nsw5vBy49CEtoltDW367lVAwDjWdx20msGB7qJCkEDrzu7EXSO22782QX9NBRcN9ppX0C25I0FMA4Wnhz\n9zIpiXRrsTH35jzM8Cjt4EVLGNU3O0HuEvAer3cENnMJtngdrT86ox3fihMQbiuy4Bh4DEcP5in2VjbT\n3qbnoCNvOi8Fmmf7KlGlWAOceL5OHVE5lljjQEMzEQOCEgrk5mDKgwSBJQBNauIDSC1a5iEQjB8Xxp4C\nqeKyyWY9IOntNrtU5ny4lNprHJd36dKFeBLKcGCOvgHBXdOZloMF0YTRExw7hreEO9IoTGVHJ4teWsNr\nHdtagUHjkeZkdMMfnUGNv5aBNtFMqhcZH6EitEa9lGPkKBbJpoom3u8D8EHSIF1H5EZqqx9TLY5hWAIG\nPwJ4qwkpCGw5rCLVrjw7ARKukIFzNULANqjHUMcJ002TlUosJM4xJ4aAgckpLVGOGuPDhGAAexEcQmbg\nUsZdmqQrtuVUyyLteLbLbqtR6CTlcAIwY3xyMCmPgyefE0FEUODBoxQtRUuYTL9RC5o1sYb2PvcxUQfb\niJFi2CAl99pAzcckU2qVCxniARslIxM5pmMRGsQX9ZzYAfZrbg6ce6S74I8UMlgRQ2QVyvUjKKOE6IrJ\nLng370emHfe5m6LZULD5YiZutkD5ipjL2Bz77DvTE5kNPUhuoKBcTJcUgytfXAKUTWOcRKNlq0GImrxM\nJfr7AWbLFFNKGLeTrVDBwpcokJCv0zcOKWe8fd2xkeXkZTdmM66IgM27cyYmtQ6YF26Kd0qrWJeVZJV9\n3fyLYYvKN5csbRY2BHoYE5ERARRW65IrpkXMf48OrCXMtDIP0Z7wxI9DiTeKKeH4uuguhCJnwzR3WxLA\nVU6eBJEd7ZjS6JA83w7decq8uDI7LGKjcz1FySp3B7fE9DkHRGXxbsL7Fjar6vW2mAv8CuvI20B6jctp\n2yLDs24sPfB3sSxrrlhbuT1m6DZqiN0dl6umKx7NGZhmOTVGr20jfcxhqPQwTJfd7kel4rvxip4BqkvT\n7STy8knJ2BXGyJeNgwo1PXUZRDVy0LCTsSF1RFuRZe8cktHl9lgw8ntdPn1pVFL0MwJkJfdXBNUp5gNv\n50FTkrpo1t6wq4CVbcfj2XOrOzvBUzNH26sXGABI1gGxCdp2jEZrHgqQaWIaTJVTuguZhxqDvdYsrwFW\nYN58uuNcKHIrGdRSigyZInwQDYk0pjcqdSeU0WVU3Y9htzZBR7XRaCJr5YTZvq7fwermb5tuwb37lPLq\nB2IGg0iftkVbXaSyfCwVaRbfLBb88so0QqpmJGirFu8FcDiXOV1zTr8yW9XLdYQuUjh43xrXLdgsuYff\nCagInUk1eU1aLjVZoJRsNmStmOEpAqlYMwTvx7w6j2f421Cxr5cNZBIVlAxlXN2QiDqJ9v3sHhHkTanc\nlQuH8ptUyX8qncpBuXXBn7cSez9N0EoxCBl1GHUagbjstgJo4gzLvTmVIY6MiWYOBitzNUHfyqKwtKUr\nVoSCdZcGeA9lHUPA7PUprRRaT3m1hGKPyshtVS2ikG48w3oVerln1N1qGdtz46gZCrndw3LZ1B362RfW\nzDPuXbpsyLsRMTt1Rz1oKHRXp3iE41hkhQH6pxlvyCW2INnHt5XU8zRamOB3oW0udOhMpQFDjRkOcy06\nb4t0QTHvoRqmBna3WXzIMZyeK3GChF5eF8oDXRbjhk7BB6YKCgqwWUzEJ5K47HMSlhFkBUjaPRjdGM0z\nzOMwhW6b1NvSwP7XM1P5yi1oPvOspts1vr29SXqrMMrBhVogeodWyd69NqrO4jkyBxKmlXifoTowpfiY\n2cUCE0XMZqxUN39LCP09JqZifaEcBEo3mgtm1tWu5QR2GNq7UyQf4RIPSDOpDCAtwoPhRgdT1lJdcj4U\nlnH0wrJ8Uwu7c08L7ErnIrDATqCrOjpSbzGP1xHENABYONC4TknFPrJ8pe40A8fzGT0qBw9mAM1SKcHO\nfoiLcMC9AjHTqJzDG3xplSLPG9or2rMeq7Fzp9r0y7uJRMxgg51EbjfvYlH466A3ggvL2WQlDXjJqPW3\nBJGWAWDNN9LK8f46bADKPxakpkx23S9O47rGSXfDhVSIZsDympxWX1UOzWwMZRHkofVeKqizgbKkGgUT\nWykE9gRoRAOd9wfHZDYKa9i0LaPDiaUMvnU1gdBIqIoiVsdJ9swX47oxvMtOxtcS0zlD6llDkBuIiU5g\nPwRCYmtkkb25c8iRJXwGFPjI1wJ34I1z1ENicPdosPiUe9ZC2jnXIKzEdv01x2ER7DNDF3yxOwOhxNxI\nGqsmC92j25UQQFu9ZstOZ28AoCkuOYs0Uycm5u8jR1T39dMBwrko09rC65ENLnsxM8oebmyFCPiGJ1ED\n5Xqc9qZ237f1OnETAoEOwqUSvrdPTv56U7hV91EMTyC812MLQpr2710E3VVpsUCUMNhIxdt7UXZ1UNFb\njgzpZLXnf4DHrv6B7kq6UI50KMxcw1HZE2GpODfUTzNFLaqdrvzxKe5eUWdcojBaRbD4fFdVYJTElYDH\nNNVh6ofkoeWcs9CWGFmSBe0T4K8phFeygQg0prKMELNEy6qENzVtG9ZDcqj3a7L6ZLtvq50anWp7fAVu\nfwz55g4iM2Z2fA0pnwHDL7tt67zTxGITvsnJsZSpeq1EQsZcwtkBV9liu7Rl7jiVT1IIRtchB8TsTiaA\nwVHIQQ9RIOTiPQdKNqi1kC9iGlUqWK93gblNWlBw1eYB9Wk8FQogutwTf0caNMx8D4nPbANcmOOlskIy\nzALh15OlTrWnhP95rf08AN2J026zDE2DUF9k0eCevYBQIDjqKNW4XCZnjbHoIcKzbY5VzPbMs3ZyMz8K\nSucBmgPg6wrSK5ykbkapS5vuqvXc9GbjQJ8bPNzoxoWGyjbZvDs2OBrIqBmcQb2DLJ8v38McQ4mC4UsS\njf4PyfSCtpk274QZjvLCZbLiCBxQegk7jUU0NmTFJAcYCxd9xMWdlFkiszcltT2YzwuFFz7iA6aa4n5L\nHpBNfUA01GcAi1aCMYhmooS4zSlYcSOZkovMz36U3Fd9WtqIEOJLi7HMgHQDgNMdK6DTzAdHQtxerxVF\nHJnPrfNVG7270r3bp0bPnLNYLhObbAn6zqSAUeLtI2Y4KJDjBKCAh2vvYGbu0e2REYJWRj7MkGevsSSy\nb1kCXLt6tKGWAb7lt5c0xyJgUIJW7pdtnwgT0ZCa24BecCAwNnG5U2EwQbcjZGsFxqNGfaemd3oFEhES\nBaE0Fxms9UKTnMafu8wvZ2xymMrUduuRzOjDeX7oD5YsLC88V8CGMLxbbxIpt94KGykbr6e7L0R4oZl1\ntKMgFwQ2p9Txdbp0Y293LcsJymKizqI0F2xEp7y4SmWOJqHZtsbz80wVV9nv41CvtfxuSoGZJ5cNB7pI\nBgzNcQCeH3Jt0RaGGwboxxpuFbzilmkMFXxJm87tD4WNgu01nHfGCKeQcySEBZpVfJgi6sDFJ8uWnvKm\n9mPLHurtWzEfKqUEa1iC71bXjw5wrvhv9BYW8JSUELHmDquftQyKdq0DZXhULMHGQLf4e95WIaoA14LL\nbThz77kuhKULPTu2MNrBUKGorurhGugo5gs4ZUezSsUOe3KxYdrFMdGgny1GgTxMSMTp2RAZytKjv4kQ\nVx7XgzvpQLIbDjUPAkJv6lScwIRq1W3Ne0Rh0V6Bmn6U5uIuWnJjULmbaQiSODj3z0mAZvak0mSWIGwT\nTX83HztcC4W7e1f6a1thmcc5K61Icehla2hBELWPpixTkyC4eEVmk9Rq0m0ZXtx0JX2ZQXqXDEyePyMe\nJ70sdSzXk72zusqhY4yuOMGgbYNHqxOToK6NxujR7e4dV3Wk5JnSUthym8scjcPeCiKDNY4cHfTMnDXJ\n9zLVy01LtNKYpJ1s8FxVxigmxQNKEbIamxhx6yqwGC4aiISVOOUEjvNOdaUfXfUsE6jEwtwxyGxjlRK1\ncLyxXttq4QWN6PehgHv7jXykzPjInbEysebFvvPOOMdunmJvcCNMSvjUda8fL6xfGo0FDrLg8XZipd6S\noPVdYtyIM1Dg40KbBA3JuumPYtXuJaHrZnjZmdnM5OVo4ZNxktfCVT0c6bnD4bAeyn4bYt1ZPaX6hQHh\nJtvNYfpD0ONYlmqKuToQAMlz52Fh6bj45EbX89L5eLlSpWeyBlGotzriB0EPlclrGi5l2B5oPb1aB1ag\nyyYuu44l0F1oOVYnBIZsxIsHVITxi9lEuVPFkWASOUNuVQXfM4n5hxWR9qtuKnIcPsvbJsv1U10XlKh3\nKisqPhHU15xrCLr5gwFxPUKiNTLUBrkzgBOHXPVsHcLCiSD0YU56TRGfvEom43TWUKPPfl9Z54tgVQuT\njCRlaljAzeniQIcbbHZnn3f0HxbDG3DFYqWSxNrXabHhRsIOhhUHSPENyhGSTVO5t0XX5CdMspJPCd02\n3Oqv32ccbUK4O3YH6LEvp0WO3kSl5n50odVkI9B0i0iq4UPFGMkM8bEQJbgJoOH71P10vtdevJFQE4g2\nyhimiM53ZJRWgSZveHtENZc0Gjo0F9eioak9BnPpY1QxAFPC817svuhEstcU69bLCA4D1rO5R8AuIIBq\nyQJcifFLvbpAEYTLKJqysZrU8EEl3TSdC13A9hZvk4NC8VGEDAxcNrKw313dZp17kZPO5HSd1y6sljAW\nA9M1d6FMYV5SlBWf3WZNCUPS7qKNlda2YBsC6IUVB363f5RLGQOQHwbaijBSRCkrVoRxBHtc0Bd5J9V9\nP5uMTXkpZOxRcCQvImGgcmGuxxLb5zTqfS2xu7v3Sf3IIesSt9tVzcEcdbEvLGVJkLk4mb3G30DbIbri\nPZ09JkweDvMaQ3bxT2nfkz3Ilihkw9jqikkCCCz7E8h6z6KbhQErEW9VzJZzMCgJsyPjFam6iNwpe07S\nhyOvNVw2t9wpzL5xM11DvVzQwDaWEytNRHzDBs4KwEtpI2IpjUyVZHSwA0UGqqkzoCgrJFlNOvPlXqcS\nIcREouUIBmuttkrhPWJtSxOOgpsdvBR3kTOzAXNzSKxoaBAb0c5SDMUc6FIyGA8x5wg5DkUgjFUUodEt\nOYaB2VHVePW9mxHeBTdKWLzJow4ZZvjnoBuVigXljKCNh137ckV2y3Yg3Xi4UzJEI2V5Rw9AfnMs7xUw\nVHOFCg189maD3bmZAe7b4eaGZhyy4HVKjqCXmIH7vsEjRvbnfB0SQxxpuqBDJbHNCtW4vM643ZQQBVPP\na7oXSQIq9w2dHp0A7dtkocCZdQp9FKR9XdJAFIbVSHzIF1ZogeZlc0pXuNE0tagvD57xwDRFkAuoQyMu\nYDdZasXrpSmEE5UjHVkyYsISn8QsfXurzDybX468aoRoks654jjmRY5zi1oB8TcMdC2c3sicNaqfeuhd\nH1nPX7l4RpdqWMR7gGx9slXtG8S3KxpOi4qCD7yg3saD66nun4dzksQURoTUdXyrJR5UpHsfIlTF1aJa\nMdXyQtQnrkl00TeghQd00rRFZsCnhi0qrCSKiBfB2EVrd9RPpbgwJGZHuIQecdBmNetc2ylSEClqVBPR\nGOPPIxrnswEZjmnS0jxKW9VSM1QVxSPJnPFswCqT95SoKD6CP4xdX28WIUGiNaIKodXXJHEIsXBCxLsr\nPwWPCtoplC6hhpKmW5dQo92iCTyY2KioKzO8XR6FKm6qonMKVEwQNtlYE9c97KMtEnp25VOdMP46SQXS\nYsSVp7vm8LP87VYI8SOKcW3s2oedYFtt45rvDzoTF0GmS6wELQ9uo98HhjQAI1Dt91cgjJOwygNmLoZE\nX5K2zQiNA163uMCl5xzaBqY4YTL0wgALg3IFdYSp0RFYLWdt6IxoGI1tnoxcjlUEPo5eGIc3mS3SmaLn\nOdumfUQQ4Jgmgaa5anUVQsfBDrlAN5oaX7O0JO71SSPSWiHBsT9WIPy2J1Cace9ZZLRxblFPSXcvsuHh\nhvnhWQltEDAe7MgvkFQ8lGVFa8jhzijoF9kLmMhMILSzYnfXnZPNP7TlAAwlLHK1RqlpHskJqb6CPpGP\nQvOAhEMsM3zJ2KejZx0esxkjxA0ZufVvGAMN3vTUMplQaF4RiQkp9fzBXf3CMk01dWjOMMIEXTeKzIQe\nEcffzjixWU9FpAyGp2rVl4ETRgqljOGw4UgK31r0ZIEGnH0xGz1FtbW1OcQM008JVujRqulCucEMmntr\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is NOT in the Content-Encoding header since HTTP binding\ntraits are ignored in the ec2Query protocol.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "TimeArg": { - "shape": "TimestampType" - }, - "TimeCustom": { - "timestampFormat": "unixTimestamp", - "shape": "TimestampType" - }, - "TimeFormat": { - "shape": "TimestampFormatType" - } - } - }, - "TimestampFormatType": { - "timestampFormat": "unixTimestamp", - "type": "timestamp" - }, - "TimestampType": { - "type": "timestamp" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for QueryIdempotencyTokenAutoFill operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "TimeArg": 1422172800, - "TimeCustom": 1422172800, - "TimeFormat": 1422172800 + "shapes": { + "QueryIdempotencyTokenAutoFillInput": { + "type": "structure", + "members": { + "token": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&TimeArg=2015-01-25T08%3A00%3A00Z&TimeCustom=1422172800&TimeFormat=1422172800" - } - } - ] - }, - { - "description": "Idempotency token auto fill", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Token": { - "shape": "StringType", - "idempotencyToken": true - } - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "Ec2ProtocolIdempotencyTokenAutoFill", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Automatically adds idempotency token when not set", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryIdempotencyTokenAutoFill&Version=2020-01-08&Token=00000000-0000-4000-8000-000000000000", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2ProtocolIdempotencyTokenAutoFillIsSet", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Uses the given idempotency token as-is", + "params": { + "token": "00000000-0000-4000-8000-000000000123" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryIdempotencyTokenAutoFill&Version=2020-01-08&Token=00000000-0000-4000-8000-000000000123", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for QueryLists operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "Token": "abc123" + "shapes": { + "QueryListsInput": { + "type": "structure", + "members": { + "ListArg": { + "shape": "StringList" + }, + "ComplexListArg": { + "shape": "GreetingList" + }, + "ListArgWithXmlNameMember": { + "shape": "ListWithXmlName" + }, + "ListArgWithXmlName": { + "shape": "ListWithXmlName", + "locationName": "Hi" + }, + "NestedWithList": { + "shape": "NestedStructWithList" + } + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "GreetingList": { + "type": "list", + "member": { + "shape": "GreetingStruct" + } + }, + "ListWithXmlName": { + "type": "list", + "member": { + "shape": "String", + "locationName": "item" + } + }, + "NestedStructWithList": { + "type": "structure", + "members": { + "ListArg": { + "shape": "StringList" + } + } + }, + "String": { + "type": "string" + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Token=abc123" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Token=00000000-0000-4000-8000-000000000000" - } - } - ] - }, - { - "description": "Endpoint host trait", - "metadata": { - "protocol": "ec2", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "Ec2Lists", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Serializes query lists. All EC2 lists are flattened.", + "params": { + "ListArg": [ + "foo", + "bar", + "baz" + ], + "ComplexListArg": [ + { + "hi": "hello" + }, + { + "hi": "hola" + } + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&ListArg.1=foo&ListArg.2=bar&ListArg.3=baz&ComplexListArg.1.Hi=hello&ComplexListArg.2.Hi=hola", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "Ec2EmptyQueryLists", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Does not serialize empty query lists.", + "params": { + "ListArg": [] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "Ec2ListArgWithXmlNameMember", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "An xmlName trait in the member of a list has no effect on the list serialization.", + "params": { + "ListArgWithXmlNameMember": [ + "A", + "B" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&ListArgWithXmlNameMember.1=A&ListArgWithXmlNameMember.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "Ec2ListMemberWithXmlName", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Changes the name of the list using the xmlName trait", + "params": { + "ListArgWithXmlName": [ + "A", + "B" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&Hi.1=A&Hi.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "Ec2ListNestedStructWithList", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Nested structure with a list member", + "params": { + "NestedWithList": { + "ListArg": [ + "A", + "B" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&NestedWithList.ListArg.1=A&NestedWithList.ListArg.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "clientEndpoint": "https://service.region.amazonaws.com", - "shapes": { - "StaticInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - } - } - }, - "MemberRefInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType", - "hostLabel": true - } - } - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "name": "StaticOp", - "input": { - "shape": "StaticInputShape" - }, - "endpoint":{ - "hostPrefix": "data-" - } + { + "description": "Test cases for QueryTimestamps operation", + "metadata": { + "protocol": "ec2", + "protocols": [ + "ec2" + ], + "apiVersion": "2020-01-08" }, - "params": { - "Name": "myname" + "shapes": { + "QueryTimestampsInput": { + "type": "structure", + "members": { + "normalFormat": { + "shape": "Timestamp" + }, + "epochMember": { + "shape": "SyntheticTimestamp_epoch_seconds" + }, + "epochTarget": { + "shape": "EpochSeconds" + } + } + }, + "Timestamp": { + "type": "timestamp" + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=StaticOp&Version=2014-01-01&Name=myname", - "host": "data-service.region.amazonaws.com" - } - }, - { - "given": { - "name": "MemberRefOp", - "input": { - "shape": "MemberRefInputShape" - }, - "endpoint":{ - "hostPrefix": "foo-{Name}." - } + "cases": [ + { + "id": "Ec2TimestampsInput", + "given": { + "name": "QueryTimestamps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryTimestampsInput" + }, + "documentation": "This test serializes timestamps.
This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes strings", + "params": { + "Foo": "val1", + "Bar": "val2" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Foo=val1&Bar=val2", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2SimpleInputParamsStringAndBooleanTrue", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes booleans that are true", + "params": { + "Foo": "val1", + "Baz": true + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Foo=val1&Baz=true", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2SimpleInputParamsStringsAndBooleanFalse", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes booleans that are false", + "params": { + "Baz": false + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Baz=false", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2SimpleInputParamsInteger", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes integers", + "params": { + "Bam": 10 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Bam=10", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2SimpleInputParamsFloat", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes floats", + "params": { + "Boo": 10.8 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Boo=10.8", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2SimpleInputParamsBlob", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Blobs are base64 encoded in the query string", + "params": { + "Qux": "value" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Qux=dmFsdWU%3D", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2Enums", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes enums in the query string", + "params": { + "FooEnum": "Foo" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FooEnum=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2Query", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes query using ec2QueryName trait.", + "params": { + "HasQueryName": "Hi" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&HasQueryName=Hi", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2QueryIsPreferred", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "ec2QueryName trait is preferred over xmlName.", + "params": { + "HasQueryAndXmlName": "Hi" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&HasQueryAndXmlName=Hi", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2XmlNameIsUppercased", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "xmlName is used with the ec2 protocol, but the first character is uppercased", + "params": { + "UsesXmlName": "Hi" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&UsesXmlName=Hi", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2QuerySupportsNaNFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling NaN float values.", + "params": { + "FloatValue": "NaN", + "Boo": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=NaN&Boo=NaN", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2QuerySupportsInfinityFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling Infinity float values.", + "params": { + "FloatValue": "Infinity", + "Boo": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=Infinity&Boo=Infinity", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "Ec2QuerySupportsNegativeInfinityFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling -Infinity float values.", + "params": { + "FloatValue": "-Infinity", + "Boo": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=-Infinity&Boo=-Infinity", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] + } ] diff --git a/tests/unit/protocols/input/json.json b/tests/unit/protocols/input/json.json index 5672848a90..2187e52a52 100644 --- a/tests/unit/protocols/input/json.json +++ b/tests/unit/protocols/input/json.json @@ -1,906 +1,2366 @@ [ - { - "description": "Scalar members", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - } - } - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "Name": "myname" + { + "description": "Test cases for EmptyOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "serialized": { - "body": "{\"Name\": \"myname\"}", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/" - } - } - ] - }, - { - "description": "Timestamp values", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "TimeArg": { - "shape": "TimestampType" - }, - "TimeCustom": { - "timestampFormat": "rfc822", - "shape": "TimestampType" - }, - "TimeFormat": { - "shape": "TimestampFormatType" - } - } - }, - "TimestampFormatType": { - "timestampFormat": "rfc822", - "type": "timestamp" - }, - "TimestampType": { - "type": "timestamp" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "TimeArg": 1422172800, - "TimeCustom": 1422172800, - "TimeFormat": 1422172800 - }, - "serialized": { - "body": "{\"TimeArg\": 1422172800, \"TimeCustom\": \"Sun, 25 Jan 2015 08:00:00 GMT\", \"TimeFormat\": \"Sun, 25 Jan 2015 08:00:00 GMT\"}", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/" - } - } - ] - }, - { - "description": "Base64 encoded Blobs", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "BlobArg": { - "shape": "BlobType" - }, - "BlobMap": { - "shape": "BlobMapType" - } - } - }, - "BlobType": { - "type": "blob" - }, - "BlobMapType": { - "type": "map", - "key": {"shape": "StringType"}, - "value": {"shape": "BlobType"} - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "sends_requests_to_slash", + "given": { + "name": "EmptyOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Sends requests to /", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.EmptyOperation" + } + } + }, + { + "id": "includes_x_amz_target_and_content_type", + "given": { + "name": "EmptyOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Includes X-Amz-Target header and Content-Type", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.EmptyOperation" + } + } + }, + { + "id": "json_1_1_client_sends_empty_payload_for_no_input_shape", + "given": { + "name": "EmptyOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Clients must always send an empty JSON object payload for\noperations with no input (that is, `{}`). While AWS service\nimplementations support requests with no payload or requests\nthat send `{}`, always sending `{}` from the client is\npreferred for forward compatibility in case input is ever\nadded to an operation.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.EmptyOperation" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "BlobArg": "foo" - }, - "serialized": { - "body": "{\"BlobArg\": \"Zm9v\"}", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EndpointOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "BlobMap": { - "key1": "foo", - "key2": "bar" - } - }, - "serialized": { - "body": "{\"BlobMap\": {\"key1\": \"Zm9v\", \"key2\": \"YmFy\"}}", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/" - } - } - ] - }, - { - "description": "Nested blobs", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListParam": { - "shape": "ListOfStructures" - } - } - }, - "ListOfStructures": { - "type": "list", - "member": { - "shape": "BlobType" - } - }, - "BlobType": { - "type": "blob" - } + "shapes": {}, + "cases": [ + { + "id": "AwsJson11EndpointTrait", + "given": { + "name": "EndpointOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "endpoint": { + "hostPrefix": "foo." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.EndpointOperation" + }, + "host": "foo.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "cases": [ - { - "given": { - "http": { - "method": "POST" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EndpointWithHostLabelOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "ListParam": ["foo", "bar"] + "shapes": { + "HostLabelInput": { + "type": "structure", + "required": [ + "label" + ], + "members": { + "label": { + "shape": "String", + "hostLabel": true + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "body": "{\"ListParam\": [\"Zm9v\", \"YmFy\"]}", - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - } - } - } - ] - }, - { - "description": "Recursive shapes", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" + "cases": [ + { + "id": "AwsJson11EndpointTraitWithHostLabel", + "given": { + "name": "EndpointWithHostLabelOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "HostLabelInput" + }, + "endpoint": { + "hostPrefix": "foo.{label}." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait, and can use the host label trait to define\nfurther customization based on user input.", + "params": { + "label": "bar" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"label\": \"bar\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.EndpointWithHostLabelOperation" + }, + "host": "foo.bar.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "RecursiveStruct": { - "shape": "RecursiveStructType" - } - } - }, - "RecursiveStructType": { - "type": "structure", - "members": { - "NoRecurse": { - "shape": "StringType" - }, - "RecursiveStruct": { - "shape": "RecursiveStructType" - }, - "RecursiveList": { - "shape": "RecursiveListType" - }, - "RecursiveMap": { - "shape": "RecursiveMapType" - } - } - }, - "RecursiveListType": { - "type": "list", - "member": { - "shape": "RecursiveStructType" - } - }, - "RecursiveMapType": { - "type": "map", - "key": { - "shape": "StringType" + { + "description": "Test cases for HostWithPathOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "value": { - "shape": "RecursiveStructType" - } - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "AwsJson11HostWithPath", + "given": { + "name": "HostWithPathOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Custom endpoints supplied by users can have paths", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/custom/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.HostWithPathOperation" + }, + "host": "example.com/custom" + } + } + ], + "clientEndpoint": "https://example.com/custom" }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "NoRecurse": "foo" - } + { + "description": "Test cases for JsonEnums operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" + "shapes": { + "JsonEnumsInputOutput": { + "type": "structure", + "members": { + "fooEnum1": { + "shape": "FooEnum" + }, + "fooEnum2": { + "shape": "FooEnum" + }, + "fooEnum3": { + "shape": "FooEnum" + }, + "fooEnumList": { + "shape": "FooEnumList" + }, + "fooEnumSet": { + "shape": "FooEnumSet" + }, + "fooEnumMap": { + "shape": "FooEnumMap" + } + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "FooEnumSet": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "FooEnumMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "FooEnum" + } + }, + "String": { + "type": "string" } - } }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - } + "cases": [ + { + "id": "AwsJson11Enums", + "given": { + "name": "JsonEnums", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonEnumsInputOutput" + }, + "documentation": "This example serializes enums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "fooEnum1": "Foo", + "fooEnum2": "0", + "fooEnum3": "1", + "fooEnumList": [ + "Foo", + "0" + ], + "fooEnumSet": [ + "Foo", + "0" + ], + "fooEnumMap": { + "hi": "Foo", + "zero": "0" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"fooEnum1\": \"Foo\",\n \"fooEnum2\": \"0\",\n \"fooEnum3\": \"1\",\n \"fooEnumList\": [\n \"Foo\",\n \"0\"\n ],\n \"fooEnumSet\": [\n \"Foo\",\n \"0\"\n ],\n \"fooEnumMap\": {\n \"hi\": \"Foo\",\n \"zero\": \"0\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonEnums" + } + } } - } - }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"RecursiveStruct\": {\"RecursiveStruct\": {\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}}}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "NoRecurse": "bar" - } - ] - } - }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"RecursiveList\": [{\"NoRecurse\": \"foo\"}, {\"NoRecurse\": \"bar\"}]}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "RecursiveStruct": { - "NoRecurse": "bar" - } - } - ] - } - }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"RecursiveList\": [{\"NoRecurse\": \"foo\"}, {\"RecursiveStruct\": {\"NoRecurse\": \"bar\"}}]}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + ] + }, + { + "description": "Test cases for JsonIntEnums operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "RecursiveStruct": { - "RecursiveMap": { - "foo": { - "NoRecurse": "foo" - }, - "bar": { - "NoRecurse": "bar" - } + "shapes": { + "JsonIntEnumsInputOutput": { + "type": "structure", + "members": { + "intEnum1": { + "shape": "IntegerEnum" + }, + "intEnum2": { + "shape": "IntegerEnum" + }, + "intEnum3": { + "shape": "IntegerEnum" + }, + "intEnumList": { + "shape": "IntegerEnumList" + }, + "intEnumSet": { + "shape": "IntegerEnumSet" + }, + "intEnumMap": { + "shape": "IntegerEnumMap" + } + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "IntegerEnumSet": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "IntegerEnumMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "IntegerEnum" + } + }, + "String": { + "type": "string" } - } - }, - "serialized": { - "uri": "/", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "body": "{\"RecursiveStruct\": {\"RecursiveMap\": {\"foo\": {\"NoRecurse\": \"foo\"}, \"bar\": {\"NoRecurse\": \"bar\"}}}}" - } - } - ] - }, - { - "description": "Empty maps", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Map": { - "shape": "MapType" - } - } - }, - "MapType": { - "type": "map", - "key": { - "shape": "StringType" }, - "value": { - "shape": "StringType" - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "AwsJson11IntEnums", + "given": { + "name": "JsonIntEnums", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonIntEnumsInputOutput" + }, + "documentation": "This example serializes intEnums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "intEnum1": 1, + "intEnum2": 2, + "intEnum3": 3, + "intEnumList": [ + 1, + 2 + ], + "intEnumSet": [ + 1, + 2 + ], + "intEnumMap": { + "a": 1, + "b": 2 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"intEnum1\": 1,\n \"intEnum2\": 2,\n \"intEnum3\": 3,\n \"intEnumList\": [\n 1,\n 2\n ],\n \"intEnumSet\": [\n 1,\n 2\n ],\n \"intEnumMap\": {\n \"a\": 1,\n \"b\": 2\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonIntEnums" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } + { + "description": "Test cases for JsonUnions operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "Map": {} + "shapes": { + "UnionInputOutput": { + "type": "structure", + "members": { + "contents": { + "shape": "MyUnion" + } + }, + "documentation": "A shared structure that contains a single union member.
" + }, + "MyUnion": { + "type": "structure", + "members": { + "stringValue": { + "shape": "String" + }, + "booleanValue": { + "shape": "Boolean" + }, + "numberValue": { + "shape": "Integer" + }, + "blobValue": { + "shape": "Blob" + }, + "timestampValue": { + "shape": "Timestamp" + }, + "enumValue": { + "shape": "FooEnum" + }, + "listValue": { + "shape": "StringList" + }, + "mapValue": { + "shape": "StringMap" + }, + "structureValue": { + "shape": "GreetingStruct" + } + }, + "documentation": "A union with a representative set of types for members.
", + "union": true + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + }, + "Blob": { + "type": "blob" + }, + "Timestamp": { + "type": "timestamp" + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } + } }, - "serialized": { - "body": "{\"Map\": {}}", - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/" - } - } - ] - }, - { - "description": "Idempotency token auto fill", - "metadata": { - "protocol": "json", - "apiVersion": "2014-01-01", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Token": { - "shape": "StringType", - "idempotencyToken": true - } - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "AwsJson11SerializeStringUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a string union value", + "params": { + "contents": { + "stringValue": "foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"stringValue\": \"foo\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeBooleanUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a boolean union value", + "params": { + "contents": { + "booleanValue": true + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"booleanValue\": true\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeNumberUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a number union value", + "params": { + "contents": { + "numberValue": 1 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"numberValue\": 1\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeBlobUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a blob union value", + "params": { + "contents": { + "blobValue": "foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"blobValue\": \"Zm9v\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeTimestampUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a timestamp union value", + "params": { + "contents": { + "timestampValue": 1398796238 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"timestampValue\": 1398796238\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeEnumUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes an enum union value", + "params": { + "contents": { + "enumValue": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"enumValue\": \"Foo\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeListUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a list union value", + "params": { + "contents": { + "listValue": [ + "foo", + "bar" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"listValue\": [\"foo\", \"bar\"]\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeMapUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a map union value", + "params": { + "contents": { + "mapValue": { + "foo": "bar", + "spam": "eggs" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"mapValue\": {\n \"foo\": \"bar\",\n \"spam\": \"eggs\"\n }\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + }, + { + "id": "AwsJson11SerializeStructureUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a structure union value", + "params": { + "contents": { + "structureValue": { + "hi": "hello" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"structureValue\": {\n \"hi\": \"hello\"\n }\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.JsonUnions" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST" - }, - "name": "OperationName" - }, - "params": { - "Token": "abc123" - }, - "serialized": { - "uri": "/", - "headers": {}, - "body": "{\"Token\": \"abc123\"}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST" - }, - "name": "OperationName" + { + "description": "Test cases for KitchenSinkOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { + "shapes": { + "KitchenSink": { + "type": "structure", + "members": { + "Blob": { + "shape": "Blob" + }, + "Boolean": { + "shape": "Boolean" + }, + "Double": { + "shape": "Double" + }, + "EmptyStruct": { + "shape": "EmptyStruct" + }, + "Float": { + "shape": "Float" + }, + "HttpdateTimestamp": { + "shape": "SyntheticTimestamp_http_date" + }, + "Integer": { + "shape": "Integer" + }, + "Iso8601Timestamp": { + "shape": "SyntheticTimestamp_date_time" + }, + "JsonValue": { + "shape": "JsonValue", + "jsonvalue": true + }, + "ListOfLists": { + "shape": "ListOfListOfStrings" + }, + "ListOfMapsOfStrings": { + "shape": "ListOfMapsOfStrings" + }, + "ListOfStrings": { + "shape": "ListOfStrings" + }, + "ListOfStructs": { + "shape": "ListOfStructs" + }, + "Long": { + "shape": "Long" + }, + "MapOfListsOfStrings": { + "shape": "MapOfListsOfStrings" + }, + "MapOfMaps": { + "shape": "MapOfMapOfStrings" + }, + "MapOfStrings": { + "shape": "MapOfStrings" + }, + "MapOfStructs": { + "shape": "MapOfStructs" + }, + "RecursiveList": { + "shape": "ListOfKitchenSinks" + }, + "RecursiveMap": { + "shape": "MapOfKitchenSinks" + }, + "RecursiveStruct": { + "shape": "KitchenSink" + }, + "SimpleStruct": { + "shape": "SimpleStruct" + }, + "String": { + "shape": "String" + }, + "StructWithJsonName": { + "shape": "StructWithJsonName" + }, + "Timestamp": { + "shape": "Timestamp" + }, + "UnixTimestamp": { + "shape": "SyntheticTimestamp_epoch_seconds" + } + } + }, + "Blob": { + "type": "blob" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "EmptyStruct": { + "type": "structure", + "members": {} + }, + "Float": { + "type": "float", + "box": true + }, + "SyntheticTimestamp_http_date": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "Integer": { + "type": "integer", + "box": true + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "JsonValue": { + "type": "string" + }, + "ListOfListOfStrings": { + "type": "list", + "member": { + "shape": "ListOfStrings" + } + }, + "ListOfMapsOfStrings": { + "type": "list", + "member": { + "shape": "MapOfStrings" + } + }, + "ListOfStrings": { + "type": "list", + "member": { + "shape": "String" + } + }, + "ListOfStructs": { + "type": "list", + "member": { + "shape": "SimpleStruct" + } + }, + "Long": { + "type": "long", + "box": true + }, + "MapOfListsOfStrings": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "ListOfStrings" + } + }, + "MapOfMapOfStrings": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "MapOfStrings" + } + }, + "MapOfStrings": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "MapOfStructs": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "SimpleStruct" + } + }, + "ListOfKitchenSinks": { + "type": "list", + "member": { + "shape": "KitchenSink" + } + }, + "MapOfKitchenSinks": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "KitchenSink" + } + }, + "SimpleStruct": { + "type": "structure", + "members": { + "Value": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + }, + "StructWithJsonName": { + "type": "structure", + "members": { + "Value": { + "shape": "String" + } + } + }, + "Timestamp": { + "type": "timestamp" + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + } }, - "serialized": { - "uri": "/", - "headers": {}, - "body": "{\"Token\": \"00000000-0000-4000-8000-000000000000\"}" - } - } - ] - }, - { - "description": "Endpoint host trait static prefix", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "clientEndpoint": "https://service.region.amazonaws.com", - "shapes": { - "StaticInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - } - } - }, - "MemberRefInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType", - "hostLabel": true - } - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "serializes_string_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes string shapes", + "params": { + "String": "abc xyz" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"String\":\"abc xyz\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_string_shapes_with_jsonvalue_trait", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes string shapes with jsonvalue trait", + "params": { + "JsonValue": "{\"string\":\"value\",\"number\":1234.5,\"boolTrue\":true,\"boolFalse\":false,\"array\":[1,2,3,4],\"object\":{\"key\":\"value\"},\"null\":null}" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"JsonValue\":\"{\\\"string\\\":\\\"value\\\",\\\"number\\\":1234.5,\\\"boolTrue\\\":true,\\\"boolFalse\\\":false,\\\"array\\\":[1,2,3,4],\\\"object\\\":{\\\"key\\\":\\\"value\\\"},\\\"null\\\":null}\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_integer_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes integer shapes", + "params": { + "Integer": 1234 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Integer\":1234}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_long_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes long shapes", + "params": { + "Long": 999999999999 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Long\":999999999999}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_float_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes float shapes", + "params": { + "Float": 1234.5 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Float\":1234.5}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_double_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes double shapes", + "params": { + "Double": 1234.5 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Double\":1234.5}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_blob_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes blob shapes", + "params": { + "Blob": "binary-value" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Blob\":\"YmluYXJ5LXZhbHVl\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_boolean_shapes_true", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes boolean shapes (true)", + "params": { + "Boolean": true + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Boolean\":true}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_boolean_shapes_false", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes boolean shapes (false)", + "params": { + "Boolean": false + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Boolean\":false}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_timestamp_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes timestamp shapes", + "params": { + "Timestamp": 946845296 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Timestamp\":946845296}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_timestamp_shapes_with_iso8601_timestampformat", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes timestamp shapes with iso8601 timestampFormat", + "params": { + "Iso8601Timestamp": 946845296 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Iso8601Timestamp\":\"2000-01-02T20:34:56Z\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_timestamp_shapes_with_httpdate_timestampformat", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes timestamp shapes with httpdate timestampFormat", + "params": { + "HttpdateTimestamp": 946845296 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"HttpdateTimestamp\":\"Sun, 02 Jan 2000 20:34:56 GMT\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_timestamp_shapes_with_unixtimestamp_timestampformat", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes timestamp shapes with unixTimestamp timestampFormat", + "params": { + "UnixTimestamp": 946845296 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"UnixTimestamp\":946845296}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_list_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes list shapes", + "params": { + "ListOfStrings": [ + "abc", + "mno", + "xyz" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"ListOfStrings\":[\"abc\",\"mno\",\"xyz\"]}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_empty_list_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes empty list shapes", + "params": { + "ListOfStrings": [] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"ListOfStrings\":[]}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_list_of_map_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes list of map shapes", + "params": { + "ListOfMapsOfStrings": [ + { + "foo": "bar" + }, + { + "abc": "xyz" + }, + { + "red": "blue" + } + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"ListOfMapsOfStrings\":[{\"foo\":\"bar\"},{\"abc\":\"xyz\"},{\"red\":\"blue\"}]}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_list_of_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes list of structure shapes", + "params": { + "ListOfStructs": [ + { + "Value": "abc" + }, + { + "Value": "mno" + }, + { + "Value": "xyz" + } + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"ListOfStructs\":[{\"Value\":\"abc\"},{\"Value\":\"mno\"},{\"Value\":\"xyz\"}]}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_list_of_recursive_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes list of recursive structure shapes", + "params": { + "RecursiveList": [ + { + "RecursiveList": [ + { + "RecursiveList": [ + { + "Integer": 123 + } + ] + } + ] + } + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"RecursiveList\":[{\"RecursiveList\":[{\"RecursiveList\":[{\"Integer\":123}]}]}]}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_map_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes map shapes", + "params": { + "MapOfStrings": { + "abc": "xyz", + "mno": "hjk" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"MapOfStrings\":{\"abc\":\"xyz\",\"mno\":\"hjk\"}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_empty_map_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes empty map shapes", + "params": { + "MapOfStrings": {} + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"MapOfStrings\":{}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_map_of_list_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes map of list shapes", + "params": { + "MapOfListsOfStrings": { + "abc": [ + "abc", + "xyz" + ], + "mno": [ + "xyz", + "abc" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"MapOfListsOfStrings\":{\"abc\":[\"abc\",\"xyz\"],\"mno\":[\"xyz\",\"abc\"]}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_map_of_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes map of structure shapes", + "params": { + "MapOfStructs": { + "key1": { + "Value": "value-1" + }, + "key2": { + "Value": "value-2" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"MapOfStructs\":{\"key1\":{\"Value\":\"value-1\"},\"key2\":{\"Value\":\"value-2\"}}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_map_of_recursive_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes map of recursive structure shapes", + "params": { + "RecursiveMap": { + "key1": { + "RecursiveMap": { + "key2": { + "RecursiveMap": { + "key3": { + "Boolean": false + } + } + } + } + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"RecursiveMap\":{\"key1\":{\"RecursiveMap\":{\"key2\":{\"RecursiveMap\":{\"key3\":{\"Boolean\":false}}}}}}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes structure shapes", + "params": { + "SimpleStruct": { + "Value": "abc" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"SimpleStruct\":{\"Value\":\"abc\"}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_structure_members_with_locationname_traits", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes structure members with locationName traits", + "params": { + "StructWithJsonName": { + "Value": "some-value" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"StructWithJsonName\":{\"Value\":\"some-value\"}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_empty_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes empty structure shapes", + "params": { + "SimpleStruct": {} + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"SimpleStruct\":{}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_structure_which_have_no_members", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes structure which have no members", + "params": { + "EmptyStruct": {} + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"EmptyStruct\":{}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "serializes_recursive_structure_shapes", + "given": { + "name": "KitchenSinkOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "KitchenSink" + } + }, + "description": "Serializes recursive structure shapes", + "params": { + "String": "top-value", + "Boolean": false, + "RecursiveStruct": { + "String": "nested-value", + "Boolean": true, + "RecursiveList": [ + { + "String": "string-only" + }, + { + "RecursiveStruct": { + "MapOfStrings": { + "color": "red", + "size": "large" + } + } + } + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"String\":\"top-value\",\"Boolean\":false,\"RecursiveStruct\":{\"String\":\"nested-value\",\"Boolean\":true,\"RecursiveList\":[{\"String\":\"string-only\"},{\"RecursiveStruct\":{\"MapOfStrings\":{\"color\":\"red\",\"size\":\"large\"}}}]}}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.KitchenSinkOperation" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "name": "StaticOp", - "input": { - "shape": "StaticInputShape" - }, - "http": { - "method": "POST" - }, - "endpoint":{ - "hostPrefix": "data-" - } + { + "description": "Test cases for NullOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "Name": "myname" - }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.StaticOp", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"Name\": \"myname\"}", - "host": "data-service.region.amazonaws.com" - } - }, - { - "given": { - "name": "MemberRefOp", - "input": { - "shape": "MemberRefInputShape" - }, - "http": { - "method": "POST" - }, - "endpoint":{ - "hostPrefix": "foo-{Name}." - } - }, - "params": { - "Name": "myname" + "shapes": { + "NullOperationInputOutput": { + "type": "structure", + "members": { + "string": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.MemberRefOp", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"Name\": \"myname\"}", - "host": "foo-myname.service.region.amazonaws.com" - } - } - ] - }, - { - "description": "Serializes document with standalone primitive type in a JSON request.", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "inlineDocument": { - "shape": "DocumentType" + "cases": [ + { + "id": "AwsJson11StructuresDontSerializeNullValues", + "given": { + "name": "NullOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "NullOperationInputOutput" + } + }, + "description": "Null structure values are dropped", + "params": { + "string": null + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.NullOperation" + } + } } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "inlineDocument": "foo" - }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": \"foo\"}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "inlineDocument": 123 + { + "description": "Test cases for OperationWithOptionalInputOutput operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": 123}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "inlineDocument": 1.2 - }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": 1.2}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "inlineDocument": true - }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": true}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } - }, - "params": { - "inlineDocument": "" + "shapes": { + "OperationWithOptionalInputOutputInput": { + "type": "structure", + "members": { + "Value": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": \"\"}" - } - } - ] - }, - { - "description": "Serializes inline document in a JSON request.", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "inlineDocument": { - "shape": "DocumentType" + "cases": [ + { + "id": "can_call_operation_with_no_input_or_output", + "given": { + "name": "OperationWithOptionalInputOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "OperationWithOptionalInputOutputInput" + } + }, + "description": "Can call operations with no input or output", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.OperationWithOptionalInputOutput" + } + } + }, + { + "id": "can_call_operation_with_optional_input", + "given": { + "name": "OperationWithOptionalInputOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "OperationWithOptionalInputOutputInput" + } + }, + "description": "Can invoke operations with optional input", + "params": { + "Value": "Hi" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"Value\":\"Hi\"}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.OperationWithOptionalInputOutput" + } + } } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } + { + "description": "Test cases for PutAndGetInlineDocuments operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "inlineDocument": {"foo": "bar"} + "shapes": { + "PutAndGetInlineDocumentsInputOutput": { + "type": "structure", + "members": { + "inlineDocument": { + "shape": "Document" + } + } + }, + "Document": { + "type": "structure", + "members": {}, + "document": true + } }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"inlineDocument\": {\"foo\": \"bar\"}}" - } - } - ] - }, - { - "description": "Serializes aggregate documents in a JSON request.", - "metadata": { - "protocol": "json", - "jsonVersion": "1.1", - "targetPrefix": "com.amazonaws.foo" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "parentDocument": { - "shape": "DocumentType" + "cases": [ + { + "id": "PutAndGetInlineDocumentsInput", + "given": { + "name": "PutAndGetInlineDocuments", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutAndGetInlineDocumentsInputOutput" + }, + "documentation": "This example serializes an inline document as part of the payload.
" + }, + "description": "Serializes inline documents in a JSON request.", + "params": { + "inlineDocument": { + "foo": "bar" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"inlineDocument\": {\"foo\": \"bar\"}\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.PutAndGetInlineDocuments" + }, + "requireHeaders": [ + "Content-Length" + ] + } } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "parentDocument": { - "str": "test", - "num": 123, - "float": 1.2, - "bool": true, - "null": "", - "document": {"foo": false}, - "list": ["myname", 321, 1.3, true, "", {"nested": true}, [200, ""]] - } + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"parentDocument\": {\"str\": \"test\", \"num\": 123, \"float\": 1.2, \"bool\": true, \"null\": \"\", \"document\": {\"foo\": false}, \"list\": [\"myname\", 321, 1.3, true, \"\", {\"nested\": true}, [200, \"\"]]}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName", - "http": { - "method": "POST" - } + "cases": [ + { + "id": "SDKAppliedContentEncoding_awsJson1_1", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is NOT in the Content-Encoding header since HTTP binding\ntraits are ignored in the awsJson1_1 protocol.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + } + ] + }, + { + "description": "Test cases for SimpleScalarProperties operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2018-01-01", + "jsonVersion": "1.1", + "targetPrefix": "JsonProtocol" }, - "params": { - "parentDocument": [ - "test", - 123, - 1.2, - true, - "", - {"str": "myname", "num": 321, "float": 1.3, "bool": true, "null": "", "document": {"nested": true}, "list": [200, ""]}, - ["foo", false] - ] + "shapes": { + "SimpleScalarPropertiesInputOutput": { + "type": "structure", + "members": { + "floatValue": { + "shape": "Float" + }, + "doubleValue": { + "shape": "Double" + } + } + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + } }, - "serialized": { - "headers": { - "X-Amz-Target": "com.amazonaws.foo.OperationName", - "Content-Type": "application/x-amz-json-1.1" - }, - "uri": "/", - "body": "{\"parentDocument\": [\"test\", 123, 1.2, true, \"\", {\"str\": \"myname\", \"num\": 321, \"float\": 1.3, \"bool\": true, \"null\": \"\", \"document\": {\"nested\": true}, \"list\": [200, \"\"]}, [\"foo\", false]]}" - } - } - ] - } + "cases": [ + { + "id": "AwsJson11SupportsNaNFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + } + }, + "description": "Supports handling NaN float values.", + "params": { + "floatValue": "NaN", + "doubleValue": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"NaN\",\n \"doubleValue\": \"NaN\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.SimpleScalarProperties" + } + } + }, + { + "id": "AwsJson11SupportsInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + } + }, + "description": "Supports handling Infinity float values.", + "params": { + "floatValue": "Infinity", + "doubleValue": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"Infinity\",\n \"doubleValue\": \"Infinity\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.SimpleScalarProperties" + } + } + }, + { + "id": "AwsJson11SupportsNegativeInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + } + }, + "description": "Supports handling -Infinity float values.", + "params": { + "floatValue": "-Infinity", + "doubleValue": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"-Infinity\",\n \"doubleValue\": \"-Infinity\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.1", + "X-Amz-Target": "JsonProtocol.SimpleScalarProperties" + } + } + } + ] + } ] diff --git a/tests/unit/protocols/input/json_1_0.json b/tests/unit/protocols/input/json_1_0.json new file mode 100644 index 0000000000..f746c22361 --- /dev/null +++ b/tests/unit/protocols/input/json_1_0.json @@ -0,0 +1,878 @@ +[ + { + "description": "Test cases for EmptyInputAndEmptyOutput operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": { + "EmptyInputAndEmptyOutputInput": { + "type": "structure", + "members": {} + } + }, + "cases": [ + { + "id": "AwsJson10EmptyInputAndEmptyOutput", + "given": { + "name": "EmptyInputAndEmptyOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "EmptyInputAndEmptyOutputInput" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has an empty input and empty output structure that reuses the same shape. While this should be rare, code generators must support this.
" + }, + "description": "Clients must always send an empty object if input is modeled.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.EmptyInputAndEmptyOutput" + } + } + } + ] + }, + { + "description": "Test cases for EndpointOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": {}, + "cases": [ + { + "id": "AwsJson10EndpointTrait", + "given": { + "name": "EndpointOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "endpoint": { + "hostPrefix": "foo." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "host": "foo.example.com" + } + } + ], + "clientEndpoint": "https://example.com" + }, + { + "description": "Test cases for EndpointWithHostLabelOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": { + "EndpointWithHostLabelOperationInput": { + "type": "structure", + "required": [ + "label" + ], + "members": { + "label": { + "shape": "String", + "hostLabel": true + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "AwsJson10EndpointTraitWithHostLabel", + "given": { + "name": "EndpointWithHostLabelOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "EndpointWithHostLabelOperationInput" + }, + "endpoint": { + "hostPrefix": "foo.{label}." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait, and can use the host label trait to define\nfurther customization based on user input.", + "params": { + "label": "bar" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\"label\": \"bar\"}", + "host": "foo.bar.example.com" + } + } + ], + "clientEndpoint": "https://example.com" + }, + { + "description": "Test cases for HostWithPathOperation operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": {}, + "cases": [ + { + "id": "AwsJson10HostWithPath", + "given": { + "name": "HostWithPathOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Custom endpoints supplied by users can have paths", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/custom/", + "body": "{}", + "host": "example.com/custom" + } + } + ], + "clientEndpoint": "https://example.com/custom" + }, + { + "description": "Test cases for JsonUnions operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": { + "JsonUnionsInput": { + "type": "structure", + "members": { + "contents": { + "shape": "MyUnion" + } + } + }, + "MyUnion": { + "type": "structure", + "members": { + "stringValue": { + "shape": "String" + }, + "booleanValue": { + "shape": "Boolean" + }, + "numberValue": { + "shape": "Integer" + }, + "blobValue": { + "shape": "Blob" + }, + "timestampValue": { + "shape": "Timestamp" + }, + "enumValue": { + "shape": "FooEnum" + }, + "intEnumValue": { + "shape": "IntegerEnum" + }, + "listValue": { + "shape": "StringList" + }, + "mapValue": { + "shape": "StringMap" + }, + "structureValue": { + "shape": "GreetingStruct" + } + }, + "documentation": "A union with a representative set of types for members.
", + "union": true + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + }, + "Blob": { + "type": "blob" + }, + "Timestamp": { + "type": "timestamp" + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } + } + }, + "cases": [ + { + "id": "AwsJson10SerializeStringUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a string union value", + "params": { + "contents": { + "stringValue": "foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"stringValue\": \"foo\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeBooleanUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a boolean union value", + "params": { + "contents": { + "booleanValue": true + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"booleanValue\": true\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeNumberUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a number union value", + "params": { + "contents": { + "numberValue": 1 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"numberValue\": 1\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeBlobUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a blob union value", + "params": { + "contents": { + "blobValue": "foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"blobValue\": \"Zm9v\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeTimestampUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a timestamp union value", + "params": { + "contents": { + "timestampValue": 1398796238 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"timestampValue\": 1398796238\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeEnumUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes an enum union value", + "params": { + "contents": { + "enumValue": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"enumValue\": \"Foo\"\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeIntEnumUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes an intEnum union value", + "params": { + "contents": { + "intEnumValue": 1 + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"intEnumValue\": 1\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeListUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a list union value", + "params": { + "contents": { + "listValue": [ + "foo", + "bar" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"listValue\": [\"foo\", \"bar\"]\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeMapUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a map union value", + "params": { + "contents": { + "mapValue": { + "foo": "bar", + "spam": "eggs" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"mapValue\": {\n \"foo\": \"bar\",\n \"spam\": \"eggs\"\n }\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + }, + { + "id": "AwsJson10SerializeStructureUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "JsonUnionsInput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a structure union value", + "params": { + "contents": { + "structureValue": { + "hi": "hello" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"contents\": {\n \"structureValue\": {\n \"hi\": \"hello\"\n }\n }\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.JsonUnions" + } + } + } + ] + }, + { + "description": "Test cases for NoInputAndNoOutput operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": {}, + "cases": [ + { + "id": "AwsJson10MustAlwaysSendEmptyJsonPayload", + "given": { + "name": "NoInputAndNoOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input or output. While this should be rare, code generators must support this.
" + }, + "description": "Clients must always send an empty JSON object payload for\noperations with no input (that is, `{}`). While AWS service\nimplementations support requests with no payload or requests\nthat send `{}`, always sending `{}` from the client is\npreferred for forward compatibility in case input is ever\nadded to an operation.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.NoInputAndNoOutput" + } + } + } + ] + }, + { + "description": "Test cases for NoInputAndOutput operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": {}, + "cases": [ + { + "id": "AwsJson10NoInputAndOutput", + "given": { + "name": "NoInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input and the output is empty. While this should be rare, code generators must support this.
" + }, + "description": "A client should always send and empty JSON object payload.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.NoInputAndOutput" + } + } + } + ] + }, + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "SDKAppliedContentEncoding_awsJson1_0", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is NOT in the Content-Encoding header since HTTP binding\ntraits are ignored in the awsJson1_0 protocol.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + } + ] + }, + { + "description": "Test cases for SimpleScalarProperties operation", + "metadata": { + "protocol": "json", + "protocols": [ + "json" + ], + "apiVersion": "2020-07-14", + "jsonVersion": "1.0", + "targetPrefix": "JsonRpc10" + }, + "shapes": { + "SimpleScalarPropertiesInput": { + "type": "structure", + "members": { + "floatValue": { + "shape": "Float" + }, + "doubleValue": { + "shape": "Double" + } + } + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + } + }, + "cases": [ + { + "id": "AwsJson10SupportsNaNFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInput" + } + }, + "description": "Supports handling NaN float values.", + "params": { + "floatValue": "NaN", + "doubleValue": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"NaN\",\n \"doubleValue\": \"NaN\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.SimpleScalarProperties" + } + } + }, + { + "id": "AwsJson10SupportsInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInput" + } + }, + "description": "Supports handling Infinity float values.", + "params": { + "floatValue": "Infinity", + "doubleValue": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"Infinity\",\n \"doubleValue\": \"Infinity\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.SimpleScalarProperties" + } + } + }, + { + "id": "AwsJson10SupportsNegativeInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleScalarPropertiesInput" + } + }, + "description": "Supports handling -Infinity float values.", + "params": { + "floatValue": "-Infinity", + "doubleValue": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "{\n \"floatValue\": \"-Infinity\",\n \"doubleValue\": \"-Infinity\"\n}", + "headers": { + "Content-Type": "application/x-amz-json-1.0", + "X-Amz-Target": "JsonRpc10.SimpleScalarProperties" + } + } + } + ] + } +] diff --git a/tests/unit/protocols/input/query.json b/tests/unit/protocols/input/query.json index ac93e9eef6..58435cca0c 100644 --- a/tests/unit/protocols/input/query.json +++ b/tests/unit/protocols/input/query.json @@ -1,1002 +1,1611 @@ [ - { - "description": "Scalar members", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Foo": { - "shape": "StringType" - }, - "Bar": { - "shape": "StringType" - }, - "Baz": { - "shape": "BooleanType" - } - } - }, - "StringType": { - "type": "string" - }, - "BooleanType": { - "type": "boolean" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Foo": "val1", - "Bar": "val2" - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Foo=val1&Bar=val2" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Baz": true - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Baz=true" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Baz": false - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Baz=false" - } - } - ] - }, - { - "description": "Nested structure members", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "StructArg": { - "shape": "StructType" - } - } - }, - "StructType": { - "type": "structure", - "members": { - "ScalarArg": { - "shape": "StringType" - } - } - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "StructArg": { - "ScalarArg": "foo" - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&StructArg.ScalarArg=foo" - } - } - ] - }, - { - "description": "List types", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListArg": { - "shape": "ListType" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "Strings" - } - }, - "Strings": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "ListArg": [ - "foo", - "bar", - "baz" - ] - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListArg.member.1=foo&ListArg.member.2=bar&ListArg.member.3=baz" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "ListArg": [] - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListArg=" - } - } - ] - }, - { - "description": "Flattened list", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ScalarArg": { - "shape": "StringType" - }, - "ListArg": { - "shape": "ListType" - }, - "NamedListArg": { - "shape": "NamedListType" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "StringType" - }, - "flattened": true - }, - "NamedListType": { - "type": "list", - "member": { - "shape": "StringType", - "locationName": "Foo" - }, - "flattened": true - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "ScalarArg": "foo", - "ListArg": [ - "a", - "b", - "c" - ] - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ScalarArg=foo&ListArg.1=a&ListArg.2=b&ListArg.3=c" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "NamedListArg": [ - "a" - ] - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Foo.1=a" - } - } - ] - }, - { - "description": "Serialize flattened map type", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "MapArg": { - "shape": "StringMap" - } - } - }, - "StringMap": { - "type": "map", - "key": { - "shape": "StringType" - }, - "value": { - "shape": "StringType" - }, - "flattened": true - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "MapArg": { - "key1": "val1", - "key2": "val2" - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&MapArg.1.key=key1&MapArg.1.value=val1&MapArg.2.key=key2&MapArg.2.value=val2" - } - } - ] - }, - { - "description": "Non flattened list with LocationName", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListArg": { - "shape": "ListType" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "StringType", - "locationName": "item" - } - }, - "StringType": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EmptyInputAndEmptyOutput operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "ListArg": [ - "a", - "b", - "c" - ] + "shapes": { + "EmptyInputAndEmptyOutputInput": { + "type": "structure", + "members": {} + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ListArg.item.1=a&ListArg.item.2=b&ListArg.item.3=c" - } - } - ] - }, - { - "description": "Flattened list with LocationName", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "QueryEmptyInputAndEmptyOutput", + "given": { + "name": "EmptyInputAndEmptyOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "EmptyInputAndEmptyOutputInput" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response members.
While this should be rare, code generators must support this.
" + }, + "description": "Empty input serializes no extra query params", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EmptyInputAndEmptyOutput&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ScalarArg": { - "shape": "StringType" - }, - "ListArg": { - "shape": "ListType" - } - } - }, - "ListType": { - "type": "list", - "member": { - "shape": "StringType", - "locationName": "ListArgLocation" + { + "description": "Test cases for EndpointOperation operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "flattened": true - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "AwsQueryEndpointTrait", + "given": { + "name": "EndpointOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "endpoint": { + "hostPrefix": "foo." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EndpointOperation&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "host": "foo.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for EndpointWithHostLabelOperation operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "ScalarArg": "foo", - "ListArg": [ - "a", - "b", - "c" - ] + "shapes": { + "HostLabelInput": { + "type": "structure", + "required": [ + "label" + ], + "members": { + "label": { + "shape": "String", + "hostLabel": true + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&ScalarArg=foo&ListArgLocation.1=a&ListArgLocation.2=b&ListArgLocation.3=c" - } - } - ] - }, - { - "description": "Serialize map type", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "AwsQueryEndpointTraitWithHostLabel", + "given": { + "name": "EndpointWithHostLabelOperation", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "HostLabelInput" + }, + "endpoint": { + "hostPrefix": "foo.{label}." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait, and can use the host label trait to define\nfurther customization based on user input.", + "params": { + "label": "bar" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=EndpointWithHostLabelOperation&Version=2020-01-08&label=bar", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "host": "foo.bar.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "MapArg": { - "shape": "StringMap" - } - } - }, - "StringMap": { - "type": "map", - "key": { - "shape": "StringType" + { + "description": "Test cases for HostWithPathOperation operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "value": { - "shape": "StringType" - } - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "QueryHostWithPath", + "given": { + "name": "HostWithPathOperation", + "http": { + "method": "POST", + "requestUri": "/" + } + }, + "description": "Custom endpoints supplied by users can have paths", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/custom/", + "body": "Action=HostWithPathOperation&Version=2020-01-08", + "host": "example.com/custom" + } + } + ], + "clientEndpoint": "https://example.com/custom" }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for NestedStructures operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "MapArg": { - "key1": "val1", - "key2": "val2" - } + "shapes": { + "NestedStructuresInput": { + "type": "structure", + "members": { + "Nested": { + "shape": "StructArg" + } + } + }, + "StructArg": { + "type": "structure", + "members": { + "StringArg": { + "shape": "String" + }, + "OtherArg": { + "shape": "Boolean" + }, + "RecursiveArg": { + "shape": "StructArg" + } + } + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&MapArg.entry.1.key=key1&MapArg.entry.1.value=val1&MapArg.entry.2.key=key2&MapArg.entry.2.value=val2" - } - } - ] - }, - { - "description": "Serialize map type with locationName", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" + "cases": [ + { + "id": "NestedStructures", + "given": { + "name": "NestedStructures", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "NestedStructuresInput" + }, + "documentation": "This test serializes nested and recursive structure members.
" + }, + "description": "Serializes nested structures using dots", + "params": { + "Nested": { + "StringArg": "foo", + "OtherArg": true, + "RecursiveArg": { + "StringArg": "baz" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=NestedStructures&Version=2020-01-08&Nested.StringArg=foo&Nested.OtherArg=true&Nested.RecursiveArg.StringArg=baz", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "MapArg": { - "shape": "StringMap" - } - } - }, - "StringMap": { - "type": "map", - "key": { - "shape": "StringType", - "locationName": "TheKey" + { + "description": "Test cases for NoInputAndNoOutput operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "value": { - "shape": "StringType", - "locationName": "TheValue" - } - }, - "StringType": { - "type": "string" - } + "shapes": {}, + "cases": [ + { + "id": "QueryNoInputAndNoOutput", + "given": { + "name": "NoInputAndNoOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input or output.
While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no additional query params", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=NoInputAndNoOutput&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for NoInputAndOutput operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "MapArg": { - "key1": "val1", - "key2": "val2" - } + "shapes": { + "NoInputAndOutputInput": { + "type": "structure", + "members": {} + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&MapArg.entry.1.TheKey=key1&MapArg.entry.1.TheValue=val1&MapArg.entry.2.TheKey=key2&MapArg.entry.2.TheValue=val2" - } - } - ] - }, - { - "description": "Base64 encoded Blobs", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "BlobArg": { - "shape": "BlobType" - } - } - }, - "BlobType": { - "type": "blob" - } + "cases": [ + { + "id": "QueryNoInputAndOutput", + "given": { + "name": "NoInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "NoInputAndOutputInput" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request payload or response members.
While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=NoInputAndOutput&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "BlobArg": "foo" + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&BlobArg=Zm9v" - } - } - ] - }, - { - "description": "Timestamp values", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "TimeArg": { - "shape": "TimestampType" - }, - "TimeCustom": { - "timestampFormat": "unixTimestamp", - "shape": "TimestampType" - }, - "TimeFormat": { - "shape": "TimestampFormatType" - } - } - }, - "TimestampFormatType": { - "timestampFormat": "unixTimestamp", - "type": "timestamp" - }, - "TimestampType": { - "type": "timestamp" - } + "cases": [ + { + "id": "SDKAppliedContentEncoding_awsQuery", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is NOT in the Content-Encoding header since HTTP binding\ntraits are ignored in the awsQuery protocol.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/", + "headers": { + "Content-Encoding": "gzip" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for QueryIdempotencyTokenAutoFill operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "TimeArg": 1422172800, - "TimeCustom": 1422172800, - "TimeFormat": 1422172800 - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&TimeArg=2015-01-25T08%3A00%3A00Z&TimeCustom=1422172800&TimeFormat=1422172800" - } - } - ] - }, - { - "description": "Recursive shapes", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "RecursiveStruct": { - "shape": "RecursiveStructType" - } - } - }, - "RecursiveStructType": { - "type": "structure", - "members": { - "NoRecurse": { - "shape": "StringType" - }, - "RecursiveStruct": { - "shape": "RecursiveStructType" - }, - "RecursiveList": { - "shape": "RecursiveListType" - }, - "RecursiveMap": { - "shape": "RecursiveMapType" - } - } - }, - "RecursiveListType": { - "type": "list", - "member": { - "shape": "RecursiveStructType" - } - }, - "RecursiveMapType": { - "type": "map", - "key": { - "shape": "StringType" + "shapes": { + "QueryIdempotencyTokenAutoFillInput": { + "type": "structure", + "members": { + "token": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "String": { + "type": "string" + } }, - "value": { - "shape": "RecursiveStructType" - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "QueryProtocolIdempotencyTokenAutoFill", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Automatically adds idempotency token when not set", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryIdempotencyTokenAutoFill&Version=2020-01-08&token=00000000-0000-4000-8000-000000000000", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QueryProtocolIdempotencyTokenAutoFillIsSet", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Uses the given idempotency token as-is", + "params": { + "token": "00000000-0000-4000-8000-000000000123" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryIdempotencyTokenAutoFill&Version=2020-01-08&token=00000000-0000-4000-8000-000000000123", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.NoRecurse=foo" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + { + "description": "Test cases for QueryLists operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" + "shapes": { + "QueryListsInput": { + "type": "structure", + "members": { + "ListArg": { + "shape": "StringList" + }, + "ComplexListArg": { + "shape": "GreetingList" + }, + "FlattenedListArg": { + "shape": "StringList", + "flattened": true + }, + "ListArgWithXmlNameMember": { + "shape": "ListWithXmlName" + }, + "FlattenedListArgWithXmlName": { + "shape": "ListWithXmlName", + "flattened": true, + "locationName": "Hi" + }, + "NestedWithList": { + "shape": "NestedStructWithList" + } + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "GreetingList": { + "type": "list", + "member": { + "shape": "GreetingStruct" + } + }, + "ListWithXmlName": { + "type": "list", + "member": { + "shape": "String", + "locationName": "item" + } + }, + "NestedStructWithList": { + "type": "structure", + "members": { + "ListArg": { + "shape": "StringList" + } + } + }, + "String": { + "type": "string" + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } } - } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.RecursiveStruct.NoRecurse=foo" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - } + "cases": [ + { + "id": "QueryLists", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Serializes query lists", + "params": { + "ListArg": [ + "foo", + "bar", + "baz" + ], + "ComplexListArg": [ + { + "hi": "hello" + }, + { + "hi": "hola" + } + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&ListArg.member.1=foo&ListArg.member.2=bar&ListArg.member.3=baz&ComplexListArg.member.1.hi=hello&ComplexListArg.member.2.hi=hola", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "EmptyQueryLists", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Serializes empty query lists", + "params": { + "ListArg": [] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&ListArg=", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "FlattenedQueryLists", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Flattens query lists by repeating the member name and removing the member element", + "params": { + "FlattenedListArg": [ + "A", + "B" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&FlattenedListArg.1=A&FlattenedListArg.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryListArgWithXmlNameMember", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Changes the member of lists using xmlName trait", + "params": { + "ListArgWithXmlNameMember": [ + "A", + "B" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&ListArgWithXmlNameMember.item.1=A&ListArgWithXmlNameMember.item.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryFlattenedListArgWithXmlName", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Changes the name of flattened lists using xmlName trait on the structure member", + "params": { + "FlattenedListArgWithXmlName": [ + "A", + "B" + ] + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&Hi.1=A&Hi.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryNestedStructWithList", + "given": { + "name": "QueryLists", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryListsInput" + }, + "documentation": "This test serializes simple and complex lists.
" + }, + "description": "Nested structure with a list member", + "params": { + "NestedWithList": { + "ListArg": [ + "A", + "B" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryLists&Version=2020-01-08&NestedWithList.ListArg.member.1=A&NestedWithList.ListArg.member.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } } - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.RecursiveStruct.RecursiveStruct.RecursiveStruct.NoRecurse=foo" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "NoRecurse": "bar" - } - ] - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.RecursiveList.member.1.NoRecurse=foo&RecursiveStruct.RecursiveList.member.2.NoRecurse=bar" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "RecursiveStruct": { - "NoRecurse": "bar" - } - } - ] - } - }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.RecursiveList.member.1.NoRecurse=foo&RecursiveStruct.RecursiveList.member.2.RecursiveStruct.NoRecurse=bar" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "name": "OperationName" + ] + }, + { + "description": "Test cases for QueryMaps operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "params": { - "RecursiveStruct": { - "RecursiveMap": { - "foo": { - "NoRecurse": "foo" - }, - "bar": { - "NoRecurse": "bar" - } + "shapes": { + "QueryMapsInput": { + "type": "structure", + "members": { + "MapArg": { + "shape": "StringMap" + }, + "RenamedMapArg": { + "shape": "StringMap", + "locationName": "Foo" + }, + "ComplexMapArg": { + "shape": "ComplexMap" + }, + "MapWithXmlMemberName": { + "shape": "MapWithXmlName" + }, + "FlattenedMap": { + "shape": "StringMap", + "flattened": true + }, + "FlattenedMapWithXmlName": { + "shape": "MapWithXmlName", + "flattened": true, + "locationName": "Hi" + }, + "MapOfLists": { + "shape": "MapOfLists" + }, + "NestedStructWithMap": { + "shape": "NestedStructWithMap" + } + } + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "ComplexMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "GreetingStruct" + } + }, + "MapWithXmlName": { + "type": "map", + "key": { + "shape": "String", + "locationName": "K" + }, + "value": { + "shape": "String", + "locationName": "V" + } + }, + "MapOfLists": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "StringList" + } + }, + "NestedStructWithMap": { + "type": "structure", + "members": { + "MapArg": { + "shape": "StringMap" + } + } + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } } - } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&RecursiveStruct.RecursiveMap.entry.1.key=foo&RecursiveStruct.RecursiveMap.entry.1.value.NoRecurse=foo&RecursiveStruct.RecursiveMap.entry.2.key=bar&RecursiveStruct.RecursiveMap.entry.2.value.NoRecurse=bar" - } - } - ] - }, - { - "description": "Idempotency token auto fill", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Token": { - "shape": "StringType", - "idempotencyToken": true - } - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "QuerySimpleQueryMaps", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes query maps", + "params": { + "MapArg": { + "bar": "Bar", + "foo": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&MapArg.entry.1.key=bar&MapArg.entry.1.value=Bar&MapArg.entry.2.key=foo&MapArg.entry.2.value=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QuerySimpleQueryMapsWithXmlName", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes query maps and uses xmlName", + "params": { + "RenamedMapArg": { + "foo": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&Foo.entry.1.key=foo&Foo.entry.1.value=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryComplexQueryMaps", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes complex query maps", + "params": { + "ComplexMapArg": { + "bar": { + "hi": "Bar" + }, + "foo": { + "hi": "Foo" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&ComplexMapArg.entry.1.key=bar&ComplexMapArg.entry.1.value.hi=Bar&ComplexMapArg.entry.2.key=foo&ComplexMapArg.entry.2.value.hi=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryEmptyQueryMaps", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Does not serialize empty query maps", + "params": { + "MapArg": {} + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryQueryMapWithMemberXmlName", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes query maps where the member has an xmlName trait", + "params": { + "MapWithXmlMemberName": { + "bar": "Bar", + "foo": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&MapWithXmlMemberName.entry.1.K=bar&MapWithXmlMemberName.entry.1.V=Bar&MapWithXmlMemberName.entry.2.K=foo&MapWithXmlMemberName.entry.2.V=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryFlattenedQueryMaps", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes flattened query maps", + "params": { + "FlattenedMap": { + "bar": "Bar", + "foo": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&FlattenedMap.1.key=bar&FlattenedMap.1.value=Bar&FlattenedMap.2.key=foo&FlattenedMap.2.value=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryFlattenedQueryMapsWithXmlName", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes flattened query maps that use an xmlName", + "params": { + "FlattenedMapWithXmlName": { + "bar": "Bar", + "foo": "Foo" + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&Hi.1.K=bar&Hi.1.V=Bar&Hi.2.K=foo&Hi.2.V=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryQueryMapOfLists", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes query map of lists", + "params": { + "MapOfLists": { + "bar": [ + "C", + "D" + ], + "foo": [ + "A", + "B" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&MapOfLists.entry.1.key=bar&MapOfLists.entry.1.value.member.1=C&MapOfLists.entry.1.value.member.2=D&MapOfLists.entry.2.key=foo&MapOfLists.entry.2.value.member.1=A&MapOfLists.entry.2.value.member.2=B", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + }, + { + "id": "QueryNestedStructWithMap", + "given": { + "name": "QueryMaps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryMapsInput" + }, + "documentation": "This test serializes simple and complex maps.
" + }, + "description": "Serializes nested struct with map member", + "params": { + "NestedStructWithMap": { + "MapArg": { + "bar": "Bar", + "foo": "Foo" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=QueryMaps&Version=2020-01-08&NestedStructWithMap.MapArg.entry.1.key=bar&NestedStructWithMap.MapArg.entry.1.value=Bar&NestedStructWithMap.MapArg.entry.2.key=foo&NestedStructWithMap.MapArg.entry.2.value=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST" - }, - "name": "OperationName" - }, - "params": { - "Token": "abc123" + { + "description": "Test cases for QueryTimestamps operation", + "metadata": { + "protocol": "query", + "protocols": [ + "query" + ], + "apiVersion": "2020-01-08" }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Token=abc123" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST" - }, - "name": "OperationName" - }, - "params": { + "shapes": { + "QueryTimestampsInput": { + "type": "structure", + "members": { + "normalFormat": { + "shape": "Timestamp" + }, + "epochMember": { + "shape": "SyntheticTimestamp_epoch_seconds" + }, + "epochTarget": { + "shape": "EpochSeconds" + } + } + }, + "Timestamp": { + "type": "timestamp" + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + } }, - "serialized": { - "uri": "/", - "headers": { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" - }, - "body": "Action=OperationName&Version=2014-01-01&Token=00000000-0000-4000-8000-000000000000" - } - } - ] - }, - { - "description": "Endpoint host trait", - "metadata": { - "protocol": "query", - "apiVersion": "2014-01-01" - }, - "clientEndpoint": "https://service.region.amazonaws.com", - "shapes": { - "StaticInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - } - } - }, - "MemberRefInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType", - "hostLabel": true - } - } - }, - "StringType": { - "type": "string" - } + "cases": [ + { + "id": "QueryTimestampsInput", + "given": { + "name": "QueryTimestamps", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "QueryTimestampsInput" + }, + "documentation": "This test serializes timestamps.
This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes strings", + "params": { + "Foo": "val1", + "Bar": "val2" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Foo=val1&Bar=val2", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QuerySimpleInputParamsStringAndBooleanTrue", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes booleans that are true", + "params": { + "Foo": "val1", + "Baz": true + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Foo=val1&Baz=true", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QuerySimpleInputParamsStringsAndBooleanFalse", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes booleans that are false", + "params": { + "Baz": false + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Baz=false", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QuerySimpleInputParamsInteger", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes integers", + "params": { + "Bam": 10 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Bam=10", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QuerySimpleInputParamsFloat", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes floats", + "params": { + "Boo": 10.8 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Boo=10.8", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QuerySimpleInputParamsBlob", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Blobs are base64 encoded in the query string", + "params": { + "Qux": "value" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&Qux=dmFsdWU%3D", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QueryEnums", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes enums in the query string", + "params": { + "FooEnum": "Foo" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FooEnum=Foo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "QueryIntEnums", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Serializes intEnums in the query string", + "params": { + "IntegerEnum": 1 + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&IntegerEnum=1", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "AwsQuerySupportsNaNFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling NaN float values.", + "params": { + "FloatValue": "NaN", + "Boo": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=NaN&Boo=NaN", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "AwsQuerySupportsInfinityFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling Infinity float values.", + "params": { + "FloatValue": "Infinity", + "Boo": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=Infinity&Boo=Infinity", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "AwsQuerySupportsNegativeInfinityFloatInputs", + "given": { + "name": "SimpleInputParams", + "http": { + "method": "POST", + "requestUri": "/" + }, + "input": { + "shape": "SimpleInputParamsInput" + }, + "documentation": "This test serializes strings, numbers, and boolean values.
" + }, + "description": "Supports handling -Infinity float values.", + "params": { + "FloatValue": "-Infinity", + "Boo": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/", + "body": "Action=SimpleInputParams&Version=2020-01-08&FloatValue=-Infinity&Boo=-Infinity", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] + } ] diff --git a/tests/unit/protocols/input/rest-json.json b/tests/unit/protocols/input/rest-json.json index 54f327dbd8..bc73a3d7ad 100644 --- a/tests/unit/protocols/input/rest-json.json +++ b/tests/unit/protocols/input/rest-json.json @@ -1,2194 +1,6117 @@ [ - { - "description": "No parameters", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" - }, - "shapes": {}, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobs" - }, - "name": "OperationName" - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobs", - "headers": {} - } - } - ] - }, - { - "description": "URI parameter only with no location name", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri" - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for AllQueryStringTypes operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "AllQueryStringTypesInput": { + "type": "structure", + "members": { + "queryString": { + "shape": "String", + "location": "querystring", + "locationName": "String" + }, + "queryStringList": { + "shape": "StringList", + "location": "querystring", + "locationName": "StringList" + }, + "queryStringSet": { + "shape": "StringSet", + "location": "querystring", + "locationName": "StringSet" + }, + "queryByte": { + "shape": "Integer", + "location": "querystring", + "locationName": "Byte" + }, + "queryShort": { + "shape": "Integer", + "location": "querystring", + "locationName": "Short" + }, + "queryInteger": { + "shape": "Integer", + "location": "querystring", + "locationName": "Integer" + }, + "queryIntegerList": { + "shape": "IntegerList", + "location": "querystring", + "locationName": "IntegerList" + }, + "queryIntegerSet": { + "shape": "IntegerSet", + "location": "querystring", + "locationName": "IntegerSet" + }, + "queryLong": { + "shape": "Long", + "location": "querystring", + "locationName": "Long" + }, + "queryFloat": { + "shape": "Float", + "location": "querystring", + "locationName": "Float" + }, + "queryDouble": { + "shape": "Double", + "location": "querystring", + "locationName": "Double" + }, + "queryDoubleList": { + "shape": "DoubleList", + "location": "querystring", + "locationName": "DoubleList" + }, + "queryBoolean": { + "shape": "Boolean", + "location": "querystring", + "locationName": "Boolean" + }, + "queryBooleanList": { + "shape": "BooleanList", + "location": "querystring", + "locationName": "BooleanList" + }, + "queryTimestamp": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "Timestamp" + }, + "queryTimestampList": { + "shape": "TimestampList", + "location": "querystring", + "locationName": "TimestampList" + }, + "queryEnum": { + "shape": "FooEnum", + "location": "querystring", + "locationName": "Enum" + }, + "queryEnumList": { + "shape": "FooEnumList", + "location": "querystring", + "locationName": "EnumList" + }, + "queryIntegerEnum": { + "shape": "IntegerEnum", + "location": "querystring", + "locationName": "IntegerEnum" + }, + "queryIntegerEnumList": { + "shape": "IntegerEnumList", + "location": "querystring", + "locationName": "IntegerEnumList" + }, + "queryParamsMapOfStringList": { + "shape": "StringListMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringSet": { + "type": "list", + "member": { + "shape": "String" + } + }, + "Integer": { + "type": "integer", + "box": true + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "IntegerSet": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "DoubleList": { + "type": "list", + "member": { + "shape": "Double" + } + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "Timestamp": { + "type": "timestamp" + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "StringListMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "StringList" + } + } + }, + "cases": [ + { + "id": "RestJsonAllQueryStringTypes", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Serializes query string parameters with all supported types", + "params": { + "queryString": "Hello there", + "queryStringList": [ + "a", + "b", + "c" + ], + "queryStringSet": [ + "a", + "b", + "c" + ], + "queryByte": 1, + "queryShort": 2, + "queryInteger": 3, + "queryIntegerList": [ + 1, + 2, + 3 + ], + "queryIntegerSet": [ + 1, + 2, + 3 + ], + "queryLong": 4, + "queryFloat": 1.1, + "queryDouble": 1.1, + "queryDoubleList": [ + 1.1, + 2.1, + 3.1 + ], + "queryBoolean": true, + "queryBooleanList": [ + true, + false, + true + ], + "queryTimestamp": 1, + "queryTimestampList": [ + 1, + 2, + 3 + ], + "queryEnum": "Foo", + "queryEnumList": [ + "Foo", + "Baz", + "Bar" + ], + "queryIntegerEnum": 1, + "queryIntegerEnumList": [ + 1, + 2, + 3 + ], + "queryParamsMapOfStringList": { + "String": [ + "Hello there" + ], + "StringList": [ + "a", + "b", + "c" + ], + "StringSet": [ + "a", + "b", + "c" + ], + "Byte": [ + "1" + ], + "Short": [ + "2" + ], + "Integer": [ + "3" + ], + "IntegerList": [ + "1", + "2", + "3" + ], + "IntegerSet": [ + "1", + "2", + "3" + ], + "Long": [ + "4" + ], + "Float": [ + "1.1" + ], + "Double": [ + "1.1" + ], + "DoubleList": [ + "1.1", + "2.1", + "3.1" + ], + "Boolean": [ + "true" + ], + "BooleanList": [ + "true", + "false", + "true" + ], + "Timestamp": [ + "1970-01-01T00:00:01Z" + ], + "TimestampList": [ + "1970-01-01T00:00:01Z", + "1970-01-01T00:00:02Z", + "1970-01-01T00:00:03Z" + ], + "Enum": [ + "Foo" + ], + "EnumList": [ + "Foo", + "Baz", + "Bar" + ], + "IntegerEnum": [ + "1" + ], + "IntegerEnumList": [ + "1", + "2", + "3" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?String=Hello%20there&StringList=a&StringList=b&StringList=c&StringSet=a&StringSet=b&StringSet=c&Byte=1&Short=2&Integer=3&IntegerList=1&IntegerList=2&IntegerList=3&IntegerSet=1&IntegerSet=2&IntegerSet=3&Long=4&Float=1.1&Double=1.1&DoubleList=1.1&DoubleList=2.1&DoubleList=3.1&Boolean=true&BooleanList=true&BooleanList=false&BooleanList=true&Timestamp=1970-01-01T00%3A00%3A01Z&TimestampList=1970-01-01T00%3A00%3A01Z&TimestampList=1970-01-01T00%3A00%3A02Z&TimestampList=1970-01-01T00%3A00%3A03Z&Enum=Foo&EnumList=Foo&EnumList=Baz&EnumList=Bar&IntegerEnum=1&IntegerEnumList=1&IntegerEnumList=2&IntegerEnumList=3", + "body": "" + } + }, + { + "id": "RestJsonQueryStringMap", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Handles query string maps", + "params": { + "queryParamsMapOfStringList": { + "QueryParamsStringKeyA": [ + "Foo" + ], + "QueryParamsStringKeyB": [ + "Bar" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?QueryParamsStringKeyA=Foo&QueryParamsStringKeyB=Bar", + "body": "" + } + }, + { + "id": "RestJsonQueryStringEscaping", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Handles escaping all required characters in the query string.", + "params": { + "queryString": " %:/?#[]@!$&'()*+,;=😹", + "queryParamsMapOfStringList": { + "String": [ + " %:/?#[]@!$&'()*+,;=😹" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?String=%20%25%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%F0%9F%98%B9", + "body": "" + } + }, + { + "id": "RestJsonSupportsNaNFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling NaN float query values.", + "params": { + "queryFloat": "NaN", + "queryDouble": "NaN", + "queryParamsMapOfStringList": { + "Float": [ + "NaN" + ], + "Double": [ + "NaN" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=NaN&Double=NaN", + "body": "" + } + }, + { + "id": "RestJsonSupportsInfinityFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling Infinity float query values.", + "params": { + "queryFloat": "Infinity", + "queryDouble": "Infinity", + "queryParamsMapOfStringList": { + "Float": [ + "Infinity" + ], + "Double": [ + "Infinity" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=Infinity&Double=Infinity", + "body": "" + } + }, + { + "id": "RestJsonSupportsNegativeInfinityFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling -Infinity float query values.", + "params": { + "queryFloat": "-Infinity", + "queryDouble": "-Infinity", + "queryParamsMapOfStringList": { + "Float": [ + "-Infinity" + ], + "Double": [ + "-Infinity" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=-Infinity&Double=-Infinity", + "body": "" + } + }, + { + "id": "RestJsonZeroAndFalseQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Query values of 0 and false are serialized", + "params": { + "queryInteger": 0, + "queryBoolean": false, + "queryParamsMapOfStringList": { + "Integer": [ + "0" + ], + "Boolean": [ + "false" + ] + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Integer=0&Boolean=false", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "foo" - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobsByPipeline/foo", - "headers": {} - } - } - ] - }, - { - "description": "URI parameter only with location name", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for ConstantAndVariableQueryString operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "ConstantAndVariableQueryStringInput": { + "type": "structure", + "members": { + "baz": { + "shape": "String", + "location": "querystring", + "locationName": "baz" + }, + "maybeSet": { + "shape": "String", + "location": "querystring", + "locationName": "maybeSet" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonConstantAndVariableQueryStringMissingOneValue", + "given": { + "name": "ConstantAndVariableQueryString", + "http": { + "method": "GET", + "requestUri": "/ConstantAndVariableQueryString?foo=bar", + "responseCode": 200 + }, + "input": { + "shape": "ConstantAndVariableQueryStringInput" + }, + "documentation": "This example uses fixed query string params and variable query string params. The fixed query string parameters and variable parameters must both be serialized (implementations may need to merge them together).
" + }, + "description": "Mixes constant and variable query string parameters", + "params": { + "baz": "bam" + }, + "serialized": { + "method": "GET", + "uri": "/ConstantAndVariableQueryString?foo=bar&baz=bam", + "body": "" + } + }, + { + "id": "RestJsonConstantAndVariableQueryStringAllValues", + "given": { + "name": "ConstantAndVariableQueryString", + "http": { + "method": "GET", + "requestUri": "/ConstantAndVariableQueryString?foo=bar", + "responseCode": 200 + }, + "input": { + "shape": "ConstantAndVariableQueryStringInput" + }, + "documentation": "This example uses fixed query string params and variable query string params. The fixed query string parameters and variable parameters must both be serialized (implementations may need to merge them together).
" + }, + "description": "Mixes constant and variable query string parameters", + "params": { + "baz": "bam", + "maybeSet": "yes" + }, + "serialized": { + "method": "GET", + "uri": "/ConstantAndVariableQueryString?foo=bar&baz=bam&maybeSet=yes", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Foo": { - "shape": "StringType", - "location": "uri", - "locationName": "PipelineId" - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for ConstantQueryString operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "ConstantQueryStringInput": { + "type": "structure", + "required": [ + "hello" + ], + "members": { + "hello": { + "shape": "String", + "location": "uri", + "locationName": "hello" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonConstantQueryString", + "given": { + "name": "ConstantQueryString", + "http": { + "method": "GET", + "requestUri": "/ConstantQueryString/{hello}?foo=bar&hello", + "responseCode": 200 + }, + "input": { + "shape": "ConstantQueryStringInput" + }, + "documentation": "This example uses a constant query string parameters and a label. This simply tests that labels and query string parameters are compatible. The fixed query string parameter named "hello" should in no way conflict with the label, {hello}
.
This example serializes a document as part of the payload.
", + "idempotent": true + }, + "description": "Serializes document types as part of the JSON request payload with no escaping.", + "params": { + "stringValue": "string", + "documentValue": { + "foo": "bar" + } + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentType", + "body": "{\n \"stringValue\": \"string\",\n \"documentValue\": {\n \"foo\": \"bar\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "DocumentInputWithString", + "given": { + "name": "DocumentType", + "http": { + "method": "PUT", + "requestUri": "/DocumentType", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeInputOutput" + }, + "documentation": "This example serializes a document as part of the payload.
", + "idempotent": true + }, + "description": "Serializes document types using a string.", + "params": { + "stringValue": "string", + "documentValue": "hello" + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentType", + "body": "{\n \"stringValue\": \"string\",\n \"documentValue\": \"hello\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "DocumentInputWithNumber", + "given": { + "name": "DocumentType", + "http": { + "method": "PUT", + "requestUri": "/DocumentType", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeInputOutput" + }, + "documentation": "This example serializes a document as part of the payload.
", + "idempotent": true + }, + "description": "Serializes document types using a number.", + "params": { + "stringValue": "string", + "documentValue": 10 + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentType", + "body": "{\n \"stringValue\": \"string\",\n \"documentValue\": 10\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "DocumentInputWithBoolean", + "given": { + "name": "DocumentType", + "http": { + "method": "PUT", + "requestUri": "/DocumentType", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeInputOutput" + }, + "documentation": "This example serializes a document as part of the payload.
", + "idempotent": true + }, + "description": "Serializes document types using a boolean.", + "params": { + "stringValue": "string", + "documentValue": true + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentType", + "body": "{\n \"stringValue\": \"string\",\n \"documentValue\": true\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "DocumentInputWithList", + "given": { + "name": "DocumentType", + "http": { + "method": "PUT", + "requestUri": "/DocumentType", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeInputOutput" + }, + "documentation": "This example serializes a document as part of the payload.
", + "idempotent": true + }, + "description": "Serializes document types using a list.", + "params": { + "stringValue": "string", + "documentValue": [ + true, + "hi", + [ + 1, + 2 + ], + { + "foo": { + "baz": [ + 3, + 4 + ] + } + } + ] + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentType", + "body": "{\n \"stringValue\": \"string\",\n \"documentValue\": [\n true,\n \"hi\",\n [\n 1,\n 2\n ],\n {\n \"foo\": {\n \"baz\": [\n 3,\n 4\n ]\n }\n }\n ]\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Items": { - "shape": "StringList", - "location": "querystring", - "locationName": "item" - } - } - }, - "StringList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "String": { - "type": "string" - } + { + "description": "Test cases for DocumentTypeAsMapValue operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "DocumentTypeAsMapValueInputOutput": { + "type": "structure", + "members": { + "docValuedMap": { + "shape": "DocumentValuedMap" + } + } + }, + "DocumentValuedMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "Document" + } + }, + "Document": { + "type": "structure", + "members": {}, + "document": true + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "DocumentTypeAsMapValueInput", + "given": { + "name": "DocumentTypeAsMapValue", + "http": { + "method": "PUT", + "requestUri": "/DocumentTypeAsMapValue", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeAsMapValueInputOutput" + }, + "documentation": "This example serializes documents as the value of maps.
", + "idempotent": true + }, + "description": "Serializes a map that uses documents as the value.", + "params": { + "docValuedMap": { + "foo": { + "f": 1, + "o": 2 + }, + "bar": [ + "b", + "a", + "r" + ], + "baz": "BAZ" + } + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentTypeAsMapValue", + "body": "{\n \"docValuedMap\": {\n \"foo\": { \"f\": 1, \"o\": 2 },\n \"bar\": [ \"b\", \"a\", \"r\" ],\n \"baz\": \"BAZ\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Items": ["value1", "value2"] - }, - "serialized": { - "body": "", - "uri": "/path?item=value1&item=value2", - "headers": {} - } - } - ] - }, - { - "description": "String to string maps in querystring", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for DocumentTypeAsPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "DocumentTypeAsPayloadInputOutput": { + "type": "structure", + "members": { + "documentValue": { + "shape": "Document" + } + }, + "payload": "documentValue" + }, + "Document": { + "type": "structure", + "members": {}, + "document": true + } + }, + "cases": [ + { + "id": "DocumentTypeAsPayloadInput", + "given": { + "name": "DocumentTypeAsPayload", + "http": { + "method": "PUT", + "requestUri": "/DocumentTypeAsPayload", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeAsPayloadInputOutput" + }, + "documentation": "This example serializes a document as the entire HTTP payload.
", + "idempotent": true + }, + "description": "Serializes a document as the target of the httpPayload trait.", + "params": { + "documentValue": { + "foo": "bar" + } + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentTypeAsPayload", + "body": "{\n \"foo\": \"bar\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "DocumentTypeAsPayloadInputString", + "given": { + "name": "DocumentTypeAsPayload", + "http": { + "method": "PUT", + "requestUri": "/DocumentTypeAsPayload", + "responseCode": 200 + }, + "input": { + "shape": "DocumentTypeAsPayloadInputOutput" + }, + "documentation": "This example serializes a document as the entire HTTP payload.
", + "idempotent": true + }, + "description": "Serializes a document as the target of the httpPayload trait using a string.", + "params": { + "documentValue": "hello" + }, + "serialized": { + "method": "PUT", + "uri": "/DocumentTypeAsPayload", + "body": "\"hello\"", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri" - }, - "QueryDoc": { - "shape": "MapStringStringType", - "location": "querystring" - } - } - }, - "MapStringStringType": { - "type": "map", - "key": { - "shape": "StringType" - }, - "value": { - "shape": "StringType" - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for EmptyInputAndEmptyOutput operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "EmptyInputAndEmptyOutputInput": { + "type": "structure", + "members": {} + } + }, + "cases": [ + { + "id": "RestJsonEmptyInputAndEmptyOutput", + "given": { + "name": "EmptyInputAndEmptyOutput", + "http": { + "method": "POST", + "requestUri": "/EmptyInputAndEmptyOutput", + "responseCode": 200 + }, + "input": { + "shape": "EmptyInputAndEmptyOutputInput" + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has an empty input and empty output structure that reuses the same shape. While this should be rare, code generators must support this.
" + }, + "description": "Clients should not serialize a JSON payload when no parameters\nare given that are sent in the body. A service will tolerate\nclients that omit a payload or that send a JSON object.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/EmptyInputAndEmptyOutput", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "foo", - "QueryDoc": { - "bar": "baz", - "fizz": "buzz" - } - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobsByPipeline/foo?bar=baz&fizz=buzz", - "headers": {} - } - } - ] - }, - { - "description": "String to string list maps in querystring", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for EndpointOperation operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonEndpointTrait", + "given": { + "name": "EndpointOperation", + "http": { + "method": "POST", + "requestUri": "/EndpointOperation", + "responseCode": 200 + }, + "endpoint": { + "hostPrefix": "foo." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/EndpointOperation", + "body": "", + "host": "foo.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri" - }, - "QueryDoc": { - "shape": "MapStringStringListType", - "location": "querystring" - } - } - }, - "MapStringStringListType": { - "type": "map", - "key": { - "shape": "StringType" - }, - "value": { - "shape": "StringListType" - } - }, - "StringListType": { - "type": "list", - "member": { - "shape": "StringType" - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for EndpointWithHostLabelOperation operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HostLabelInput": { + "type": "structure", + "required": [ + "label" + ], + "members": { + "label": { + "shape": "String", + "hostLabel": true + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonEndpointTraitWithHostLabel", + "given": { + "name": "EndpointWithHostLabelOperation", + "http": { + "method": "POST", + "requestUri": "/EndpointWithHostLabelOperation", + "responseCode": 200 + }, + "input": { + "shape": "HostLabelInput" + }, + "endpoint": { + "hostPrefix": "foo.{label}." + } + }, + "description": "Operations can prepend to the given host if they define the\nendpoint trait, and can use the host label trait to define\nfurther customization based on user input.", + "params": { + "label": "bar" + }, + "serialized": { + "method": "POST", + "uri": "/EndpointWithHostLabelOperation", + "body": "{\"label\": \"bar\"}", + "host": "foo.bar.example.com" + } + } + ], + "clientEndpoint": "https://example.com" }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "id", - "QueryDoc": { - "foo": ["bar", "baz"], - "fizz": ["buzz", "pop"] - } - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobsByPipeline/id?foo=bar&foo=baz&fizz=buzz&fizz=pop", - "headers": {} - } - } - ] - }, - { - "description": "Boolean in querystring", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HostWithPathOperation operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonHostWithPath", + "given": { + "name": "HostWithPathOperation", + "http": { + "method": "GET", + "requestUri": "/HostWithPathOperation", + "responseCode": 200 + } + }, + "description": "Custom endpoints supplied by users can have paths", + "params": {}, + "serialized": { + "method": "GET", + "uri": "/custom/HostWithPathOperation", + "body": "", + "host": "example.com/custom" + } + } + ], + "clientEndpoint": "https://example.com/custom" }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "BoolQuery": { - "shape": "BoolType", - "location": "querystring", - "locationName": "bool-query" - } - } - }, - "BoolType": { - "type": "boolean" - } + { + "description": "Test cases for HttpChecksumRequired operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpChecksumRequiredInputOutput": { + "type": "structure", + "members": { + "foo": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpChecksumRequired", + "given": { + "name": "HttpChecksumRequired", + "http": { + "method": "POST", + "requestUri": "/HttpChecksumRequired", + "responseCode": 200 + }, + "input": { + "shape": "HttpChecksumRequiredInputOutput" + }, + "documentation": "This example tests httpChecksumRequired trait
", + "httpChecksumRequired": true + }, + "description": "Adds Content-MD5 header", + "params": { + "foo": "base64 encoded md5 checksum" + }, + "serialized": { + "method": "POST", + "uri": "/HttpChecksumRequired", + "body": "{\n \"foo\":\"base64 encoded md5 checksum\"\n}\n", + "headers": { + "Content-MD5": "iB0/3YSo7maijL0IGOgA9g==", + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "BoolQuery": true - }, - "serialized": { - "body": "", - "uri": "/path?bool-query=true", - "headers": {} - } - }, - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "BoolQuery": false - }, - "serialized": { - "body": "", - "uri": "/path?bool-query=false", - "headers": {} - } - } - ] - }, - { - "description": "URI parameter and querystring params", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpEnumPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "EnumPayloadInput": { + "type": "structure", + "members": { + "payload": { + "shape": "StringEnum" + } + }, + "payload": "payload" + }, + "StringEnum": { + "type": "string", + "enum": [ + "enumvalue" + ] + } + }, + "cases": [ + { + "id": "RestJsonEnumPayloadRequest", + "given": { + "name": "HttpEnumPayload", + "http": { + "method": "POST", + "requestUri": "/EnumPayload", + "responseCode": 200 + }, + "input": { + "shape": "EnumPayloadInput" + } + }, + "params": { + "payload": "enumvalue" + }, + "serialized": { + "method": "POST", + "uri": "/EnumPayload", + "body": "enumvalue", + "headers": { + "Content-Type": "text/plain" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri", - "locationName": "PipelineId" - }, - "Ascending": { - "shape": "StringType", - "location": "querystring", - "locationName": "Ascending" - }, - "PageToken": { - "shape": "StringType", - "location": "querystring", - "locationName": "PageToken" - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for HttpPayloadTraits operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpPayloadTraitsInputOutput": { + "type": "structure", + "members": { + "foo": { + "shape": "String", + "location": "header", + "locationName": "X-Foo" + }, + "blob": { + "shape": "Blob" + } + }, + "payload": "blob" + }, + "String": { + "type": "string" + }, + "Blob": { + "type": "blob" + } + }, + "cases": [ + { + "id": "RestJsonHttpPayloadTraitsWithBlob", + "given": { + "name": "HttpPayloadTraits", + "http": { + "method": "POST", + "requestUri": "/HttpPayloadTraits", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadTraitsInputOutput" + }, + "documentation": "This example serializes a blob shape in the payload.
In this example, no JSON document is synthesized because the payload is not a structure or a union type.
" + }, + "description": "Serializes a blob in the HTTP payload", + "params": { + "foo": "Foo", + "blob": "blobby blob blob" + }, + "serialized": { + "method": "POST", + "uri": "/HttpPayloadTraits", + "body": "blobby blob blob", + "headers": { + "Content-Type": "application/octet-stream", + "X-Foo": "Foo" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "RestJsonHttpPayloadTraitsWithNoBlobBody", + "given": { + "name": "HttpPayloadTraits", + "http": { + "method": "POST", + "requestUri": "/HttpPayloadTraits", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadTraitsInputOutput" + }, + "documentation": "This example serializes a blob shape in the payload.
In this example, no JSON document is synthesized because the payload is not a structure or a union type.
" + }, + "description": "Serializes an empty blob in the HTTP payload", + "params": { + "foo": "Foo" + }, + "serialized": { + "method": "POST", + "uri": "/HttpPayloadTraits", + "body": "", + "headers": { + "X-Foo": "Foo" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "foo", - "Ascending": "true", - "PageToken": "bar" - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobsByPipeline/foo?Ascending=true&PageToken=bar", - "headers": {} - } - } - ] - }, - { - "description": "URI parameter, querystring params and JSON body", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpPayloadWithStructure operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpPayloadWithStructureInputOutput": { + "type": "structure", + "members": { + "nested": { + "shape": "NestedPayload" + } + }, + "payload": "nested" + }, + "NestedPayload": { + "type": "structure", + "members": { + "greeting": { + "shape": "String" + }, + "name": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpPayloadWithStructure", + "given": { + "name": "HttpPayloadWithStructure", + "http": { + "method": "PUT", + "requestUri": "/HttpPayloadWithStructure", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadWithStructureInputOutput" + }, + "documentation": "This example serializes a structure in the payload.
Note that serializing a structure changes the wrapper element name to match the targeted structure.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload", + "params": { + "nested": { + "greeting": "hello", + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithStructure", + "body": "{\n \"greeting\": \"hello\",\n \"name\": \"Phreddy\"\n}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri", - "locationName": "PipelineId" - }, - "Ascending": { - "shape": "StringType", - "location": "querystring", - "locationName": "Ascending" - }, - "PageToken": { - "shape": "StringType", - "location": "querystring", - "locationName": "PageToken" - }, - "Config": { - "shape": "StructType" - } - } - }, - "StringType": { - "type": "string" - }, - "StructType": { - "type": "structure", - "members": { - "A": { - "shape": "StringType" - }, - "B": { - "shape": "StringType" - } - } - } + { + "description": "Test cases for HttpPayloadWithUnion operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpPayloadWithUnionInputOutput": { + "type": "structure", + "members": { + "nested": { + "shape": "UnionPayload" + } + }, + "payload": "nested" + }, + "UnionPayload": { + "type": "structure", + "members": { + "greeting": { + "shape": "String" + } + }, + "union": true + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpPayloadWithUnion", + "given": { + "name": "HttpPayloadWithUnion", + "http": { + "method": "PUT", + "requestUri": "/HttpPayloadWithUnion", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadWithUnionInputOutput" + }, + "documentation": "This example serializes a union in the payload.
", + "idempotent": true + }, + "description": "Serializes a union in the payload.", + "params": { + "nested": { + "greeting": "hello" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithUnion", + "body": "{\n \"greeting\": \"hello\"\n}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "RestJsonHttpPayloadWithUnsetUnion", + "given": { + "name": "HttpPayloadWithUnion", + "http": { + "method": "PUT", + "requestUri": "/HttpPayloadWithUnion", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadWithUnionInputOutput" + }, + "documentation": "This example serializes a union in the payload.
", + "idempotent": true + }, + "description": "No payload is sent if the union has no value.", + "params": {}, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithUnion", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "foo", - "Ascending": "true", - "PageToken": "bar", - "Config": { - "A": "one", - "B": "two" - } - }, - "serialized": { - "body": "{\"Config\": {\"A\": \"one\", \"B\": \"two\"}}", - "uri": "/2014-01-01/jobsByPipeline/foo?Ascending=true&PageToken=bar", - "headers": {} - } - } - ] - }, - { - "description": "URI parameter, querystring params, headers and JSON body", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpPrefixHeaders operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpPrefixHeadersInput": { + "type": "structure", + "members": { + "foo": { + "shape": "String", + "location": "header", + "locationName": "x-foo" + }, + "fooMap": { + "shape": "StringMap", + "location": "headers", + "locationName": "x-foo-" + } + } + }, + "String": { + "type": "string" + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestJsonHttpPrefixHeadersArePresent", + "given": { + "name": "HttpPrefixHeaders", + "http": { + "method": "GET", + "requestUri": "/HttpPrefixHeaders", + "responseCode": 200 + }, + "input": { + "shape": "HttpPrefixHeadersInput" + }, + "documentation": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "Adds headers by prefix", + "params": { + "foo": "Foo", + "fooMap": { + "abc": "Abc value", + "def": "Def value" + } + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo": "Foo", + "x-foo-abc": "Abc value", + "x-foo-def": "Def value" + } + } + }, + { + "id": "RestJsonHttpPrefixHeadersAreNotPresent", + "given": { + "name": "HttpPrefixHeaders", + "http": { + "method": "GET", + "requestUri": "/HttpPrefixHeaders", + "responseCode": 200 + }, + "input": { + "shape": "HttpPrefixHeadersInput" + }, + "documentation": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "No prefix headers are serialized because the value is not present", + "params": { + "foo": "Foo", + "fooMap": {} + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo": "Foo" + } + } + }, + { + "id": "RestJsonHttpPrefixEmptyHeaders", + "given": { + "name": "HttpPrefixHeaders", + "http": { + "method": "GET", + "requestUri": "/HttpPrefixHeaders", + "responseCode": 200 + }, + "input": { + "shape": "HttpPrefixHeadersInput" + }, + "documentation": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "Serialize prefix headers were the value is present but empty", + "params": { + "fooMap": { + "abc": "" + } + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo-abc": "" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri", - "locationName": "PipelineId" - }, - "Ascending": { - "shape": "StringType", - "location": "querystring", - "locationName": "Ascending" - }, - "Checksum": { - "shape": "StringType", - "location": "header", - "locationName": "x-amz-checksum" - }, - "PageToken": { - "shape": "StringType", - "location": "querystring", - "locationName": "PageToken" - }, - "Config": { - "shape": "StructType" - } - } - }, - "StringType": { - "type": "string" - }, - "StructType": { - "type": "structure", - "members": { - "A": { - "shape": "StringType" - }, - "B": { - "shape": "StringType" - } - } - } + { + "description": "Test cases for HttpRequestWithFloatLabels operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithFloatLabelsInput": { + "type": "structure", + "required": [ + "float", + "double" + ], + "members": { + "float": { + "shape": "Float", + "location": "uri", + "locationName": "float" + }, + "double": { + "shape": "Double", + "location": "uri", + "locationName": "double" + } + } + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + } + }, + "cases": [ + { + "id": "RestJsonSupportsNaNFloatLabels", + "given": { + "name": "HttpRequestWithFloatLabels", + "http": { + "method": "GET", + "requestUri": "/FloatHttpLabels/{float}/{double}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithFloatLabelsInput" + } + }, + "description": "Supports handling NaN float label values.", + "params": { + "float": "NaN", + "double": "NaN" + }, + "serialized": { + "method": "GET", + "uri": "/FloatHttpLabels/NaN/NaN", + "body": "" + } + }, + { + "id": "RestJsonSupportsInfinityFloatLabels", + "given": { + "name": "HttpRequestWithFloatLabels", + "http": { + "method": "GET", + "requestUri": "/FloatHttpLabels/{float}/{double}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithFloatLabelsInput" + } + }, + "description": "Supports handling Infinity float label values.", + "params": { + "float": "Infinity", + "double": "Infinity" + }, + "serialized": { + "method": "GET", + "uri": "/FloatHttpLabels/Infinity/Infinity", + "body": "" + } + }, + { + "id": "RestJsonSupportsNegativeInfinityFloatLabels", + "given": { + "name": "HttpRequestWithFloatLabels", + "http": { + "method": "GET", + "requestUri": "/FloatHttpLabels/{float}/{double}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithFloatLabelsInput" + } + }, + "description": "Supports handling -Infinity float label values.", + "params": { + "float": "-Infinity", + "double": "-Infinity" + }, + "serialized": { + "method": "GET", + "uri": "/FloatHttpLabels/-Infinity/-Infinity", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "foo", - "Ascending": "true", - "Checksum": "12345", - "PageToken": "bar", - "Config": { - "A": "one", - "B": "two" - } - }, - "serialized": { - "body": "{\"Config\": {\"A\": \"one\", \"B\": \"two\"}}", - "uri": "/2014-01-01/jobsByPipeline/foo?Ascending=true&PageToken=bar", - "headers": { - "x-amz-checksum": "12345" - } - } - } - ] - }, - { - "description": "Streaming payload", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpRequestWithGreedyLabelInPath operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithGreedyLabelInPathInput": { + "type": "structure", + "required": [ + "foo", + "baz" + ], + "members": { + "foo": { + "shape": "String", + "location": "uri", + "locationName": "foo" + }, + "baz": { + "shape": "String", + "location": "uri", + "locationName": "baz" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpRequestWithGreedyLabelInPath", + "given": { + "name": "HttpRequestWithGreedyLabelInPath", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithGreedyLabelInPath/foo/{foo}/baz/{baz+}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithGreedyLabelInPathInput" + } + }, + "description": "Serializes greedy labels and normal labels", + "params": { + "foo": "hello/escape", + "baz": "there/guy" + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithGreedyLabelInPath/foo/hello%2Fescape/baz/there/guy", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "vaultName": { - "shape": "StringType", - "location": "uri", - "locationName": "vaultName" - }, - "checksum": { - "shape": "StringType", - "location": "header", - "locationName": "x-amz-sha256-tree-hash" - }, - "body": { - "shape": "Stream" - } - }, - "required": [ - "vaultName" - ], - "payload": "body" - }, - "StringType": { - "type": "string" - }, - "Stream": { - "type": "blob", - "streaming": true - } + { + "description": "Test cases for HttpRequestWithLabels operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithLabelsInput": { + "type": "structure", + "required": [ + "string", + "short", + "integer", + "long", + "float", + "double", + "boolean", + "timestamp" + ], + "members": { + "string": { + "shape": "String", + "location": "uri", + "locationName": "string" + }, + "short": { + "shape": "Integer", + "location": "uri", + "locationName": "short" + }, + "integer": { + "shape": "Integer", + "location": "uri", + "locationName": "integer" + }, + "long": { + "shape": "Long", + "location": "uri", + "locationName": "long" + }, + "float": { + "shape": "Float", + "location": "uri", + "locationName": "float" + }, + "double": { + "shape": "Double", + "location": "uri", + "locationName": "double" + }, + "boolean": { + "shape": "Boolean", + "documentation": "Serialized in the path as true or false.
", + "location": "uri", + "locationName": "boolean" + }, + "timestamp": { + "shape": "Timestamp", + "documentation": "Note that this member has no format, so it's serialized as an RFC 3399 date-time.
", + "location": "uri", + "locationName": "timestamp" + } + } + }, + "String": { + "type": "string" + }, + "Integer": { + "type": "integer", + "box": true + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Timestamp": { + "type": "timestamp" + } + }, + "cases": [ + { + "id": "RestJsonInputWithHeadersAndAllParams", + "given": { + "name": "HttpRequestWithLabels", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabels/{string}/{short}/{integer}/{long}/{float}/{double}/{boolean}/{timestamp}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsInput" + }, + "documentation": "The example tests how requests are serialized when there's no input payload but there are HTTP labels.
" + }, + "description": "Sends a GET request that uses URI label bindings", + "params": { + "string": "string", + "short": 1, + "integer": 2, + "long": 3, + "float": 4.1, + "double": 5.1, + "boolean": true, + "timestamp": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabels/string/1/2/3/4.1/5.1/true/2019-12-16T23%3A48%3A18Z", + "body": "" + } + }, + { + "id": "RestJsonHttpRequestLabelEscaping", + "given": { + "name": "HttpRequestWithLabels", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabels/{string}/{short}/{integer}/{long}/{float}/{double}/{boolean}/{timestamp}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsInput" + }, + "documentation": "The example tests how requests are serialized when there's no input payload but there are HTTP labels.
" + }, + "description": "Sends a GET request that uses URI label bindings", + "params": { + "string": " %:/?#[]@!$&'()*+,;=😹", + "short": 1, + "integer": 2, + "long": 3, + "float": 4.1, + "double": 5.1, + "boolean": true, + "timestamp": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabels/%20%25%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%F0%9F%98%B9/1/2/3/4.1/5.1/true/2019-12-16T23%3A48%3A18Z", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/vaults/{vaultName}/archives" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "vaultName": "name", - "checksum": "foo", - "body": "contents" - }, - "serialized": { - "body": "contents", - "uri": "/2014-01-01/vaults/name/archives", - "headers": { - "x-amz-sha256-tree-hash": "foo" - } - } - } - ] - }, - { - "description": "Serialize blobs in body", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpRequestWithLabelsAndTimestampFormat operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithLabelsAndTimestampFormatInput": { + "type": "structure", + "required": [ + "memberEpochSeconds", + "memberHttpDate", + "memberDateTime", + "defaultFormat", + "targetEpochSeconds", + "targetHttpDate", + "targetDateTime" + ], + "members": { + "memberEpochSeconds": { + "shape": "SyntheticTimestamp_epoch_seconds", + "location": "uri", + "locationName": "memberEpochSeconds" + }, + "memberHttpDate": { + "shape": "SyntheticTimestamp_http_date", + "location": "uri", + "locationName": "memberHttpDate" + }, + "memberDateTime": { + "shape": "SyntheticTimestamp_date_time", + "location": "uri", + "locationName": "memberDateTime" + }, + "defaultFormat": { + "shape": "Timestamp", + "location": "uri", + "locationName": "defaultFormat" + }, + "targetEpochSeconds": { + "shape": "EpochSeconds", + "location": "uri", + "locationName": "targetEpochSeconds" + }, + "targetHttpDate": { + "shape": "HttpDate", + "location": "uri", + "locationName": "targetHttpDate" + }, + "targetDateTime": { + "shape": "DateTime", + "location": "uri", + "locationName": "targetDateTime" + } + } + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "SyntheticTimestamp_http_date": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "Timestamp": { + "type": "timestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "HttpDate": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "DateTime": { + "type": "timestamp", + "timestampFormat": "iso8601" + } + }, + "cases": [ + { + "id": "RestJsonHttpRequestWithLabelsAndTimestampFormat", + "given": { + "name": "HttpRequestWithLabelsAndTimestampFormat", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabelsAndTimestampFormat/{memberEpochSeconds}/{memberHttpDate}/{memberDateTime}/{defaultFormat}/{targetEpochSeconds}/{targetHttpDate}/{targetDateTime}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsAndTimestampFormatInput" + }, + "documentation": "The example tests how requests serialize different timestamp formats in the URI path.
" + }, + "description": "Serializes different timestamp formats in URI labels", + "params": { + "memberEpochSeconds": 1576540098, + "memberHttpDate": 1576540098, + "memberDateTime": 1576540098, + "defaultFormat": 1576540098, + "targetEpochSeconds": 1576540098, + "targetHttpDate": 1576540098, + "targetDateTime": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabelsAndTimestampFormat/1576540098/Mon%2C%2016%20Dec%202019%2023%3A48%3A18%20GMT/2019-12-16T23%3A48%3A18Z/2019-12-16T23%3A48%3A18Z/1576540098/Mon%2C%2016%20Dec%202019%2023%3A48%3A18%20GMT/2019-12-16T23%3A48%3A18Z", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Foo": { - "shape": "StringType", - "location": "uri", - "locationName": "Foo" - }, - "Bar": {"shape": "BlobType"} - }, - "required": [ - "Foo" + { + "description": "Test cases for HttpRequestWithRegexLiteral operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithRegexLiteralInput": { + "type": "structure", + "required": [ + "str" + ], + "members": { + "str": { + "shape": "String", + "location": "uri", + "locationName": "str" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonToleratesRegexCharsInSegments", + "given": { + "name": "HttpRequestWithRegexLiteral", + "http": { + "method": "GET", + "requestUri": "/ReDosLiteral/{str}/(a+)+", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithRegexLiteralInput" + } + }, + "description": "Path matching is not broken by regex expressions in literal segments", + "params": { + "str": "abc" + }, + "serialized": { + "method": "GET", + "uri": "/ReDosLiteral/abc/(a+)+", + "body": "" + } + } ] - }, - "StringType": { - "type": "string" - }, - "BlobType": { - "type": "blob" - } }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/{Foo}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Foo": "foo_name", - "Bar": "Blob param" - }, - "serialized": { - "body": "{\"Bar\": \"QmxvYiBwYXJhbQ==\"}", - "uri": "/2014-01-01/foo_name" - } - } - ] - }, - { - "description": "Blob payload", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpStringPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "StringPayloadInput": { + "type": "structure", + "members": { + "payload": { + "shape": "String" + } + }, + "payload": "payload" + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonStringPayloadRequest", + "given": { + "name": "HttpStringPayload", + "http": { + "method": "POST", + "requestUri": "/StringPayload", + "responseCode": 200 + }, + "input": { + "shape": "StringPayloadInput" + } + }, + "params": { + "payload": "rawstring" + }, + "serialized": { + "method": "POST", + "uri": "/StringPayload", + "body": "rawstring", + "headers": { + "Content-Type": "text/plain" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - } - }, - "FooShape": { - "type": "blob" - } + { + "description": "Test cases for InputAndOutputWithHeaders operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "InputAndOutputWithHeadersIO": { + "type": "structure", + "members": { + "headerString": { + "shape": "String", + "location": "header", + "locationName": "X-String" + }, + "headerByte": { + "shape": "Integer", + "location": "header", + "locationName": "X-Byte" + }, + "headerShort": { + "shape": "Integer", + "location": "header", + "locationName": "X-Short" + }, + "headerInteger": { + "shape": "Integer", + "location": "header", + "locationName": "X-Integer" + }, + "headerLong": { + "shape": "Long", + "location": "header", + "locationName": "X-Long" + }, + "headerFloat": { + "shape": "Float", + "location": "header", + "locationName": "X-Float" + }, + "headerDouble": { + "shape": "Double", + "location": "header", + "locationName": "X-Double" + }, + "headerTrueBool": { + "shape": "Boolean", + "location": "header", + "locationName": "X-Boolean1" + }, + "headerFalseBool": { + "shape": "Boolean", + "location": "header", + "locationName": "X-Boolean2" + }, + "headerStringList": { + "shape": "StringList", + "location": "header", + "locationName": "X-StringList" + }, + "headerStringSet": { + "shape": "StringSet", + "location": "header", + "locationName": "X-StringSet" + }, + "headerIntegerList": { + "shape": "IntegerList", + "location": "header", + "locationName": "X-IntegerList" + }, + "headerBooleanList": { + "shape": "BooleanList", + "location": "header", + "locationName": "X-BooleanList" + }, + "headerTimestampList": { + "shape": "TimestampList", + "location": "header", + "locationName": "X-TimestampList" + }, + "headerEnum": { + "shape": "FooEnum", + "location": "header", + "locationName": "X-Enum" + }, + "headerEnumList": { + "shape": "FooEnumList", + "location": "header", + "locationName": "X-EnumList" + }, + "headerIntegerEnum": { + "shape": "IntegerEnum", + "location": "header", + "locationName": "X-IntegerEnum" + }, + "headerIntegerEnumList": { + "shape": "IntegerEnumList", + "location": "header", + "locationName": "X-IntegerEnumList" + } + } + }, + "String": { + "type": "string" + }, + "Integer": { + "type": "integer", + "box": true + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringSet": { + "type": "list", + "member": { + "shape": "String" + } + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "Timestamp": { + "type": "timestamp" + } + }, + "cases": [ + { + "id": "RestJsonInputAndOutputWithStringHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with string header bindings", + "params": { + "headerString": "Hello", + "headerStringList": [ + "a", + "b", + "c" + ], + "headerStringSet": [ + "a", + "b", + "c" + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-String": "Hello", + "X-StringList": "a, b, c", + "X-StringSet": "a, b, c" + } + } + }, + { + "id": "RestJsonInputAndOutputWithQuotedStringHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with string list header bindings that require quoting", + "params": { + "headerStringList": [ + "b,c", + "\"def\"", + "a" + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-StringList": "\"b,c\", \"\\\"def\\\"\", a" + } + } + }, + { + "id": "RestJsonInputAndOutputWithNumericHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with numeric header bindings", + "params": { + "headerByte": 1, + "headerShort": 123, + "headerInteger": 123, + "headerLong": 123, + "headerFloat": 1.1, + "headerDouble": 1.1, + "headerIntegerList": [ + 1, + 2, + 3 + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Byte": "1", + "X-Double": "1.1", + "X-Float": "1.1", + "X-Integer": "123", + "X-IntegerList": "1, 2, 3", + "X-Long": "123", + "X-Short": "123" + } + } + }, + { + "id": "RestJsonInputAndOutputWithBooleanHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with boolean header bindings", + "params": { + "headerTrueBool": true, + "headerFalseBool": false, + "headerBooleanList": [ + true, + false, + true + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Boolean1": "true", + "X-Boolean2": "false", + "X-BooleanList": "true, false, true" + } + } + }, + { + "id": "RestJsonInputAndOutputWithTimestampHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with timestamp header bindings", + "params": { + "headerTimestampList": [ + 1576540098, + 1576540098 + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-TimestampList": "Mon, 16 Dec 2019 23:48:18 GMT, Mon, 16 Dec 2019 23:48:18 GMT" + } + } + }, + { + "id": "RestJsonInputAndOutputWithEnumHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with enum header bindings", + "params": { + "headerEnum": "Foo", + "headerEnumList": [ + "Foo", + "Bar", + "Baz" + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Enum": "Foo", + "X-EnumList": "Foo, Bar, Baz" + } + } + }, + { + "id": "RestJsonInputAndOutputWithIntEnumHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with intEnum header bindings", + "params": { + "headerIntegerEnum": 1, + "headerIntegerEnumList": [ + 1, + 2, + 3 + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-IntegerEnum": "1", + "X-IntegerEnumList": "1, 2, 3" + } + } + }, + { + "id": "RestJsonSupportsNaNFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling NaN float header values.", + "params": { + "headerFloat": "NaN", + "headerDouble": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "NaN", + "X-Float": "NaN" + } + } + }, + { + "id": "RestJsonSupportsInfinityFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling Infinity float header values.", + "params": { + "headerFloat": "Infinity", + "headerDouble": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "Infinity", + "X-Float": "Infinity" + } + } + }, + { + "id": "RestJsonSupportsNegativeInfinityFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling -Infinity float header values.", + "params": { + "headerFloat": "-Infinity", + "headerDouble": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "-Infinity", + "X-Float": "-Infinity" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "payload": "foo" - }, - "name": "OperationName" - }, - "params": { - "foo": "bar" - }, - "serialized": { - "method": "POST", - "body": "bar", - "uri": "/" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "payload": "foo" - }, - "name": "OperationName" - }, - "params": { - }, - "serialized": { - "method": "POST", - "body": "", - "uri": "/" - } - } - ] - }, - { - "description": "Structure payload", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for JsonBlobs operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "JsonBlobsInputOutput": { + "type": "structure", + "members": { + "data": { + "shape": "Blob" + } + } + }, + "Blob": { + "type": "blob" + } + }, + "cases": [ + { + "id": "RestJsonJsonBlobs", + "given": { + "name": "JsonBlobs", + "http": { + "method": "POST", + "requestUri": "/JsonBlobs", + "responseCode": 200 + }, + "input": { + "shape": "JsonBlobsInputOutput" + }, + "documentation": "Blobs are base64 encoded
" + }, + "description": "Blobs are base64 encoded", + "params": { + "data": "value" + }, + "serialized": { + "method": "POST", + "uri": "/JsonBlobs", + "body": "{\n \"data\": \"dmFsdWU=\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - } - }, - "FooShape": { - "locationName": "foo", - "type": "structure", - "members": { - "baz": { - "shape": "BazShape" - } - } - }, - "BazShape": { - "type": "string" - } + { + "description": "Test cases for JsonEnums operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "JsonEnumsInputOutput": { + "type": "structure", + "members": { + "fooEnum1": { + "shape": "FooEnum" + }, + "fooEnum2": { + "shape": "FooEnum" + }, + "fooEnum3": { + "shape": "FooEnum" + }, + "fooEnumList": { + "shape": "FooEnumList" + }, + "fooEnumSet": { + "shape": "FooEnumSet" + }, + "fooEnumMap": { + "shape": "FooEnumMap" + } + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "FooEnumSet": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "FooEnumMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "FooEnum" + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonJsonEnums", + "given": { + "name": "JsonEnums", + "http": { + "method": "PUT", + "requestUri": "/JsonEnums", + "responseCode": 200 + }, + "input": { + "shape": "JsonEnumsInputOutput" + }, + "documentation": "This example serializes enums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "fooEnum1": "Foo", + "fooEnum2": "0", + "fooEnum3": "1", + "fooEnumList": [ + "Foo", + "0" + ], + "fooEnumSet": [ + "Foo", + "0" + ], + "fooEnumMap": { + "hi": "Foo", + "zero": "0" + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonEnums", + "body": "{\n \"fooEnum1\": \"Foo\",\n \"fooEnum2\": \"0\",\n \"fooEnum3\": \"1\",\n \"fooEnumList\": [\n \"Foo\",\n \"0\"\n ],\n \"fooEnumSet\": [\n \"Foo\",\n \"0\"\n ],\n \"fooEnumMap\": {\n \"hi\": \"Foo\",\n \"zero\": \"0\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "payload": "foo" - }, - "name": "OperationName" - }, - "params": { - "foo": { - "baz": "bar" - } - }, - "serialized": { - "method": "POST", - "body": "{\"baz\": \"bar\"}", - "uri": "/" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "payload": "foo" - }, - "name": "OperationName" - }, - "params": {}, - "serialized": { - "method": "POST", - "body": "{}", - "uri": "/" - } - } - ] - }, - { - "description": "Omits null query params, but serializes empty strings", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for JsonIntEnums operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "JsonIntEnumsInputOutput": { + "type": "structure", + "members": { + "integerEnum1": { + "shape": "IntegerEnum" + }, + "integerEnum2": { + "shape": "IntegerEnum" + }, + "integerEnum3": { + "shape": "IntegerEnum" + }, + "integerEnumList": { + "shape": "IntegerEnumList" + }, + "integerEnumSet": { + "shape": "IntegerEnumSet" + }, + "integerEnumMap": { + "shape": "IntegerEnumMap" + } + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "IntegerEnumSet": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "IntegerEnumMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "IntegerEnum" + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonJsonIntEnums", + "given": { + "name": "JsonIntEnums", + "http": { + "method": "PUT", + "requestUri": "/JsonIntEnums", + "responseCode": 200 + }, + "input": { + "shape": "JsonIntEnumsInputOutput" + }, + "documentation": "This example serializes intEnums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes intEnums as integers", + "params": { + "integerEnum1": 1, + "integerEnum2": 2, + "integerEnum3": 3, + "integerEnumList": [ + 1, + 2, + 3 + ], + "integerEnumSet": [ + 1, + 2 + ], + "integerEnumMap": { + "abc": 1, + "def": 2 + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonIntEnums", + "body": "{\n \"integerEnum1\": 1,\n \"integerEnum2\": 2,\n \"integerEnum3\": 3,\n \"integerEnumList\": [\n 1,\n 2,\n 3\n ],\n \"integerEnumSet\": [\n 1,\n 2\n ],\n \"integerEnumMap\": {\n \"abc\": 1,\n \"def\": 2\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "location":"querystring", - "locationName":"param-name", - "shape": "Foo" - } - } - }, - "Foo": { - "type": "string" - } + { + "description": "Test cases for JsonLists operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "JsonListsInputOutput": { + "type": "structure", + "members": { + "stringList": { + "shape": "StringList" + }, + "stringSet": { + "shape": "StringSet" + }, + "integerList": { + "shape": "IntegerList" + }, + "booleanList": { + "shape": "BooleanList" + }, + "timestampList": { + "shape": "TimestampList" + }, + "enumList": { + "shape": "FooEnumList" + }, + "intEnumList": { + "shape": "IntegerEnumList" + }, + "nestedStringList": { + "shape": "NestedStringList" + }, + "structureList": { + "shape": "StructureList", + "locationName": "myStructureList" + } + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringSet": { + "type": "list", + "member": { + "shape": "String" + } + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "NestedStringList": { + "type": "list", + "member": { + "shape": "StringList" + }, + "documentation": "A list of lists of strings.
" + }, + "StructureList": { + "type": "list", + "member": { + "shape": "StructureListMember" + } + }, + "StructureListMember": { + "type": "structure", + "members": { + "a": { + "shape": "String", + "locationName": "value" + }, + "b": { + "shape": "String", + "locationName": "other" + } + } + }, + "String": { + "type": "string" + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "Timestamp": { + "type": "timestamp" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + } + }, + "cases": [ + { + "id": "RestJsonLists", + "given": { + "name": "JsonLists", + "http": { + "method": "PUT", + "requestUri": "/JsonLists", + "responseCode": 200 + }, + "input": { + "shape": "JsonListsInputOutput" + }, + "documentation": "This test case serializes JSON lists for the following cases for both input and output:
This test case serializes JSON lists for the following cases for both input and output:
The example tests basic map serialization.
" + }, + "description": "Serializes JSON maps", + "params": { + "denseStructMap": { + "foo": { + "hi": "there" + }, + "baz": { + "hi": "bye" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/JsonMaps", + "body": "{\n \"denseStructMap\": {\n \"foo\": {\n \"hi\": \"there\"\n },\n \"baz\": {\n \"hi\": \"bye\"\n }\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializesZeroValuesInMaps", + "given": { + "name": "JsonMaps", + "http": { + "method": "POST", + "requestUri": "/JsonMaps", + "responseCode": 200 + }, + "input": { + "shape": "JsonMapsInputOutput" + }, + "documentation": "The example tests basic map serialization.
" + }, + "description": "Ensure that 0 and false are sent over the wire in all maps and lists", + "params": { + "denseNumberMap": { + "x": 0 + }, + "denseBooleanMap": { + "x": false + } + }, + "serialized": { + "method": "POST", + "uri": "/JsonMaps", + "body": "{\n \"denseNumberMap\": {\n \"x\": 0\n },\n \"denseBooleanMap\": {\n \"x\": false\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializesDenseSetMap", + "given": { + "name": "JsonMaps", + "http": { + "method": "POST", + "requestUri": "/JsonMaps", + "responseCode": 200 + }, + "input": { + "shape": "JsonMapsInputOutput" + }, + "documentation": "The example tests basic map serialization.
" + }, + "description": "A request that contains a dense map of sets.", + "params": { + "denseSetMap": { + "x": [], + "y": [ + "a", + "b" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/JsonMaps", + "body": "{\n \"denseSetMap\": {\n \"x\": [],\n \"y\": [\"a\", \"b\"]\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "RecursiveStruct": { - "shape": "RecursiveStructType" - } - } - }, - "RecursiveStructType": { - "type": "structure", - "members": { - "NoRecurse": { - "shape": "StringType" - }, - "RecursiveStruct": { - "shape": "RecursiveStructType" - }, - "RecursiveList": { - "shape": "RecursiveListType" - }, - "RecursiveMap": { - "shape": "RecursiveMapType" - } - } - }, - "RecursiveListType": { - "type": "list", - "member": { - "shape": "RecursiveStructType" - } - }, - "RecursiveMapType": { - "type": "map", - "key": { - "shape": "StringType" - }, - "value": { - "shape": "RecursiveStructType" - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for JsonTimestamps operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "JsonTimestampsInputOutput": { + "type": "structure", + "members": { + "normal": { + "shape": "Timestamp" + }, + "dateTime": { + "shape": "SyntheticTimestamp_date_time" + }, + "dateTimeOnTarget": { + "shape": "DateTime" + }, + "epochSeconds": { + "shape": "SyntheticTimestamp_epoch_seconds" + }, + "epochSecondsOnTarget": { + "shape": "EpochSeconds" + }, + "httpDate": { + "shape": "SyntheticTimestamp_http_date" + }, + "httpDateOnTarget": { + "shape": "HttpDate" + } + } + }, + "Timestamp": { + "type": "timestamp" + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "DateTime": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "SyntheticTimestamp_http_date": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "HttpDate": { + "type": "timestamp", + "timestampFormat": "rfc822" + } + }, + "cases": [ + { + "id": "RestJsonJsonTimestamps", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Tests how normal timestamps are serialized", + "params": { + "normal": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"normal\": 1398796238\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithDateTimeFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of date-time works like normal timestamps", + "params": { + "dateTime": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"dateTime\": \"2014-04-29T18:30:38Z\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithDateTimeOnTargetFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of date-time on the target shape works like normal timestamps", + "params": { + "dateTimeOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"dateTimeOnTarget\": \"2014-04-29T18:30:38Z\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithEpochSecondsFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of epoch-seconds works", + "params": { + "epochSeconds": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"epochSeconds\": 1398796238\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithEpochSecondsOnTargetFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of epoch-seconds on the target shape works", + "params": { + "epochSecondsOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"epochSecondsOnTarget\": 1398796238\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithHttpDateFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of http-date works", + "params": { + "httpDate": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"httpDate\": \"Tue, 29 Apr 2014 18:30:38 GMT\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonJsonTimestampsWithHttpDateOnTargetFormat", + "given": { + "name": "JsonTimestamps", + "http": { + "method": "POST", + "requestUri": "/JsonTimestamps", + "responseCode": 200 + }, + "input": { + "shape": "JsonTimestampsInputOutput" + }, + "documentation": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of http-date on the target shape works", + "params": { + "httpDateOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/JsonTimestamps", + "body": "{\n \"httpDateOnTarget\": \"Tue, 29 Apr 2014 18:30:38 GMT\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - }, - "serialized": { - "uri": "/path" , - "headers": {}, - "body": "{\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - } - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"RecursiveStruct\": {\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "RecursiveStruct": { - "NoRecurse": "foo" - } - } - } - } - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"RecursiveStruct\": {\"RecursiveStruct\": {\"RecursiveStruct\": {\"RecursiveStruct\": {\"NoRecurse\": \"foo\"}}}}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "NoRecurse": "bar" - } - ] - } - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"RecursiveStruct\": {\"RecursiveList\": [{\"NoRecurse\": \"foo\"}, {\"NoRecurse\": \"bar\"}]}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveList": [ - { - "NoRecurse": "foo" - }, - { - "RecursiveStruct": { - "NoRecurse": "bar" - } - } - ] - } - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"RecursiveStruct\": {\"RecursiveList\": [{\"NoRecurse\": \"foo\"}, {\"RecursiveStruct\": {\"NoRecurse\": \"bar\"}}]}}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "RecursiveStruct": { - "RecursiveMap": { - "foo": { - "NoRecurse": "foo" - }, - "bar": { - "NoRecurse": "bar" - } - } - } - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"RecursiveStruct\": {\"RecursiveMap\": {\"foo\": {\"NoRecurse\": \"foo\"}, \"bar\": {\"NoRecurse\": \"bar\"}}}}" - } - } - ] - }, - { - "description": "Timestamp values", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for JsonUnions operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "UnionInputOutput": { + "type": "structure", + "members": { + "contents": { + "shape": "MyUnion" + } + }, + "documentation": "A shared structure that contains a single union member.
" + }, + "MyUnion": { + "type": "structure", + "members": { + "stringValue": { + "shape": "String" + }, + "booleanValue": { + "shape": "Boolean" + }, + "numberValue": { + "shape": "Integer" + }, + "blobValue": { + "shape": "Blob" + }, + "timestampValue": { + "shape": "Timestamp" + }, + "enumValue": { + "shape": "FooEnum" + }, + "listValue": { + "shape": "StringList" + }, + "mapValue": { + "shape": "StringMap" + }, + "structureValue": { + "shape": "GreetingStruct" + }, + "renamedStructureValue": { + "shape": "RenamedGreeting" + } + }, + "documentation": "A union with a representative set of types for members.
", + "union": true + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + }, + "Blob": { + "type": "blob" + }, + "Timestamp": { + "type": "timestamp" + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "GreetingStruct": { + "type": "structure", + "members": { + "hi": { + "shape": "String" + } + } + }, + "RenamedGreeting": { + "type": "structure", + "members": { + "salutation": { + "shape": "String" + } + } + } + }, + "cases": [ + { + "id": "RestJsonSerializeStringUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a string union value", + "params": { + "contents": { + "stringValue": "foo" + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"stringValue\": \"foo\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeBooleanUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a boolean union value", + "params": { + "contents": { + "booleanValue": true + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"booleanValue\": true\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeNumberUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a number union value", + "params": { + "contents": { + "numberValue": 1 + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"numberValue\": 1\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeBlobUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a blob union value", + "params": { + "contents": { + "blobValue": "foo" + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"blobValue\": \"Zm9v\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeTimestampUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a timestamp union value", + "params": { + "contents": { + "timestampValue": 1398796238 + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"timestampValue\": 1398796238\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeEnumUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes an enum union value", + "params": { + "contents": { + "enumValue": "Foo" + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"enumValue\": \"Foo\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeListUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a list union value", + "params": { + "contents": { + "listValue": [ + "foo", + "bar" + ] + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"listValue\": [\"foo\", \"bar\"]\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeMapUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a map union value", + "params": { + "contents": { + "mapValue": { + "foo": "bar", + "spam": "eggs" + } + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"mapValue\": {\n \"foo\": \"bar\",\n \"spam\": \"eggs\"\n }\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeStructureUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a structure union value", + "params": { + "contents": { + "structureValue": { + "hi": "hello" + } + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"structureValue\": {\n \"hi\": \"hello\"\n }\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSerializeRenamedStructureUnionValue", + "given": { + "name": "JsonUnions", + "http": { + "method": "PUT", + "requestUri": "/JsonUnions", + "responseCode": 200 + }, + "input": { + "shape": "UnionInputOutput" + }, + "documentation": "This operation uses unions for inputs and outputs.
", + "idempotent": true + }, + "description": "Serializes a renamed structure union value", + "params": { + "contents": { + "renamedStructureValue": { + "salutation": "hello!" + } + } + }, + "serialized": { + "method": "PUT", + "uri": "/JsonUnions", + "body": "{\n \"contents\": {\n \"renamedStructureValue\": {\n \"salutation\": \"hello!\"\n }\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "TimeArg": { - "shape": "TimestampType" - }, - "TimeArgInHeader": { - "shape": "TimestampType", - "location": "header", - "locationName": "x-amz-timearg" - }, - "TimeArgInQuery": { - "shape": "TimestampType", - "location": "querystring", - "locationName": "TimeQuery" - }, - "TimeCustom": { - "timestampFormat": "iso8601", - "shape": "TimestampType" - }, - "TimeCustomInHeader": { - "timestampFormat": "unixTimestamp", - "shape": "TimestampType", - "location": "header", - "locationName": "x-amz-timecustom-header" - }, - "TimeCustomInQuery": { - "timestampFormat": "unixTimestamp", - "shape": "TimestampType", - "location": "querystring", - "locationName": "TimeCustomQuery" - }, - "TimeFormat": { - "shape": "TimestampFormatRfcType" - }, - "TimeFormatInHeader": { - "shape": "TimestampFormatUnixType", - "location": "header", - "locationName": "x-amz-timeformat-header" - }, - "TimeFormatInQuery": { - "shape": "TimestampFormatUnixType", - "location": "querystring", - "locationName": "TimeFormatQuery" - } - } - }, - "TimestampFormatRfcType": { - "timestampFormat": "rfc822", - "type": "timestamp" - }, - "TimestampFormatUnixType": { - "timestampFormat": "unixTimestamp", - "type": "timestamp" - }, - "TimestampType": { - "type": "timestamp" - } + { + "description": "Test cases for MediaTypeHeader operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "MediaTypeHeaderInput": { + "type": "structure", + "members": { + "json": { + "shape": "JsonValue", + "jsonvalue": true, + "location": "header", + "locationName": "X-Json" + } + } + }, + "JsonValue": { + "type": "string" + } + }, + "cases": [ + { + "id": "MediaTypeHeaderInputBase64", + "given": { + "name": "MediaTypeHeader", + "http": { + "method": "GET", + "requestUri": "/MediaTypeHeader", + "responseCode": 200 + }, + "input": { + "shape": "MediaTypeHeaderInput" + }, + "documentation": "This example ensures that mediaType strings are base64 encoded in headers.
" + }, + "description": "Headers that target strings with a mediaType are base64 encoded", + "params": { + "json": "true" + }, + "serialized": { + "method": "GET", + "uri": "/MediaTypeHeader", + "body": "", + "headers": { + "X-Json": "dHJ1ZQ==" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "TimeArg": 1422172800, - "TimeArgInQuery": 1422172800, - "TimeArgInHeader": 1422172800, - "TimeCustom": 1422172800, - "TimeCustomInQuery": 1422172800, - "TimeCustomInHeader": 1422172800, - "TimeFormat": 1422172800, - "TimeFormatInQuery": 1422172800, - "TimeFormatInHeader": 1422172800 - }, - "serialized": { - "uri": "/path?TimeQuery=2015-01-25T08%3A00%3A00Z&TimeCustomQuery=1422172800&TimeFormatQuery=1422172800", - "headers": { - "x-amz-timearg": "Sun, 25 Jan 2015 08:00:00 GMT", - "x-amz-timecustom-header": "1422172800", - "x-amz-timeformat-header": "1422172800" - }, - "body": "{\"TimeArg\": 1422172800, \"TimeCustom\": \"2015-01-25T08:00:00Z\", \"TimeFormat\": \"Sun, 25 Jan 2015 08:00:00 GMT\"}" - } - } - ] - }, - { - "description": "Named locations in JSON body", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for NoInputAndNoOutput operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonNoInputAndNoOutput", + "given": { + "name": "NoInputAndNoOutput", + "http": { + "method": "POST", + "requestUri": "/NoInputAndNoOutput", + "responseCode": 200 + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input or output. While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload. When clients do not need to\nserialize any data in the payload, they should omit a payload\naltogether.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/NoInputAndNoOutput", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "TimeArg": { - "shape": "TimestampType", - "locationName": "timestamp_location" - } - } - }, - "TimestampType": { - "type": "timestamp" - } + { + "description": "Test cases for NoInputAndOutput operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonNoInputAndOutput", + "given": { + "name": "NoInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/NoInputAndOutputOutput", + "responseCode": 200 + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input and the output is empty. While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload. When clients do not need to\nserialize any data in the payload, they should omit a payload\naltogether.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/NoInputAndOutputOutput", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "TimeArg": 1422172800 - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"timestamp_location\": 1422172800}" - } - } - ] - }, - { - "description": "String payload", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for NullAndEmptyHeadersClient operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "NullAndEmptyHeadersIO": { + "type": "structure", + "members": { + "a": { + "shape": "String", + "location": "header", + "locationName": "X-A" + }, + "b": { + "shape": "String", + "location": "header", + "locationName": "X-B" + }, + "c": { + "shape": "StringList", + "location": "header", + "locationName": "X-C" + } + } + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestJsonNullAndEmptyHeaders", + "given": { + "name": "NullAndEmptyHeadersClient", + "http": { + "method": "GET", + "requestUri": "/NullAndEmptyHeadersClient", + "responseCode": 200 + }, + "input": { + "shape": "NullAndEmptyHeadersIO" + }, + "documentation": "Null headers are not sent over the wire, empty headers are serialized to ""
" + }, + "description": "Do not send null values, but do send empty strings and empty lists over the wire in headers", + "params": { + "a": null, + "b": "", + "c": [] + }, + "serialized": { + "method": "GET", + "uri": "/NullAndEmptyHeadersClient", + "body": "", + "headers": { + "X-B": "", + "X-C": "" + }, + "forbidHeaders": [ + "X-A" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - } - }, - "FooShape": { - "type": "string" - } + { + "description": "Test cases for OmitsNullSerializesEmptyString operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "OmitsNullSerializesEmptyStringInput": { + "type": "structure", + "members": { + "nullValue": { + "shape": "String", + "location": "querystring", + "locationName": "Null" + }, + "emptyString": { + "shape": "String", + "location": "querystring", + "locationName": "Empty" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonOmitsNullQuery", + "given": { + "name": "OmitsNullSerializesEmptyString", + "http": { + "method": "GET", + "requestUri": "/OmitsNullSerializesEmptyString", + "responseCode": 200 + }, + "input": { + "shape": "OmitsNullSerializesEmptyStringInput" + }, + "documentation": "Omits null, but serializes empty string value.
" + }, + "description": "Omits null query values", + "params": { + "nullValue": null + }, + "serialized": { + "method": "GET", + "uri": "/OmitsNullSerializesEmptyString", + "body": "" + } + }, + { + "id": "RestJsonSerializesEmptyQueryValue", + "given": { + "name": "OmitsNullSerializesEmptyString", + "http": { + "method": "GET", + "requestUri": "/OmitsNullSerializesEmptyString", + "responseCode": 200 + }, + "input": { + "shape": "OmitsNullSerializesEmptyStringInput" + }, + "documentation": "Omits null, but serializes empty string value.
" + }, + "description": "Serializes empty query strings", + "params": { + "emptyString": "" + }, + "serialized": { + "method": "GET", + "uri": "/OmitsNullSerializesEmptyString?Empty=", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "payload": "foo" - }, - "name": "OperationName" - }, - "params": { - "foo": "bar" - }, - "serialized": { - "method": "POST", - "body": "bar", - "uri": "/" - } - } - ] - }, - { - "description": "Idempotency token auto fill", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for OmitsSerializingEmptyLists operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "OmitsSerializingEmptyListsInput": { + "type": "structure", + "members": { + "queryStringList": { + "shape": "StringList", + "location": "querystring", + "locationName": "StringList" + }, + "queryIntegerList": { + "shape": "IntegerList", + "location": "querystring", + "locationName": "IntegerList" + }, + "queryDoubleList": { + "shape": "DoubleList", + "location": "querystring", + "locationName": "DoubleList" + }, + "queryBooleanList": { + "shape": "BooleanList", + "location": "querystring", + "locationName": "BooleanList" + }, + "queryTimestampList": { + "shape": "TimestampList", + "location": "querystring", + "locationName": "TimestampList" + }, + "queryEnumList": { + "shape": "FooEnumList", + "location": "querystring", + "locationName": "EnumList" + }, + "queryIntegerEnumList": { + "shape": "IntegerEnumList", + "location": "querystring", + "locationName": "IntegerEnumList" + } + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "DoubleList": { + "type": "list", + "member": { + "shape": "Double" + } + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "Timestamp": { + "type": "timestamp" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonOmitsEmptyListQueryValues", + "given": { + "name": "OmitsSerializingEmptyLists", + "http": { + "method": "POST", + "requestUri": "/OmitsSerializingEmptyLists", + "responseCode": 200 + }, + "input": { + "shape": "OmitsSerializingEmptyListsInput" + }, + "documentation": "Omits serializing empty lists. Because empty strings are serilized as Foo=
, empty lists cannot also be serialized as Foo=
and instead must be omitted.
This operation defines a union that uses jsonName on some members.
" + }, + "description": "Tests that jsonName works with union members.", + "params": { + "value": { + "foo": "hi" + } + }, + "serialized": { + "method": "POST", + "uri": "/PostUnionWithJsonName", + "body": "{\n \"value\": {\n \"FOO\": \"hi\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "PostUnionWithJsonNameRequest2", + "given": { + "name": "PostUnionWithJsonName", + "http": { + "method": "POST", + "requestUri": "/PostUnionWithJsonName", + "responseCode": 200 + }, + "input": { + "shape": "PostUnionWithJsonNameInput" + }, + "documentation": "This operation defines a union that uses jsonName on some members.
" + }, + "description": "Tests that jsonName works with union members.", + "params": { + "value": { + "baz": "hi" + } + }, + "serialized": { + "method": "POST", + "uri": "/PostUnionWithJsonName", + "body": "{\n \"value\": {\n \"_baz\": \"hi\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "PostUnionWithJsonNameRequest3", + "given": { + "name": "PostUnionWithJsonName", + "http": { + "method": "POST", + "requestUri": "/PostUnionWithJsonName", + "responseCode": 200 + }, + "input": { + "shape": "PostUnionWithJsonNameInput" + }, + "documentation": "This operation defines a union that uses jsonName on some members.
" + }, + "description": "Tests that jsonName works with union members.", + "params": { + "value": { + "bar": "hi" + } + }, + "serialized": { + "method": "POST", + "uri": "/PostUnionWithJsonName", + "body": "{\n \"value\": {\n \"bar\": \"hi\"\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "Token": "abc123" - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"Token\": \"abc123\"}" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "{\"Token\": \"00000000-0000-4000-8000-000000000000\"}" - } - } - ] - }, - { - "description": "JSON value trait", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String", + "location": "header", + "locationName": "Content-Encoding" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "SDKAppliedContentEncoding_restJson1", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/requestcompression/putcontentwithencoding", + "responseCode": 200 + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/requestcompression/putcontentwithencoding", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendedGzipAfterProvidedEncoding_restJson1", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/requestcompression/putcontentwithencoding", + "responseCode": 200 + }, + "input": { + "shape": "PutWithContentEncodingInput" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is in the Content-Encoding header before the\nrequest compression encoding from the HTTP binding.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/requestcompression/putcontentwithencoding", + "headers": { + "Content-Encoding": "custom, gzip" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Attr": { - "shape": "StringType", - "jsonvalue": true, - "location": "header", - "locationName": "X-Amz-Foo" - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for QueryIdempotencyTokenAutoFill operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryIdempotencyTokenAutoFillInput": { + "type": "structure", + "members": { + "token": { + "shape": "String", + "idempotencyToken": true, + "location": "querystring", + "locationName": "token" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonQueryIdempotencyTokenAutoFill", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/QueryIdempotencyTokenAutoFill", + "responseCode": 200 + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Automatically adds idempotency token when not set", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/QueryIdempotencyTokenAutoFill?token=00000000-0000-4000-8000-000000000000", + "body": "" + } + }, + { + "id": "RestJsonQueryIdempotencyTokenAutoFillIsSet", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/QueryIdempotencyTokenAutoFill", + "responseCode": 200 + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Uses the given idempotency token as-is", + "params": { + "token": "00000000-0000-4000-8000-000000000000" + }, + "serialized": { + "method": "POST", + "uri": "/QueryIdempotencyTokenAutoFill?token=00000000-0000-4000-8000-000000000000", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - "Attr": {"Foo":"Bar"} - }, - "serialized": { - "uri": "/path", - "headers": {"X-Amz-Foo": "eyJGb28iOiJCYXIifQ=="}, - "body": "" - } - }, - { - "given": { - "input": { - "shape": "InputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "name": "OperationName" - }, - "params": { - }, - "serialized": { - "uri": "/path", - "headers": {}, - "body": "" - } - } - ] - }, - { - "description": "Endpoint host trait", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for QueryParamsAsStringListMap operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryParamsAsStringListMapInput": { + "type": "structure", + "members": { + "qux": { + "shape": "String", + "location": "querystring", + "locationName": "corge" + }, + "foo": { + "shape": "StringListMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringListMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "StringList" + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestJsonQueryParamsStringListMap", + "given": { + "name": "QueryParamsAsStringListMap", + "http": { + "method": "POST", + "requestUri": "/StringListMap", + "responseCode": 200 + }, + "input": { + "shape": "QueryParamsAsStringListMapInput" + } + }, + "description": "Serialize query params from map of list strings", + "params": { + "qux": "named", + "foo": { + "baz": [ + "bar", + "qux" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/StringListMap?corge=named&baz=bar&baz=qux", + "body": "" + } + } + ] }, - "clientEndpoint": "https://service.region.amazonaws.com", - "shapes": { - "StaticInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - } - } - }, - "MemberRefInputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType", - "hostLabel": true - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for QueryPrecedence operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryPrecedenceInput": { + "type": "structure", + "members": { + "foo": { + "shape": "String", + "location": "querystring", + "locationName": "bar" + }, + "baz": { + "shape": "StringMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestJsonQueryPrecedence", + "given": { + "name": "QueryPrecedence", + "http": { + "method": "POST", + "requestUri": "/Precedence", + "responseCode": 200 + }, + "input": { + "shape": "QueryPrecedenceInput" + } + }, + "description": "Prefer named query parameters when serializing", + "params": { + "foo": "named", + "baz": { + "bar": "fromMap", + "qux": "alsoFromMap" + } + }, + "serialized": { + "method": "POST", + "uri": "/Precedence?bar=named&qux=alsoFromMap", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "name": "StaticOp", - "input": { - "shape": "StaticInputShape" - }, - "http": { - "method": "POST", - "requestUri": "/path" - }, - "endpoint":{ - "hostPrefix": "data-" - } - }, - "params": { - "Name": "myname" - }, - "serialized": { - "uri": "/path", - "body": "{\"Name\": \"myname\"}", - "host": "data-service.region.amazonaws.com" - } - }, - { - "given": { - "name": "MemberRefOp", - "input": { - "shape": "MemberRefInputShape" - }, - "http": { - "method": "GET", - "requestUri": "/path" - }, - "endpoint":{ - "hostPrefix": "foo-{Name}." - } - }, - "params": { - "Name": "myname" - }, - "serialized": { - "uri": "/path", - "body": "{\"Name\": \"myname\"}", - "host": "foo-myname.service.region.amazonaws.com" - } - } - ] - }, - { - "description": "Serializes document with standalone primitive as part of the JSON request payload with no escaping.", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for RecursiveShapes operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "RecursiveShapesInputOutput": { + "type": "structure", + "members": { + "nested": { + "shape": "RecursiveShapesInputOutputNested1" + } + } + }, + "RecursiveShapesInputOutputNested1": { + "type": "structure", + "members": { + "foo": { + "shape": "String" + }, + "nested": { + "shape": "RecursiveShapesInputOutputNested2" + } + } + }, + "String": { + "type": "string" + }, + "RecursiveShapesInputOutputNested2": { + "type": "structure", + "members": { + "bar": { + "shape": "String" + }, + "recursiveMember": { + "shape": "RecursiveShapesInputOutputNested1" + } + } + } + }, + "cases": [ + { + "id": "RestJsonRecursiveShapes", + "given": { + "name": "RecursiveShapes", + "http": { + "method": "PUT", + "requestUri": "/RecursiveShapes", + "responseCode": 200 + }, + "input": { + "shape": "RecursiveShapesInputOutput" + }, + "documentation": "Recursive shapes
", + "idempotent": true + }, + "description": "Serializes recursive structures", + "params": { + "nested": { + "foo": "Foo1", + "nested": { + "bar": "Bar1", + "recursiveMember": { + "foo": "Foo2", + "nested": { + "bar": "Bar2" + } + } + } + } + }, + "serialized": { + "method": "PUT", + "uri": "/RecursiveShapes", + "body": "{\n \"nested\": {\n \"foo\": \"Foo1\",\n \"nested\": {\n \"bar\": \"Bar1\",\n \"recursiveMember\": {\n \"foo\": \"Foo2\",\n \"nested\": {\n \"bar\": \"Bar2\"\n }\n }\n }\n }\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "documentValue": { - "shape": "DocumentType" - } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + { + "description": "Test cases for SimpleScalarProperties operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "SimpleScalarPropertiesInputOutput": { + "type": "structure", + "members": { + "foo": { + "shape": "String", + "location": "header", + "locationName": "X-Foo" + }, + "stringValue": { + "shape": "String" + }, + "trueBooleanValue": { + "shape": "Boolean" + }, + "falseBooleanValue": { + "shape": "Boolean" + }, + "byteValue": { + "shape": "Integer" + }, + "shortValue": { + "shape": "Integer" + }, + "integerValue": { + "shape": "Integer" + }, + "longValue": { + "shape": "Long" + }, + "floatValue": { + "shape": "Float" + }, + "doubleValue": { + "shape": "Double", + "locationName": "DoubleDribble" + } + } + }, + "String": { + "type": "string" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + } + }, + "cases": [ + { + "id": "RestJsonSimpleScalarProperties", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "PUT", + "requestUri": "/SimpleScalarProperties", + "responseCode": 200 + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + }, + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "foo": "Foo", + "stringValue": "string", + "trueBooleanValue": true, + "falseBooleanValue": false, + "byteValue": 1, + "shortValue": 2, + "integerValue": 3, + "longValue": 4, + "floatValue": 5.5, + "doubleValue": 6.5 + }, + "serialized": { + "method": "PUT", + "uri": "/SimpleScalarProperties", + "body": "{\n \"stringValue\": \"string\",\n \"trueBooleanValue\": true,\n \"falseBooleanValue\": false,\n \"byteValue\": 1,\n \"shortValue\": 2,\n \"integerValue\": 3,\n \"longValue\": 4,\n \"floatValue\": 5.5,\n \"DoubleDribble\": 6.5\n}", + "headers": { + "Content-Type": "application/json", + "X-Foo": "Foo" + } + } + }, + { + "id": "RestJsonDoesntSerializeNullStructureValues", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "PUT", + "requestUri": "/SimpleScalarProperties", + "responseCode": 200 + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + }, + "idempotent": true + }, + "description": "Rest Json should not serialize null structure values", + "params": { + "stringValue": null + }, + "serialized": { + "method": "PUT", + "uri": "/SimpleScalarProperties", + "body": "{}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSupportsNaNFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "PUT", + "requestUri": "/SimpleScalarProperties", + "responseCode": 200 + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + }, + "idempotent": true + }, + "description": "Supports handling NaN float values.", + "params": { + "floatValue": "NaN", + "doubleValue": "NaN" + }, + "serialized": { + "method": "PUT", + "uri": "/SimpleScalarProperties", + "body": "{\n \"floatValue\": \"NaN\",\n \"DoubleDribble\": \"NaN\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSupportsInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "PUT", + "requestUri": "/SimpleScalarProperties", + "responseCode": 200 + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + }, + "idempotent": true + }, + "description": "Supports handling Infinity float values.", + "params": { + "floatValue": "Infinity", + "doubleValue": "Infinity" + }, + "serialized": { + "method": "PUT", + "uri": "/SimpleScalarProperties", + "body": "{\n \"floatValue\": \"Infinity\",\n \"DoubleDribble\": \"Infinity\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + }, + { + "id": "RestJsonSupportsNegativeInfinityFloatInputs", + "given": { + "name": "SimpleScalarProperties", + "http": { + "method": "PUT", + "requestUri": "/SimpleScalarProperties", + "responseCode": 200 + }, + "input": { + "shape": "SimpleScalarPropertiesInputOutput" + }, + "idempotent": true + }, + "description": "Supports handling -Infinity float values.", + "params": { + "floatValue": "-Infinity", + "doubleValue": "-Infinity" + }, + "serialized": { + "method": "PUT", + "uri": "/SimpleScalarProperties", + "body": "{\n \"floatValue\": \"-Infinity\",\n \"DoubleDribble\": \"-Infinity\"\n}", + "headers": { + "Content-Type": "application/json" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": "foo" - }, - "serialized": { - "body": "{\"documentValue\": \"foo\"}", - "uri": "/InlineDocument" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": 123 - }, - "serialized": { - "body": "{\"documentValue\": 123}", - "uri": "/InlineDocument" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": 1.2 - }, - "serialized": { - "body": "{\"documentValue\": 1.2}", - "uri": "/InlineDocument" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": true - }, - "serialized": { - "body": "{\"documentValue\": true}", - "uri": "/InlineDocument" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": "" - }, - "serialized": { - "body": "{\"documentValue\": \"\"}", - "uri": "/InlineDocument" - } - } - ] - }, - { - "description": "Serializes inline documents as part of the JSON request payload with no escaping.", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for TestBodyStructure operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TestBodyStructureInputOutput": { + "type": "structure", + "members": { + "testId": { + "shape": "String", + "location": "header", + "locationName": "x-amz-test-id" + }, + "testConfig": { + "shape": "TestConfig" + } + } + }, + "String": { + "type": "string" + }, + "TestConfig": { + "type": "structure", + "members": { + "timeout": { + "shape": "Integer" + } + } + }, + "Integer": { + "type": "integer", + "box": true + } + }, + "cases": [ + { + "id": "RestJsonTestBodyStructure", + "given": { + "name": "TestBodyStructure", + "http": { + "method": "POST", + "requestUri": "/body", + "responseCode": 200 + }, + "input": { + "shape": "TestBodyStructureInputOutput" + }, + "documentation": "This example operation serializes a structure in the HTTP body.
It should ensure Content-Type: application/json is used in all requests and that an "empty" body is an empty JSON document ({}).
", + "idempotent": true + }, + "description": "Serializes a structure", + "params": { + "testConfig": { + "timeout": 10 + } + }, + "serialized": { + "method": "POST", + "uri": "/body", + "body": "{\"testConfig\":\n {\"timeout\": 10}\n}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "RestJsonHttpWithEmptyBody", + "given": { + "name": "TestBodyStructure", + "http": { + "method": "POST", + "requestUri": "/body", + "responseCode": 200 + }, + "input": { + "shape": "TestBodyStructureInputOutput" + }, + "documentation": "This example operation serializes a structure in the HTTP body.
It should ensure Content-Type: application/json is used in all requests and that an "empty" body is an empty JSON document ({}).
", + "idempotent": true + }, + "description": "Serializes an empty structure in the body", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/body", + "body": "{}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "documentValue": { - "shape": "DocumentType" - } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + { + "description": "Test cases for TestGetNoInputNoPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonHttpGetWithNoInput", + "given": { + "name": "TestGetNoInputNoPayload", + "http": { + "method": "GET", + "requestUri": "/no_input_no_payload", + "responseCode": 200 + }, + "documentation": "This example GET operation has no input and serializes a request without a HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Length, Content-Type) to operations that semantically cannot produce an HTTP body.
" + }, + "description": "Serializes a GET request for an operation with no input, and therefore no modeled body", + "params": {}, + "serialized": { + "method": "GET", + "uri": "/no_input_no_payload", + "body": "", + "forbidHeaders": [ + "Content-Type", + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": {"foo": "bar"} - }, - "serialized": { - "body": "{\"documentValue\": {\"foo\": \"bar\"}}", - "uri": "/InlineDocument" - } - } - ] - }, - { - "description": "Serializes aggregate documents as part of the JSON request payload with no escaping.", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for TestGetNoPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TestNoPayloadInputOutput": { + "type": "structure", + "members": { + "testId": { + "shape": "String", + "location": "header", + "locationName": "X-Amz-Test-Id" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpGetWithNoModeledBody", + "given": { + "name": "TestGetNoPayload", + "http": { + "method": "GET", + "requestUri": "/no_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestNoPayloadInputOutput" + }, + "documentation": "This example GET operation serializes a request without a modeled HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Length, Content-Type) to operations that semantically cannot produce an HTTP body.
" + }, + "description": "Serializes a GET request with no modeled body", + "params": {}, + "serialized": { + "method": "GET", + "uri": "/no_payload", + "body": "", + "forbidHeaders": [ + "Content-Length", + "Content-Type" + ] + } + }, + { + "id": "RestJsonHttpGetWithHeaderMemberNoModeledBody", + "given": { + "name": "TestGetNoPayload", + "http": { + "method": "GET", + "requestUri": "/no_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestNoPayloadInputOutput" + }, + "documentation": "This example GET operation serializes a request without a modeled HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Length, Content-Type) to operations that semantically cannot produce an HTTP body.
" + }, + "description": "Serializes a GET request with header member but no modeled body", + "params": { + "testId": "t-12345" + }, + "serialized": { + "method": "GET", + "uri": "/no_payload", + "body": "", + "headers": { + "X-Amz-Test-Id": "t-12345" + }, + "forbidHeaders": [ + "Content-Length", + "Content-Type" + ] + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "documentValue": { - "shape": "DocumentType" - } - } - }, - "DocumentType": { - "type": "structure", - "document": true - } + { + "description": "Test cases for TestPayloadBlob operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TestPayloadBlobInputOutput": { + "type": "structure", + "members": { + "contentType": { + "shape": "String", + "location": "header", + "locationName": "Content-Type" + }, + "data": { + "shape": "Blob" + } + }, + "payload": "data" + }, + "String": { + "type": "string" + }, + "Blob": { + "type": "blob" + } + }, + "cases": [ + { + "id": "RestJsonHttpWithEmptyBlobPayload", + "given": { + "name": "TestPayloadBlob", + "http": { + "method": "POST", + "requestUri": "/blob_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestPayloadBlobInputOutput" + }, + "documentation": "This example operation serializes a payload targeting a blob.
The Blob shape is not structured content and we cannot make assumptions about what data will be sent. This test ensures only a generic "Content-Type: application/octet-stream" header is used, and that we are not treating an empty body as an empty JSON document.
", + "idempotent": true + }, + "description": "Serializes a payload targeting an empty blob", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/blob_payload", + "body": "" + } + }, + { + "id": "RestJsonTestPayloadBlob", + "given": { + "name": "TestPayloadBlob", + "http": { + "method": "POST", + "requestUri": "/blob_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestPayloadBlobInputOutput" + }, + "documentation": "This example operation serializes a payload targeting a blob.
The Blob shape is not structured content and we cannot make assumptions about what data will be sent. This test ensures only a generic "Content-Type: application/octet-stream" header is used, and that we are not treating an empty body as an empty JSON document.
", + "idempotent": true + }, + "description": "Serializes a payload targeting a blob", + "params": { + "contentType": "image/jpg", + "data": "1234" + }, + "serialized": { + "method": "POST", + "uri": "/blob_payload", + "body": "1234", + "headers": { + "Content-Type": "image/jpg" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": { - "str": "test", - "num": 123, - "float": 1.2, - "bool": true, - "null": "", - "document": {"foo": false}, - "list": ["myname", 321, 1.3, true, "", {"nested": true}, [200, ""]] - } - }, - "serialized": { - "body": "{\"documentValue\": {\"str\": \"test\", \"num\": 123, \"float\": 1.2, \"bool\": true, \"null\": \"\", \"document\": {\"foo\": false}, \"list\": [\"myname\", 321, 1.3, true, \"\", {\"nested\": true}, [200, \"\"]]}}", - "uri": "/InlineDocument" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/InlineDocument" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "documentValue": [ - "test", - 123, - 1.2, - true, - "", - {"str": "myname", "num": 321, "float": 1.3, "bool": true, "null": "", "document": {"nested": true}, "list": [200, ""]}, - ["foo", false] - ] - }, - "serialized": { - "body": "{\"documentValue\": [\"test\", 123, 1.2, true, \"\", {\"str\": \"myname\", \"num\": 321, \"float\": 1.3, \"bool\": true, \"null\": \"\", \"document\": {\"nested\": true}, \"list\": [200, \"\"]}, [\"foo\", false]]}", - "uri": "/InlineDocument" - } - } - ] - }, - { - "description": "Content-Type and JSON body", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for TestPayloadStructure operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TestPayloadStructureInputOutput": { + "type": "structure", + "members": { + "testId": { + "shape": "String", + "location": "header", + "locationName": "x-amz-test-id" + }, + "payloadConfig": { + "shape": "PayloadConfig" + } + }, + "payload": "payloadConfig" + }, + "String": { + "type": "string" + }, + "PayloadConfig": { + "type": "structure", + "members": { + "data": { + "shape": "Integer" + } + } + }, + "Integer": { + "type": "integer", + "box": true + } + }, + "cases": [ + { + "id": "RestJsonHttpWithEmptyStructurePayload", + "given": { + "name": "TestPayloadStructure", + "http": { + "method": "POST", + "requestUri": "/payload", + "responseCode": 200 + }, + "input": { + "shape": "TestPayloadStructureInputOutput" + }, + "documentation": "This example operation serializes a payload targeting a structure.
This enforces the same requirements as TestBodyStructure but with the body specified by the @httpPayload trait.
", + "idempotent": true + }, + "description": "Serializes a payload targeting an empty structure", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/payload", + "body": "{}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "RestJsonTestPayloadStructure", + "given": { + "name": "TestPayloadStructure", + "http": { + "method": "POST", + "requestUri": "/payload", + "responseCode": 200 + }, + "input": { + "shape": "TestPayloadStructureInputOutput" + }, + "documentation": "This example operation serializes a payload targeting a structure.
This enforces the same requirements as TestBodyStructure but with the body specified by the @httpPayload trait.
", + "idempotent": true + }, + "description": "Serializes a payload targeting a structure", + "params": { + "payloadConfig": { + "data": 25 + } + }, + "serialized": { + "method": "POST", + "uri": "/payload", + "body": "{\"data\": 25\n}", + "headers": { + "Content-Type": "application/json" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "RestJsonHttpWithHeadersButNoPayload", + "given": { + "name": "TestPayloadStructure", + "http": { + "method": "POST", + "requestUri": "/payload", + "responseCode": 200 + }, + "input": { + "shape": "TestPayloadStructureInputOutput" + }, + "documentation": "This example operation serializes a payload targeting a structure.
This enforces the same requirements as TestBodyStructure but with the body specified by the @httpPayload trait.
", + "idempotent": true + }, + "description": "Serializes an request with header members but no payload", + "params": { + "testId": "t-12345" + }, + "serialized": { + "method": "POST", + "uri": "/payload", + "body": "{}", + "headers": { + "Content-Type": "application/json", + "X-Amz-Test-Id": "t-12345" + }, + "requireHeaders": [ + "Content-Length" + ] + } + } + ] }, - "clientEndpoint": "https://rest-json-test.amazonaws.com", - "shapes":{ - "Integer":{ - "type":"integer" - }, - "String":{"type":"string"}, - "Blob":{"type":"blob"}, - "NoPayloadRequest":{ - "type":"structure", - "required":[], - "members":{ - "testId":{ - "shape":"TestId", - "documentation":"The unique ID for a test.
", - "location":"header", - "locationName":"x-amz-test-id" - } - }, - "documentation":"The request structure for a no payload request.
" - }, - "TestId":{ - "type":"string", - "max":8, - "min":3, - "pattern":"t-[a-z0-9-]+" - }, - "TestConfig":{ - "type":"structure", - "required":[], - "members":{ - "timeout":{ - "shape":"Integer", - "documentation":"Timeout in seconds
" - } - } - }, - "PayloadConfig":{ - "type":"structure", - "required":[], - "members":{ - "data":{ - "shape":"Integer", - "documentation":"Numerical data
" - } - } - }, - "TestBodyRequest":{ - "type":"structure", - "required":[], - "members":{ - "testConfig":{ - "shape":"TestConfig", - "documentation":"Content to post
" - }, - "testId":{ - "shape":"TestId", - "documentation":"Optional test identifier
", - "location":"header", - "locationName":"x-amz-test-id" - } - }, - "documentation":"The request structure for a test body request.
" - }, - "TestPayloadRequest":{ - "type":"structure", - "required":[], - "members":{ - "payloadConfig":{ - "shape":"PayloadConfig", - "documentation":"Payload to post
" - }, - "testId":{ - "shape":"TestId", - "documentation":"Optional test identifier
", - "location":"header", - "locationName":"x-amz-test-id" - } - }, - "documentation":"The request structure for a payload request.
", - "payload":"payloadConfig" - }, - "TestBlobPayloadRequest":{ - "type":"structure", - "required":[], - "members":{ - "data":{ - "shape":"Blob", - "documentation":"Blob payload to post
" - }, - "contentType":{ - "shape":"String", - "documentation":"Optional content-type header
", - "location":"header", - "locationName":"Content-Type" - } - }, - "documentation":"The request structure for a blob payload request.
", - "payload":"data" - } + { + "description": "Test cases for TestPostNoInputNoPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonHttpPostWithNoInput", + "given": { + "name": "TestPostNoInputNoPayload", + "http": { + "method": "POST", + "requestUri": "/no_input_no_payload", + "responseCode": 200 + }, + "documentation": "This example POST operation has no input and serializes a request without a HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Type) to a POST operation with no modeled input.
" + }, + "description": "Serializes a POST request for an operation with no input, and therefore no modeled body", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/no_input_no_payload", + "body": "", + "forbidHeaders": [ + "Content-Type" + ] + } + } + ] }, - "cases": [ - { - "given": { - "name": "TestBody", - "input": { - "shape": "TestBodyRequest" - }, - "http": { - "method": "POST", - "requestUri": "/body" - } - }, - "params": { - "testConfig": { - "timeout": 10 - }, - "testId": "t-12345" - }, - "serialized": { - "uri": "/body", - "body": "{\"testConfig\": {\"timeout\": 10}}", - "headers": { - "x-amz-test-id": "t-12345", - "Content-Type": "application/json" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestBodyNoParams", - "input": { - "shape": "TestBodyRequest" - }, - "http": { - "method": "POST", - "requestUri": "/body" - } - }, - "params": {}, - "serialized": { - "uri": "/body", - "body": "{}", - "headers": { - "Content-Type": "application/json" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestPayloadNoParams", - "input": { - "shape": "TestPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/payload" - } - }, - "params": {}, - "serialized": { - "uri": "/payload", - "body": "{}", - "headers": { - "Content-Type": "application/json" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestPayload", - "input": { - "shape": "TestPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/payload" - } - }, - "params": { - "payloadConfig": { - "data": 25 - }, - "testId": "t-12345" - }, - "serialized": { - "uri": "/payload", - "body": "{\"data\": 25}", - "headers": { - "x-amz-test-id": "t-12345", - "Content-Type": "application/json" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestPayloadNoBody", - "input": { - "shape": "TestPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/payload" - } - }, - "params": { - "testId": "t-12345" - }, - "serialized": { - "uri": "/payload", - "body": "{}", - "headers": { - "x-amz-test-id": "t-12345", - "Content-Type": "application/json" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestBlobPayload", - "input": { - "shape": "TestBlobPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/blob-payload" - } - }, - "params": { - "data": "1234", - "contentType": "image/jpg" - }, - "serialized": { - "uri": "/blob-payload", - "body": "1234", - "headers": { - "Content-Type": "image/jpg" - }, - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestBlobPayloadNoContentType", - "input": { - "shape": "TestBlobPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/blob-payload" - } - }, - "params": { - "data": "1234" - }, - "serialized": { - "uri": "/blob-payload", - "body": "1234", - "forbidHeaders": ["Content-Length"], - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "TestBlobPayloadNoParams", - "input": { - "shape": "TestBlobPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/blob-payload" - } - }, - "params": {}, - "serialized": { - "uri": "/blob-payload", - "body": "", - "headers": {}, - "forbidHeaders": [ - "Content-Type" - ], - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "NoPayload", - "input": { - "shape": "NoPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/no-payload" - } - }, - "params": {}, - "serialized": { - "uri": "/no-payload", - "body": "", - "forbidHeaders": [ - "Content-Type", - "Content-Length" - ], - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "NoPayloadWithHeader", - "input": { - "shape": "NoPayloadRequest" - }, - "http": { - "method": "POST", - "requestUri": "/no-payload" - } - }, - "params": { - "testId": "t-12345" - }, - "serialized": { - "uri": "/no-payload", - "body": "", - "headers": { - "x-amz-test-id": "t-12345" - }, - "forbidHeaders": [ - "Content-Type", - "Content-Length" - ], - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "NoPayloadGET", - "input": { - "shape": "NoPayloadRequest" - }, - "http": { - "method": "GET", - "requestUri": "/no-payload" - } - }, - "params": {}, - "serialized": { - "uri": "/no-payload", - "body": "", - "forbidHeaders": [ - "Content-Type", - "Content-Length" - ], - "host": "rest-json-test.amazonaws.com" - } - }, - { - "given": { - "name": "NoPayloadWithHeaderGET", - "input": { - "shape": "NoPayloadRequest" - }, - "http": { - "method": "GET", - "requestUri": "/no-payload" - } - }, - "params": { - "testId": "t-12345" - }, - "serialized": { - "uri": "/no-payload", - "body": "", - "headers": { - "x-amz-test-id": "t-12345" - }, - "forbidHeaders": [ - "Content-Type", - "Content-Length" - ], - "host": "rest-json-test.amazonaws.com" - } - } - ] - }, - { - "description": "List in header", - "metadata": { - "protocol": "rest-json", - "apiVersion": "2014-01-01" + { + "description": "Test cases for TestPostNoPayload operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TestNoPayloadInputOutput": { + "type": "structure", + "members": { + "testId": { + "shape": "String", + "location": "header", + "locationName": "X-Amz-Test-Id" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestJsonHttpPostWithNoModeledBody", + "given": { + "name": "TestPostNoPayload", + "http": { + "method": "POST", + "requestUri": "/no_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestNoPayloadInputOutput" + }, + "documentation": "This example POST operation serializes a request without a modeled HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Type) to a POST operation with no modeled payload.
" + }, + "description": "Serializes a POST request with no modeled body", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/no_payload", + "body": "", + "forbidHeaders": [ + "Content-Type" + ] + } + }, + { + "id": "RestJsonHttpWithPostHeaderMemberNoModeledBody", + "given": { + "name": "TestPostNoPayload", + "http": { + "method": "POST", + "requestUri": "/no_payload", + "responseCode": 200 + }, + "input": { + "shape": "TestNoPayloadInputOutput" + }, + "documentation": "This example POST operation serializes a request without a modeled HTTP body.
These tests are to ensure we do not attach a body or related headers (Content-Type) to a POST operation with no modeled payload.
" + }, + "description": "Serializes a POST request with header member but no modeled body", + "params": { + "testId": "t-12345" + }, + "serialized": { + "method": "POST", + "uri": "/no_payload", + "body": "", + "headers": { + "X-Amz-Test-Id": "t-12345" + }, + "forbidHeaders": [ + "Content-Type" + ] + } + } + ] }, - "clientEndpoint": "https://rest-json-test.amazonaws.com", - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListParam": { - "shape": "ListShape", - "location": "header", - "locationName": "x-amz-list-param" - } - } - }, - "ListShape": { - "type": "list", - "member": { - "shape": "EnumType" - } - }, - "EnumType": { - "type": "string", - "enum": ["one", "two", "three"] - } + { + "description": "Test cases for TimestampFormatHeaders operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "TimestampFormatHeadersIO": { + "type": "structure", + "members": { + "memberEpochSeconds": { + "shape": "SyntheticTimestamp_epoch_seconds", + "location": "header", + "locationName": "X-memberEpochSeconds" + }, + "memberHttpDate": { + "shape": "SyntheticTimestamp_http_date", + "location": "header", + "locationName": "X-memberHttpDate" + }, + "memberDateTime": { + "shape": "SyntheticTimestamp_date_time", + "location": "header", + "locationName": "X-memberDateTime" + }, + "defaultFormat": { + "shape": "Timestamp", + "location": "header", + "locationName": "X-defaultFormat" + }, + "targetEpochSeconds": { + "shape": "EpochSeconds", + "location": "header", + "locationName": "X-targetEpochSeconds" + }, + "targetHttpDate": { + "shape": "HttpDate", + "location": "header", + "locationName": "X-targetHttpDate" + }, + "targetDateTime": { + "shape": "DateTime", + "location": "header", + "locationName": "X-targetDateTime" + } + } + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "SyntheticTimestamp_http_date": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "Timestamp": { + "type": "timestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "HttpDate": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "DateTime": { + "type": "timestamp", + "timestampFormat": "iso8601" + } + }, + "cases": [ + { + "id": "RestJsonTimestampFormatHeaders", + "given": { + "name": "TimestampFormatHeaders", + "http": { + "method": "POST", + "requestUri": "/TimestampFormatHeaders", + "responseCode": 200 + }, + "input": { + "shape": "TimestampFormatHeadersIO" + }, + "documentation": "This example tests how timestamp request and response headers are serialized.
" + }, + "description": "Tests how timestamp request headers are serialized", + "params": { + "memberEpochSeconds": 1576540098, + "memberHttpDate": 1576540098, + "memberDateTime": 1576540098, + "defaultFormat": 1576540098, + "targetEpochSeconds": 1576540098, + "targetHttpDate": 1576540098, + "targetDateTime": 1576540098 + }, + "serialized": { + "method": "POST", + "uri": "/TimestampFormatHeaders", + "body": "", + "headers": { + "X-defaultFormat": "Mon, 16 Dec 2019 23:48:18 GMT", + "X-memberDateTime": "2019-12-16T23:48:18Z", + "X-memberEpochSeconds": "1576540098", + "X-memberHttpDate": "Mon, 16 Dec 2019 23:48:18 GMT", + "X-targetDateTime": "2019-12-16T23:48:18Z", + "X-targetEpochSeconds": "1576540098", + "X-targetHttpDate": "Mon, 16 Dec 2019 23:48:18 GMT" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/example" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest" - }, - "name": "OperationName" - }, - "params": { - "ListParam": [ - "one", - "two", - "three" - ] - }, - "serialized": { - "method": "POST", - "body": "", - "uri": "/2014-01-01/example", - "headers": { - "x-amz-list-param": "one,two,three" - } - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/example" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest" - }, - "name": "OperationName" - }, - "params": { - "ListParam": [] - }, - "serialized": { - "method": "POST", - "body": "", - "uri": "/2014-01-01/example", - "headers": {}, - "forbidHeaders": ["x-amz-list-param"] - } - } - ] - } + { + "description": "Test cases for UnitInputAndOutput operation", + "metadata": { + "protocol": "rest-json", + "protocols": [ + "rest-json" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "RestJsonUnitInputAndOutput", + "given": { + "name": "UnitInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/UnitInputAndOutput", + "responseCode": 200 + }, + "documentation": "This test is similar to NoInputAndNoOutput, but uses explicit Unit types.
" + }, + "description": "A unit type input serializes no payload. When clients do not\nneed to serialize any data in the payload, they should omit\na payload altogether.", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/UnitInputAndOutput", + "body": "" + } + } + ] + } ] diff --git a/tests/unit/protocols/input/rest-xml.json b/tests/unit/protocols/input/rest-xml.json index cd5b98418e..01891691b0 100644 --- a/tests/unit/protocols/input/rest-xml.json +++ b/tests/unit/protocols/input/rest-xml.json @@ -1,1976 +1,5771 @@ [ - { - "description": "Basic XML serialization", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" - }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Name": { - "shape": "StringType" - }, - "Description": { - "shape": "StringType" - } - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for AllQueryStringTypes operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "AllQueryStringTypesInput": { + "type": "structure", + "members": { + "queryString": { + "shape": "String", + "location": "querystring", + "locationName": "String" + }, + "queryStringList": { + "shape": "StringList", + "location": "querystring", + "locationName": "StringList" + }, + "queryStringSet": { + "shape": "StringSet", + "location": "querystring", + "locationName": "StringSet" + }, + "queryByte": { + "shape": "Integer", + "location": "querystring", + "locationName": "Byte" + }, + "queryShort": { + "shape": "Integer", + "location": "querystring", + "locationName": "Short" + }, + "queryInteger": { + "shape": "Integer", + "location": "querystring", + "locationName": "Integer" + }, + "queryIntegerList": { + "shape": "IntegerList", + "location": "querystring", + "locationName": "IntegerList" + }, + "queryIntegerSet": { + "shape": "IntegerSet", + "location": "querystring", + "locationName": "IntegerSet" + }, + "queryLong": { + "shape": "Long", + "location": "querystring", + "locationName": "Long" + }, + "queryFloat": { + "shape": "Float", + "location": "querystring", + "locationName": "Float" + }, + "queryDouble": { + "shape": "Double", + "location": "querystring", + "locationName": "Double" + }, + "queryDoubleList": { + "shape": "DoubleList", + "location": "querystring", + "locationName": "DoubleList" + }, + "queryBoolean": { + "shape": "Boolean", + "location": "querystring", + "locationName": "Boolean" + }, + "queryBooleanList": { + "shape": "BooleanList", + "location": "querystring", + "locationName": "BooleanList" + }, + "queryTimestamp": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "Timestamp" + }, + "queryTimestampList": { + "shape": "TimestampList", + "location": "querystring", + "locationName": "TimestampList" + }, + "queryEnum": { + "shape": "FooEnum", + "location": "querystring", + "locationName": "Enum" + }, + "queryEnumList": { + "shape": "FooEnumList", + "location": "querystring", + "locationName": "EnumList" + }, + "queryIntegerEnum": { + "shape": "IntegerEnum", + "location": "querystring", + "locationName": "IntegerEnum" + }, + "queryIntegerEnumList": { + "shape": "IntegerEnumList", + "location": "querystring", + "locationName": "IntegerEnumList" + }, + "queryParamsMapOfStrings": { + "shape": "StringMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringSet": { + "type": "list", + "member": { + "shape": "String" + } + }, + "Integer": { + "type": "integer", + "box": true + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "IntegerSet": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "DoubleList": { + "type": "list", + "member": { + "shape": "Double" + } + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "Timestamp": { + "type": "timestamp" + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "IntegerEnumList": { + "type": "list", + "member": { + "shape": "IntegerEnum" + } + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "AllQueryStringTypes", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Serializes query string parameters with all supported types", + "params": { + "queryString": "Hello there", + "queryStringList": [ + "a", + "b", + "c" + ], + "queryStringSet": [ + "a", + "b", + "c" + ], + "queryByte": 1, + "queryShort": 2, + "queryInteger": 3, + "queryIntegerList": [ + 1, + 2, + 3 + ], + "queryIntegerSet": [ + 1, + 2, + 3 + ], + "queryLong": 4, + "queryFloat": 1.1, + "queryDouble": 1.1, + "queryDoubleList": [ + 1.1, + 2.1, + 3.1 + ], + "queryBoolean": true, + "queryBooleanList": [ + true, + false, + true + ], + "queryTimestamp": 1, + "queryTimestampList": [ + 1, + 2, + 3 + ], + "queryEnum": "Foo", + "queryEnumList": [ + "Foo", + "Baz", + "Bar" + ], + "queryIntegerEnum": 1, + "queryIntegerEnumList": [ + 1, + 2 + ] + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?String=Hello%20there&StringList=a&StringList=b&StringList=c&StringSet=a&StringSet=b&StringSet=c&Byte=1&Short=2&Integer=3&IntegerList=1&IntegerList=2&IntegerList=3&IntegerSet=1&IntegerSet=2&IntegerSet=3&Long=4&Float=1.1&Double=1.1&DoubleList=1.1&DoubleList=2.1&DoubleList=3.1&Boolean=true&BooleanList=true&BooleanList=false&BooleanList=true&Timestamp=1970-01-01T00%3A00%3A01Z&TimestampList=1970-01-01T00%3A00%3A01Z&TimestampList=1970-01-01T00%3A00%3A02Z&TimestampList=1970-01-01T00%3A00%3A03Z&Enum=Foo&EnumList=Foo&EnumList=Baz&EnumList=Bar&IntegerEnum=1&IntegerEnumList=1&IntegerEnumList=2", + "body": "" + } + }, + { + "id": "RestXmlQueryStringMap", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Handles query string maps", + "params": { + "queryParamsMapOfStrings": { + "QueryParamsStringKeyA": "Foo", + "QueryParamsStringKeyB": "Bar" + } + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?QueryParamsStringKeyA=Foo&QueryParamsStringKeyB=Bar", + "body": "" + } + }, + { + "id": "RestXmlQueryStringEscaping", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Handles escaping all required characters in the query string.", + "params": { + "queryString": " %:/?#[]@!$&'()*+,;=😹" + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?String=%20%25%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%F0%9F%98%B9", + "body": "" + } + }, + { + "id": "RestXmlSupportsNaNFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling NaN float query values.", + "params": { + "queryFloat": "NaN", + "queryDouble": "NaN" + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=NaN&Double=NaN", + "body": "" + } + }, + { + "id": "RestXmlSupportsInfinityFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling Infinity float query values.", + "params": { + "queryFloat": "Infinity", + "queryDouble": "Infinity" + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=Infinity&Double=Infinity", + "body": "" + } + }, + { + "id": "RestXmlSupportsNegativeInfinityFloatQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Supports handling -Infinity float query values.", + "params": { + "queryFloat": "-Infinity", + "queryDouble": "-Infinity" + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Float=-Infinity&Double=-Infinity", + "body": "" + } + }, + { + "id": "RestXmlZeroAndFalseQueryValues", + "given": { + "name": "AllQueryStringTypes", + "http": { + "method": "GET", + "requestUri": "/AllQueryStringTypesInput", + "responseCode": 200 + }, + "input": { + "shape": "AllQueryStringTypesInput" + }, + "documentation": "This example uses all query string types.
" + }, + "description": "Query values of 0 and false are serialized", + "params": { + "queryInteger": 0, + "queryBoolean": false + }, + "serialized": { + "method": "GET", + "uri": "/AllQueryStringTypesInput?Integer=0&Boolean=false", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/hostedzone" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "Name": "foo", - "Description": "bar" - }, - "serialized": { - "method": "POST", - "body": "The following example serializes a body that uses an XML name, changing the wrapper name.
", + "idempotent": true + }, + "description": "Serializes a payload using a wrapper name based on the xmlName", + "params": { + "nested": { + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/BodyWithXmlName", + "body": "This example uses fixed query string params and variable query string params. The fixed query string parameters and variable parameters must both be serialized (implementations may need to merge them together).
" + }, + "description": "Mixes constant and variable query string parameters", + "params": { + "baz": "bam" + }, + "serialized": { + "method": "GET", + "uri": "/ConstantAndVariableQueryString?foo=bar&baz=bam", + "body": "" + } + }, + { + "id": "ConstantAndVariableQueryStringAllValues", + "given": { + "name": "ConstantAndVariableQueryString", + "http": { + "method": "GET", + "requestUri": "/ConstantAndVariableQueryString?foo=bar", + "responseCode": 200 + }, + "input": { + "shape": "ConstantAndVariableQueryStringInput" + }, + "documentation": "This example uses fixed query string params and variable query string params. The fixed query string parameters and variable parameters must both be serialized (implementations may need to merge them together).
" + }, + "description": "Mixes constant and variable query string parameters", + "params": { + "baz": "bam", + "maybeSet": "yes" + }, + "serialized": { + "method": "GET", + "uri": "/ConstantAndVariableQueryString?foo=bar&baz=bam&maybeSet=yes", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/hostedzone" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "First": true, - "Second": false, - "Third": 1.2, - "Fourth": 3 - }, - "serialized": { - "method": "POST", - "body": "This example uses a constant query string parameters and a label. This simply tests that labels and query string parameters are compatible. The fixed query string parameter named "hello" should in no way conflict with the label, {hello}
.
The example tests how requests and responses are serialized when there's no request or response payload because the operation has an empty input and empty output structure that reuses the same shape. While this should be rare, code generators must support this.
" + }, + "description": "Empty input serializes no payload", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/EmptyInputAndEmptyOutput", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/hostedzone" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "SubStructure": { - "Foo": "a", - "Bar": "b" - }, - "Description": "baz" - }, - "serialized": { - "method": "POST", - "body": "Flattened maps
" + }, + "description": "Serializes flattened XML maps in requests", + "params": { + "myMap": { + "foo": "Foo", + "baz": "Baz" + } + }, + "serialized": { + "method": "POST", + "uri": "/FlattenedXmlMap", + "body": "Flattened maps with @xmlName
" + }, + "description": "Serializes flattened XML maps in requests that have xmlName on members", + "params": { + "myMap": { + "a": "A", + "b": "B" + } + }, + "serialized": { + "method": "POST", + "uri": "/FlattenedXmlMapWithXmlName", + "body": "This example serializes a blob shape in the payload.
In this example, no XML document is synthesized because the payload is not a structure or a union type.
" + }, + "description": "Serializes a blob in the HTTP payload", + "params": { + "foo": "Foo", + "blob": "blobby blob blob" + }, + "serialized": { + "method": "POST", + "uri": "/HttpPayloadTraits", + "body": "blobby blob blob", + "headers": { + "X-Foo": "Foo" + }, + "requireHeaders": [ + "Content-Length" + ] + } + }, + { + "id": "HttpPayloadTraitsWithNoBlobBody", + "given": { + "name": "HttpPayloadTraits", + "http": { + "method": "POST", + "requestUri": "/HttpPayloadTraits", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadTraitsInputOutput" + }, + "documentation": "This example serializes a blob shape in the payload.
In this example, no XML document is synthesized because the payload is not a structure or a union type.
" + }, + "description": "Serializes an empty blob in the HTTP payload", + "params": { + "foo": "Foo" + }, + "serialized": { + "method": "POST", + "uri": "/HttpPayloadTraits", + "body": "", + "headers": { + "X-Foo": "Foo" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "ListParam": { - "shape": "ListShape" - } - } - }, - "ListShape": { - "type": "list", - "member": { - "shape": "StringType" - }, - "flattened": true - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for HttpPayloadWithMemberXmlName operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpPayloadWithMemberXmlNameInputOutput": { + "type": "structure", + "members": { + "nested": { + "shape": "PayloadWithXmlName", + "locationName": "Hola" + } + }, + "payload": "nested" + }, + "PayloadWithXmlName": { + "type": "structure", + "members": { + "name": { + "shape": "String" + } + }, + "locationName": "Hello" + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "HttpPayloadWithMemberXmlName", + "given": { + "name": "HttpPayloadWithMemberXmlName", + "http": { + "method": "PUT", + "requestUri": "/HttpPayloadWithMemberXmlName", + "responseCode": 200 + }, + "input": { + "shape": "HttpPayloadWithMemberXmlNameInputOutput" + }, + "documentation": "The following example serializes a payload that uses an XML name on the member, changing the wrapper name.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload using a wrapper name based on member xmlName", + "params": { + "nested": { + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithMemberXmlName", + "body": "This example serializes a structure in the payload.
Note that serializing a structure changes the wrapper element name to match the targeted structure.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload", + "params": { + "nested": { + "greeting": "hello", + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithStructure", + "body": "This example serializes a union in the payload.
", + "idempotent": true + }, + "description": "Serializes a union in the payload.", + "params": { + "nested": { + "greeting": "hello" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithUnion", + "body": "This example serializes a union in the payload.
", + "idempotent": true + }, + "description": "No payload is sent if the union has no value.", + "params": {}, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithUnion", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/hostedzone" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "ListParam": [ - "one", - "two", - "three" - ] - }, - "serialized": { - "method": "POST", - "body": "The following example serializes a payload that uses an XML name, changing the wrapper name.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload using a wrapper name based on xmlName", + "params": { + "nested": { + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithXmlName", + "body": "The following example serializes a payload that uses an XML namespace.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload using a wrapper with an XML namespace", + "params": { + "nested": { + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithXmlNamespace", + "body": "The following example serializes a payload that uses an XML namespace.
", + "idempotent": true + }, + "description": "Serializes a structure in the payload using a wrapper with an XML namespace", + "params": { + "nested": { + "name": "Phreddy" + } + }, + "serialized": { + "method": "PUT", + "uri": "/HttpPayloadWithXmlNamespaceAndPrefix", + "body": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "Adds headers by prefix", + "params": { + "foo": "Foo", + "fooMap": { + "abc": "Abc value", + "def": "Def value" + } + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo": "Foo", + "x-foo-abc": "Abc value", + "x-foo-def": "Def value" + } + } + }, + { + "id": "HttpPrefixHeadersAreNotPresent", + "given": { + "name": "HttpPrefixHeaders", + "http": { + "method": "GET", + "requestUri": "/HttpPrefixHeaders", + "responseCode": 200 + }, + "input": { + "shape": "HttpPrefixHeadersInputOutput" + }, + "documentation": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "No prefix headers are serialized because the value is not present", + "params": { + "foo": "Foo", + "fooMap": {} + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo": "Foo" + } + } + }, + { + "id": "HttpPrefixEmptyHeaders", + "given": { + "name": "HttpPrefixHeaders", + "http": { + "method": "GET", + "requestUri": "/HttpPrefixHeaders", + "responseCode": 200 + }, + "input": { + "shape": "HttpPrefixHeadersInputOutput" + }, + "documentation": "This examples adds headers to the input of a request and response by prefix.
" + }, + "description": "Serialize prefix headers were the value is present but empty", + "params": { + "fooMap": { + "abc": "" + } + }, + "serialized": { + "method": "GET", + "uri": "/HttpPrefixHeaders", + "body": "", + "headers": { + "x-foo-abc": "" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/2014-01-01/hostedzone" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "StructureParam": { - "b": "foo" - } - }, - "serialized": { - "method": "POST", - "body": "Serialized in the path as true or false.
", + "location": "uri", + "locationName": "boolean" + }, + "timestamp": { + "shape": "Timestamp", + "documentation": "Note that this member has no format, so it's serialized as an RFC 3399 date-time.
", + "location": "uri", + "locationName": "timestamp" + } + } + }, + "String": { + "type": "string" + }, + "Integer": { + "type": "integer", + "box": true + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Timestamp": { + "type": "timestamp" + } + }, + "cases": [ + { + "id": "InputWithHeadersAndAllParams", + "given": { + "name": "HttpRequestWithLabels", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabels/{string}/{short}/{integer}/{long}/{float}/{double}/{boolean}/{timestamp}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsInput" + }, + "documentation": "The example tests how requests are serialized when there's no input payload but there are HTTP labels.
" + }, + "description": "Sends a GET request that uses URI label bindings", + "params": { + "string": "string", + "short": 1, + "integer": 2, + "long": 3, + "float": 4.1, + "double": 5.1, + "boolean": true, + "timestamp": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabels/string/1/2/3/4.1/5.1/true/2019-12-16T23%3A48%3A18Z", + "body": "" + } + }, + { + "id": "HttpRequestLabelEscaping", + "given": { + "name": "HttpRequestWithLabels", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabels/{string}/{short}/{integer}/{long}/{float}/{double}/{boolean}/{timestamp}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsInput" + }, + "documentation": "The example tests how requests are serialized when there's no input payload but there are HTTP labels.
" + }, + "description": "Sends a GET request that uses URI label bindings", + "params": { + "string": " %:/?#[]@!$&'()*+,;=😹", + "short": 1, + "integer": 2, + "long": 3, + "float": 4.1, + "double": 5.1, + "boolean": true, + "timestamp": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabels/%20%25%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%F0%9F%98%B9/1/2/3/4.1/5.1/true/2019-12-16T23%3A48%3A18Z", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - } - }, - "FooShape": { - "type": "map", - "location": "headers", - "locationName": "x-foo-", - "key": { - "shape": "FooKeyValue" - }, - "value": { - "shape": "FooKeyValue" - } - }, - "FooKeyValue": { - "type": "string" - } - }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape", - "locationName": "OperationRequest", - "xmlNamespace": {"uri": "https://foo/"} - }, - "name": "OperationName" - }, - "params": { - "foo": { - "a": "b", - "c": "d" - } - }, - "serialized": { - "method": "POST", - "body": "", - "uri": "/", - "headers": { - "x-foo-a": "b", - "x-foo-c": "d" - } - } - } - ] - }, - { - "description": "Querystring list of strings", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for HttpRequestWithLabelsAndTimestampFormat operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "HttpRequestWithLabelsAndTimestampFormatInput": { + "type": "structure", + "required": [ + "memberEpochSeconds", + "memberHttpDate", + "memberDateTime", + "defaultFormat", + "targetEpochSeconds", + "targetHttpDate", + "targetDateTime" + ], + "members": { + "memberEpochSeconds": { + "shape": "SyntheticTimestamp_epoch_seconds", + "location": "uri", + "locationName": "memberEpochSeconds" + }, + "memberHttpDate": { + "shape": "SyntheticTimestamp_http_date", + "location": "uri", + "locationName": "memberHttpDate" + }, + "memberDateTime": { + "shape": "SyntheticTimestamp_date_time", + "location": "uri", + "locationName": "memberDateTime" + }, + "defaultFormat": { + "shape": "Timestamp", + "location": "uri", + "locationName": "defaultFormat" + }, + "targetEpochSeconds": { + "shape": "EpochSeconds", + "location": "uri", + "locationName": "targetEpochSeconds" + }, + "targetHttpDate": { + "shape": "HttpDate", + "location": "uri", + "locationName": "targetHttpDate" + }, + "targetDateTime": { + "shape": "DateTime", + "location": "uri", + "locationName": "targetDateTime" + } + } + }, + "SyntheticTimestamp_epoch_seconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "SyntheticTimestamp_http_date": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "Timestamp": { + "type": "timestamp" + }, + "EpochSeconds": { + "type": "timestamp", + "timestampFormat": "unixTimestamp" + }, + "HttpDate": { + "type": "timestamp", + "timestampFormat": "rfc822" + }, + "DateTime": { + "type": "timestamp", + "timestampFormat": "iso8601" + } + }, + "cases": [ + { + "id": "HttpRequestWithLabelsAndTimestampFormat", + "given": { + "name": "HttpRequestWithLabelsAndTimestampFormat", + "http": { + "method": "GET", + "requestUri": "/HttpRequestWithLabelsAndTimestampFormat/{memberEpochSeconds}/{memberHttpDate}/{memberDateTime}/{defaultFormat}/{targetEpochSeconds}/{targetHttpDate}/{targetDateTime}", + "responseCode": 200 + }, + "input": { + "shape": "HttpRequestWithLabelsAndTimestampFormatInput" + }, + "documentation": "The example tests how requests serialize different timestamp formats in the URI path.
" + }, + "description": "Serializes different timestamp formats in URI labels", + "params": { + "memberEpochSeconds": 1576540098, + "memberHttpDate": 1576540098, + "memberDateTime": 1576540098, + "defaultFormat": 1576540098, + "targetEpochSeconds": 1576540098, + "targetHttpDate": 1576540098, + "targetDateTime": 1576540098 + }, + "serialized": { + "method": "GET", + "uri": "/HttpRequestWithLabelsAndTimestampFormat/1576540098/Mon%2C%2016%20Dec%202019%2023%3A48%3A18%20GMT/2019-12-16T23%3A48%3A18Z/2019-12-16T23%3A48%3A18Z/1576540098/Mon%2C%2016%20Dec%202019%2023%3A48%3A18%20GMT/2019-12-16T23%3A48%3A18Z", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "Items": { - "shape": "StringList", - "location": "querystring", - "locationName": "item" - } - } - }, - "StringList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "String": { - "type": "string" - } + { + "description": "Test cases for HttpStringPayload operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "StringPayloadInput": { + "type": "structure", + "members": { + "payload": { + "shape": "String" + } + }, + "payload": "payload" + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestXmlStringPayloadRequest", + "given": { + "name": "HttpStringPayload", + "http": { + "method": "POST", + "requestUri": "/StringPayload", + "responseCode": 200 + }, + "input": { + "shape": "StringPayloadInput" + } + }, + "params": { + "payload": "rawstring" + }, + "serialized": { + "method": "POST", + "uri": "/StringPayload", + "body": "rawstring", + "headers": { + "Content-Type": "text/plain" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Items": ["value1", "value2"] - }, - "serialized": { - "body": "", - "uri": "/path?item=value1&item=value2", - "headers": {} - } - } - ] - }, - { - "description": "String to string maps in querystring", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for InputAndOutputWithHeaders operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "InputAndOutputWithHeadersIO": { + "type": "structure", + "members": { + "headerString": { + "shape": "String", + "location": "header", + "locationName": "X-String" + }, + "headerByte": { + "shape": "Integer", + "location": "header", + "locationName": "X-Byte" + }, + "headerShort": { + "shape": "Integer", + "location": "header", + "locationName": "X-Short" + }, + "headerInteger": { + "shape": "Integer", + "location": "header", + "locationName": "X-Integer" + }, + "headerLong": { + "shape": "Long", + "location": "header", + "locationName": "X-Long" + }, + "headerFloat": { + "shape": "Float", + "location": "header", + "locationName": "X-Float" + }, + "headerDouble": { + "shape": "Double", + "location": "header", + "locationName": "X-Double" + }, + "headerTrueBool": { + "shape": "Boolean", + "location": "header", + "locationName": "X-Boolean1" + }, + "headerFalseBool": { + "shape": "Boolean", + "location": "header", + "locationName": "X-Boolean2" + }, + "headerStringList": { + "shape": "StringList", + "location": "header", + "locationName": "X-StringList" + }, + "headerStringSet": { + "shape": "StringSet", + "location": "header", + "locationName": "X-StringSet" + }, + "headerIntegerList": { + "shape": "IntegerList", + "location": "header", + "locationName": "X-IntegerList" + }, + "headerBooleanList": { + "shape": "BooleanList", + "location": "header", + "locationName": "X-BooleanList" + }, + "headerTimestampList": { + "shape": "TimestampList", + "location": "header", + "locationName": "X-TimestampList" + }, + "headerEnum": { + "shape": "FooEnum", + "location": "header", + "locationName": "X-Enum" + }, + "headerEnumList": { + "shape": "FooEnumList", + "location": "header", + "locationName": "X-EnumList" + } + } + }, + "String": { + "type": "string" + }, + "Integer": { + "type": "integer", + "box": true + }, + "Long": { + "type": "long", + "box": true + }, + "Float": { + "type": "float", + "box": true + }, + "Double": { + "type": "double", + "box": true + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "StringSet": { + "type": "list", + "member": { + "shape": "String" + } + }, + "IntegerList": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "BooleanList": { + "type": "list", + "member": { + "shape": "Boolean" + } + }, + "TimestampList": { + "type": "list", + "member": { + "shape": "Timestamp" + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "FooEnumList": { + "type": "list", + "member": { + "shape": "FooEnum" + } + }, + "Timestamp": { + "type": "timestamp" + } + }, + "cases": [ + { + "id": "InputAndOutputWithStringHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with string header bindings", + "params": { + "headerString": "Hello", + "headerStringList": [ + "a", + "b", + "c" + ], + "headerStringSet": [ + "a", + "b", + "c" + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-String": "Hello", + "X-StringList": "a, b, c", + "X-StringSet": "a, b, c" + } + } + }, + { + "id": "InputAndOutputWithNumericHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with numeric header bindings", + "params": { + "headerByte": 1, + "headerShort": 123, + "headerInteger": 123, + "headerLong": 123, + "headerFloat": 1.1, + "headerDouble": 1.1, + "headerIntegerList": [ + 1, + 2, + 3 + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Byte": "1", + "X-Double": "1.1", + "X-Float": "1.1", + "X-Integer": "123", + "X-IntegerList": "1, 2, 3", + "X-Long": "123", + "X-Short": "123" + } + } + }, + { + "id": "InputAndOutputWithBooleanHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with boolean header bindings", + "params": { + "headerTrueBool": true, + "headerFalseBool": false, + "headerBooleanList": [ + true, + false, + true + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Boolean1": "true", + "X-Boolean2": "false", + "X-BooleanList": "true, false, true" + } + } + }, + { + "id": "InputAndOutputWithTimestampHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with timestamp header bindings", + "params": { + "headerTimestampList": [ + 1576540098, + 1576540098 + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-TimestampList": "Mon, 16 Dec 2019 23:48:18 GMT, Mon, 16 Dec 2019 23:48:18 GMT" + } + } + }, + { + "id": "InputAndOutputWithEnumHeaders", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Tests requests with enum header bindings", + "params": { + "headerEnum": "Foo", + "headerEnumList": [ + "Foo", + "Bar", + "Baz" + ] + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Enum": "Foo", + "X-EnumList": "Foo, Bar, Baz" + } + } + }, + { + "id": "RestXmlSupportsNaNFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling NaN float header values.", + "params": { + "headerFloat": "NaN", + "headerDouble": "NaN" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "NaN", + "X-Float": "NaN" + } + } + }, + { + "id": "RestXmlSupportsInfinityFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling Infinity float header values.", + "params": { + "headerFloat": "Infinity", + "headerDouble": "Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "Infinity", + "X-Float": "Infinity" + } + } + }, + { + "id": "RestXmlSupportsNegativeInfinityFloatHeaderInputs", + "given": { + "name": "InputAndOutputWithHeaders", + "http": { + "method": "POST", + "requestUri": "/InputAndOutputWithHeaders", + "responseCode": 200 + }, + "input": { + "shape": "InputAndOutputWithHeadersIO" + }, + "documentation": "The example tests how requests and responses are serialized when there is no input or output payload but there are HTTP header bindings.
" + }, + "description": "Supports handling -Infinity float header values.", + "params": { + "headerFloat": "-Infinity", + "headerDouble": "-Infinity" + }, + "serialized": { + "method": "POST", + "uri": "/InputAndOutputWithHeaders", + "body": "", + "headers": { + "X-Double": "-Infinity", + "X-Float": "-Infinity" + } + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "PipelineId": { - "shape": "StringType", - "location": "uri" - }, - "QueryDoc": { - "shape": "MapStringStringType", - "location": "querystring" - } - } - }, - "MapStringStringType": { - "type": "map", - "key": { - "shape": "StringType" - }, - "value": { - "shape": "StringType" - } - }, - "StringType": { - "type": "string" - } + { + "description": "Test cases for NestedXmlMaps operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "NestedXmlMapsRequest": { + "type": "structure", + "members": { + "nestedMap": { + "shape": "NestedMap" + }, + "flatNestedMap": { + "shape": "NestedMap", + "flattened": true + } + } + }, + "NestedMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "FooEnumMap" + } + }, + "FooEnumMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "FooEnum" + } + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "NestedXmlMapRequest", + "given": { + "name": "NestedXmlMaps", + "http": { + "method": "POST", + "requestUri": "/NestedXmlMaps", + "responseCode": 200 + }, + "input": { + "shape": "NestedXmlMapsRequest", + "locationName": "NestedXmlMapsRequest" + } + }, + "description": "Tests requests with nested maps.", + "params": { + "nestedMap": { + "foo": { + "bar": "Bar" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/NestedXmlMaps", + "body": "Nested Xml Maps with key/values with @xmlName
" + }, + "description": "Serializes nested XML Maps in requests that have xmlName on members", + "params": { + "nestedXmlMapWithXmlNameMap": { + "foo": { + "bar": "Baz", + "fizz": "Buzz" + }, + "qux": { + "foobar": "Bar", + "fizzbuzz": "Buzz" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/NestedXmlMapWithXmlName", + "body": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input or output. While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/NoInputAndNoOutput", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/2014-01-01/jobsByPipeline/{PipelineId}" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "PipelineId": "id", - "QueryDoc": { - "foo": ["bar", "baz"], - "fizz": ["buzz", "pop"] - } - }, - "serialized": { - "body": "", - "uri": "/2014-01-01/jobsByPipeline/id?foo=bar&foo=baz&fizz=buzz&fizz=pop", - "headers": {} - } - } - ] - }, - { - "description": "Boolean in querystring", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for NoInputAndOutput operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": {}, + "cases": [ + { + "id": "NoInputAndOutput", + "given": { + "name": "NoInputAndOutput", + "http": { + "method": "POST", + "requestUri": "/NoInputAndOutputOutput", + "responseCode": 200 + }, + "documentation": "The example tests how requests and responses are serialized when there's no request or response payload because the operation has no input and the output is empty. While this should be rare, code generators must support this.
" + }, + "description": "No input serializes no payload", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/NoInputAndOutputOutput", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "BoolQuery": { - "shape": "BoolType", - "location": "querystring", - "locationName": "bool-query" - } - } - }, - "BoolType": { - "type": "boolean" - } + { + "description": "Test cases for NullAndEmptyHeadersClient operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "NullAndEmptyHeadersIO": { + "type": "structure", + "members": { + "a": { + "shape": "String", + "location": "header", + "locationName": "X-A" + }, + "b": { + "shape": "String", + "location": "header", + "locationName": "X-B" + }, + "c": { + "shape": "StringList", + "location": "header", + "locationName": "X-C" + } + } + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "NullAndEmptyHeaders", + "given": { + "name": "NullAndEmptyHeadersClient", + "http": { + "method": "GET", + "requestUri": "/NullAndEmptyHeadersClient", + "responseCode": 200 + }, + "input": { + "shape": "NullAndEmptyHeadersIO" + }, + "documentation": "Null headers are not sent over the wire, empty headers are serialized to ""
" + }, + "description": "Do not send null values, but do send empty strings and empty lists over the wire in headers", + "params": { + "a": null, + "b": "", + "c": [] + }, + "serialized": { + "method": "GET", + "uri": "/NullAndEmptyHeadersClient", + "body": "", + "headers": { + "X-B": "", + "X-C": "" + }, + "forbidHeaders": [ + "X-A" + ] + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "BoolQuery": true - }, - "serialized": { - "body": "", - "uri": "/path?bool-query=true", - "headers": {} - } - }, - { - "given": { - "http": { - "method": "GET", - "requestUri": "/path" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "BoolQuery": false - }, - "serialized": { - "body": "", - "uri": "/path?bool-query=false", - "headers": {} - } - } - ] - }, - { - "description": "String payload", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for OmitsNullSerializesEmptyString operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "OmitsNullSerializesEmptyStringInput": { + "type": "structure", + "members": { + "nullValue": { + "shape": "String", + "location": "querystring", + "locationName": "Null" + }, + "emptyString": { + "shape": "String", + "location": "querystring", + "locationName": "Empty" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "RestXmlOmitsNullQuery", + "given": { + "name": "OmitsNullSerializesEmptyString", + "http": { + "method": "GET", + "requestUri": "/OmitsNullSerializesEmptyString", + "responseCode": 200 + }, + "input": { + "shape": "OmitsNullSerializesEmptyStringInput" + }, + "documentation": "Omits null, but serializes empty string value.
" + }, + "description": "Omits null query values", + "params": { + "nullValue": null + }, + "serialized": { + "method": "GET", + "uri": "/OmitsNullSerializesEmptyString", + "body": "" + } + }, + { + "id": "RestXmlSerializesEmptyString", + "given": { + "name": "OmitsNullSerializesEmptyString", + "http": { + "method": "GET", + "requestUri": "/OmitsNullSerializesEmptyString", + "responseCode": 200 + }, + "input": { + "shape": "OmitsNullSerializesEmptyStringInput" + }, + "documentation": "Omits null, but serializes empty string value.
" + }, + "description": "Serializes empty query strings", + "params": { + "emptyString": "" + }, + "serialized": { + "method": "GET", + "uri": "/OmitsNullSerializesEmptyString?Empty=", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - }, - "payload": "foo" - }, - "FooShape": { - "type": "string" - } + { + "description": "Test cases for PutWithContentEncoding operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "PutWithContentEncodingInput": { + "type": "structure", + "members": { + "encoding": { + "shape": "String", + "location": "header", + "locationName": "Content-Encoding" + }, + "data": { + "shape": "String" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "SDKAppliedContentEncoding_restXml", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/requestcompression/putcontentwithencoding", + "responseCode": 200 + }, + "input": { + "shape": "PutWithContentEncodingInput", + "locationName": "PutWithContentEncodingRequest" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header.", + "params": { + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/requestcompression/putcontentwithencoding", + "headers": { + "Content-Encoding": "gzip" + } + } + }, + { + "id": "SDKAppendedGzipAfterProvidedEncoding_restXml", + "given": { + "name": "PutWithContentEncoding", + "http": { + "method": "POST", + "requestUri": "/requestcompression/putcontentwithencoding", + "responseCode": 200 + }, + "input": { + "shape": "PutWithContentEncodingInput", + "locationName": "PutWithContentEncodingRequest" + }, + "requestcompression": { + "encodings": [ + "gzip" + ] + } + }, + "description": "Compression algorithm encoding is appended to the Content-Encoding header, and the\nuser-provided content-encoding is in the Content-Encoding header before the\nrequest compression encoding from the HTTP binding.\n", + "params": { + "encoding": "custom", + "data": "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\n" + }, + "serialized": { + "method": "POST", + "uri": "/requestcompression/putcontentwithencoding", + "headers": { + "Content-Encoding": "custom, gzip" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "foo": "bar" - }, - "serialized": { - "method": "POST", - "body": "bar", - "uri": "/" - } - } - ] - }, - { - "description": "Blob payload", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for QueryIdempotencyTokenAutoFill operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryIdempotencyTokenAutoFillInput": { + "type": "structure", + "members": { + "token": { + "shape": "String", + "idempotencyToken": true, + "location": "querystring", + "locationName": "token" + } + } + }, + "String": { + "type": "string" + } + }, + "cases": [ + { + "id": "QueryIdempotencyTokenAutoFill", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/QueryIdempotencyTokenAutoFill", + "responseCode": 200 + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Automatically adds idempotency token when not set", + "params": {}, + "serialized": { + "method": "POST", + "uri": "/QueryIdempotencyTokenAutoFill?token=00000000-0000-4000-8000-000000000000", + "body": "" + } + }, + { + "id": "QueryIdempotencyTokenAutoFillIsSet", + "given": { + "name": "QueryIdempotencyTokenAutoFill", + "http": { + "method": "POST", + "requestUri": "/QueryIdempotencyTokenAutoFill", + "responseCode": 200 + }, + "input": { + "shape": "QueryIdempotencyTokenAutoFillInput" + }, + "documentation": "Automatically adds idempotency tokens.
" + }, + "description": "Uses the given idempotency token as-is", + "params": { + "token": "00000000-0000-4000-8000-000000000000" + }, + "serialized": { + "method": "POST", + "uri": "/QueryIdempotencyTokenAutoFill?token=00000000-0000-4000-8000-000000000000", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - }, - "payload": "foo" - }, - "FooShape": { - "type": "blob" - } + { + "description": "Test cases for QueryParamsAsStringListMap operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryParamsAsStringListMapInput": { + "type": "structure", + "members": { + "qux": { + "shape": "String", + "location": "querystring", + "locationName": "corge" + }, + "foo": { + "shape": "StringListMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringListMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "StringList" + } + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestXmlQueryParamsStringListMap", + "given": { + "name": "QueryParamsAsStringListMap", + "http": { + "method": "POST", + "requestUri": "/StringListMap", + "responseCode": 200 + }, + "input": { + "shape": "QueryParamsAsStringListMapInput" + } + }, + "description": "Serialize query params from map of list strings", + "params": { + "qux": "named", + "foo": { + "baz": [ + "bar", + "qux" + ] + } + }, + "serialized": { + "method": "POST", + "uri": "/StringListMap?corge=named&baz=bar&baz=qux", + "body": "" + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "foo": "bar" - }, - "serialized": { - "method": "POST", - "body": "bar", - "uri": "/" - } - }, - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - }, - "serialized": { - "method": "POST", - "body": "", - "uri": "/" - } - } - ] - }, - { - "description": "Structure payload", - "metadata": { - "protocol": "rest-xml", - "apiVersion": "2014-01-01" + { + "description": "Test cases for QueryPrecedence operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "QueryPrecedenceInput": { + "type": "structure", + "members": { + "foo": { + "shape": "String", + "location": "querystring", + "locationName": "bar" + }, + "baz": { + "shape": "StringMap", + "location": "querystring" + } + } + }, + "String": { + "type": "string" + }, + "StringMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "cases": [ + { + "id": "RestXmlQueryPrecedence", + "given": { + "name": "QueryPrecedence", + "http": { + "method": "POST", + "requestUri": "/Precedence", + "responseCode": 200 + }, + "input": { + "shape": "QueryPrecedenceInput" + } + }, + "description": "Prefer named query parameters when serializing", + "params": { + "foo": "named", + "baz": { + "bar": "fromMap", + "qux": "alsoFromMap" + } + }, + "serialized": { + "method": "POST", + "uri": "/Precedence?bar=named&qux=alsoFromMap", + "body": "" + } + } + ] }, - "shapes": { - "InputShape": { - "type": "structure", - "members": { - "foo": { - "shape": "FooShape" - } - }, - "payload": "foo" - }, - "FooShape": { - "locationName": "foo", - "type": "structure", - "members": { - "baz": { - "shape": "BazShape" - } - } - }, - "BazShape": { - "type": "string" - } + { + "description": "Test cases for RecursiveShapes operation", + "metadata": { + "protocol": "rest-xml", + "protocols": [ + "rest-xml" + ], + "apiVersion": "2019-12-16" + }, + "shapes": { + "RecursiveShapesRequest": { + "type": "structure", + "members": { + "nested": { + "shape": "RecursiveShapesInputOutputNested1" + } + } + }, + "RecursiveShapesInputOutputNested1": { + "type": "structure", + "members": { + "foo": { + "shape": "String" + }, + "nested": { + "shape": "RecursiveShapesInputOutputNested2" + } + } + }, + "String": { + "type": "string" + }, + "RecursiveShapesInputOutputNested2": { + "type": "structure", + "members": { + "bar": { + "shape": "String" + }, + "recursiveMember": { + "shape": "RecursiveShapesInputOutputNested1" + } + } + } + }, + "cases": [ + { + "id": "RecursiveShapes", + "given": { + "name": "RecursiveShapes", + "http": { + "method": "PUT", + "requestUri": "/RecursiveShapes", + "responseCode": 200 + }, + "input": { + "shape": "RecursiveShapesRequest", + "locationName": "RecursiveShapesRequest" + }, + "documentation": "Recursive shapes
", + "idempotent": true + }, + "description": "Serializes recursive structures", + "params": { + "nested": { + "foo": "Foo1", + "nested": { + "bar": "Bar1", + "recursiveMember": { + "foo": "Foo2", + "nested": { + "bar": "Bar2" + } + } + } + } + }, + "serialized": { + "method": "PUT", + "uri": "/RecursiveShapes", + "body": "The example tests how timestamp request and response headers are serialized.
" + }, + "description": "Tests how timestamp request headers are serialized", + "params": { + "memberEpochSeconds": 1576540098, + "memberHttpDate": 1576540098, + "memberDateTime": 1576540098, + "defaultFormat": 1576540098, + "targetEpochSeconds": 1576540098, + "targetHttpDate": 1576540098, + "targetDateTime": 1576540098 + }, + "serialized": { + "method": "POST", + "uri": "/TimestampFormatHeaders", + "body": "", + "headers": { + "X-defaultFormat": "Mon, 16 Dec 2019 23:48:18 GMT", + "X-memberDateTime": "2019-12-16T23:48:18Z", + "X-memberEpochSeconds": "1576540098", + "X-memberHttpDate": "Mon, 16 Dec 2019 23:48:18 GMT", + "X-targetDateTime": "2019-12-16T23:48:18Z", + "X-targetEpochSeconds": "1576540098", + "X-targetHttpDate": "Mon, 16 Dec 2019 23:48:18 GMT" + } + } + } + ] }, - "cases": [ - { - "given": { - "http": { - "method": "POST", - "requestUri": "/" - }, - "input": { - "shape": "InputShape" - }, - "name": "OperationName" - }, - "params": { - "Grant": { - "Grantee": { - "EmailAddress": "foo@example.com", - "Type": "CanonicalUser" - } - } - }, - "serialized": { - "method": "POST", - "body": "This example serializes an XML attributes on synthesized document.
", + "idempotent": true + }, + "description": "Serializes XML attributes on the synthesized document", + "params": { + "foo": "hi", + "attr": "test" + }, + "serialized": { + "method": "PUT", + "uri": "/XmlAttributes", + "body": "This example serializes an XML attributes on synthesized document.
", + "idempotent": true + }, + "description": "Serializes XML attributes with escaped characters on the synthesized document", + "params": { + "foo": "hi", + "attr": "This example serializes an XML attributes on a document targeted by httpPayload.
", + "idempotent": true + }, + "description": "Serializes XML attributes on the synthesized document", + "params": { + "payload": { + "foo": "hi", + "attr": "test" + } + }, + "serialized": { + "method": "PUT", + "uri": "/XmlAttributesOnPayload", + "body": "Blobs are base64 encoded
" + }, + "description": "Blobs are base64 encoded", + "params": { + "data": "value" + }, + "serialized": { + "method": "POST", + "uri": "/XmlBlobs", + "body": "A list of lists of strings.
" + }, + "RenamedListMembers": { + "type": "list", + "member": { + "shape": "String", + "locationName": "item" + } + }, + "ListWithMemberNamespace": { + "type": "list", + "member": { + "shape": "String", + "xmlNamespace": "https://xml-member.example.com" + }, + "xmlNamespace": "https://xml-list.example.com" + }, + "ListWithNamespace": { + "type": "list", + "member": { + "shape": "String" + }, + "xmlNamespace": "https://xml-list.example.com" + }, + "StructureList": { + "type": "list", + "member": { + "shape": "StructureListMember", + "locationName": "item" + } + }, + "StructureListMember": { + "type": "structure", + "members": { + "a": { + "shape": "String", + "locationName": "value" + }, + "b": { + "shape": "String", + "locationName": "other" + } + } + }, + "String": { + "type": "string" + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "Timestamp": { + "type": "timestamp" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + } + }, + "cases": [ + { + "id": "XmlEmptyLists", + "given": { + "name": "XmlEmptyLists", + "http": { + "method": "PUT", + "requestUri": "/XmlEmptyLists", + "responseCode": 200 + }, + "input": { + "shape": "XmlEmptyListsRequest", + "locationName": "XmlEmptyListsRequest" + }, + "idempotent": true + }, + "description": "Serializes Empty XML lists", + "params": { + "stringList": [], + "stringSet": [] + }, + "serialized": { + "method": "PUT", + "uri": "/XmlEmptyLists", + "body": "This example serializes enums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "fooEnum1": "Foo", + "fooEnum2": "0", + "fooEnum3": "1", + "fooEnumList": [ + "Foo", + "0" + ], + "fooEnumSet": [ + "Foo", + "0" + ], + "fooEnumMap": { + "hi": "Foo", + "zero": "0" + } + }, + "serialized": { + "method": "PUT", + "uri": "/XmlEnums", + "body": "This example serializes enums as top level properties, in lists, sets, and maps.
", + "idempotent": true + }, + "description": "Serializes simple scalar properties", + "params": { + "intEnum1": 1, + "intEnum2": 2, + "intEnum3": 3, + "intEnumList": [ + 1, + 2 + ], + "intEnumSet": [ + 1, + 2 + ], + "intEnumMap": { + "a": 1, + "b": 2 + } + }, + "serialized": { + "method": "PUT", + "uri": "/XmlIntEnums", + "body": "A list of lists of strings.
" + }, + "RenamedListMembers": { + "type": "list", + "member": { + "shape": "String", + "locationName": "item" + } + }, + "ListWithMemberNamespace": { + "type": "list", + "member": { + "shape": "String", + "xmlNamespace": "https://xml-member.example.com" + }, + "xmlNamespace": "https://xml-list.example.com" + }, + "ListWithNamespace": { + "type": "list", + "member": { + "shape": "String" + }, + "xmlNamespace": "https://xml-list.example.com" + }, + "StructureList": { + "type": "list", + "member": { + "shape": "StructureListMember", + "locationName": "item" + } + }, + "StructureListMember": { + "type": "structure", + "members": { + "a": { + "shape": "String", + "locationName": "value" + }, + "b": { + "shape": "String", + "locationName": "other" + } + } + }, + "String": { + "type": "string" + }, + "IntegerEnum": { + "type": "integer", + "box": true + }, + "FooEnum": { + "type": "string", + "enum": [ + "Foo", + "Baz", + "Bar", + "1", + "0" + ] + }, + "Timestamp": { + "type": "timestamp" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "Integer": { + "type": "integer", + "box": true + } + }, + "cases": [ + { + "id": "XmlLists", + "given": { + "name": "XmlLists", + "http": { + "method": "PUT", + "requestUri": "/XmlLists", + "responseCode": 200 + }, + "input": { + "shape": "XmlListsRequest", + "locationName": "XmlListsRequest" + }, + "documentation": "This test case serializes XML lists for the following cases for both input and output:
The example tests basic map serialization.
" + }, + "description": "Tests for XML map serialization", + "params": { + "myMap": { + "foo": { + "hi": "there" + }, + "baz": { + "hi": "bye" + } + } + }, + "serialized": { + "method": "POST", + "uri": "/XmlMaps", + "body": "Maps with @xmlNamespace and @xmlName
" + }, + "description": "Serializes XML maps in requests that have xmlNamespace and xmlName on members", + "params": { + "myMap": { + "a": "A", + "b": "B" + } + }, + "serialized": { + "method": "POST", + "uri": "/XmlMapWithXmlNamespace", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Tests how normal timestamps are serialized", + "params": { + "normal": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of date-time works like normal timestamps", + "params": { + "dateTime": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of date-time on the target shape works like normal timestamps", + "params": { + "dateTimeOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of epoch-seconds works", + "params": { + "epochSeconds": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of epoch-seconds on the target shape works", + "params": { + "epochSecondsOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of http-date works", + "params": { + "httpDate": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "This tests how timestamps are serialized, including using the default format of date-time and various @timestampFormat trait values.
" + }, + "description": "Ensures that the timestampFormat of http-date on the target shape works", + "params": { + "httpDateOnTarget": 1398796238 + }, + "serialized": { + "method": "POST", + "uri": "/XmlTimestamps", + "body": "