[
  {
    "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"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><Name>foo</Name><Description>bar</Description></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      },
      {
        "given": {
          "http": {
            "method": "PUT",
            "requestUri": "/2014-01-01/hostedzone"
          },
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "name": "OperationName"
        },
        "params": {
          "Name": "foo",
          "Description": "bar"
        },
        "serialized": {
          "method": "PUT",
          "body": "<OperationRequest xmlns=\"https://foo/\"><Name>foo</Name><Description>bar</Description></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      },
      {
        "given": {
          "http": {
            "method": "GET",
            "requestUri": "/2014-01-01/hostedzone"
          },
          "name": "OperationName"
        },
        "params": {},
        "serialized": {
          "method": "GET",
          "body": "",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Serialize other scalar types",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "First": {
            "shape": "BoolType"
          },
          "Second": {
            "shape": "BoolType"
          },
          "Third": {
            "shape": "FloatType"
          },
          "Fourth": {
            "shape": "IntegerType"
          }
        }
      },
      "BoolType": {
        "type": "boolean"
      },
      "FloatType": {
        "type": "float"
      },
      "IntegerType": {
        "type": "integer"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><First>true</First><Second>false</Second><Third>1.2</Third><Fourth>3</Fourth></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Nested structures",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "SubStructure": {
            "shape": "SubStructure"
          },
          "Description": {
            "shape": "StringType"
          }
        }
      },
      "SubStructure": {
        "type": "structure",
        "members": {
          "Foo": {
            "shape": "StringType"
          },
          "Bar": {
            "shape": "StringType"
          }
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><SubStructure><Foo>a</Foo><Bar>b</Bar></SubStructure><Description>baz</Description></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      },
      {
        "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": null
          },
          "Description": "baz"
        },
        "serialized": {
          "method": "POST",
          "body": "<OperationRequest xmlns=\"https://foo/\"><SubStructure><Foo>a</Foo></SubStructure><Description>baz</Description></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Nested structures",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "SubStructure": {
            "shape": "SubStructure"
          },
          "Description": {
            "shape": "StringType"
          }
        }
      },
      "SubStructure": {
        "type": "structure",
        "members": {
          "Foo": {
            "shape": "StringType"
          },
          "Bar": {
            "shape": "StringType"
          }
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/2014-01-01/hostedzone"
          },
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "name": "OperationName"
        },
        "params": {
          "SubStructure": {},
          "Description": "baz"
        },
        "serialized": {
          "method": "POST",
          "body": "<OperationRequest xmlns=\"https://foo/\"><SubStructure /><Description>baz</Description></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Non flattened lists",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ListParam": {
            "shape": "ListShape"
          }
        }
      },
      "ListShape": {
        "type": "list",
        "member": {
          "shape": "StringType"
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><ListParam><member>one</member><member>two</member><member>three</member></ListParam></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Non flattened lists with locationName",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ListParam": {
            "shape": "ListShape",
            "locationName": "AlternateName"
          }
        }
      },
      "ListShape": {
        "type": "list",
        "member": {
          "shape": "StringType",
          "locationName": "NotMember"
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><AlternateName><NotMember>one</NotMember><NotMember>two</NotMember><NotMember>three</NotMember></AlternateName></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Flattened lists",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ListParam": {
            "shape": "ListShape"
          }
        }
      },
      "ListShape": {
        "type": "list",
        "member": {
          "shape": "StringType"
        },
        "flattened": true
      },
      "StringType": {
        "type": "string"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><ListParam>one</ListParam><ListParam>two</ListParam><ListParam>three</ListParam></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Flattened lists with locationName",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ListParam": {
            "shape": "ListShape",
            "locationName": "item"
          }
        }
      },
      "ListShape": {
        "type": "list",
        "member": {
          "shape": "StringType"
        },
        "flattened": true
      },
      "StringType": {
        "type": "string"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><item>one</item><item>two</item><item>three</item></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "List of structures",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ListParam": {
            "shape": "ListShape",
            "locationName": "item"
          }
        }
      },
      "ListShape": {
        "type": "list",
        "member": {
          "shape": "SingleFieldStruct"
        },
        "flattened": true
      },
      "StringType": {
        "type": "string"
      },
      "SingleFieldStruct": {
        "type": "structure",
        "members": {
          "Element": {
            "shape": "StringType",
            "locationName": "value"
          }
        }
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/2014-01-01/hostedzone"
          },
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "name": "OperationName"
        },
        "params": {
          "ListParam": [
            {
              "Element": "one"
            },
            {
              "Element": "two"
            },
            {
              "Element": "three"
            }
          ]
        },
        "serialized": {
          "method": "POST",
          "body": "<OperationRequest xmlns=\"https://foo/\"><item><value>one</value></item><item><value>two</value></item><item><value>three</value></item></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Blob shapes",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "StructureParam": {
            "shape": "StructureShape"
          }
        }
      },
      "StructureShape": {
        "type": "structure",
        "members": {
          "b": {
            "shape": "BShape"
          }
        }
      },
      "BShape": {
        "type": "blob"
      }
    },
    "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": "<OperationRequest xmlns=\"https://foo/\"><StructureParam><b>Zm9v</b></StructureParam></OperationRequest>",
          "uri": "/2014-01-01/hostedzone",
          "headers": {}
        }
      }
    ]
  },
  {
    "description": "Timestamp shapes",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "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": "rfc822",
            "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"
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/2014-01-01/hostedzone"
          },
          "input": {
            "shape": "InputShape",
            "locationName": "TimestampStructure",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "name": "OperationName"
        },
        "params": {
          "TimeArg": 1422172800,
          "TimeArgInQuery": 1422172800,
          "TimeArgInHeader": 1422172800,
          "TimeCustom": 1422172800,
          "TimeCustomInQuery": 1422172800,
          "TimeCustomInHeader": 1422172800,
          "TimeFormat": 1422172800,
          "TimeFormatInQuery": 1422172800,
          "TimeFormatInHeader": 1422172800
        },
        "serialized": {
          "method": "POST",
          "body": "<TimestampStructure xmlns=\"https://foo/\"><TimeArg>2015-01-25T08:00:00Z</TimeArg><TimeCustom>Sun, 25 Jan 2015 08:00:00 GMT</TimeCustom><TimeFormat>Sun, 25 Jan 2015 08:00:00 GMT</TimeFormat></TimestampStructure>",
          "uri": "/2014-01-01/hostedzone?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"
          }
        }
      }
    ]
  },
  {
    "description": "Header maps",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "Items": {
            "shape": "StringList",
            "location": "querystring",
            "locationName": "item"
          }
        }
      },
      "StringList": {
        "type": "list",
        "member": {
          "shape": "String"
        }
      },
      "String": {
        "type": "string"
      }
    },
    "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"
    },
    "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"
      }
    },
    "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-xml",
      "apiVersion": "2014-01-01"
    },
    "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"
      }
    },
    "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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "BoolQuery": {
            "shape": "BoolType",
            "location": "querystring",
            "locationName": "bool-query"
          }
        }
      },
      "BoolType": {
        "type": "boolean"
      }
    },
    "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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "foo": {
            "shape": "FooShape"
          }
        },
        "payload": "foo"
      },
      "FooShape": {
        "type": "string"
      }
    },
    "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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "foo": {
            "shape": "FooShape"
          }
        },
        "payload": "foo"
      },
      "FooShape": {
        "type": "blob"
      }
    },
    "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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "foo": {
            "shape": "FooShape"
          }
        },
        "payload": "foo"
      },
      "FooShape": {
        "locationName": "foo",
        "type": "structure",
        "members": {
          "baz": {
            "shape": "BazShape"
          }
        }
      },
      "BazShape": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "foo": {
            "baz": "bar"
          }
        },
        "serialized": {
          "method": "POST",
          "body": "<foo><baz>bar</baz></foo>",
          "uri": "/"
        }
      },
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {},
        "serialized": {
          "method": "POST",
          "body": "",
          "uri": "/"
        }
      },
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "foo": {}
        },
        "serialized": {
          "method": "POST",
          "body": "<foo />",
          "uri": "/"
        }
      },
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "foo": null
        },
        "serialized": {
          "method": "POST",
          "body": "",
          "uri": "/"
        }
      }
    ]
  },
  {
    "description": "XML Attribute",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "Grant": {
            "shape": "Grant"
          }
        },
        "payload": "Grant"
      },
      "Grant": {
        "type": "structure",
        "locationName": "Grant",
        "members": {
          "Grantee": {
            "shape": "Grantee"
          }
        }
      },
      "Grantee": {
        "type": "structure",
        "members": {
          "Type": {
            "shape": "Type",
            "locationName": "xsi:type",
            "xmlAttribute": true
          },
          "EmailAddress": {
            "shape": "StringType"
          }
        },
        "xmlNamespace": {
          "prefix": "xsi",
          "uri":"http://www.w3.org/2001/XMLSchema-instance"
        }
      },
      "Type": {
        "type": "string"
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "Grant": {
            "Grantee": {
              "EmailAddress": "foo@example.com",
              "Type": "CanonicalUser"
            }
          }
        },
        "serialized": {
          "method": "POST",
          "body": "<Grant><Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CanonicalUser\"><EmailAddress>foo@example.com</EmailAddress></Grantee></Grant>",
          "uri": "/"
        }
      }
    ]
  },
  {
    "description": "Greedy keys",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "Bucket": {
            "shape": "BucketShape",
            "location": "uri"
          },
          "Key": {
            "shape": "KeyShape",
            "location": "uri"
          }
        }
      },
      "BucketShape": {
        "type": "string"
      },
      "KeyShape": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "GET",
            "requestUri": "/{Bucket}/{Key+}"
          },
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "Key": "testing /123",
          "Bucket": "my/bucket"
        },
        "serialized": {
          "method": "GET",
          "body": "",
          "uri": "/my%2Fbucket/testing%20/123"
        }
      }
    ]
  },
  {
    "description": "Omits null query params, but serializes empty strings",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "foo": {
            "location":"querystring",
            "locationName":"param-name",
            "shape": "Foo"
          }
        }
      },
      "Foo": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "name": "OperationName",
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "input": { "shape": "InputShape" }
        },
        "params": { "foo": null },
        "serialized": {
          "method": "POST",
          "body": "",
          "uri": "/path"
        }
      },
      {
        "given": {
          "name": "OperationName",
          "http": {
            "method": "POST",
            "requestUri": "/path?abc=mno"
          },
          "input": { "shape": "InputShape" }
        },
        "params": { "foo": "" },
        "serialized": {
          "method": "POST",
          "body": "",
          "uri": "/path?abc=mno&param-name="
        }
      }
    ]
  },
  {
    "description": "Recursive shapes",
    "metadata": {
      "protocol": "rest-xml",
      "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"
        },
        "value": {
          "shape": "RecursiveStructType"
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "NoRecurse": "foo"
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><NoRecurse>foo</NoRecurse></RecursiveStruct></OperationRequest>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveStruct": {
              "NoRecurse": "foo"
            }
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><RecursiveStruct><NoRecurse>foo</NoRecurse></RecursiveStruct></RecursiveStruct></OperationRequest>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveStruct": {
              "RecursiveStruct": {
                "RecursiveStruct": {
                  "NoRecurse": "foo"
                }
              }
            }
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><RecursiveStruct><RecursiveStruct><RecursiveStruct><NoRecurse>foo</NoRecurse></RecursiveStruct></RecursiveStruct></RecursiveStruct></RecursiveStruct></OperationRequest>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveList": [
              {
                "NoRecurse": "foo"
              },
              {
                "NoRecurse": "bar"
              }
            ]
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><RecursiveList><member><NoRecurse>foo</NoRecurse></member><member><NoRecurse>bar</NoRecurse></member></RecursiveList></RecursiveStruct></OperationRequest>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveList": [
              {
                "NoRecurse": "foo"
              },
              {
                "RecursiveStruct": {
                  "NoRecurse": "bar"
                }
              }
            ]
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><RecursiveList><member><NoRecurse>foo</NoRecurse></member><member><RecursiveStruct><NoRecurse>bar</NoRecurse></RecursiveStruct></member></RecursiveList></RecursiveStruct></OperationRequest>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveMap": {
              "foo": {
                "NoRecurse": "foo"
              },
              "bar": {
                "NoRecurse": "bar"
              }
            }
          }
        },
        "serialized": {
          "uri": "/path",
          "body": "<OperationRequest xmlns=\"https://foo/\"><RecursiveStruct><RecursiveMap><entry><key>foo</key><value><NoRecurse>foo</NoRecurse></value></entry><entry><key>bar</key><value><NoRecurse>bar</NoRecurse></value></entry></RecursiveMap></RecursiveStruct></OperationRequest>"
        }
      }
    ]
  },
  {
    "description": "Idempotency token auto fill",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "Token": {
            "shape": "StringType",
            "idempotencyToken": true
          }
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "cases": [
      {
        "given": {
          "input": {
            "shape": "InputShape"
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
          "Token": "abc123"
        },
        "serialized": {
          "uri": "/path",
          "headers": {},
          "body": "<InputShape><Token>abc123</Token></InputShape>"
        }
      },
      {
        "given": {
          "input": {
            "shape": "InputShape"
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "name": "OperationName"
        },
        "params": {
        },
        "serialized": {
          "uri": "/path",
          "headers": {},
          "body": "<InputShape><Token>00000000-0000-4000-8000-000000000000</Token></InputShape>"
        }
      }
    ]
  },
  {
    "description": "JSON value trait",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "Attr": {
            "shape": "StringType",
            "jsonvalue": true,
            "location": "header",
            "locationName": "X-Amz-Foo"
          }
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "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-xml",
      "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": [
      {
        "given": {
          "name": "StaticOp",
          "input": {
            "shape": "StaticInputShape",
            "locationName": "StaticOpRequest"
          },
          "http": {
            "method": "POST",
            "requestUri": "/path"
          },
          "endpoint":{
              "hostPrefix": "data-"
          }
        },
        "params": {
          "Name": "myname"
        },
        "serialized": {
          "uri": "/path",
          "body": "<StaticOpRequest><Name>myname</Name></StaticOpRequest>",
          "host": "data-service.region.amazonaws.com"
        }
      },
      {
        "given": {
          "name": "MemberRefOp",
          "input": {
            "shape": "MemberRefInputShape",
            "locationName": "MemberRefOpRequest"
          },
          "http": {
            "method": "GET",
            "requestUri": "/path"
          },
          "endpoint":{
              "hostPrefix": "foo-{Name}."
          }
        },
        "params": {
          "Name": "myname"
        },
        "serialized": {
          "uri": "/path",
          "body": "<MemberRefOpRequest><Name>myname</Name></MemberRefOpRequest>",
          "host": "foo-myname.service.region.amazonaws.com"
        }
      }
    ]
  },
  {
    "description": "List in header",
    "metadata": {
      "protocol": "rest-xml",
      "apiVersion": "2014-01-01"
    },
    "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"]
      }
    },
    "cases": [
      {
        "given": {
          "http": {
            "method": "POST",
            "requestUri": "/2014-01-01/example"
          },
          "input": {
            "shape": "InputShape",
            "locationName": "OperationRequest",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "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",
            "xmlNamespace": {"uri": "https://foo/"}
          },
          "name": "OperationName"
        },
        "params": {
          "ListParam": []
        },
        "serialized": {
          "method": "POST",
          "body": "",
          "uri": "/2014-01-01/example",
          "headers": {},
          "forbidHeaders": ["x-amz-list-param"]
        }
      }
    ]
  }
]
