[
  {
    "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"
        },
        "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&ListArg.item.1=a&ListArg.item.2=b&ListArg.item.3=c"
        }
      }
    ]
  },
  {
    "description": "Flattened list with LocationName",
    "metadata": {
      "protocol": "query",
      "apiVersion": "2014-01-01"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "ScalarArg": {
            "shape": "StringType"
          },
          "ListArg": {
            "shape": "ListType"
          }
        }
      },
      "ListType": {
        "type": "list",
        "member": {
          "shape": "StringType",
          "locationName": "ListArgLocation"
        },
        "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&ListArgLocation.1=a&ListArgLocation.2=b&ListArgLocation.3=c"
        }
      }
    ]
  },
  {
    "description": "Serialize 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"
        }
      },
      "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.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"
    },
    "shapes": {
      "InputShape": {
        "type": "structure",
        "members": {
          "MapArg": {
            "shape": "StringMap"
          }
        }
      },
      "StringMap": {
        "type": "map",
        "key": {
          "shape": "StringType",
          "locationName": "TheKey"
        },
        "value": {
          "shape": "StringType",
          "locationName": "TheValue"
        }
      },
      "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.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": [
      {
        "given": {
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "params": {
          "BlobArg": "foo"
        },
        "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": [
      {
        "given": {
          "input": {
            "shape": "InputShape"
          },
          "name": "OperationName"
        },
        "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"
        },
        "value": {
          "shape": "RecursiveStructType"
        }
      },
      "StringType": {
        "type": "string"
      }
    },
    "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"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveStruct": {
              "NoRecurse": "foo"
            }
          }
        },
        "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"
                }
              }
            }
          }
        },
        "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"
        },
        "params": {
          "RecursiveStruct": {
            "RecursiveMap": {
              "foo": {
                "NoRecurse": "foo"
              },
              "bar": {
                "NoRecurse": "bar"
              }
            }
          }
        },
        "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": [
      {
        "given": {
          "input": {
            "shape": "InputShape"
          },
          "http": {
            "method": "POST"
          },
          "name": "OperationName"
        },
        "params": {
          "Token": "abc123"
        },
        "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": {
        },
        "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": [
      {
        "given": {
          "name": "StaticOp",
          "input": {
            "shape": "StaticInputShape"
          },
          "http": {
            "method": "POST"
          },
          "endpoint":{
              "hostPrefix": "data-"
          }
        },
        "params": {
          "Name": "myname"
        },
        "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"
          },
          "http": {
            "method": "POST"
          },
          "endpoint":{
              "hostPrefix": "foo-{Name}."
          }
        },
        "params": {
          "Name": "myname"
        },
        "serialized": {
          "uri": "/",
          "headers": {
              "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
          },
          "body": "Action=MemberRefOp&Version=2014-01-01&Name=myname",
          "host": "foo-myname.service.region.amazonaws.com"
        }
      }
    ]
  }
]
