{
    "version": 1,
    "defaults": {
        "configuration": {
            "accessKey": "myaccesskey",
            "region": "us-west-2",
            "environmentVariables": {
                "AWS_CSM_ENABLED": "true"
            },
            "sharedConfigFile": {}
        },
        "optionalEventFields": {
            "ApiCall": {
                "ApiCallTimeout": "ANY_INT"
            },
            "ApiCallAttempt": {
                "DestinationIp": "ANY_STR",
                "AcquireConnectionLatency": "ANY_INT",
                "ConnectionReused": "ANY_INT",
                "ConnectLatency": "ANY_INT",
                "RequestLatency": "ANY_INT",
                "DnsLatency": "ANY_INT",
                "TcpLatency": "ANY_INT",
                "SslLatency": "ANY_INT"
            }
        }
    },
    "cases": [
        {
            "description": "Tests a single client API call with no configuration provided",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {},
                "sharedConfigFile": {}
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": []
        },
        {
            "description": "Test a single client API call",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Tests a single client API call with bad request",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 400,
                            "responseHeaders": {},
                            "errorCode": "TestOperationException",
                            "errorMessage": "There was an error"
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 400,
                    "AwsException": "TestOperationException",
                    "AwsExceptionMessage": "There was an error"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalAwsException": "TestOperationException",
                    "FinalAwsExceptionMessage": "There was an error",
                    "FinalHttpStatusCode": 400
                }
            ]
        },
        {
            "description": "Tests a single client API call with retries",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 503,
                            "responseHeaders": {},
                            "errorCode": "ServiceUnavailable",
                            "errorMessage": "Service is unavailable"
                        },
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 503,
                    "AwsException": "ServiceUnavailable",
                    "AwsExceptionMessage": "Service is unavailable"
                },
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 2,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Tests a single client API call with non-retryable SDK exception",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "sdkException": {
                                "isRetryable": false,
                                "message": "Unexpected exception was thrown"
                            }
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "SdkException": "ANY_STR",
                    "SdkExceptionMessage": "Unexpected exception was thrown"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalSdkException": "ANY_STR",
                    "FinalSdkExceptionMessage": "Unexpected exception was thrown"
                }
            ]
        },
        {
            "description": "Tests explicitly disabling with environment variables",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {
                    "AWS_CSM_ENABLED": "false"
                },
                "sharedConfigFile": {}
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": []
        },
        {
            "description": "Tests explicitly disabling with shared config file",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {},
                "sharedConfigFile": {
                    "csm_enabled": "false"
                }
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": []
        },
        {
            "description": "Tests overriding disables in shared config file with environment variables",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {
                    "AWS_CSM_ENABLED": "true"
                },
                "sharedConfigFile": {
                    "csm_enabled": "false"
                }
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Tests overriding enables in shared config file with environment variables",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {
                    "AWS_CSM_ENABLED": "false"
                },
                "sharedConfigFile": {
                    "csm_enabled": "true"
                }
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": []
        },
        {
            "description": "Tests setting the client id with environment variables",
            "configuration": {
                "accessKey": "myaccesskey",
                "region": "us-west-2",
                "environmentVariables": {
                    "AWS_CSM_ENABLED": "true",
                    "AWS_CSM_CLIENT_ID": "from-env"
                },
                "sharedConfigFile": {}
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "from-env",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "from-env",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Tests a single client API call using a session token",
            "configuration": {
                "accessKey": "myaccesskey",
                "sessionToken": "mysessiontoken",
                "region": "us-west-2",
                "environmentVariables": {
                    "AWS_CSM_ENABLED": "true"
                },
                "sharedConfigFile": {}
            },
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {}
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "SessionToken": "mysessiontoken",
                    "HttpStatusCode": 200
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Test a single client API call with x-amzn-RequestId response header",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {
                                "x-amzn-RequestId": "request-id"
                            }
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200,
                    "XAmznRequestId": "request-id"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Test a single client API call with x-amz-request-id response header",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {
                                "x-amz-request-id": "request-id"
                            }
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200,
                    "XAmzRequestId": "request-id"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Test a single client API call with x-amz-id-2 response header",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 200,
                            "responseHeaders": {
                                "x-amz-id-2": "request-id"
                            }
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 200,
                    "XAmzId2": "request-id"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 1,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 200
                }
            ]
        },
        {
            "description": "Test API call event uses exception data from final attempt",
            "apiCalls": [
                {
                    "serviceId": "CSM Test",
                    "operationName": "TestOperation",
                    "params": {},
                    "attemptResponses": [
                        {
                            "httpStatus": 503,
                            "responseHeaders": {},
                            "errorCode": "ServiceUnavailable",
                            "errorMessage": "Service is unavailable"
                        },
                        {
                            "httpStatus": 421,
                            "responseHeaders": {},
                            "errorCode": "FinalException",
                            "errorMessage": "FinalExceptionMessage"
                        }
                    ]
                }
            ],
            "expectedMonitoringEvents": [
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 503,
                    "AwsException": "ServiceUnavailable",
                    "AwsExceptionMessage": "Service is unavailable"
                },
                {
                    "Version": 1,
                    "Type": "ApiCallAttempt",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "AttemptLatency": "ANY_INT",
                    "Fqdn": "csmtest.us-west-2.amazonaws.com",
                    "Region": "us-west-2",
                    "UserAgent": "ANY_STR",
                    "AccessKey": "myaccesskey",
                    "HttpStatusCode": 421,
                    "AwsException": "FinalException",
                    "AwsExceptionMessage": "FinalExceptionMessage"
                },
                {
                    "Version": 1,
                    "Type": "ApiCall",
                    "Service": "CSM Test",
                    "Api": "TestOperation",
                    "ClientId": "",
                    "Timestamp": "ANY_INT",
                    "Latency": "ANY_INT",
                    "AttemptCount": 2,
                    "MaxRetriesExceeded": 0,
                    "UserAgent": "ANY_STR",
                    "Region": "us-west-2",
                    "FinalHttpStatusCode": 421,
                    "FinalAwsException": "FinalException",
                    "FinalAwsExceptionMessage": "FinalExceptionMessage"
                }
            ]
        }
    ]
}
