diff --git a/README.md b/README.md index f724c0a..f50bf7d 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ There are also a few live tests that are just to see if you can actually make a | `vectors.json` | Digests and signatures | | `live.json` | Probes against a live service | +The Azure cases authorize with Microsoft Entra ID only. The suite does not aim to test shared access signatures (SAS) or Shared Key, and has no cases or vectors for them. + [REFERENCE.md](REFERENCE.md) describes the adapter protocol. ## Example test of `borink-object-storage` diff --git a/REFERENCE.md b/REFERENCE.md index 094c194..132d437 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -27,12 +27,18 @@ Use `endpoint` with dummy credentials, and `endpoint.proxy_url` as the HTTP prox - `refused`: the client refused it before sending. - `unsupported`: the client cannot make it. Naming a `parameter` declines that parameter, which some cases permit. -An error names a `kind`. `not_found` means the object is absent, `container_not_found` the bucket or container, and `missing` that the answer cannot say which. The others are `precondition`, `not_modified`, `permission_denied` and `other`. +An error names a `kind`. `not_found` means the object is absent, `container_not_found` the bucket or container, and `missing` that the answer cannot say which. The others are `precondition`, `not_modified`, `permission_denied` and `other`. `checksum_mismatch` means the body did not match the checksum the answer named; the status is the answer's. Leave out a result property the client does not expose, and name it in `unsupported_fields`, as `[{"at":"/value/content_md5_base64","reason":"..."}]`. Keys are unescaped, bodies base64, ranges an offset and an exclusive end. A `checksum` without `value_base64` is for the client to compute. Tags are an object, or a list of `{"key", "value"}` pairs where a key may repeat. `content_range` reports a served range as `bytes FIRST-LAST/SIZE`. +An `s3.sign` header given as a list is sent once per value, in order. Its `payload_hash`, such as `UNSIGNED-PAYLOAD`, is signed in place of the body's SHA-256. A signer may report its canonical request as `canonical_request`, which a vector then checks. + +A read asks for a checksum with `checksum_mode` on S3, or `range_checksum` on an Azure range. It reports the checksum it checked as `checksum`: `{"algorithm", "value_base64"}`, with S3's `type`, such as `full_object`. + +`source_account_url` names another Azure storage account that holds a copy source, by its blob service URL. The source is in the container of the endpoint's name, unless `source_container` names another. + A `delete_many` key is a name or `{"key", "version"}`, on Azure also `{"key", "snapshot"}`. A result reports each key as the call named it. Where an S3 answer names a version or a delete marker, the key is an object with `version`, `delete_marker` and `delete_marker_version`. A version listing pages by `continuation_token` and `version_marker`, and returns `next_version_marker`. A `restore` reports `state` `started` for a 202 and `readable` for a 200, and a read reports `x-amz-restore` or `x-ms-archive-status` as `restore_status`. ## Cases diff --git a/adapters/borink/Cargo.lock b/adapters/borink/Cargo.lock index 2b90395..b9cf57a 100644 --- a/adapters/borink/Cargo.lock +++ b/adapters/borink/Cargo.lock @@ -33,7 +33,7 @@ dependencies = [ [[package]] name = "borink-object-storage-crypto" version = "0.0.3" -source = "git+https://github.com/borink-org/object-storage.git?rev=a231d3b10ac7ac983813efc052a1ac60a966a1b3#a231d3b10ac7ac983813efc052a1ac60a966a1b3" +source = "git+https://github.com/borink-org/object-storage.git?rev=3439c0d7eafbea8d0a54d8e0e2104baa9201d172#3439c0d7eafbea8d0a54d8e0e2104baa9201d172" dependencies = [ "borink-object-storage-proto", "hmac", @@ -45,12 +45,12 @@ dependencies = [ [[package]] name = "borink-object-storage-proto" version = "0.0.3" -source = "git+https://github.com/borink-org/object-storage.git?rev=a231d3b10ac7ac983813efc052a1ac60a966a1b3#a231d3b10ac7ac983813efc052a1ac60a966a1b3" +source = "git+https://github.com/borink-org/object-storage.git?rev=3439c0d7eafbea8d0a54d8e0e2104baa9201d172#3439c0d7eafbea8d0a54d8e0e2104baa9201d172" [[package]] name = "borink-object-tests-adapter" version = "0.0.0" -source = "git+https://github.com/borink-org/object-storage.git?rev=a231d3b10ac7ac983813efc052a1ac60a966a1b3#a231d3b10ac7ac983813efc052a1ac60a966a1b3" +source = "git+https://github.com/borink-org/object-storage.git?rev=3439c0d7eafbea8d0a54d8e0e2104baa9201d172#3439c0d7eafbea8d0a54d8e0e2104baa9201d172" dependencies = [ "base64 0.22.1", "borink-object-storage-crypto", diff --git a/adapters/borink/Cargo.toml b/adapters/borink/Cargo.toml index fd02335..a20d888 100644 --- a/adapters/borink/Cargo.toml +++ b/adapters/borink/Cargo.toml @@ -11,7 +11,7 @@ publish = false [dependencies] # The adapter itself lives in borink-org/object-storage, beside the crates whose # API it calls. This is the commit whose adapter speaks this revision's protocol. -borink-object-tests-adapter = { git = "https://github.com/borink-org/object-storage.git", rev = "a231d3b10ac7ac983813efc052a1ac60a966a1b3" } +borink-object-tests-adapter = { git = "https://github.com/borink-org/object-storage.git", rev = "3439c0d7eafbea8d0a54d8e0e2104baa9201d172" } [features] # HTTPS, which only the live probes need. Offline grading uses plain HTTP on loopback. diff --git a/cases/live.json b/cases/live.json index 1ee52f5..91bd282 100644 --- a/cases/live.json +++ b/cases/live.json @@ -21,7 +21,7 @@ "lane": "live", "purpose": "Service acceptance of a fresh signed request using credentials supplied by the caller.", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" + "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-azure-active-directory" ], "call": { "op": "get", @@ -51,7 +51,7 @@ "lane": "live", "purpose": "Read a pre-provisioned private object; invalid-credential control must be denied.", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" + "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-azure-active-directory" ], "call": { "op": "get", diff --git a/cases/management.json b/cases/management.json index bbc3eca..16ae252 100644 --- a/cases/management.json +++ b/cases/management.json @@ -18,6 +18,8 @@ "management/azure/delete-container-absent": "Report a missing container on delete", "management/azure/list-containers": "List the containers whose names start with a prefix", "management/s3-express/create-bucket": "Create a directory bucket in an availability zone. The request goes to the regional control endpoint, s3express-control, by path, signed with the account credentials and no session", + "management/s3-express/list-directory-buckets": "List the account's directory buckets with ListDirectoryBuckets: a GET of / on the regional control endpoint, signed with the account's credentials and no session. It takes no prefix, so every directory bucket of the region is listed", + "management/s3-express/list-directory-buckets-page": "List one directory bucket a page with max-directory-buckets=1. A page with more to come ends in a ContinuationToken, which a client reports to ask for the next page", "management/s3/create-bucket": "Create a bucket in the region of the endpoint", "management/s3/create-bucket-owned": "Refuse to create a bucket that the account already owns", "management/s3/delete-bucket": "Delete an empty bucket", @@ -2635,6 +2637,238 @@ } ], "refusal": null + }, + { + "id": "management/s3-express/list-directory-buckets", + "profile": "s3-express", + "lane": "core", + "purpose": "List the account's directory buckets with ListDirectoryBuckets: a GET of / on the regional control endpoint, signed with the account's credentials and no session. It takes no prefix, so every directory bucket of the region is listed", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListDirectoryBuckets.html" + ], + "call": { + "op": "s3.list_directory_buckets" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "s3express-control.eu-central-1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\n\n \n \n arn:aws:s3express:eu-central-1:000000000000:bucket/fixture--euc1-az1--x-s3\n fixture--euc1-az1--x-s3\n 2024-01-01T00:00:00.000Z\n \n \n arn:aws:s3express:eu-central-1:000000000000:bucket/fixture-other--euc1-az1--x-s3\n fixture-other--euc1-az1--x-s3\n 2024-01-01T00:00:00.000Z\n \n \n\n" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/buckets", + "optional": false, + "rule": { + "is": "equal", + "value": [ + "fixture--euc1-az1--x-s3", + "fixture-other--euc1-az1--x-s3" + ] + } + } + ], + "refusal": null + }, + { + "id": "management/s3-express/list-directory-buckets-page", + "profile": "s3-express", + "lane": "core", + "purpose": "List one directory bucket a page with max-directory-buckets=1. A page with more to come ends in a ContinuationToken, which a client reports to ask for the next page", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListDirectoryBuckets.html" + ], + "call": { + "op": "s3.list_directory_buckets", + "page_size": 1 + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/max-directory-buckets", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "s3express-control.eu-central-1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\n\n \n \n arn:aws:s3express:eu-central-1:000000000000:bucket/fixture--euc1-az1--x-s3\n fixture--euc1-az1--x-s3\n 2024-01-01T00:00:00.000Z\n \n \n fixture-directory-token\n\n" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/buckets", + "optional": false, + "rule": { + "is": "equal", + "value": [ + "fixture--euc1-az1--x-s3" + ] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-directory-token" + } + } + ], + "refusal": null } ] } diff --git a/cases/operations.json b/cases/operations.json index 7ddd19c..efa9633 100644 --- a/cases/operations.json +++ b/cases/operations.json @@ -5,6 +5,9 @@ "operations/azure-hns/abort-copy-finished": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", "operations/azure-hns/append-block": "Append a block to an append blob and report its offset", "operations/azure-hns/append-block-at-wrong-position": "Refuse an append whose position condition does not match the blob length", + "operations/azure-hns/append-block-from-url": "Append the bytes at a URL to an append blob with Append Block From URL: a PUT with comp=appendblock, x-ms-copy-source and no body. Report the offset the block starts at", + "operations/azure-hns/append-block-from-url-other-account": "Append a block with Append Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", + "operations/azure-hns/append-block-from-url-range": "Append bytes 1 to 3 at a URL with Append Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=1-3", "operations/azure-hns/append-block-to-block-blob": "Refuse an append to a block blob", "operations/azure-hns/commit": "commit", "operations/azure-hns/commit-container-missing": "commit container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", @@ -35,14 +38,16 @@ "operations/azure-hns/copy-content-properties": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", "operations/azure-hns/copy-if-none-match-exists": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", "operations/azure-hns/copy-missing-source": "Refuse a copy whose source does not exist", + "operations/azure-hns/copy-other-account": "Report an asynchronous Copy Blob from another storage account as an error. It reads such a source only with a SAS, so with Entra ID Azure answers 401 CannotVerifyCopySource, with a bearer token in x-ms-copy-source-authorization or without. Copy between accounts with Copy Blob From URL, Put Blob From URL or Put Block From URL", "operations/azure-hns/copy-pending": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", "operations/azure-hns/copy-replace-metadata": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", "operations/azure-hns/copy-source-if-match": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", "operations/azure-hns/copy-source-if-match-failed": "Report a copy whose source does not have the ETag in x-ms-source-if-match as a failed condition, 412 SourceConditionNotMet", "operations/azure-hns/copy-source-if-unmodified-since-failed": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", "operations/azure-hns/copy-source-key-encoded": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", - "operations/azure-hns/copy-sync": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. The source must be readable by URL: by a SAS, or by a bearer token in x-ms-copy-source-authorization", + "operations/azure-hns/copy-sync": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. Azure reads the source by URL as the caller, or with the bearer token in x-ms-copy-source-authorization", "operations/azure-hns/copy-sync-missing-source": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "operations/azure-hns/copy-sync-other-account": "Copy a blob with Copy Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure-hns/copy-tier": "Copy a blob into another access tier, named in x-ms-access-tier", "operations/azure-hns/create-append": "Create an empty append blob", "operations/azure-hns/create-page": "Create a page blob of 1,024 bytes, which an HNS account does not support", @@ -123,8 +128,14 @@ "operations/azure-hns/get-previous-version": "get previous version", "operations/azure-hns/get-previous-version-of-deleted-object": "get previous version of deleted object", "operations/azure-hns/get-range": "get range", + "operations/azure-hns/get-range-crc64": "Ask for the CRC64 of a range with x-ms-range-get-content-crc64: true, which Azure sends in x-ms-content-crc64. Check the body against it, and report it", + "operations/azure-hns/get-range-crc64-mismatch": "Report a range whose body does not match the CRC64 Azure sent for it as an error of kind checksum_mismatch", "operations/azure-hns/get-range-empty": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", "operations/azure-hns/get-range-inverted": "get range inverted", + "operations/azure-hns/get-range-md5": "Ask for the MD5 of a range with x-ms-range-get-content-md5: true, which Azure sends in content-md5. Check the body against it, and report it", + "operations/azure-hns/get-range-md5-largest": "Ask for the MD5 of a 4 MiB range, the largest Azure checksums. Azure serves what the blob holds of it, here all 30 bytes, and their MD5", + "operations/azure-hns/get-range-md5-mismatch": "Report a range whose body does not match the MD5 Azure sent for it as an error of kind checksum_mismatch", + "operations/azure-hns/get-range-md5-too-large": "Report the MD5 of a range one byte over 4 MiB as an error: Azure refuses it with 400 InvalidHeaderValue. A client may refuse it before sending", "operations/azure-hns/get-range-not-satisfiable": "get range not satisfiable", "operations/azure-hns/get-range-of-empty-object": "Report a range read of an empty object as 416 InvalidRange: no range of it can be satisfied, not even its first byte", "operations/azure-hns/get-range-open": "get range open", @@ -228,6 +239,7 @@ "operations/azure-hns/put-from-url": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", "operations/azure-hns/put-from-url-content-properties": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", "operations/azure-hns/put-from-url-missing-source": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "operations/azure-hns/put-from-url-other-account": "Write a block blob with Put Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure-hns/put-if-match-current": "put if match current", "operations/azure-hns/put-if-none-match-missing": "put if none match missing", "operations/azure-hns/put-if-unmodified-since-past": "Refuse a write with 412 when the object changed after If-Unmodified-Since", @@ -258,6 +270,12 @@ "operations/azure-hns/put-with-md5": "put with md5", "operations/azure-hns/put-with-tags": "Write an object with tags, which an HNS account does not support", "operations/azure-hns/put-with-tier": "Write an object straight into the Cool access tier", + "operations/azure-hns/set-metadata": "Replace a blob's metadata with Set Blob Metadata: a PUT with comp=metadata and an x-ms-meta- header for each pair. It replaces all metadata, so a name it leaves out is gone", + "operations/azure-hns/set-metadata-empty": "Clear a blob's metadata with Set Blob Metadata and no x-ms-meta- header", + "operations/azure-hns/set-metadata-if-match-failed": "Report Set Blob Metadata with an If-Match the blob does not have as a failed condition, 412 ConditionNotMet, which leaves the metadata as it was", + "operations/azure-hns/set-metadata-missing": "Report Set Blob Metadata on a blob that does not exist as not found, 404 BlobNotFound", + "operations/azure-hns/set-properties": "Set a blob's content type with Set Blob Properties: a PUT with comp=properties and x-ms-blob-content-type. It replaces all content properties, so the cache control and the stored Content-MD5 it does not name are cleared", + "operations/azure-hns/set-properties-all": "Set every content property with Set Blob Properties, each in its x-ms-blob- header: content type, encoding, language, disposition and cache control", "operations/azure-hns/set-tags": "Replace the tags of an object, which an HNS account does not support", "operations/azure-hns/set-tags-version": "Send a tag call on a version to an HNS account, which refuses it as it refuses the blob's", "operations/azure-hns/set-tier-cool": "Move an object to the Cool access tier", @@ -267,6 +285,7 @@ "operations/azure-hns/stage-empty": "stage empty", "operations/azure-hns/stage-escaped-id": "stage escaped id", "operations/azure-hns/stage-from-url": "Stage a block from bytes 0 to 2 at a URL with Put Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=0-2", + "operations/azure-hns/stage-from-url-other-account": "Stage a block with Put Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure-hns/stage-id-64-bytes": "A block ID decodes to at most 64 bytes, and Azure stages a block whose ID decodes to exactly 64. Send it; only a longer ID may be refused.", "operations/azure-hns/stage-id-too-long": "stage id too long", "operations/azure-hns/stage-key-double-slash": "stage, with the key \"double//slash.txt\"", @@ -297,6 +316,9 @@ "operations/azure/abort-copy-finished": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", "operations/azure/append-block": "Append a block to an append blob and report its offset", "operations/azure/append-block-at-wrong-position": "Refuse an append whose position condition does not match the blob length", + "operations/azure/append-block-from-url": "Append the bytes at a URL to an append blob with Append Block From URL: a PUT with comp=appendblock, x-ms-copy-source and no body. Report the offset the block starts at", + "operations/azure/append-block-from-url-other-account": "Append a block with Append Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", + "operations/azure/append-block-from-url-range": "Append bytes 1 to 3 at a URL with Append Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=1-3", "operations/azure/append-block-to-block-blob": "Refuse an append to a block blob", "operations/azure/commit": "commit", "operations/azure/commit-container-missing": "commit container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", @@ -328,6 +350,7 @@ "operations/azure/copy-content-properties": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", "operations/azure/copy-if-none-match-exists": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", "operations/azure/copy-missing-source": "Refuse a copy whose source does not exist", + "operations/azure/copy-other-account": "Report an asynchronous Copy Blob from another storage account as an error. It reads such a source only with a SAS, so with Entra ID Azure answers 401 CannotVerifyCopySource, with a bearer token in x-ms-copy-source-authorization or without. Copy between accounts with Copy Blob From URL, Put Blob From URL or Put Block From URL", "operations/azure/copy-pending": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", "operations/azure/copy-replace-metadata": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", "operations/azure/copy-source-if-match": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", @@ -335,8 +358,9 @@ "operations/azure/copy-source-if-unmodified-since-failed": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", "operations/azure/copy-source-key-encoded": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", "operations/azure/copy-source-version": "Copy an earlier version of a blob, named by versionid in the x-ms-copy-source URL", - "operations/azure/copy-sync": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. The source must be readable by URL: by a SAS, or by a bearer token in x-ms-copy-source-authorization", + "operations/azure/copy-sync": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. Azure reads the source by URL as the caller, or with the bearer token in x-ms-copy-source-authorization", "operations/azure/copy-sync-missing-source": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "operations/azure/copy-sync-other-account": "Copy a blob with Copy Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure/copy-tier": "Copy a blob into another access tier, named in x-ms-access-tier", "operations/azure/create-append": "Create an empty append blob", "operations/azure/create-page": "Create a page blob of 1,024 bytes", @@ -360,13 +384,13 @@ "operations/azure/delete-many-257": "Report a batch of 257 deletions, one more than Azure takes, as an error. Azure answers 202 with one part and no Content-ID, 400 ExceedsMaxBatchRequestCount, for the whole batch, not one part per deletion. A client may refuse it before sending", "operations/azure/delete-many-answers-out-of-order": "Match each part of a batch answer to its deletion by Content-ID, which links them, not by position. Azure has answered every recorded batch in order, up to 256 parts; this answer is written by hand", "operations/azure/delete-many-container-missing": "Report a batch in a missing container, which Azure answers 202 with 404 ContainerNotFound for each deletion, as that error for each key and none deleted, or as one error of kind container_not_found", - "operations/azure/delete-many-current-version": "Delete the current version of a key by its versionid in a batch, which Azure refuses with 403 OperationNotAllowedOnRootBlob", + "operations/azure/delete-many-current-version": "Delete the current version of a key by its versionid in a batch, which Azure refuses with 403 OperationNotAllowedOnRootBlob, even to a caller that may delete versions. Delete the key itself instead", "operations/azure/delete-many-denied": "Report each deletion of a batch that Azure refuses inside its 202 answer, here every one with 403 AuthorizationPermissionMismatch, as that key's error, not as deleted", "operations/azure/delete-many-lf-line-endings": "Read a batch answer whose lines end in LF alone correctly, or report it as an error, but never half-read it. Azure has not been seen to send it: HTTP and multipart require CRLF. This answer is the recorded one with every CR removed", "operations/azure/delete-many-server-busy": "Report a batch that Azure answers as a whole with 503 ServerBusy as an error, never as deleted keys. A client may retry up to five times first", "operations/azure/delete-many-snapshot": "Delete a snapshot of a key in a batch, named by snapshot in its subrequest's query, which leaves the blob", "operations/azure/delete-many-unauthenticated": "Report a batch whose token Azure does not accept as one error for the whole batch, as Azure answers it, not as an answer per key", - "operations/azure/delete-many-version": "Delete a previous version of one key and another key whole in one batch, the version named by versionid in its subrequest's query, which this account refuses for the version alone", + "operations/azure/delete-many-version": "Delete a previous version of one key and another key whole in one batch, the version named by versionid in its subrequest's query. A caller without blobs/deleteBlobVersion/action, which Storage Blob Data Contributor lacks, gets 403 OperationNotAllowedOnAutomaticSnapshot for the version alone", "operations/azure/delete-many-without-content-id": "Report a batch answer whose parts carry no Content-ID as an error. Without one, only the order of the parts would link a result to its key, and a guess could report one key deleted when another failed. Azure echoes the Content-ID of every subrequest; this answer is the recorded one with them removed", "operations/azure/delete-missing": "delete missing. A client reports it as not_found: the object is absent", "operations/azure/delete-precondition-failed": "delete precondition failed", @@ -421,8 +445,14 @@ "operations/azure/get-previous-version": "get previous version", "operations/azure/get-previous-version-of-deleted-object": "get previous version of deleted object", "operations/azure/get-range": "get range", + "operations/azure/get-range-crc64": "Ask for the CRC64 of a range with x-ms-range-get-content-crc64: true, which Azure sends in x-ms-content-crc64. Check the body against it, and report it", + "operations/azure/get-range-crc64-mismatch": "Report a range whose body does not match the CRC64 Azure sent for it as an error of kind checksum_mismatch", "operations/azure/get-range-empty": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", "operations/azure/get-range-inverted": "get range inverted", + "operations/azure/get-range-md5": "Ask for the MD5 of a range with x-ms-range-get-content-md5: true, which Azure sends in content-md5. Check the body against it, and report it", + "operations/azure/get-range-md5-largest": "Ask for the MD5 of a 4 MiB range, the largest Azure checksums. Azure serves what the blob holds of it, here all 30 bytes, and their MD5", + "operations/azure/get-range-md5-mismatch": "Report a range whose body does not match the MD5 Azure sent for it as an error of kind checksum_mismatch", + "operations/azure/get-range-md5-too-large": "Report the MD5 of a range one byte over 4 MiB as an error: Azure refuses it with 400 InvalidHeaderValue. A client may refuse it before sending", "operations/azure/get-range-not-satisfiable": "get range not satisfiable", "operations/azure/get-range-of-empty-object": "Report a range read of an empty object as 416 InvalidRange: no range of it can be satisfied, not even its first byte", "operations/azure/get-range-open": "get range open", @@ -529,6 +559,7 @@ "operations/azure/put-from-url": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", "operations/azure/put-from-url-content-properties": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", "operations/azure/put-from-url-missing-source": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "operations/azure/put-from-url-other-account": "Write a block blob with Put Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure/put-if-match-current": "put if match current", "operations/azure/put-if-none-match-missing": "put if none match missing", "operations/azure/put-if-unmodified-since-past": "Refuse a write with 412 when the object changed after If-Unmodified-Since", @@ -565,6 +596,12 @@ "operations/azure/restore-high-priority": "Start rehydrating an archived blob to Cool at High priority", "operations/azure/restore-not-archived": "Restore a blob that is online already, which Azure answers with 200 as a readable blob", "operations/azure/restore-while-rehydrating": "Rehydrate a blob to another tier while it rehydrates", + "operations/azure/set-metadata": "Replace a blob's metadata with Set Blob Metadata: a PUT with comp=metadata and an x-ms-meta- header for each pair. It replaces all metadata, so a name it leaves out is gone", + "operations/azure/set-metadata-empty": "Clear a blob's metadata with Set Blob Metadata and no x-ms-meta- header", + "operations/azure/set-metadata-if-match-failed": "Report Set Blob Metadata with an If-Match the blob does not have as a failed condition, 412 ConditionNotMet, which leaves the metadata as it was", + "operations/azure/set-metadata-missing": "Report Set Blob Metadata on a blob that does not exist as not found, 404 BlobNotFound", + "operations/azure/set-properties": "Set a blob's content type with Set Blob Properties: a PUT with comp=properties and x-ms-blob-content-type. It replaces all content properties, so the cache control and the stored Content-MD5 it does not name are cleared", + "operations/azure/set-properties-all": "Set every content property with Set Blob Properties, each in its x-ms-blob- header: content type, encoding, language, disposition and cache control", "operations/azure/set-tags": "Replace the tags of an object", "operations/azure/set-tags-10-tags": "Set 10 tags, the most an object takes", "operations/azure/set-tags-11-tags": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", @@ -585,6 +622,7 @@ "operations/azure/stage-empty": "stage empty", "operations/azure/stage-escaped-id": "stage escaped id", "operations/azure/stage-from-url": "Stage a block from bytes 0 to 2 at a URL with Put Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=0-2", + "operations/azure/stage-from-url-other-account": "Stage a block with Put Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure/stage-id-64-bytes": "A block ID decodes to at most 64 bytes, and Azure stages a block whose ID decodes to exactly 64. Send it; only a longer ID may be refused.", "operations/azure/stage-id-too-long": "stage id too long", "operations/azure/stage-key-double-slash": "stage, with the key \"double//slash.txt\"", @@ -610,6 +648,8 @@ "operations/azure/staged-uncommitted": "staged uncommitted", "operations/azure/staged-uncommitted-only": "staged uncommitted only", "operations/azure/upload-pages": "Write the first page of a page blob", + "operations/azure/upload-pages-from-url": "Write the first page of a page blob from the bytes at a URL with Put Page From URL: a PUT with comp=page, x-ms-copy-source and no body. Both x-ms-range and x-ms-source-range are required, each 512-byte aligned with an inclusive end", + "operations/azure/upload-pages-from-url-other-account": "Write a page with Put Page From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "operations/azure/upload-pages-unaligned": "Refuse a page write that does not start on a 512-byte boundary", "operations/s3-express/abort": "abort", "operations/s3-express/abort-after-commit": "abort after commit", @@ -671,6 +711,10 @@ "operations/s3-express/delete-slow-down": "Report a 503 SlowDown answer as an error, after at most 5 retries", "operations/s3-express/get-before-commit": "get before commit", "operations/s3-express/get-body-cut-short": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", + "operations/s3-express/get-checksum": "Read an object with x-amz-checksum-mode: ENABLED, which makes S3 send the object's stored checksum, here CRC32, in x-amz-checksum-crc32 with x-amz-checksum-type: FULL_OBJECT. A range that covers the whole object gets it too. Check the body against it, and report it", + "operations/s3-express/get-checksum-default": "Read with x-amz-checksum-mode: ENABLED an object written without a checksum. S3 stores a CRC64NVME for every new object and sends it, so a client checks CRC64NVME too", + "operations/s3-express/get-checksum-mismatch": "Report a body that does not match the checksum S3 sent for it as an error of kind checksum_mismatch, not as the object", + "operations/s3-express/get-checksum-range": "Read part of an object with checksum mode. S3 sends no checksum for a range that does not cover the whole object, so a client reads it without one, and reports none. x-amz-checksum-mode may be sent or left out", "operations/s3-express/get-committed-tail": "get committed tail", "operations/s3-express/get-content-properties": "Return the stored content properties from a GET", "operations/s3-express/get-empty": "get empty", @@ -719,6 +763,7 @@ "operations/s3-express/get-whole": "get whole", "operations/s3-express/get-xml-looking": "get xml looking", "operations/s3-express/head": "head", + "operations/s3-express/head-checksum": "Ask a HEAD for the object's checksum with x-amz-checksum-mode: ENABLED, and report it", "operations/s3-express/head-committed": "head committed", "operations/s3-express/head-content-properties": "Return the stored content properties from a HEAD", "operations/s3-express/head-if-unmodified-since-past": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", @@ -758,6 +803,11 @@ "operations/s3-express/list-service-unavailable": "Report a 503 ServiceUnavailable answer as an error, after at most 5 retries", "operations/s3-express/list-start-after": "Report the NotSupported error that a directory bucket answers to start-after", "operations/s3-express/list-truncated-without-token": "Report an error when a truncated page carries no continuation token; do not stop early or list from the start again", + "operations/s3-express/list-uploads": "List the multipart uploads in progress under a prefix with ListMultipartUploads, a GET with ?uploads, and report each upload's key and upload ID, in key order", + "operations/s3-express/list-uploads-after-key": "On a directory bucket, list the uploads after the first page by passing its NextKeyMarker, an opaque token, in key-marker. A key there is refused with 400 InvalidArgument", + "operations/s3-express/list-uploads-delimited": "List uploads with delimiter=/: the uploads under a deeper prefix are reported as that common prefix", + "operations/s3-express/list-uploads-none": "List a prefix with no upload in progress: an empty list, not an error", + "operations/s3-express/list-uploads-page": "List one upload a page with max-uploads=1. A truncated page names the next page's start in NextKeyMarker and NextUploadIdMarker, which a client reports", "operations/s3-express/list-versions": "Send ListObjectVersions to a directory bucket, which keeps no versions", "operations/s3-express/list-xml-escaped": "Read XML character references in listed names, such as & and <, or ask for encoding-type=url and decode the names", "operations/s3-express/put-computing-crc32": "Compute the CRC32 checksum of the body and send it, base64 of its big-endian bytes, in x-amz-checksum-crc32 or in a trailer of an aws-chunked body", @@ -913,6 +963,10 @@ "operations/s3/get-before-commit": "get before commit", "operations/s3/get-body-cut-short": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", "operations/s3/get-bucket-missing": "get bucket missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "operations/s3/get-checksum": "Read an object with x-amz-checksum-mode: ENABLED, which makes S3 send the object's stored checksum, here CRC32, in x-amz-checksum-crc32 with x-amz-checksum-type: FULL_OBJECT. A range that covers the whole object gets it too. Check the body against it, and report it", + "operations/s3/get-checksum-default": "Read with x-amz-checksum-mode: ENABLED an object written without a checksum. S3 stores a CRC64NVME for every new object and sends it, so a client checks CRC64NVME too", + "operations/s3/get-checksum-mismatch": "Report a body that does not match the checksum S3 sent for it as an error of kind checksum_mismatch, not as the object", + "operations/s3/get-checksum-range": "Read part of an object with checksum mode. S3 sends no checksum for a range that does not cover the whole object, so a client reads it without one, and reports none. x-amz-checksum-mode may be sent or left out", "operations/s3/get-committed-tail": "get committed tail", "operations/s3/get-content-encoding-gzip": "Return the stored gzip bytes and Content-Encoding: gzip without decoding them", "operations/s3/get-content-properties": "Return the stored content properties from a GET", @@ -971,6 +1025,7 @@ "operations/s3/get-xml-looking": "get xml looking", "operations/s3/head": "head", "operations/s3/head-bucket-missing": "Report a HEAD of an object in a missing bucket as missing, not not_found. S3 answers 404 without a body, the same answer as for a missing object, so a client cannot tell that the object is absent", + "operations/s3/head-checksum": "Ask a HEAD for the object's checksum with x-amz-checksum-mode: ENABLED, and report it", "operations/s3/head-committed": "head committed", "operations/s3/head-content-properties": "Return the stored content properties from a HEAD", "operations/s3/head-if-unmodified-since-past": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", @@ -1016,6 +1071,11 @@ "operations/s3/list-start-after-delimited": "Send a start-after that names no key; it skips the keys and common prefixes up to it", "operations/s3/list-truncated-without-token": "Report an error when a truncated page carries no continuation token; do not stop early or list from the start again", "operations/s3/list-unauthenticated": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "operations/s3/list-uploads": "List the multipart uploads in progress under a prefix with ListMultipartUploads, a GET with ?uploads, and report each upload's key and upload ID, in key order", + "operations/s3/list-uploads-after-key": "List the uploads after a key, named in key-marker: the uploads of that key are left out", + "operations/s3/list-uploads-delimited": "List uploads with delimiter=/: the uploads under a deeper prefix are reported as that common prefix", + "operations/s3/list-uploads-none": "List a prefix with no upload in progress: an empty list, not an error", + "operations/s3/list-uploads-page": "List one upload a page with max-uploads=1. A truncated page names the next page's start in NextKeyMarker and NextUploadIdMarker, which a client reports", "operations/s3/list-versions": "List every version of each key, newest first, with the current one marked IsLatest", "operations/s3/list-versions-delete-marker": "List a deleted key's delete marker as its current entry, before the version it hides", "operations/s3/list-versions-delimited": "List versions with a delimiter, which rolls the versions under a deeper prefix into one common prefix", @@ -10579,7 +10639,7 @@ "id": "operations/azure/delete-many-version", "profile": "azure", "lane": "core", - "purpose": "Delete a previous version of one key and another key whole in one batch, the version named by versionid in its subrequest's query, which this account refuses for the version alone", + "purpose": "Delete a previous version of one key and another key whole in one batch, the version named by versionid in its subrequest's query. A caller without blobs/deleteBlobVersion/action, which Storage Blob Data Contributor lacks, gets 403 OperationNotAllowedOnAutomaticSnapshot for the version alone", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" ], @@ -10720,7 +10780,7 @@ "id": "operations/azure/delete-many-current-version", "profile": "azure", "lane": "core", - "purpose": "Delete the current version of a key by its versionid in a batch, which Azure refuses with 403 OperationNotAllowedOnRootBlob", + "purpose": "Delete the current version of a key by its versionid in a batch, which Azure refuses with 403 OperationNotAllowedOnRootBlob, even to a caller that may delete versions. Delete the key itself instead", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" ], @@ -18252,16 +18312,21 @@ "refusal": null }, { - "id": "operations/azure/get-reordered", + "id": "operations/azure/get-range-md5", "profile": "azure", "lane": "core", - "purpose": "get reordered", + "purpose": "Ask for the MD5 of a range with x-ms-range-get-content-md5: true, which Azure sends in content-md5. Check the body against it, and report it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { - "key": "object-tests/multipart/reordered.bin", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 6, + "start": 2 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -18281,7 +18346,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18291,102 +18356,50 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-8d8ae06ceb7d\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2664276Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "c2Vjb25kZmlyc3Q=" + "data": "MjM0NQ==" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8d8ae06ceb7d\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 11 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2664276Z" - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "c2Vjb25kZmlyc3Q=" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/get-replacement", - "profile": "azure", - "lane": "core", - "purpose": "get replacement", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/multipart/replaced.bin", - "op": "get" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -18402,7 +18415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18412,29 +18425,47 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-2184b3e6c2c3\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.5387802Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "RklSU1Q=" + "data": "MjM0NQ==" } } } @@ -18455,7 +18486,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-2184b3e6c2c3\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -18463,7 +18494,7 @@ "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 4 } }, { @@ -18479,7 +18510,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.5387802Z" + "value": "2024-01-01T00:00:00.7556278Z" } }, { @@ -18487,24 +18518,41 @@ "optional": false, "rule": { "is": "equal", - "value": "RklSU1Q=" + "value": "MjM0NQ==" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "md5", + "value_base64": "gbBz3pNw6oc/VI4xuK3AgQ==" + } } } ], "refusal": null }, { - "id": "operations/azure/get-snapshot", + "id": "operations/azure/get-range-md5-mismatch", "profile": "azure", "lane": "core", - "purpose": "get snapshot", + "purpose": "Report a range whose body does not match the MD5 Azure sent for it as an error of kind checksum_mismatch", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], + "origin": "constructed", + "derived_from": "operations/azure/get-range-md5", "call": { - "key": "object-tests/snapshots/object.txt", + "key": "object-tests/read/object.txt", "op": "get", - "snapshot": "2024-01-01T00:00:00.7351568Z" + "range": { + "end": 6, + "start": 2 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -18524,7 +18572,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18536,117 +18584,48 @@ } }, { - "at": "/query/snapshot", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "+XxdKZQb+xsv2rCHSQargg==", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-e3698635ab53\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-server-encrypted": "true" + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "b25l" + "data": "MjM0YQ==" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-e3698635ab53\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 3 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "b25l" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/get-staged-only", - "profile": "azure", - "lane": "core", - "purpose": "get staged only", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/multipart/staged.bin", - "op": "get" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -18662,7 +18641,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18672,22 +18651,47 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 206, "headers": { - "content-type": "application/xml", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "MjM0YQ==" } } } @@ -18704,38 +18708,32 @@ } }, { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 - } - }, - { - "at": "/code", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "checksum_mismatch" } } ], "refusal": null }, { - "id": "operations/azure/get-suffix-longer-than-object", + "id": "operations/azure/get-range-crc64", "profile": "azure", "lane": "core", - "purpose": "get suffix longer than object", + "purpose": "Ask for the CRC64 of a range with x-ms-range-get-content-crc64: true, which Azure sends in x-ms-content-crc64. Check the body against it, and report it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "suffix": 100 - } + "end": 6, + "start": 2 + }, + "range_checksum": "azure_crc64" }, "exchanges": [ { @@ -18771,16 +18769,24 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-100" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -18788,6 +18794,7 @@ "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -18796,7 +18803,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } }, @@ -18831,16 +18838,24 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-100" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -18848,6 +18863,7 @@ "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -18856,7 +18872,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -18885,7 +18901,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -18897,72 +18913,234 @@ } }, { - "at": "/value/content_md5_base64", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "2024-01-01T00:00:00.7556278Z" } }, { - "at": "/value/version", + "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "MjM0NQ==" } }, { - "at": "/value/body_base64", + "at": "/value/checksum", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": { + "algorithm": "azure_crc64", + "value_base64": "0F+fuGFLNdI=" + } } } ], - "refusal": [ + "refusal": null + }, + { + "id": "operations/azure/get-range-crc64-mismatch", + "profile": "azure", + "lane": "core", + "purpose": "Report a range whose body does not match the CRC64 Azure sent for it as an error of kind checksum_mismatch", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + ], + "origin": "constructed", + "derived_from": "operations/azure/get-range-crc64", + "call": { + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 6, + "start": 2 + }, + "range_checksum": "azure_crc64" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + }, + "body": { + "encoding": "base64", + "data": "MjM0YQ==" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + }, + "body": { + "encoding": "base64", + "data": "MjM0YQ==" + } + } + } + ] + } + ], + "expect": [ { "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "refused" + "value": "error" } }, { "at": "/kind", "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, "rule": { "is": "equal", - "value": "range" + "value": "checksum_mismatch" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/get-suffix", + "id": "operations/azure/get-range-md5-largest", "profile": "azure", "lane": "core", - "purpose": "get suffix", + "purpose": "Ask for the MD5 of a 4 MiB range, the largest Azure checksums. Azure serves what the blob holds of it, here all 30 bytes, and their MD5", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "suffix": 6 - } + "end": 4194304, + "start": 0 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -18998,16 +19176,25 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-6" + "value": "bytes=0-4194303" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 0-29/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -19058,16 +19245,25 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-6" + "value": "bytes=0-4194303" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 0-29/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -19123,14 +19319,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": false, @@ -19146,47 +19334,37 @@ "is": "equal", "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } }, { - "at": "/parameter", + "at": "/value/checksum", "optional": false, "rule": { "is": "equal", - "value": "range" + "value": { + "algorithm": "md5", + "value_base64": "H1VC0PNTmj+yaCRN4U931g==" + } } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/get-unauthenticated", + "id": "operations/azure/get-range-md5-too-large", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "Report the MD5 of a range one byte over 4 MiB as an error: Azure refuses it with 400 InvalidHeaderValue. A client may refuse it before sending", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", - "op": "get" + "op": "get", + "range": { + "end": 4194305, + "start": 0 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -19216,72 +19394,41 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-4194304" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 401, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" + "data": "InvalidHeaderValueFixture error" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 401 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidAuthenticationInfo" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/get-unknown-snapshot", - "profile": "azure", - "lane": "core", - "purpose": "get unknown snapshot", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/snapshots/object.txt", - "op": "get", - "snapshot": "2024-01-01T00:00:00.4364169Z" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -19297,7 +19444,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -19309,28 +19456,36 @@ } }, { - "at": "/query/snapshot", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.4364169Z" + "value": "bytes=0-4194304" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "data": "InvalidHeaderValueFixture error" } } } @@ -19351,7 +19506,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -19359,24 +19514,64 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "InvalidHeaderValue" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidHeaderValue" + } + } + ] }, { - "id": "operations/azure/get-unknown-version", + "id": "operations/azure/get-reordered", "profile": "azure", "lane": "core", - "purpose": "get unknown version", + "purpose": "get reordered", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/versions-mtydohr2/object.txt", - "op": "get", - "version": "2024-01-01T00:00:00.4364169Z" + "key": "object-tests/multipart/reordered.bin", + "op": "get" }, "exchanges": [ { @@ -19396,7 +19591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { @@ -19406,30 +19601,29 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/versionid", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.4364169Z" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "etag": "\"fixture-8d8ae06ceb7d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2664276Z" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "c2Vjb25kZmlyc3Q=" } } } @@ -19442,38 +19636,62 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-8d8ae06ceb7d\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": 11 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2664276Z" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "c2Vjb25kZmlyc3Q=" } } ], "refusal": null }, { - "id": "operations/azure/get-whole", + "id": "operations/azure/get-replacement", "profile": "azure", "lane": "core", - "purpose": "get whole", + "purpose": "get replacement", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object-tests/multipart/replaced.bin", "op": "get" }, "exchanges": [ @@ -19494,7 +19712,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -19511,23 +19729,22 @@ "response": { "status": 200, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-2184b3e6c2c3\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.5387802Z" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "RklSU1Q=" } } } @@ -19548,7 +19765,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-2184b3e6c2c3\"" } }, { @@ -19556,7 +19773,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 5 } }, { @@ -19567,20 +19784,12 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.5387802Z" } }, { @@ -19588,23 +19797,24 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "RklSU1Q=" } } ], "refusal": null }, { - "id": "operations/azure/get-xml-looking", + "id": "operations/azure/get-snapshot", "profile": "azure", "lane": "core", - "purpose": "get xml looking", + "purpose": "get snapshot", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object", - "op": "get" + "key": "object-tests/snapshots/object.txt", + "op": "get", + "snapshot": "2024-01-01T00:00:00.7351568Z" }, "exchanges": [ { @@ -19624,7 +19834,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -19634,6 +19844,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7351568Z" + } } ], "allow_headers": [], @@ -19641,24 +19859,20 @@ "response": { "status": 200, "headers": { + "content-md5": "+XxdKZQb+xsv2rCHSQargg==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-e3698635ab53\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-server-encrypted": "true" }, "body": { "encoding": "base64", - "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "data": "b25l" } } } @@ -19674,28 +19888,70 @@ "value": "ok" } }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-e3698635ab53\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "+XxdKZQb+xsv2rCHSQargg==" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "value": "b25l" } } ], "refusal": null }, { - "id": "operations/azure/get-noise-tolerance", + "id": "operations/azure/get-staged-only", "profile": "azure", "lane": "core", - "purpose": "get noise tolerance", + "purpose": "get staged only", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", "call": { - "key": "object", + "key": "object-tests/multipart/staged.bin", "op": "get" }, "exchanges": [ @@ -19716,7 +19972,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -19731,27 +19987,17 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"a-different-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-fixture-unknown": "ignored", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "another-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -19764,33 +20010,42 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/get-body-cut-short", + "id": "operations/azure/get-suffix-longer-than-object", "profile": "azure", "lane": "core", - "purpose": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", + "purpose": "get suffix longer than object", "sources": [ - "https://www.rfc-editor.org/rfc/rfc9112#section-8", - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_client.cpp" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "transient", "call": { "key": "object-tests/read/object.txt", - "op": "get" + "op": "get", + "range": { + "suffix": 100 + } }, "exchanges": [ { @@ -19820,6 +20075,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-100" + } } ], "allow_headers": [], @@ -19844,14 +20107,9 @@ "body": { "encoding": "base64", "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - }, - "truncate_body_after": 15 + } } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { @@ -19877,11 +20135,17 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-100" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, @@ -19905,56 +20169,155 @@ "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + ], + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + } + ], + "decline_permitted": true + }, + { + "id": "operations/azure/get-suffix", + "profile": "azure", + "lane": "core", + "purpose": "get suffix", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "suffix": 6 + } + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "GET" } }, { - "at": "/body_base64", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "/fixture/object-tests/read/object.txt" } }, { - "at": "/headers/range", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "bytes=15-" + "value": "" } }, { - "at": "/headers/if-match", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "bytes=-6" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 15-29/30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" @@ -19970,7 +20333,7 @@ }, "body": { "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -20005,24 +20368,16 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=15-" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "bytes=-6" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 15-29/30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" @@ -20038,12 +20393,11 @@ }, "body": { "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } - ], - "optional": true + ] } ], "expect": [ @@ -20051,34 +20405,95 @@ "at": "/outcome", "optional": false, "rule": { - "is": "one_of", - "values": [ - "error", - "ok" - ] + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } }, { "at": "/value/body_base64", - "optional": true, + "optional": false, "rule": { "is": "equal", "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure/get-server-busy", + "id": "operations/azure/get-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "Report a 503 ServerBusy answer as an error, after at most 5 retries", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "transient", "call": { "key": "object-tests/read/object.txt", "op": "get" @@ -20116,266 +20531,21 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 503, + "status": 401, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + "data": "InvalidAuthenticationInfoFixture error" } } } ] - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ServerBusy" - }, - "body": { - "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ServerBusy" - }, - "body": { - "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ServerBusy" - }, - "body": { - "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ServerBusy" - }, - "body": { - "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ServerBusy" - }, - "body": { - "encoding": "utf8", - "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." - } - } - } - ], - "optional": true } ], "expect": [ @@ -20392,7 +20562,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 401 } }, { @@ -20400,24 +20570,24 @@ "optional": false, "rule": { "is": "equal", - "value": "ServerBusy" + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/get-if-unmodified-since-past", + "id": "operations/azure/get-unknown-snapshot", "profile": "azure", "lane": "core", - "purpose": "Refuse a read with 412 when the object changed after If-Unmodified-Since", + "purpose": "get unknown snapshot", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", - "key": "object-tests/read/object.txt", - "op": "get" + "key": "object-tests/snapshots/object.txt", + "op": "get", + "snapshot": "2024-01-01T00:00:00.4364169Z" }, "exchanges": [ { @@ -20437,7 +20607,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -20449,28 +20619,28 @@ } }, { - "at": "/headers/if-unmodified-since", + "at": "/query/snapshot", "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "2024-01-01T00:00:00.4364169Z" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "BlobNotFoundFixture error" } } } @@ -20491,7 +20661,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -20499,24 +20669,24 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/get-if-modified-since-future", + "id": "operations/azure/get-unknown-version", "profile": "azure", "lane": "core", - "purpose": "Report 304 when If-Modified-Since names a future date, which Azure does not ignore", + "purpose": "get unknown version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "if_modified_since": "Fri, 01 Jan 2100 00:00:00 GMT", - "key": "object-tests/read/object.txt", - "op": "get" + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "get", + "version": "2024-01-01T00:00:00.4364169Z" }, "exchanges": [ { @@ -20536,7 +20706,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -20548,26 +20718,28 @@ } }, { - "at": "/headers/if-modified-since", + "at": "/query/versionid", "optional": false, "rule": { "is": "equal", - "value": "Fri, 01 Jan 2100 00:00:00 GMT" + "value": "2024-01-01T00:00:00.4364169Z" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 304, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -20588,7 +20760,7 @@ "optional": false, "rule": { "is": "equal", - "value": 304 + "value": 404 } }, { @@ -20596,22 +20768,21 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/get-if-modified-since-past", + "id": "operations/azure/get-whole", "profile": "azure", "lane": "core", - "purpose": "Read an object modified since a past date", + "purpose": "get whole", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "if_modified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "get" }, @@ -20643,14 +20814,6 @@ "is": "equal", "value": "" } - }, - { - "at": "/headers/if-modified-since", - "optional": false, - "rule": { - "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" - } } ], "allow_headers": [], @@ -20742,15 +20905,15 @@ "refusal": null }, { - "id": "operations/azure/get-content-encoding-gzip", + "id": "operations/azure/get-xml-looking", "profile": "azure", "lane": "core", - "purpose": "Return the stored gzip bytes and Content-Encoding: gzip without decoding them", + "purpose": "get xml looking", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object", "op": "get" }, "exchanges": [ @@ -20771,7 +20934,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -20788,24 +20951,24 @@ "response": { "status": 200, "headers": { - "content-encoding": "gzip", - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version": "2023-11-03" }, "body": { "encoding": "base64", - "data": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } } @@ -20821,75 +20984,28 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-16c44f0af72d\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 42 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "CVsDGvNMZH4SPA4MSLswrA==" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" - } - }, - { - "at": "/value/content_encoding", - "optional": false, - "rule": { - "is": "equal", - "value": "gzip" + "value": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } ], "refusal": null }, { - "id": "operations/azure/get-content-properties", + "id": "operations/azure/get-noise-tolerance", "profile": "azure", "lane": "core", - "purpose": "Return the stored content properties from a GET", + "purpose": "get noise tolerance", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], + "origin": "constructed", "call": { - "key": "object-tests/read/object.txt", + "key": "object", "op": "get" }, "exchanges": [ @@ -20910,7 +21026,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -20927,26 +21043,25 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", - "content-type": "text/plain; charset=utf-8", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"a-different-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-fixture-unknown": "ignored", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", + "x-ms-request-id": "another-id", + "x-ms-request-server-encrypted": "true", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version": "2023-11-03" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } } @@ -20962,91 +21077,29 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-16c44f0af72d\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" - } - }, - { - "at": "/value/content_language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" - } - }, - { - "at": "/value/content_disposition", - "optional": false, - "rule": { - "is": "equal", - "value": "attachment; filename=\"report.txt\"" - } - }, - { - "at": "/value/cache_control", - "optional": false, - "rule": { - "is": "equal", - "value": "max-age=3600" + "value": "aGVsbG8=" } } ], "refusal": null }, { - "id": "operations/azure/get-with-staged-blocks", + "id": "operations/azure/get-body-cut-short", "profile": "azure", "lane": "core", - "purpose": "get with staged blocks", + "purpose": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://www.rfc-editor.org/rfc/rfc9112#section-8", + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_client.cpp" ], + "origin": "transient", "call": { - "key": "object-tests/multipart/pending.bin", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -21067,7 +21120,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21084,93 +21137,29 @@ "response": { "status": 200, "headers": { + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-9c5ca12bcfc9\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.6314295Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "Zmlyc3RzZWNvbmQ=" - } + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + }, + "truncate_body_after": 15 } } ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9c5ca12bcfc9\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 11 - } }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.6314295Z" - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "Zmlyc3RzZWNvbmQ=" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/head-committed-declaring-md5", - "profile": "azure", - "lane": "core", - "purpose": "head committed declaring md5", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/hashes/committed.bin", - "op": "head" - }, - "exchanges": [ { "alternatives": [ { @@ -21180,7 +21169,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21188,7 +21177,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21200,102 +21189,33 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 200, "headers": { - "content-length": "13", - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-39ee25525bc6\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2802899Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-39ee25525bc6\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 13 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2802899Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/head-committed", - "profile": "azure", - "lane": "core", - "purpose": "head committed", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/multipart/committed.bin", - "op": "head" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -21303,7 +21223,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21311,7 +21231,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21321,95 +21241,49 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=15-" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-16c44f0af72d\"" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-length": "11", + "content-range": "bytes 15-29/30", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-be8efdb79010\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7848460Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "" + "data": "Y3QtdGVzdHMtb2JqZWN0" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-be8efdb79010\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 11 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7848460Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/head-metadata", - "profile": "azure", - "lane": "core", - "purpose": "head metadata", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/metadata/object.txt", - "op": "head" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -21417,7 +21291,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21425,7 +21299,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21435,37 +21309,51 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=15-" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-16c44f0af72d\"" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-length": "1", - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-range": "bytes 15-29/30", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-9abbc5e374ca\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-meta-name": "value", - "x-ms-meta-second": "2", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "" + "data": "Y3QtdGVzdHMtb2JqZWN0" } } } - ] + ], + "optional": true } ], "expect": [ @@ -21473,75 +21361,37 @@ "at": "/outcome", "optional": false, "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9abbc5e374ca\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" + "is": "one_of", + "values": [ + "error", + "ok" + ] } }, { - "at": "/value/metadata", - "optional": false, + "at": "/value/body_base64", + "optional": true, "rule": { "is": "equal", - "value": { - "name": "value", - "second": "2" - } + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/azure/head-missing", + "id": "operations/azure/get-server-busy", "profile": "azure", "lane": "core", - "purpose": "head missing. A client reports it as not_found: the object is absent", + "purpose": "Report a 503 ServerBusy answer as an error, after at most 5 retries", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "transient", "call": { - "key": "object-tests/read/absent.txt", - "op": "head" + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -21553,7 +21403,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21561,7 +21411,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/absent.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21576,20 +21426,266 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 503, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "x-ms-error-code": "ServerBusy" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." } } } ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + } + } + } + ], + "optional": true } ], "expect": [ @@ -21606,7 +21702,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 503 } }, { @@ -21614,32 +21710,24 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "equal", - "value": "not_found" + "value": "ServerBusy" } } ], "refusal": null }, { - "id": "operations/azure/head-previous-version", + "id": "operations/azure/get-if-unmodified-since-past", "profile": "azure", "lane": "core", - "purpose": "head previous version", + "purpose": "Refuse a read with 412 when the object changed after If-Unmodified-Since", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/versions-mtydohr2/object.txt", - "op": "head", - "version": "2024-01-01T00:00:00.2318906Z" + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -21651,7 +21739,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21659,7 +21747,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21671,35 +21759,28 @@ } }, { - "at": "/query/versionid", + "at": "/headers/if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { - "content-length": "2", - "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-5769a0807b46\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -21712,64 +21793,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5769a0807b46\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" + "value": "error" } }, { - "at": "/value/content_md5_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "ZlTHNMyrj0QP8IJetEPcfw==" + "value": 412 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/head-snapshot", + "id": "operations/azure/get-if-modified-since-future", "profile": "azure", "lane": "core", - "purpose": "head snapshot", + "purpose": "Report 304 when If-Modified-Since names a future date, which Azure does not ignore", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/snapshots/object.txt", - "op": "head", - "snapshot": "2024-01-01T00:00:00.7351568Z" + "if_modified_since": "Fri, 01 Jan 2100 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -21781,7 +21838,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21789,7 +21846,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21801,34 +21858,26 @@ } }, { - "at": "/query/snapshot", + "at": "/headers/if-modified-since", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": "Fri, 01 Jan 2100 00:00:00 GMT" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 304, "headers": { - "content-length": "3", - "content-md5": "+XxdKZQb+xsv2rCHSQargg==", - "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-e3698635ab53\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-server-encrypted": "true" + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -21841,66 +21890,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-e3698635ab53\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 3 + "value": "error" } }, { - "at": "/value/content_type", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "application/octet-stream" + "value": 304 } }, { - "at": "/value/content_md5_base64", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/head-written-with-crc64", + "id": "operations/azure/get-if-modified-since-past", "profile": "azure", "lane": "core", - "purpose": "head written with crc64", + "purpose": "Read an object modified since a past date", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/hashes/crc64.txt", - "op": "head" + "if_modified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -21912,7 +21935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21920,7 +21943,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21930,6 +21953,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/if-modified-since", + "optional": false, + "rule": { + "is": "equal", + "value": "Sat, 01 Jan 2000 00:00:00 GMT" + } } ], "allow_headers": [], @@ -21937,24 +21968,23 @@ "response": { "status": 200, "headers": { - "content-length": "13", - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-90cfcb93036b\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.1153123Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -21975,7 +22005,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-90cfcb93036b\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -21983,7 +22013,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 30 } }, { @@ -21999,7 +22029,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { @@ -22007,23 +22037,31 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "value": "2024-01-01T00:00:00.7556278Z" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/azure/head-written-with-md5", + "id": "operations/azure/get-content-encoding-gzip", "profile": "azure", "lane": "core", - "purpose": "head written with md5", + "purpose": "Return the stored gzip bytes and Content-Encoding: gzip without decoding them", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/hashes/md5.txt", - "op": "head" + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -22035,7 +22073,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22043,7 +22081,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -22060,24 +22098,24 @@ "response": { "status": 200, "headers": { - "content-length": "13", - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-encoding": "gzip", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-494ad7275bf7\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "" + "data": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } } } @@ -22098,7 +22136,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-494ad7275bf7\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -22106,7 +22144,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 42 } }, { @@ -22122,7 +22160,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "CVsDGvNMZH4SPA4MSLswrA==" } }, { @@ -22130,23 +22168,39 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7803759Z" + "value": "2024-01-01T00:00:00.7556278Z" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + } + }, + { + "at": "/value/content_encoding", + "optional": false, + "rule": { + "is": "equal", + "value": "gzip" } } ], "refusal": null }, { - "id": "operations/azure/head", + "id": "operations/azure/get-content-properties", "profile": "azure", "lane": "core", - "purpose": "head", + "purpose": "Return the stored content properties from a GET", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "key": "object-tests/read/object.txt", - "op": "head" + "op": "get" }, "exchanges": [ { @@ -22158,7 +22212,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22183,9 +22237,11 @@ "response": { "status": 200, "headers": { - "content-length": "30", + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", "content-md5": "H1VC0PNTmj+yaCRN4U931g==", - "content-type": "application/octet-stream", + "content-type": "text/plain; charset=utf-8", "date": { "from": "now" }, @@ -22200,7 +22256,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -22232,44 +22288,76 @@ "value": 30 } }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + }, { "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "application/octet-stream" + "value": "text/plain; charset=utf-8" } }, { - "at": "/value/content_md5_base64", + "at": "/value/content_language", "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "nl-NL" } }, { - "at": "/value/version", + "at": "/value/content_disposition", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/value/cache_control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], "refusal": null }, { - "id": "operations/azure/head-key-question", + "id": "operations/azure/get-with-staged-blocks", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"question?mark.txt\"", + "purpose": "get with staged blocks", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/question?mark.txt", - "op": "head" + "key": "object-tests/multipart/pending.bin", + "op": "get" }, "exchanges": [ { @@ -22281,7 +22369,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22289,7 +22377,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -22306,24 +22394,22 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-9c5ca12bcfc9\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.6314295Z" }, "body": { "encoding": "base64", - "data": "" + "data": "Zmlyc3RzZWNvbmQ=" } } } @@ -22344,7 +22430,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-9c5ca12bcfc9\"" } }, { @@ -22352,7 +22438,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -22364,34 +22450,34 @@ } }, { - "at": "/value/content_md5_base64", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "2024-01-01T00:00:00.6314295Z" } }, { - "at": "/value/version", + "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "Zmlyc3RzZWNvbmQ=" } } ], "refusal": null }, { - "id": "operations/azure/head-key-hash", + "id": "operations/azure/head-committed-declaring-md5", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"hash#tag.txt\"", + "purpose": "head committed declaring md5", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/hash#tag.txt", + "key": "object-tests/hashes/committed.bin", "op": "head" }, "exchanges": [ @@ -22412,7 +22498,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { @@ -22429,20 +22515,20 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "13", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-39ee25525bc6\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.2802899Z" }, "body": { "encoding": "base64", @@ -22467,7 +22553,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-39ee25525bc6\"" } }, { @@ -22475,7 +22561,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 } }, { @@ -22491,7 +22577,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -22499,22 +22585,22 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.2802899Z" } } ], "refusal": null }, { - "id": "operations/azure/head-key-percent", + "id": "operations/azure/head-committed", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"percent%20.txt\"", + "purpose": "head committed", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/percent%20.txt", + "key": "object-tests/multipart/committed.bin", "op": "head" }, "exchanges": [ @@ -22535,7 +22621,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { @@ -22552,20 +22638,19 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "11", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-be8efdb79010\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.7848460Z" }, "body": { "encoding": "base64", @@ -22590,7 +22675,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-be8efdb79010\"" } }, { @@ -22598,7 +22683,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -22609,35 +22694,27 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.7848460Z" } } ], "refusal": null }, { - "id": "operations/azure/head-key-plus", + "id": "operations/azure/head-metadata", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"plus+plus.txt\"", + "purpose": "head metadata", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/plus+plus.txt", + "key": "object-tests/metadata/object.txt", "op": "head" }, "exchanges": [ @@ -22658,7 +22735,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -22675,20 +22752,22 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "1", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-9abbc5e374ca\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", + "x-ms-meta-name": "value", + "x-ms-meta-second": "2", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" }, "body": { "encoding": "base64", @@ -22713,7 +22792,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-9abbc5e374ca\"" } }, { @@ -22721,7 +22800,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 1 } }, { @@ -22737,7 +22816,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -22745,22 +22824,33 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.7035036Z" + } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "name": "value", + "second": "2" + } } } ], "refusal": null }, { - "id": "operations/azure/head-key-space", + "id": "operations/azure/head-missing", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"space name.txt\"", + "purpose": "head missing. A client reports it as not_found: the object is absent", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/space name.txt", + "key": "object-tests/read/absent.txt", "op": "head" }, "exchanges": [ @@ -22781,7 +22871,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/read/absent.txt" } }, { @@ -22796,22 +22886,12 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", - "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "base64", @@ -22828,63 +22908,48 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-16c44f0af72d\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 + "value": "error" } }, { - "at": "/value/content_type", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "application/octet-stream" + "value": 404 } }, { - "at": "/value/content_md5_base64", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "BlobNotFound" } }, { - "at": "/value/version", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "not_found" } } ], "refusal": null }, { - "id": "operations/azure/head-key-non-ascii", + "id": "operations/azure/head-previous-version", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"café/雪.txt\"", + "purpose": "head previous version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/café/雪.txt", - "op": "head" + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "head", + "version": "2024-01-01T00:00:00.2318906Z" }, "exchanges": [ { @@ -22904,7 +22969,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -22914,6 +22979,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2318906Z" + } } ], "allow_headers": [], @@ -22921,20 +22994,18 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "2", + "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-5769a0807b46\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" }, "body": { "encoding": "base64", @@ -22959,7 +23030,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-5769a0807b46\"" } }, { @@ -22967,7 +23038,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 2 } }, { @@ -22983,7 +23054,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "ZlTHNMyrj0QP8IJetEPcfw==" } }, { @@ -22991,23 +23062,24 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.2318906Z" } } ], "refusal": null }, { - "id": "operations/azure/head-key-double-slash", + "id": "operations/azure/head-snapshot", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"double//slash.txt\"", + "purpose": "head snapshot", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/double//slash.txt", - "op": "head" + "key": "object-tests/snapshots/object.txt", + "op": "head", + "snapshot": "2024-01-01T00:00:00.7351568Z" }, "exchanges": [ { @@ -23027,7 +23099,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -23037,6 +23109,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7351568Z" + } } ], "allow_headers": [], @@ -23044,20 +23124,17 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "3", + "content-md5": "+XxdKZQb+xsv2rCHSQargg==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-e3698635ab53\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -23082,7 +23159,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-e3698635ab53\"" } }, { @@ -23090,7 +23167,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 3 } }, { @@ -23106,30 +23183,33 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "+XxdKZQb+xsv2rCHSQargg==" } }, { "at": "/value/version", - "optional": false, + "optional": true, "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/head-key-trailing-slash", + "id": "operations/azure/head-written-with-crc64", "profile": "azure", "lane": "core", - "purpose": "head, with the key \"trailing-slash/\"", + "purpose": "head written with crc64", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/trailing-slash/", + "key": "object-tests/hashes/crc64.txt", "op": "head" }, "exchanges": [ @@ -23150,7 +23230,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -23167,20 +23247,20 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "13", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-90cfcb93036b\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.1153123Z" }, "body": { "encoding": "base64", @@ -23205,7 +23285,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-90cfcb93036b\"" } }, { @@ -23213,7 +23293,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 } }, { @@ -23229,7 +23309,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -23237,22 +23317,22 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": "2024-01-01T00:00:00.1153123Z" } } ], "refusal": null }, { - "id": "operations/azure/head-content-properties", + "id": "operations/azure/head-written-with-md5", "profile": "azure", "lane": "core", - "purpose": "Return the stored content properties from a HEAD", + "purpose": "head written with md5", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object-tests/hashes/md5.txt", "op": "head" }, "exchanges": [ @@ -23273,7 +23353,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -23290,23 +23370,20 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", - "content-type": "text/plain; charset=utf-8", + "content-length": "13", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-494ad7275bf7\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", "x-ms-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" + "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" }, "body": { "encoding": "base64", @@ -23331,7 +23408,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-494ad7275bf7\"" } }, { @@ -23339,23 +23416,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7556278Z" + "value": 13 } }, { @@ -23363,46 +23424,37 @@ "optional": false, "rule": { "is": "equal", - "value": "text/plain; charset=utf-8" - } - }, - { - "at": "/value/content_language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" + "value": "application/octet-stream" } }, { - "at": "/value/content_disposition", + "at": "/value/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { - "at": "/value/cache_control", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "2024-01-01T00:00:00.7803759Z" } } ], "refusal": null }, { - "id": "operations/azure/head-if-unmodified-since-past", + "id": "operations/azure/head", "profile": "azure", "lane": "core", - "purpose": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", + "purpose": "head", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "head" }, @@ -23434,28 +23486,31 @@ "is": "equal", "value": "" } - }, - { - "at": "/headers/if-unmodified-since", - "optional": false, - "rule": { - "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 200, "headers": { + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -23468,38 +23523,62 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/head-copy-status", + "id": "operations/azure/head-key-question", "profile": "azure", "lane": "core", - "purpose": "Report the copy that wrote a blob, its x-ms-copy-status and x-ms-copy-id, from a HEAD of the blob", + "purpose": "head, with the key \"question?mark.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-properties" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", + "key": "object-tests/keys/question?mark.txt", "op": "head" }, "exchanges": [ @@ -23520,7 +23599,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -23537,7 +23616,8 @@ "response": { "status": 200, "headers": { - "content-length": "5", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" @@ -23545,18 +23625,15 @@ "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", - "x-ms-copy-completion-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-progress": "5/5", - "x-ms-copy-source": "https://fixture.blob.core.windows.net/fixture/object-tests/copy/source.txt", - "x-ms-copy-status": "success", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true" + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -23573,34 +23650,58 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/value/copy_id", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/head-access-tier", + "id": "operations/azure/head-key-hash", "profile": "azure", "lane": "core", - "purpose": "Report a blob's access tier, which Azure sends in x-ms-access-tier", + "purpose": "head, with the key \"hash#tag.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object-tests/keys/hash#tag.txt", "op": "head" }, "exchanges": [ @@ -23621,7 +23722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -23646,7 +23747,6 @@ }, "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-access-tier": "Cool", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", @@ -23673,26 +23773,58 @@ } }, { - "at": "/value/access_tier", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/head-rehydrating", + "id": "operations/azure/head-key-percent", "profile": "azure", "lane": "core", - "purpose": "Report the x-ms-archive-status header of a rehydrating blob as its restore status", + "purpose": "head, with the key \"percent%20.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-properties" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/archive/object.txt", + "key": "object-tests/keys/percent%20.txt", "op": "head" }, "exchanges": [ @@ -23713,7 +23845,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -23738,8 +23870,6 @@ }, "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-access-tier": "Archive", - "x-ms-archive-status": "rehydrate-pending-to-hot", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", @@ -23798,29 +23928,27 @@ } }, { - "at": "/value/restore_status", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "rehydrate-pending-to-hot" + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/restore-not-archived", + "id": "operations/azure/head-key-plus", "profile": "azure", "lane": "core", - "purpose": "Restore a blob that is online already, which Azure answers with 200 as a readable blob", + "purpose": "head, with the key \"plus+plus.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/archive/object.txt", - "op": "restore", - "priority": "standard", - "tier": "Hot" + "key": "object-tests/keys/plus+plus.txt", + "op": "head" }, "exchanges": [ { @@ -23832,7 +23960,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -23840,7 +23968,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -23850,30 +23978,6 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Hot" - } - }, - { - "at": "/headers/x-ms-rehydrate-priority", - "optional": false, - "rule": { - "is": "equal", - "value": "Standard" - } } ], "allow_headers": [], @@ -23881,12 +23985,24 @@ "response": { "status": 200, "headers": { + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -23903,29 +24019,59 @@ } }, { - "at": "/value/state", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "readable" + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/restore-while-rehydrating", + "id": "operations/azure/head-key-space", "profile": "azure", "lane": "core", - "purpose": "Rehydrate a blob to another tier while it rehydrates", + "purpose": "head, with the key \"space name.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/archive/object.txt", - "op": "restore", - "priority": "standard", - "tier": "Cool" + "key": "object-tests/keys/space name.txt", + "op": "head" }, "exchanges": [ { @@ -23937,7 +24083,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -23945,7 +24091,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -23955,46 +24101,31 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" - } - }, - { - "at": "/headers/x-ms-rehydrate-priority", - "optional": false, - "rule": { - "is": "equal", - "value": "Standard" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 200, "headers": { - "content-type": "application/xml", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "BlobBeingRehydrated" + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "utf8", - "data": "BlobBeingRehydratedFixture error" + "encoding": "base64", + "data": "" } } } @@ -24007,41 +24138,63 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "BlobBeingRehydrated" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/restore-high-priority", + "id": "operations/azure/head-key-non-ascii", "profile": "azure", "lane": "core", - "purpose": "Start rehydrating an archived blob to Cool at High priority", + "purpose": "head, with the key \"café/雪.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/archive/object.txt", - "op": "restore", - "priority": "high", - "tier": "Cool" + "key": "object-tests/keys/café/雪.txt", + "op": "head" }, "exchanges": [ { @@ -24053,7 +24206,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -24061,7 +24214,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -24071,43 +24224,31 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" - } - }, - { - "at": "/headers/x-ms-rehydrate-priority", - "optional": false, - "rule": { - "is": "equal", - "value": "High" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -24124,29 +24265,59 @@ } }, { - "at": "/value/state", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "started" + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/restore", + "id": "operations/azure/head-key-double-slash", "profile": "azure", "lane": "core", - "purpose": "Start rehydrating an archived blob to Hot at Standard priority, which Azure accepts with 202", + "purpose": "head, with the key \"double//slash.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/archive/object.txt", - "op": "restore", - "priority": "standard", - "tier": "Hot" + "key": "object-tests/keys/double//slash.txt", + "op": "head" }, "exchanges": [ { @@ -24158,7 +24329,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -24166,7 +24337,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -24176,43 +24347,31 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Hot" - } - }, - { - "at": "/headers/x-ms-rehydrate-priority", - "optional": false, - "rule": { - "is": "equal", - "value": "Standard" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -24229,27 +24388,59 @@ } }, { - "at": "/value/state", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "started" + "value": "\"fixture-16c44f0af72d\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/list-after-delete-with-versions", + "id": "operations/azure/head-key-trailing-slash", "profile": "azure", "lane": "core", - "purpose": "list after delete with versions", + "purpose": "head, with the key \"trailing-slash/\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list_page", - "prefix": "object-tests/versions-mtydohr2/deleted.txt" + "key": "object-tests/keys/trailing-slash/", + "op": "head" }, "exchanges": [ { @@ -24261,7 +24452,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24269,7 +24460,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -24279,30 +24470,6 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" - } } ], "allow_headers": [], @@ -24310,18 +24477,25 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "utf8", - "data": "object-tests/versions-mtydohr2/deleted.txt" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -24337,44 +24511,59 @@ } }, { - "at": "/value/entries", + "at": "/value/etag", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/value/prefixes", + "at": "/value/size", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 30 } }, { - "at": "/value/continuation_token", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" } } ], "refusal": null }, { - "id": "operations/azure/list-bad-marker", + "id": "operations/azure/head-content-properties", "profile": "azure", "lane": "core", - "purpose": "list bad marker", + "purpose": "Return the stored content properties from a HEAD", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "continuation_token": "fixture-marker+/1d52c72a655f=", - "op": "list_page", - "prefix": "object-tests/board/" + "key": "object-tests/read/object.txt", + "op": "head" }, "exchanges": [ { @@ -24386,7 +24575,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24394,7 +24583,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -24404,54 +24593,34 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/marker", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-marker+/1d52c72a655f=" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { - "content-type": "application/xml", + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "text/plain; charset=utf-8", "date": { "from": "now" }, - "x-ms-error-code": "InvalidQueryParameterValue" + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { - "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "base64", + "data": "" } } } @@ -24464,43 +24633,88 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidQueryParameterValue" + "value": 30 + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "H1VC0PNTmj+yaCRN4U931g==" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7556278Z" + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain; charset=utf-8" + } + }, + { + "at": "/value/content_language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl-NL" + } + }, + { + "at": "/value/content_disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/value/cache_control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], "refusal": null }, { - "id": "operations/azure/list-bad-marker-code-in-body", + "id": "operations/azure/head-if-unmodified-since-past", "profile": "azure", "lane": "core", - "purpose": "list bad marker, with the error code only in the XML body", + "purpose": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", "call": { - "continuation_token": "fixture-marker+/1d52c72a655f=", - "op": "list_page", - "prefix": "object-tests/board/" + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "head" }, "exchanges": [ { @@ -24512,7 +24726,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24520,7 +24734,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -24532,51 +24746,26 @@ } }, { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/marker", + "at": "/headers/if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/1d52c72a655f=" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { - "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "empty" } } } @@ -24597,7 +24786,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -24605,23 +24794,23 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidQueryParameterValue" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/list-container-missing", + "id": "operations/azure/head-copy-status", "profile": "azure", "lane": "core", - "purpose": "list container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "purpose": "Report the copy that wrote a blob, its x-ms-copy-status and x-ms-copy-id, from a HEAD of the blob", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-properties" ], "call": { - "op": "list_page", - "prefix": "" + "key": "object-tests/copy/target.txt", + "op": "head" }, "exchanges": [ { @@ -24633,7 +24822,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24641,7 +24830,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -24651,46 +24840,33 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": true, - "rule": { - "is": "equal", - "value": "" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 200, "headers": { - "content-type": "application/xml", + "content-length": "5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "etag": "\"fixture-16c44f0af72d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-copy-completion-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-progress": "5/5", + "x-ms-copy-source": "https://fixture.blob.core.windows.net/fixture/object-tests/copy/source.txt", + "x-ms-copy-status": "success", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ContainerNotFoundFixture error" + "encoding": "empty" } } } @@ -24703,48 +24879,44 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "ContainerNotFound" + "value": "success" } }, { - "at": "/kind", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": "container_not_found" + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure/list-delimited", + "id": "operations/azure/set-properties-all", "profile": "azure", "lane": "core", - "purpose": "list delimited", + "purpose": "Set every content property with Set Blob Properties, each in its x-ms-blob- header: content type, encoding, language, disposition and cache control", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-properties" ], "call": { - "delimiter": "/", - "op": "list_page", - "prefix": "object-tests/board/" + "cache_control": "no-cache", + "content_disposition": "attachment; filename=\"data.json\"", + "content_encoding": "gzip", + "content_language": "nl", + "content_type": "application/json", + "key": "object-tests/properties/object.txt", + "op": "azure.set_properties" }, "exchanges": [ { @@ -24756,7 +24928,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -24764,7 +24936,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -24776,35 +24948,51 @@ } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "properties" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "application/json" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-blob-content-encoding", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "gzip" } }, { - "at": "/query/delimiter", + "at": "/headers/x-ms-blob-content-language", "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "nl" + } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"data.json\"" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "no-cache" } } ], @@ -24813,18 +25001,15 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "object-tests/board//object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/object-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -24840,170 +25025,128 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/a.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 8 - } - }, - { - "at": "/value/entries/0/etag", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "\"fixture-etag\"" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure/set-properties", + "profile": "azure", + "lane": "core", + "purpose": "Set a blob's content type with Set Blob Properties: a PUT with comp=properties and x-ms-blob-content-type. It replaces all content properties, so the cache control and the stored Content-MD5 it does not name are cleared", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-properties" + ], + "call": { + "content_type": "application/json", + "key": "object-tests/properties/object.txt", + "op": "azure.set_properties" + }, + "exchanges": [ { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/z.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-b905747bf74f" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3834597Z" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/1/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "properties" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/json" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ { - "at": "/value/prefixes/0", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested/" - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "ok" } }, { - "at": "/value/continuation_token", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/list-other-delimiter", + "id": "operations/azure/set-metadata-missing", "profile": "azure", "lane": "core", - "purpose": "Send the delimiter the caller names. A flat account groups blob names at any delimiter, not only /; here a- groups a-1.txt and a-2.txt", + "purpose": "Report Set Blob Metadata on a blob that does not exist as not found, 404 BlobNotFound", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" ], "call": { - "delimiter": "-", - "op": "list_page", - "prefix": "object-tests/dashes/" + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" }, "exchanges": [ { @@ -25015,7 +25158,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25023,7 +25166,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25034,56 +25177,38 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/dashes/" + "value": "metadata" } }, { - "at": "/query/delimiter", + "at": "/headers/x-ms-meta-shape", "optional": false, "rule": { "is": "equal", - "value": "-" + "value": "round" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "object-tests/dashes/-object-tests/dashes/a-object-tests/dashes/b.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb1application/octet-streamkutf/uauL+w61xx3dTFXjw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "data": "BlobNotFoundFixture error" + } } } ] @@ -25095,87 +25220,51 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/dashes/b.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "error" } }, { - "at": "/value/entries/0/version", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": 404 } }, { - "at": "/value/prefixes/0", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "object-tests/dashes/a-" - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "BlobNotFound" } }, { - "at": "/value/continuation_token", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "not_found" } } ], "refusal": null }, { - "id": "operations/azure/list-empty", + "id": "operations/azure/set-metadata-if-match-failed", "profile": "azure", "lane": "core", - "purpose": "list empty", + "purpose": "Report Set Blob Metadata with an If-Match the blob does not have as a failed condition, 412 ConditionNotMet, which leaves the metadata as it was", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" ], "call": { - "op": "list_page", - "prefix": "object-tests/nothing/" + "if_match": "\"0x8DEADBEEF000000\"", + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" }, "exchanges": [ { @@ -25187,7 +25276,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25195,7 +25284,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25207,47 +25296,45 @@ } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "metadata" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-shape", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "round" } }, { - "at": "/query/prefix", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "object-tests/nothing/" + "value": "\"0x8DEADBEEF000000\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "ConditionNotMet" }, "body": { "encoding": "utf8", - "data": "object-tests/nothing/" - }, - "framing": "chunked" + "data": "ConditionNotMetFixture error" + } } } ] @@ -25259,47 +25346,48 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/entries", + "at": "/status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 412 } }, { - "at": "/value/prefixes", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "ConditionNotMet" } }, { - "at": "/value/continuation_token", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "precondition" } } ], "refusal": null }, { - "id": "operations/azure/list-all-empty", + "id": "operations/azure/set-metadata-empty", "profile": "azure", "lane": "core", - "purpose": "list empty", + "purpose": "Clear a blob's metadata with Set Blob Metadata and no x-ms-meta- header", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" ], "call": { - "op": "list", - "prefix": "" + "key": "object-tests/properties/object.txt", + "metadata": {}, + "op": "azure.set_metadata" }, "exchanges": [ { @@ -25311,7 +25399,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25319,7 +25407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25330,28 +25418,12 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": true, - "rule": { - "is": "equal", - "value": "" + "value": "metadata" } } ], @@ -25360,26 +25432,16 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -25395,27 +25457,30 @@ } }, { - "at": "/value/keys", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/list-encoded-names", + "id": "operations/azure/set-metadata", "profile": "azure", "lane": "core", - "purpose": "list encoded names", + "purpose": "Replace a blob's metadata with Set Blob Metadata: a PUT with comp=metadata and an x-ms-meta- header for each pair. It replaces all metadata, so a name it leaves out is gone", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" ], "call": { - "op": "list_page", - "prefix": "object-tests/names/" + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" }, "exchanges": [ { @@ -25427,7 +25492,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25435,7 +25500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25446,28 +25511,20 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "metadata" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-meta-shape", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/" + "value": "round" } } ], @@ -25476,18 +25533,16 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "object-tests/names/object-tests%2Fnames%2F100%25-%EF%BF%BE-name.txt2024-01-01T00:00:00.6773769ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b0016e7eea411application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/a&b.txt2024-01-01T00:00:00.9293679ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e0cf2e36cfe61application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/back/slash.txt2024-01-01T00:00:00.8649025ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fb1ea388bc8f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/café.txt2024-01-01T00:00:00.0714249ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4dfcbd136b001application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/hash#tag.txt2024-01-01T00:00:00.9185620ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a7996d03132f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/percent%20.txt2024-01-01T00:00:00.5807236ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5e82da751e9c1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/plus+plus.txt2024-01-01T00:00:00.8000075ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7dc03e94613e1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/q?mark.txt2024-01-01T00:00:00.3314072ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f727e794361application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -25503,515 +25558,27 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/100%-￾-name.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-b0016e7eea41" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.6773769Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/a&b.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-e0cf2e36cfe6" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9293679Z" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/1/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/back/slash.txt" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-fb1ea388bc8f" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.8649025Z" - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/2/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/3/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/café.txt" - } - }, - { - "at": "/value/entries/3/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/3/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-4dfcbd136b00" - } - }, - { - "at": "/value/entries/3/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/3/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.0714249Z" - } - }, - { - "at": "/value/entries/3/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/3/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/4/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/hash#tag.txt" - } - }, - { - "at": "/value/entries/4/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/4/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-a7996d03132f" - } - }, - { - "at": "/value/entries/4/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/4/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9185620Z" - } - }, - { - "at": "/value/entries/4/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/4/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/5/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/percent%20.txt" - } - }, - { - "at": "/value/entries/5/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/5/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-5e82da751e9c" - } - }, - { - "at": "/value/entries/5/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/5/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.5807236Z" - } - }, - { - "at": "/value/entries/5/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/5/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/6/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/plus+plus.txt" - } - }, - { - "at": "/value/entries/6/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/6/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-7dc03e94613e" - } - }, - { - "at": "/value/entries/6/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.8000075Z" - } - }, - { - "at": "/value/entries/6/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/6/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/7/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/q?mark.txt" - } - }, - { - "at": "/value/entries/7/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/7/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-91f727e79436" - } - }, - { - "at": "/value/entries/7/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/7/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3314072Z" - } - }, - { - "at": "/value/entries/7/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/7/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 8 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/list-xml-escaped", + "id": "operations/azure/head-access-tier", "profile": "azure", "lane": "core", - "purpose": "list xml escaped", + "purpose": "Report a blob's access tier, which Azure sends in x-ms-access-tier", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list", - "prefix": "" + "key": "object-tests/read/object.txt", + "op": "head" }, "exchanges": [ { @@ -26023,7 +25590,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -26031,7 +25598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -26041,30 +25608,6 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": true, - "rule": { - "is": "equal", - "value": "" - } } ], "allow_headers": [], @@ -26072,26 +25615,26 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-16c44f0af72d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-access-tier": "Cool", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-version-id": "2024-01-01T00:00:00.7556278Z" }, "body": { "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YSZhbXA7YjwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+YyZsdDtkPC9OYW1lPjxQcm9wZXJ0aWVzPjxMYXN0LU1vZGlmaWVkPk1vbiwgMDEgSmFuIDIwMjQgMDA6MDA6MDAgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPiJmaXh0dXJlIjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PC9Qcm9wZXJ0aWVzPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" - }, - "framing": "chunked" + "data": "" + } } } ] @@ -26107,31 +25650,27 @@ } }, { - "at": "/value/keys", + "at": "/value/access_tier", "optional": false, "rule": { "is": "equal", - "value": [ - "a&b", - "cobject-tests/board/2object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletruefixture-marker+/c42f89fa82e8=" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -26227,162 +25743,61 @@ } }, { - "at": "/value/entries/0/key", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "\"fixture-16c44f0af72d\"" } }, { - "at": "/value/entries/0/size", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": 8 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-704c5ddfc8cb" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/nested/c.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-48ff0e151ab7" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7881326Z" + "value": 30 } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": true + "value": "application/octet-stream" } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "SooI8J03tzeVZJA4QItfMw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { - "at": "/value/continuation_token", + "at": "/value/restore_status", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/c42f89fa82e8=" + "value": "rehydrate-pending-to-hot" } } ], "refusal": null }, { - "id": "operations/azure/list-page-size-one", + "id": "operations/azure/restore-not-archived", "profile": "azure", "lane": "core", - "purpose": "A page of zero entries is out of range, but a page of one is not. Send a page size of 1 and report the one entry and the continuation token.", + "purpose": "Restore a blob that is online already, which Azure answers with 200 as a readable blob", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" ], "call": { - "op": "list_page", - "page_size": 1, - "prefix": "object-tests/board/" + "key": "object-tests/archive/object.txt", + "op": "restore", + "priority": "standard", + "tier": "Hot" }, "exchanges": [ { @@ -26394,7 +25809,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26402,7 +25817,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26413,36 +25828,28 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "tier" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "Hot" } }, { - "at": "/query/maxresults", + "at": "/headers/x-ms-rehydrate-priority", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "Standard" } } ], @@ -26451,18 +25858,13 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { - "encoding": "utf8", - "data": "object-tests/board/1object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletruefixture-marker+/c42f89fa82e8=" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -26478,105 +25880,29 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/a.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 8 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-704c5ddfc8cb" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", + "at": "/value/state", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/c42f89fa82e8=" + "value": "readable" } } ], "refusal": null }, { - "id": "operations/azure/list-operation-timed-out", + "id": "operations/azure/restore-while-rehydrating", "profile": "azure", "lane": "core", - "purpose": "Report a 500 OperationTimedOut answer as an error, after at most 5 retries", + "purpose": "Rehydrate a blob to another tier while it rehydrates", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" ], - "origin": "transient", "call": { - "op": "list_page", - "page_size": 2, - "prefix": "object-tests/board/" + "key": "object-tests/archive/object.txt", + "op": "restore", + "priority": "standard", + "tier": "Cool" }, "exchanges": [ { @@ -26588,7 +25914,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26596,7 +25922,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26607,58 +25933,94 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "tier" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "Cool" } }, { - "at": "/query/maxresults", + "at": "/headers/x-ms-rehydrate-priority", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "Standard" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OperationTimedOut" + "x-ms-error-code": "BlobBeingRehydrated" }, "body": { "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." + "data": "BlobBeingRehydratedFixture error" } } } ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 409 + } }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobBeingRehydrated" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/restore-high-priority", + "profile": "azure", + "lane": "core", + "purpose": "Start rehydrating an archived blob to Cool at High priority", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + ], + "call": { + "key": "object-tests/archive/object.txt", + "op": "restore", + "priority": "high", + "tier": "Cool" + }, + "exchanges": [ { "alternatives": [ { @@ -26668,7 +26030,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26676,7 +26038,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26687,59 +26049,83 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "tier" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "Cool" } }, { - "at": "/query/maxresults", + "at": "/headers/x-ms-rehydrate-priority", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "High" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "OperationTimedOut" + } }, "body": { - "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." + "encoding": "empty" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, + { + "at": "/value/state", + "optional": false, + "rule": { + "is": "equal", + "value": "started" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/restore", + "profile": "azure", + "lane": "core", + "purpose": "Start rehydrating an archived blob to Hot at Standard priority, which Azure accepts with 202", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + ], + "call": { + "key": "object-tests/archive/object.txt", + "op": "restore", + "priority": "standard", + "tier": "Hot" + }, + "exchanges": [ { "alternatives": [ { @@ -26749,7 +26135,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26757,7 +26143,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26768,59 +26154,81 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "tier" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "Hot" } }, { - "at": "/query/maxresults", + "at": "/headers/x-ms-rehydrate-priority", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "Standard" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "OperationTimedOut" + } }, "body": { - "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." + "encoding": "empty" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, + { + "at": "/value/state", + "optional": false, + "rule": { + "is": "equal", + "value": "started" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-after-delete-with-versions", + "profile": "azure", + "lane": "core", + "purpose": "list after delete with versions", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/versions-mtydohr2/deleted.txt" + }, + "exchanges": [ { "alternatives": [ { @@ -26870,38 +26278,82 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "2" + "value": "object-tests/versions-mtydohr2/deleted.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OperationTimedOut" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." - } + "data": "object-tests/versions-mtydohr2/deleted.txt" + }, + "framing": "chunked" } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-bad-marker", + "profile": "azure", + "lane": "core", + "purpose": "list bad marker", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "continuation_token": "fixture-marker+/1d52c72a655f=", + "op": "list_page", + "prefix": "object-tests/board/" + }, + "exchanges": [ { "alternatives": [ { @@ -26955,34 +26407,79 @@ } }, { - "at": "/query/maxresults", + "at": "/query/marker", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture-marker+/1d52c72a655f=" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OperationTimedOut" + "x-ms-error-code": "InvalidQueryParameterValue" }, "body": { "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." + "data": "InvalidQueryParameterValueFixture error" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidQueryParameterValue" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-bad-marker-code-in-body", + "profile": "azure", + "lane": "core", + "purpose": "list bad marker, with the error code only in the XML body", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + ], + "origin": "constructed", + "call": { + "continuation_token": "fixture-marker+/1d52c72a655f=", + "op": "list_page", + "prefix": "object-tests/board/" + }, + "exchanges": [ { "alternatives": [ { @@ -27036,33 +26533,31 @@ } }, { - "at": "/query/maxresults", + "at": "/query/marker", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture-marker+/1d52c72a655f=" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "OperationTimedOut" + } }, "body": { "encoding": "utf8", - "data": "OperationTimedOutThe operation could not be completed within the permitted time." + "data": "InvalidQueryParameterValueFixture error" } } } - ], - "optional": true + ] } ], "expect": [ @@ -27079,7 +26574,7 @@ "optional": false, "rule": { "is": "equal", - "value": 500 + "value": 400 } }, { @@ -27087,24 +26582,23 @@ "optional": false, "rule": { "is": "equal", - "value": "OperationTimedOut" + "value": "InvalidQueryParameterValue" } } ], "refusal": null }, { - "id": "operations/azure/list-key-equal-to-prefix-delimited", + "id": "operations/azure/list-container-missing", "profile": "azure", "lane": "core", - "purpose": "list key equal to prefix delimited", + "purpose": "list container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "delimiter": "/", "op": "list_page", - "prefix": "object-tests/exact" + "prefix": "" }, "exchanges": [ { @@ -27153,38 +26647,28 @@ }, { "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/exact" - } - }, - { - "at": "/query/delimiter", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "/" + "value": "" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "ContainerNotFound" }, "body": { "encoding": "utf8", - "data": "object-tests/exact/object-tests/exact2024-01-01T00:00:00.9097158ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aad9350ee3141application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/exact/" - }, - "framing": "chunked" + "data": "ContainerNotFoundFixture error" + } } } ] @@ -27196,114 +26680,48 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/exact" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-aad9350ee314" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9097158Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true + "value": "error" } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": 404 } }, { - "at": "/value/prefixes/0", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact/" - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "ContainerNotFound" } }, { - "at": "/value/continuation_token", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "container_not_found" } } ], "refusal": null }, { - "id": "operations/azure/list-key-equal-to-prefix", + "id": "operations/azure/list-delimited", "profile": "azure", "lane": "core", - "purpose": "list key equal to prefix", + "purpose": "list delimited", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { + "delimiter": "/", "op": "list_page", - "prefix": "object-tests/exact" + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -27355,7 +26773,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact" + "value": "object-tests/board/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" } } ], @@ -27373,7 +26799,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/exactobject-tests/exact2024-01-01T00:00:00.9097158ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aad9350ee3141application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/exact/child2024-01-01T00:00:00.1462797ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bc7e3365fd2c1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/board//object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/object-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -27395,7 +26821,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact" + "value": "object-tests/board/a.txt" } }, { @@ -27403,7 +26829,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 8 } }, { @@ -27411,7 +26837,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-aad9350ee314" + "value": "fixture-704c5ddfc8cb" } }, { @@ -27430,7 +26856,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9097158Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { @@ -27446,7 +26872,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -27454,7 +26880,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact/child" + "value": "object-tests/board/z.txt" } }, { @@ -27462,7 +26888,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 2 } }, { @@ -27470,7 +26896,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bc7e3365fd2c" + "value": "fixture-b905747bf74f" } }, { @@ -27489,7 +26915,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1462797Z" + "value": "2024-01-01T00:00:00.3834597Z" } }, { @@ -27505,7 +26931,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -27516,12 +26942,20 @@ "value": 2 } }, + { + "at": "/value/prefixes/0", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/nested/" + } + }, { "at": "/value/prefixes", "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -27536,16 +26970,17 @@ "refusal": null }, { - "id": "operations/azure/list-many-segments", + "id": "operations/azure/list-other-delimiter", "profile": "azure", "lane": "core", - "purpose": "list many segments", + "purpose": "Send the delimiter the caller names. A flat account groups blob names at any delimiter, not only /; here a- groups a-1.txt and a-2.txt", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { + "delimiter": "-", "op": "list_page", - "prefix": "object-tests/s/" + "prefix": "object-tests/dashes/" }, "exchanges": [ { @@ -27597,7 +27032,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/" + "value": "object-tests/dashes/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "-" } } ], @@ -27615,7 +27058,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/s/object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s2024-01-01T00:00:00.1683367ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bdb8a3090de61application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/dashes/-object-tests/dashes/a-object-tests/dashes/b.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb1application/octet-streamkutf/uauL+w61xx3dTFXjw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -27637,7 +27080,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" + "value": "object-tests/dashes/b.txt" } }, { @@ -27653,18 +27096,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bdb8a3090de6" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "fixture-704c5ddfc8cb" } }, { @@ -27672,31 +27104,23 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1683367Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": true + "is": "array_length", + "value": 1 } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/prefixes/0", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "object-tests/dashes/a-" } }, { @@ -27704,7 +27128,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -27719,17 +27143,16 @@ "refusal": null }, { - "id": "operations/azure/list-max-keys-zero", + "id": "operations/azure/list-empty", "profile": "azure", "lane": "core", - "purpose": "list max keys zero", + "purpose": "list empty", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "op": "list_page", - "page_size": 0, - "prefix": "object-tests/board/" + "prefix": "object-tests/nothing/" }, "exchanges": [ { @@ -27781,33 +27204,27 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "0" + "value": "object-tests/nothing/" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OutOfRangeQueryParameterValue" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "OutOfRangeQueryParameterValueFixture error" - } + "data": "object-tests/nothing/" + }, + "framing": "chunked" } } ] @@ -27819,83 +27236,47 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "OutOfRangeQueryParameterValue" - } - } - ], - "refusal": [ - { - "at": "/outcome", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "refused" + "is": "array_length", + "value": 0 } }, { - "at": "/kind", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "matches", - "pattern": ".+" + "is": "array_length", + "value": 0 } }, { - "at": "/parameter", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "page_size" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "OutOfRangeQueryParameterValue" + "value": "" } } - ] + ], + "refusal": null }, { - "id": "operations/azure/list-metadata", + "id": "operations/azure/list-all-empty", "profile": "azure", "lane": "core", - "purpose": "list metadata", + "purpose": "list empty", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" ], "call": { - "include": [ - "metadata" - ], - "op": "list_page", - "prefix": "object-tests/metadata-listed/" + "op": "list", + "prefix": "" }, "exchanges": [ { @@ -27944,18 +27325,10 @@ }, { "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/metadata-listed/" - } - }, - { - "at": "/query/include", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "metadata" + "value": "" } } ], @@ -27968,12 +27341,20 @@ "date": { "from": "now" }, + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { - "encoding": "utf8", - "data": "object-tests/metadata-listed/object-tests/metadata-listed/plain.txt2024-01-01T00:00:00.4469276ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9a0b44f4b9e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/metadata-listed/shadowed.txt2024-01-01T00:00:00.9968398ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cd8bb50852bd1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletruex" + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" }, "framing": "chunked" } @@ -27991,186 +27372,29 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/metadata-listed/plain.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-9a0b44f4b9e9" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.4469276Z" - } - }, - { - "at": "/value/entries/0/is_current_version", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": true + "value": [] } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/metadata-listed/shadowed.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-cd8bb50852bd" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9968398Z" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/1/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/value/entries/0/metadata", - "optional": false, - "rule": { - "is": "equal", - "value": { - "label": "c" - } - } - }, - { - "at": "/value/entries/1/metadata", - "optional": false, - "rule": { - "is": "equal", - "value": { - "Metadata": "x", - "label": "b" - } - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-next-page", - "profile": "azure", - "lane": "core", - "purpose": "list next page", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "continuation_token": "fixture-marker+/c42f89fa82e8=", - "op": "list_page", - "page_size": 2, - "prefix": "object-tests/board/" - }, - "exchanges": [ + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-encoded-names", + "profile": "azure", + "lane": "core", + "purpose": "list encoded names", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/names/" + }, + "exchanges": [ { "alternatives": [ { @@ -28220,23 +27444,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/marker", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-marker+/c42f89fa82e8=" + "value": "object-tests/names/" } } ], @@ -28254,7 +27462,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/board/fixture-marker+/c42f89fa82e8=2object-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/names/object-tests%2Fnames%2F100%25-%EF%BF%BE-name.txt2024-01-01T00:00:00.6773769ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b0016e7eea411application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/a&b.txt2024-01-01T00:00:00.9293679ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e0cf2e36cfe61application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/back/slash.txt2024-01-01T00:00:00.8649025ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fb1ea388bc8f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/café.txt2024-01-01T00:00:00.0714249ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4dfcbd136b001application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/hash#tag.txt2024-01-01T00:00:00.9185620ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a7996d03132f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/percent%20.txt2024-01-01T00:00:00.5807236ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5e82da751e9c1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/plus+plus.txt2024-01-01T00:00:00.8000075ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7dc03e94613e1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/q?mark.txt2024-01-01T00:00:00.3314072ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f727e794361application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -28276,7 +27484,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/z.txt" + "value": "object-tests/names/100%-￾-name.txt" } }, { @@ -28284,7 +27492,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -28292,7 +27500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-b905747bf74f" + "value": "fixture-b0016e7eea41" } }, { @@ -28311,7 +27519,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3834597Z" + "value": "2024-01-01T00:00:00.6773769Z" } }, { @@ -28327,378 +27535,19 @@ "optional": false, "rule": { "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-pagination", - "profile": "azure", - "lane": "core", - "purpose": "list pagination", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" - ], - "call": { - "op": "list", - "page_size": 1, - "prefix": "" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": true, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "1" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" - }, - "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+Zmlyc3Q8L05hbWU+PFByb3BlcnRpZXM+PExhc3QtTW9kaWZpZWQ+TW9uLCAwMSBKYW4gMjAyNCAwMDowMDowMCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+ImZpeHR1cmUiPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48L1Byb3BlcnRpZXM+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXI+b3BhcXVlKy89PC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" - }, - "framing": "chunked" - } - } - ] - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/marker", - "optional": false, - "rule": { - "is": "equal", - "value": "opaque+/=" - } - }, - { - "at": "/query/prefix", - "optional": true, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "1" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" - }, - "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+c2Vjb25kPC9OYW1lPjxQcm9wZXJ0aWVzPjxMYXN0LU1vZGlmaWVkPk1vbiwgMDEgSmFuIDIwMjQgMDA6MDA6MDAgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPiJmaXh0dXJlIjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PC9Qcm9wZXJ0aWVzPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/keys", - "optional": false, - "rule": { - "is": "equal", - "value": [ - "first", - "second" - ] - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-order-delimited", - "profile": "azure", - "lane": "core", - "purpose": "list order delimited", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "delimiter": "/", - "op": "list_page", - "prefix": "object-tests/order/" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/" - } - }, - { - "at": "/query/delimiter", - "optional": false, - "rule": { - "is": "equal", - "value": "/" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "utf8", - "data": "object-tests/order//object-tests/order/A2024-01-01T00:00:00.6802950ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b1567b296bf41application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a2024-01-01T00:00:00.6196984ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-522bf336fec01application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-b2024-01-01T00:00:00.7288701ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ffd1d6ff8b0f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txt2024-01-01T00:00:00.2739144ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1b029c6aa2e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a/object-tests/order/a02024-01-01T00:00:00.7594151ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-238f35f044af1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/b2024-01-01T00:00:00.4152572ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f7dfa02cf51application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/é2024-01-01T00:00:00.1938992ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8b6d1d5f3fb1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/A" + "value": "object-tests/names/a&b.txt" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", @@ -28706,15 +27555,15 @@ } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b1567b296bf4" + "value": "fixture-e0cf2e36cfe6" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/1/snapshot", "optional": true, "rule": { "is": "one_of", @@ -28725,15 +27574,15 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/1/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6802950Z" + "value": "2024-01-01T00:00:00.9293679Z" } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/1/is_current_version", "optional": false, "rule": { "is": "equal", @@ -28741,7 +27590,7 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28749,15 +27598,15 @@ } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/2/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a" + "value": "object-tests/names/back/slash.txt" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/2/size", "optional": false, "rule": { "is": "equal", @@ -28765,15 +27614,15 @@ } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/2/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-522bf336fec0" + "value": "fixture-fb1ea388bc8f" } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/2/snapshot", "optional": true, "rule": { "is": "one_of", @@ -28784,15 +27633,15 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/2/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6196984Z" + "value": "2024-01-01T00:00:00.8649025Z" } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/2/is_current_version", "optional": false, "rule": { "is": "equal", @@ -28800,7 +27649,7 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28808,15 +27657,15 @@ } }, { - "at": "/value/entries/2/key", + "at": "/value/entries/3/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a-b" + "value": "object-tests/names/café.txt" } }, { - "at": "/value/entries/2/size", + "at": "/value/entries/3/size", "optional": false, "rule": { "is": "equal", @@ -28824,15 +27673,15 @@ } }, { - "at": "/value/entries/2/etag", + "at": "/value/entries/3/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-ffd1d6ff8b0f" + "value": "fixture-4dfcbd136b00" } }, { - "at": "/value/entries/2/snapshot", + "at": "/value/entries/3/snapshot", "optional": true, "rule": { "is": "one_of", @@ -28843,15 +27692,15 @@ } }, { - "at": "/value/entries/2/version", + "at": "/value/entries/3/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7288701Z" + "value": "2024-01-01T00:00:00.0714249Z" } }, { - "at": "/value/entries/2/is_current_version", + "at": "/value/entries/3/is_current_version", "optional": false, "rule": { "is": "equal", @@ -28859,7 +27708,7 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/3/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28867,15 +27716,15 @@ } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/4/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a.txt" + "value": "object-tests/names/hash#tag.txt" } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/4/size", "optional": false, "rule": { "is": "equal", @@ -28883,15 +27732,15 @@ } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/4/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-1b029c6aa2e9" + "value": "fixture-a7996d03132f" } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/4/snapshot", "optional": true, "rule": { "is": "one_of", @@ -28902,15 +27751,15 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/4/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2739144Z" + "value": "2024-01-01T00:00:00.9185620Z" } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/4/is_current_version", "optional": false, "rule": { "is": "equal", @@ -28918,7 +27767,7 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28926,15 +27775,15 @@ } }, { - "at": "/value/entries/4/key", + "at": "/value/entries/5/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a0" + "value": "object-tests/names/percent%20.txt" } }, { - "at": "/value/entries/4/size", + "at": "/value/entries/5/size", "optional": false, "rule": { "is": "equal", @@ -28942,15 +27791,15 @@ } }, { - "at": "/value/entries/4/etag", + "at": "/value/entries/5/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-238f35f044af" + "value": "fixture-5e82da751e9c" } }, { - "at": "/value/entries/4/snapshot", + "at": "/value/entries/5/snapshot", "optional": true, "rule": { "is": "one_of", @@ -28961,15 +27810,15 @@ } }, { - "at": "/value/entries/4/version", + "at": "/value/entries/5/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7594151Z" + "value": "2024-01-01T00:00:00.5807236Z" } }, { - "at": "/value/entries/4/is_current_version", + "at": "/value/entries/5/is_current_version", "optional": false, "rule": { "is": "equal", @@ -28977,7 +27826,7 @@ } }, { - "at": "/value/entries/4/content_md5_base64", + "at": "/value/entries/5/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28985,15 +27834,15 @@ } }, { - "at": "/value/entries/5/key", + "at": "/value/entries/6/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/b" + "value": "object-tests/names/plus+plus.txt" } }, { - "at": "/value/entries/5/size", + "at": "/value/entries/6/size", "optional": false, "rule": { "is": "equal", @@ -29001,15 +27850,15 @@ } }, { - "at": "/value/entries/5/etag", + "at": "/value/entries/6/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-91f7dfa02cf5" + "value": "fixture-7dc03e94613e" } }, { - "at": "/value/entries/5/snapshot", + "at": "/value/entries/6/snapshot", "optional": true, "rule": { "is": "one_of", @@ -29020,15 +27869,15 @@ } }, { - "at": "/value/entries/5/version", + "at": "/value/entries/6/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.4152572Z" + "value": "2024-01-01T00:00:00.8000075Z" } }, { - "at": "/value/entries/5/is_current_version", + "at": "/value/entries/6/is_current_version", "optional": false, "rule": { "is": "equal", @@ -29036,7 +27885,7 @@ } }, { - "at": "/value/entries/5/content_md5_base64", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -29044,15 +27893,15 @@ } }, { - "at": "/value/entries/6/key", + "at": "/value/entries/7/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/é" + "value": "object-tests/names/q?mark.txt" } }, { - "at": "/value/entries/6/size", + "at": "/value/entries/7/size", "optional": false, "rule": { "is": "equal", @@ -29060,15 +27909,15 @@ } }, { - "at": "/value/entries/6/etag", + "at": "/value/entries/7/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e8b6d1d5f3fb" + "value": "fixture-91f727e79436" } }, { - "at": "/value/entries/6/snapshot", + "at": "/value/entries/7/snapshot", "optional": true, "rule": { "is": "one_of", @@ -29079,15 +27928,15 @@ } }, { - "at": "/value/entries/6/version", + "at": "/value/entries/7/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1938992Z" + "value": "2024-01-01T00:00:00.3314072Z" } }, { - "at": "/value/entries/6/is_current_version", + "at": "/value/entries/7/is_current_version", "optional": false, "rule": { "is": "equal", @@ -29095,7 +27944,7 @@ } }, { - "at": "/value/entries/6/content_md5_base64", + "at": "/value/entries/7/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -29107,47 +27956,159 @@ "optional": false, "rule": { "is": "array_length", - "value": 7 + "value": 8 } }, { - "at": "/value/prefixes/0", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/order/a/" + "is": "array_length", + "value": 0 } }, { - "at": "/value/prefixes", + "at": "/value/continuation_token", "optional": false, "rule": { - "is": "array_length", - "value": 1 + "is": "equal", + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-xml-escaped", + "profile": "azure", + "lane": "core", + "purpose": "list xml escaped", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + ], + "call": { + "op": "list", + "prefix": "" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": true, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" + }, + "body": { + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YSZhbXA7YjwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+YyZsdDtkPC9OYW1lPjxQcm9wZXJ0aWVzPjxMYXN0LU1vZGlmaWVkPk1vbiwgMDEgSmFuIDIwMjQgMDA6MDA6MDAgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPiJmaXh0dXJlIjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PC9Qcm9wZXJ0aWVzPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" } }, { - "at": "/value/continuation_token", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": "" + "value": [ + "a&b", + "cobject-tests/order/object-tests/order/A2024-01-01T00:00:00.6802950ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b1567b296bf41application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a2024-01-01T00:00:00.6196984ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-522bf336fec01application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-b2024-01-01T00:00:00.7288701ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ffd1d6ff8b0f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txt2024-01-01T00:00:00.2739144ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1b029c6aa2e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a/b2024-01-01T00:00:00.2584945ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a57ec6c44921application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a02024-01-01T00:00:00.7594151ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-238f35f044af1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/b2024-01-01T00:00:00.4152572ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f7dfa02cf51application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/é2024-01-01T00:00:00.1938992ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8b6d1d5f3fb1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/board/2object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletruefixture-marker+/c42f89fa82e8=" }, "framing": "chunked" } @@ -29239,7 +28208,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/A" + "value": "object-tests/board/a.txt" } }, { @@ -29247,7 +28216,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 8 } }, { @@ -29255,7 +28224,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-b1567b296bf4" + "value": "fixture-704c5ddfc8cb" } }, { @@ -29274,7 +28243,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6802950Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { @@ -29290,7 +28259,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -29298,7 +28267,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a" + "value": "object-tests/board/nested/c.txt" } }, { @@ -29314,7 +28283,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-522bf336fec0" + "value": "fixture-48ff0e151ab7" } }, { @@ -29333,7 +28302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6196984Z" + "value": "2024-01-01T00:00:00.7881326Z" } }, { @@ -29349,94 +28318,168 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a-b" + "value": "SooI8J03tzeVZJA4QItfMw==" } }, { - "at": "/value/entries/2/size", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": 1 + "is": "array_length", + "value": 2 } }, { - "at": "/value/entries/2/etag", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "fixture-ffd1d6ff8b0f" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/2/version", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7288701Z" + "value": "fixture-marker+/c42f89fa82e8=" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-page-size-one", + "profile": "azure", + "lane": "core", + "purpose": "A page of zero entries is out of range, but a page of one is not. Send a page size of 1 and report the one entry and the continuation token.", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "op": "list_page", + "page_size": 1, + "prefix": "object-tests/board/" + }, + "exchanges": [ { - "at": "/value/entries/2/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "object-tests/board/1object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletruefixture-marker+/c42f89fa82e8=" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/2/content_md5_base64", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "ok" } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a.txt" + "value": "object-tests/board/a.txt" } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 8 } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-1b029c6aa2e9" + "value": "fixture-704c5ddfc8cb" } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -29447,15 +28490,15 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/0/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2739144Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": false, "rule": { "is": "equal", @@ -29463,287 +28506,54 @@ } }, { - "at": "/value/entries/3/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/4/key", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a/b" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { - "at": "/value/entries/4/size", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 1 } }, { - "at": "/value/entries/4/etag", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "fixture-8a57ec6c4492" - } - }, - { - "at": "/value/entries/4/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/4/version", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2584945Z" - } - }, - { - "at": "/value/entries/4/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/4/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/5/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a0" - } - }, - { - "at": "/value/entries/5/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/5/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-238f35f044af" - } - }, - { - "at": "/value/entries/5/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/5/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7594151Z" - } - }, - { - "at": "/value/entries/5/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/5/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/6/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/b" - } - }, - { - "at": "/value/entries/6/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/6/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-91f7dfa02cf5" - } - }, - { - "at": "/value/entries/6/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.4152572Z" - } - }, - { - "at": "/value/entries/6/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/6/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries/7/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/é" - } - }, - { - "at": "/value/entries/7/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/7/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-e8b6d1d5f3fb" - } - }, - { - "at": "/value/entries/7/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/7/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.1938992Z" - } - }, - { - "at": "/value/entries/7/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/7/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 8 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" + "value": "fixture-marker+/c42f89fa82e8=" } } ], "refusal": null }, { - "id": "operations/azure/list-all-order", + "id": "operations/azure/list-operation-timed-out", "profile": "azure", "lane": "core", - "purpose": "list order", + "purpose": "Report a 500 OperationTimedOut answer as an error, after at most 5 retries", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "transient", "call": { - "op": "list", - "prefix": "" + "op": "list_page", + "page_size": 2, + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -29792,41 +28602,444 @@ }, { "at": "/query/prefix", - "optional": true, + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 500, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "OperationTimedOut" + }, + "body": { + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, "rule": { "is": "equal", "value": "" } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "OperationTimedOut" }, "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YTwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+ejwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } }, - "framing": "chunked" + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 500, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "OperationTimedOut" + }, + "body": { + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } } } - ] + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 500, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "OperationTimedOut" + }, + "body": { + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 500, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "OperationTimedOut" + }, + "body": { + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 500, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "OperationTimedOut" + }, + "body": { + "encoding": "utf8", + "data": "OperationTimedOutThe operation could not be completed within the permitted time." + } + } + } + ], + "optional": true } ], "expect": [ @@ -29835,34 +29048,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/keys", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [ - "a", - "z" - ] + "value": 500 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "OperationTimedOut" } } ], "refusal": null }, { - "id": "operations/azure/list-page", + "id": "operations/azure/list-key-equal-to-prefix-delimited", "profile": "azure", "lane": "core", - "purpose": "list page", + "purpose": "list key equal to prefix delimited", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { + "delimiter": "/", "op": "list_page", - "prefix": "object-tests/board/" + "prefix": "object-tests/exact" }, "exchanges": [ { @@ -29914,7 +29133,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "object-tests/exact" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" } } ], @@ -29932,7 +29159,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/board/object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/exact/object-tests/exact2024-01-01T00:00:00.9097158ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aad9350ee3141application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/exact/" }, "framing": "chunked" } @@ -29954,7 +29181,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/exact" } }, { @@ -29962,7 +29189,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -29970,7 +29197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "fixture-aad9350ee314" } }, { @@ -29989,7 +29216,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" + "value": "2024-01-01T00:00:00.9097158Z" } }, { @@ -30005,133 +29232,23 @@ "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/nested/c.txt" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 1 } }, { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-48ff0e151ab7" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7881326Z" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/1/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "SooI8J03tzeVZJA4QItfMw==" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/z.txt" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-b905747bf74f" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3834597Z" - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/prefixes/0", "optional": false, "rule": { "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 3 + "value": "object-tests/exact/" } }, { @@ -30139,7 +29256,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -30154,16 +29271,16 @@ "refusal": null }, { - "id": "operations/azure/list-prefix-without-slash", + "id": "operations/azure/list-key-equal-to-prefix", "profile": "azure", "lane": "core", - "purpose": "list prefix without slash", + "purpose": "list key equal to prefix", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "op": "list_page", - "prefix": "object-tests/boa" + "prefix": "object-tests/exact" }, "exchanges": [ { @@ -30215,7 +29332,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/boa" + "value": "object-tests/exact" } } ], @@ -30233,7 +29350,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/boaobject-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/exactobject-tests/exact2024-01-01T00:00:00.9097158ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aad9350ee3141application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/exact/child2024-01-01T00:00:00.1462797ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bc7e3365fd2c1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -30255,7 +29372,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/exact" } }, { @@ -30263,7 +29380,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -30271,7 +29388,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "fixture-aad9350ee314" } }, { @@ -30290,7 +29407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" + "value": "2024-01-01T00:00:00.9097158Z" } }, { @@ -30306,7 +29423,7 @@ "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -30314,7 +29431,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested/c.txt" + "value": "object-tests/exact/child" } }, { @@ -30330,7 +29447,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-48ff0e151ab7" + "value": "fixture-bc7e3365fd2c" } }, { @@ -30349,7 +29466,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7881326Z" + "value": "2024-01-01T00:00:00.1462797Z" } }, { @@ -30365,66 +29482,7 @@ "optional": false, "rule": { "is": "equal", - "value": "SooI8J03tzeVZJA4QItfMw==" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/z.txt" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-b905747bf74f" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3834597Z" - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/2/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -30432,7 +29490,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 2 } }, { @@ -30455,17 +29513,16 @@ "refusal": null }, { - "id": "operations/azure/list-separator-keys-delimited", + "id": "operations/azure/list-many-segments", "profile": "azure", "lane": "core", - "purpose": "list separator keys delimited", + "purpose": "list many segments", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "delimiter": "/", "op": "list_page", - "prefix": "object-tests/separators/" + "prefix": "object-tests/s/" }, "exchanges": [ { @@ -30517,15 +29574,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/" - } - }, - { - "at": "/query/delimiter", - "optional": false, - "rule": { - "is": "equal", - "value": "/" + "value": "object-tests/s/" } } ], @@ -30543,7 +29592,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/separators//object-tests/separators/..leading2024-01-01T00:00:00.1857029ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-99f23038e5ea1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/object-tests/separators/dot2024-01-01T00:00:00.2106231ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ccbcb2d755851application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/object-tests/separators/space /object-tests/separators/trailing/" + "data": "object-tests/s/object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s2024-01-01T00:00:00.1683367ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bdb8a3090de61application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -30565,7 +29614,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/..leading" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { @@ -30581,7 +29630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-99f23038e5ea" + "value": "fixture-bdb8a3090de6" } }, { @@ -30600,7 +29649,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1857029Z" + "value": "2024-01-01T00:00:00.1683367Z" } }, { @@ -30619,135 +29668,45 @@ "value": "xMpCOKC5I4INzFCab3WEmw==" } }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/dot" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-ccbcb2d75585" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2106231Z" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/1/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, { "at": "/value/entries", "optional": false, "rule": { "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/prefixes/0", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/a.b/" + "value": 1 } }, { - "at": "/value/prefixes/1", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/separators/double/" + "is": "array_length", + "value": 0 } }, { - "at": "/value/prefixes/2", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/space /" - } - }, - { - "at": "/value/prefixes/3", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/trailing/" - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 4 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/list-separator-keys", + "id": "operations/azure/list-max-keys-zero", "profile": "azure", "lane": "core", - "purpose": "list separator keys", + "purpose": "list max keys zero", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "op": "list_page", - "prefix": "object-tests/separators/" + "page_size": 0, + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -30799,27 +29758,33 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/" + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "OutOfRangeQueryParameterValue" }, "body": { "encoding": "utf8", - "data": "object-tests/separators/object-tests/separators/..leading2024-01-01T00:00:00.1857029ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-99f23038e5ea1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/c2024-01-01T00:00:00.4918444ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4a4f8766cc8e1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dot2024-01-01T00:00:00.2106231ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ccbcb2d755851application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double//slash2024-01-01T00:00:00.9957719ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-32b8d82fce871application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /x2024-01-01T00:00:00.8166959ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0b64e32539cd1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/trailing/2024-01-01T00:00:00.6886650ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3be5b05a5c3b1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "data": "OutOfRangeQueryParameterValueFixture error" + } } } ] @@ -30831,137 +29796,187 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/..leading" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-99f23038e5ea" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/entries/0/version", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1857029Z" + "value": 400 } }, { - "at": "/value/entries/0/is_current_version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": true + "value": "OutOfRangeQueryParameterValue" } - }, + } + ], + "refusal": [ { - "at": "/value/entries/0/content_md5_base64", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "refused" } }, { - "at": "/value/entries/1/key", + "at": "/kind", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/separators/a.b/c" + "is": "matches", + "pattern": ".+" } }, { - "at": "/value/entries/1/size", + "at": "/parameter", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": "page_size" } }, { - "at": "/value/entries/1/etag", - "optional": false, + "at": "/status", + "optional": true, "rule": { "is": "equal", - "value": "fixture-4a4f8766cc8e" + "value": 400 } }, { - "at": "/value/entries/1/snapshot", + "at": "/code", "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.4918444Z" + "value": "OutOfRangeQueryParameterValue" } - }, + } + ] + }, + { + "id": "operations/azure/list-metadata", + "profile": "azure", + "lane": "core", + "purpose": "list metadata", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "include": [ + "metadata" + ], + "op": "list_page", + "prefix": "object-tests/metadata-listed/" + }, + "exchanges": [ { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/metadata-listed/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "object-tests/metadata-listed/object-tests/metadata-listed/plain.txt2024-01-01T00:00:00.4469276ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9a0b44f4b9e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/metadata-listed/shadowed.txt2024-01-01T00:00:00.9968398ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cd8bb50852bd1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletruex" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/1/content_md5_base64", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "ok" } }, { - "at": "/value/entries/2/key", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/dot" + "value": "object-tests/metadata-listed/plain.txt" } }, { - "at": "/value/entries/2/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", @@ -30969,15 +29984,15 @@ } }, { - "at": "/value/entries/2/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-ccbcb2d75585" + "value": "fixture-9a0b44f4b9e9" } }, { - "at": "/value/entries/2/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -30988,15 +30003,15 @@ } }, { - "at": "/value/entries/2/version", + "at": "/value/entries/0/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2106231Z" + "value": "2024-01-01T00:00:00.4469276Z" } }, { - "at": "/value/entries/2/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": false, "rule": { "is": "equal", @@ -31004,7 +30019,7 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -31012,15 +30027,15 @@ } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/double//slash" + "value": "object-tests/metadata-listed/shadowed.txt" } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", @@ -31028,15 +30043,15 @@ } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-32b8d82fce87" + "value": "fixture-cd8bb50852bd" } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/1/snapshot", "optional": true, "rule": { "is": "one_of", @@ -31047,15 +30062,15 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/1/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9957719Z" + "value": "2024-01-01T00:00:00.9968398Z" } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/1/is_current_version", "optional": false, "rule": { "is": "equal", @@ -31063,7 +30078,7 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -31071,90 +30086,194 @@ } }, { - "at": "/value/entries/4/key", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/separators/space /x" + "is": "array_length", + "value": 2 } }, { - "at": "/value/entries/4/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": 1 + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/4/etag", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "fixture-0b64e32539cd" - } - }, - { - "at": "/value/entries/4/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "" } }, { - "at": "/value/entries/4/version", + "at": "/value/entries/0/metadata", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.8166959Z" + "value": { + "label": "c" + } } }, { - "at": "/value/entries/4/is_current_version", + "at": "/value/entries/1/metadata", "optional": false, "rule": { "is": "equal", - "value": true + "value": { + "Metadata": "x", + "label": "b" + } } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-next-page", + "profile": "azure", + "lane": "core", + "purpose": "list next page", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "continuation_token": "fixture-marker+/c42f89fa82e8=", + "op": "list_page", + "page_size": 2, + "prefix": "object-tests/board/" + }, + "exchanges": [ { - "at": "/value/entries/4/content_md5_base64", + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/maxresults", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/c42f89fa82e8=" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "object-tests/board/fixture-marker+/c42f89fa82e8=2object-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "ok" } }, { - "at": "/value/entries/5/key", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/trailing/" + "value": "object-tests/board/z.txt" } }, { - "at": "/value/entries/5/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 2 } }, { - "at": "/value/entries/5/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-3be5b05a5c3b" + "value": "fixture-b905747bf74f" } }, { - "at": "/value/entries/5/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -31165,15 +30284,15 @@ } }, { - "at": "/value/entries/5/version", + "at": "/value/entries/0/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6886650Z" + "value": "2024-01-01T00:00:00.3834597Z" } }, { - "at": "/value/entries/5/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": false, "rule": { "is": "equal", @@ -31181,11 +30300,11 @@ } }, { - "at": "/value/entries/5/content_md5_base64", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -31193,7 +30312,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 6 + "value": 1 } }, { @@ -31216,19 +30335,17 @@ "refusal": null }, { - "id": "operations/azure/list-snapshots-after-delete", + "id": "operations/azure/list-pagination", "profile": "azure", "lane": "core", - "purpose": "list snapshots after delete", + "purpose": "list pagination", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" ], "call": { - "include": [ - "snapshots" - ], - "op": "list_page", - "prefix": "object-tests/snapshots-all/" + "op": "list", + "page_size": 1, + "prefix": "" }, "exchanges": [ { @@ -31277,18 +30394,18 @@ }, { "at": "/query/prefix", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "object-tests/snapshots-all/" + "value": "" } }, { - "at": "/query/include", + "at": "/query/maxresults", "optional": false, "rule": { "is": "equal", - "value": "snapshots" + "value": "1" } } ], @@ -31301,71 +30418,26 @@ "date": { "from": "now" }, + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { - "encoding": "utf8", - "data": "object-tests/snapshots-all/" + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+Zmlyc3Q8L05hbWU+PFByb3BlcnRpZXM+PExhc3QtTW9kaWZpZWQ+TW9uLCAwMSBKYW4gMjAyNCAwMDowMDowMCBHTVQ8L0xhc3QtTW9kaWZpZWQ+PEV0YWc+ImZpeHR1cmUiPC9FdGFnPjxDb250ZW50LUxlbmd0aD41PC9Db250ZW50LUxlbmd0aD48QmxvYlR5cGU+QmxvY2tCbG9iPC9CbG9iVHlwZT48L1Byb3BlcnRpZXM+PC9CbG9iPjwvQmxvYnM+PE5leHRNYXJrZXI+b3BhcXVlKy89PC9OZXh0TWFya2VyPjwvRW51bWVyYXRpb25SZXN1bHRzPg==" }, "framing": "chunked" } } ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-snapshots-after-snapshots-deleted", - "profile": "azure", - "lane": "core", - "purpose": "list snapshots after snapshots deleted", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "include": [ - "snapshots" - ], - "op": "list_page", - "prefix": "object-tests/snapshots-only/" - }, - "exchanges": [ { "alternatives": [ { @@ -31411,19 +30483,27 @@ } }, { - "at": "/query/prefix", + "at": "/query/marker", "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots-only/" + "value": "opaque+/=" } }, { - "at": "/query/include", + "at": "/query/prefix", + "optional": true, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/maxresults", "optional": false, "rule": { "is": "equal", - "value": "snapshots" + "value": "1" } } ], @@ -31436,12 +30516,20 @@ "date": { "from": "now" }, + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { - "encoding": "utf8", - "data": "object-tests/snapshots-only/object-tests/snapshots-only/object.txt2024-01-01T00:00:00.6170785ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-493478beeeaf4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+c2Vjb25kPC9OYW1lPjxQcm9wZXJ0aWVzPjxMYXN0LU1vZGlmaWVkPk1vbiwgMDEgSmFuIDIwMjQgMDA6MDA6MDAgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPiJmaXh0dXJlIjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PC9Qcm9wZXJ0aWVzPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" }, "framing": "chunked" } @@ -31459,106 +30547,31 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/snapshots-only/object.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 4 - } - }, - { - "at": "/value/entries/0/etag", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": "fixture-493478beeeaf" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" + "value": [ + "first", + "second" ] } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.6170785Z" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "TYtghPPRZ7dsrGaiKpG+Ag==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } } ], "refusal": null }, { - "id": "operations/azure/list-snapshots-and-versions", + "id": "operations/azure/list-order-delimited", "profile": "azure", "lane": "core", - "purpose": "list snapshots and versions", + "purpose": "list order delimited", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "include": [ - "snapshots", - "versions" - ], + "delimiter": "/", "op": "list_page", - "prefix": "object-tests/snapshots/" + "prefix": "object-tests/order/" }, "exchanges": [ { @@ -31610,15 +30623,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/" + "value": "object-tests/order/" } }, { - "at": "/query/include", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "snapshots,versions" + "value": "/" } } ], @@ -31636,7 +30649,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots/object-tests/snapshots/object.txt2024-01-01T00:00:00.4877091ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.7351568ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.8746441ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.6268993ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-222f410e528f3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/order//object-tests/order/A2024-01-01T00:00:00.6802950ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b1567b296bf41application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a2024-01-01T00:00:00.6196984ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-522bf336fec01application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-b2024-01-01T00:00:00.7288701ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ffd1d6ff8b0f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txt2024-01-01T00:00:00.2739144ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1b029c6aa2e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a/object-tests/order/a02024-01-01T00:00:00.7594151ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-238f35f044af1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/b2024-01-01T00:00:00.4152572ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f7dfa02cf51application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/é2024-01-01T00:00:00.1938992ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8b6d1d5f3fb1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -31658,7 +30671,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/A" } }, { @@ -31666,7 +30679,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31674,7 +30687,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "fixture-b1567b296bf4" } }, { @@ -31693,18 +30706,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.4877091Z" + "value": "2024-01-01T00:00:00.6802950Z" } }, { "at": "/value/entries/0/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -31712,7 +30722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31720,7 +30730,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a" } }, { @@ -31728,7 +30738,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31736,19 +30746,11 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "fixture-522bf336fec0" } }, { "at": "/value/entries/1/snapshot", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" - } - }, - { - "at": "/value/entries/1/version", "optional": true, "rule": { "is": "one_of", @@ -31758,15 +30760,20 @@ ] } }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6196984Z" + } + }, { "at": "/value/entries/1/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -31774,7 +30781,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31782,7 +30789,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a-b" } }, { @@ -31790,7 +30797,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31798,7 +30805,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "fixture-ffd1d6ff8b0f" } }, { @@ -31817,18 +30824,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.8746441Z" + "value": "2024-01-01T00:00:00.7288701Z" } }, { "at": "/value/entries/2/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -31836,7 +30840,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31844,7 +30848,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a.txt" } }, { @@ -31852,7 +30856,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31860,7 +30864,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-222f410e528f" + "value": "fixture-1b029c6aa2e9" } }, { @@ -31879,7 +30883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6268993Z" + "value": "2024-01-01T00:00:00.2739144Z" } }, { @@ -31895,178 +30899,94 @@ "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries", + "at": "/value/entries/4/key", "optional": false, "rule": { - "is": "array_length", - "value": 4 + "is": "equal", + "value": "object-tests/order/a0" } }, { - "at": "/value/prefixes", + "at": "/value/entries/4/size", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 1 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/4/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-238f35f044af" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-snapshots", - "profile": "azure", - "lane": "core", - "purpose": "list snapshots", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "include": [ - "snapshots" - ], - "op": "list_page", - "prefix": "object-tests/snapshots/" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "list" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/snapshots/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "snapshots" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "utf8", - "data": "object-tests/snapshots/object-tests/snapshots/object.txt2024-01-01T00:00:00.7351568ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.6268993ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-222f410e528f3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/4/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { - "at": "/outcome", + "at": "/value/entries/4/version", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "2024-01-01T00:00:00.7594151Z" } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/4/is_current_version", "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": true } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": 3 + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/5/key", "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "object-tests/order/b" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/5/size", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": 1 } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-91f7dfa02cf5" + } + }, + { + "at": "/value/entries/5/snapshot", "optional": true, "rule": { "is": "one_of", @@ -32077,50 +30997,55 @@ } }, { - "at": "/value/entries/0/is_current_version", - "optional": true, + "at": "/value/entries/5/version", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": "2024-01-01T00:00:00.4152572Z" } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/5/is_current_version", "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": true } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/5/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/6/key", "optional": false, "rule": { "is": "equal", - "value": 3 + "value": "object-tests/order/é" } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/6/size", "optional": false, "rule": { "is": "equal", - "value": "fixture-222f410e528f" + "value": 1 } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/6/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-e8b6d1d5f3fb" + } + }, + { + "at": "/value/entries/6/snapshot", "optional": true, "rule": { "is": "one_of", @@ -32131,15 +31056,15 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/6/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6268993Z" + "value": "2024-01-01T00:00:00.1938992Z" } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/6/is_current_version", "optional": false, "rule": { "is": "equal", @@ -32147,11 +31072,11 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -32159,7 +31084,15 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 + "value": 7 + } + }, + { + "at": "/value/prefixes/0", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a/" } }, { @@ -32167,7 +31100,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -32182,16 +31115,16 @@ "refusal": null }, { - "id": "operations/azure/list-staged-only", + "id": "operations/azure/list-order", "profile": "azure", "lane": "core", - "purpose": "list staged only", + "purpose": "list order", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "op": "list_page", - "prefix": "object-tests/multipart/staged.bin" + "prefix": "object-tests/order/" }, "exchanges": [ { @@ -32243,7 +31176,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/multipart/staged.bin" + "value": "object-tests/order/" } } ], @@ -32261,7 +31194,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/multipart/staged.bin" + "data": "object-tests/order/object-tests/order/A2024-01-01T00:00:00.6802950ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b1567b296bf41application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a2024-01-01T00:00:00.6196984ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-522bf336fec01application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-b2024-01-01T00:00:00.7288701ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ffd1d6ff8b0f1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txt2024-01-01T00:00:00.2739144ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1b029c6aa2e91application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a/b2024-01-01T00:00:00.2584945ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a57ec6c44921application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a02024-01-01T00:00:00.7594151ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-238f35f044af1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/b2024-01-01T00:00:00.4152572ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-91f7dfa02cf51application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/é2024-01-01T00:00:00.1938992ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8b6d1d5f3fb1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -32279,43 +31212,515 @@ } }, { - "at": "/value/entries", + "at": "/value/entries/0/key", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "object-tests/order/A" } }, { - "at": "/value/prefixes", + "at": "/value/entries/0/size", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 1 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-b1567b296bf4" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/list-unauthenticated", - "profile": "azure", - "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6802950Z" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-522bf336fec0" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6196984Z" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a-b" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-ffd1d6ff8b0f" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7288701Z" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/2/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a.txt" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-1b029c6aa2e9" + } + }, + { + "at": "/value/entries/3/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2739144Z" + } + }, + { + "at": "/value/entries/3/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/3/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/4/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a/b" + } + }, + { + "at": "/value/entries/4/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-8a57ec6c4492" + } + }, + { + "at": "/value/entries/4/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2584945Z" + } + }, + { + "at": "/value/entries/4/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/4/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/5/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a0" + } + }, + { + "at": "/value/entries/5/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-238f35f044af" + } + }, + { + "at": "/value/entries/5/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7594151Z" + } + }, + { + "at": "/value/entries/5/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/5/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/6/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/b" + } + }, + { + "at": "/value/entries/6/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/6/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-91f7dfa02cf5" + } + }, + { + "at": "/value/entries/6/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/6/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.4152572Z" + } + }, + { + "at": "/value/entries/6/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/6/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/7/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/é" + } + }, + { + "at": "/value/entries/7/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/7/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-e8b6d1d5f3fb" + } + }, + { + "at": "/value/entries/7/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/7/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.1938992Z" + } + }, + { + "at": "/value/entries/7/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/7/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 8 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-all-order", + "profile": "azure", + "lane": "core", + "purpose": "list order", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" ], "call": { - "op": "list_page", - "prefix": "object-tests/" + "op": "list", + "prefix": "" }, "exchanges": [ { @@ -32364,28 +31769,38 @@ }, { "at": "/query/prefix", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "object-tests/" + "value": "" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 401, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { - "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" - } + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YTwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+ejwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" + }, + "framing": "chunked" } } ] @@ -32397,42 +31812,34 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 401 + "value": "ok" } }, { - "at": "/code", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": [ + "a", + "z" + ] } } ], "refusal": null }, { - "id": "operations/azure/list-versions-of-deleted-object", + "id": "operations/azure/list-page", "profile": "azure", "lane": "core", - "purpose": "list versions of deleted object", + "purpose": "list page", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "include": [ - "versions" - ], "op": "list_page", - "prefix": "object-tests/versions-mtydohr2/deleted.txt" + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -32484,15 +31891,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "versions" + "value": "object-tests/board/" } } ], @@ -32510,7 +31909,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/versions-mtydohr2/deleted.txtobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.0160641ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b1602b981e92application/octet-streamASCk+RlqX5659SPzH5FNpw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.3127057ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-629d3a1755352application/octet-stream4cgEiIU9hqudbez+MNiTDw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.0760252ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4de1996d2b4b2application/octet-streamip/X39qAKSH9xAefmlKM6A==BlockBlobHottruetrue" + "data": "object-tests/board/object-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -32532,7 +31931,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/a.txt" } }, { @@ -32540,7 +31939,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 8 } }, { @@ -32548,7 +31947,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-3b1602b981e9" + "value": "fixture-704c5ddfc8cb" } }, { @@ -32567,18 +31966,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0160641Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { "at": "/value/entries/0/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -32586,7 +31982,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ASCk+RlqX5659SPzH5FNpw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -32594,7 +31990,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/nested/c.txt" } }, { @@ -32602,7 +31998,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -32610,7 +32006,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-629d3a175535" + "value": "fixture-48ff0e151ab7" } }, { @@ -32629,18 +32025,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3127057Z" + "value": "2024-01-01T00:00:00.7881326Z" } }, { "at": "/value/entries/1/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -32648,7 +32041,7 @@ "optional": false, "rule": { "is": "equal", - "value": "4cgEiIU9hqudbez+MNiTDw==" + "value": "SooI8J03tzeVZJA4QItfMw==" } }, { @@ -32656,7 +32049,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/z.txt" } }, { @@ -32672,7 +32065,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-4de1996d2b4b" + "value": "fixture-b905747bf74f" } }, { @@ -32691,18 +32084,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0760252Z" + "value": "2024-01-01T00:00:00.3834597Z" } }, { "at": "/value/entries/2/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -32710,7 +32100,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ip/X39qAKSH9xAefmlKM6A==" + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -32741,19 +32131,16 @@ "refusal": null }, { - "id": "operations/azure/list-versions", + "id": "operations/azure/list-prefix-without-slash", "profile": "azure", "lane": "core", - "purpose": "list versions", + "purpose": "list prefix without slash", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "include": [ - "versions" - ], "op": "list_page", - "prefix": "object-tests/versions-mtydohr2/" + "prefix": "object-tests/boa" }, "exchanges": [ { @@ -32805,15 +32192,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "versions" + "value": "object-tests/boa" } } ], @@ -32831,7 +32210,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/versions-mtydohr2/object-tests/versions-mtydohr2/object.txt2024-01-01T00:00:00.2318906ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9dc9ff8bf5132application/octet-streamZlTHNMyrj0QP8IJetEPcfw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/object.txt2024-01-01T00:00:00.3326281ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9e3bb87be41c2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/boaobject-tests/board/a.txt2024-01-01T00:00:00.9908400ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-704c5ddfc8cb8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txt2024-01-01T00:00:00.7881326ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-48ff0e151ab71application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txt2024-01-01T00:00:00.3834597ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b905747bf74f2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -32853,7 +32232,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/object.txt" + "value": "object-tests/board/a.txt" } }, { @@ -32861,7 +32240,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 8 } }, { @@ -32869,7 +32248,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-9dc9ff8bf513" + "value": "fixture-704c5ddfc8cb" } }, { @@ -32888,18 +32267,15 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { "at": "/value/entries/0/is_current_version", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": true } }, { @@ -32907,7 +32283,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZlTHNMyrj0QP8IJetEPcfw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -32915,7 +32291,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/object.txt" + "value": "object-tests/board/nested/c.txt" } }, { @@ -32923,7 +32299,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -32931,7 +32307,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-9e3bb87be41c" + "value": "fixture-48ff0e151ab7" } }, { @@ -32950,7 +32326,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3326281Z" + "value": "2024-01-01T00:00:00.7881326Z" } }, { @@ -32966,7 +32342,66 @@ "optional": false, "rule": { "is": "equal", - "value": "GyZ2GcSBLMRu4oF0eITKUA==" + "value": "SooI8J03tzeVZJA4QItfMw==" + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/z.txt" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-b905747bf74f" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3834597Z" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/2/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -32974,7 +32409,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 + "value": 3 } }, { @@ -32997,16 +32432,17 @@ "refusal": null }, { - "id": "operations/azure/list-written-with-hashes", + "id": "operations/azure/list-separator-keys-delimited", "profile": "azure", "lane": "core", - "purpose": "list written with hashes", + "purpose": "list separator keys delimited", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { + "delimiter": "/", "op": "list_page", - "prefix": "object-tests/hashes/" + "prefix": "object-tests/separators/" }, "exchanges": [ { @@ -33058,7 +32494,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/" + "value": "object-tests/separators/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" } } ], @@ -33076,7 +32520,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/hashes/object-tests/hashes/committed.bin2024-01-01T00:00:00.2802899ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-879f71a2d23b13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txt2024-01-01T00:00:00.1153123ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c55cf5f18aae13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txt2024-01-01T00:00:00.7803759ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1f199b777f0713application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/separators//object-tests/separators/..leading2024-01-01T00:00:00.1857029ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-99f23038e5ea1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/object-tests/separators/dot2024-01-01T00:00:00.2106231ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ccbcb2d755851application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/object-tests/separators/space /object-tests/separators/trailing/" }, "framing": "chunked" } @@ -33098,7 +32542,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/committed.bin" + "value": "object-tests/separators/..leading" } }, { @@ -33106,7 +32550,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -33114,7 +32558,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-879f71a2d23b" + "value": "fixture-99f23038e5ea" } }, { @@ -33133,7 +32577,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2802899Z" + "value": "2024-01-01T00:00:00.1857029Z" } }, { @@ -33149,7 +32593,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -33157,7 +32601,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/crc64.txt" + "value": "object-tests/separators/dot" } }, { @@ -33165,7 +32609,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -33173,7 +32617,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-c55cf5f18aae" + "value": "fixture-ccbcb2d75585" } }, { @@ -33192,7 +32636,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "value": "2024-01-01T00:00:00.2106231Z" } }, { @@ -33208,82 +32652,47 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" - } - }, - { - "at": "/value/entries/1/content_crc64_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "9XBvAwWoR9o=" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/hashes/md5.txt" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/2/size", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": 13 + "is": "array_length", + "value": 2 } }, { - "at": "/value/entries/2/etag", + "at": "/value/prefixes/0", "optional": false, "rule": { "is": "equal", - "value": "fixture-1f199b777f07" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "object-tests/separators/a.b/" } }, { - "at": "/value/entries/2/version", + "at": "/value/prefixes/1", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7803759Z" + "value": "object-tests/separators/double/" } }, { - "at": "/value/entries/2/is_current_version", + "at": "/value/prefixes/2", "optional": false, "rule": { "is": "equal", - "value": true + "value": "object-tests/separators/space /" } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/prefixes/3", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 3 + "value": "object-tests/separators/trailing/" } }, { @@ -33291,7 +32700,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 4 } }, { @@ -33306,17 +32715,16 @@ "refusal": null }, { - "id": "operations/azure/put-container-missing", + "id": "operations/azure/list-separator-keys", "profile": "azure", "lane": "core", - "purpose": "put container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "purpose": "list separator keys", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", - "op": "put" + "op": "list_page", + "prefix": "object-tests/separators/" }, "exchanges": [ { @@ -33328,7 +32736,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -33336,7 +32744,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture" } }, { @@ -33344,35 +32752,51 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/restype", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "ContainerNotFoundFixture error" - } + "data": "object-tests/separators/object-tests/separators/..leading2024-01-01T00:00:00.1857029ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-99f23038e5ea1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/c2024-01-01T00:00:00.4918444ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4a4f8766cc8e1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dot2024-01-01T00:00:00.2106231ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ccbcb2d755851application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double//slash2024-01-01T00:00:00.9957719ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-32b8d82fce871application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /x2024-01-01T00:00:00.8166959ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0b64e32539cd1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/trailing/2024-01-01T00:00:00.6886650ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3be5b05a5c3b1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -33384,791 +32808,404 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "object-tests/separators/..leading" } }, { - "at": "/code", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "ContainerNotFound" + "value": 1 } }, { - "at": "/kind", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "container_not_found" + "value": "fixture-99f23038e5ea" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-crc64-mismatch", - "profile": "azure", - "lane": "core", - "purpose": "put crc64 mismatch", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "azure_crc64", - "value_base64": "khqMBK+EUSA=" }, - "key": "object-tests/hashes/crc64-mismatch.txt", - "op": "put" - }, - "exchanges": [ { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" - } - }, - { - "at": "/headers/x-ms-content-crc64", - "optional": false, - "rule": { - "is": "equal", - "value": "khqMBK+EUSA=" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 400, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "Crc64Mismatch" - }, - "body": { - "encoding": "utf8", - "data": "Crc64MismatchFixture error" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { - "at": "/outcome", + "at": "/value/entries/0/version", "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "2024-01-01T00:00:00.1857029Z" } }, { - "at": "/status", + "at": "/value/entries/0/is_current_version", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": true } }, { - "at": "/code", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "Crc64Mismatch" + "value": "xMpCOKC5I4INzFCab3WEmw==" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-empty", - "profile": "azure", - "lane": "core", - "purpose": "put created empty", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "", - "key": "object-tests/write/empty.bin", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/write/empty.bin" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "1B2M2Y8AsgTpgAmY7PhCfg==", - "date": { - "from": "now" - }, - "etag": "\"fixture-ee13937a1c94\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7573734Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/a.b/c" + } + }, { - "at": "/outcome", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": 1 } }, { - "at": "/value/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ee13937a1c94\"" + "value": "fixture-4a4f8766cc8e" } }, { - "at": "/value/version", + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7573734Z" + "value": "2024-01-01T00:00:00.4918444Z" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created", - "profile": "azure", - "lane": "core", - "purpose": "put created", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/write/object.txt", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/write/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, { - "at": "/outcome", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/etag", + "at": "/value/entries/2/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "object-tests/separators/dot" } }, { - "at": "/value/version", + "at": "/value/entries/2/size", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": 1 } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-key-question", - "profile": "azure", - "lane": "core", - "purpose": "put created, with the key \"question?mark.txt\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/question?mark.txt", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-ccbcb2d75585" + } + }, { - "at": "/outcome", + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "2024-01-01T00:00:00.2106231Z" } }, { - "at": "/value/etag", + "at": "/value/entries/2/is_current_version", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": true } }, { - "at": "/value/version", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "xMpCOKC5I4INzFCab3WEmw==" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-key-hash", - "profile": "azure", - "lane": "core", - "purpose": "put created, with the key \"hash#tag.txt\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/hash#tag.txt", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/double//slash" + } + }, { - "at": "/outcome", + "at": "/value/entries/3/size", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": 1 } }, { - "at": "/value/etag", + "at": "/value/entries/3/etag", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "fixture-32b8d82fce87" } }, { - "at": "/value/version", + "at": "/value/entries/3/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/version", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "2024-01-01T00:00:00.9957719Z" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-key-percent", - "profile": "azure", - "lane": "core", - "purpose": "put created, with the key \"percent%20.txt\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/percent%20.txt", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/3/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, { - "at": "/outcome", + "at": "/value/entries/3/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/etag", + "at": "/value/entries/4/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "object-tests/separators/space /x" } }, { - "at": "/value/version", + "at": "/value/entries/4/size", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": 1 } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-key-plus", - "profile": "azure", - "lane": "core", - "purpose": "put created, with the key \"plus+plus.txt\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/plus+plus.txt", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-0b64e32539cd" + } + }, { - "at": "/outcome", + "at": "/value/entries/4/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/version", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "2024-01-01T00:00:00.8166959Z" } }, { - "at": "/value/etag", + "at": "/value/entries/4/is_current_version", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": true } }, { - "at": "/value/version", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/5/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/trailing/" + } + }, + { + "at": "/value/entries/5/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-3be5b05a5c3b" + } + }, + { + "at": "/value/entries/5/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6886650Z" + } + }, + { + "at": "/value/entries/5/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/5/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 6 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/put-created-key-space", + "id": "operations/azure/list-snapshots-after-delete", "profile": "azure", "lane": "core", - "purpose": "put created, with the key \"space name.txt\"", + "purpose": "list snapshots after delete", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/space name.txt", - "op": "put" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots-all/" }, "exchanges": [ { @@ -34180,7 +33217,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34188,7 +33225,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture" } }, { @@ -34196,39 +33233,59 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/restype", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots-all/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "snapshots" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/snapshots-all/" + }, + "framing": "chunked" } } ] @@ -34244,36 +33301,46 @@ } }, { - "at": "/value/etag", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "is": "array_length", + "value": 0 } }, { - "at": "/value/version", + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/put-created-key-non-ascii", + "id": "operations/azure/list-snapshots-after-snapshots-deleted", "profile": "azure", "lane": "core", - "purpose": "put created, with the key \"café/雪.txt\"", + "purpose": "list snapshots after snapshots deleted", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/café/雪.txt", - "op": "put" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots-only/" }, "exchanges": [ { @@ -34285,7 +33352,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34293,7 +33360,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture" } }, { @@ -34301,39 +33368,59 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/restype", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots-only/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "snapshots" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/snapshots-only/object-tests/snapshots-only/object.txt2024-01-01T00:00:00.6170785ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-493478beeeaf4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -34349,36 +33436,106 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "object-tests/snapshots-only/object.txt" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": 4 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-493478beeeaf" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6170785Z" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "TYtghPPRZ7dsrGaiKpG+Ag==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/put-created-key-double-slash", + "id": "operations/azure/list-snapshots-and-versions", "profile": "azure", "lane": "core", - "purpose": "put created, with the key \"double//slash.txt\"", + "purpose": "list snapshots and versions", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/double//slash.txt", - "op": "put" + "include": [ + "snapshots", + "versions" + ], + "op": "list_page", + "prefix": "object-tests/snapshots/" }, "exchanges": [ { @@ -34390,7 +33547,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34398,7 +33555,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture" } }, { @@ -34406,39 +33563,59 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/restype", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "snapshots,versions" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/snapshots/object-tests/snapshots/object.txt2024-01-01T00:00:00.4877091ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.7351568ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.8746441ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.6268993ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-222f410e528f3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -34454,240 +33631,291 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "object-tests/snapshots/object.txt" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": 3 } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-created-key-trailing-slash", - "profile": "azure", - "lane": "core", - "purpose": "put created, with the key \"trailing-slash/\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/trailing-slash/", - "op": "put" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-7adbbe4768f3" + } + }, { - "at": "/outcome", + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "2024-01-01T00:00:00.4877091Z" } }, { - "at": "/value/etag", + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "+XxdKZQb+xsv2rCHSQargg==" } }, { - "at": "/value/version", + "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "object-tests/snapshots/object.txt" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/copy-missing-source", - "profile": "azure", - "lane": "core", - "purpose": "Refuse a copy whose source does not exist", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" - ], - "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/absent.txt" - }, - "exchanges": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 404, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "BlobNotFound" - }, - "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, { - "at": "/outcome", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "fixture-7adbbe4768f3" } }, { - "at": "/status", + "at": "/value/entries/1/snapshot", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "2024-01-01T00:00:00.7351568Z" } }, { - "at": "/code", + "at": "/value/entries/1/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "+XxdKZQb+xsv2rCHSQargg==" + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots/object.txt" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-7adbbe4768f3" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.8746441Z" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "+XxdKZQb+xsv2rCHSQargg==" + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots/object.txt" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-222f410e528f" + } + }, + { + "at": "/value/entries/3/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6268993Z" + } + }, + { + "at": "/value/entries/3/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/3/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 4 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/copy", + "id": "operations/azure/list-snapshots", "profile": "azure", "lane": "core", - "purpose": "Copy an object to another key in the same container", + "purpose": "list snapshots", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots/" }, "exchanges": [ { @@ -34699,7 +33927,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34707,7 +33935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34719,30 +33947,55 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "snapshots" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" - } + "encoding": "utf8", + "data": "object-tests/snapshots/object-tests/snapshots/object.txt2024-01-01T00:00:00.7351568ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7adbbe4768f33application/octet-stream+XxdKZQb+xsv2rCHSQargg==BlockBlobHottruetrueobject-tests/snapshots/object.txt2024-01-01T00:00:00.6268993ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-222f410e528f3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -34758,31 +34011,164 @@ } }, { - "at": "/value/copy_status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "object-tests/snapshots/object.txt" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-7adbbe4768f3" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7351568Z" + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "+XxdKZQb+xsv2rCHSQargg==" + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/snapshots/object.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-222f410e528f" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.6268993Z" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/copy-replace-metadata", + "id": "operations/azure/list-staged-only", "profile": "azure", "lane": "core", - "purpose": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", + "purpose": "list staged only", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "metadata": { - "colour": "blue" - }, - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "op": "list_page", + "prefix": "object-tests/multipart/staged.bin" }, "exchanges": [ { @@ -34794,7 +34180,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34802,7 +34188,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34814,38 +34200,47 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" } }, { - "at": "/headers/x-ms-meta-colour", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "blue" + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/multipart/staged.bin" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" - } + "encoding": "utf8", + "data": "object-tests/multipart/staged.bin" + }, + "framing": "chunked" } } ] @@ -34861,29 +34256,43 @@ } }, { - "at": "/value/copy_status", + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/copy-source-if-match", + "id": "operations/azure/list-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_match": "\"fixture-etag\"", - "source_key": "object-tests/copy/source.txt" + "op": "list_page", + "prefix": "object-tests/" }, "exchanges": [ { @@ -34895,7 +34304,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34903,7 +34312,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34915,37 +34324,44 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" } }, { - "at": "/headers/x-ms-source-if-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 401, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -34958,33 +34374,42 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/copy-source-if-match-failed", + "id": "operations/azure/list-versions-of-deleted-object", "profile": "azure", "lane": "core", - "purpose": "Report a copy whose source does not have the ETag in x-ms-source-if-match as a failed condition, 412 SourceConditionNotMet", + "purpose": "list versions of deleted object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_match": "\"fixture-0123456789ab\"", - "source_key": "object-tests/copy/source.txt" + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions-mtydohr2/deleted.txt" }, "exchanges": [ { @@ -34996,7 +34421,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35004,7 +34429,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35016,37 +34441,55 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" } }, { - "at": "/headers/x-ms-source-if-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0123456789ab\"" + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtydohr2/deleted.txt" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "versions" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "SourceConditionNotMetFixture error" - } + "data": "object-tests/versions-mtydohr2/deleted.txtobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.0160641ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b1602b981e92application/octet-streamASCk+RlqX5659SPzH5FNpw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.3127057ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-629d3a1755352application/octet-stream4cgEiIU9hqudbez+MNiTDw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/deleted.txt2024-01-01T00:00:00.0760252ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4de1996d2b4b2application/octet-streamip/X39qAKSH9xAefmlKM6A==BlockBlobHottruetrue" + }, + "framing": "chunked" } } ] @@ -35058,41 +34501,236 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "object-tests/versions-mtydohr2/deleted.txt" } }, { - "at": "/code", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "SourceConditionNotMet" + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-3b1602b981e9" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.0160641Z" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "ASCk+RlqX5659SPzH5FNpw==" + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtydohr2/deleted.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-629d3a175535" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3127057Z" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "4cgEiIU9hqudbez+MNiTDw==" + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtydohr2/deleted.txt" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-4de1996d2b4b" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.0760252Z" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "ip/X39qAKSH9xAefmlKM6A==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 3 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/copy-source-if-unmodified-since-failed", + "id": "operations/azure/list-versions", "profile": "azure", "lane": "core", - "purpose": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", + "purpose": "list versions", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_unmodified_since": "Mon, 01 Jan 2024 00:00:00 GMT", - "source_key": "object-tests/copy/source.txt" + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions-mtydohr2/" }, "exchanges": [ { @@ -35104,7 +34742,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35112,7 +34750,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35124,37 +34762,55 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" } }, { - "at": "/headers/x-ms-source-if-unmodified-since", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtydohr2/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "versions" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "SourceConditionNotMetFixture error" - } + "data": "object-tests/versions-mtydohr2/object-tests/versions-mtydohr2/object.txt2024-01-01T00:00:00.2318906ZMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9dc9ff8bf5132application/octet-streamZlTHNMyrj0QP8IJetEPcfw==BlockBlobHottruetrueobject-tests/versions-mtydohr2/object.txt2024-01-01T00:00:00.3326281ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-9e3bb87be41c2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -35166,41 +34822,168 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "object-tests/versions-mtydohr2/object.txt" } }, { - "at": "/code", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "SourceConditionNotMet" + "value": 2 } - } - ], - "refusal": null - }, - { - "id": "operations/azure/copy-if-none-match-exists", - "profile": "azure", - "lane": "core", - "purpose": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" - ], - "call": { - "if_none_match": "*", - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-9dc9ff8bf513" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2318906Z" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "ZlTHNMyrj0QP8IJetEPcfw==" + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtydohr2/object.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-9e3bb87be41c" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3326281Z" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "GyZ2GcSBLMRu4oF0eITKUA==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/list-written-with-hashes", + "profile": "azure", + "lane": "core", + "purpose": "list written with hashes", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/hashes/" }, "exchanges": [ { @@ -35212,7 +34995,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35220,7 +35003,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35232,37 +35015,47 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/restype", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "container" } }, { - "at": "/headers/if-none-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/hashes/" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "BlobAlreadyExistsFixture error" - } + "data": "object-tests/hashes/object-tests/hashes/committed.bin2024-01-01T00:00:00.2802899ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-879f71a2d23b13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txt2024-01-01T00:00:00.1153123ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c55cf5f18aae13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txt2024-01-01T00:00:00.7803759ZtrueMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1f199b777f0713application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -35274,41 +35067,233 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "object-tests/hashes/committed.bin" } }, { - "at": "/code", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "value": 13 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-879f71a2d23b" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2802899Z" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "N6YZkbg+Lyfxtskwn8iRCg==" + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/hashes/crc64.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 13 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-c55cf5f18aae" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.1153123Z" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "N6YZkbg+Lyfxtskwn8iRCg==" + } + }, + { + "at": "/value/entries/1/content_crc64_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "9XBvAwWoR9o=" + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/hashes/md5.txt" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 13 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-1f199b777f07" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7803759Z" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/2/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "N6YZkbg+Lyfxtskwn8iRCg==" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 3 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure/copy-across-containers", + "id": "operations/azure/put-container-missing", "profile": "azure", "lane": "core", - "purpose": "Copy a blob from another container of the same account, which x-ms-copy-source names in its URL", + "purpose": "put container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_container": "source", - "source_key": "object-tests/copy/source.txt" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", + "op": "put" }, "exchanges": [ { @@ -35328,7 +35313,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object.txt" } }, { @@ -35336,33 +35321,34 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/source/object-tests/copy/source\\.txt" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "ContainerNotFound" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" } } } @@ -35375,33 +35361,52 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ContainerNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "container_not_found" } } ], "refusal": null }, { - "id": "operations/azure/copy-tier", + "id": "operations/azure/put-crc64-mismatch", "profile": "azure", "lane": "core", - "purpose": "Copy a blob into another access tier, named in x-ms-access-tier", + "purpose": "put crc64 mismatch", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt", - "tier": "Cool" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "khqMBK+EUSA=" + }, + "key": "object-tests/hashes/crc64-mismatch.txt", + "op": "put" }, "exchanges": [ { @@ -35421,7 +35426,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" } }, { @@ -35429,41 +35434,42 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/headers/x-ms-content-crc64", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "khqMBK+EUSA=" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "Crc64Mismatch" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "Crc64MismatchFixture error" } } } @@ -35476,32 +35482,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "Crc64Mismatch" } } ], "refusal": null }, { - "id": "operations/azure/copy-source-key-encoded", + "id": "operations/azure/put-created-empty", "profile": "azure", "lane": "core", - "purpose": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", + "purpose": "put created empty", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/a b+c%é?#.txt" + "body_base64": "", + "key": "object-tests/write/empty.bin", + "op": "put" }, "exchanges": [ { @@ -35521,7 +35535,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/write/empty.bin" } }, { @@ -35533,29 +35547,34 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/a%20b%2[Bb]c%25%[Cc]3%[Aa]9%3[Ff]%23\\.txt" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { + "content-md5": "1B2M2Y8AsgTpgAmY7PhCfg==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-ee13937a1c94\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7573734Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -35572,29 +35591,36 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-ee13937a1c94\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7573734Z" } } ], "refusal": null }, { - "id": "operations/azure/copy-source-version", + "id": "operations/azure/put-created", "profile": "azure", "lane": "core", - "purpose": "Copy an earlier version of a blob, named by versionid in the x-ms-copy-source URL", + "purpose": "put created", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt", - "source_version": "2024-01-01T00:00:00.0000000Z" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -35614,7 +35640,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -35622,33 +35648,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt\\?versionid=2024-01-01T00(?:%3[Aa]|:)00(?:%3[Aa]|:)00\\.0000000Z" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -35665,29 +35696,36 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/copy-sync", + "id": "operations/azure/put-created-key-question", "profile": "azure", "lane": "core", - "purpose": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. The source must be readable by URL: by a SAS, or by a bearer token in x-ms-copy-source-authorization", + "purpose": "put created, with the key \"question?mark.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt", - "sync": true + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/question?mark.txt", + "op": "put" }, "exchanges": [ { @@ -35707,7 +35745,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -35715,43 +35753,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-requires-sync", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "true" + "value": "BlockBlob" } } ], "allow_headers": [ - "x-ms-copy-source-authorization" + "content-type" ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -35768,29 +35801,36 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/copy-sync-missing-source", + "id": "operations/azure/put-created-key-hash", "profile": "azure", "lane": "core", - "purpose": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "purpose": "put created, with the key \"hash#tag.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/absent.txt", - "sync": true + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/hash#tag.txt", + "op": "put" }, "exchanges": [ { @@ -35810,7 +35850,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -35818,42 +35858,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-requires-sync", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "true" + "value": "BlockBlob" } } ], "allow_headers": [ - "x-ms-copy-source-authorization" + "content-type" ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "encoding": "base64", + "data": "" } } } @@ -35866,42 +35902,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/copy-pending", + "id": "operations/azure/put-created-key-percent", "profile": "azure", "lane": "core", - "purpose": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", + "purpose": "put created, with the key \"percent%20.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "transient", - "derived_from": "operations/azure/copy", "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/percent%20.txt", + "op": "put" }, "exchanges": [ { @@ -35921,7 +35955,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -35929,33 +35963,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "pending" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -35972,37 +36011,36 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "pending" + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/value/copy_id", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/copy-content-properties", + "id": "operations/azure/put-created-key-plus", "profile": "azure", "lane": "core", - "purpose": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", + "purpose": "put created, with the key \"plus+plus.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "content_type": "text/plain", - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/plus+plus.txt", + "op": "put" }, "exchanges": [ { @@ -36022,7 +36060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -36030,41 +36068,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "text/plain" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -36081,54 +36116,36 @@ } }, { - "at": "/value/copy_status", - "optional": false, - "rule": { - "is": "equal", - "value": "success" - } - } - ], - "refusal": [ - { - "at": "/outcome", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/parameter", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "content_type" + "value": "2024-01-01T00:00:00.2084665Z" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/put-from-url", + "id": "operations/azure/put-created-key-space", "profile": "azure", "lane": "core", - "purpose": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", + "purpose": "put created, with the key \"space name.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/space name.txt", + "op": "put" }, "exchanges": [ { @@ -36148,7 +36165,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -36156,15 +36173,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -36177,22 +36186,25 @@ } ], "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" + "content-type" ], "allow_query": [], "response": { "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -36213,26 +36225,32 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-from-url-content-properties", + "id": "operations/azure/put-created-key-non-ascii", "profile": "azure", "lane": "core", - "purpose": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", + "purpose": "put created, with the key \"café/雪.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "cache_control": "max-age=3600", - "content_type": "text/plain", - "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/café/雪.txt", + "op": "put" }, "exchanges": [ { @@ -36252,7 +36270,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -36260,15 +36278,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -36278,41 +36288,28 @@ "is": "equal", "value": "BlockBlob" } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", - "optional": false, - "rule": { - "is": "equal", - "value": "max-age=3600" - } } ], "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" + "content-type" ], "allow_query": [], "response": { "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -36333,24 +36330,32 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-from-url-missing-source", + "id": "operations/azure/put-created-key-double-slash", "profile": "azure", "lane": "core", - "purpose": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "purpose": "put created, with the key \"double//slash.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/absent.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/double//slash.txt", + "op": "put" }, "exchanges": [ { @@ -36370,7 +36375,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -36378,15 +36383,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -36399,22 +36396,25 @@ } ], "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" + "content-type" ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "encoding": "base64", + "data": "" } } } @@ -36427,42 +36427,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/abort-copy", + "id": "operations/azure/put-created-key-trailing-slash", "profile": "azure", "lane": "core", - "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", + "purpose": "put created, with the key \"trailing-slash/\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "transient", - "derived_from": "operations/azure/abort-copy-finished", "call": { - "copy_id": "fixture-copy-id", - "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/trailing-slash/", + "op": "put" }, "exchanges": [ { @@ -36482,7 +36480,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -36490,45 +36488,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "copy" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/copyid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" - } - }, - { - "at": "/headers/x-ms-copy-action", - "optional": false, - "rule": { - "is": "equal", - "value": "abort" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 204, + "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" - } + }, + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -36543,22 +36534,38 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" + } } ], "refusal": null }, { - "id": "operations/azure/abort-copy-finished", + "id": "operations/azure/copy-missing-source", "profile": "azure", "lane": "core", - "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", + "purpose": "Refuse a copy whose source does not exist", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "copy_id": "fixture-copy-id", "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "op": "copy", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -36590,44 +36597,28 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "copy" - } - }, - { - "at": "/query/copyid", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-copy-id" - } - }, - { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "abort" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "NoPendingCopyOperation" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "NoPendingCopyOperationFixture error" + "data": "BlobNotFoundFixture error" } } } @@ -36648,7 +36639,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 404 } }, { @@ -36656,23 +36647,24 @@ "optional": false, "rule": { "is": "equal", - "value": "NoPendingCopyOperation" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/get-page-ranges", + "id": "operations/azure/copy", "profile": "azure", "lane": "core", - "purpose": "List the written ranges of a page blob", + "purpose": "Copy an object to another key in the same container", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "key": "object-tests/pages/object.vhd", - "op": "azure.get_page_ranges" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36684,7 +36676,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -36692,7 +36684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36704,32 +36696,30 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "pagelist" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-content-length": "1024" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "0511" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -36745,34 +36735,31 @@ } }, { - "at": "/value/ranges", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": [ - { - "end": 512, - "start": 0 - } - ] + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages-unaligned", + "id": "operations/azure/copy-replace-metadata", "profile": "azure", "lane": "core", - "purpose": "Refuse a page write that does not start on a 512-byte boundary", + "purpose": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 1, - "op": "azure.upload_pages" + "key": "object-tests/copy/target.txt", + "metadata": { + "colour": "blue" + }, + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36792,7 +36779,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36800,48 +36787,41 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "page" + "value": "" } }, { - "at": "/headers/x-ms-page-write", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "update" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-range", + "at": "/headers/x-ms-meta-colour", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-512" + "value": "blue" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "encoding": "empty" } } } @@ -36854,41 +36834,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages", + "id": "operations/azure/copy-source-if-match", "profile": "azure", "lane": "core", - "purpose": "Write the first page of a page blob", + "purpose": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 0, - "op": "azure.upload_pages" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_match": "\"fixture-etag\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36908,7 +36880,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36916,46 +36888,38 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "page" + "value": "" } }, { - "at": "/headers/x-ms-page-write", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "update" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-range", + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-511" + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-sequence-number": "0", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -36973,22 +36937,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/create-page", + "id": "operations/azure/copy-source-if-match-failed", "profile": "azure", "lane": "core", - "purpose": "Create a page blob of 1,024 bytes", + "purpose": "Report a copy whose source does not have the ETag in x-ms-source-if-match as a failed condition, 412 SourceConditionNotMet", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "key": "object-tests/pages/object.vhd", - "op": "azure.create_page", - "size": 1024 + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_match": "\"fixture-0123456789ab\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37008,7 +36981,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37020,36 +36993,36 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "PageBlob" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-blob-content-length", + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "1024" + "value": "\"fixture-0123456789ab\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 412, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "SourceConditionNotMetFixture error" } } } @@ -37062,24 +37035,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/append-block-to-block-blob", + "id": "operations/azure/copy-source-if-unmodified-since-failed", "profile": "azure", "lane": "core", - "purpose": "Refuse an append to a block blob", + "purpose": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_unmodified_since": "Mon, 01 Jan 2024 00:00:00 GMT", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37099,7 +37089,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37107,32 +37097,40 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "Mon, 01 Jan 2024 00:00:00 GMT" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobType" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { "encoding": "utf8", - "data": "InvalidBlobTypeFixture error" + "data": "SourceConditionNotMetFixture error" } } } @@ -37153,7 +37151,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 412 } }, { @@ -37161,25 +37159,25 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobType" + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/append-block-at-wrong-position", + "id": "operations/azure/copy-if-none-match-exists", "profile": "azure", "lane": "core", - "purpose": "Refuse an append whose position condition does not match the blob length", + "purpose": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "append_position": 0, - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "if_none_match": "*", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37199,7 +37197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37207,40 +37205,40 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "appendblock" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-blob-condition-appendpos", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "0" + "value": "*" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "AppendPositionConditionNotMet" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { "encoding": "utf8", - "data": "AppendPositionConditionNotMetFixture error" + "data": "BlobAlreadyExistsFixture error" } } } @@ -37261,7 +37259,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 409 } }, { @@ -37269,24 +37267,25 @@ "optional": false, "rule": { "is": "equal", - "value": "AppendPositionConditionNotMet" + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure/append-block", + "id": "operations/azure/copy-across-containers", "profile": "azure", "lane": "core", - "purpose": "Append a block to an append blob and report its offset", + "purpose": "Copy a blob from another container of the same account, which x-ms-copy-source names in its URL", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_container": "source", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37306,7 +37305,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37314,31 +37313,30 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "appendblock" + "is": "matches", + "pattern": "https?://[^/]+/source/object-tests/copy/source\\.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-append-offset": "5", - "x-ms-blob-committed-block-count": "2", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -37358,35 +37356,29 @@ } }, { - "at": "/value/append_offset", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/committed_block_count", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/create-append", + "id": "operations/azure/copy-tier", "profile": "azure", "lane": "core", - "purpose": "Create an empty append blob", + "purpose": "Copy a blob into another access tier, named in x-ms-access-tier", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "key": "object-tests/append/object.log", - "op": "azure.create_append" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "tier": "Cool" }, "exchanges": [ { @@ -37406,7 +37398,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37418,25 +37410,34 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "AppendBlob" + "value": "Cool" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -37454,23 +37455,30 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/put-leased-if-match-without-lease-id", + "id": "operations/azure/copy-source-key-encoded", "profile": "azure", "lane": "core", - "purpose": "Refuse a write to a leased object whose If-Match holds but that names no lease ID", + "purpose": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "c2Vjb25k", - "if_match": "\"fixture-etag\"", - "key": "object-tests/leases/object.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/a b+c%é?#.txt" }, "exchanges": [ { @@ -37490,7 +37498,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37498,40 +37506,33 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" + "value": "" } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-etag\"" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/a%20b%2[Bb]c%25%[Cc]3%[Aa]9%3[Ff]%23\\.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseIdMissing" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "encoding": "empty" } } } @@ -37544,41 +37545,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/put-leased-with-lease-id", + "id": "operations/azure/copy-source-version", "profile": "azure", "lane": "core", - "purpose": "Write to a leased object with its lease ID", + "purpose": "Copy an earlier version of a blob, named by versionid in the x-ms-copy-source URL", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "source_version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -37598,7 +37591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37606,37 +37599,30 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" + "value": "" } }, { - "at": "/headers/x-ms-lease-id", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt\\?versionid=2024-01-01T00(?:%3[Aa]|:)00(?:%3[Aa]|:)00\\.0000000Z" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -37654,22 +37640,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/put-leased-without-lease-id", + "id": "operations/azure/copy-sync", "profile": "azure", "lane": "core", - "purpose": "Refuse a write to a leased object that names no lease ID", + "purpose": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. Azure reads the source by URL as the caller, or with the bearer token in x-ms-copy-source-authorization", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -37689,7 +37684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37697,32 +37692,49 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseIdMissing" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "encoding": "empty" } } } @@ -37735,41 +37747,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/lease-break", + "id": "operations/azure/copy-sync-missing-source", "profile": "azure", "lane": "core", - "purpose": "Break a lease at once", + "purpose": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "action": "break", - "break_period": 0, - "key": "object-tests/leases/object.txt", - "op": "azure.lease" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/absent.txt", + "sync": true }, "exchanges": [ { @@ -37789,7 +37793,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37801,44 +37805,44 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "lease" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "break" + "value": "true" } }, { - "at": "/headers/x-ms-lease-break-period", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "0" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-time": "0" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -37851,25 +37855,42 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/lease-release", + "id": "operations/azure/copy-sync-other-account", "profile": "azure", "lane": "core", - "purpose": "Release a lease", + "purpose": "Copy a blob with Copy Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "action": "release", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "azure.lease" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -37889,7 +37910,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37901,40 +37922,42 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "lease" + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "release" + "value": "true" } }, { - "at": "/headers/x-ms-lease-id", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -37952,24 +37975,32 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/lease-acquire-leased", + "id": "operations/azure/copy-pending", "profile": "azure", "lane": "core", - "purpose": "Refuse a second lease while another lease holds the object", + "purpose": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure/copy", "call": { - "action": "acquire", - "duration": 15, - "key": "object-tests/leases/object.txt", - "op": "azure.lease", - "proposed_lease_id": "66666666-7777-8888-9999-000000000000" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37989,7 +38020,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38001,52 +38032,29 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "acquire" - } - }, - { - "at": "/headers/x-ms-lease-duration", - "optional": false, - "rule": { - "is": "equal", - "value": "15" - } - }, - { - "at": "/headers/x-ms-proposed-lease-id", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "66666666-7777-8888-9999-000000000000" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseAlreadyPresent" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "pending" }, "body": { - "encoding": "utf8", - "data": "LeaseAlreadyPresentFixture error" + "encoding": "empty" } } } @@ -38059,42 +38067,41 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "pending" } }, { - "at": "/code", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": "LeaseAlreadyPresent" + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure/lease-acquire", + "id": "operations/azure/copy-content-properties", "profile": "azure", "lane": "core", - "purpose": "Acquire a lease on an object with a proposed lease ID", + "purpose": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "action": "acquire", - "duration": 15, - "key": "object-tests/leases/object.txt", - "op": "azure.lease", - "proposed_lease_id": "11111111-2222-3333-4444-555555555555" + "content_type": "text/plain", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38114,7 +38121,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38126,49 +38133,34 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "acquire" - } - }, - { - "at": "/headers/x-ms-lease-duration", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "15" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-proposed-lease-id", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "text/plain" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-id": "11111111-2222-3333-4444-555555555555" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -38188,31 +38180,55 @@ } }, { - "at": "/value/lease_id", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "success" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "content_type" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure/put-with-tags", + "id": "operations/azure/copy-other-account", "profile": "azure", "lane": "core", - "purpose": "Write an object with tags", + "purpose": "Report an asynchronous Copy Blob from another storage account as an error. It reads such a source only with a SAS, so with Entra ID Azure answers 401 CannotVerifyCopySource, with a bearer token in x-ms-copy-source-authorization or without. Copy between accounts with Copy Blob From URL, Put Blob From URL or Put Block From URL", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": { - "project": "object-tests" - } + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38232,7 +38248,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38240,40 +38256,40 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-tags", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "project=object-tests" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 401, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -38286,27 +38302,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/put-with-tags-special-characters", + "id": "operations/azure/put-from-url", "profile": "azure", "lane": "core", - "purpose": "Write a blob with an index tag that holds a space and each of + - = . _ : /, percent-encoded in x-ms-tags", + "purpose": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": { - "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" - } + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38326,7 +38355,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38334,7 +38363,15 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { @@ -38346,18 +38383,17 @@ } }, { - "at": "/headers/x-ms-tags", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "one_of", - "values": [ - "a%20b%2Bc-d%3De.f_g%3Ah%2Fi=k%20l%2Bm-n%3Do.p_q%3Ar%2Fs", - "a%20b%2Bc-d%3De.f_g:h/i=k%20l%2Bm-n%3Do.p_q:r/s" - ] + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { "status": 201, @@ -38385,32 +38421,32 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } } ], "refusal": null }, { - "id": "operations/azure/put-with-tags-duplicate-key", + "id": "operations/azure/put-from-url-content-properties", "profile": "azure", "lane": "core", - "purpose": "Report a write whose x-ms-tags names one key twice as an error. A client may refuse it, or report it unsupported where its API cannot repeat a key", + "purpose": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": [ - { - "key": "project", - "value": "a" - }, - { - "key": "project", - "value": "b" - } - ] + "cache_control": "max-age=3600", + "content_type": "text/plain", + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38430,7 +38466,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38438,7 +38474,15 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { @@ -38450,28 +38494,46 @@ } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } + }, + { + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "project=a&project=b" + "value": "text/plain" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "DuplicateTagNames" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "DuplicateTagNamesFixture error" + "encoding": "empty" } } } @@ -38484,81 +38546,32 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "DuplicateTagNames" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": "ok" } }, { - "at": "/parameter", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "DuplicateTagNames" + "value": "\"fixture-etag\"" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/get-tags", + "id": "operations/azure/put-from-url-missing-source", "profile": "azure", "lane": "core", - "purpose": "Read the tags of an object", + "purpose": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -38570,7 +38583,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38578,7 +38591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38590,27 +38603,46 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + } + }, + { + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "projectobject-tests" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -38623,33 +38655,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/tags", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": { - "project": "object-tests" - } + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/get-tags-none", + "id": "operations/azure/put-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Report no blob index tags for a blob without any, which Azure answers with an empty TagSet", + "purpose": "Write a block blob with Put Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38661,7 +38701,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38669,7 +38709,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38681,27 +38721,46 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "" + "encoding": "empty" } } } @@ -38718,28 +38777,30 @@ } }, { - "at": "/value/tags", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": {} + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/get-tags-version", + "id": "operations/azure/abort-copy", "profile": "azure", "lane": "core", - "purpose": "Get the blob index tags of a previous version, named by versionid in the query", + "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure/abort-copy-finished", "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "version": "2024-01-01T00:00:00.0000000Z" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -38751,7 +38812,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38759,7 +38820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38775,31 +38836,37 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "copy" } }, { - "at": "/query/versionid", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "fixture-copy-id" + } + }, + { + "at": "/headers/x-ms-copy-action", + "optional": false, + "rule": { + "is": "equal", + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 204, "headers": { - "content-type": "application/xml", "date": { "from": "now" } }, "body": { - "encoding": "utf8", - "data": "projectobject-tests" + "encoding": "empty" } } } @@ -38814,32 +38881,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/tags", - "optional": false, - "rule": { - "is": "equal", - "value": { - "project": "object-tests" - } - } } ], "refusal": null }, { - "id": "operations/azure/get-tags-snapshot", + "id": "operations/azure/abort-copy-finished", "profile": "azure", "lane": "core", - "purpose": "Get the blob index tags of a snapshot, named by snapshot in the query, which keeps the tags the blob had", + "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -38851,7 +38908,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38859,7 +38916,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38875,31 +38932,40 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "copy" } }, { - "at": "/query/snapshot", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "fixture-copy-id" + } + }, + { + "at": "/headers/x-ms-copy-action", + "optional": false, + "rule": { + "is": "equal", + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "NoPendingCopyOperation" }, "body": { "encoding": "utf8", - "data": "projectobject-tests" + "data": "NoPendingCopyOperationFixture error" } } } @@ -38912,36 +38978,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/tags", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": { - "project": "object-tests" - } + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "NoPendingCopyOperation" } } ], "refusal": null }, { - "id": "operations/azure/set-tags", + "id": "operations/azure/get-page-ranges", "profile": "azure", "lane": "core", - "purpose": "Replace the tags of an object", + "purpose": "List the written ranges of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - } + "key": "object-tests/pages/object.vhd", + "op": "azure.get_page_ranges" }, "exchanges": [ { @@ -38953,7 +39022,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -38961,15 +39030,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -38977,33 +39046,28 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "value": "pagelist" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-content-length": "1024" }, "body": { - "encoding": "empty" - } + "encoding": "utf8", + "data": "0511" + }, + "framing": "chunked" } } ] @@ -39017,33 +39081,36 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/ranges", + "optional": false, + "rule": { + "is": "equal", + "value": [ + { + "end": 512, + "start": 0 + } + ] + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-10-tags", + "id": "operations/azure/upload-pages-unaligned", "profile": "azure", "lane": "core", - "purpose": "Set 10 tags, the most an object takes", + "purpose": "Refuse a page write that does not start on a 512-byte boundary", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "tag00": "value0", - "tag01": "value1", - "tag02": "value2", - "tag03": "value3", - "tag04": "value4", - "tag05": "value5", - "tag06": "value6", - "tag07": "value7", - "tag08": "value8", - "tag09": "value9" - } + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 1, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -39063,15 +39130,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9" + "is": "equal", + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -39079,32 +39146,40 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "page" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=1-512" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -39117,36 +39192,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/set-tags-11-tags", + "id": "operations/azure/upload-pages", "profile": "azure", "lane": "core", - "purpose": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", + "purpose": "Write the first page of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "tag00": "value0", - "tag01": "value1", - "tag02": "value2", - "tag03": "value3", - "tag04": "value4", - "tag05": "value5", - "tag06": "value6", - "tag07": "value7", - "tag08": "value8", - "tag09": "value9", - "tag10": "value10" - } + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -39166,15 +39246,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" + "is": "equal", + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -39182,35 +39262,41 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "page" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-sequence-number": "0", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "encoding": "empty" } } } @@ -39223,82 +39309,28 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "TagsTooLarge" + "value": "ok" } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "TagsTooLarge" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-key-128", + "id": "operations/azure/upload-pages-from-url", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose key has 128 characters, the longest a key may be", + "purpose": "Write the first page of a page blob from the bytes at a URL with Put Page From URL: a PUT with comp=page, x-ms-copy-source and no body. Both x-ms-range and x-ms-source-range are required, each 512-byte aligned with an inclusive end", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages_from_url", + "source_key": "object-tests/pages/source.bin", + "source_range": { + "end": 512, + "start": 0 } }, "exchanges": [ @@ -39319,15 +39351,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "is": "equal", + "value": "" } }, { @@ -39335,29 +39367,62 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "page" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/pages/source\\.bin" + } + }, + { + "at": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 201, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-sequence-number": "0", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -39380,18 +39445,22 @@ "refusal": null }, { - "id": "operations/azure/set-tags-key-129", + "id": "operations/azure/upload-pages-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Report a tag key of 129 characters, one more than a key may have, as an error. A client may refuse it", + "purpose": "Write a page with Put Page From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/pages/source.bin", + "source_range": { + "end": 512, + "start": 0 } }, "exchanges": [ @@ -39412,15 +39481,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "is": "equal", + "value": "" } }, { @@ -39428,35 +39497,65 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "page" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/pages/source\\.bin" + } + }, + { + "at": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-sequence-number": "0", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "encoding": "empty" } } } @@ -39469,83 +39568,24 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "TagsTooLarge" + "value": "ok" } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "TagsTooLarge" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-value-256", + "id": "operations/azure/create-page", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose value has 256 characters, the longest a value may be", + "purpose": "Create a page blob of 1,024 bytes", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "key": "object-tests/pages/object.vhd", + "op": "azure.create_page", + "size": 1024 }, "exchanges": [ { @@ -39565,45 +39605,45 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "is": "equal", + "value": "" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "PageBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-blob-content-length", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "1024" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 201, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -39626,19 +39666,17 @@ "refusal": null }, { - "id": "operations/azure/set-tags-value-257", + "id": "operations/azure/append-block-to-block-blob", "profile": "azure", "lane": "core", - "purpose": "Report a tag value of 257 characters, one more than a value may have, as an error. A client may refuse it", + "purpose": "Refuse an append to a block blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39658,15 +39696,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -39674,35 +39712,24 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "x-ms-error-code": "InvalidBlobType" }, "body": { "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "data": "InvalidBlobTypeFixture error" } } } @@ -39723,7 +39750,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 409 } }, { @@ -39731,67 +39758,25 @@ "optional": false, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": "InvalidBlobType" } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "TagsTooLarge" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-special-characters", + "id": "operations/azure/append-block-at-wrong-position", "profile": "azure", "lane": "core", - "purpose": "Set a blob index tag with a space and each of + - = . _ : /, which Azure allows, escaped as XML text", + "purpose": "Refuse an append whose position condition does not match the blob length", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" - } + "append_position": 0, + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39811,15 +39796,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "a b+c-d=e.f_g:h/ik l+m-n=o.p_q:r/s" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -39827,32 +39812,32 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-blob-condition-appendpos", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 412, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "AppendPositionConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "AppendPositionConditionNotMetFixture error" } } } @@ -39865,26 +39850,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "AppendPositionConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/set-tags-invalid-character", + "id": "operations/azure/append-block", "profile": "azure", "lane": "core", - "purpose": "Report a blob index tag key with @, which Azure does not allow, as an error. A client may refuse it", + "purpose": "Append a block to an append blob and report its offset", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "a@b": "c" - } + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39904,15 +39903,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "a@bc" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -39920,35 +39919,26 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidTag" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidTagFixture error" + "encoding": "empty" } } } @@ -39961,92 +39951,42 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 5 } }, { - "at": "/code", + "at": "/value/committed_block_count", "optional": false, "rule": { "is": "equal", - "value": "InvalidTag" + "value": 2 } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidTag" - } - } - ] - }, - { - "id": "operations/azure/set-tags-duplicate-key", - "profile": "azure", - "lane": "core", - "purpose": "Report blob index tags that name one key twice as an error. A client may refuse them, or report them unsupported where its API cannot repeat a key", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" - ], - "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": [ - { - "key": "project", - "value": "a" - }, - { - "key": "project", - "value": "b" - } - ] - }, - "exchanges": [ + "refusal": null + }, + { + "id": "operations/azure/append-block-from-url", + "profile": "azure", + "lane": "core", + "purpose": "Append the bytes at a URL to an append blob with Append Block From URL: a PUT with comp=appendblock, x-ms-copy-source and no body. Report the offset the block starts at", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" + ], + "call": { + "key": "object-tests/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt" + }, + "exchanges": [ { "alternatives": [ { @@ -40064,15 +40004,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectaprojectb" + "is": "equal", + "value": "" } }, { @@ -40080,35 +40020,42 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidXmlDocument" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidXmlDocumentFixture error" + "encoding": "empty" } } } @@ -40121,85 +40068,44 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidXmlDocument" - } - } - ], - "refusal": [ - { - "at": "/outcome", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": 5 } }, { - "at": "/parameter", + "at": "/value/committed_block_count", "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidXmlDocument" + "value": 2 } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/set-tags-version", + "id": "operations/azure/append-block-from-url-range", "profile": "azure", "lane": "core", - "purpose": "Set blob index tags on a previous version, named by versionid in the query", + "purpose": "Append bytes 1 to 3 at a URL with Append Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=1-3", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - }, - "version": "2024-01-01T00:00:00.0000000Z" + "key": "object-tests/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 4, + "start": 1 + } }, "exchanges": [ { @@ -40219,15 +40125,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -40235,37 +40141,47 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "bytes=1-3" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 201, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -40283,25 +40199,39 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/append_offset", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/committed_block_count", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-snapshot", + "id": "operations/azure/append-block-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Set the blob index tags of a snapshot, named by snapshot in the query, which leaves the blob's tags alone", + "purpose": "Append a block with Append Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z", - "tags": { - "project": "object-tests" - } + "key": "object-tests/append/object.log", + "op": "azure.append_block_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -40321,15 +40251,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -40337,37 +40267,39 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/query/snapshot", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 201, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -40385,23 +40317,37 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/append_offset", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/committed_block_count", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } } ], "refusal": null }, { - "id": "operations/azure/put-with-tier", + "id": "operations/azure/create-append", "profile": "azure", "lane": "core", - "purpose": "Write an object straight into the Cool access tier", + "purpose": "Create an empty append blob", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tiers/object.txt", - "op": "put", - "tier": "Cool" + "key": "object-tests/append/object.log", + "op": "azure.create_append" }, "exchanges": [ { @@ -40421,7 +40367,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -40429,7 +40375,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { @@ -40437,15 +40383,7 @@ "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" + "value": "AppendBlob" } } ], @@ -40482,17 +40420,18 @@ "refusal": null }, { - "id": "operations/azure/set-tier-unknown", + "id": "operations/azure/put-leased-if-match-without-lease-id", "profile": "azure", "lane": "core", - "purpose": "Refuse an access tier the service does not have", + "purpose": "Refuse a write to a leased object whose If-Match holds but that names no lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Warm" + "body_base64": "c2Vjb25k", + "if_match": "\"fixture-etag\"", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -40512,7 +40451,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40520,40 +40459,40 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tier" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "Warm" + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -40574,7 +40513,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -40582,24 +40521,25 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "LeaseIdMissing" } } ], "refusal": null }, { - "id": "operations/azure/set-tier-cool", + "id": "operations/azure/put-leased-with-lease-id", "profile": "azure", "lane": "core", - "purpose": "Move an object to the Cool access tier", + "purpose": "Write to a leased object with its lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Cool" + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "put" }, "exchanges": [ { @@ -40619,7 +40559,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40627,34 +40567,37 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tier" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/x-ms-lease-id", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "value": "11111111-2222-3333-4444-555555555555" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -40677,17 +40620,17 @@ "refusal": null }, { - "id": "operations/azure/set-tier-rehydrate", + "id": "operations/azure/put-leased-without-lease-id", "profile": "azure", "lane": "core", - "purpose": "Report a tier change that Azure accepts with 202, as it does when an archived blob starts to rehydrate, as a success", + "purpose": "Refuse a write to a leased object that names no lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Hot" + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -40707,7 +40650,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40715,37 +40658,32 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "tier" + "value": "c2Vjb25k" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "Hot" + "value": "BlockBlob" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 412, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "LeaseIdMissing" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "LeaseIdMissingFixture error" } } } @@ -40758,26 +40696,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "LeaseIdMissing" } } ], "refusal": null }, { - "id": "operations/azure/put-internal-error", + "id": "operations/azure/lease-break", "profile": "azure", "lane": "core", - "purpose": "Report a 500 InternalError answer as an error, after at most 5 retries", + "purpose": "Break a lease at once", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], - "origin": "transient", "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/write/object.txt", - "op": "put" + "action": "break", + "break_period": 0, + "key": "object-tests/leases/object.txt", + "op": "azure.lease" }, "exchanges": [ { @@ -40797,7 +40750,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40805,39 +40758,81 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "lease" + } + }, + { + "at": "/headers/x-ms-lease-action", + "optional": false, + "rule": { + "is": "equal", + "value": "break" + } + }, + { + "at": "/headers/x-ms-lease-break-period", + "optional": false, + "rule": { + "is": "equal", + "value": "0" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-time": "0" }, "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "encoding": "empty" } } } ] - }, + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/lease-release", + "profile": "azure", + "lane": "core", + "purpose": "Release a lease", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + ], + "call": { + "action": "release", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "azure.lease" + }, + "exchanges": [ { "alternatives": [ { @@ -40855,7 +40850,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40863,40 +40858,81 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "lease" + } + }, + { + "at": "/headers/x-ms-lease-action", + "optional": false, + "rule": { + "is": "equal", + "value": "release" + } + }, + { + "at": "/headers/x-ms-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "encoding": "empty" } } } - ], - "optional": true - }, + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/lease-acquire-leased", + "profile": "azure", + "lane": "core", + "purpose": "Refuse a second lease while another lease holds the object", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + ], + "call": { + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "66666666-7777-8888-9999-000000000000" + }, + "exchanges": [ { "alternatives": [ { @@ -40914,7 +40950,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -40922,99 +40958,106 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" + "value": "" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 500, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "InternalError" }, - "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ { - "at": "/method", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "lease" } }, { - "at": "/path", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "acquire" } }, { - "at": "/body_base64", + "at": "/headers/x-ms-lease-duration", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "15" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-proposed-lease-id", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "66666666-7777-8888-9999-000000000000" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "x-ms-error-code": "LeaseAlreadyPresent" }, "body": { "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "data": "LeaseAlreadyPresentFixture error" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 409 + } }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "LeaseAlreadyPresent" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/lease-acquire", + "profile": "azure", + "lane": "core", + "purpose": "Acquire a lease on an object with a proposed lease ID", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + ], + "call": { + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "11111111-2222-3333-4444-555555555555" + }, + "exchanges": [ { "alternatives": [ { @@ -41032,7 +41075,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -41040,98 +41083,60 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" + "value": "" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 500, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "InternalError" }, - "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." - } - } - } - ], - "optional": true - }, - { - "alternatives": [ - { - "request": [ { - "at": "/method", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "lease" } }, { - "at": "/path", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "acquire" } }, { - "at": "/body_base64", + "at": "/headers/x-ms-lease-duration", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "15" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-proposed-lease-id", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "11111111-2222-3333-4444-555555555555" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-id": "11111111-2222-3333-4444-555555555555" }, "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "encoding": "empty" } } } - ], - "optional": true + ] } ], "expect": [ @@ -41140,41 +41145,35 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 500 + "value": "ok" } }, { - "at": "/code", + "at": "/value/lease_id", "optional": false, "rule": { "is": "equal", - "value": "InternalError" + "value": "11111111-2222-3333-4444-555555555555" } } ], "refusal": null }, { - "id": "operations/azure/put-if-unmodified-since-past", + "id": "operations/azure/put-with-tags", "profile": "azure", "lane": "core", - "purpose": "Refuse a write with 412 when the object changed after If-Unmodified-Since", + "purpose": "Write an object with tags", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", - "key": "object-tests/write/object.txt", - "op": "put" + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tags/object.txt", + "op": "put", + "tags": { + "project": "object-tests" + } }, "exchanges": [ { @@ -41194,7 +41193,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41202,7 +41201,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "Zmlyc3Q=" } }, { @@ -41214,30 +41213,28 @@ } }, { - "at": "/headers/if-unmodified-since", + "at": "/headers/x-ms-tags", "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "project=object-tests" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "encoding": "empty" } } } @@ -41250,41 +41247,27 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "ConditionNotMet" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/put-content-encoding-gzip", + "id": "operations/azure/put-with-tags-special-characters", "profile": "azure", "lane": "core", - "purpose": "Store Content-Encoding: gzip with a write, and the gzip bytes unchanged", + "purpose": "Write a blob with an index tag that holds a space and each of + - = . _ : /, percent-encoded in x-ms-tags", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", - "content_encoding": "gzip", - "key": "object-tests/write/object.txt", - "op": "put" + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tags/object.txt", + "op": "put", + "tags": { + "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" + } }, "exchanges": [ { @@ -41304,7 +41287,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41312,7 +41295,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "value": "Zmlyc3Q=" } }, { @@ -41324,37 +41307,75 @@ } }, { - "at": "/headers/x-ms-blob-content-encoding", + "at": "/headers/x-ms-tags", "optional": false, "rule": { - "is": "equal", - "value": "gzip" + "is": "one_of", + "values": [ + "a%20b%2Bc-d%3De.f_g%3Ah%2Fi=k%20l%2Bm-n%3Do.p_q%3Ar%2Fs", + "a%20b%2Bc-d%3De.f_g:h/i=k%20l%2Bm-n%3Do.p_q:r/s" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 201, "headers": { - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, - "etag": "\"fixture-b9991ef94e3d\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } - }, + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/put-with-tags-duplicate-key", + "profile": "azure", + "lane": "core", + "purpose": "Report a write whose x-ms-tags names one key twice as an error. A client may refuse it, or report it unsupported where its API cannot repeat a key", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + ], + "call": { + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tags/object.txt", + "op": "put", + "tags": [ + { + "key": "project", + "value": "a" + }, + { + "key": "project", + "value": "b" + } + ] + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -41370,7 +41391,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41378,7 +41399,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "value": "Zmlyc3Q=" } }, { @@ -41390,34 +41411,28 @@ } }, { - "at": "/headers/content-encoding", + "at": "/headers/x-ms-tags", "optional": false, "rule": { "is": "equal", - "value": "gzip" + "value": "project=a&project=b" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + "x-ms-error-code": "DuplicateTagNames" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "DuplicateTagNamesFixture error" } } } @@ -41430,44 +41445,81 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": 400 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "DuplicateTagNames" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "DuplicateTagNames" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure/put-content-properties", + "id": "operations/azure/get-tags", "profile": "azure", "lane": "core", - "purpose": "Store Content-Type, Content-Language, Content-Disposition and Cache-Control with a write", + "purpose": "Read the tags of an object", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "cache_control": "max-age=3600", - "content_disposition": "attachment; filename=\"report.txt\"", - "content_language": "nl-NL", - "content_type": "text/plain; charset=utf-8", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags" }, "exchanges": [ { @@ -41479,7 +41531,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41487,7 +41539,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41495,73 +41547,74 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" } }, - { - "at": "/headers/x-ms-blob-content-language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" - } - }, - { - "at": "/headers/x-ms-blob-content-disposition", - "optional": false, - "rule": { - "is": "equal", - "value": "attachment; filename=\"report.txt\"" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", - "optional": false, - "rule": { - "is": "equal", - "value": "max-age=3600" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", - "date": { - "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" - }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "projectobject-tests" } } - }, + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": { + "project": "object-tests" + } + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/get-tags-none", + "profile": "azure", + "lane": "core", + "purpose": "Report no blob index tags for a blob without any, which Azure answers with an empty TagSet", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + ], + "call": { + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags" + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -41569,7 +41622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41577,7 +41630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41585,70 +41638,31 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" - } - }, - { - "at": "/headers/content-language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" - } - }, - { - "at": "/headers/x-ms-blob-content-disposition", - "optional": false, - "rule": { - "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "" } }, { - "at": "/headers/cache-control", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "tags" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "" } } } @@ -41665,37 +41679,28 @@ } }, { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" - } - }, - { - "at": "/value/version", + "at": "/value/tags", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": {} } } ], "refusal": null }, { - "id": "operations/azure/put-content-type-non-ascii", + "id": "operations/azure/get-tags-version", "profile": "azure", "lane": "core", - "purpose": "Write a Content-Type with a parameter outside ASCII as its UTF-8 bytes. A flat account returns them as it got them, so they read back", + "purpose": "Get the blob index tags of a previous version, named by versionid in the query", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "content_type": "text/plain; name=\"été.txt\"", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags", + "version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -41707,7 +41712,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41715,7 +41720,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41723,46 +41728,39 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/query/versionid", "optional": false, "rule": { "is": "equal", - "value": "text/plain; name=\"été.txt\"" + "value": "2024-01-01T00:00:00.0000000Z" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "projectobject-tests" } } } @@ -41779,37 +41777,30 @@ } }, { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" - } - }, - { - "at": "/value/version", + "at": "/value/tags", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": { + "project": "object-tests" + } } } ], "refusal": null }, { - "id": "operations/azure/put-content-disposition-non-ascii", + "id": "operations/azure/get-tags-snapshot", "profile": "azure", "lane": "core", - "purpose": "Write a Content-Disposition whose filename is outside ASCII. Azure refuses a disposition byte outside ASCII with 400 InvalidMetadata, so send an RFC 6266 filename*, which any reader decodes, or refuse the value", + "purpose": "Get the blob index tags of a snapshot, named by snapshot in the query, which keeps the tags the blob had", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "content_disposition": "attachment; filename=\"été.txt\"", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -41821,7 +41812,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41829,7 +41820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41837,46 +41828,39 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/query/snapshot", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" + "value": "2024-01-01T00:00:00.0000000Z" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "projectobject-tests" } } } @@ -41893,78 +41877,32 @@ } }, { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" - } - }, - { - "at": "/value/version", + "at": "/value/tags", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": { + "project": "object-tests" + } } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "content_disposition" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidMetadata" - } - } - ] + "refusal": null }, { - "id": "operations/azure/put-content-type-edge-spaces", + "id": "operations/azure/set-tags", "profile": "azure", "lane": "core", - "purpose": "Write a content type with spaces at either end, which HTTP drops, so the service stores it trimmed. A client may refuse it", + "purpose": "Replace the tags of an object", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "content_type": " text/plain ", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "project": "object-tests" + } }, "exchanges": [ { @@ -41984,57 +41922,93 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "is": "xml", + "value": "projectobject-tests" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "text/plain" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } - }, + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/set-tags-10-tags", + "profile": "azure", + "lane": "core", + "purpose": "Set 10 tags, the most an object takes", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + ], + "call": { + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "tag00": "value0", + "tag01": "value1", + "tag02": "value2", + "tag03": "value3", + "tag04": "value4", + "tag05": "value5", + "tag06": "value6", + "tag07": "value7", + "tag08": "value8", + "tag09": "value9" + } + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -42050,54 +42024,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "is": "xml", + "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "text/plain" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" - }, - "etag": "\"fixture-b9991ef94e3d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -42112,63 +42080,34 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" - } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "content_type" - } - } - ] + "refusal": null }, { - "id": "operations/azure/put-first-version", + "id": "operations/azure/set-tags-11-tags", "profile": "azure", "lane": "core", - "purpose": "put first version", + "purpose": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "djE=", - "key": "object-tests/versions-mtydohr2/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "tag00": "value0", + "tag01": "value1", + "tag02": "value2", + "tag03": "value3", + "tag04": "value4", + "tag05": "value5", + "tag06": "value6", + "tag07": "value7", + "tag08": "value8", + "tag09": "value9", + "tag10": "value10" + } }, "exchanges": [ { @@ -42188,46 +42127,51 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "djE=" + "is": "xml", + "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { - "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-5769a0807b46\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" + "x-ms-error-code": "TagsTooLarge" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -42240,41 +42184,83 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5769a0807b46\"" + "value": 400 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" + "value": "TagsTooLarge" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "TagsTooLarge" + } + } + ] }, { - "id": "operations/azure/put-if-match-current", + "id": "operations/azure/set-tags-key-128", "profile": "azure", "lane": "core", - "purpose": "put if match current", + "purpose": "Set a tag whose key has 128 characters, the longest a key may be", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "cmVwbGFjZWQ=", - "if_match": "\"fixture-b9991ef94e3d\"", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } }, "exchanges": [ { @@ -42294,54 +42280,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "cmVwbGFjZWQ=" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { - "at": "/headers/if-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "kbskg1kEP+mEFuJZyb3xDQ==", "date": { "from": "now" - }, - "etag": "\"fixture-3e075954b24b\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.3814952Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -42356,39 +42336,24 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-3e075954b24b\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3814952Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-if-none-match-missing", + "id": "operations/azure/set-tags-key-129", "profile": "azure", "lane": "core", - "purpose": "put if none match missing", + "purpose": "Report a tag key of 129 characters, one more than a key may have, as an error. A client may refuse it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "ZnJlc2g=", - "if_none_match": "*", - "key": "object-tests/write/fresh.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } }, "exchanges": [ { @@ -42408,54 +42373,51 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/fresh.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "ZnJlc2g=" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { - "at": "/headers/if-none-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { - "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-0445b9b5a1dd\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2457093Z" + "x-ms-error-code": "TagsTooLarge" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -42468,40 +42430,83 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0445b9b5a1dd\"" + "value": 400 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2457093Z" + "value": "TagsTooLarge" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "TagsTooLarge" + } + } + ] }, { - "id": "operations/azure/put-key-1024", + "id": "operations/azure/set-tags-value-256", "profile": "azure", "lane": "core", - "purpose": "put key 1024", + "purpose": "Set a tag whose value has 256 characters, the longest a value may be", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } }, "exchanges": [ { @@ -42521,46 +42526,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MQ==" + "is": "xml", + "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" - }, - "etag": "\"fixture-cf057aba568d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.8738118Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -42575,38 +42582,24 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-cf057aba568d\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.8738118Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-key-1025", + "id": "operations/azure/set-tags-value-257", "profile": "azure", "lane": "core", - "purpose": "put key 1025", + "purpose": "Report a tag value of 257 characters, one more than a value may have, as an error. A client may refuse it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } }, "exchanges": [ { @@ -42626,29 +42619,38 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MQ==" + "is": "xml", + "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 400, @@ -42657,11 +42659,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "OutOfRangeInput" + "x-ms-error-code": "TagsTooLarge" }, "body": { "encoding": "utf8", - "data": "OutOfRangeInputFixture error" + "data": "TagsTooLargeFixture error" } } } @@ -42690,7 +42692,7 @@ "optional": false, "rule": { "is": "equal", - "value": "OutOfRangeInput" + "value": "TagsTooLarge" } } ], @@ -42716,12 +42718,12 @@ "optional": false, "rule": { "is": "equal", - "value": "key" + "value": "tags" } }, { "at": "/status", - "optional": false, + "optional": true, "rule": { "is": "equal", "value": 400 @@ -42729,26 +42731,28 @@ }, { "at": "/code", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "OutOfRangeInput" + "value": "TagsTooLarge" } } ] }, { - "id": "operations/azure/put-key-under-object", + "id": "operations/azure/set-tags-special-characters", "profile": "azure", "lane": "core", - "purpose": "put key under object", + "purpose": "Set a blob index tag with a space and each of + - = . _ : /, which Azure allows, escaped as XML text", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/order/a/b", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" + } }, "exchanges": [ { @@ -42768,46 +42772,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/order/a/b" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MQ==" + "is": "xml", + "value": "a b+c-d=e.f_g:h/ik l+m-n=o.p_q:r/s" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" - }, - "etag": "\"fixture-17ced520f182\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.2584945Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -42822,39 +42828,24 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-17ced520f182\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2584945Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-lost-the-race-to-create", + "id": "operations/azure/set-tags-invalid-character", "profile": "azure", "lane": "core", - "purpose": "put lost the race to create", + "purpose": "Report a blob index tag key with @, which Azure does not allow, as an error. A client may refuse it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "YW5vdGhlciBvYmplY3Q=", - "if_none_match": "*", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "a@b": "c" + } }, "exchanges": [ { @@ -42874,50 +42865,51 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" + "is": "xml", + "value": "a@bc" } }, { - "at": "/headers/if-none-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "x-ms-error-code": "InvalidTag" }, "body": { "encoding": "utf8", - "data": "BlobAlreadyExistsFixture error" + "data": "InvalidTagFixture error" } } } @@ -42938,7 +42930,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 400 } }, { @@ -42946,28 +42938,74 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "value": "InvalidTag" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidTag" + } + } + ] }, { - "id": "operations/azure/put-md5-mismatch", + "id": "operations/azure/set-tags-duplicate-key", "profile": "azure", "lane": "core", - "purpose": "put md5 mismatch", + "purpose": "Report blob index tags that name one key twice as an error. A client may refuse them, or report them unsupported where its API cannot repeat a key", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "md5", - "value_base64": "eV8yArF8trw9S3cdjGyerw==" - }, - "key": "object-tests/hashes/md5-mismatch.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": [ + { + "key": "project", + "value": "a" + }, + { + "key": "project", + "value": "b" + } + ] }, "exchanges": [ { @@ -42987,37 +43025,38 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5-mismatch.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "is": "xml", + "value": "projectaprojectb" } }, { - "at": "/headers/content-md5", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "eV8yArF8trw9S3cdjGyerw==" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 400, @@ -43026,11 +43065,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "Md5Mismatch" + "x-ms-error-code": "InvalidXmlDocument" }, "body": { "encoding": "utf8", - "data": "Md5MismatchFixture error" + "data": "InvalidXmlDocumentFixture error" } } } @@ -43059,27 +43098,69 @@ "optional": false, "rule": { "is": "equal", - "value": "Md5Mismatch" + "value": "InvalidXmlDocument" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidXmlDocument" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure/put-metadata-empty-value", + "id": "operations/azure/set-tags-version", "profile": "azure", "lane": "core", - "purpose": "put metadata empty value", + "purpose": "Set blob index tags on a previous version, named by versionid in the query", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/empty-value.txt", - "metadata": { - "empty": "" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "project": "object-tests" }, - "op": "put" + "version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -43099,54 +43180,56 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/empty-value.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MQ==" + "is": "xml", + "value": "projectobject-tests" } }, { - "at": "/headers/x-ms-meta-empty", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] + } + }, + { + "at": "/query/versionid", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "2024-01-01T00:00:00.0000000Z" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" - }, - "etag": "\"fixture-333d95b64818\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.9480929Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43161,41 +43244,25 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-333d95b64818\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.9480929Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-invalid-name", + "id": "operations/azure/set-tags-snapshot", "profile": "azure", "lane": "core", - "purpose": "put metadata invalid name", + "purpose": "Set the blob index tags of a snapshot, named by snapshot in the query, which leaves the blob's tags alone", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/invalid-name.txt", - "metadata": { - "not-valid": "1" - }, - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z", + "tags": { + "project": "object-tests" + } }, "exchanges": [ { @@ -43215,50 +43282,56 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/invalid-name.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "MQ==" + "is": "xml", + "value": "projectobject-tests" } }, { - "at": "/headers/x-ms-meta-not-valid", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] + } + }, + { + "at": "/query/snapshot", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "2024-01-01T00:00:00.0000000Z" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 204, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "InvalidMetadata" + } }, "body": { - "encoding": "utf8", - "data": "InvalidMetadataFixture error" + "encoding": "empty" } } } @@ -43271,81 +43344,25 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidMetadata" + "value": "ok" } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "metadata" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidMetadata" - } - } - ] + "refusal": null }, { - "id": "operations/azure/put-metadata-replaced", + "id": "operations/azure/put-with-tier", "profile": "azure", "lane": "core", - "purpose": "put metadata replaced", + "purpose": "Write an object straight into the Cool access tier", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "Mg==", - "key": "object-tests/metadata/replaced.txt", - "op": "put" + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tiers/object.txt", + "op": "put", + "tier": "Cool" }, "exchanges": [ { @@ -43365,7 +43382,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/replaced.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43373,7 +43390,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mg==" + "value": "Zmlyc3Q=" } }, { @@ -43383,28 +43400,30 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Cool" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 201, "headers": { - "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", "date": { "from": "now" }, - "etag": "\"fixture-37b036d8c13f\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7487600Z" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43419,42 +43438,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-37b036d8c13f\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7487600Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-metadata", + "id": "operations/azure/set-tier-unknown", "profile": "azure", "lane": "core", - "purpose": "put metadata", + "purpose": "Refuse an access tier the service does not have", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/object.txt", - "metadata": { - "name": "value", - "second": "2" - }, - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Warm" }, "exchanges": [ { @@ -43474,7 +43473,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43482,54 +43481,40 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" - } - }, - { - "at": "/headers/x-ms-meta-name", - "optional": false, - "rule": { - "is": "equal", - "value": "value" + "value": "" } }, { - "at": "/headers/x-ms-meta-second", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "tier" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "Warm" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-9abbc5e374ca\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -43542,43 +43527,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9abbc5e374ca\"" + "value": 400 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-identifier-name", + "id": "operations/azure/set-tier-cool", "profile": "azure", "lane": "core", - "purpose": "An Azure metadata name must be a C# identifier, which may start with an underscore and hold digits. Send _a1; only a name that is no identifier may be refused.", + "purpose": "Move an object to the Cool access tier", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/identifier-name.txt", - "metadata": { - "_a1": "1" - }, - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Cool" }, "exchanges": [ { @@ -43598,7 +43580,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/identifier-name.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43606,46 +43588,37 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "" } }, { - "at": "/headers/x-ms-meta-_a1", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "tier" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "Cool" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" - }, - "etag": "\"fixture-9abbc5e374ca\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43660,38 +43633,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9abbc5e374ca\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-over-snapshotted", + "id": "operations/azure/set-tier-rehydrate", "profile": "azure", "lane": "core", - "purpose": "put over snapshotted", + "purpose": "Report a tier change that Azure accepts with 202, as it does when an archived blob starts to rehydrate, as a success", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" ], "call": { - "body_base64": "dHdv", - "key": "object-tests/snapshots/object.txt", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Hot" }, "exchanges": [ { @@ -43711,7 +43668,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43719,38 +43676,37 @@ "optional": false, "rule": { "is": "equal", - "value": "dHdv" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tier" + } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Hot" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { - "content-md5": "uKn3Fdu2T9XFbneDxoIKYQ==", "date": { "from": "now" - }, - "etag": "\"fixture-937c89bb7b5c\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.6268993Z" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43765,36 +43721,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-937c89bb7b5c\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.6268993Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-overwrite", + "id": "operations/azure/put-internal-error", "profile": "azure", "lane": "core", - "purpose": "put overwrite", + "purpose": "Report a 500 InternalError answer as an error, after at most 5 retries", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "transient", "call": { - "body_base64": "b3ZlcndyaXR0ZW4=", + "body_base64": "MDEyMzQ1Njc4OQ==", "key": "object-tests/write/object.txt", "op": "put" }, @@ -43824,7 +43766,7 @@ "optional": false, "rule": { "is": "equal", - "value": "b3ZlcndyaXR0ZW4=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -43841,70 +43783,22 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "headers": { - "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-cf4724500964\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7758823Z" + "x-ms-error-code": "InternalError" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-cf4724500964\"" - } }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7758823Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-precondition-failed", - "profile": "azure", - "lane": "core", - "purpose": "put precondition failed", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "YW5vdGhlciBvYmplY3Q=", - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/write/object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -43930,15 +43824,7 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -43955,69 +43841,23 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 - } + ], + "optional": true }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "ConditionNotMet" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-precondition-failed-code-in-body", - "profile": "azure", - "lane": "core", - "purpose": "put precondition failed, with the error code only in the XML body", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" - ], - "origin": "constructed", - "call": { - "body_base64": "YW5vdGhlciBvYmplY3Q=", - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/write/object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44043,15 +43883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44068,64 +43900,23 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 - } + ], + "optional": true }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "ConditionNotMet" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-refused", - "profile": "azure", - "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44143,7 +43934,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44151,7 +43942,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44168,65 +43959,23 @@ ], "allow_query": [], "response": { - "status": 403, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "AuthorizationPermissionMismatch" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "AuthorizationPermissionMismatchFixture error" + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 403 - } + ], + "optional": true }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "AuthorizationPermissionMismatch" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-second-version", - "profile": "azure", - "lane": "core", - "purpose": "put second version", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "djI=", - "key": "object-tests/versions-mtydohr2/object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44244,7 +43993,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44252,7 +44001,7 @@ "optional": false, "rule": { "is": "equal", - "value": "djI=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44269,69 +44018,23 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "headers": { - "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-4768de772705\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.3326281Z" + "x-ms-error-code": "InternalError" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-4768de772705\"" - } + ], + "optional": true }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.3326281Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-unauthenticated", - "profile": "azure", - "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object-tests/write/object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44357,7 +44060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44374,21 +44077,22 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] + ], + "optional": true } ], "expect": [ @@ -44405,7 +44109,7 @@ "optional": false, "rule": { "is": "equal", - "value": 401 + "value": 500 } }, { @@ -44413,27 +44117,24 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "InternalError" } } ], "refusal": null }, { - "id": "operations/azure/put-with-crc64", + "id": "operations/azure/put-if-unmodified-since-past", "profile": "azure", "lane": "core", - "purpose": "put with crc64", + "purpose": "Refuse a write with 412 when the object changed after If-Unmodified-Since", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "azure_crc64", - "value_base64": "9XBvAwWoR9o=" - }, - "key": "object-tests/hashes/crc64.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44454,7 +44155,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44462,23 +44163,23 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-content-crc64", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "9XBvAwWoR9o=" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], @@ -44487,21 +44188,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-90cfcb93036b\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.1153123Z" + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -44514,43 +44211,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-90cfcb93036b\"" + "value": 412 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/put-with-md5", + "id": "operations/azure/put-content-encoding-gzip", "profile": "azure", "lane": "core", - "purpose": "put with md5", + "purpose": "Store Content-Encoding: gzip with a write, and the gzip bytes unchanged", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "md5", - "value_base64": "N6YZkbg+Lyfxtskwn8iRCg==" - }, - "key": "object-tests/hashes/md5.txt", + "body_base64": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", + "content_encoding": "gzip", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44571,7 +44265,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44579,23 +44273,23 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { - "at": "/headers/content-md5", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-blob-content-encoding", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "gzip" } } ], @@ -44606,68 +44300,22 @@ "response": { "status": 201, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, - "etag": "\"fixture-494ad7275bf7\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", "data": "" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-494ad7275bf7\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7803759Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/snapshot", - "profile": "azure", - "lane": "core", - "purpose": "snapshot", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/snapshots/object.txt", - "op": "azure.snapshot" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -44683,7 +44331,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44691,15 +44339,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "snapshot" + "value": "BlockBlob" + } + }, + { + "at": "/headers/content-encoding", + "optional": false, + "rule": { + "is": "equal", + "value": "gzip" } } ], @@ -44710,15 +44366,15 @@ "response": { "status": 201, "headers": { + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, - "etag": "\"fixture-e3698635ab53\"", + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "false", - "x-ms-snapshot": "2024-01-01T00:00:00.7351568Z", - "x-ms-version-id": "2024-01-01T00:00:00.8746441Z" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -44739,29 +44395,40 @@ } }, { - "at": "/value/snapshot", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-empty", + "id": "operations/azure/put-content-properties", "profile": "azure", "lane": "core", - "purpose": "stage empty", + "purpose": "Store Content-Type, Content-Language, Content-Disposition and Cache-Control with a write", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAz", - "body_base64": "", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "MDEyMzQ1Njc4OQ==", + "cache_control": "max-age=3600", + "content_disposition": "attachment; filename=\"report.txt\"", + "content_language": "nl-NL", + "content_type": "text/plain; charset=utf-8", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -44781,7 +44448,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44789,23 +44456,47 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "BlockBlob" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAz" + "value": "text/plain; charset=utf-8" + } + }, + { + "at": "/headers/x-ms-blob-content-language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl-NL" + } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], @@ -44814,17 +44505,111 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "encoding": "base64", + "data": "" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/write/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain; charset=utf-8" + } + }, + { + "at": "/headers/content-language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl-NL" + } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/headers/cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" + }, + "body": { + "encoding": "base64", + "data": "" } } } @@ -44837,41 +44622,41 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-escaped-id", + "id": "operations/azure/put-content-type-non-ascii", "profile": "azure", "lane": "core", - "purpose": "stage escaped id", + "purpose": "Write a Content-Type with a parameter outside ASCII as its UTF-8 bytes. A flat account returns them as it got them, so they read back", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "+/8=", - "body_base64": "b25l", - "key": "object-tests/multipart/escaped.bin", - "op": "azure.stage_block" + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": "text/plain; name=\"été.txt\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -44891,7 +44676,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44899,23 +44684,23 @@ "optional": false, "rule": { "is": "equal", - "value": "b25l" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "BlockBlob" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "+/8=" + "value": "text/plain; name=\"été.txt\"" } } ], @@ -44926,12 +44711,15 @@ "response": { "status": 201, "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, + "etag": "\"fixture-b9991ef94e3d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -44953,31 +44741,36 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-id-too-long", + "id": "operations/azure/put-content-disposition-non-ascii", "profile": "azure", "lane": "core", - "purpose": "stage id too long", + "purpose": "Write a Content-Disposition whose filename is outside ASCII. Azure refuses a disposition byte outside ASCII with 400 InvalidMetadata, so send an RFC 6266 filename*, which any reader decodes, or refuse the value", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_disposition": "attachment; filename=\"été.txt\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -44997,7 +44790,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45005,23 +44798,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "BlockBlob" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-content-disposition", "optional": false, "rule": { "is": "equal", - "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" + "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" } } ], @@ -45030,17 +44823,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "OutOfRangeInput" + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." + "encoding": "base64", + "data": "" } } } @@ -45053,23 +44850,23 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "OutOfRangeInput" + "value": "2024-01-01T00:00:00.2084665Z" } } ], @@ -45095,7 +44892,7 @@ "optional": false, "rule": { "is": "equal", - "value": "block_id_base64" + "value": "content_disposition" } }, { @@ -45111,24 +44908,24 @@ "optional": true, "rule": { "is": "equal", - "value": "OutOfRangeInput" + "value": "InvalidMetadata" } } ] }, { - "id": "operations/azure/stage-mixed-length-id", + "id": "operations/azure/put-content-type-edge-spaces", "profile": "azure", "lane": "core", - "purpose": "stage mixed length id", + "purpose": "Write a content type with spaces at either end, which HTTP drops, so the service stores it trimmed. A client may refuse it", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": " text/plain ", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -45148,7 +44945,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45156,23 +44953,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "BlockBlob" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "text/plain" } } ], @@ -45181,71 +44978,24 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobOrBlock" + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "encoding": "base64", + "data": "" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidBlobOrBlock" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/stage-mixed-length-id-code-in-body", - "profile": "azure", - "lane": "core", - "purpose": "stage mixed length id, with the error code only in the XML body", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" - ], - "origin": "constructed", - "call": { - "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -45261,7 +45011,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45269,23 +45019,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "BlockBlob" } }, { - "at": "/query/blockid", + "at": "/headers/content-type", "optional": false, "rule": { "is": "equal", - "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "text/plain" } } ], @@ -45294,16 +45044,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" - } + }, + "etag": "\"fixture-b9991ef94e3d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { - "encoding": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "encoding": "base64", + "data": "" } } } @@ -45316,41 +45071,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobOrBlock" + "value": "2024-01-01T00:00:00.2084665Z" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "content_type" + } + } + ] }, { - "id": "operations/azure/stage-unauthenticated", + "id": "operations/azure/put-first-version", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "put first version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAx", - "body_base64": "Zmlyc3Q=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "djE=", + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "put" }, "exchanges": [ { @@ -45370,7 +45149,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -45378,23 +45157,15 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "djE=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAx" + "value": "BlockBlob" } } ], @@ -45403,17 +45174,21 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "etag": "\"fixture-5769a0807b46\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" }, "body": { - "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" + "encoding": "base64", + "data": "" } } } @@ -45426,41 +45201,41 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 401 + "value": "\"fixture-5769a0807b46\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "2024-01-01T00:00:00.2318906Z" } } ], "refusal": null }, { - "id": "operations/azure/stage", + "id": "operations/azure/put-if-match-current", "profile": "azure", "lane": "core", - "purpose": "stage", + "purpose": "put if match current", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "cmVwbGFjZWQ=", + "if_match": "\"fixture-b9991ef94e3d\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -45480,7 +45255,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45488,23 +45263,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "cmVwbGFjZWQ=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -45515,12 +45290,15 @@ "response": { "status": 201, "headers": { + "content-md5": "kbskg1kEP+mEFuJZyb3xDQ==", "date": { "from": "now" }, + "etag": "\"fixture-3e075954b24b\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.3814952Z" }, "body": { "encoding": "base64", @@ -45542,31 +45320,36 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-3e075954b24b\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3814952Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-id-64-bytes", + "id": "operations/azure/put-if-none-match-missing", "profile": "azure", "lane": "core", - "purpose": "A block ID decodes to at most 64 bytes, and Azure stages a block whose ID decodes to exactly 64. Send it; only a longer ID may be refused.", + "purpose": "put if none match missing", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==", - "body_base64": "c2Vjb25k", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "ZnJlc2g=", + "if_none_match": "*", + "key": "object-tests/write/fresh.txt", + "op": "put" }, "exchanges": [ { @@ -45586,7 +45369,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/fresh.txt" } }, { @@ -45594,23 +45377,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "ZnJlc2g=" } }, { - "at": "/query/comp", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "*" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" + "value": "BlockBlob" } } ], @@ -45621,12 +45404,15 @@ "response": { "status": 201, "headers": { + "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", "date": { "from": "now" }, + "etag": "\"fixture-0445b9b5a1dd\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2457093Z" }, "body": { "encoding": "base64", @@ -45648,31 +45434,35 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-0445b9b5a1dd\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2457093Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-question", + "id": "operations/azure/put-key-1024", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"question?mark.txt\"", + "purpose": "put key 1024", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/question?mark.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", + "op": "put" }, "exchanges": [ { @@ -45692,7 +45482,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -45700,23 +45490,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "MQ==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -45727,12 +45509,15 @@ "response": { "status": 201, "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, + "etag": "\"fixture-cf057aba568d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.8738118Z" }, "body": { "encoding": "base64", @@ -45754,31 +45539,35 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-cf057aba568d\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.8738118Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-hash", + "id": "operations/azure/put-key-1025", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"hash#tag.txt\"", + "purpose": "put key 1025", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/hash#tag.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", + "op": "put" }, "exchanges": [ { @@ -45798,7 +45587,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -45806,23 +45595,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "MQ==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -45831,18 +45612,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "OutOfRangeInput" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "OutOfRangeInputFixture error" } } } @@ -45855,36 +45635,81 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "OutOfRangeInput" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "key" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "OutOfRangeInput" + } + } + ] }, { - "id": "operations/azure/stage-key-percent", + "id": "operations/azure/put-key-under-object", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"percent%20.txt\"", + "purpose": "put key under object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/percent%20.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/order/a/b", + "op": "put" }, "exchanges": [ { @@ -45904,7 +45729,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/order/a/b" } }, { @@ -45912,23 +45737,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "MQ==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -45939,12 +45756,15 @@ "response": { "status": 201, "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, + "etag": "\"fixture-17ced520f182\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.2584945Z" }, "body": { "encoding": "base64", @@ -45966,31 +45786,36 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-17ced520f182\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2584945Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-plus", + "id": "operations/azure/put-lost-the-race-to-create", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"plus+plus.txt\"", + "purpose": "put lost the race to create", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/plus+plus.txt", - "op": "azure.stage_block" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_none_match": "*", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -46010,7 +45835,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -46018,23 +45843,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "*" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -46043,18 +45868,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobAlreadyExistsFixture error" } } } @@ -46067,36 +45891,44 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-space", + "id": "operations/azure/put-md5-mismatch", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"space name.txt\"", + "purpose": "put md5 mismatch", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/space name.txt", - "op": "azure.stage_block" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "eV8yArF8trw9S3cdjGyerw==" + }, + "key": "object-tests/hashes/md5-mismatch.txt", + "op": "put" }, "exchanges": [ { @@ -46116,7 +45948,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/hashes/md5-mismatch.txt" } }, { @@ -46124,23 +45956,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/content-md5", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "eV8yArF8trw9S3cdjGyerw==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -46149,18 +45981,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "Md5Mismatch" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "Md5MismatchFixture error" } } } @@ -46173,36 +46004,43 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "Md5Mismatch" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-non-ascii", + "id": "operations/azure/put-metadata-empty-value", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"café/雪.txt\"", + "purpose": "put metadata empty value", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/café/雪.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/metadata/empty-value.txt", + "metadata": { + "empty": "" + }, + "op": "put" }, "exchanges": [ { @@ -46222,7 +46060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/metadata/empty-value.txt" } }, { @@ -46230,23 +46068,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "MQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-empty", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -46257,12 +46095,15 @@ "response": { "status": 201, "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, + "etag": "\"fixture-333d95b64818\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.9480929Z" }, "body": { "encoding": "base64", @@ -46284,31 +46125,38 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-333d95b64818\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.9480929Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-double-slash", + "id": "operations/azure/put-metadata-invalid-name", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"double//slash.txt\"", + "purpose": "put metadata invalid name", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/double//slash.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/metadata/invalid-name.txt", + "metadata": { + "not-valid": "1" + }, + "op": "put" }, "exchanges": [ { @@ -46328,7 +46176,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/metadata/invalid-name.txt" } }, { @@ -46336,23 +46184,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "MQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-not-valid", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "1" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -46361,18 +46209,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "InvalidMetadata" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidMetadataFixture error" } } } @@ -46385,36 +46232,81 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidMetadata" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidMetadata" + } + } + ] }, { - "id": "operations/azure/stage-key-trailing-slash", + "id": "operations/azure/put-metadata-replaced", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"trailing-slash/\"", + "purpose": "put metadata replaced", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/trailing-slash/", - "op": "azure.stage_block" + "body_base64": "Mg==", + "key": "object-tests/metadata/replaced.txt", + "op": "put" }, "exchanges": [ { @@ -46434,7 +46326,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/metadata/replaced.txt" } }, { @@ -46442,23 +46334,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "Mg==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -46469,12 +46353,15 @@ "response": { "status": 201, "headers": { + "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", "date": { "from": "now" }, + "etag": "\"fixture-37b036d8c13f\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7487600Z" }, "body": { "encoding": "base64", @@ -46496,35 +46383,39 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-37b036d8c13f\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7487600Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-from-url", + "id": "operations/azure/put-metadata", "profile": "azure", "lane": "core", - "purpose": "Stage a block from bytes 0 to 2 at a URL with Put Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=0-2", + "purpose": "put metadata", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-from-url" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block_from_url", - "source_key": "object-tests/copy/source.txt", - "source_range": { - "end": 3, - "start": 0 - } + "body_base64": "MQ==", + "key": "object-tests/metadata/object.txt", + "metadata": { + "name": "value", + "second": "2" + }, + "op": "put" }, "exchanges": [ { @@ -46544,7 +46435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -46552,56 +46443,50 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-name", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "value" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-meta-second", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "2" } }, { - "at": "/headers/x-ms-source-range", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-2" + "value": "BlockBlob" } } ], "allow_headers": [ - "content-type", - "x-ms-copy-source-authorization" + "content-type" ], "allow_query": [], "response": { "status": 201, "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, + "etag": "\"fixture-9abbc5e374ca\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" }, "body": { "encoding": "base64", @@ -46623,30 +46508,38 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-9abbc5e374ca\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7035036Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-absent", + "id": "operations/azure/put-metadata-identifier-name", "profile": "azure", "lane": "core", - "purpose": "staged absent", + "purpose": "An Azure metadata name must be a C# identifier, which may start with an underscore and hold digits. Send _a1; only a name that is no identifier may be refused.", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/absent.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "MQ==", + "key": "object-tests/metadata/identifier-name.txt", + "metadata": { + "_a1": "1" + }, + "op": "put" }, "exchanges": [ { @@ -46658,7 +46551,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46666,7 +46559,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/metadata/identifier-name.txt" } }, { @@ -46674,40 +46567,46 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-_a1", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "1" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "etag": "\"fixture-9abbc5e374ca\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -46720,43 +46619,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-9abbc5e374ca\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "2024-01-01T00:00:00.7035036Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-absent-code-in-body", + "id": "operations/azure/put-over-snapshotted", "profile": "azure", "lane": "core", - "purpose": "staged absent, with the error code only in the XML body", + "purpose": "put over snapshotted", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", "call": { - "key": "object-tests/multipart/absent.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "dHdv", + "key": "object-tests/snapshots/object.txt", + "op": "put" }, "exchanges": [ { @@ -46768,7 +46664,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46776,7 +46672,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -46784,39 +46680,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" + "value": "dHdv" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "uKn3Fdu2T9XFbneDxoIKYQ==", "date": { "from": "now" - } + }, + "etag": "\"fixture-937c89bb7b5c\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.6268993Z" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -46829,40 +46724,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-937c89bb7b5c\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "2024-01-01T00:00:00.6268993Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-commit", + "id": "operations/azure/put-overwrite", "profile": "azure", "lane": "core", - "purpose": "staged after commit", + "purpose": "put overwrite", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/committed.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "b3ZlcndyaXR0ZW4=", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -46874,7 +46769,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46882,7 +46777,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -46890,44 +46785,39 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" + "value": "b3ZlcndyaXR0ZW4=" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", "date": { "from": "now" }, - "etag": "\"fixture-be8efdb79010\"", + "etag": "\"fixture-cf4724500964\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7758823Z" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -46943,68 +46833,37 @@ } }, { - "at": "/value/committed/0/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAx" - } - }, - { - "at": "/value/committed/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/committed/1/id_base64", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "\"fixture-cf4724500964\"" } }, { - "at": "/value/committed/1/size", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": 6 - } - }, - { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "2024-01-01T00:00:00.7758823Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-replacement", + "id": "operations/azure/put-precondition-failed", "profile": "azure", "lane": "core", - "purpose": "staged after replacement", + "purpose": "put precondition failed", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/replaced.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47016,7 +46875,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47024,7 +46883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47032,44 +46891,43 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "\"fixture-088e5dc109cf\"" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-2184b3e6c2c3\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "ConditionNotMet" }, "body": { "encoding": "utf8", - "data": "MDAwMDAx5" - }, - "framing": "chunked" + "data": "ConditionNotMetFixture error" + } } } ] @@ -47081,56 +46939,44 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/committed/0/id_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAx" + "value": 412 } }, { - "at": "/value/committed/0/size", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 5 - } - }, - { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-whole-write", + "id": "operations/azure/put-precondition-failed-code-in-body", "profile": "azure", "lane": "core", - "purpose": "staged after whole write", + "purpose": "put precondition failed, with the error code only in the XML body", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "constructed", "call": { - "key": "object-tests/multipart/whole.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47142,7 +46988,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47150,7 +46996,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/whole.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47158,44 +47004,42 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "\"fixture-088e5dc109cf\"" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-f439b54167cb\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "data": "ConditionNotMetFixture error" + } } } ] @@ -47207,40 +47051,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/committed", + "at": "/status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 412 } }, { - "at": "/value/uncommitted", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/staged-committed-empty", + "id": "operations/azure/put-refused", "profile": "azure", "lane": "core", - "purpose": "staged committed empty", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/staged.bin", - "kind": "committed", - "op": "azure.list_blocks" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", + "op": "put" }, "exchanges": [ { @@ -47252,7 +47096,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47260,7 +47104,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object.txt" } }, { @@ -47268,43 +47112,35 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "committed" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 403, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "AuthorizationPermissionMismatch" }, "body": { "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "data": "AuthorizationPermissionMismatchFixture error" + } } } ] @@ -47316,40 +47152,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/committed", + "at": "/status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 403 } }, { - "at": "/value/uncommitted", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "AuthorizationPermissionMismatch" } } ], "refusal": null }, { - "id": "operations/azure/staged-committed-nothing", + "id": "operations/azure/put-second-version", "profile": "azure", "lane": "core", - "purpose": "staged committed nothing", + "purpose": "put second version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/empty.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "djI=", + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "put" }, "exchanges": [ { @@ -47361,7 +47197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47369,7 +47205,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/empty.bin" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -47377,44 +47213,39 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" + "value": "djI=" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", "date": { "from": "now" }, - "etag": "\"fixture-265df060a55b\"", + "etag": "\"fixture-4768de772705\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.3326281Z" }, "body": { - "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47430,36 +47261,36 @@ } }, { - "at": "/value/committed", + "at": "/value/etag", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "\"fixture-4768de772705\"" } }, { - "at": "/value/uncommitted", + "at": "/value/version", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "2024-01-01T00:00:00.3326281Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-escaped-id", + "id": "operations/azure/put-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "staged escaped id", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/escaped.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47471,7 +47302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47479,7 +47310,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47487,43 +47318,35 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 401, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { "encoding": "utf8", - "data": "+/8=3" - }, - "framing": "chunked" + "data": "InvalidAuthenticationInfoFixture error" + } } } ] @@ -47535,56 +47358,44 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "error" } }, { - "at": "/value/uncommitted/0/id_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "+/8=" + "value": 401 } }, { - "at": "/value/uncommitted/0/size", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 3 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/staged-replacement", + "id": "operations/azure/put-with-crc64", "profile": "azure", "lane": "core", - "purpose": "staged replacement", + "purpose": "put with crc64", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/pending.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "9XBvAwWoR9o=" + }, + "key": "object-tests/hashes/crc64.txt", + "op": "put" }, "exchanges": [ { @@ -47596,7 +47407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47604,7 +47415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -47612,44 +47423,47 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-content-crc64", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "9XBvAwWoR9o=" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "date": { "from": "now" }, - "etag": "\"fixture-9c5ca12bcfc9\"", + "etag": "\"fixture-90cfcb93036b\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.1153123Z" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47665,84 +47479,40 @@ } }, { - "at": "/value/committed/0/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAx" - } - }, - { - "at": "/value/committed/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/committed/1/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAy" - } - }, - { - "at": "/value/committed/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 6 - } - }, - { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/uncommitted/0/id_base64", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAx" + "value": "\"fixture-90cfcb93036b\"" } }, { - "at": "/value/uncommitted/0/size", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": 5 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "2024-01-01T00:00:00.1153123Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted-only", + "id": "operations/azure/put-with-md5", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted only", + "purpose": "put with md5", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/staged.bin", - "kind": "all", - "op": "azure.list_blocks" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "N6YZkbg+Lyfxtskwn8iRCg==" + }, + "key": "object-tests/hashes/md5.txt", + "op": "put" }, "exchanges": [ { @@ -47754,7 +47524,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47762,7 +47532,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -47770,43 +47540,47 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/content-md5", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { - "at": "/query/blocklisttype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "date": { "from": "now" }, + "etag": "\"fixture-494ad7275bf7\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47822,68 +47596,35 @@ } }, { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/uncommitted/0/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAx" - } - }, - { - "at": "/value/uncommitted/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/uncommitted/1/id_base64", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "\"fixture-494ad7275bf7\"" } }, { - "at": "/value/uncommitted/1/size", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": 6 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 + "value": "2024-01-01T00:00:00.7803759Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted", + "id": "operations/azure/snapshot", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted", + "purpose": "snapshot", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/staged.bin", - "kind": "uncommitted", - "op": "azure.list_blocks" + "key": "object-tests/snapshots/object.txt", + "op": "azure.snapshot" }, "exchanges": [ { @@ -47895,7 +47636,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47903,7 +47644,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -47919,35 +47660,31 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" - } - }, - { - "at": "/query/blocklisttype", - "optional": false, - "rule": { - "is": "equal", - "value": "uncommitted" + "value": "snapshot" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, + "etag": "\"fixture-e3698635ab53\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "false", + "x-ms-snapshot": "2024-01-01T00:00:00.7351568Z", + "x-ms-version-id": "2024-01-01T00:00:00.8746441Z" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47963,68 +47700,29 @@ } }, { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/uncommitted/0/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAx" - } - }, - { - "at": "/value/uncommitted/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/uncommitted/1/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAy" - } - }, - { - "at": "/value/uncommitted/1/size", + "at": "/value/snapshot", "optional": false, "rule": { "is": "equal", - "value": 6 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 + "value": "2024-01-01T00:00:00.7351568Z" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-container-missing", - "profile": "azure-hns", + "id": "operations/azure/stage-empty", + "profile": "azure", "lane": "core", - "purpose": "commit container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "purpose": "stage empty", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [], - "key": "object.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAz", + "body_base64": "", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48044,15 +47742,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "" + "is": "equal", + "value": "" } }, { @@ -48060,7 +47758,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAz" } } ], @@ -48069,17 +47775,17 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "ContainerNotFoundFixture error" + "data": "InvalidHeaderValueFixture error" } } } @@ -48100,7 +47806,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -48108,38 +47814,25 @@ "optional": false, "rule": { "is": "equal", - "value": "ContainerNotFound" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "equal", - "value": "container_not_found" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-declaring-md5", - "profile": "azure-hns", + "id": "operations/azure/stage-escaped-id", + "profile": "azure", "lane": "core", - "purpose": "commit declaring md5", + "purpose": "stage escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "content_md5_base64": "N6YZkbg+Lyfxtskwn8iRCg==", - "key": "object-tests/hashes/committed.bin", - "op": "azure.commit_blocks" + "block_id_base64": "+/8=", + "body_base64": "b25l", + "key": "object-tests/multipart/escaped.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48159,31 +47852,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "b25l" } }, { - "at": "/headers/x-ms-blob-content-md5", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "block" } }, { - "at": "/query/comp", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "+/8=" } } ], @@ -48197,7 +47890,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-9a581bc70e20\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -48222,14 +47914,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9a581bc70e20\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -48243,26 +47927,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-duplicate-id", - "profile": "azure-hns", + "id": "operations/azure/stage-id-too-long", + "profile": "azure", "lane": "core", - "purpose": "commit duplicate id", + "purpose": "stage id too long", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/duplicate.bin", - "op": "azure.commit_blocks" + "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48282,15 +47958,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/duplicate.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAx" + "is": "equal", + "value": "dGhpcmQ=" } }, { @@ -48298,7 +47974,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" } } ], @@ -48307,19 +47991,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-a8581b642c5f\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "OutOfRangeInput" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." } } } @@ -48332,48 +48014,82 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a8581b642c5f\"" + "value": 400 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "OutOfRangeInput" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "block_id_base64" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "OutOfRangeInput" + } + } + ] }, { - "id": "operations/azure-hns/commit-escaped-id", - "profile": "azure-hns", + "id": "operations/azure/stage-mixed-length-id", + "profile": "azure", "lane": "core", - "purpose": "commit escaped id", + "purpose": "stage mixed length id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "+/8=", - "kind": "latest" - } - ], - "key": "object-tests/multipart/escaped.bin", - "op": "azure.commit_blocks" + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48393,15 +48109,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "+/8=" + "is": "equal", + "value": "dGhpcmQ=" } }, { @@ -48409,7 +48125,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], @@ -48418,19 +48142,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-77b5e2317b8a\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "InvalidBlobOrBlock" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidBlobOrBlockFixture error" } } } @@ -48443,49 +48165,44 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-77b5e2317b8a\"" + "value": 400 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-lost-the-race-to-create", - "profile": "azure-hns", + "id": "operations/azure/stage-mixed-length-id-code-in-body", + "profile": "azure", "lane": "core", - "purpose": "commit lost the race to create", + "purpose": "stage mixed length id, with the error code only in the XML body", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "constructed", "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "if_none_match": "*", - "key": "object-tests/multipart/pending.bin", - "op": "azure.commit_blocks" + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48505,31 +48222,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "dGhpcmQ=" } }, { - "at": "/headers/if-none-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "block" } }, { - "at": "/query/comp", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], @@ -48538,17 +48255,16 @@ ], "allow_query": [], "response": { - "status": 409, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "BlobAlreadyExists" + } }, "body": { "encoding": "utf8", - "data": "BlobAlreadyExistsFixture error" + "data": "InvalidBlobOrBlockFixture error" } } } @@ -48569,7 +48285,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 400 } }, { @@ -48577,24 +48293,25 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "value": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-nothing", - "profile": "azure-hns", + "id": "operations/azure/stage-unauthenticated", + "profile": "azure", "lane": "core", - "purpose": "commit nothing", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [], - "key": "object-tests/multipart/empty.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAx", + "body_base64": "Zmlyc3Q=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48614,15 +48331,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/empty.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "" + "is": "equal", + "value": "Zmlyc3Q=" } }, { @@ -48630,7 +48347,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAx" } } ], @@ -48639,19 +48364,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 401, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-072bed78cc6a\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -48664,48 +48387,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-072bed78cc6a\"" + "value": 401 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-over-whole-object", - "profile": "azure-hns", + "id": "operations/azure/stage", + "profile": "azure", "lane": "core", - "purpose": "commit over whole object", + "purpose": "stage", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/over.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48725,15 +48441,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/over.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -48741,7 +48457,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -48755,7 +48479,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-7dc650e58291\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -48780,14 +48503,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-7dc650e58291\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -48801,23 +48516,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-precondition-failed", - "profile": "azure-hns", + "id": "operations/azure/stage-id-64-bytes", + "profile": "azure", "lane": "core", - "purpose": "commit precondition failed", + "purpose": "A block ID decodes to at most 64 bytes, and Azure stages a block whose ID decodes to exactly 64. Send it; only a longer ID may be refused.", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/multipart/pending.bin", - "op": "azure.commit_blocks" + "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==", + "body_base64": "c2Vjb25k", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48837,31 +48547,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { - "at": "/headers/if-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "block" } }, { - "at": "/query/comp", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" } } ], @@ -48870,17 +48580,18 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -48893,40 +48604,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "ConditionNotMet" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-refused", - "profile": "azure-hns", + "id": "operations/azure/stage-key-question", + "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "stage, with the key \"question?mark.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [], - "key": "object.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/question?mark.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48946,15 +48653,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.bin" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -48962,7 +48669,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -48971,17 +48686,18 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ContainerNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -48994,49 +48710,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "ContainerNotFound" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-reordered", - "profile": "azure-hns", + "id": "operations/azure/stage-key-hash", + "profile": "azure", "lane": "core", - "purpose": "commit reordered", + "purpose": "stage, with the key \"hash#tag.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAy", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/reordered.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/hash#tag.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49056,15 +48759,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAyMDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49072,7 +48775,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49086,7 +48797,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-446301cfeaef\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49111,14 +48821,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-446301cfeaef\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49132,22 +48834,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-replacement", - "profile": "azure-hns", + "id": "operations/azure/stage-key-percent", + "profile": "azure", "lane": "core", - "purpose": "commit replacement", + "purpose": "stage, with the key \"percent%20.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/replaced.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/percent%20.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49167,15 +48865,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49183,7 +48881,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49197,7 +48903,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-9c5e55ff559c\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49222,14 +48927,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9c5e55ff559c\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49243,26 +48940,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id", - "profile": "azure-hns", + "id": "operations/azure/stage-key-plus", + "profile": "azure", "lane": "core", - "purpose": "commit unstaged id", + "purpose": "stage, with the key \"plus+plus.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDA5", - "kind": "latest" - } - ], - "key": "object-tests/multipart/staged.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49282,15 +48971,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49298,7 +48987,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49307,17 +49004,18 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlockList" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "encoding": "base64", + "data": "" } } } @@ -49330,52 +49028,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "InvalidBlockList" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id-code-in-body", - "profile": "azure-hns", + "id": "operations/azure/stage-key-space", + "profile": "azure", "lane": "core", - "purpose": "commit unstaged id, with the error code only in the XML body", + "purpose": "stage, with the key \"space name.txt\"", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDA5", - "kind": "latest" - } - ], - "key": "object-tests/multipart/staged.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/space name.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49395,15 +49077,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/keys/space name.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49411,7 +49093,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49420,16 +49110,18 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "encoding": "base64", + "data": "" } } } @@ -49442,49 +49134,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "InvalidBlockList" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit", - "profile": "azure-hns", + "id": "operations/azure/stage-key-non-ascii", + "profile": "azure", "lane": "core", - "purpose": "commit", + "purpose": "stage, with the key \"café/雪.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/multipart/committed.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/café/雪.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49504,15 +49183,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49520,7 +49199,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49534,7 +49221,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49559,14 +49245,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49580,26 +49258,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-question", - "profile": "azure-hns", + "id": "operations/azure/stage-key-double-slash", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"question?mark.txt\"", + "purpose": "stage, with the key \"double//slash.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/question?mark.txt", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/double//slash.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49619,15 +49289,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49635,7 +49305,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49649,7 +49327,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49674,14 +49351,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49695,26 +49364,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-hash", - "profile": "azure-hns", + "id": "operations/azure/stage-key-trailing-slash", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"hash#tag.txt\"", + "purpose": "stage, with the key \"trailing-slash/\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/hash#tag.txt", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/trailing-slash/", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49734,15 +49395,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49750,7 +49411,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49764,7 +49433,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49789,14 +49457,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49810,26 +49470,22 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-percent", - "profile": "azure-hns", + "id": "operations/azure/stage-from-url", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"percent%20.txt\"", + "purpose": "Stage a block from bytes 0 to 2 at a URL with Put Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=0-2", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-from-url" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/percent%20.txt", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block_from_url", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 3, + "start": 0 + } }, "exchanges": [ { @@ -49849,15 +49505,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -49865,7 +49521,39 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-2" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], @@ -49879,7 +49567,6 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -49904,14 +49591,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49925,26 +49604,23 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-plus", - "profile": "azure-hns", + "id": "operations/azure/stage-from-url-other-account", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"plus+plus.txt\"", + "purpose": "Stage a block with Put Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-from-url" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/plus+plus.txt", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 3, + "start": 0 + } }, "exchanges": [ { @@ -49964,15 +49640,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -49980,21 +49656,52 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-2" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { "status": 201, "headers": { "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-request-server-encrypted": "true" @@ -50019,14 +49726,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -50040,26 +49739,17 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-space", - "profile": "azure-hns", + "id": "operations/azure/staged-absent", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"space name.txt\"", + "purpose": "staged absent", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/space name.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/absent.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50071,7 +49761,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50079,15 +49769,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50097,26 +49787,30 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -50129,52 +49823,43 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": 404 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-non-ascii", - "profile": "azure-hns", + "id": "operations/azure/staged-absent-code-in-body", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"café/雪.txt\"", + "purpose": "staged absent, with the error code only in the XML body", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "constructed", "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/café/雪.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/absent.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50186,7 +49871,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50194,15 +49879,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50212,26 +49897,29 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-8ec031f3abfa\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -50244,52 +49932,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": 404 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-double-slash", - "profile": "azure-hns", + "id": "operations/azure/staged-after-commit", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"double//slash.txt\"", + "purpose": "staged after commit", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/double//slash.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/committed.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50301,7 +49977,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50309,15 +49985,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50327,27 +50003,34 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "etag": "\"fixture-be8efdb79010\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -50363,48 +50046,68 @@ } }, { - "at": "/value/etag", + "at": "/value/committed/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "MDAwMDAx" } }, { - "at": "/value/version", - "optional": true, + "at": "/value/committed/0/size", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/committed/1/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/value/committed/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 6 + } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-trailing-slash", - "profile": "azure-hns", + "id": "operations/azure/staged-after-replacement", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"trailing-slash/\"", + "purpose": "staged after replacement", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/trailing-slash/", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/replaced.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50416,7 +50119,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50424,15 +50127,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50442,25 +50145,34 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlockList" + "etag": "\"fixture-2184b3e6c2c3\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "InvalidBlockListFixture error" - } + "data": "MDAwMDAx5" + }, + "framing": "chunked" } } ] @@ -50472,53 +50184,56 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/committed/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "MDAwMDAx" } }, { - "at": "/code", + "at": "/value/committed/0/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlockList" + "value": 5 + } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-content-properties", - "profile": "azure-hns", + "id": "operations/azure/staged-after-whole-write", + "profile": "azure", "lane": "core", - "purpose": "Commit a block list with content properties, sent as x-ms-blob-content-type, -language, -disposition and x-ms-blob-cache-control", + "purpose": "staged after whole write", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "cache_control": "max-age=3600", - "content_disposition": "attachment; filename=\"report.txt\"", - "content_language": "nl-NL", - "content_type": "text/plain; charset=utf-8", - "key": "object-tests/multipart/committed.bin", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/whole.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50530,7 +50245,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50538,15 +50253,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/multipart/whole.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50558,57 +50273,32 @@ } }, { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" - } - }, - { - "at": "/headers/x-ms-blob-content-language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" - } - }, - { - "at": "/headers/x-ms-blob-content-disposition", - "optional": false, - "rule": { - "is": "equal", - "value": "attachment; filename=\"report.txt\"" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", + "at": "/query/blocklisttype", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "all" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "etag": "\"fixture-f439b54167cb\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "" + }, + "framing": "chunked" } } ] @@ -50624,49 +50314,36 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "is": "array_length", + "value": 0 } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-with-tier", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-empty", + "profile": "azure", "lane": "core", - "purpose": "Commit a block list into an access tier, named in x-ms-access-tier", + "purpose": "staged committed empty", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/multipart/committed.bin", - "op": "azure.commit_blocks", - "tier": "Cool" + "key": "object-tests/multipart/staged.bin", + "kind": "committed", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50678,7 +50355,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50686,15 +50363,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50706,33 +50383,31 @@ } }, { - "at": "/headers/x-ms-access-tier", + "at": "/query/blocklisttype", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "value": "committed" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "" + }, + "framing": "chunked" } } ] @@ -50748,38 +50423,36 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "is": "array_length", + "value": 0 } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-nothing", + "profile": "azure", "lane": "core", - "purpose": "delete accepted", + "purpose": "staged committed nothing", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/remove/present.txt", - "op": "delete" + "key": "object-tests/multipart/empty.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50791,7 +50464,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -50799,7 +50472,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/remove/present.txt" + "value": "/fixture/object-tests/multipart/empty.bin" } }, { @@ -50809,23 +50482,42 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, + "etag": "\"fixture-265df060a55b\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "" + }, + "framing": "chunked" } } ] @@ -50839,21 +50531,38 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-question", - "profile": "azure-hns", + "id": "operations/azure/staged-escaped-id", + "profile": "azure", "lane": "core", - "purpose": "delete accepted, with the key \"question?mark.txt\"", + "purpose": "staged escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/question?mark.txt", - "op": "delete" + "key": "object-tests/multipart/escaped.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50865,7 +50574,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -50873,7 +50582,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { @@ -50883,13 +50592,30 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, @@ -50897,9 +50623,10 @@ "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "+/8=3" + }, + "framing": "chunked" } } ] @@ -50913,21 +50640,54 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "+/8=" + } + }, + { + "at": "/value/uncommitted/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-hash", - "profile": "azure-hns", + "id": "operations/azure/staged-replacement", + "profile": "azure", "lane": "core", - "purpose": "delete accepted, with the key \"hash#tag.txt\"", + "purpose": "staged replacement", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/hash#tag.txt", - "op": "delete" + "key": "object-tests/multipart/pending.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50939,7 +50699,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -50947,7 +50707,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -50957,23 +50717,42 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, + "etag": "\"fixture-9c5ca12bcfc9\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" + }, + "framing": "chunked" } } ] @@ -50987,21 +50766,86 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/committed/0/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAx" + } + }, + { + "at": "/value/committed/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/committed/1/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/value/committed/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 6 + } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/uncommitted/0/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAx" + } + }, + { + "at": "/value/uncommitted/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-percent", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted-only", + "profile": "azure", "lane": "core", - "purpose": "delete accepted, with the key \"percent%20.txt\"", + "purpose": "staged uncommitted only", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/percent%20.txt", - "op": "delete" + "key": "object-tests/multipart/staged.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51013,7 +50857,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -51021,7 +50865,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -51031,13 +50875,30 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "all" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, @@ -51045,9 +50906,10 @@ "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -51061,21 +50923,70 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAx" + } + }, + { + "at": "/value/uncommitted/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/uncommitted/1/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/value/uncommitted/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 6 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-plus", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted", + "profile": "azure", "lane": "core", - "purpose": "delete accepted, with the key \"plus+plus.txt\"", + "purpose": "staged uncommitted", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/plus+plus.txt", - "op": "delete" + "key": "object-tests/multipart/staged.bin", + "kind": "uncommitted", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51087,7 +50998,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -51095,7 +51006,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -51105,13 +51016,30 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "uncommitted" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, @@ -51119,9 +51047,10 @@ "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -51135,21 +51064,70 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAx" + } + }, + { + "at": "/value/uncommitted/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 5 + } + }, + { + "at": "/value/uncommitted/1/id_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/value/uncommitted/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 6 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-space", + "id": "operations/azure-hns/commit-container-missing", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"space name.txt\"", + "purpose": "commit container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/space name.txt", - "op": "delete" + "blocks": [], + "key": "object.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51161,7 +51139,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51169,32 +51147,42 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-error-code": "ContainerNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" } } } @@ -51207,25 +51195,56 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/delete-accepted-key-non-ascii", - "profile": "azure-hns", - "lane": "core", - "purpose": "delete accepted, with the key \"café/雪.txt\"", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/keys/café/雪.txt", - "op": "delete" - }, - "exchanges": [ + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ContainerNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "container_not_found" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-declaring-md5", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit declaring md5", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "content_md5_base64": "N6YZkbg+Lyfxtskwn8iRCg==", + "key": "object-tests/hashes/committed.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -51235,7 +51254,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51243,28 +51262,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/x-ms-blob-content-md5", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { "date": { "from": "now" }, + "etag": "\"fixture-9a581bc70e20\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51283,21 +51322,50 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-9a581bc70e20\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-double-slash", + "id": "operations/azure-hns/commit-duplicate-id", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"double//slash.txt\"", + "purpose": "commit duplicate id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/double//slash.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "key": "object-tests/multipart/duplicate.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51309,7 +51377,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51317,28 +51385,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/multipart/duplicate.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAx" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { "date": { "from": "now" }, + "etag": "\"fixture-a8581b642c5f\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51357,21 +51437,46 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a8581b642c5f\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-trailing-slash", + "id": "operations/azure-hns/commit-escaped-id", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"trailing-slash/\"", + "purpose": "commit escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/trailing-slash/", - "op": "delete" + "blocks": [ + { + "id_base64": "+/8=", + "kind": "latest" + } + ], + "key": "object-tests/multipart/escaped.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51383,7 +51488,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51391,32 +51496,44 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "+/8=" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidUri" + "etag": "\"fixture-77b5e2317b8a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidUriFixture error" + "encoding": "base64", + "data": "" } } } @@ -51429,43 +51546,49 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-77b5e2317b8a\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "InvalidUri" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many", + "id": "operations/azure-hns/commit-lost-the-race-to-create", "profile": "azure-hns", "lane": "core", - "purpose": "Delete several objects in one batch and report each result", + "purpose": "commit lost the race to create", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } ], - "op": "delete_many" + "if_none_match": "*", + "key": "object-tests/multipart/pending.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51477,7 +51600,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -51485,23 +51608,23 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAx" } }, { - "at": "/query/restype", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "*" } }, { @@ -51509,46 +51632,27 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 409, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "BlobAlreadyExists" }, "body": { "encoding": "utf8", - "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture-0\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture-1\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture-2\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\nServer: Windows-Azure-Blob/1.0\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture--" - }, - "framing": "chunked" + "data": "BlobAlreadyExistsFixture error" + } } } ] @@ -51560,52 +51664,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/deleted", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "value": 409 } }, { - "at": "/value/errors", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } - ] + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-denied", + "id": "operations/azure-hns/commit-nothing", "profile": "azure-hns", "lane": "core", - "purpose": "Report each deletion of a batch that Azure refuses inside its 202 answer, here every one with 403 AuthorizationPermissionMismatch, as that key's error, not as deleted", + "purpose": "commit nothing", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" - ], - "op": "delete_many" + "blocks": [], + "key": "object-tests/multipart/empty.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51617,7 +51709,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -51625,23 +51717,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object-tests/multipart/empty.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "" } }, { @@ -51649,46 +51733,29 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", "date": { "from": "now" - } + }, + "etag": "\"fixture-072bed78cc6a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture--" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -51704,34 +51771,21 @@ } }, { - "at": "/value/deleted", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "\"fixture-072bed78cc6a\"" } }, { - "at": "/value/errors", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": [ - { - "code": "AuthorizationPermissionMismatch", - "key": "object-tests/batch/a.txt", - "status": 403 - }, - { - "code": "AuthorizationPermissionMismatch", - "key": "object-tests/batch/b.txt", - "status": 403 - }, - { - "code": "AuthorizationPermissionMismatch", - "key": "object-tests/batch/absent.txt", - "status": 403 - } + "is": "one_of", + "values": [ + null, + "" ] } } @@ -51739,22 +51793,22 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-answers-out-of-order", + "id": "operations/azure-hns/commit-over-whole-object", "profile": "azure-hns", "lane": "core", - "purpose": "Match each part of a batch answer to its deletion by Content-ID, which links them, not by position. Azure has answered every recorded batch in order, up to 256 parts; this answer is written by hand", + "purpose": "commit over whole object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", - "derived_from": "operations/azure-hns/delete-many", "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/multipart/over.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51766,7 +51820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -51774,23 +51828,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object-tests/multipart/over.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAx" } }, { @@ -51798,46 +51844,29 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", "date": { "from": "now" - } + }, + "etag": "\"fixture-7dc650e58291\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture--" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -51853,27 +51882,21 @@ } }, { - "at": "/value/deleted", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "value": "\"fixture-7dc650e58291\"" } }, { - "at": "/value/errors", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } + "is": "one_of", + "values": [ + null, + "" ] } } @@ -51881,22 +51904,23 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-lf-line-endings", + "id": "operations/azure-hns/commit-precondition-failed", "profile": "azure-hns", "lane": "core", - "purpose": "Read a batch answer whose lines end in LF alone correctly, or report it as an error, but never half-read it. Azure has not been seen to send it: HTTP and multipart require CRLF. This answer is the recorded one with every CR removed", + "purpose": "commit precondition failed", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", - "derived_from": "operations/azure-hns/delete-many", "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } ], - "op": "delete_many" + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/multipart/pending.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51908,7 +51932,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -51916,23 +51940,23 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAx" } }, { - "at": "/query/restype", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "\"fixture-088e5dc109cf\"" } }, { @@ -51940,46 +51964,27 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 412, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "ConditionNotMet" }, "body": { "encoding": "utf8", - "data": "--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 0\n\nHTTP/1.1 202 Accepted\nx-ms-request-id: fixture\nx-ms-delete-type-permanent: true\nx-ms-version: 2023-11-03\n\n--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 1\n\nHTTP/1.1 202 Accepted\nx-ms-request-id: fixture\nx-ms-delete-type-permanent: true\nx-ms-version: 2023-11-03\n\n--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 2\n\nHTTP/1.1 404 The specified blob does not exist.\nx-ms-request-id: fixture\nx-ms-error-code: BlobNotFound\nx-ms-version: 2023-11-03\nContent-Length: 110\nContent-Type: application/xml\n\nBlobNotFoundFixture error\n--batchresponse_fixture--" - }, - "framing": "chunked" + "data": "ConditionNotMetFixture error" + } } } ] @@ -51990,58 +51995,41 @@ "at": "/outcome", "optional": false, "rule": { - "is": "one_of", - "values": [ - "ok", - "error" - ] + "is": "equal", + "value": "error" } }, { - "at": "/value/deleted", - "optional": true, + "at": "/status", + "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "value": 412 } }, { - "at": "/value/errors", - "optional": true, + "at": "/code", + "optional": false, "rule": { "is": "equal", - "value": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } - ] + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-without-content-id", + "id": "operations/azure-hns/commit-refused", "profile": "azure-hns", "lane": "core", - "purpose": "Report a batch answer whose parts carry no Content-ID as an error. Without one, only the order of the parts would link a result to its key, and a guess could report one key deleted when another failed. Azure echoes the Content-ID of every subrequest; this answer is the recorded one with them removed", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", - "derived_from": "operations/azure-hns/delete-many", "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" - ], - "op": "delete_many" + "blocks": [], + "key": "object.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52053,7 +52041,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52061,23 +52049,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "" } }, { @@ -52085,46 +52065,27 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "status": 404, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "ContainerNotFound" }, "body": { "encoding": "utf8", - "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture--" - }, - "framing": "chunked" + "data": "ContainerNotFoundFixture error" + } } } ] @@ -52138,27 +52099,47 @@ "is": "equal", "value": "error" } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ContainerNotFound" + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-server-busy", + "id": "operations/azure-hns/commit-reordered", "profile": "azure-hns", "lane": "core", - "purpose": "Report a batch that Azure answers as a whole with 503 ServerBusy as an error, never as deleted keys. A client may retry up to five times first", + "purpose": "commit reordered", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "transient", - "derived_from": "operations/azure-hns/delete-many", "call": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" + "blocks": [ + { + "id_base64": "MDAwMDAy", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/multipart/reordered.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52170,7 +52151,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52178,23 +52159,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAyMDAwMDAx" } }, { @@ -52202,50 +52175,84 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "etag": "\"fixture-446301cfeaef\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ServerBusyFixture error" + "encoding": "base64", + "data": "" } } } ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-446301cfeaef\"" + } }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-replacement", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit replacement", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "key": "object-tests/multipart/replaced.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -52255,7 +52262,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52263,23 +52270,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAx" } }, { @@ -52287,51 +52286,88 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "etag": "\"fixture-9c5e55ff559c\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ServerBusyFixture error" + "encoding": "base64", + "data": "" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-9c5e55ff559c\"" + } }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-unstaged-id", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit unstaged id", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDA5", + "kind": "latest" + } + ], + "key": "object-tests/multipart/staged.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -52341,7 +52377,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52349,23 +52385,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" - } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDA5" } }, { @@ -52373,61 +52401,96 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "x-ms-error-code": "InvalidBlockList" }, "body": { "encoding": "utf8", - "data": "ServerBusyFixture error" + "data": "InvalidBlockListFixture error" } } } - ], - "optional": true - }, + ] + } + ], + "expect": [ { - "alternatives": [ - { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidBlockList" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-unstaged-id-code-in-body", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit unstaged id, with the error code only in the XML body", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + ], + "origin": "constructed", + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDA5", + "kind": "latest" + } + ], + "key": "object-tests/multipart/staged.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { "request": [ { "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52435,75 +52498,213 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAxMDAwMDA5" } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "blocklist" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "InvalidBlockListFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidBlockList" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/multipart/committed.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" } }, { - "at": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { - "at": "", + "at": "/body_text", "optional": false, "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ServerBusyFixture error" + "encoding": "base64", + "data": "" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-question", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"question?mark.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/question?mark.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -52513,7 +52714,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52521,75 +52722,219 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "blocklist" } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-hash", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"hash#tag.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/hash#tag.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ { - "at": "/query/comp", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "PUT" } }, { - "at": "", + "at": "/path", "optional": false, "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "is": "equal", + "value": "/fixture/object-tests/keys/hash#tag.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ServerBusyFixture error" + "encoding": "base64", + "data": "" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-percent", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"percent%20.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/percent%20.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -52599,7 +52944,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52607,74 +52952,163 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "blocklist" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-plus", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"plus+plus.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" } }, { - "at": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { - "at": "", + "at": "/body_text", "optional": false, "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/a.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/b.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/absent.txt" - } - ] + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 503, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ServerBusyFixture error" + "encoding": "base64", + "data": "" } } } - ], - "optional": true + ] } ], "expect": [ @@ -52683,296 +53117,52 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 503 + "value": "\"fixture-8ec031f3abfa\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "ServerBusy" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-256", + "id": "operations/azure-hns/commit-key-space", "profile": "azure-hns", "lane": "core", - "purpose": "Delete 256 keys in one batch, the most Azure takes", + "purpose": "commit, with the key \"space name.txt\"", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "keys": [ - "object-tests/batch/many-0000.txt", - "object-tests/batch/many-0001.txt", - "object-tests/batch/many-0002.txt", - "object-tests/batch/many-0003.txt", - "object-tests/batch/many-0004.txt", - "object-tests/batch/many-0005.txt", - "object-tests/batch/many-0006.txt", - "object-tests/batch/many-0007.txt", - "object-tests/batch/many-0008.txt", - "object-tests/batch/many-0009.txt", - "object-tests/batch/many-0010.txt", - "object-tests/batch/many-0011.txt", - "object-tests/batch/many-0012.txt", - "object-tests/batch/many-0013.txt", - "object-tests/batch/many-0014.txt", - "object-tests/batch/many-0015.txt", - "object-tests/batch/many-0016.txt", - "object-tests/batch/many-0017.txt", - "object-tests/batch/many-0018.txt", - "object-tests/batch/many-0019.txt", - "object-tests/batch/many-0020.txt", - "object-tests/batch/many-0021.txt", - "object-tests/batch/many-0022.txt", - "object-tests/batch/many-0023.txt", - "object-tests/batch/many-0024.txt", - "object-tests/batch/many-0025.txt", - "object-tests/batch/many-0026.txt", - "object-tests/batch/many-0027.txt", - "object-tests/batch/many-0028.txt", - "object-tests/batch/many-0029.txt", - "object-tests/batch/many-0030.txt", - "object-tests/batch/many-0031.txt", - "object-tests/batch/many-0032.txt", - "object-tests/batch/many-0033.txt", - "object-tests/batch/many-0034.txt", - "object-tests/batch/many-0035.txt", - "object-tests/batch/many-0036.txt", - "object-tests/batch/many-0037.txt", - "object-tests/batch/many-0038.txt", - "object-tests/batch/many-0039.txt", - "object-tests/batch/many-0040.txt", - "object-tests/batch/many-0041.txt", - "object-tests/batch/many-0042.txt", - "object-tests/batch/many-0043.txt", - "object-tests/batch/many-0044.txt", - "object-tests/batch/many-0045.txt", - "object-tests/batch/many-0046.txt", - "object-tests/batch/many-0047.txt", - "object-tests/batch/many-0048.txt", - "object-tests/batch/many-0049.txt", - "object-tests/batch/many-0050.txt", - "object-tests/batch/many-0051.txt", - "object-tests/batch/many-0052.txt", - "object-tests/batch/many-0053.txt", - "object-tests/batch/many-0054.txt", - "object-tests/batch/many-0055.txt", - "object-tests/batch/many-0056.txt", - "object-tests/batch/many-0057.txt", - "object-tests/batch/many-0058.txt", - "object-tests/batch/many-0059.txt", - "object-tests/batch/many-0060.txt", - "object-tests/batch/many-0061.txt", - "object-tests/batch/many-0062.txt", - "object-tests/batch/many-0063.txt", - "object-tests/batch/many-0064.txt", - "object-tests/batch/many-0065.txt", - "object-tests/batch/many-0066.txt", - "object-tests/batch/many-0067.txt", - "object-tests/batch/many-0068.txt", - "object-tests/batch/many-0069.txt", - "object-tests/batch/many-0070.txt", - "object-tests/batch/many-0071.txt", - "object-tests/batch/many-0072.txt", - "object-tests/batch/many-0073.txt", - "object-tests/batch/many-0074.txt", - "object-tests/batch/many-0075.txt", - "object-tests/batch/many-0076.txt", - "object-tests/batch/many-0077.txt", - "object-tests/batch/many-0078.txt", - "object-tests/batch/many-0079.txt", - "object-tests/batch/many-0080.txt", - "object-tests/batch/many-0081.txt", - "object-tests/batch/many-0082.txt", - "object-tests/batch/many-0083.txt", - "object-tests/batch/many-0084.txt", - "object-tests/batch/many-0085.txt", - "object-tests/batch/many-0086.txt", - "object-tests/batch/many-0087.txt", - "object-tests/batch/many-0088.txt", - "object-tests/batch/many-0089.txt", - "object-tests/batch/many-0090.txt", - "object-tests/batch/many-0091.txt", - "object-tests/batch/many-0092.txt", - "object-tests/batch/many-0093.txt", - "object-tests/batch/many-0094.txt", - "object-tests/batch/many-0095.txt", - "object-tests/batch/many-0096.txt", - "object-tests/batch/many-0097.txt", - "object-tests/batch/many-0098.txt", - "object-tests/batch/many-0099.txt", - "object-tests/batch/many-0100.txt", - "object-tests/batch/many-0101.txt", - "object-tests/batch/many-0102.txt", - "object-tests/batch/many-0103.txt", - "object-tests/batch/many-0104.txt", - "object-tests/batch/many-0105.txt", - "object-tests/batch/many-0106.txt", - "object-tests/batch/many-0107.txt", - "object-tests/batch/many-0108.txt", - "object-tests/batch/many-0109.txt", - "object-tests/batch/many-0110.txt", - "object-tests/batch/many-0111.txt", - "object-tests/batch/many-0112.txt", - "object-tests/batch/many-0113.txt", - "object-tests/batch/many-0114.txt", - "object-tests/batch/many-0115.txt", - "object-tests/batch/many-0116.txt", - "object-tests/batch/many-0117.txt", - "object-tests/batch/many-0118.txt", - "object-tests/batch/many-0119.txt", - "object-tests/batch/many-0120.txt", - "object-tests/batch/many-0121.txt", - "object-tests/batch/many-0122.txt", - "object-tests/batch/many-0123.txt", - "object-tests/batch/many-0124.txt", - "object-tests/batch/many-0125.txt", - "object-tests/batch/many-0126.txt", - "object-tests/batch/many-0127.txt", - "object-tests/batch/many-0128.txt", - "object-tests/batch/many-0129.txt", - "object-tests/batch/many-0130.txt", - "object-tests/batch/many-0131.txt", - "object-tests/batch/many-0132.txt", - "object-tests/batch/many-0133.txt", - "object-tests/batch/many-0134.txt", - "object-tests/batch/many-0135.txt", - "object-tests/batch/many-0136.txt", - "object-tests/batch/many-0137.txt", - "object-tests/batch/many-0138.txt", - "object-tests/batch/many-0139.txt", - "object-tests/batch/many-0140.txt", - "object-tests/batch/many-0141.txt", - "object-tests/batch/many-0142.txt", - "object-tests/batch/many-0143.txt", - "object-tests/batch/many-0144.txt", - "object-tests/batch/many-0145.txt", - "object-tests/batch/many-0146.txt", - "object-tests/batch/many-0147.txt", - "object-tests/batch/many-0148.txt", - "object-tests/batch/many-0149.txt", - "object-tests/batch/many-0150.txt", - "object-tests/batch/many-0151.txt", - "object-tests/batch/many-0152.txt", - "object-tests/batch/many-0153.txt", - "object-tests/batch/many-0154.txt", - "object-tests/batch/many-0155.txt", - "object-tests/batch/many-0156.txt", - "object-tests/batch/many-0157.txt", - "object-tests/batch/many-0158.txt", - "object-tests/batch/many-0159.txt", - "object-tests/batch/many-0160.txt", - "object-tests/batch/many-0161.txt", - "object-tests/batch/many-0162.txt", - "object-tests/batch/many-0163.txt", - "object-tests/batch/many-0164.txt", - "object-tests/batch/many-0165.txt", - "object-tests/batch/many-0166.txt", - "object-tests/batch/many-0167.txt", - "object-tests/batch/many-0168.txt", - "object-tests/batch/many-0169.txt", - "object-tests/batch/many-0170.txt", - "object-tests/batch/many-0171.txt", - "object-tests/batch/many-0172.txt", - "object-tests/batch/many-0173.txt", - "object-tests/batch/many-0174.txt", - "object-tests/batch/many-0175.txt", - "object-tests/batch/many-0176.txt", - "object-tests/batch/many-0177.txt", - "object-tests/batch/many-0178.txt", - "object-tests/batch/many-0179.txt", - "object-tests/batch/many-0180.txt", - "object-tests/batch/many-0181.txt", - "object-tests/batch/many-0182.txt", - "object-tests/batch/many-0183.txt", - "object-tests/batch/many-0184.txt", - "object-tests/batch/many-0185.txt", - "object-tests/batch/many-0186.txt", - "object-tests/batch/many-0187.txt", - "object-tests/batch/many-0188.txt", - "object-tests/batch/many-0189.txt", - "object-tests/batch/many-0190.txt", - "object-tests/batch/many-0191.txt", - "object-tests/batch/many-0192.txt", - "object-tests/batch/many-0193.txt", - "object-tests/batch/many-0194.txt", - "object-tests/batch/many-0195.txt", - "object-tests/batch/many-0196.txt", - "object-tests/batch/many-0197.txt", - "object-tests/batch/many-0198.txt", - "object-tests/batch/many-0199.txt", - "object-tests/batch/many-0200.txt", - "object-tests/batch/many-0201.txt", - "object-tests/batch/many-0202.txt", - "object-tests/batch/many-0203.txt", - "object-tests/batch/many-0204.txt", - "object-tests/batch/many-0205.txt", - "object-tests/batch/many-0206.txt", - "object-tests/batch/many-0207.txt", - "object-tests/batch/many-0208.txt", - "object-tests/batch/many-0209.txt", - "object-tests/batch/many-0210.txt", - "object-tests/batch/many-0211.txt", - "object-tests/batch/many-0212.txt", - "object-tests/batch/many-0213.txt", - "object-tests/batch/many-0214.txt", - "object-tests/batch/many-0215.txt", - "object-tests/batch/many-0216.txt", - "object-tests/batch/many-0217.txt", - "object-tests/batch/many-0218.txt", - "object-tests/batch/many-0219.txt", - "object-tests/batch/many-0220.txt", - "object-tests/batch/many-0221.txt", - "object-tests/batch/many-0222.txt", - "object-tests/batch/many-0223.txt", - "object-tests/batch/many-0224.txt", - "object-tests/batch/many-0225.txt", - "object-tests/batch/many-0226.txt", - "object-tests/batch/many-0227.txt", - "object-tests/batch/many-0228.txt", - "object-tests/batch/many-0229.txt", - "object-tests/batch/many-0230.txt", - "object-tests/batch/many-0231.txt", - "object-tests/batch/many-0232.txt", - "object-tests/batch/many-0233.txt", - "object-tests/batch/many-0234.txt", - "object-tests/batch/many-0235.txt", - "object-tests/batch/many-0236.txt", - "object-tests/batch/many-0237.txt", - "object-tests/batch/many-0238.txt", - "object-tests/batch/many-0239.txt", - "object-tests/batch/many-0240.txt", - "object-tests/batch/many-0241.txt", - "object-tests/batch/many-0242.txt", - "object-tests/batch/many-0243.txt", - "object-tests/batch/many-0244.txt", - "object-tests/batch/many-0245.txt", - "object-tests/batch/many-0246.txt", - "object-tests/batch/many-0247.txt", - "object-tests/batch/many-0248.txt", - "object-tests/batch/many-0249.txt", - "object-tests/batch/many-0250.txt", - "object-tests/batch/many-0251.txt", - "object-tests/batch/many-0252.txt", - "object-tests/batch/many-0253.txt", - "object-tests/batch/many-0254.txt", - "object-tests/batch/many-0255.txt" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/keys/space name.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52984,7 +53174,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52992,42 +53182,2955 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/space name.txt" } }, { - "at": "/headers/content-type", + "at": "/body_text", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "blocklist" } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-non-ascii", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"café/雪.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/café/雪.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ { - "at": "/query/comp", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "PUT" } }, { - "at": "", + "at": "/path", "optional": false, "rule": { - "is": "blob_batch", - "subrequests": [ - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0000.txt" + "is": "equal", + "value": "/fixture/object-tests/keys/café/雪.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-double-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"double//slash.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/double//slash.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/double//slash.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-key-trailing-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"trailing-slash/\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/trailing-slash/", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/trailing-slash/" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "InvalidBlockList" + }, + "body": { + "encoding": "utf8", + "data": "InvalidBlockListFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidBlockList" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-content-properties", + "profile": "azure-hns", + "lane": "core", + "purpose": "Commit a block list with content properties, sent as x-ms-blob-content-type, -language, -disposition and x-ms-blob-cache-control", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "cache_control": "max-age=3600", + "content_disposition": "attachment; filename=\"report.txt\"", + "content_language": "nl-NL", + "content_type": "text/plain; charset=utf-8", + "key": "object-tests/multipart/committed.bin", + "op": "azure.commit_blocks" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/multipart/committed.bin" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain; charset=utf-8" + } + }, + { + "at": "/headers/x-ms-blob-content-language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl-NL" + } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/commit-with-tier", + "profile": "azure-hns", + "lane": "core", + "purpose": "Commit a block list into an access tier, named in x-ms-access-tier", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/multipart/committed.bin", + "op": "azure.commit_blocks", + "tier": "Cool" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/multipart/committed.bin" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" + } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Cool" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-8ec031f3abfa\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-8ec031f3abfa\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/remove/present.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-question", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"question?mark.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/question?mark.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/question?mark.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-hash", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"hash#tag.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/hash#tag.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/hash#tag.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-percent", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"percent%20.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/percent%20.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/percent%20.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-plus", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"plus+plus.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/plus+plus.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/plus+plus.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-space", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"space name.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/space name.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/space name.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-non-ascii", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"café/雪.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/café/雪.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/café/雪.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-double-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"double//slash.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/double//slash.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/double//slash.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-accepted-key-trailing-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "delete accepted, with the key \"trailing-slash/\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/keys/trailing-slash/", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/trailing-slash/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "InvalidUri" + }, + "body": { + "encoding": "utf8", + "data": "InvalidUriFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidUri" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many", + "profile": "azure-hns", + "lane": "core", + "purpose": "Delete several objects in one batch and report each result", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture-0\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture-1\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture-2\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\nServer: Windows-Azure-Blob/1.0\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture--" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/deleted", + "optional": false, + "rule": { + "is": "equal", + "value": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt" + ] + } + }, + { + "at": "/value/errors", + "optional": false, + "rule": { + "is": "equal", + "value": [ + { + "code": "BlobNotFound", + "key": "object-tests/batch/absent.txt", + "status": 404 + } + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-denied", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report each deletion of a batch that Azure refuses inside its 202 answer, here every one with 403 AuthorizationPermissionMismatch, as that key's error, not as deleted", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 403 This request is not authorized to perform this operation using this permission.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: AuthorizationPermissionMismatch\r\nx-ms-version: 2023-11-03\r\nContent-Length: 129\r\nContent-Type: application/xml\r\n\r\nAuthorizationPermissionMismatchFixture error\r\n--batchresponse_fixture--" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/deleted", + "optional": false, + "rule": { + "is": "equal", + "value": [] + } + }, + { + "at": "/value/errors", + "optional": false, + "rule": { + "is": "equal", + "value": [ + { + "code": "AuthorizationPermissionMismatch", + "key": "object-tests/batch/a.txt", + "status": 403 + }, + { + "code": "AuthorizationPermissionMismatch", + "key": "object-tests/batch/b.txt", + "status": 403 + }, + { + "code": "AuthorizationPermissionMismatch", + "key": "object-tests/batch/absent.txt", + "status": 403 + } + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-answers-out-of-order", + "profile": "azure-hns", + "lane": "core", + "purpose": "Match each part of a batch answer to its deletion by Content-ID, which links them, not by position. Azure has answered every recorded batch in order, up to 256 parts; this answer is written by hand", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "origin": "constructed", + "derived_from": "operations/azure-hns/delete-many", + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture--" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/deleted", + "optional": false, + "rule": { + "is": "equal", + "value": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt" + ] + } + }, + { + "at": "/value/errors", + "optional": false, + "rule": { + "is": "equal", + "value": [ + { + "code": "BlobNotFound", + "key": "object-tests/batch/absent.txt", + "status": 404 + } + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-lf-line-endings", + "profile": "azure-hns", + "lane": "core", + "purpose": "Read a batch answer whose lines end in LF alone correctly, or report it as an error, but never half-read it. Azure has not been seen to send it: HTTP and multipart require CRLF. This answer is the recorded one with every CR removed", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "origin": "constructed", + "derived_from": "operations/azure-hns/delete-many", + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 0\n\nHTTP/1.1 202 Accepted\nx-ms-request-id: fixture\nx-ms-delete-type-permanent: true\nx-ms-version: 2023-11-03\n\n--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 1\n\nHTTP/1.1 202 Accepted\nx-ms-request-id: fixture\nx-ms-delete-type-permanent: true\nx-ms-version: 2023-11-03\n\n--batchresponse_fixture\nContent-Type: application/http\nContent-ID: 2\n\nHTTP/1.1 404 The specified blob does not exist.\nx-ms-request-id: fixture\nx-ms-error-code: BlobNotFound\nx-ms-version: 2023-11-03\nContent-Length: 110\nContent-Type: application/xml\n\nBlobNotFoundFixture error\n--batchresponse_fixture--" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "ok", + "error" + ] + } + }, + { + "at": "/value/deleted", + "optional": true, + "rule": { + "is": "equal", + "value": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt" + ] + } + }, + { + "at": "/value/errors", + "optional": true, + "rule": { + "is": "equal", + "value": [ + { + "code": "BlobNotFound", + "key": "object-tests/batch/absent.txt", + "status": 404 + } + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-without-content-id", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report a batch answer whose parts carry no Content-ID as an error. Without one, only the order of the parts would link a result to its key, and a guess could report one key deleted when another failed. Azure echoes the Content-ID of every subrequest; this answer is the recorded one with them removed", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "origin": "constructed", + "derived_from": "operations/azure-hns/delete-many", + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 202, + "headers": { + "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-request-id: fixture\r\nx-ms-delete-type-permanent: true\r\nx-ms-version: 2023-11-03\r\n\r\n--batchresponse_fixture\r\nContent-Type: application/http\r\n\r\nHTTP/1.1 404 The specified blob does not exist.\r\nx-ms-request-id: fixture\r\nx-ms-error-code: BlobNotFound\r\nx-ms-version: 2023-11-03\r\nContent-Length: 110\r\nContent-Type: application/xml\r\n\r\nBlobNotFoundFixture error\r\n--batchresponse_fixture--" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-server-busy", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report a batch that Azure answers as a whole with 503 ServerBusy as an error, never as deleted keys. A client may retry up to five times first", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "origin": "transient", + "derived_from": "operations/azure-hns/delete-many", + "call": { + "keys": [ + "object-tests/batch/a.txt", + "object-tests/batch/b.txt", + "object-tests/batch/absent.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/a.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/b.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/absent.txt" + } + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ServerBusy" + }, + "body": { + "encoding": "utf8", + "data": "ServerBusyFixture error" + } + } + } + ], + "optional": true + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 503 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ServerBusy" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/delete-many-256", + "profile": "azure-hns", + "lane": "core", + "purpose": "Delete 256 keys in one batch, the most Azure takes", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch" + ], + "call": { + "keys": [ + "object-tests/batch/many-0000.txt", + "object-tests/batch/many-0001.txt", + "object-tests/batch/many-0002.txt", + "object-tests/batch/many-0003.txt", + "object-tests/batch/many-0004.txt", + "object-tests/batch/many-0005.txt", + "object-tests/batch/many-0006.txt", + "object-tests/batch/many-0007.txt", + "object-tests/batch/many-0008.txt", + "object-tests/batch/many-0009.txt", + "object-tests/batch/many-0010.txt", + "object-tests/batch/many-0011.txt", + "object-tests/batch/many-0012.txt", + "object-tests/batch/many-0013.txt", + "object-tests/batch/many-0014.txt", + "object-tests/batch/many-0015.txt", + "object-tests/batch/many-0016.txt", + "object-tests/batch/many-0017.txt", + "object-tests/batch/many-0018.txt", + "object-tests/batch/many-0019.txt", + "object-tests/batch/many-0020.txt", + "object-tests/batch/many-0021.txt", + "object-tests/batch/many-0022.txt", + "object-tests/batch/many-0023.txt", + "object-tests/batch/many-0024.txt", + "object-tests/batch/many-0025.txt", + "object-tests/batch/many-0026.txt", + "object-tests/batch/many-0027.txt", + "object-tests/batch/many-0028.txt", + "object-tests/batch/many-0029.txt", + "object-tests/batch/many-0030.txt", + "object-tests/batch/many-0031.txt", + "object-tests/batch/many-0032.txt", + "object-tests/batch/many-0033.txt", + "object-tests/batch/many-0034.txt", + "object-tests/batch/many-0035.txt", + "object-tests/batch/many-0036.txt", + "object-tests/batch/many-0037.txt", + "object-tests/batch/many-0038.txt", + "object-tests/batch/many-0039.txt", + "object-tests/batch/many-0040.txt", + "object-tests/batch/many-0041.txt", + "object-tests/batch/many-0042.txt", + "object-tests/batch/many-0043.txt", + "object-tests/batch/many-0044.txt", + "object-tests/batch/many-0045.txt", + "object-tests/batch/many-0046.txt", + "object-tests/batch/many-0047.txt", + "object-tests/batch/many-0048.txt", + "object-tests/batch/many-0049.txt", + "object-tests/batch/many-0050.txt", + "object-tests/batch/many-0051.txt", + "object-tests/batch/many-0052.txt", + "object-tests/batch/many-0053.txt", + "object-tests/batch/many-0054.txt", + "object-tests/batch/many-0055.txt", + "object-tests/batch/many-0056.txt", + "object-tests/batch/many-0057.txt", + "object-tests/batch/many-0058.txt", + "object-tests/batch/many-0059.txt", + "object-tests/batch/many-0060.txt", + "object-tests/batch/many-0061.txt", + "object-tests/batch/many-0062.txt", + "object-tests/batch/many-0063.txt", + "object-tests/batch/many-0064.txt", + "object-tests/batch/many-0065.txt", + "object-tests/batch/many-0066.txt", + "object-tests/batch/many-0067.txt", + "object-tests/batch/many-0068.txt", + "object-tests/batch/many-0069.txt", + "object-tests/batch/many-0070.txt", + "object-tests/batch/many-0071.txt", + "object-tests/batch/many-0072.txt", + "object-tests/batch/many-0073.txt", + "object-tests/batch/many-0074.txt", + "object-tests/batch/many-0075.txt", + "object-tests/batch/many-0076.txt", + "object-tests/batch/many-0077.txt", + "object-tests/batch/many-0078.txt", + "object-tests/batch/many-0079.txt", + "object-tests/batch/many-0080.txt", + "object-tests/batch/many-0081.txt", + "object-tests/batch/many-0082.txt", + "object-tests/batch/many-0083.txt", + "object-tests/batch/many-0084.txt", + "object-tests/batch/many-0085.txt", + "object-tests/batch/many-0086.txt", + "object-tests/batch/many-0087.txt", + "object-tests/batch/many-0088.txt", + "object-tests/batch/many-0089.txt", + "object-tests/batch/many-0090.txt", + "object-tests/batch/many-0091.txt", + "object-tests/batch/many-0092.txt", + "object-tests/batch/many-0093.txt", + "object-tests/batch/many-0094.txt", + "object-tests/batch/many-0095.txt", + "object-tests/batch/many-0096.txt", + "object-tests/batch/many-0097.txt", + "object-tests/batch/many-0098.txt", + "object-tests/batch/many-0099.txt", + "object-tests/batch/many-0100.txt", + "object-tests/batch/many-0101.txt", + "object-tests/batch/many-0102.txt", + "object-tests/batch/many-0103.txt", + "object-tests/batch/many-0104.txt", + "object-tests/batch/many-0105.txt", + "object-tests/batch/many-0106.txt", + "object-tests/batch/many-0107.txt", + "object-tests/batch/many-0108.txt", + "object-tests/batch/many-0109.txt", + "object-tests/batch/many-0110.txt", + "object-tests/batch/many-0111.txt", + "object-tests/batch/many-0112.txt", + "object-tests/batch/many-0113.txt", + "object-tests/batch/many-0114.txt", + "object-tests/batch/many-0115.txt", + "object-tests/batch/many-0116.txt", + "object-tests/batch/many-0117.txt", + "object-tests/batch/many-0118.txt", + "object-tests/batch/many-0119.txt", + "object-tests/batch/many-0120.txt", + "object-tests/batch/many-0121.txt", + "object-tests/batch/many-0122.txt", + "object-tests/batch/many-0123.txt", + "object-tests/batch/many-0124.txt", + "object-tests/batch/many-0125.txt", + "object-tests/batch/many-0126.txt", + "object-tests/batch/many-0127.txt", + "object-tests/batch/many-0128.txt", + "object-tests/batch/many-0129.txt", + "object-tests/batch/many-0130.txt", + "object-tests/batch/many-0131.txt", + "object-tests/batch/many-0132.txt", + "object-tests/batch/many-0133.txt", + "object-tests/batch/many-0134.txt", + "object-tests/batch/many-0135.txt", + "object-tests/batch/many-0136.txt", + "object-tests/batch/many-0137.txt", + "object-tests/batch/many-0138.txt", + "object-tests/batch/many-0139.txt", + "object-tests/batch/many-0140.txt", + "object-tests/batch/many-0141.txt", + "object-tests/batch/many-0142.txt", + "object-tests/batch/many-0143.txt", + "object-tests/batch/many-0144.txt", + "object-tests/batch/many-0145.txt", + "object-tests/batch/many-0146.txt", + "object-tests/batch/many-0147.txt", + "object-tests/batch/many-0148.txt", + "object-tests/batch/many-0149.txt", + "object-tests/batch/many-0150.txt", + "object-tests/batch/many-0151.txt", + "object-tests/batch/many-0152.txt", + "object-tests/batch/many-0153.txt", + "object-tests/batch/many-0154.txt", + "object-tests/batch/many-0155.txt", + "object-tests/batch/many-0156.txt", + "object-tests/batch/many-0157.txt", + "object-tests/batch/many-0158.txt", + "object-tests/batch/many-0159.txt", + "object-tests/batch/many-0160.txt", + "object-tests/batch/many-0161.txt", + "object-tests/batch/many-0162.txt", + "object-tests/batch/many-0163.txt", + "object-tests/batch/many-0164.txt", + "object-tests/batch/many-0165.txt", + "object-tests/batch/many-0166.txt", + "object-tests/batch/many-0167.txt", + "object-tests/batch/many-0168.txt", + "object-tests/batch/many-0169.txt", + "object-tests/batch/many-0170.txt", + "object-tests/batch/many-0171.txt", + "object-tests/batch/many-0172.txt", + "object-tests/batch/many-0173.txt", + "object-tests/batch/many-0174.txt", + "object-tests/batch/many-0175.txt", + "object-tests/batch/many-0176.txt", + "object-tests/batch/many-0177.txt", + "object-tests/batch/many-0178.txt", + "object-tests/batch/many-0179.txt", + "object-tests/batch/many-0180.txt", + "object-tests/batch/many-0181.txt", + "object-tests/batch/many-0182.txt", + "object-tests/batch/many-0183.txt", + "object-tests/batch/many-0184.txt", + "object-tests/batch/many-0185.txt", + "object-tests/batch/many-0186.txt", + "object-tests/batch/many-0187.txt", + "object-tests/batch/many-0188.txt", + "object-tests/batch/many-0189.txt", + "object-tests/batch/many-0190.txt", + "object-tests/batch/many-0191.txt", + "object-tests/batch/many-0192.txt", + "object-tests/batch/many-0193.txt", + "object-tests/batch/many-0194.txt", + "object-tests/batch/many-0195.txt", + "object-tests/batch/many-0196.txt", + "object-tests/batch/many-0197.txt", + "object-tests/batch/many-0198.txt", + "object-tests/batch/many-0199.txt", + "object-tests/batch/many-0200.txt", + "object-tests/batch/many-0201.txt", + "object-tests/batch/many-0202.txt", + "object-tests/batch/many-0203.txt", + "object-tests/batch/many-0204.txt", + "object-tests/batch/many-0205.txt", + "object-tests/batch/many-0206.txt", + "object-tests/batch/many-0207.txt", + "object-tests/batch/many-0208.txt", + "object-tests/batch/many-0209.txt", + "object-tests/batch/many-0210.txt", + "object-tests/batch/many-0211.txt", + "object-tests/batch/many-0212.txt", + "object-tests/batch/many-0213.txt", + "object-tests/batch/many-0214.txt", + "object-tests/batch/many-0215.txt", + "object-tests/batch/many-0216.txt", + "object-tests/batch/many-0217.txt", + "object-tests/batch/many-0218.txt", + "object-tests/batch/many-0219.txt", + "object-tests/batch/many-0220.txt", + "object-tests/batch/many-0221.txt", + "object-tests/batch/many-0222.txt", + "object-tests/batch/many-0223.txt", + "object-tests/batch/many-0224.txt", + "object-tests/batch/many-0225.txt", + "object-tests/batch/many-0226.txt", + "object-tests/batch/many-0227.txt", + "object-tests/batch/many-0228.txt", + "object-tests/batch/many-0229.txt", + "object-tests/batch/many-0230.txt", + "object-tests/batch/many-0231.txt", + "object-tests/batch/many-0232.txt", + "object-tests/batch/many-0233.txt", + "object-tests/batch/many-0234.txt", + "object-tests/batch/many-0235.txt", + "object-tests/batch/many-0236.txt", + "object-tests/batch/many-0237.txt", + "object-tests/batch/many-0238.txt", + "object-tests/batch/many-0239.txt", + "object-tests/batch/many-0240.txt", + "object-tests/batch/many-0241.txt", + "object-tests/batch/many-0242.txt", + "object-tests/batch/many-0243.txt", + "object-tests/batch/many-0244.txt", + "object-tests/batch/many-0245.txt", + "object-tests/batch/many-0246.txt", + "object-tests/batch/many-0247.txt", + "object-tests/batch/many-0248.txt", + "object-tests/batch/many-0249.txt", + "object-tests/batch/many-0250.txt", + "object-tests/batch/many-0251.txt", + "object-tests/batch/many-0252.txt", + "object-tests/batch/many-0253.txt", + "object-tests/batch/many-0254.txt", + "object-tests/batch/many-0255.txt" + ], + "op": "delete_many" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "matches", + "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + } + }, + { + "at": "/query/restype", + "optional": false, + "rule": { + "is": "equal", + "value": "container" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "batch" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "blob_batch", + "subrequests": [ + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0000.txt" }, { "method": "DELETE", @@ -60936,7 +64039,1008 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-percent", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key with percent", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/names/percent%20.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/names/percent%20.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-c4ca668cf15e\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MQ==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-c4ca668cf15e\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-plus", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key with plus", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/names/plus+plus.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/names/plus+plus.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-f09c0f273191\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MQ==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-f09c0f273191\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-space", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key space", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + ], + "call": { + "key": "a b", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/a b" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" + }, + "body": { + "encoding": "base64", + "data": "aGVsbG8=" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "aGVsbG8=" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-question", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key question", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + ], + "call": { + "key": "a?b", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/a?b" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" + }, + "body": { + "encoding": "base64", + "data": "aGVsbG8=" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "aGVsbG8=" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-non-ascii", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key unicode", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + ], + "call": { + "key": "café/雪", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/café/雪" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" + }, + "body": { + "encoding": "base64", + "data": "aGVsbG8=" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "aGVsbG8=" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-key-with-separators", + "profile": "azure-hns", + "lane": "core", + "purpose": "get key separators", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + ], + "call": { + "key": "a//b/", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/a//b/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 404, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "BlobNotFound" + }, + "body": { + "encoding": "utf8", + "data": "BlobNotFoundFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-metadata-empty-value", + "profile": "azure-hns", + "lane": "core", + "purpose": "get metadata empty value", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/metadata/empty-value.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/metadata/empty-value.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-18852ad86043\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-meta-empty": "", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MQ==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-18852ad86043\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" + } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "empty": "" + } + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-metadata-of-snapshot", + "profile": "azure-hns", + "lane": "core", + "purpose": "get metadata of snapshot", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/metadata/snapshotted.txt", + "op": "get", + "snapshot": "2024-01-01T00:00:00.1577201Z" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/metadata/snapshotted.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.1577201Z" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 404, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "BlobNotFound" + }, + "body": { + "encoding": "utf8", + "data": "BlobNotFoundFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-metadata-replaced", + "profile": "azure-hns", + "lane": "core", + "purpose": "get metadata replaced", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/metadata/replaced.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/metadata/replaced.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-c24dabf9e117\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "Mg==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-c24dabf9e117\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "yB5yjZ1ML2NvBn+JzBSGLA==" } }, { @@ -60955,22 +65059,22 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "Mg==" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-percent", + "id": "operations/azure-hns/get-metadata", "profile": "azure-hns", "lane": "core", - "purpose": "get key with percent", + "purpose": "get metadata", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/names/percent%20.txt", + "key": "object-tests/metadata/object.txt", "op": "get" }, "exchanges": [ @@ -60991,7 +65095,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/names/percent%20.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -61013,12 +65117,14 @@ "date": { "from": "now" }, - "etag": "\"fixture-c4ca668cf15e\"", + "etag": "\"fixture-4d04dba3441e\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", + "x-ms-meta-name": "value", + "x-ms-meta-second": "2", "x-ms-server-encrypted": "true" }, "body": { @@ -61044,7 +65150,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-c4ca668cf15e\"" + "value": "\"fixture-4d04dba3441e\"" } }, { @@ -61089,20 +65195,31 @@ "is": "equal", "value": "MQ==" } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "name": "value", + "second": "2" + } + } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-plus", + "id": "operations/azure-hns/get-metadata-ignores-unknown-headers", "profile": "azure-hns", "lane": "core", - "purpose": "get key with plus", + "purpose": "Surface user metadata; unknown headers must not become metadata.", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { - "key": "object-tests/names/plus+plus.txt", + "key": "object", "op": "get" }, "exchanges": [ @@ -61123,7 +65240,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/names/plus+plus.txt" + "value": "/fixture/object" } }, { @@ -61140,22 +65257,26 @@ "response": { "status": 200, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-f09c0f273191\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true" + "x-ms-meta-author": "Ada", + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03", + "x-unrelated": "not metadata" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "aGVsbG8=" } } } @@ -61172,69 +65293,36 @@ } }, { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-f09c0f273191\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", + "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "aGVsbG8=" } }, { - "at": "/value/body_base64", + "at": "/value/metadata", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": { + "author": "Ada" + } } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-space", + "id": "operations/azure-hns/get-missing", "profile": "azure-hns", "lane": "core", - "purpose": "get key space", + "purpose": "get missing. A client reports it as not_found: the object is absent", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "a b", + "key": "object-tests/read/absent.txt", "op": "get" }, "exchanges": [ @@ -61255,7 +65343,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/a b" + "value": "/fixture/object-tests/read/absent.txt" } }, { @@ -61270,26 +65358,17 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -61302,30 +65381,49 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "not_found" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-question", + "id": "operations/azure-hns/get-missing-code-in-body", "profile": "azure-hns", "lane": "core", - "purpose": "get key question", + "purpose": "get missing, with the error code only in the XML body. A client reports it as not_found: the object is absent", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", + "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", + "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" ], + "origin": "constructed", "call": { - "key": "a?b", + "key": "object-tests/read/absent.txt", "op": "get" }, "exchanges": [ @@ -61346,7 +65444,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/a?b" + "value": "/fixture/object-tests/read/absent.txt" } }, { @@ -61361,26 +65459,16 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + } }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -61393,30 +65481,47 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "not_found" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-non-ascii", + "id": "operations/azure-hns/get-not-modified", "profile": "azure-hns", "lane": "core", - "purpose": "get key unicode", + "purpose": "get not modified", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "café/雪", + "if_none_match": "\"fixture-5295cdfd25ff\"", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -61437,7 +65542,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/café/雪" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -61447,31 +65552,29 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-5295cdfd25ff\"" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 304, "headers": { - "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "ConditionNotMet" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "" } } } @@ -61484,30 +65587,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": 304 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-key-with-separators", + "id": "operations/azure-hns/get-precondition-failed", "profile": "azure-hns", "lane": "core", - "purpose": "get key separators", + "purpose": "get precondition failed", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "a//b/", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -61528,7 +65640,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/a//b/" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -61538,22 +65650,30 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-088e5dc109cf\"" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "x-ms-error-code": "ConditionNotMet" }, "body": { "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "data": "ConditionNotMetFixture error" } } } @@ -61574,7 +65694,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 412 } }, { @@ -61582,23 +65702,24 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-metadata-empty-value", + "id": "operations/azure-hns/get-previous-version-of-deleted-object", "profile": "azure-hns", "lane": "core", - "purpose": "get metadata empty value", + "purpose": "get previous version of deleted object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/metadata/empty-value.txt", - "op": "get" + "key": "object-tests/versions-mtypy4jp/deleted.txt", + "op": "get", + "version": "none-1" }, "exchanges": [ { @@ -61618,7 +65739,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/empty-value.txt" + "value": "/fixture/object-tests/versions-mtypy4jp/deleted.txt" } }, { @@ -61628,30 +65749,29 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "none-1" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 400, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-18852ad86043\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-meta-empty": "", - "x-ms-server-encrypted": "true" + } }, "body": { - "encoding": "base64", - "data": "MQ==" + "encoding": "utf8", + "data": "InvalidQueryParameterValueFixture error" } } } @@ -61664,85 +65784,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-18852ad86043\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": 400 } }, { - "at": "/value/metadata", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": { - "empty": "" - } + "value": "InvalidQueryParameterValue" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-metadata-of-snapshot", + "id": "operations/azure-hns/get-previous-version", "profile": "azure-hns", "lane": "core", - "purpose": "get metadata of snapshot", + "purpose": "get previous version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/metadata/snapshotted.txt", + "key": "object-tests/versions-mtypy4jp/object.txt", "op": "get", - "snapshot": "2024-01-01T00:00:00.1577201Z" + "version": "none-1" }, "exchanges": [ { @@ -61762,7 +65837,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/snapshotted.txt" + "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" } }, { @@ -61774,28 +65849,27 @@ } }, { - "at": "/query/snapshot", + "at": "/query/versionid", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1577201Z" + "value": "none-1" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "BlobNotFound" + } }, "body": { "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "data": "InvalidQueryParameterValueFixture error" } } } @@ -61816,7 +65890,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -61824,23 +65898,27 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "InvalidQueryParameterValue" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-metadata-replaced", + "id": "operations/azure-hns/get-range-inverted", "profile": "azure-hns", "lane": "core", - "purpose": "get metadata replaced", + "purpose": "get range inverted", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/metadata/replaced.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 2, + "start": 6 + } }, "exchanges": [ { @@ -61860,7 +65938,66 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/replaced.txt" + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=6-1" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -61870,6 +66007,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=6-1" + } } ], "allow_headers": [], @@ -61877,12 +66022,12 @@ "response": { "status": 200, "headers": { - "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-c24dabf9e117\"", + "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", @@ -61892,7 +66037,7 @@ }, "body": { "encoding": "base64", - "data": "Mg==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -61913,7 +66058,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-c24dabf9e117\"" + "value": "\"fixture-5295cdfd25ff\"" } }, { @@ -61921,7 +66066,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -61937,7 +66082,7 @@ "optional": false, "rule": { "is": "equal", - "value": "yB5yjZ1ML2NvBn+JzBSGLA==" + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { @@ -61956,23 +66101,53 @@ "optional": false, "rule": { "is": "equal", - "value": "Mg==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure-hns/get-metadata", + "id": "operations/azure-hns/get-range-empty", "profile": "azure-hns", "lane": "core", - "purpose": "get metadata", + "purpose": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/metadata/object.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 5, + "start": 5 + } }, "exchanges": [ { @@ -61992,7 +66167,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62002,6 +66177,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=5-4" + } } ], "allow_headers": [], @@ -62009,24 +66192,81 @@ "response": { "status": 200, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-4d04dba3441e\"", + "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-meta-name": "value", - "x-ms-meta-second": "2", "x-ms-server-encrypted": "true" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=5-4" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -62047,7 +66287,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-4d04dba3441e\"" + "value": "\"fixture-5295cdfd25ff\"" } }, { @@ -62055,7 +66295,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -62071,7 +66311,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { @@ -62090,34 +66330,52 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + ], + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" } }, { - "at": "/value/metadata", + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", "optional": false, "rule": { "is": "equal", - "value": { - "name": "value", - "second": "2" - } + "value": "range" } } ], - "refusal": null + "decline_permitted": true }, { - "id": "operations/azure-hns/get-metadata-ignores-unknown-headers", + "id": "operations/azure-hns/get-range-not-satisfiable", "profile": "azure-hns", "lane": "core", - "purpose": "Surface user metadata; unknown headers must not become metadata.", + "purpose": "get range not satisfiable", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "start": 40 + } }, "exchanges": [ { @@ -62137,7 +66395,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62147,84 +66405,34 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=40-" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 416, "headers": { - "content-type": "application/octet-stream", + "content-range": "bytes */30", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-meta-author": "Ada", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03", - "x-unrelated": "not metadata" + "x-ms-error-code": "InvalidRange" }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" + "encoding": "utf8", + "data": "InvalidRangeFixture error" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "aGVsbG8=" - } - }, - { - "at": "/value/metadata", - "optional": false, - "rule": { - "is": "equal", - "value": { - "author": "Ada" - } - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/get-missing", - "profile": "azure-hns", - "lane": "core", - "purpose": "get missing. A client reports it as not_found: the object is absent", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/read/absent.txt", - "op": "get" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -62240,7 +66448,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/absent.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62250,22 +66458,31 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=40-" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 416, "headers": { + "content-range": "bytes */30", "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "x-ms-error-code": "InvalidRange" }, "body": { "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "data": "InvalidRangeFixture error" } } } @@ -62286,7 +66503,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 416 } }, { @@ -62294,34 +66511,27 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "equal", - "value": "not_found" + "value": "InvalidRange" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-missing-code-in-body", + "id": "operations/azure-hns/get-range-past-the-end", "profile": "azure-hns", "lane": "core", - "purpose": "get missing, with the error code only in the XML body. A client reports it as not_found: the object is absent", + "purpose": "Read a range that ends past the object, which the service clips to the object's end. Report the window it served from Content-Range, bytes 28-29/30, so that the caller sees the range was clipped", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp", - "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", - "https://learn.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], - "origin": "constructed", "call": { - "key": "object-tests/read/absent.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 64, + "start": 28 + } }, "exchanges": [ { @@ -62341,7 +66551,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/absent.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62351,21 +66561,96 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=28-63" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 28-29/30", + "content-type": "application/octet-stream", "date": { "from": "now" + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "Y3Q=" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=28-63" } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 28-29/30", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "Y3Q=" } } } @@ -62378,48 +66663,78 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-5295cdfd25ff\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": 2 } }, { - "at": "/kind", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "not_found" + "value": "application/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Y3Q=" + } + }, + { + "at": "/value/content_range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes 28-29/30" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-not-modified", + "id": "operations/azure-hns/get-range-single-byte", "profile": "azure-hns", "lane": "core", - "purpose": "get not modified", + "purpose": "get range single byte", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "if_none_match": "\"fixture-5295cdfd25ff\"", "key": "object-tests/read/object.txt", - "op": "get" + "op": "get", + "range": { + "end": 1, + "start": 0 + } }, "exchanges": [ { @@ -62451,77 +66766,38 @@ } }, { - "at": "/headers/if-none-match", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "bytes=0-0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 304, + "status": 206, "headers": { + "content-range": "bytes 0-0/30", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { "encoding": "base64", - "data": "" + "data": "MA==" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 304 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "ConditionNotMet" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/get-precondition-failed", - "profile": "azure-hns", - "lane": "core", - "purpose": "get precondition failed", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/read/object.txt", - "op": "get" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -62549,28 +66825,35 @@ } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "bytes=0-0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-0/30", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "encoding": "base64", + "data": "MA==" } } } @@ -62583,40 +66866,70 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-5295cdfd25ff\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MA==" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-previous-version-of-deleted-object", + "id": "operations/azure-hns/get-range", "profile": "azure-hns", "lane": "core", - "purpose": "get previous version of deleted object", + "purpose": "get range", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/versions-mtypy4jp/deleted.txt", + "key": "object-tests/read/object.txt", "op": "get", - "version": "none-1" + "range": { + "end": 6, + "start": 2 + } }, "exchanges": [ { @@ -62636,7 +66949,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtypy4jp/deleted.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62648,77 +66961,38 @@ } }, { - "at": "/query/versionid", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "none-1" + "value": "bytes=2-5" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "base64", + "data": "MjM0NQ==" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidQueryParameterValue" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/get-previous-version", - "profile": "azure-hns", - "lane": "core", - "purpose": "get previous version", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "key": "object-tests/versions-mtypy4jp/object.txt", - "op": "get", - "version": "none-1" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -62734,7 +67008,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -62746,27 +67020,35 @@ } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "none-1" + "value": "bytes=2-5" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "base64", + "data": "MjM0NQ==" } } } @@ -62779,42 +67061,68 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-5295cdfd25ff\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidQueryParameterValue" + "value": 4 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MjM0NQ==" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-range-inverted", + "id": "operations/azure-hns/get-range-open", "profile": "azure-hns", "lane": "core", - "purpose": "get range inverted", + "purpose": "get range open", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object", "op": "get", "range": { - "end": 2, - "start": 6 + "start": 3 } }, "exchanges": [ @@ -62835,7 +67143,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -62851,31 +67159,34 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=6-1" + "value": "bytes=3-" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 3-4/5", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-5295cdfd25ff\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true" + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "bG8=" } } }, @@ -62894,7 +67205,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -62910,31 +67221,34 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=6-1" + "value": "bytes=3-" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 3-4/5", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-5295cdfd25ff\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-server-encrypted": "true" + "x-ms-request-id": "fixture-request-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "bG8=" } } } @@ -62950,101 +67264,33 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "range" + "value": "bG8=" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure-hns/get-range-empty", + "id": "operations/azure-hns/get-range-md5", "profile": "azure-hns", "lane": "core", - "purpose": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", + "purpose": "Ask for the MD5 of a range with x-ms-range-get-content-md5: true, which Azure sends in content-md5. Check the body against it, and report it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 5, - "start": 5 - } + "end": 6, + "start": 2 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -63080,16 +67326,25 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=5-4" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63104,7 +67359,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } }, @@ -63139,16 +67394,25 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=5-4" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63163,7 +67427,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -63192,7 +67456,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -63203,14 +67467,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -63227,52 +67483,41 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": "MjM0NQ==" } }, { - "at": "/parameter", + "at": "/value/checksum", "optional": false, "rule": { "is": "equal", - "value": "range" + "value": { + "algorithm": "md5", + "value_base64": "gbBz3pNw6oc/VI4xuK3AgQ==" + } } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure-hns/get-range-not-satisfiable", + "id": "operations/azure-hns/get-range-md5-mismatch", "profile": "azure-hns", "lane": "core", - "purpose": "get range not satisfiable", + "purpose": "Report a range whose body does not match the MD5 Azure sent for it as an error of kind checksum_mismatch", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], + "origin": "constructed", + "derived_from": "operations/azure-hns/get-range-md5", "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "start": 40 - } + "end": 6, + "start": 2 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -63308,25 +67553,40 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=40-" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 416, + "status": 206, "headers": { - "content-range": "bytes */30", - "content-type": "application/xml", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "InvalidRange" + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidRangeFixture error" + "encoding": "base64", + "data": "MjM0YQ==" } } }, @@ -63361,25 +67621,40 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=40-" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 416, + "status": 206, "headers": { - "content-range": "bytes */30", - "content-type": "application/xml", + "content-md5": "gbBz3pNw6oc/VI4xuK3AgQ==", + "content-range": "bytes 2-5/30", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "InvalidRange" + "etag": "\"fixture-5295cdfd25ff\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-type": "BlockBlob", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidRangeFixture error" + "encoding": "base64", + "data": "MjM0YQ==" } } } @@ -63396,39 +67671,32 @@ } }, { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 416 - } - }, - { - "at": "/code", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "InvalidRange" + "value": "checksum_mismatch" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-range-past-the-end", + "id": "operations/azure-hns/get-range-crc64", "profile": "azure-hns", "lane": "core", - "purpose": "Read a range that ends past the object, which the service clips to the object's end. Report the window it served from Content-Range, bytes 28-29/30, so that the caller sees the range was clipped", + "purpose": "Ask for the CRC64 of a range with x-ms-range-get-content-crc64: true, which Azure sends in x-ms-content-crc64. Check the body against it, and report it", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 64, - "start": 28 - } + "end": 6, + "start": 2 + }, + "range_checksum": "azure_crc64" }, "exchanges": [ { @@ -63464,7 +67732,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=28-63" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63473,7 +67749,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 28-29/30", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63481,6 +67757,7 @@ "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -63488,7 +67765,7 @@ }, "body": { "encoding": "base64", - "data": "Y3Q=" + "data": "MjM0NQ==" } } }, @@ -63523,7 +67800,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=28-63" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63532,7 +67817,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 28-29/30", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63540,6 +67825,7 @@ "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -63547,7 +67833,7 @@ }, "body": { "encoding": "base64", - "data": "Y3Q=" + "data": "MjM0NQ==" } } } @@ -63576,7 +67862,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 4 } }, { @@ -63603,35 +67889,41 @@ "optional": false, "rule": { "is": "equal", - "value": "Y3Q=" + "value": "MjM0NQ==" } }, { - "at": "/value/content_range", + "at": "/value/checksum", "optional": false, "rule": { "is": "equal", - "value": "bytes 28-29/30" + "value": { + "algorithm": "azure_crc64", + "value_base64": "0F+fuGFLNdI=" + } } } ], "refusal": null }, { - "id": "operations/azure-hns/get-range-single-byte", + "id": "operations/azure-hns/get-range-crc64-mismatch", "profile": "azure-hns", "lane": "core", - "purpose": "get range single byte", + "purpose": "Report a range whose body does not match the CRC64 Azure sent for it as an error of kind checksum_mismatch", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], + "origin": "constructed", + "derived_from": "operations/azure-hns/get-range-crc64", "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 1, - "start": 0 - } + "end": 6, + "start": 2 + }, + "range_checksum": "azure_crc64" }, "exchanges": [ { @@ -63667,7 +67959,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=0-0" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63676,7 +67976,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/30", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63684,6 +67984,7 @@ "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -63691,7 +67992,7 @@ }, "body": { "encoding": "base64", - "data": "MA==" + "data": "MjM0YQ==" } } }, @@ -63726,7 +68027,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=0-0" + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-ms-range-get-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63735,7 +68044,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/30", + "content-range": "bytes 2-5/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63743,6 +68052,7 @@ "etag": "\"fixture-5295cdfd25ff\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-blob-type": "BlockBlob", + "x-ms-content-crc64": "0F+fuGFLNdI=", "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", @@ -63750,7 +68060,7 @@ }, "body": { "encoding": "base64", - "data": "MA==" + "data": "MjM0YQ==" } } } @@ -63763,70 +68073,36 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "MA==" + "value": "checksum_mismatch" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-range", + "id": "operations/azure-hns/get-range-md5-largest", "profile": "azure-hns", "lane": "core", - "purpose": "get range", + "purpose": "Ask for the MD5 of a 4 MiB range, the largest Azure checksums. Azure serves what the blob holds of it, here all 30 bytes, and their MD5", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 6, - "start": 2 - } + "end": 4194304, + "start": 0 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -63862,7 +68138,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=2-5" + "value": "bytes=0-4194303" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63871,7 +68155,8 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 2-5/30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 0-29/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63886,7 +68171,7 @@ }, "body": { "encoding": "base64", - "data": "MjM0NQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -63921,7 +68206,15 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=2-5" + "value": "bytes=0-4194303" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], @@ -63930,7 +68223,8 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 2-5/30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-range": "bytes 0-29/30", "content-type": "application/octet-stream", "date": { "from": "now" @@ -63945,7 +68239,7 @@ }, "body": { "encoding": "base64", - "data": "MjM0NQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -63974,7 +68268,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 30 } }, { @@ -64001,26 +68295,39 @@ "optional": false, "rule": { "is": "equal", - "value": "MjM0NQ==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "md5", + "value_base64": "H1VC0PNTmj+yaCRN4U931g==" + } } } ], "refusal": null }, { - "id": "operations/azure-hns/get-range-open", + "id": "operations/azure-hns/get-range-md5-too-large", "profile": "azure-hns", "lane": "core", - "purpose": "get range open", + "purpose": "Report the MD5 of a range one byte over 4 MiB as an error: Azure refuses it with 400 InvalidHeaderValue. A client may refuse it before sending", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob" ], "call": { - "key": "object", + "key": "object-tests/read/object.txt", "op": "get", "range": { - "start": 3 - } + "end": 4194305, + "start": 0 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -64040,7 +68347,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -64056,34 +68363,32 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=3-" + "value": "bytes=0-4194304" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 206, + "status": 400, "headers": { - "content-range": "bytes 3-4/5", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "base64", - "data": "bG8=" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } }, @@ -64102,7 +68407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -64118,34 +68423,32 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=3-" + "value": "bytes=0-4194304" + } + }, + { + "at": "/headers/x-ms-range-get-content-md5", + "optional": false, + "rule": { + "is": "equal", + "value": "true" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 206, + "status": 400, "headers": { - "content-range": "bytes 3-4/5", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-blob-type": "BlockBlob", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-state": "available", - "x-ms-lease-status": "unlocked", - "x-ms-request-id": "fixture-request-id", - "x-ms-request-server-encrypted": "true", - "x-ms-server-encrypted": "true", - "x-ms-version": "2023-11-03" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "base64", - "data": "bG8=" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -64158,19 +68461,68 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "bG8=" + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidHeaderValue" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidHeaderValue" + } + } + ] }, { "id": "operations/azure-hns/get-reordered", @@ -69402,6 +73754,673 @@ ], "refusal": null }, + { + "id": "operations/azure-hns/set-properties-all", + "profile": "azure-hns", + "lane": "core", + "purpose": "Set every content property with Set Blob Properties, each in its x-ms-blob- header: content type, encoding, language, disposition and cache control", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-properties" + ], + "call": { + "cache_control": "no-cache", + "content_disposition": "attachment; filename=\"data.json\"", + "content_encoding": "gzip", + "content_language": "nl", + "content_type": "application/json", + "key": "object-tests/properties/object.txt", + "op": "azure.set_properties" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "properties" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/json" + } + }, + { + "at": "/headers/x-ms-blob-content-encoding", + "optional": false, + "rule": { + "is": "equal", + "value": "gzip" + } + }, + { + "at": "/headers/x-ms-blob-content-language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl" + } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"data.json\"" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "no-cache" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-properties", + "profile": "azure-hns", + "lane": "core", + "purpose": "Set a blob's content type with Set Blob Properties: a PUT with comp=properties and x-ms-blob-content-type. It replaces all content properties, so the cache control and the stored Content-MD5 it does not name are cleared", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-properties" + ], + "call": { + "content_type": "application/json", + "key": "object-tests/properties/object.txt", + "op": "azure.set_properties" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "properties" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/json" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-metadata-missing", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report Set Blob Metadata on a blob that does not exist as not found, 404 BlobNotFound", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" + ], + "call": { + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + }, + { + "at": "/headers/x-ms-meta-shape", + "optional": false, + "rule": { + "is": "equal", + "value": "round" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 404, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "BlobNotFound" + }, + "body": { + "encoding": "utf8", + "data": "BlobNotFoundFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "not_found" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-metadata-if-match-failed", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report Set Blob Metadata with an If-Match the blob does not have as a failed condition, 412 ConditionNotMet, which leaves the metadata as it was", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" + ], + "call": { + "if_match": "\"0x8DEADBEEF000000\"", + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + }, + { + "at": "/headers/x-ms-meta-shape", + "optional": false, + "rule": { + "is": "equal", + "value": "round" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"0x8DEADBEEF000000\"" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 412, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ConditionNotMet" + }, + "body": { + "encoding": "utf8", + "data": "ConditionNotMetFixture error" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ConditionNotMet" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "precondition" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-metadata-empty", + "profile": "azure-hns", + "lane": "core", + "purpose": "Clear a blob's metadata with Set Blob Metadata and no x-ms-meta- header", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" + ], + "call": { + "key": "object-tests/properties/object.txt", + "metadata": {}, + "op": "azure.set_metadata" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-metadata", + "profile": "azure-hns", + "lane": "core", + "purpose": "Replace a blob's metadata with Set Blob Metadata: a PUT with comp=metadata and an x-ms-meta- header for each pair. It replaces all metadata, so a name it leaves out is gone", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-metadata" + ], + "call": { + "key": "object-tests/properties/object.txt", + "metadata": { + "shape": "round" + }, + "op": "azure.set_metadata" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/properties/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" + } + }, + { + "at": "/headers/x-ms-meta-shape", + "optional": false, + "rule": { + "is": "equal", + "value": "round" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } + } + ], + "refusal": null + }, { "id": "operations/azure-hns/head-access-tier", "profile": "azure-hns", @@ -82708,7 +87727,863 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9373f0410116\"" + "value": "\"fixture-9373f0410116\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/write/object.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/write/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-question", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"question?mark.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/question?mark.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/question?mark.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-hash", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"hash#tag.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/hash#tag.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/hash#tag.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-percent", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"percent%20.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/percent%20.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/percent%20.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-plus", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"plus+plus.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/plus+plus.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/plus+plus.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-space", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"space name.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/space name.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/space name.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-non-ascii", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"café/雪.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/café/雪.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/café/雪.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-created-key-double-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "put created, with the key \"double//slash.txt\"", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/double//slash.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/keys/double//slash.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OQ==" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "date": { + "from": "now" + }, + "etag": "\"fixture-bf139483d631\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bf139483d631\"" } }, { @@ -82726,16 +88601,16 @@ "refusal": null }, { - "id": "operations/azure-hns/put-created", + "id": "operations/azure-hns/put-created-key-trailing-slash", "profile": "azure-hns", "lane": "core", - "purpose": "put created", + "purpose": "put created, with the key \"trailing-slash/\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/write/object.txt", + "key": "object-tests/keys/trailing-slash/", "op": "put" }, "exchanges": [ @@ -82756,7 +88631,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -82781,20 +88656,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "InvalidUri" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidUriFixture error" } } } @@ -82807,43 +88679,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": 400 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "InvalidUri" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-question", + "id": "operations/azure-hns/copy-missing-source", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"question?mark.txt\"", + "purpose": "Refuse a copy whose source does not exist", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/question?mark.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -82863,7 +88732,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -82871,37 +88740,32 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 404, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -82914,43 +88778,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": 404 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-hash", + "id": "operations/azure-hns/copy", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"hash#tag.txt\"", + "purpose": "Copy an object to another key in the same container", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/hash#tag.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -82970,7 +88831,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -82978,37 +88839,33 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -83025,39 +88882,31 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-percent", + "id": "operations/azure-hns/copy-replace-metadata", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"percent%20.txt\"", + "purpose": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/percent%20.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "metadata": { + "colour": "blue" + }, + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83077,7 +88926,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83085,37 +88934,41 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-meta-colour", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "blue" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -83132,39 +88985,29 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-plus", + "id": "operations/azure-hns/copy-source-if-match", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"plus+plus.txt\"", + "purpose": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/plus+plus.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_match": "\"fixture-etag\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83184,7 +89027,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83192,37 +89035,41 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "\"fixture-etag\"" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -83239,39 +89086,29 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-space", + "id": "operations/azure-hns/copy-source-if-match-failed", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"space name.txt\"", + "purpose": "Report a copy whose source does not have the ETag in x-ms-source-if-match as a failed condition, 412 SourceConditionNotMet", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/space name.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_match": "\"fixture-0123456789ab\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83291,7 +89128,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83299,37 +89136,40 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "\"fixture-0123456789ab\"" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 412, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "SourceConditionNotMetFixture error" } } } @@ -83342,43 +89182,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": 412 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-non-ascii", + "id": "operations/azure-hns/copy-source-if-unmodified-since-failed", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"café/雪.txt\"", + "purpose": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/café/雪.txt", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_if_unmodified_since": "Mon, 01 Jan 2024 00:00:00 GMT", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83398,7 +89236,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83406,37 +89244,40 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "Mon, 01 Jan 2024 00:00:00 GMT" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 412, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "SourceConditionNotMetFixture error" } } } @@ -83449,43 +89290,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": 412 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-double-slash", + "id": "operations/azure-hns/copy-if-none-match-exists", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"double//slash.txt\"", + "purpose": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/double//slash.txt", - "op": "put" + "if_none_match": "*", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83505,7 +89344,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83513,37 +89352,40 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "*" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 409, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf139483d631\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobAlreadyExistsFixture error" } } } @@ -83556,43 +89398,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": 409 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-trailing-slash", + "id": "operations/azure-hns/copy-across-containers", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"trailing-slash/\"", + "purpose": "Copy a blob from another container of the same account, which x-ms-copy-source names in its URL", "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/trailing-slash/", - "op": "put" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_container": "source", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -83612,7 +89452,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83620,34 +89460,33 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "BlockBlob" + "is": "matches", + "pattern": "https?://[^/]+/source/object-tests/copy/source\\.txt" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidUri" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "InvalidUriFixture error" + "encoding": "empty" } } } @@ -83660,40 +89499,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "InvalidUri" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-missing-source", + "id": "operations/azure-hns/copy-tier", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a copy whose source does not exist", + "purpose": "Copy a blob into another access tier, named in x-ms-access-tier", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "source_key": "object-tests/copy/absent.txt" + "source_key": "object-tests/copy/source.txt", + "tier": "Cool" }, "exchanges": [ { @@ -83729,24 +89561,33 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Cool" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "empty" } } } @@ -83759,40 +89600,32 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy", + "id": "operations/azure-hns/copy-source-key-encoded", "profile": "azure-hns", "lane": "core", - "purpose": "Copy an object to another key in the same container", + "purpose": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "source_key": "object-tests/copy/source.txt" + "source_key": "object-tests/copy/a b+c%é?#.txt" }, "exchanges": [ { @@ -83828,7 +89661,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/a%20b%2[Bb]c%25%[Cc]3%[Aa]9%3[Ff]%23\\.txt" } } ], @@ -83874,20 +89707,18 @@ "refusal": null }, { - "id": "operations/azure-hns/copy-replace-metadata", + "id": "operations/azure-hns/copy-sync", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob with new metadata, which replaces all of the source's. A copy that names no metadata keeps the source's", + "purpose": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. Azure reads the source by URL as the caller, or with the bearer token in x-ms-copy-source-authorization", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { "key": "object-tests/copy/target.txt", - "metadata": { - "colour": "blue" - }, "op": "copy", - "source_key": "object-tests/copy/source.txt" + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -83927,112 +89758,19 @@ } }, { - "at": "/headers/x-ms-meta-colour", - "optional": false, - "rule": { - "is": "equal", - "value": "blue" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 202, - "headers": { - "date": { - "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" - }, - "body": { - "encoding": "empty" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/copy_status", - "optional": false, - "rule": { - "is": "equal", - "value": "success" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/copy-source-if-match", - "profile": "azure-hns", - "lane": "core", - "purpose": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" - ], - "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_match": "\"fixture-etag\"", - "source_key": "object-tests/copy/source.txt" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" - } - }, - { - "at": "/body_base64", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "true" } }, { - "at": "/headers/x-ms-copy-source", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" - } - }, - { - "at": "/headers/x-ms-source-if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-etag\"" + "pattern": "Bearer [^ ]+" } } ], @@ -84078,18 +89816,18 @@ "refusal": null }, { - "id": "operations/azure-hns/copy-source-if-match-failed", + "id": "operations/azure-hns/copy-sync-missing-source", "profile": "azure-hns", "lane": "core", - "purpose": "Report a copy whose source does not have the ETag in x-ms-source-if-match as a failed condition, 412 SourceConditionNotMet", + "purpose": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "source_if_match": "\"fixture-0123456789ab\"", - "source_key": "object-tests/copy/source.txt" + "source_key": "object-tests/copy/absent.txt", + "sync": true }, "exchanges": [ { @@ -84125,32 +89863,40 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } }, { - "at": "/headers/x-ms-source-if-match", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0123456789ab\"" + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "SourceConditionNotMetFixture error" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -84171,7 +89917,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -84179,25 +89925,26 @@ "optional": false, "rule": { "is": "equal", - "value": "SourceConditionNotMet" + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-if-unmodified-since-failed", + "id": "operations/azure-hns/copy-sync-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Report a copy whose source changed after the time in x-ms-source-if-unmodified-since as a failed condition, 412 SourceConditionNotMet", + "purpose": "Copy a blob with Copy Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "source_if_unmodified_since": "Mon, 01 Jan 2024 00:00:00 GMT", - "source_key": "object-tests/copy/source.txt" + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -84233,32 +89980,41 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-source-if-unmodified-since", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { - "encoding": "utf8", - "data": "SourceConditionNotMetFixture error" + "encoding": "empty" } } } @@ -84271,38 +90027,31 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "SourceConditionNotMet" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-if-none-match-exists", + "id": "operations/azure-hns/copy-pending", "profile": "azure-hns", "lane": "core", - "purpose": "Report a copy with If-None-Match: * onto a blob that exists as a failed condition on the destination", + "purpose": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure-hns/copy", "call": { - "if_none_match": "*", "key": "object-tests/copy/target.txt", "op": "copy", "source_key": "object-tests/copy/source.txt" @@ -84343,30 +90092,23 @@ "is": "matches", "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } - }, - { - "at": "/headers/if-none-match", - "optional": false, - "rule": { - "is": "equal", - "value": "*" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "pending" }, "body": { - "encoding": "utf8", - "data": "BlobAlreadyExistsFixture error" + "encoding": "empty" } } } @@ -84379,40 +90121,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "pending" } }, { - "at": "/code", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-across-containers", + "id": "operations/azure-hns/copy-content-properties", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob from another container of the same account, which x-ms-copy-source names in its URL", + "purpose": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { + "content_type": "text/plain", "key": "object-tests/copy/target.txt", "op": "copy", - "source_container": "source", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -84449,7 +90191,15 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/source/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain" } } ], @@ -84492,21 +90242,47 @@ } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "content_type" + } + } + ], + "decline_permitted": true }, { - "id": "operations/azure-hns/copy-tier", + "id": "operations/azure-hns/copy-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob into another access tier, named in x-ms-access-tier", + "purpose": "Report an asynchronous Copy Blob from another storage account as an error. It reads such a source only with a SAS, so with Entra ID Azure answers 401 CannotVerifyCopySource, with a bearer token in x-ms-copy-source-authorization or without. Copy between accounts with Copy Blob From URL, Put Blob From URL or Put Block From URL", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "source_key": "object-tests/copy/source.txt", - "tier": "Cool" + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -84542,33 +90318,32 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-access-tier", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "Cool" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 401, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -84581,32 +90356,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-key-encoded", + "id": "operations/azure-hns/put-from-url", "profile": "azure-hns", "lane": "core", - "purpose": "Copy from a key with a space, +, %, é, ? and #. The x-ms-copy-source URL percent-encodes every byte of the key outside letters, digits, -._~ and /", + "purpose": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/a b+c%é?#.txt" + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -84642,22 +90425,39 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/a%20b%2[Bb]c%25%[Cc]3%[Aa]9%3[Ff]%23\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -84677,29 +90477,30 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-sync", + "id": "operations/azure-hns/put-from-url-content-properties", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob with Copy Blob From URL, x-ms-requires-sync: true, which answers once the copy is done. The source must be readable by URL: by a SAS, or by a bearer token in x-ms-copy-source-authorization", + "purpose": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { + "cache_control": "max-age=3600", + "content_type": "text/plain", "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt", - "sync": true + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -84739,28 +90540,51 @@ } }, { - "at": "/headers/x-ms-requires-sync", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "true" + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain" + } + }, + { + "at": "/headers/x-ms-blob-cache-control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], "allow_headers": [ - "x-ms-copy-source-authorization" + "x-ms-copy-source-blob-properties" ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -84780,29 +90604,28 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-sync-missing-source", + "id": "operations/azure-hns/put-from-url-missing-source", "profile": "azure-hns", "lane": "core", - "purpose": "Report a Copy Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "purpose": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/absent.txt", - "sync": true + "op": "azure.put_from_url", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -84842,16 +90665,24 @@ } }, { - "at": "/headers/x-ms-requires-sync", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "true" + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [ - "x-ms-copy-source-authorization" + "x-ms-copy-source-blob-properties" ], "allow_query": [], "response": { @@ -84901,18 +90732,17 @@ "refusal": null }, { - "id": "operations/azure-hns/copy-pending", + "id": "operations/azure-hns/put-from-url-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Report a copy that Azure answers as pending with its copy ID, so that a caller can follow it with a HEAD or abort it", + "purpose": "Write a block blob with Put Blob From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], - "origin": "transient", - "derived_from": "operations/azure-hns/copy", "call": { "key": "object-tests/copy/target.txt", - "op": "copy", + "op": "azure.put_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -84949,22 +90779,39 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 202, + "status": 201, "headers": { "date": { "from": "now" }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "pending" + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -84984,37 +90831,30 @@ } }, { - "at": "/value/copy_status", - "optional": false, - "rule": { - "is": "equal", - "value": "pending" - } - }, - { - "at": "/value/copy_id", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-content-properties", + "id": "operations/azure-hns/abort-copy", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob with a content type, which Copy Blob ignores: the copy keeps the source's content properties. A client may send it, or refuse or decline the parameter", + "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure-hns/abort-copy-finished", "call": { - "content_type": "text/plain", + "copy_id": "fixture-copy-id", "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "op": "azure.abort_copy" }, "exchanges": [ { @@ -85046,34 +90886,38 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/comp", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "copy" } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "text/plain" + "value": "fixture-copy-id" + } + }, + { + "at": "/headers/x-ms-copy-action", + "optional": false, + "rule": { + "is": "equal", + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 204, "headers": { "date": { "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + } }, "body": { "encoding": "empty" @@ -85091,56 +90935,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/copy_status", - "optional": false, - "rule": { - "is": "equal", - "value": "success" - } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "content_type" - } - } - ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure-hns/put-from-url", + "id": "operations/azure-hns/abort-copy-finished", "profile": "azure-hns", "lane": "core", - "purpose": "Write a block blob from the bytes at a URL with Put Blob From URL: a PUT with x-ms-blob-type: BlockBlob, x-ms-copy-source and no body, which answers once it is written", + "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], "call": { + "copy_id": "fixture-copy-id", "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/source.txt" + "op": "azure.abort_copy" }, "exchanges": [ { @@ -85172,39 +90982,44 @@ } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/comp", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "copy" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "fixture-copy-id" + } + }, + { + "at": "/headers/x-ms-copy-action", + "optional": false, + "rule": { + "is": "equal", + "value": "abort" } } ], - "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "NoPendingCopyOperation" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "NoPendingCopyOperationFixture error" } } } @@ -85217,34 +91032,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "NoPendingCopyOperation" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url-content-properties", + "id": "operations/azure-hns/get-page-ranges", "profile": "azure-hns", "lane": "core", - "purpose": "Write a block blob from a URL with content properties of its own, sent as x-ms-blob-content-type and x-ms-blob-cache-control. Put Blob From URL stores them in place of the source's", + "purpose": "List the written ranges of a page blob, which an HNS account does not support", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" ], "call": { - "cache_control": "max-age=3600", - "content_type": "text/plain", - "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/source.txt" + "key": "object-tests/pages/object.vhd", + "op": "azure.get_page_ranges" }, "exchanges": [ { @@ -85256,7 +91076,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -85264,7 +91084,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85276,55 +91096,28 @@ } }, { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" - } - }, - { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "BlockBlob" - } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "pagelist" } } ], - "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -85337,32 +91130,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url-missing-source", + "id": "operations/azure-hns/upload-pages-unaligned", "profile": "azure-hns", "lane": "core", - "purpose": "Report a Put Blob From URL whose source does not exist as an error. Azure answers 404 CannotVerifyCopySource, a code of its own, not BlobNotFound", + "purpose": "Refuse a page write that does not start on a 512-byte boundary, which an HNS account does not support", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/absent.txt" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 1, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -85382,7 +91184,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85390,43 +91192,48 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/comp", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + "is": "equal", + "value": "page" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=1-512" } } ], - "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "data": "InvalidHeaderValueFixture error" } } } @@ -85447,7 +91254,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -85455,26 +91262,25 @@ "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure-hns/abort-copy", + "id": "operations/azure-hns/upload-pages", "profile": "azure-hns", "lane": "core", - "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", + "purpose": "Write the first page of a page blob, which an HNS account does not support", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], - "origin": "transient", - "derived_from": "operations/azure-hns/abort-copy-finished", "call": { - "copy_id": "fixture-copy-id", - "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -85494,7 +91300,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85502,7 +91308,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -85510,37 +91316,40 @@ "optional": false, "rule": { "is": "equal", - "value": "copy" + "value": "page" } }, { - "at": "/query/copyid", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "update" } }, { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "abort" + "value": "bytes=0-511" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -85553,24 +91362,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/abort-copy-finished", + "id": "operations/azure-hns/create-page", "profile": "azure-hns", "lane": "core", - "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", + "purpose": "Create a page blob of 1,024 bytes, which an HNS account does not support", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "copy_id": "fixture-copy-id", - "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "key": "object-tests/pages/object.vhd", + "op": "azure.create_page", + "size": 1024 }, "exchanges": [ { @@ -85590,7 +91415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85602,27 +91427,19 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "copy" - } - }, - { - "at": "/query/copyid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "PageBlob" } }, { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-blob-content-length", "optional": false, "rule": { "is": "equal", - "value": "abort" + "value": "1024" } } ], @@ -85635,11 +91452,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "NoPendingCopyOperation" + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { "encoding": "utf8", - "data": "NoPendingCopyOperationFixture error" + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -85668,23 +91485,24 @@ "optional": false, "rule": { "is": "equal", - "value": "NoPendingCopyOperation" + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-page-ranges", + "id": "operations/azure-hns/append-block-to-block-blob", "profile": "azure-hns", "lane": "core", - "purpose": "List the written ranges of a page blob, which an HNS account does not support", + "purpose": "Refuse an append to a block blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/pages/object.vhd", - "op": "azure.get_page_ranges" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -85696,7 +91514,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -85704,7 +91522,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85712,7 +91530,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -85720,7 +91538,7 @@ "optional": false, "rule": { "is": "equal", - "value": "pagelist" + "value": "appendblock" } } ], @@ -85733,11 +91551,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "x-ms-error-code": "InvalidBlobType" }, "body": { "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "data": "InvalidBlobTypeFixture error" } } } @@ -85766,25 +91584,25 @@ "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "InvalidBlobType" } } ], "refusal": null }, { - "id": "operations/azure-hns/upload-pages-unaligned", + "id": "operations/azure-hns/append-block-at-wrong-position", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a page write that does not start on a 512-byte boundary, which an HNS account does not support", + "purpose": "Refuse an append whose position condition does not match the blob length", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 1, - "op": "azure.upload_pages" + "append_position": 0, + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -85804,7 +91622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85812,7 +91630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "c2Vjb25k" } }, { @@ -85820,40 +91638,32 @@ "optional": false, "rule": { "is": "equal", - "value": "page" - } - }, - { - "at": "/headers/x-ms-page-write", - "optional": false, - "rule": { - "is": "equal", - "value": "update" + "value": "appendblock" } }, { - "at": "/headers/x-ms-range", + "at": "/headers/x-ms-blob-condition-appendpos", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-512" + "value": "0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "x-ms-error-code": "AppendPositionConditionNotMet" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "AppendPositionConditionNotMetFixture error" } } } @@ -85874,7 +91684,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -85882,25 +91692,24 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "AppendPositionConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/upload-pages", + "id": "operations/azure-hns/append-block", "profile": "azure-hns", "lane": "core", - "purpose": "Write the first page of a page blob, which an HNS account does not support", + "purpose": "Append a block to an append blob and report its offset", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 0, - "op": "azure.upload_pages" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -85920,7 +91729,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85928,7 +91737,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "c2Vjb25k" } }, { @@ -85936,40 +91745,26 @@ "optional": false, "rule": { "is": "equal", - "value": "page" - } - }, - { - "at": "/headers/x-ms-page-write", - "optional": false, - "rule": { - "is": "equal", - "value": "update" - } - }, - { - "at": "/headers/x-ms-range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=0-511" + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "empty" } } } @@ -85982,40 +91777,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 5 } }, { - "at": "/code", + "at": "/value/committed_block_count", "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure-hns/create-page", + "id": "operations/azure-hns/append-block-from-url", "profile": "azure-hns", "lane": "core", - "purpose": "Create a page blob of 1,024 bytes, which an HNS account does not support", + "purpose": "Append the bytes at a URL to an append blob with Append Block From URL: a PUT with comp=appendblock, x-ms-copy-source and no body. Report the offset the block starts at", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "key": "object-tests/pages/object.vhd", - "op": "azure.create_page", - "size": 1024 + "key": "object-tests/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -86035,7 +91830,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -86047,36 +91842,46 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "PageBlob" + "value": "appendblock" } }, { - "at": "/headers/x-ms-blob-content-length", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "1024" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "empty" } } } @@ -86089,40 +91894,44 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 5 } }, { - "at": "/code", + "at": "/value/committed_block_count", "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block-to-block-blob", + "id": "operations/azure-hns/append-block-from-url-range", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse an append to a block blob", + "purpose": "Append bytes 1 to 3 at a URL with Append Block From URL, the range named in x-ms-source-range with an inclusive end, as bytes=1-3", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "body_base64": "c2Vjb25k", "key": "object-tests/append/object.log", - "op": "azure.append_block" + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 4, + "start": 1 + } }, "exchanges": [ { @@ -86150,7 +91959,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -86160,130 +91969,48 @@ "is": "equal", "value": "appendblock" } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 409, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "InvalidBlobType" }, - "body": { - "encoding": "utf8", - "data": "InvalidBlobTypeFixture error" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidBlobType" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/append-block-at-wrong-position", - "profile": "azure-hns", - "lane": "core", - "purpose": "Refuse an append whose position condition does not match the blob length", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" - ], - "call": { - "append_position": 0, - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/append/object.log" - } - }, - { - "at": "/body_base64", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "c2Vjb25k" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "bytes=1-3" } }, { - "at": "/headers/x-ms-blob-condition-appendpos", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "0" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "AppendPositionConditionNotMet" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "AppendPositionConditionNotMetFixture error" + "encoding": "empty" } } } @@ -86296,40 +92023,41 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 5 } }, { - "at": "/code", + "at": "/value/committed_block_count", "optional": false, "rule": { "is": "equal", - "value": "AppendPositionConditionNotMet" + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block", + "id": "operations/azure-hns/append-block-from-url-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Append a block to an append blob and report its offset", + "purpose": "Append a block with Append Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "body_base64": "c2Vjb25k", "key": "object-tests/append/object.log", - "op": "azure.append_block" + "op": "azure.append_block_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -86357,7 +92085,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -86367,6 +92095,22 @@ "is": "equal", "value": "appendblock" } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } } ], "allow_headers": [], @@ -93925,11 +99669,153 @@ "is": "equal", "value": "bytes=0-2" } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } } ], "allow_headers": [ - "content-type", - "x-ms-copy-source-authorization" + "content-type" + ], + "allow_query": [], + "response": { + "status": 201, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/stage-from-url-other-account", + "profile": "azure-hns", + "lane": "core", + "purpose": "Stage a block with Put Block From URL from another storage account, which x-ms-copy-source names by that account's URL. Within one tenant, Azure reads the source as the caller, so a bearer token in x-ms-copy-source-authorization is optional", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-block-from-url" + ], + "call": { + "block_id_base64": "MDAwMDAy", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block_from_url", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 3, + "start": 0 + } + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/multipart/staged.bin" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + } + }, + { + "at": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-2" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } + } + ], + "allow_headers": [ + "content-type" ], "allow_query": [], "response": { @@ -112278,6 +118164,156 @@ ], "refusal": null }, + { + "id": "operations/s3/get-checksum-range", + "profile": "s3", + "lane": "core", + "purpose": "Read part of an object with checksum mode. S3 sends no checksum for a range that does not cover the whole object, so a client reads it without one, and reports none. x-amz-checksum-mode may be sent or left out", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" + ], + "call": { + "checksum_mode": true, + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 6, + "start": 2 + } + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=2-5" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": true, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 2-5/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MjM0NQ==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ad03f2ab332a\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 4 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MjM0NQ==" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "refusal": null + }, { "id": "operations/s3/get-replaced", "profile": "s3", @@ -113247,18 +119283,575 @@ ], "allow_query": [], "response": { - "status": 403, + "status": 403, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nInvalidAccessKeyIdFixture error" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 403 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidAccessKeyId" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/get-whole", + "profile": "s3", + "lane": "core", + "purpose": "get whole", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ad03f2ab332a\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/get-checksum", + "profile": "s3", + "lane": "core", + "purpose": "Read an object with x-amz-checksum-mode: ENABLED, which makes S3 send the object's stored checksum, here CRC32, in x-amz-checksum-crc32 with x-amz-checksum-type: FULL_OBJECT. A range that covers the whole object gets it too. Check the body against it, and report it", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" + ], + "call": { + "checksum_mode": true, + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc32": "zYbXEQ==", + "x-amz-checksum-type": "FULL_OBJECT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc32": "zYbXEQ==", + "x-amz-checksum-type": "FULL_OBJECT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ad03f2ab332a\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc32", + "type": "full_object", + "value_base64": "zYbXEQ==" + } + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/get-checksum-default", + "profile": "s3", + "lane": "core", + "purpose": "Read with x-amz-checksum-mode: ENABLED an object written without a checksum. S3 stores a CRC64NVME for every new object and sends it, so a client checks CRC64NVME too", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" + ], + "call": { + "checksum_mode": true, + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { - "encoding": "utf8", - "data": "\nInvalidAccessKeyIdFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } } ] @@ -113270,37 +119863,80 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 403 + "value": "\"fixture-ad03f2ab332a\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidAccessKeyId" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } } } ], "refusal": null }, { - "id": "operations/s3/get-whole", + "id": "operations/s3/get-checksum-mismatch", "profile": "s3", "lane": "core", - "purpose": "get whole", + "purpose": "Report a body that does not match the checksum S3 sent for it as an error of kind checksum_mismatch, not as the object", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], + "origin": "constructed", + "derived_from": "operations/s3/get-checksum-default", "call": { + "checksum_mode": true, "key": "object-tests/read/object.txt", "op": "get" }, @@ -113332,6 +119968,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -113346,11 +119990,13 @@ "from": "now" }, "etag": "\"fixture-ad03f2ab332a\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" } } }, @@ -113387,6 +120033,14 @@ "is": "matches", "pattern": "bytes=0-[1-9][0-9]{2,}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -113402,11 +120056,13 @@ "from": "now" }, "etag": "\"fixture-ad03f2ab332a\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" } } } @@ -113419,50 +120075,15 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-ad03f2ab332a\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "checksum_mismatch" } } ], @@ -118366,6 +124987,143 @@ ], "refusal": null }, + { + "id": "operations/s3/head-checksum", + "profile": "s3", + "lane": "core", + "purpose": "Ask a HEAD for the object's checksum with x-amz-checksum-mode: ENABLED, and report it", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" + ], + "call": { + "checksum_mode": true, + "key": "object-tests/read/object.txt", + "op": "head" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-length": "30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ad03f2ab332a\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } + } + } + ], + "refusal": null + }, { "id": "operations/s3/restore-version", "profile": "s3", @@ -125019,6 +131777,1115 @@ ], "refusal": null }, + { + "id": "operations/s3/list-uploads", + "profile": "s3", + "lane": "core", + "purpose": "List the multipart uploads in progress under a prefix with ListMultipartUploads, a GET with ?uploads, and report each upload's key and upload ID, in key order", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" + ], + "call": { + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000falseobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Zobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000urlfalseobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Zobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/uploads", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/uploads/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/a.bin" + } + }, + { + "at": "/value/uploads/0/upload_id", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-upload-a" + } + }, + { + "at": "/value/uploads/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/b.bin" + } + }, + { + "at": "/value/uploads/1/upload_id", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-upload-b" + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/is_truncated", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-uploads-page", + "profile": "s3", + "lane": "core", + "purpose": "List one upload a page with max-uploads=1. A truncated page names the next page's start in NextKeyMarker and NextUploadIdMarker, which a client reports", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" + ], + "call": { + "op": "s3.list_uploads", + "page_size": 1, + "prefix": "object-tests/uploads/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + }, + { + "at": "/query/max-uploads", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/a.binfixture-upload-aobject-tests/uploads/1trueobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + }, + { + "at": "/query/max-uploads", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/a.binfixture-upload-aobject-tests/uploads/1urltrueobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/uploads", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/uploads/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/a.bin" + } + }, + { + "at": "/value/uploads/0/upload_id", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-upload-a" + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/is_truncated", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/next_key_marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/a.bin" + } + }, + { + "at": "/value/next_upload_id_marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-upload-a" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-uploads-after-key", + "profile": "s3", + "lane": "core", + "purpose": "List the uploads after a key, named in key-marker: the uploads of that key are left out", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" + ], + "call": { + "key_marker": "object-tests/uploads/a.bin", + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/a.bin" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/a.binobject-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000falseobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/a.bin" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/a.binobject-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000urlfalseobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorfixture-ownerSTANDARD2024-01-01T00:00:00.000Z" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/uploads", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/uploads/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/b.bin" + } + }, + { + "at": "/value/uploads/0/upload_id", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-upload-b" + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/is_truncated", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-uploads-delimited", + "profile": "s3", + "lane": "core", + "purpose": "List uploads with delimiter=/: the uploads under a deeper prefix are reported as that common prefix", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" + ], + "call": { + "delimiter": "/", + "op": "s3.list_uploads", + "prefix": "object-tests/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture/object-tests/1000falseobject-tests/uploads/" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture/object-tests/1000urlfalseobject-tests/uploads/" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/uploads", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/prefixes/0", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + }, + { + "at": "/value/is_truncated", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-uploads-none", + "profile": "s3", + "lane": "core", + "purpose": "List a prefix with no upload in progress: an empty list, not an error", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" + ], + "call": { + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/1000false" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/uploads/" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/uploads/1000urlfalse" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/uploads", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/is_truncated", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + } + ], + "refusal": null + }, { "id": "operations/s3/list-versions-unversioned", "profile": "s3", @@ -165739,11 +173606,1457 @@ "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "then": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "POST" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "object-tests/batch/many-0000.txtobject-tests/batch/many-0001.txtobject-tests/batch/many-0002.txtobject-tests/batch/many-0003.txtobject-tests/batch/many-0004.txtobject-tests/batch/many-0005.txtobject-tests/batch/many-0006.txtobject-tests/batch/many-0007.txtobject-tests/batch/many-0008.txtobject-tests/batch/many-0009.txtobject-tests/batch/many-0010.txtobject-tests/batch/many-0011.txtobject-tests/batch/many-0012.txtobject-tests/batch/many-0013.txtobject-tests/batch/many-0014.txtobject-tests/batch/many-0015.txtobject-tests/batch/many-0016.txtobject-tests/batch/many-0017.txtobject-tests/batch/many-0018.txtobject-tests/batch/many-0019.txtobject-tests/batch/many-0020.txtobject-tests/batch/many-0021.txtobject-tests/batch/many-0022.txtobject-tests/batch/many-0023.txtobject-tests/batch/many-0024.txtobject-tests/batch/many-0025.txtobject-tests/batch/many-0026.txtobject-tests/batch/many-0027.txtobject-tests/batch/many-0028.txtobject-tests/batch/many-0029.txtobject-tests/batch/many-0030.txtobject-tests/batch/many-0031.txtobject-tests/batch/many-0032.txtobject-tests/batch/many-0033.txtobject-tests/batch/many-0034.txtobject-tests/batch/many-0035.txtobject-tests/batch/many-0036.txtobject-tests/batch/many-0037.txtobject-tests/batch/many-0038.txtobject-tests/batch/many-0039.txtobject-tests/batch/many-0040.txtobject-tests/batch/many-0041.txtobject-tests/batch/many-0042.txtobject-tests/batch/many-0043.txtobject-tests/batch/many-0044.txtobject-tests/batch/many-0045.txtobject-tests/batch/many-0046.txtobject-tests/batch/many-0047.txtobject-tests/batch/many-0048.txtobject-tests/batch/many-0049.txtobject-tests/batch/many-0050.txtobject-tests/batch/many-0051.txtobject-tests/batch/many-0052.txtobject-tests/batch/many-0053.txtobject-tests/batch/many-0054.txtobject-tests/batch/many-0055.txtobject-tests/batch/many-0056.txtobject-tests/batch/many-0057.txtobject-tests/batch/many-0058.txtobject-tests/batch/many-0059.txtobject-tests/batch/many-0060.txtobject-tests/batch/many-0061.txtobject-tests/batch/many-0062.txtobject-tests/batch/many-0063.txtobject-tests/batch/many-0064.txtobject-tests/batch/many-0065.txtobject-tests/batch/many-0066.txtobject-tests/batch/many-0067.txtobject-tests/batch/many-0068.txtobject-tests/batch/many-0069.txtobject-tests/batch/many-0070.txtobject-tests/batch/many-0071.txtobject-tests/batch/many-0072.txtobject-tests/batch/many-0073.txtobject-tests/batch/many-0074.txtobject-tests/batch/many-0075.txtobject-tests/batch/many-0076.txtobject-tests/batch/many-0077.txtobject-tests/batch/many-0078.txtobject-tests/batch/many-0079.txtobject-tests/batch/many-0080.txtobject-tests/batch/many-0081.txtobject-tests/batch/many-0082.txtobject-tests/batch/many-0083.txtobject-tests/batch/many-0084.txtobject-tests/batch/many-0085.txtobject-tests/batch/many-0086.txtobject-tests/batch/many-0087.txtobject-tests/batch/many-0088.txtobject-tests/batch/many-0089.txtobject-tests/batch/many-0090.txtobject-tests/batch/many-0091.txtobject-tests/batch/many-0092.txtobject-tests/batch/many-0093.txtobject-tests/batch/many-0094.txtobject-tests/batch/many-0095.txtobject-tests/batch/many-0096.txtobject-tests/batch/many-0097.txtobject-tests/batch/many-0098.txtobject-tests/batch/many-0099.txtobject-tests/batch/many-0100.txtobject-tests/batch/many-0101.txtobject-tests/batch/many-0102.txtobject-tests/batch/many-0103.txtobject-tests/batch/many-0104.txtobject-tests/batch/many-0105.txtobject-tests/batch/many-0106.txtobject-tests/batch/many-0107.txtobject-tests/batch/many-0108.txtobject-tests/batch/many-0109.txtobject-tests/batch/many-0110.txtobject-tests/batch/many-0111.txtobject-tests/batch/many-0112.txtobject-tests/batch/many-0113.txtobject-tests/batch/many-0114.txtobject-tests/batch/many-0115.txtobject-tests/batch/many-0116.txtobject-tests/batch/many-0117.txtobject-tests/batch/many-0118.txtobject-tests/batch/many-0119.txtobject-tests/batch/many-0120.txtobject-tests/batch/many-0121.txtobject-tests/batch/many-0122.txtobject-tests/batch/many-0123.txtobject-tests/batch/many-0124.txtobject-tests/batch/many-0125.txtobject-tests/batch/many-0126.txtobject-tests/batch/many-0127.txtobject-tests/batch/many-0128.txtobject-tests/batch/many-0129.txtobject-tests/batch/many-0130.txtobject-tests/batch/many-0131.txtobject-tests/batch/many-0132.txtobject-tests/batch/many-0133.txtobject-tests/batch/many-0134.txtobject-tests/batch/many-0135.txtobject-tests/batch/many-0136.txtobject-tests/batch/many-0137.txtobject-tests/batch/many-0138.txtobject-tests/batch/many-0139.txtobject-tests/batch/many-0140.txtobject-tests/batch/many-0141.txtobject-tests/batch/many-0142.txtobject-tests/batch/many-0143.txtobject-tests/batch/many-0144.txtobject-tests/batch/many-0145.txtobject-tests/batch/many-0146.txtobject-tests/batch/many-0147.txtobject-tests/batch/many-0148.txtobject-tests/batch/many-0149.txtobject-tests/batch/many-0150.txtobject-tests/batch/many-0151.txtobject-tests/batch/many-0152.txtobject-tests/batch/many-0153.txtobject-tests/batch/many-0154.txtobject-tests/batch/many-0155.txtobject-tests/batch/many-0156.txtobject-tests/batch/many-0157.txtobject-tests/batch/many-0158.txtobject-tests/batch/many-0159.txtobject-tests/batch/many-0160.txtobject-tests/batch/many-0161.txtobject-tests/batch/many-0162.txtobject-tests/batch/many-0163.txtobject-tests/batch/many-0164.txtobject-tests/batch/many-0165.txtobject-tests/batch/many-0166.txtobject-tests/batch/many-0167.txtobject-tests/batch/many-0168.txtobject-tests/batch/many-0169.txtobject-tests/batch/many-0170.txtobject-tests/batch/many-0171.txtobject-tests/batch/many-0172.txtobject-tests/batch/many-0173.txtobject-tests/batch/many-0174.txtobject-tests/batch/many-0175.txtobject-tests/batch/many-0176.txtobject-tests/batch/many-0177.txtobject-tests/batch/many-0178.txtobject-tests/batch/many-0179.txtobject-tests/batch/many-0180.txtobject-tests/batch/many-0181.txtobject-tests/batch/many-0182.txtobject-tests/batch/many-0183.txtobject-tests/batch/many-0184.txtobject-tests/batch/many-0185.txtobject-tests/batch/many-0186.txtobject-tests/batch/many-0187.txtobject-tests/batch/many-0188.txtobject-tests/batch/many-0189.txtobject-tests/batch/many-0190.txtobject-tests/batch/many-0191.txtobject-tests/batch/many-0192.txtobject-tests/batch/many-0193.txtobject-tests/batch/many-0194.txtobject-tests/batch/many-0195.txtobject-tests/batch/many-0196.txtobject-tests/batch/many-0197.txtobject-tests/batch/many-0198.txtobject-tests/batch/many-0199.txtobject-tests/batch/many-0200.txtobject-tests/batch/many-0201.txtobject-tests/batch/many-0202.txtobject-tests/batch/many-0203.txtobject-tests/batch/many-0204.txtobject-tests/batch/many-0205.txtobject-tests/batch/many-0206.txtobject-tests/batch/many-0207.txtobject-tests/batch/many-0208.txtobject-tests/batch/many-0209.txtobject-tests/batch/many-0210.txtobject-tests/batch/many-0211.txtobject-tests/batch/many-0212.txtobject-tests/batch/many-0213.txtobject-tests/batch/many-0214.txtobject-tests/batch/many-0215.txtobject-tests/batch/many-0216.txtobject-tests/batch/many-0217.txtobject-tests/batch/many-0218.txtobject-tests/batch/many-0219.txtobject-tests/batch/many-0220.txtobject-tests/batch/many-0221.txtobject-tests/batch/many-0222.txtobject-tests/batch/many-0223.txtobject-tests/batch/many-0224.txtobject-tests/batch/many-0225.txtobject-tests/batch/many-0226.txtobject-tests/batch/many-0227.txtobject-tests/batch/many-0228.txtobject-tests/batch/many-0229.txtobject-tests/batch/many-0230.txtobject-tests/batch/many-0231.txtobject-tests/batch/many-0232.txtobject-tests/batch/many-0233.txtobject-tests/batch/many-0234.txtobject-tests/batch/many-0235.txtobject-tests/batch/many-0236.txtobject-tests/batch/many-0237.txtobject-tests/batch/many-0238.txtobject-tests/batch/many-0239.txtobject-tests/batch/many-0240.txtobject-tests/batch/many-0241.txtobject-tests/batch/many-0242.txtobject-tests/batch/many-0243.txtobject-tests/batch/many-0244.txtobject-tests/batch/many-0245.txtobject-tests/batch/many-0246.txtobject-tests/batch/many-0247.txtobject-tests/batch/many-0248.txtobject-tests/batch/many-0249.txtobject-tests/batch/many-0250.txtobject-tests/batch/many-0251.txtobject-tests/batch/many-0252.txtobject-tests/batch/many-0253.txtobject-tests/batch/many-0254.txtobject-tests/batch/many-0255.txtobject-tests/batch/many-0256.txtobject-tests/batch/many-0257.txtobject-tests/batch/many-0258.txtobject-tests/batch/many-0259.txtobject-tests/batch/many-0260.txtobject-tests/batch/many-0261.txtobject-tests/batch/many-0262.txtobject-tests/batch/many-0263.txtobject-tests/batch/many-0264.txtobject-tests/batch/many-0265.txtobject-tests/batch/many-0266.txtobject-tests/batch/many-0267.txtobject-tests/batch/many-0268.txtobject-tests/batch/many-0269.txtobject-tests/batch/many-0270.txtobject-tests/batch/many-0271.txtobject-tests/batch/many-0272.txtobject-tests/batch/many-0273.txtobject-tests/batch/many-0274.txtobject-tests/batch/many-0275.txtobject-tests/batch/many-0276.txtobject-tests/batch/many-0277.txtobject-tests/batch/many-0278.txtobject-tests/batch/many-0279.txtobject-tests/batch/many-0280.txtobject-tests/batch/many-0281.txtobject-tests/batch/many-0282.txtobject-tests/batch/many-0283.txtobject-tests/batch/many-0284.txtobject-tests/batch/many-0285.txtobject-tests/batch/many-0286.txtobject-tests/batch/many-0287.txtobject-tests/batch/many-0288.txtobject-tests/batch/many-0289.txtobject-tests/batch/many-0290.txtobject-tests/batch/many-0291.txtobject-tests/batch/many-0292.txtobject-tests/batch/many-0293.txtobject-tests/batch/many-0294.txtobject-tests/batch/many-0295.txtobject-tests/batch/many-0296.txtobject-tests/batch/many-0297.txtobject-tests/batch/many-0298.txtobject-tests/batch/many-0299.txtobject-tests/batch/many-0300.txtobject-tests/batch/many-0301.txtobject-tests/batch/many-0302.txtobject-tests/batch/many-0303.txtobject-tests/batch/many-0304.txtobject-tests/batch/many-0305.txtobject-tests/batch/many-0306.txtobject-tests/batch/many-0307.txtobject-tests/batch/many-0308.txtobject-tests/batch/many-0309.txtobject-tests/batch/many-0310.txtobject-tests/batch/many-0311.txtobject-tests/batch/many-0312.txtobject-tests/batch/many-0313.txtobject-tests/batch/many-0314.txtobject-tests/batch/many-0315.txtobject-tests/batch/many-0316.txtobject-tests/batch/many-0317.txtobject-tests/batch/many-0318.txtobject-tests/batch/many-0319.txtobject-tests/batch/many-0320.txtobject-tests/batch/many-0321.txtobject-tests/batch/many-0322.txtobject-tests/batch/many-0323.txtobject-tests/batch/many-0324.txtobject-tests/batch/many-0325.txtobject-tests/batch/many-0326.txtobject-tests/batch/many-0327.txtobject-tests/batch/many-0328.txtobject-tests/batch/many-0329.txtobject-tests/batch/many-0330.txtobject-tests/batch/many-0331.txtobject-tests/batch/many-0332.txtobject-tests/batch/many-0333.txtobject-tests/batch/many-0334.txtobject-tests/batch/many-0335.txtobject-tests/batch/many-0336.txtobject-tests/batch/many-0337.txtobject-tests/batch/many-0338.txtobject-tests/batch/many-0339.txtobject-tests/batch/many-0340.txtobject-tests/batch/many-0341.txtobject-tests/batch/many-0342.txtobject-tests/batch/many-0343.txtobject-tests/batch/many-0344.txtobject-tests/batch/many-0345.txtobject-tests/batch/many-0346.txtobject-tests/batch/many-0347.txtobject-tests/batch/many-0348.txtobject-tests/batch/many-0349.txtobject-tests/batch/many-0350.txtobject-tests/batch/many-0351.txtobject-tests/batch/many-0352.txtobject-tests/batch/many-0353.txtobject-tests/batch/many-0354.txtobject-tests/batch/many-0355.txtobject-tests/batch/many-0356.txtobject-tests/batch/many-0357.txtobject-tests/batch/many-0358.txtobject-tests/batch/many-0359.txtobject-tests/batch/many-0360.txtobject-tests/batch/many-0361.txtobject-tests/batch/many-0362.txtobject-tests/batch/many-0363.txtobject-tests/batch/many-0364.txtobject-tests/batch/many-0365.txtobject-tests/batch/many-0366.txtobject-tests/batch/many-0367.txtobject-tests/batch/many-0368.txtobject-tests/batch/many-0369.txtobject-tests/batch/many-0370.txtobject-tests/batch/many-0371.txtobject-tests/batch/many-0372.txtobject-tests/batch/many-0373.txtobject-tests/batch/many-0374.txtobject-tests/batch/many-0375.txtobject-tests/batch/many-0376.txtobject-tests/batch/many-0377.txtobject-tests/batch/many-0378.txtobject-tests/batch/many-0379.txtobject-tests/batch/many-0380.txtobject-tests/batch/many-0381.txtobject-tests/batch/many-0382.txtobject-tests/batch/many-0383.txtobject-tests/batch/many-0384.txtobject-tests/batch/many-0385.txtobject-tests/batch/many-0386.txtobject-tests/batch/many-0387.txtobject-tests/batch/many-0388.txtobject-tests/batch/many-0389.txtobject-tests/batch/many-0390.txtobject-tests/batch/many-0391.txtobject-tests/batch/many-0392.txtobject-tests/batch/many-0393.txtobject-tests/batch/many-0394.txtobject-tests/batch/many-0395.txtobject-tests/batch/many-0396.txtobject-tests/batch/many-0397.txtobject-tests/batch/many-0398.txtobject-tests/batch/many-0399.txtobject-tests/batch/many-0400.txtobject-tests/batch/many-0401.txtobject-tests/batch/many-0402.txtobject-tests/batch/many-0403.txtobject-tests/batch/many-0404.txtobject-tests/batch/many-0405.txtobject-tests/batch/many-0406.txtobject-tests/batch/many-0407.txtobject-tests/batch/many-0408.txtobject-tests/batch/many-0409.txtobject-tests/batch/many-0410.txtobject-tests/batch/many-0411.txtobject-tests/batch/many-0412.txtobject-tests/batch/many-0413.txtobject-tests/batch/many-0414.txtobject-tests/batch/many-0415.txtobject-tests/batch/many-0416.txtobject-tests/batch/many-0417.txtobject-tests/batch/many-0418.txtobject-tests/batch/many-0419.txtobject-tests/batch/many-0420.txtobject-tests/batch/many-0421.txtobject-tests/batch/many-0422.txtobject-tests/batch/many-0423.txtobject-tests/batch/many-0424.txtobject-tests/batch/many-0425.txtobject-tests/batch/many-0426.txtobject-tests/batch/many-0427.txtobject-tests/batch/many-0428.txtobject-tests/batch/many-0429.txtobject-tests/batch/many-0430.txtobject-tests/batch/many-0431.txtobject-tests/batch/many-0432.txtobject-tests/batch/many-0433.txtobject-tests/batch/many-0434.txtobject-tests/batch/many-0435.txtobject-tests/batch/many-0436.txtobject-tests/batch/many-0437.txtobject-tests/batch/many-0438.txtobject-tests/batch/many-0439.txtobject-tests/batch/many-0440.txtobject-tests/batch/many-0441.txtobject-tests/batch/many-0442.txtobject-tests/batch/many-0443.txtobject-tests/batch/many-0444.txtobject-tests/batch/many-0445.txtobject-tests/batch/many-0446.txtobject-tests/batch/many-0447.txtobject-tests/batch/many-0448.txtobject-tests/batch/many-0449.txtobject-tests/batch/many-0450.txtobject-tests/batch/many-0451.txtobject-tests/batch/many-0452.txtobject-tests/batch/many-0453.txtobject-tests/batch/many-0454.txtobject-tests/batch/many-0455.txtobject-tests/batch/many-0456.txtobject-tests/batch/many-0457.txtobject-tests/batch/many-0458.txtobject-tests/batch/many-0459.txtobject-tests/batch/many-0460.txtobject-tests/batch/many-0461.txtobject-tests/batch/many-0462.txtobject-tests/batch/many-0463.txtobject-tests/batch/many-0464.txtobject-tests/batch/many-0465.txtobject-tests/batch/many-0466.txtobject-tests/batch/many-0467.txtobject-tests/batch/many-0468.txtobject-tests/batch/many-0469.txtobject-tests/batch/many-0470.txtobject-tests/batch/many-0471.txtobject-tests/batch/many-0472.txtobject-tests/batch/many-0473.txtobject-tests/batch/many-0474.txtobject-tests/batch/many-0475.txtobject-tests/batch/many-0476.txtobject-tests/batch/many-0477.txtobject-tests/batch/many-0478.txtobject-tests/batch/many-0479.txtobject-tests/batch/many-0480.txtobject-tests/batch/many-0481.txtobject-tests/batch/many-0482.txtobject-tests/batch/many-0483.txtobject-tests/batch/many-0484.txtobject-tests/batch/many-0485.txtobject-tests/batch/many-0486.txtobject-tests/batch/many-0487.txtobject-tests/batch/many-0488.txtobject-tests/batch/many-0489.txtobject-tests/batch/many-0490.txtobject-tests/batch/many-0491.txtobject-tests/batch/many-0492.txtobject-tests/batch/many-0493.txtobject-tests/batch/many-0494.txtobject-tests/batch/many-0495.txtobject-tests/batch/many-0496.txtobject-tests/batch/many-0497.txtobject-tests/batch/many-0498.txtobject-tests/batch/many-0499.txtobject-tests/batch/many-0500.txtobject-tests/batch/many-0501.txtobject-tests/batch/many-0502.txtobject-tests/batch/many-0503.txtobject-tests/batch/many-0504.txtobject-tests/batch/many-0505.txtobject-tests/batch/many-0506.txtobject-tests/batch/many-0507.txtobject-tests/batch/many-0508.txtobject-tests/batch/many-0509.txtobject-tests/batch/many-0510.txtobject-tests/batch/many-0511.txtobject-tests/batch/many-0512.txtobject-tests/batch/many-0513.txtobject-tests/batch/many-0514.txtobject-tests/batch/many-0515.txtobject-tests/batch/many-0516.txtobject-tests/batch/many-0517.txtobject-tests/batch/many-0518.txtobject-tests/batch/many-0519.txtobject-tests/batch/many-0520.txtobject-tests/batch/many-0521.txtobject-tests/batch/many-0522.txtobject-tests/batch/many-0523.txtobject-tests/batch/many-0524.txtobject-tests/batch/many-0525.txtobject-tests/batch/many-0526.txtobject-tests/batch/many-0527.txtobject-tests/batch/many-0528.txtobject-tests/batch/many-0529.txtobject-tests/batch/many-0530.txtobject-tests/batch/many-0531.txtobject-tests/batch/many-0532.txtobject-tests/batch/many-0533.txtobject-tests/batch/many-0534.txtobject-tests/batch/many-0535.txtobject-tests/batch/many-0536.txtobject-tests/batch/many-0537.txtobject-tests/batch/many-0538.txtobject-tests/batch/many-0539.txtobject-tests/batch/many-0540.txtobject-tests/batch/many-0541.txtobject-tests/batch/many-0542.txtobject-tests/batch/many-0543.txtobject-tests/batch/many-0544.txtobject-tests/batch/many-0545.txtobject-tests/batch/many-0546.txtobject-tests/batch/many-0547.txtobject-tests/batch/many-0548.txtobject-tests/batch/many-0549.txtobject-tests/batch/many-0550.txtobject-tests/batch/many-0551.txtobject-tests/batch/many-0552.txtobject-tests/batch/many-0553.txtobject-tests/batch/many-0554.txtobject-tests/batch/many-0555.txtobject-tests/batch/many-0556.txtobject-tests/batch/many-0557.txtobject-tests/batch/many-0558.txtobject-tests/batch/many-0559.txtobject-tests/batch/many-0560.txtobject-tests/batch/many-0561.txtobject-tests/batch/many-0562.txtobject-tests/batch/many-0563.txtobject-tests/batch/many-0564.txtobject-tests/batch/many-0565.txtobject-tests/batch/many-0566.txtobject-tests/batch/many-0567.txtobject-tests/batch/many-0568.txtobject-tests/batch/many-0569.txtobject-tests/batch/many-0570.txtobject-tests/batch/many-0571.txtobject-tests/batch/many-0572.txtobject-tests/batch/many-0573.txtobject-tests/batch/many-0574.txtobject-tests/batch/many-0575.txtobject-tests/batch/many-0576.txtobject-tests/batch/many-0577.txtobject-tests/batch/many-0578.txtobject-tests/batch/many-0579.txtobject-tests/batch/many-0580.txtobject-tests/batch/many-0581.txtobject-tests/batch/many-0582.txtobject-tests/batch/many-0583.txtobject-tests/batch/many-0584.txtobject-tests/batch/many-0585.txtobject-tests/batch/many-0586.txtobject-tests/batch/many-0587.txtobject-tests/batch/many-0588.txtobject-tests/batch/many-0589.txtobject-tests/batch/many-0590.txtobject-tests/batch/many-0591.txtobject-tests/batch/many-0592.txtobject-tests/batch/many-0593.txtobject-tests/batch/many-0594.txtobject-tests/batch/many-0595.txtobject-tests/batch/many-0596.txtobject-tests/batch/many-0597.txtobject-tests/batch/many-0598.txtobject-tests/batch/many-0599.txtobject-tests/batch/many-0600.txtobject-tests/batch/many-0601.txtobject-tests/batch/many-0602.txtobject-tests/batch/many-0603.txtobject-tests/batch/many-0604.txtobject-tests/batch/many-0605.txtobject-tests/batch/many-0606.txtobject-tests/batch/many-0607.txtobject-tests/batch/many-0608.txtobject-tests/batch/many-0609.txtobject-tests/batch/many-0610.txtobject-tests/batch/many-0611.txtobject-tests/batch/many-0612.txtobject-tests/batch/many-0613.txtobject-tests/batch/many-0614.txtobject-tests/batch/many-0615.txtobject-tests/batch/many-0616.txtobject-tests/batch/many-0617.txtobject-tests/batch/many-0618.txtobject-tests/batch/many-0619.txtobject-tests/batch/many-0620.txtobject-tests/batch/many-0621.txtobject-tests/batch/many-0622.txtobject-tests/batch/many-0623.txtobject-tests/batch/many-0624.txtobject-tests/batch/many-0625.txtobject-tests/batch/many-0626.txtobject-tests/batch/many-0627.txtobject-tests/batch/many-0628.txtobject-tests/batch/many-0629.txtobject-tests/batch/many-0630.txtobject-tests/batch/many-0631.txtobject-tests/batch/many-0632.txtobject-tests/batch/many-0633.txtobject-tests/batch/many-0634.txtobject-tests/batch/many-0635.txtobject-tests/batch/many-0636.txtobject-tests/batch/many-0637.txtobject-tests/batch/many-0638.txtobject-tests/batch/many-0639.txtobject-tests/batch/many-0640.txtobject-tests/batch/many-0641.txtobject-tests/batch/many-0642.txtobject-tests/batch/many-0643.txtobject-tests/batch/many-0644.txtobject-tests/batch/many-0645.txtobject-tests/batch/many-0646.txtobject-tests/batch/many-0647.txtobject-tests/batch/many-0648.txtobject-tests/batch/many-0649.txtobject-tests/batch/many-0650.txtobject-tests/batch/many-0651.txtobject-tests/batch/many-0652.txtobject-tests/batch/many-0653.txtobject-tests/batch/many-0654.txtobject-tests/batch/many-0655.txtobject-tests/batch/many-0656.txtobject-tests/batch/many-0657.txtobject-tests/batch/many-0658.txtobject-tests/batch/many-0659.txtobject-tests/batch/many-0660.txtobject-tests/batch/many-0661.txtobject-tests/batch/many-0662.txtobject-tests/batch/many-0663.txtobject-tests/batch/many-0664.txtobject-tests/batch/many-0665.txtobject-tests/batch/many-0666.txtobject-tests/batch/many-0667.txtobject-tests/batch/many-0668.txtobject-tests/batch/many-0669.txtobject-tests/batch/many-0670.txtobject-tests/batch/many-0671.txtobject-tests/batch/many-0672.txtobject-tests/batch/many-0673.txtobject-tests/batch/many-0674.txtobject-tests/batch/many-0675.txtobject-tests/batch/many-0676.txtobject-tests/batch/many-0677.txtobject-tests/batch/many-0678.txtobject-tests/batch/many-0679.txtobject-tests/batch/many-0680.txtobject-tests/batch/many-0681.txtobject-tests/batch/many-0682.txtobject-tests/batch/many-0683.txtobject-tests/batch/many-0684.txtobject-tests/batch/many-0685.txtobject-tests/batch/many-0686.txtobject-tests/batch/many-0687.txtobject-tests/batch/many-0688.txtobject-tests/batch/many-0689.txtobject-tests/batch/many-0690.txtobject-tests/batch/many-0691.txtobject-tests/batch/many-0692.txtobject-tests/batch/many-0693.txtobject-tests/batch/many-0694.txtobject-tests/batch/many-0695.txtobject-tests/batch/many-0696.txtobject-tests/batch/many-0697.txtobject-tests/batch/many-0698.txtobject-tests/batch/many-0699.txtobject-tests/batch/many-0700.txtobject-tests/batch/many-0701.txtobject-tests/batch/many-0702.txtobject-tests/batch/many-0703.txtobject-tests/batch/many-0704.txtobject-tests/batch/many-0705.txtobject-tests/batch/many-0706.txtobject-tests/batch/many-0707.txtobject-tests/batch/many-0708.txtobject-tests/batch/many-0709.txtobject-tests/batch/many-0710.txtobject-tests/batch/many-0711.txtobject-tests/batch/many-0712.txtobject-tests/batch/many-0713.txtobject-tests/batch/many-0714.txtobject-tests/batch/many-0715.txtobject-tests/batch/many-0716.txtobject-tests/batch/many-0717.txtobject-tests/batch/many-0718.txtobject-tests/batch/many-0719.txtobject-tests/batch/many-0720.txtobject-tests/batch/many-0721.txtobject-tests/batch/many-0722.txtobject-tests/batch/many-0723.txtobject-tests/batch/many-0724.txtobject-tests/batch/many-0725.txtobject-tests/batch/many-0726.txtobject-tests/batch/many-0727.txtobject-tests/batch/many-0728.txtobject-tests/batch/many-0729.txtobject-tests/batch/many-0730.txtobject-tests/batch/many-0731.txtobject-tests/batch/many-0732.txtobject-tests/batch/many-0733.txtobject-tests/batch/many-0734.txtobject-tests/batch/many-0735.txtobject-tests/batch/many-0736.txtobject-tests/batch/many-0737.txtobject-tests/batch/many-0738.txtobject-tests/batch/many-0739.txtobject-tests/batch/many-0740.txtobject-tests/batch/many-0741.txtobject-tests/batch/many-0742.txtobject-tests/batch/many-0743.txtobject-tests/batch/many-0744.txtobject-tests/batch/many-0745.txtobject-tests/batch/many-0746.txtobject-tests/batch/many-0747.txtobject-tests/batch/many-0748.txtobject-tests/batch/many-0749.txtobject-tests/batch/many-0750.txtobject-tests/batch/many-0751.txtobject-tests/batch/many-0752.txtobject-tests/batch/many-0753.txtobject-tests/batch/many-0754.txtobject-tests/batch/many-0755.txtobject-tests/batch/many-0756.txtobject-tests/batch/many-0757.txtobject-tests/batch/many-0758.txtobject-tests/batch/many-0759.txtobject-tests/batch/many-0760.txtobject-tests/batch/many-0761.txtobject-tests/batch/many-0762.txtobject-tests/batch/many-0763.txtobject-tests/batch/many-0764.txtobject-tests/batch/many-0765.txtobject-tests/batch/many-0766.txtobject-tests/batch/many-0767.txtobject-tests/batch/many-0768.txtobject-tests/batch/many-0769.txtobject-tests/batch/many-0770.txtobject-tests/batch/many-0771.txtobject-tests/batch/many-0772.txtobject-tests/batch/many-0773.txtobject-tests/batch/many-0774.txtobject-tests/batch/many-0775.txtobject-tests/batch/many-0776.txtobject-tests/batch/many-0777.txtobject-tests/batch/many-0778.txtobject-tests/batch/many-0779.txtobject-tests/batch/many-0780.txtobject-tests/batch/many-0781.txtobject-tests/batch/many-0782.txtobject-tests/batch/many-0783.txtobject-tests/batch/many-0784.txtobject-tests/batch/many-0785.txtobject-tests/batch/many-0786.txtobject-tests/batch/many-0787.txtobject-tests/batch/many-0788.txtobject-tests/batch/many-0789.txtobject-tests/batch/many-0790.txtobject-tests/batch/many-0791.txtobject-tests/batch/many-0792.txtobject-tests/batch/many-0793.txtobject-tests/batch/many-0794.txtobject-tests/batch/many-0795.txtobject-tests/batch/many-0796.txtobject-tests/batch/many-0797.txtobject-tests/batch/many-0798.txtobject-tests/batch/many-0799.txtobject-tests/batch/many-0800.txtobject-tests/batch/many-0801.txtobject-tests/batch/many-0802.txtobject-tests/batch/many-0803.txtobject-tests/batch/many-0804.txtobject-tests/batch/many-0805.txtobject-tests/batch/many-0806.txtobject-tests/batch/many-0807.txtobject-tests/batch/many-0808.txtobject-tests/batch/many-0809.txtobject-tests/batch/many-0810.txtobject-tests/batch/many-0811.txtobject-tests/batch/many-0812.txtobject-tests/batch/many-0813.txtobject-tests/batch/many-0814.txtobject-tests/batch/many-0815.txtobject-tests/batch/many-0816.txtobject-tests/batch/many-0817.txtobject-tests/batch/many-0818.txtobject-tests/batch/many-0819.txtobject-tests/batch/many-0820.txtobject-tests/batch/many-0821.txtobject-tests/batch/many-0822.txtobject-tests/batch/many-0823.txtobject-tests/batch/many-0824.txtobject-tests/batch/many-0825.txtobject-tests/batch/many-0826.txtobject-tests/batch/many-0827.txtobject-tests/batch/many-0828.txtobject-tests/batch/many-0829.txtobject-tests/batch/many-0830.txtobject-tests/batch/many-0831.txtobject-tests/batch/many-0832.txtobject-tests/batch/many-0833.txtobject-tests/batch/many-0834.txtobject-tests/batch/many-0835.txtobject-tests/batch/many-0836.txtobject-tests/batch/many-0837.txtobject-tests/batch/many-0838.txtobject-tests/batch/many-0839.txtobject-tests/batch/many-0840.txtobject-tests/batch/many-0841.txtobject-tests/batch/many-0842.txtobject-tests/batch/many-0843.txtobject-tests/batch/many-0844.txtobject-tests/batch/many-0845.txtobject-tests/batch/many-0846.txtobject-tests/batch/many-0847.txtobject-tests/batch/many-0848.txtobject-tests/batch/many-0849.txtobject-tests/batch/many-0850.txtobject-tests/batch/many-0851.txtobject-tests/batch/many-0852.txtobject-tests/batch/many-0853.txtobject-tests/batch/many-0854.txtobject-tests/batch/many-0855.txtobject-tests/batch/many-0856.txtobject-tests/batch/many-0857.txtobject-tests/batch/many-0858.txtobject-tests/batch/many-0859.txtobject-tests/batch/many-0860.txtobject-tests/batch/many-0861.txtobject-tests/batch/many-0862.txtobject-tests/batch/many-0863.txtobject-tests/batch/many-0864.txtobject-tests/batch/many-0865.txtobject-tests/batch/many-0866.txtobject-tests/batch/many-0867.txtobject-tests/batch/many-0868.txtobject-tests/batch/many-0869.txtobject-tests/batch/many-0870.txtobject-tests/batch/many-0871.txtobject-tests/batch/many-0872.txtobject-tests/batch/many-0873.txtobject-tests/batch/many-0874.txtobject-tests/batch/many-0875.txtobject-tests/batch/many-0876.txtobject-tests/batch/many-0877.txtobject-tests/batch/many-0878.txtobject-tests/batch/many-0879.txtobject-tests/batch/many-0880.txtobject-tests/batch/many-0881.txtobject-tests/batch/many-0882.txtobject-tests/batch/many-0883.txtobject-tests/batch/many-0884.txtobject-tests/batch/many-0885.txtobject-tests/batch/many-0886.txtobject-tests/batch/many-0887.txtobject-tests/batch/many-0888.txtobject-tests/batch/many-0889.txtobject-tests/batch/many-0890.txtobject-tests/batch/many-0891.txtobject-tests/batch/many-0892.txtobject-tests/batch/many-0893.txtobject-tests/batch/many-0894.txtobject-tests/batch/many-0895.txtobject-tests/batch/many-0896.txtobject-tests/batch/many-0897.txtobject-tests/batch/many-0898.txtobject-tests/batch/many-0899.txtobject-tests/batch/many-0900.txtobject-tests/batch/many-0901.txtobject-tests/batch/many-0902.txtobject-tests/batch/many-0903.txtobject-tests/batch/many-0904.txtobject-tests/batch/many-0905.txtobject-tests/batch/many-0906.txtobject-tests/batch/many-0907.txtobject-tests/batch/many-0908.txtobject-tests/batch/many-0909.txtobject-tests/batch/many-0910.txtobject-tests/batch/many-0911.txtobject-tests/batch/many-0912.txtobject-tests/batch/many-0913.txtobject-tests/batch/many-0914.txtobject-tests/batch/many-0915.txtobject-tests/batch/many-0916.txtobject-tests/batch/many-0917.txtobject-tests/batch/many-0918.txtobject-tests/batch/many-0919.txtobject-tests/batch/many-0920.txtobject-tests/batch/many-0921.txtobject-tests/batch/many-0922.txtobject-tests/batch/many-0923.txtobject-tests/batch/many-0924.txtobject-tests/batch/many-0925.txtobject-tests/batch/many-0926.txtobject-tests/batch/many-0927.txtobject-tests/batch/many-0928.txtobject-tests/batch/many-0929.txtobject-tests/batch/many-0930.txtobject-tests/batch/many-0931.txtobject-tests/batch/many-0932.txtobject-tests/batch/many-0933.txtobject-tests/batch/many-0934.txtobject-tests/batch/many-0935.txtobject-tests/batch/many-0936.txtobject-tests/batch/many-0937.txtobject-tests/batch/many-0938.txtobject-tests/batch/many-0939.txtobject-tests/batch/many-0940.txtobject-tests/batch/many-0941.txtobject-tests/batch/many-0942.txtobject-tests/batch/many-0943.txtobject-tests/batch/many-0944.txtobject-tests/batch/many-0945.txtobject-tests/batch/many-0946.txtobject-tests/batch/many-0947.txtobject-tests/batch/many-0948.txtobject-tests/batch/many-0949.txtobject-tests/batch/many-0950.txtobject-tests/batch/many-0951.txtobject-tests/batch/many-0952.txtobject-tests/batch/many-0953.txtobject-tests/batch/many-0954.txtobject-tests/batch/many-0955.txtobject-tests/batch/many-0956.txtobject-tests/batch/many-0957.txtobject-tests/batch/many-0958.txtobject-tests/batch/many-0959.txtobject-tests/batch/many-0960.txtobject-tests/batch/many-0961.txtobject-tests/batch/many-0962.txtobject-tests/batch/many-0963.txtobject-tests/batch/many-0964.txtobject-tests/batch/many-0965.txtobject-tests/batch/many-0966.txtobject-tests/batch/many-0967.txtobject-tests/batch/many-0968.txtobject-tests/batch/many-0969.txtobject-tests/batch/many-0970.txtobject-tests/batch/many-0971.txtobject-tests/batch/many-0972.txtobject-tests/batch/many-0973.txtobject-tests/batch/many-0974.txtobject-tests/batch/many-0975.txtobject-tests/batch/many-0976.txtobject-tests/batch/many-0977.txtobject-tests/batch/many-0978.txtobject-tests/batch/many-0979.txtobject-tests/batch/many-0980.txtobject-tests/batch/many-0981.txtobject-tests/batch/many-0982.txtobject-tests/batch/many-0983.txtobject-tests/batch/many-0984.txtobject-tests/batch/many-0985.txtobject-tests/batch/many-0986.txtobject-tests/batch/many-0987.txtobject-tests/batch/many-0988.txtobject-tests/batch/many-0989.txtobject-tests/batch/many-0990.txtobject-tests/batch/many-0991.txtobject-tests/batch/many-0992.txtobject-tests/batch/many-0993.txtobject-tests/batch/many-0994.txtobject-tests/batch/many-0995.txtobject-tests/batch/many-0996.txtobject-tests/batch/many-0997.txtobject-tests/batch/many-0998.txtobject-tests/batch/many-0999.txtobject-tests/batch/many-1000.txt" + } + }, + { + "at": "/query/delete", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/x-amz-checksum-crc64nvme", + "optional": false, + "rule": { + "is": "matches", + "pattern": "[A-Za-z0-9+/]{11}=" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "", + "optional": false, + "rule": { + "is": "body_checksum", + "header": "x-amz-checksum-crc64nvme", + "algorithm": "crc64nvme" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nMalformedXMLFixture error" + }, + "framing": "chunked" + } + } + ] + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "MalformedXML" + } + } + ], + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "keys" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "MalformedXML" + } + } + ] + }, + { + "id": "operations/s3-express/delete-slow-down", + "profile": "s3-express", + "lane": "core", + "purpose": "Report a 503 SlowDown answer as an error, after at most 5 retries", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" + ], + "origin": "transient", + "call": { + "key": "object-tests/remove/present.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/present.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 503 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "SlowDown" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/delete-if-match-current", + "profile": "s3-express", + "lane": "core", + "purpose": "delete if match current", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "if_match": "\"fixture-137dbea0e0a1\"", + "key": "object-tests/remove/conditional.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/conditional.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-137dbea0e0a1\"" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 204, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/delete-missing", + "profile": "s3-express", + "lane": "core", + "purpose": "delete missing", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/remove/absent.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/absent.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 204, + "headers": { + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/delete-precondition-failed", + "profile": "s3-express", + "lane": "core", + "purpose": "delete precondition failed", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "if_match": "\"fixture-db71b2c0257c\"", + "key": "object-tests/remove/conditional.txt", + "op": "delete" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "DELETE" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/remove/conditional.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 412, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nPreconditionFailedFixture error" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "PreconditionFailed" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/get-before-commit", + "profile": "s3-express", + "lane": "core", + "purpose": "get before commit", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/multipart/object.bin", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/multipart/object.bin" } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -165758,121 +175071,99 @@ "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, { "at": "/headers/authorization", "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 404, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nNoSuchKeyFixture error" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/multipart/object.bin" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "absent" + "is": "equal", + "value": "fixture-session-token" } - } - ], - "then": [ + }, { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "POST" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/" - } - }, - { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "object-tests/batch/many-0000.txtobject-tests/batch/many-0001.txtobject-tests/batch/many-0002.txtobject-tests/batch/many-0003.txtobject-tests/batch/many-0004.txtobject-tests/batch/many-0005.txtobject-tests/batch/many-0006.txtobject-tests/batch/many-0007.txtobject-tests/batch/many-0008.txtobject-tests/batch/many-0009.txtobject-tests/batch/many-0010.txtobject-tests/batch/many-0011.txtobject-tests/batch/many-0012.txtobject-tests/batch/many-0013.txtobject-tests/batch/many-0014.txtobject-tests/batch/many-0015.txtobject-tests/batch/many-0016.txtobject-tests/batch/many-0017.txtobject-tests/batch/many-0018.txtobject-tests/batch/many-0019.txtobject-tests/batch/many-0020.txtobject-tests/batch/many-0021.txtobject-tests/batch/many-0022.txtobject-tests/batch/many-0023.txtobject-tests/batch/many-0024.txtobject-tests/batch/many-0025.txtobject-tests/batch/many-0026.txtobject-tests/batch/many-0027.txtobject-tests/batch/many-0028.txtobject-tests/batch/many-0029.txtobject-tests/batch/many-0030.txtobject-tests/batch/many-0031.txtobject-tests/batch/many-0032.txtobject-tests/batch/many-0033.txtobject-tests/batch/many-0034.txtobject-tests/batch/many-0035.txtobject-tests/batch/many-0036.txtobject-tests/batch/many-0037.txtobject-tests/batch/many-0038.txtobject-tests/batch/many-0039.txtobject-tests/batch/many-0040.txtobject-tests/batch/many-0041.txtobject-tests/batch/many-0042.txtobject-tests/batch/many-0043.txtobject-tests/batch/many-0044.txtobject-tests/batch/many-0045.txtobject-tests/batch/many-0046.txtobject-tests/batch/many-0047.txtobject-tests/batch/many-0048.txtobject-tests/batch/many-0049.txtobject-tests/batch/many-0050.txtobject-tests/batch/many-0051.txtobject-tests/batch/many-0052.txtobject-tests/batch/many-0053.txtobject-tests/batch/many-0054.txtobject-tests/batch/many-0055.txtobject-tests/batch/many-0056.txtobject-tests/batch/many-0057.txtobject-tests/batch/many-0058.txtobject-tests/batch/many-0059.txtobject-tests/batch/many-0060.txtobject-tests/batch/many-0061.txtobject-tests/batch/many-0062.txtobject-tests/batch/many-0063.txtobject-tests/batch/many-0064.txtobject-tests/batch/many-0065.txtobject-tests/batch/many-0066.txtobject-tests/batch/many-0067.txtobject-tests/batch/many-0068.txtobject-tests/batch/many-0069.txtobject-tests/batch/many-0070.txtobject-tests/batch/many-0071.txtobject-tests/batch/many-0072.txtobject-tests/batch/many-0073.txtobject-tests/batch/many-0074.txtobject-tests/batch/many-0075.txtobject-tests/batch/many-0076.txtobject-tests/batch/many-0077.txtobject-tests/batch/many-0078.txtobject-tests/batch/many-0079.txtobject-tests/batch/many-0080.txtobject-tests/batch/many-0081.txtobject-tests/batch/many-0082.txtobject-tests/batch/many-0083.txtobject-tests/batch/many-0084.txtobject-tests/batch/many-0085.txtobject-tests/batch/many-0086.txtobject-tests/batch/many-0087.txtobject-tests/batch/many-0088.txtobject-tests/batch/many-0089.txtobject-tests/batch/many-0090.txtobject-tests/batch/many-0091.txtobject-tests/batch/many-0092.txtobject-tests/batch/many-0093.txtobject-tests/batch/many-0094.txtobject-tests/batch/many-0095.txtobject-tests/batch/many-0096.txtobject-tests/batch/many-0097.txtobject-tests/batch/many-0098.txtobject-tests/batch/many-0099.txtobject-tests/batch/many-0100.txtobject-tests/batch/many-0101.txtobject-tests/batch/many-0102.txtobject-tests/batch/many-0103.txtobject-tests/batch/many-0104.txtobject-tests/batch/many-0105.txtobject-tests/batch/many-0106.txtobject-tests/batch/many-0107.txtobject-tests/batch/many-0108.txtobject-tests/batch/many-0109.txtobject-tests/batch/many-0110.txtobject-tests/batch/many-0111.txtobject-tests/batch/many-0112.txtobject-tests/batch/many-0113.txtobject-tests/batch/many-0114.txtobject-tests/batch/many-0115.txtobject-tests/batch/many-0116.txtobject-tests/batch/many-0117.txtobject-tests/batch/many-0118.txtobject-tests/batch/many-0119.txtobject-tests/batch/many-0120.txtobject-tests/batch/many-0121.txtobject-tests/batch/many-0122.txtobject-tests/batch/many-0123.txtobject-tests/batch/many-0124.txtobject-tests/batch/many-0125.txtobject-tests/batch/many-0126.txtobject-tests/batch/many-0127.txtobject-tests/batch/many-0128.txtobject-tests/batch/many-0129.txtobject-tests/batch/many-0130.txtobject-tests/batch/many-0131.txtobject-tests/batch/many-0132.txtobject-tests/batch/many-0133.txtobject-tests/batch/many-0134.txtobject-tests/batch/many-0135.txtobject-tests/batch/many-0136.txtobject-tests/batch/many-0137.txtobject-tests/batch/many-0138.txtobject-tests/batch/many-0139.txtobject-tests/batch/many-0140.txtobject-tests/batch/many-0141.txtobject-tests/batch/many-0142.txtobject-tests/batch/many-0143.txtobject-tests/batch/many-0144.txtobject-tests/batch/many-0145.txtobject-tests/batch/many-0146.txtobject-tests/batch/many-0147.txtobject-tests/batch/many-0148.txtobject-tests/batch/many-0149.txtobject-tests/batch/many-0150.txtobject-tests/batch/many-0151.txtobject-tests/batch/many-0152.txtobject-tests/batch/many-0153.txtobject-tests/batch/many-0154.txtobject-tests/batch/many-0155.txtobject-tests/batch/many-0156.txtobject-tests/batch/many-0157.txtobject-tests/batch/many-0158.txtobject-tests/batch/many-0159.txtobject-tests/batch/many-0160.txtobject-tests/batch/many-0161.txtobject-tests/batch/many-0162.txtobject-tests/batch/many-0163.txtobject-tests/batch/many-0164.txtobject-tests/batch/many-0165.txtobject-tests/batch/many-0166.txtobject-tests/batch/many-0167.txtobject-tests/batch/many-0168.txtobject-tests/batch/many-0169.txtobject-tests/batch/many-0170.txtobject-tests/batch/many-0171.txtobject-tests/batch/many-0172.txtobject-tests/batch/many-0173.txtobject-tests/batch/many-0174.txtobject-tests/batch/many-0175.txtobject-tests/batch/many-0176.txtobject-tests/batch/many-0177.txtobject-tests/batch/many-0178.txtobject-tests/batch/many-0179.txtobject-tests/batch/many-0180.txtobject-tests/batch/many-0181.txtobject-tests/batch/many-0182.txtobject-tests/batch/many-0183.txtobject-tests/batch/many-0184.txtobject-tests/batch/many-0185.txtobject-tests/batch/many-0186.txtobject-tests/batch/many-0187.txtobject-tests/batch/many-0188.txtobject-tests/batch/many-0189.txtobject-tests/batch/many-0190.txtobject-tests/batch/many-0191.txtobject-tests/batch/many-0192.txtobject-tests/batch/many-0193.txtobject-tests/batch/many-0194.txtobject-tests/batch/many-0195.txtobject-tests/batch/many-0196.txtobject-tests/batch/many-0197.txtobject-tests/batch/many-0198.txtobject-tests/batch/many-0199.txtobject-tests/batch/many-0200.txtobject-tests/batch/many-0201.txtobject-tests/batch/many-0202.txtobject-tests/batch/many-0203.txtobject-tests/batch/many-0204.txtobject-tests/batch/many-0205.txtobject-tests/batch/many-0206.txtobject-tests/batch/many-0207.txtobject-tests/batch/many-0208.txtobject-tests/batch/many-0209.txtobject-tests/batch/many-0210.txtobject-tests/batch/many-0211.txtobject-tests/batch/many-0212.txtobject-tests/batch/many-0213.txtobject-tests/batch/many-0214.txtobject-tests/batch/many-0215.txtobject-tests/batch/many-0216.txtobject-tests/batch/many-0217.txtobject-tests/batch/many-0218.txtobject-tests/batch/many-0219.txtobject-tests/batch/many-0220.txtobject-tests/batch/many-0221.txtobject-tests/batch/many-0222.txtobject-tests/batch/many-0223.txtobject-tests/batch/many-0224.txtobject-tests/batch/many-0225.txtobject-tests/batch/many-0226.txtobject-tests/batch/many-0227.txtobject-tests/batch/many-0228.txtobject-tests/batch/many-0229.txtobject-tests/batch/many-0230.txtobject-tests/batch/many-0231.txtobject-tests/batch/many-0232.txtobject-tests/batch/many-0233.txtobject-tests/batch/many-0234.txtobject-tests/batch/many-0235.txtobject-tests/batch/many-0236.txtobject-tests/batch/many-0237.txtobject-tests/batch/many-0238.txtobject-tests/batch/many-0239.txtobject-tests/batch/many-0240.txtobject-tests/batch/many-0241.txtobject-tests/batch/many-0242.txtobject-tests/batch/many-0243.txtobject-tests/batch/many-0244.txtobject-tests/batch/many-0245.txtobject-tests/batch/many-0246.txtobject-tests/batch/many-0247.txtobject-tests/batch/many-0248.txtobject-tests/batch/many-0249.txtobject-tests/batch/many-0250.txtobject-tests/batch/many-0251.txtobject-tests/batch/many-0252.txtobject-tests/batch/many-0253.txtobject-tests/batch/many-0254.txtobject-tests/batch/many-0255.txtobject-tests/batch/many-0256.txtobject-tests/batch/many-0257.txtobject-tests/batch/many-0258.txtobject-tests/batch/many-0259.txtobject-tests/batch/many-0260.txtobject-tests/batch/many-0261.txtobject-tests/batch/many-0262.txtobject-tests/batch/many-0263.txtobject-tests/batch/many-0264.txtobject-tests/batch/many-0265.txtobject-tests/batch/many-0266.txtobject-tests/batch/many-0267.txtobject-tests/batch/many-0268.txtobject-tests/batch/many-0269.txtobject-tests/batch/many-0270.txtobject-tests/batch/many-0271.txtobject-tests/batch/many-0272.txtobject-tests/batch/many-0273.txtobject-tests/batch/many-0274.txtobject-tests/batch/many-0275.txtobject-tests/batch/many-0276.txtobject-tests/batch/many-0277.txtobject-tests/batch/many-0278.txtobject-tests/batch/many-0279.txtobject-tests/batch/many-0280.txtobject-tests/batch/many-0281.txtobject-tests/batch/many-0282.txtobject-tests/batch/many-0283.txtobject-tests/batch/many-0284.txtobject-tests/batch/many-0285.txtobject-tests/batch/many-0286.txtobject-tests/batch/many-0287.txtobject-tests/batch/many-0288.txtobject-tests/batch/many-0289.txtobject-tests/batch/many-0290.txtobject-tests/batch/many-0291.txtobject-tests/batch/many-0292.txtobject-tests/batch/many-0293.txtobject-tests/batch/many-0294.txtobject-tests/batch/many-0295.txtobject-tests/batch/many-0296.txtobject-tests/batch/many-0297.txtobject-tests/batch/many-0298.txtobject-tests/batch/many-0299.txtobject-tests/batch/many-0300.txtobject-tests/batch/many-0301.txtobject-tests/batch/many-0302.txtobject-tests/batch/many-0303.txtobject-tests/batch/many-0304.txtobject-tests/batch/many-0305.txtobject-tests/batch/many-0306.txtobject-tests/batch/many-0307.txtobject-tests/batch/many-0308.txtobject-tests/batch/many-0309.txtobject-tests/batch/many-0310.txtobject-tests/batch/many-0311.txtobject-tests/batch/many-0312.txtobject-tests/batch/many-0313.txtobject-tests/batch/many-0314.txtobject-tests/batch/many-0315.txtobject-tests/batch/many-0316.txtobject-tests/batch/many-0317.txtobject-tests/batch/many-0318.txtobject-tests/batch/many-0319.txtobject-tests/batch/many-0320.txtobject-tests/batch/many-0321.txtobject-tests/batch/many-0322.txtobject-tests/batch/many-0323.txtobject-tests/batch/many-0324.txtobject-tests/batch/many-0325.txtobject-tests/batch/many-0326.txtobject-tests/batch/many-0327.txtobject-tests/batch/many-0328.txtobject-tests/batch/many-0329.txtobject-tests/batch/many-0330.txtobject-tests/batch/many-0331.txtobject-tests/batch/many-0332.txtobject-tests/batch/many-0333.txtobject-tests/batch/many-0334.txtobject-tests/batch/many-0335.txtobject-tests/batch/many-0336.txtobject-tests/batch/many-0337.txtobject-tests/batch/many-0338.txtobject-tests/batch/many-0339.txtobject-tests/batch/many-0340.txtobject-tests/batch/many-0341.txtobject-tests/batch/many-0342.txtobject-tests/batch/many-0343.txtobject-tests/batch/many-0344.txtobject-tests/batch/many-0345.txtobject-tests/batch/many-0346.txtobject-tests/batch/many-0347.txtobject-tests/batch/many-0348.txtobject-tests/batch/many-0349.txtobject-tests/batch/many-0350.txtobject-tests/batch/many-0351.txtobject-tests/batch/many-0352.txtobject-tests/batch/many-0353.txtobject-tests/batch/many-0354.txtobject-tests/batch/many-0355.txtobject-tests/batch/many-0356.txtobject-tests/batch/many-0357.txtobject-tests/batch/many-0358.txtobject-tests/batch/many-0359.txtobject-tests/batch/many-0360.txtobject-tests/batch/many-0361.txtobject-tests/batch/many-0362.txtobject-tests/batch/many-0363.txtobject-tests/batch/many-0364.txtobject-tests/batch/many-0365.txtobject-tests/batch/many-0366.txtobject-tests/batch/many-0367.txtobject-tests/batch/many-0368.txtobject-tests/batch/many-0369.txtobject-tests/batch/many-0370.txtobject-tests/batch/many-0371.txtobject-tests/batch/many-0372.txtobject-tests/batch/many-0373.txtobject-tests/batch/many-0374.txtobject-tests/batch/many-0375.txtobject-tests/batch/many-0376.txtobject-tests/batch/many-0377.txtobject-tests/batch/many-0378.txtobject-tests/batch/many-0379.txtobject-tests/batch/many-0380.txtobject-tests/batch/many-0381.txtobject-tests/batch/many-0382.txtobject-tests/batch/many-0383.txtobject-tests/batch/many-0384.txtobject-tests/batch/many-0385.txtobject-tests/batch/many-0386.txtobject-tests/batch/many-0387.txtobject-tests/batch/many-0388.txtobject-tests/batch/many-0389.txtobject-tests/batch/many-0390.txtobject-tests/batch/many-0391.txtobject-tests/batch/many-0392.txtobject-tests/batch/many-0393.txtobject-tests/batch/many-0394.txtobject-tests/batch/many-0395.txtobject-tests/batch/many-0396.txtobject-tests/batch/many-0397.txtobject-tests/batch/many-0398.txtobject-tests/batch/many-0399.txtobject-tests/batch/many-0400.txtobject-tests/batch/many-0401.txtobject-tests/batch/many-0402.txtobject-tests/batch/many-0403.txtobject-tests/batch/many-0404.txtobject-tests/batch/many-0405.txtobject-tests/batch/many-0406.txtobject-tests/batch/many-0407.txtobject-tests/batch/many-0408.txtobject-tests/batch/many-0409.txtobject-tests/batch/many-0410.txtobject-tests/batch/many-0411.txtobject-tests/batch/many-0412.txtobject-tests/batch/many-0413.txtobject-tests/batch/many-0414.txtobject-tests/batch/many-0415.txtobject-tests/batch/many-0416.txtobject-tests/batch/many-0417.txtobject-tests/batch/many-0418.txtobject-tests/batch/many-0419.txtobject-tests/batch/many-0420.txtobject-tests/batch/many-0421.txtobject-tests/batch/many-0422.txtobject-tests/batch/many-0423.txtobject-tests/batch/many-0424.txtobject-tests/batch/many-0425.txtobject-tests/batch/many-0426.txtobject-tests/batch/many-0427.txtobject-tests/batch/many-0428.txtobject-tests/batch/many-0429.txtobject-tests/batch/many-0430.txtobject-tests/batch/many-0431.txtobject-tests/batch/many-0432.txtobject-tests/batch/many-0433.txtobject-tests/batch/many-0434.txtobject-tests/batch/many-0435.txtobject-tests/batch/many-0436.txtobject-tests/batch/many-0437.txtobject-tests/batch/many-0438.txtobject-tests/batch/many-0439.txtobject-tests/batch/many-0440.txtobject-tests/batch/many-0441.txtobject-tests/batch/many-0442.txtobject-tests/batch/many-0443.txtobject-tests/batch/many-0444.txtobject-tests/batch/many-0445.txtobject-tests/batch/many-0446.txtobject-tests/batch/many-0447.txtobject-tests/batch/many-0448.txtobject-tests/batch/many-0449.txtobject-tests/batch/many-0450.txtobject-tests/batch/many-0451.txtobject-tests/batch/many-0452.txtobject-tests/batch/many-0453.txtobject-tests/batch/many-0454.txtobject-tests/batch/many-0455.txtobject-tests/batch/many-0456.txtobject-tests/batch/many-0457.txtobject-tests/batch/many-0458.txtobject-tests/batch/many-0459.txtobject-tests/batch/many-0460.txtobject-tests/batch/many-0461.txtobject-tests/batch/many-0462.txtobject-tests/batch/many-0463.txtobject-tests/batch/many-0464.txtobject-tests/batch/many-0465.txtobject-tests/batch/many-0466.txtobject-tests/batch/many-0467.txtobject-tests/batch/many-0468.txtobject-tests/batch/many-0469.txtobject-tests/batch/many-0470.txtobject-tests/batch/many-0471.txtobject-tests/batch/many-0472.txtobject-tests/batch/many-0473.txtobject-tests/batch/many-0474.txtobject-tests/batch/many-0475.txtobject-tests/batch/many-0476.txtobject-tests/batch/many-0477.txtobject-tests/batch/many-0478.txtobject-tests/batch/many-0479.txtobject-tests/batch/many-0480.txtobject-tests/batch/many-0481.txtobject-tests/batch/many-0482.txtobject-tests/batch/many-0483.txtobject-tests/batch/many-0484.txtobject-tests/batch/many-0485.txtobject-tests/batch/many-0486.txtobject-tests/batch/many-0487.txtobject-tests/batch/many-0488.txtobject-tests/batch/many-0489.txtobject-tests/batch/many-0490.txtobject-tests/batch/many-0491.txtobject-tests/batch/many-0492.txtobject-tests/batch/many-0493.txtobject-tests/batch/many-0494.txtobject-tests/batch/many-0495.txtobject-tests/batch/many-0496.txtobject-tests/batch/many-0497.txtobject-tests/batch/many-0498.txtobject-tests/batch/many-0499.txtobject-tests/batch/many-0500.txtobject-tests/batch/many-0501.txtobject-tests/batch/many-0502.txtobject-tests/batch/many-0503.txtobject-tests/batch/many-0504.txtobject-tests/batch/many-0505.txtobject-tests/batch/many-0506.txtobject-tests/batch/many-0507.txtobject-tests/batch/many-0508.txtobject-tests/batch/many-0509.txtobject-tests/batch/many-0510.txtobject-tests/batch/many-0511.txtobject-tests/batch/many-0512.txtobject-tests/batch/many-0513.txtobject-tests/batch/many-0514.txtobject-tests/batch/many-0515.txtobject-tests/batch/many-0516.txtobject-tests/batch/many-0517.txtobject-tests/batch/many-0518.txtobject-tests/batch/many-0519.txtobject-tests/batch/many-0520.txtobject-tests/batch/many-0521.txtobject-tests/batch/many-0522.txtobject-tests/batch/many-0523.txtobject-tests/batch/many-0524.txtobject-tests/batch/many-0525.txtobject-tests/batch/many-0526.txtobject-tests/batch/many-0527.txtobject-tests/batch/many-0528.txtobject-tests/batch/many-0529.txtobject-tests/batch/many-0530.txtobject-tests/batch/many-0531.txtobject-tests/batch/many-0532.txtobject-tests/batch/many-0533.txtobject-tests/batch/many-0534.txtobject-tests/batch/many-0535.txtobject-tests/batch/many-0536.txtobject-tests/batch/many-0537.txtobject-tests/batch/many-0538.txtobject-tests/batch/many-0539.txtobject-tests/batch/many-0540.txtobject-tests/batch/many-0541.txtobject-tests/batch/many-0542.txtobject-tests/batch/many-0543.txtobject-tests/batch/many-0544.txtobject-tests/batch/many-0545.txtobject-tests/batch/many-0546.txtobject-tests/batch/many-0547.txtobject-tests/batch/many-0548.txtobject-tests/batch/many-0549.txtobject-tests/batch/many-0550.txtobject-tests/batch/many-0551.txtobject-tests/batch/many-0552.txtobject-tests/batch/many-0553.txtobject-tests/batch/many-0554.txtobject-tests/batch/many-0555.txtobject-tests/batch/many-0556.txtobject-tests/batch/many-0557.txtobject-tests/batch/many-0558.txtobject-tests/batch/many-0559.txtobject-tests/batch/many-0560.txtobject-tests/batch/many-0561.txtobject-tests/batch/many-0562.txtobject-tests/batch/many-0563.txtobject-tests/batch/many-0564.txtobject-tests/batch/many-0565.txtobject-tests/batch/many-0566.txtobject-tests/batch/many-0567.txtobject-tests/batch/many-0568.txtobject-tests/batch/many-0569.txtobject-tests/batch/many-0570.txtobject-tests/batch/many-0571.txtobject-tests/batch/many-0572.txtobject-tests/batch/many-0573.txtobject-tests/batch/many-0574.txtobject-tests/batch/many-0575.txtobject-tests/batch/many-0576.txtobject-tests/batch/many-0577.txtobject-tests/batch/many-0578.txtobject-tests/batch/many-0579.txtobject-tests/batch/many-0580.txtobject-tests/batch/many-0581.txtobject-tests/batch/many-0582.txtobject-tests/batch/many-0583.txtobject-tests/batch/many-0584.txtobject-tests/batch/many-0585.txtobject-tests/batch/many-0586.txtobject-tests/batch/many-0587.txtobject-tests/batch/many-0588.txtobject-tests/batch/many-0589.txtobject-tests/batch/many-0590.txtobject-tests/batch/many-0591.txtobject-tests/batch/many-0592.txtobject-tests/batch/many-0593.txtobject-tests/batch/many-0594.txtobject-tests/batch/many-0595.txtobject-tests/batch/many-0596.txtobject-tests/batch/many-0597.txtobject-tests/batch/many-0598.txtobject-tests/batch/many-0599.txtobject-tests/batch/many-0600.txtobject-tests/batch/many-0601.txtobject-tests/batch/many-0602.txtobject-tests/batch/many-0603.txtobject-tests/batch/many-0604.txtobject-tests/batch/many-0605.txtobject-tests/batch/many-0606.txtobject-tests/batch/many-0607.txtobject-tests/batch/many-0608.txtobject-tests/batch/many-0609.txtobject-tests/batch/many-0610.txtobject-tests/batch/many-0611.txtobject-tests/batch/many-0612.txtobject-tests/batch/many-0613.txtobject-tests/batch/many-0614.txtobject-tests/batch/many-0615.txtobject-tests/batch/many-0616.txtobject-tests/batch/many-0617.txtobject-tests/batch/many-0618.txtobject-tests/batch/many-0619.txtobject-tests/batch/many-0620.txtobject-tests/batch/many-0621.txtobject-tests/batch/many-0622.txtobject-tests/batch/many-0623.txtobject-tests/batch/many-0624.txtobject-tests/batch/many-0625.txtobject-tests/batch/many-0626.txtobject-tests/batch/many-0627.txtobject-tests/batch/many-0628.txtobject-tests/batch/many-0629.txtobject-tests/batch/many-0630.txtobject-tests/batch/many-0631.txtobject-tests/batch/many-0632.txtobject-tests/batch/many-0633.txtobject-tests/batch/many-0634.txtobject-tests/batch/many-0635.txtobject-tests/batch/many-0636.txtobject-tests/batch/many-0637.txtobject-tests/batch/many-0638.txtobject-tests/batch/many-0639.txtobject-tests/batch/many-0640.txtobject-tests/batch/many-0641.txtobject-tests/batch/many-0642.txtobject-tests/batch/many-0643.txtobject-tests/batch/many-0644.txtobject-tests/batch/many-0645.txtobject-tests/batch/many-0646.txtobject-tests/batch/many-0647.txtobject-tests/batch/many-0648.txtobject-tests/batch/many-0649.txtobject-tests/batch/many-0650.txtobject-tests/batch/many-0651.txtobject-tests/batch/many-0652.txtobject-tests/batch/many-0653.txtobject-tests/batch/many-0654.txtobject-tests/batch/many-0655.txtobject-tests/batch/many-0656.txtobject-tests/batch/many-0657.txtobject-tests/batch/many-0658.txtobject-tests/batch/many-0659.txtobject-tests/batch/many-0660.txtobject-tests/batch/many-0661.txtobject-tests/batch/many-0662.txtobject-tests/batch/many-0663.txtobject-tests/batch/many-0664.txtobject-tests/batch/many-0665.txtobject-tests/batch/many-0666.txtobject-tests/batch/many-0667.txtobject-tests/batch/many-0668.txtobject-tests/batch/many-0669.txtobject-tests/batch/many-0670.txtobject-tests/batch/many-0671.txtobject-tests/batch/many-0672.txtobject-tests/batch/many-0673.txtobject-tests/batch/many-0674.txtobject-tests/batch/many-0675.txtobject-tests/batch/many-0676.txtobject-tests/batch/many-0677.txtobject-tests/batch/many-0678.txtobject-tests/batch/many-0679.txtobject-tests/batch/many-0680.txtobject-tests/batch/many-0681.txtobject-tests/batch/many-0682.txtobject-tests/batch/many-0683.txtobject-tests/batch/many-0684.txtobject-tests/batch/many-0685.txtobject-tests/batch/many-0686.txtobject-tests/batch/many-0687.txtobject-tests/batch/many-0688.txtobject-tests/batch/many-0689.txtobject-tests/batch/many-0690.txtobject-tests/batch/many-0691.txtobject-tests/batch/many-0692.txtobject-tests/batch/many-0693.txtobject-tests/batch/many-0694.txtobject-tests/batch/many-0695.txtobject-tests/batch/many-0696.txtobject-tests/batch/many-0697.txtobject-tests/batch/many-0698.txtobject-tests/batch/many-0699.txtobject-tests/batch/many-0700.txtobject-tests/batch/many-0701.txtobject-tests/batch/many-0702.txtobject-tests/batch/many-0703.txtobject-tests/batch/many-0704.txtobject-tests/batch/many-0705.txtobject-tests/batch/many-0706.txtobject-tests/batch/many-0707.txtobject-tests/batch/many-0708.txtobject-tests/batch/many-0709.txtobject-tests/batch/many-0710.txtobject-tests/batch/many-0711.txtobject-tests/batch/many-0712.txtobject-tests/batch/many-0713.txtobject-tests/batch/many-0714.txtobject-tests/batch/many-0715.txtobject-tests/batch/many-0716.txtobject-tests/batch/many-0717.txtobject-tests/batch/many-0718.txtobject-tests/batch/many-0719.txtobject-tests/batch/many-0720.txtobject-tests/batch/many-0721.txtobject-tests/batch/many-0722.txtobject-tests/batch/many-0723.txtobject-tests/batch/many-0724.txtobject-tests/batch/many-0725.txtobject-tests/batch/many-0726.txtobject-tests/batch/many-0727.txtobject-tests/batch/many-0728.txtobject-tests/batch/many-0729.txtobject-tests/batch/many-0730.txtobject-tests/batch/many-0731.txtobject-tests/batch/many-0732.txtobject-tests/batch/many-0733.txtobject-tests/batch/many-0734.txtobject-tests/batch/many-0735.txtobject-tests/batch/many-0736.txtobject-tests/batch/many-0737.txtobject-tests/batch/many-0738.txtobject-tests/batch/many-0739.txtobject-tests/batch/many-0740.txtobject-tests/batch/many-0741.txtobject-tests/batch/many-0742.txtobject-tests/batch/many-0743.txtobject-tests/batch/many-0744.txtobject-tests/batch/many-0745.txtobject-tests/batch/many-0746.txtobject-tests/batch/many-0747.txtobject-tests/batch/many-0748.txtobject-tests/batch/many-0749.txtobject-tests/batch/many-0750.txtobject-tests/batch/many-0751.txtobject-tests/batch/many-0752.txtobject-tests/batch/many-0753.txtobject-tests/batch/many-0754.txtobject-tests/batch/many-0755.txtobject-tests/batch/many-0756.txtobject-tests/batch/many-0757.txtobject-tests/batch/many-0758.txtobject-tests/batch/many-0759.txtobject-tests/batch/many-0760.txtobject-tests/batch/many-0761.txtobject-tests/batch/many-0762.txtobject-tests/batch/many-0763.txtobject-tests/batch/many-0764.txtobject-tests/batch/many-0765.txtobject-tests/batch/many-0766.txtobject-tests/batch/many-0767.txtobject-tests/batch/many-0768.txtobject-tests/batch/many-0769.txtobject-tests/batch/many-0770.txtobject-tests/batch/many-0771.txtobject-tests/batch/many-0772.txtobject-tests/batch/many-0773.txtobject-tests/batch/many-0774.txtobject-tests/batch/many-0775.txtobject-tests/batch/many-0776.txtobject-tests/batch/many-0777.txtobject-tests/batch/many-0778.txtobject-tests/batch/many-0779.txtobject-tests/batch/many-0780.txtobject-tests/batch/many-0781.txtobject-tests/batch/many-0782.txtobject-tests/batch/many-0783.txtobject-tests/batch/many-0784.txtobject-tests/batch/many-0785.txtobject-tests/batch/many-0786.txtobject-tests/batch/many-0787.txtobject-tests/batch/many-0788.txtobject-tests/batch/many-0789.txtobject-tests/batch/many-0790.txtobject-tests/batch/many-0791.txtobject-tests/batch/many-0792.txtobject-tests/batch/many-0793.txtobject-tests/batch/many-0794.txtobject-tests/batch/many-0795.txtobject-tests/batch/many-0796.txtobject-tests/batch/many-0797.txtobject-tests/batch/many-0798.txtobject-tests/batch/many-0799.txtobject-tests/batch/many-0800.txtobject-tests/batch/many-0801.txtobject-tests/batch/many-0802.txtobject-tests/batch/many-0803.txtobject-tests/batch/many-0804.txtobject-tests/batch/many-0805.txtobject-tests/batch/many-0806.txtobject-tests/batch/many-0807.txtobject-tests/batch/many-0808.txtobject-tests/batch/many-0809.txtobject-tests/batch/many-0810.txtobject-tests/batch/many-0811.txtobject-tests/batch/many-0812.txtobject-tests/batch/many-0813.txtobject-tests/batch/many-0814.txtobject-tests/batch/many-0815.txtobject-tests/batch/many-0816.txtobject-tests/batch/many-0817.txtobject-tests/batch/many-0818.txtobject-tests/batch/many-0819.txtobject-tests/batch/many-0820.txtobject-tests/batch/many-0821.txtobject-tests/batch/many-0822.txtobject-tests/batch/many-0823.txtobject-tests/batch/many-0824.txtobject-tests/batch/many-0825.txtobject-tests/batch/many-0826.txtobject-tests/batch/many-0827.txtobject-tests/batch/many-0828.txtobject-tests/batch/many-0829.txtobject-tests/batch/many-0830.txtobject-tests/batch/many-0831.txtobject-tests/batch/many-0832.txtobject-tests/batch/many-0833.txtobject-tests/batch/many-0834.txtobject-tests/batch/many-0835.txtobject-tests/batch/many-0836.txtobject-tests/batch/many-0837.txtobject-tests/batch/many-0838.txtobject-tests/batch/many-0839.txtobject-tests/batch/many-0840.txtobject-tests/batch/many-0841.txtobject-tests/batch/many-0842.txtobject-tests/batch/many-0843.txtobject-tests/batch/many-0844.txtobject-tests/batch/many-0845.txtobject-tests/batch/many-0846.txtobject-tests/batch/many-0847.txtobject-tests/batch/many-0848.txtobject-tests/batch/many-0849.txtobject-tests/batch/many-0850.txtobject-tests/batch/many-0851.txtobject-tests/batch/many-0852.txtobject-tests/batch/many-0853.txtobject-tests/batch/many-0854.txtobject-tests/batch/many-0855.txtobject-tests/batch/many-0856.txtobject-tests/batch/many-0857.txtobject-tests/batch/many-0858.txtobject-tests/batch/many-0859.txtobject-tests/batch/many-0860.txtobject-tests/batch/many-0861.txtobject-tests/batch/many-0862.txtobject-tests/batch/many-0863.txtobject-tests/batch/many-0864.txtobject-tests/batch/many-0865.txtobject-tests/batch/many-0866.txtobject-tests/batch/many-0867.txtobject-tests/batch/many-0868.txtobject-tests/batch/many-0869.txtobject-tests/batch/many-0870.txtobject-tests/batch/many-0871.txtobject-tests/batch/many-0872.txtobject-tests/batch/many-0873.txtobject-tests/batch/many-0874.txtobject-tests/batch/many-0875.txtobject-tests/batch/many-0876.txtobject-tests/batch/many-0877.txtobject-tests/batch/many-0878.txtobject-tests/batch/many-0879.txtobject-tests/batch/many-0880.txtobject-tests/batch/many-0881.txtobject-tests/batch/many-0882.txtobject-tests/batch/many-0883.txtobject-tests/batch/many-0884.txtobject-tests/batch/many-0885.txtobject-tests/batch/many-0886.txtobject-tests/batch/many-0887.txtobject-tests/batch/many-0888.txtobject-tests/batch/many-0889.txtobject-tests/batch/many-0890.txtobject-tests/batch/many-0891.txtobject-tests/batch/many-0892.txtobject-tests/batch/many-0893.txtobject-tests/batch/many-0894.txtobject-tests/batch/many-0895.txtobject-tests/batch/many-0896.txtobject-tests/batch/many-0897.txtobject-tests/batch/many-0898.txtobject-tests/batch/many-0899.txtobject-tests/batch/many-0900.txtobject-tests/batch/many-0901.txtobject-tests/batch/many-0902.txtobject-tests/batch/many-0903.txtobject-tests/batch/many-0904.txtobject-tests/batch/many-0905.txtobject-tests/batch/many-0906.txtobject-tests/batch/many-0907.txtobject-tests/batch/many-0908.txtobject-tests/batch/many-0909.txtobject-tests/batch/many-0910.txtobject-tests/batch/many-0911.txtobject-tests/batch/many-0912.txtobject-tests/batch/many-0913.txtobject-tests/batch/many-0914.txtobject-tests/batch/many-0915.txtobject-tests/batch/many-0916.txtobject-tests/batch/many-0917.txtobject-tests/batch/many-0918.txtobject-tests/batch/many-0919.txtobject-tests/batch/many-0920.txtobject-tests/batch/many-0921.txtobject-tests/batch/many-0922.txtobject-tests/batch/many-0923.txtobject-tests/batch/many-0924.txtobject-tests/batch/many-0925.txtobject-tests/batch/many-0926.txtobject-tests/batch/many-0927.txtobject-tests/batch/many-0928.txtobject-tests/batch/many-0929.txtobject-tests/batch/many-0930.txtobject-tests/batch/many-0931.txtobject-tests/batch/many-0932.txtobject-tests/batch/many-0933.txtobject-tests/batch/many-0934.txtobject-tests/batch/many-0935.txtobject-tests/batch/many-0936.txtobject-tests/batch/many-0937.txtobject-tests/batch/many-0938.txtobject-tests/batch/many-0939.txtobject-tests/batch/many-0940.txtobject-tests/batch/many-0941.txtobject-tests/batch/many-0942.txtobject-tests/batch/many-0943.txtobject-tests/batch/many-0944.txtobject-tests/batch/many-0945.txtobject-tests/batch/many-0946.txtobject-tests/batch/many-0947.txtobject-tests/batch/many-0948.txtobject-tests/batch/many-0949.txtobject-tests/batch/many-0950.txtobject-tests/batch/many-0951.txtobject-tests/batch/many-0952.txtobject-tests/batch/many-0953.txtobject-tests/batch/many-0954.txtobject-tests/batch/many-0955.txtobject-tests/batch/many-0956.txtobject-tests/batch/many-0957.txtobject-tests/batch/many-0958.txtobject-tests/batch/many-0959.txtobject-tests/batch/many-0960.txtobject-tests/batch/many-0961.txtobject-tests/batch/many-0962.txtobject-tests/batch/many-0963.txtobject-tests/batch/many-0964.txtobject-tests/batch/many-0965.txtobject-tests/batch/many-0966.txtobject-tests/batch/many-0967.txtobject-tests/batch/many-0968.txtobject-tests/batch/many-0969.txtobject-tests/batch/many-0970.txtobject-tests/batch/many-0971.txtobject-tests/batch/many-0972.txtobject-tests/batch/many-0973.txtobject-tests/batch/many-0974.txtobject-tests/batch/many-0975.txtobject-tests/batch/many-0976.txtobject-tests/batch/many-0977.txtobject-tests/batch/many-0978.txtobject-tests/batch/many-0979.txtobject-tests/batch/many-0980.txtobject-tests/batch/many-0981.txtobject-tests/batch/many-0982.txtobject-tests/batch/many-0983.txtobject-tests/batch/many-0984.txtobject-tests/batch/many-0985.txtobject-tests/batch/many-0986.txtobject-tests/batch/many-0987.txtobject-tests/batch/many-0988.txtobject-tests/batch/many-0989.txtobject-tests/batch/many-0990.txtobject-tests/batch/many-0991.txtobject-tests/batch/many-0992.txtobject-tests/batch/many-0993.txtobject-tests/batch/many-0994.txtobject-tests/batch/many-0995.txtobject-tests/batch/many-0996.txtobject-tests/batch/many-0997.txtobject-tests/batch/many-0998.txtobject-tests/batch/many-0999.txtobject-tests/batch/many-1000.txt" - } - }, - { - "at": "/query/delete", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-amz-checksum-crc64nvme", - "optional": false, - "rule": { - "is": "matches", - "pattern": "[A-Za-z0-9+/]{11}=" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "", - "optional": false, - "rule": { - "is": "body_checksum", - "header": "x-amz-checksum-crc64nvme", - "algorithm": "crc64nvme" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 400, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } - }, - "body": { - "encoding": "utf8", - "data": "\nMalformedXMLFixture error" - }, - "framing": "chunked" - } - } - ] + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } } ], "allow_headers": [ @@ -165880,18 +175171,18 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-type": "application/xml" + "content-type": "application/xml", + "date": { + "from": "now" + } }, "body": { "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "\nNoSuchKeyFixture error" }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } + "framing": "chunked" } } ] @@ -165911,7 +175202,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 404 } }, { @@ -165919,65 +175210,26 @@ "optional": false, "rule": { "is": "equal", - "value": "MalformedXML" + "value": "NoSuchKey" } } ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "keys" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "MalformedXML" - } - } - ] + "refusal": null }, { - "id": "operations/s3-express/delete-slow-down", + "id": "operations/s3-express/get-committed-tail", "profile": "s3-express", "lane": "core", - "purpose": "Report a 503 SlowDown answer as an error, after at most 5 retries", + "purpose": "get committed tail", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], - "origin": "transient", "call": { - "key": "object-tests/remove/present.txt", - "op": "delete" + "key": "object-tests/multipart/object.bin", + "op": "get", + "range": { + "suffix": 10 + } }, "exchanges": [ { @@ -166062,7 +175314,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166070,7 +175322,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/multipart/object.bin" } }, { @@ -166081,6 +175333,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-10" + } + }, { "at": "/headers/host", "optional": false, @@ -166111,48 +175371,46 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 5242876-5242885/5242886", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-ec4f3b9bcac2\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" - }, - "framing": "chunked" + "encoding": "base64", + "data": "Y2RlZnNlY29uZA==" + } } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { - "at": "/method", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "/object-tests/multipart/object.bin" } }, { - "at": "/path", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "" } }, { - "at": "/body_base64", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "HEAD" } }, { @@ -166178,6 +175436,108 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-10" + } + } + ], + "then": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/multipart/object.bin" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=5242876-5242885" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ec4f3b9bcac2\"" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 5242876-5242885/5242886", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-ec4f3b9bcac2\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "Y2RlZnNlY29uZA==" + } + } + } + ] } ], "allow_headers": [ @@ -166185,22 +175545,165 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 206, "headers": { - "content-type": "application/xml", + "content-length": "10", + "content-range": "bytes 5242876-5242885/5242886", + "content-type": "binary/octet-stream", "date": { "from": "now" + }, + "etag": "\"fixture-ec4f3b9bcac2\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ec4f3b9bcac2\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 10 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Y2RlZnNlY29uZA==" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/get-empty", + "profile": "s3-express", + "lane": "core", + "purpose": "get empty", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/write/empty.bin", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } - ], - "optional": true + ] }, { "alternatives": [ @@ -166211,7 +175714,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166219,7 +175722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -166260,25 +175763,21 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-de1997e62b9b\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } - } - ], - "optional": true - }, - { - "alternatives": [ + }, { "request": [ { @@ -166286,7 +175785,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166294,7 +175793,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -166305,6 +175804,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, { "at": "/headers/host", "optional": false, @@ -166330,28 +175837,188 @@ } } ], + "then": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/write/empty.bin" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/partNumber", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-de1997e62b9b\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], "allow_headers": [ "content-type" ], "allow_query": [], "response": { - "status": 503, + "status": 416, "headers": { + "content-range": "bytes */0", "content-type": "application/xml", "date": { "from": "now" - } + }, + "etag": "\"fixture-de1997e62b9b\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nInvalidRangeEmpty object0" }, "framing": "chunked" } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-de1997e62b9b\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 0 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/get-range-of-empty-object", + "profile": "s3-express", + "lane": "core", + "purpose": "Report a range read of an empty object as 416 InvalidRange: no range of it can be satisfied, not even its first byte", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/write/empty.bin", + "op": "get", + "range": { + "end": 1, + "start": 0 + } + }, + "exchanges": [ { "alternatives": [ { @@ -166361,7 +176028,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166369,11 +176036,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/" } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", @@ -166389,19 +176056,18 @@ } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/authorization", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "absent" } } ], @@ -166410,22 +176076,21 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } - ], - "optional": true + ] }, { "alternatives": [ @@ -166436,7 +176101,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166444,7 +176109,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -166478,6 +176143,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-0" + } } ], "allow_headers": [ @@ -166485,8 +176158,9 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 416, "headers": { + "content-range": "bytes */0", "content-type": "application/xml", "date": { "from": "now" @@ -166494,13 +176168,12 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nInvalidRangeFixture error" }, "framing": "chunked" } } - ], - "optional": true + ] } ], "expect": [ @@ -166517,7 +176190,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 416 } }, { @@ -166525,24 +176198,24 @@ "optional": false, "rule": { "is": "equal", - "value": "SlowDown" + "value": "InvalidRange" } } ], "refusal": null }, { - "id": "operations/s3-express/delete-if-match-current", + "id": "operations/s3-express/get-if-match-current", "profile": "s3-express", "lane": "core", - "purpose": "delete if match current", + "purpose": "get if match current", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_match": "\"fixture-137dbea0e0a1\"", - "key": "object-tests/remove/conditional.txt", - "op": "delete" + "if_match": "\"fixture-672b31e65569\"", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -166627,7 +176300,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166635,7 +176308,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/conditional.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -166651,7 +176324,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-137dbea0e0a1\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -166684,16 +176357,106 @@ ], "allow_query": [], "response": { - "status": 204, + "status": 200, "headers": { + "content-type": "binary/octet-stream", "date": { "from": "now" }, + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -166708,21 +176471,65 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } ], "refusal": null }, { - "id": "operations/s3-express/delete-missing", + "id": "operations/s3-express/get-if-none-match-other", "profile": "s3-express", "lane": "core", - "purpose": "delete missing", + "purpose": "get if none match other", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/remove/absent.txt", - "op": "delete" + "if_none_match": "\"fixture-db71b2c0257c\"", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -166807,7 +176614,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -166815,7 +176622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/absent.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -166826,6 +176633,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/host", "optional": false, @@ -166856,50 +176671,21 @@ ], "allow_query": [], "response": { - "status": 204, + "status": 200, "headers": { + "content-type": "binary/octet-stream", "date": { "from": "now" }, + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/delete-precondition-failed", - "profile": "s3-express", - "lane": "core", - "purpose": "delete precondition failed", - "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" - ], - "call": { - "if_match": "\"fixture-db71b2c0257c\"", - "key": "object-tests/remove/conditional.txt", - "op": "delete" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -166915,11 +176701,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "/object-tests/read/object.txt" } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -166927,84 +176713,19 @@ } }, { - "at": "/headers/host", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "value": "\"fixture-db71b2c0257c\"" } }, { - "at": "/headers/authorization", + "at": "/headers/range", "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "absent" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml" - }, - "body": { - "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" - }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } - } - } - ] - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "DELETE" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/remove/conditional.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-db71b2c0257c\"" + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -167037,18 +176758,20 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nPreconditionFailedFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } } ] @@ -167060,38 +176783,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-672b31e65569\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "PreconditionFailed" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/s3-express/get-before-commit", + "id": "operations/s3-express/get-key-with-hash", "profile": "s3-express", "lane": "core", - "purpose": "get before commit", + "purpose": "get key with hash", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/multipart/object.bin", + "key": "object-tests/names/hash#tag.txt", "op": "get" }, "exchanges": [ @@ -167185,7 +176935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/hash#tag.txt" } }, { @@ -167226,18 +176976,19 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-84af5210cfd9\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nNoSuchKeyFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MQ==" + } } }, { @@ -167255,7 +177006,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/hash#tag.txt" } }, { @@ -167304,18 +177055,20 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-84af5210cfd9\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nNoSuchKeyFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MQ==" + } } } ] @@ -167327,42 +177080,66 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-84af5210cfd9\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "NoSuchKey" + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-committed-tail", + "id": "operations/s3-express/get-key-with-percent", "profile": "s3-express", "lane": "core", - "purpose": "get committed tail", + "purpose": "get key with percent", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/multipart/object.bin", - "op": "get", - "range": { - "suffix": 10 - } + "key": "object-tests/names/percent%20.txt", + "op": "get" }, "exchanges": [ { @@ -167455,7 +177232,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/percent%20.txt" } }, { @@ -167466,14 +177243,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-10" - } - }, { "at": "/headers/host", "optional": false, @@ -167504,30 +177273,37 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 5242876-5242885/5242886", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ec4f3b9bcac2\"", + "etag": "\"fixture-a16607f00956\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Y2RlZnNlY29uZA==" + "data": "MQ==" } } }, { "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, { "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/percent%20.txt" } }, { @@ -167539,11 +177315,11 @@ } }, { - "at": "/method", + "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "HEAD" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -167569,108 +177345,6 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-10" - } - } - ], - "then": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/multipart/object.bin" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=5242876-5242885" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-ec4f3b9bcac2\"" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 206, - "headers": { - "content-range": "bytes 5242876-5242885/5242886", - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-ec4f3b9bcac2\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "Y2RlZnNlY29uZA==" - } - } - } - ] } ], "allow_headers": [ @@ -167680,17 +177354,17 @@ "response": { "status": 206, "headers": { - "content-length": "10", - "content-range": "bytes 5242876-5242885/5242886", + "content-range": "bytes 0-0/1", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ec4f3b9bcac2\"", + "etag": "\"fixture-a16607f00956\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "MQ==" } } } @@ -167711,7 +177385,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ec4f3b9bcac2\"" + "value": "\"fixture-a16607f00956\"" } }, { @@ -167719,7 +177393,7 @@ "optional": false, "rule": { "is": "equal", - "value": 10 + "value": 1 } }, { @@ -167746,22 +177420,22 @@ "optional": false, "rule": { "is": "equal", - "value": "Y2RlZnNlY29uZA==" + "value": "MQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-empty", + "id": "operations/s3-express/get-key-with-plus", "profile": "s3-express", "lane": "core", - "purpose": "get empty", + "purpose": "get key with plus", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/write/empty.bin", + "key": "object-tests/names/plus+plus.txt", "op": "get" }, "exchanges": [ @@ -167855,7 +177529,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/plus+plus.txt" } }, { @@ -167902,12 +177576,12 @@ "date": { "from": "now" }, - "etag": "\"fixture-de1997e62b9b\"", + "etag": "\"fixture-1b1e630ad692\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "" + "data": "MQ==" } } }, @@ -167926,7 +177600,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/plus+plus.txt" } }, { @@ -167970,111 +177644,25 @@ } } ], - "then": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/write/empty.bin" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/query/partNumber", - "optional": false, - "rule": { - "is": "equal", - "value": "1" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-de1997e62b9b\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], "allow_headers": [ "content-type" ], "allow_query": [], "response": { - "status": 416, + "status": 206, "headers": { - "content-range": "bytes */0", - "content-type": "application/xml", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-de1997e62b9b\"", + "etag": "\"fixture-1b1e630ad692\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nInvalidRangeEmpty object0" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MQ==" + } } } ] @@ -168094,7 +177682,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-de1997e62b9b\"" + "value": "\"fixture-1b1e630ad692\"" } }, { @@ -168102,7 +177690,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -168129,27 +177717,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-range-of-empty-object", + "id": "operations/s3-express/get-key-with-space", "profile": "s3-express", "lane": "core", - "purpose": "Report a range read of an empty object as 416 InvalidRange: no range of it can be satisfied, not even its first byte", + "purpose": "get key with space", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/write/empty.bin", - "op": "get", - "range": { - "end": 1, - "start": 0 - } + "key": "object-tests/names/space name.txt", + "op": "get" }, "exchanges": [ { @@ -168242,7 +177826,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/space name.txt" } }, { @@ -168276,13 +177860,84 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-d614f09fca44\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MQ==" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/names/space name.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } }, { "at": "/headers/range", "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/host", + "optional": false, "rule": { "is": "equal", - "value": "bytes=0-0" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], @@ -168291,19 +177946,20 @@ ], "allow_query": [], "response": { - "status": 416, + "status": 206, "headers": { - "content-range": "bytes */0", - "content-type": "application/xml", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-d614f09fca44\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nInvalidRangeFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MQ==" + } } } ] @@ -168315,39 +177971,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 416 + "value": "\"fixture-d614f09fca44\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidRange" + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-if-match-current", + "id": "operations/s3-express/get-key-with-question", "profile": "s3-express", "lane": "core", - "purpose": "get if match current", + "purpose": "get key question", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], "call": { - "if_match": "\"fixture-672b31e65569\"", - "key": "object-tests/read/object.txt", + "key": "a?b", "op": "get" }, "exchanges": [ @@ -168441,7 +178123,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/a?b" } }, { @@ -168453,11 +178135,15 @@ } }, { - "at": "/headers/if-match", - "optional": false, + "at": "/headers/content-type", + "optional": true, "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -168485,23 +178171,22 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } }, @@ -168520,7 +178205,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/a?b" } }, { @@ -168532,11 +178217,15 @@ } }, { - "at": "/headers/if-match", - "optional": false, + "at": "/headers/content-type", + "optional": true, "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -168572,24 +178261,23 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-range": "bytes 0-4/5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } } @@ -168605,63 +178293,27 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "aGVsbG8=" } } ], "refusal": null }, { - "id": "operations/s3-express/get-if-none-match-other", + "id": "operations/s3-express/get-key-with-non-ascii", "profile": "s3-express", "lane": "core", - "purpose": "get if none match other", + "purpose": "get key unicode", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], "call": { - "if_none_match": "\"fixture-db71b2c0257c\"", - "key": "object-tests/read/object.txt", + "key": "café/雪", "op": "get" }, "exchanges": [ @@ -168755,7 +178407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/café/雪" } }, { @@ -168767,11 +178419,15 @@ } }, { - "at": "/headers/if-none-match", - "optional": false, + "at": "/headers/content-type", + "optional": true, "rule": { - "is": "equal", - "value": "\"fixture-db71b2c0257c\"" + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -168799,23 +178455,22 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } }, @@ -168834,7 +178489,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/café/雪" } }, { @@ -168846,11 +178501,15 @@ } }, { - "at": "/headers/if-none-match", - "optional": false, + "at": "/headers/content-type", + "optional": true, "rule": { - "is": "equal", - "value": "\"fixture-db71b2c0257c\"" + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -168886,24 +178545,23 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-range": "bytes 0-4/5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } } @@ -168919,62 +178577,27 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "aGVsbG8=" } } ], "refusal": null }, { - "id": "operations/s3-express/get-key-with-hash", + "id": "operations/s3-express/get-key-with-separators", "profile": "s3-express", "lane": "core", - "purpose": "get key with hash", + "purpose": "get key separators", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], "call": { - "key": "object-tests/names/hash#tag.txt", + "key": "a//b/", "op": "get" }, "exchanges": [ @@ -169068,7 +178691,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/hash#tag.txt" + "value": "/a//b/" } }, { @@ -169079,6 +178702,18 @@ "value": "" } }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, { "at": "/headers/host", "optional": false, @@ -169104,23 +178739,22 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-84af5210cfd9\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "aGVsbG8=" } } }, @@ -169139,7 +178773,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/hash#tag.txt" + "value": "/a//b/" } }, { @@ -169150,6 +178784,18 @@ "value": "" } }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, { "at": "/headers/range", "optional": false, @@ -169183,24 +178829,23 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/1", - "content-type": "binary/octet-stream", + "content-range": "bytes 0-4/5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-84af5210cfd9\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "aGVsbG8=" } } } @@ -169216,62 +178861,27 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-84af5210cfd9\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "aGVsbG8=" } } ], "refusal": null }, { - "id": "operations/s3-express/get-key-with-percent", + "id": "operations/s3-express/get-metadata-empty-value", "profile": "s3-express", "lane": "core", - "purpose": "get key with percent", + "purpose": "get metadata empty value", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/names/percent%20.txt", + "key": "object-tests/metadata/empty-value.txt", "op": "get" }, "exchanges": [ @@ -169365,7 +178975,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/percent%20.txt" + "value": "/object-tests/metadata/empty-value.txt" } }, { @@ -169412,8 +179022,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-a16607f00956\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-e6096f6fd1ec\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-empty": "" }, "body": { "encoding": "base64", @@ -169436,7 +179047,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/percent%20.txt" + "value": "/object-tests/metadata/empty-value.txt" } }, { @@ -169492,8 +179103,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-a16607f00956\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-e6096f6fd1ec\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-empty": "" }, "body": { "encoding": "base64", @@ -169518,7 +179130,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a16607f00956\"" + "value": "\"fixture-e6096f6fd1ec\"" } }, { @@ -169548,6 +179160,14 @@ ] } }, + { + "at": "/value/metadata/empty", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, { "at": "/value/body_base64", "optional": false, @@ -169560,15 +179180,15 @@ "refusal": null }, { - "id": "operations/s3-express/get-key-with-plus", + "id": "operations/s3-express/get-metadata-hyphen-name", "profile": "s3-express", "lane": "core", - "purpose": "get key with plus", + "purpose": "get metadata hyphen name", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/names/plus+plus.txt", + "key": "object-tests/metadata/hyphen-name.txt", "op": "get" }, "exchanges": [ @@ -169662,7 +179282,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/plus+plus.txt" + "value": "/object-tests/metadata/hyphen-name.txt" } }, { @@ -169709,8 +179329,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-1b1e630ad692\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-adae183ea4af\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-not-valid": "1" }, "body": { "encoding": "base64", @@ -169733,7 +179354,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/plus+plus.txt" + "value": "/object-tests/metadata/hyphen-name.txt" } }, { @@ -169789,8 +179410,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-1b1e630ad692\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-adae183ea4af\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-not-valid": "1" }, "body": { "encoding": "base64", @@ -169815,7 +179437,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-1b1e630ad692\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -169845,6 +179467,14 @@ ] } }, + { + "at": "/value/metadata/not-valid", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + }, { "at": "/value/body_base64", "optional": false, @@ -169857,15 +179487,15 @@ "refusal": null }, { - "id": "operations/s3-express/get-key-with-space", + "id": "operations/s3-express/get-metadata-punctuation-name", "profile": "s3-express", "lane": "core", - "purpose": "get key with space", + "purpose": "Report a metadata name that holds any character of an HTTP token.", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/names/space name.txt", + "key": "object-tests/metadata/punctuation-name.txt", "op": "get" }, "exchanges": [ @@ -169959,7 +179589,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/space name.txt" + "value": "/object-tests/metadata/punctuation-name.txt" } }, { @@ -170006,8 +179636,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-d614f09fca44\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-adae183ea4af\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-1a!#$%&'*+.^_`|~b": "1" }, "body": { "encoding": "base64", @@ -170030,7 +179661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/space name.txt" + "value": "/object-tests/metadata/punctuation-name.txt" } }, { @@ -170086,8 +179717,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-d614f09fca44\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-adae183ea4af\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-1a!#$%&'*+.^_`|~b": "1" }, "body": { "encoding": "base64", @@ -170112,7 +179744,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-d614f09fca44\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -170149,20 +179781,30 @@ "is": "equal", "value": "MQ==" } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "1a!#$%&'*+.^_`|~b": "1" + } + } } ], "refusal": null }, { - "id": "operations/s3-express/get-key-with-question", + "id": "operations/s3-express/get-metadata-non-ascii-value", "profile": "s3-express", "lane": "core", - "purpose": "get key question", + "purpose": "A directory bucket returns an RFC 2047 encoded word as it was stored. A client that encodes on a write decodes it to é; one that keeps metadata to ASCII returns it as stored.", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "a?b", + "key": "object-tests/metadata/non-ascii.txt", "op": "get" }, "exchanges": [ @@ -170256,7 +179898,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a?b" + "value": "/object-tests/metadata/non-ascii.txt" } }, { @@ -170267,18 +179909,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/host", "optional": false, @@ -170304,22 +179934,24 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "application/octet-stream", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?Q?caf=C3=A9?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } }, @@ -170338,7 +179970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a?b" + "value": "/object-tests/metadata/non-ascii.txt" } }, { @@ -170349,18 +179981,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/range", "optional": false, @@ -170394,23 +180014,25 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-4/5", - "content-type": "application/octet-stream", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?Q?caf=C3=A9?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } } @@ -170426,27 +180048,77 @@ "value": "ok" } }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-adae183ea4af\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": "MQ==" + } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + { + "value": "café" + }, + { + "value": "=?UTF-8?Q?caf=C3=A9?=" + } + ] } } ], "refusal": null }, { - "id": "operations/s3-express/get-key-with-non-ascii", + "id": "operations/s3-express/get-metadata-outside-latin-1", "profile": "s3-express", "lane": "core", - "purpose": "get key unicode", + "purpose": "A directory bucket returns a base64 RFC 2047 encoded word as it was stored. A client that encodes on a write decodes it to 雪; one that keeps metadata to ASCII returns it as stored.", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "café/雪", + "key": "object-tests/metadata/outside-latin-1.txt", "op": "get" }, "exchanges": [ @@ -170540,7 +180212,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/café/雪" + "value": "/object-tests/metadata/outside-latin-1.txt" } }, { @@ -170551,18 +180223,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/host", "optional": false, @@ -170588,22 +180248,24 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "application/octet-stream", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?B?6Zuq?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } }, @@ -170622,7 +180284,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/café/雪" + "value": "/object-tests/metadata/outside-latin-1.txt" } }, { @@ -170633,18 +180295,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/range", "optional": false, @@ -170678,23 +180328,25 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-4/5", - "content-type": "application/octet-stream", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?B?6Zuq?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } } @@ -170710,27 +180362,77 @@ "value": "ok" } }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-adae183ea4af\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": "MQ==" + } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + { + "value": "雪" + }, + { + "value": "=?UTF-8?B?6Zuq?=" + } + ] } } ], "refusal": null }, { - "id": "operations/s3-express/get-key-with-separators", + "id": "operations/s3-express/get-metadata-split-encoded-words", "profile": "s3-express", "lane": "core", - "purpose": "get key separators", + "purpose": "Decode a long metadata value that a directory bucket returns as one encoded word", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "a//b/", + "key": "object-tests/metadata/split-encoded-words.txt", "op": "get" }, "exchanges": [ @@ -170824,7 +180526,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a//b/" + "value": "/object-tests/metadata/split-encoded-words.txt" } }, { @@ -170835,18 +180537,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/host", "optional": false, @@ -170872,22 +180562,24 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "application/octet-stream", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-6c30b210f0a8\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?B?6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } }, @@ -170906,7 +180598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a//b/" + "value": "/object-tests/metadata/split-encoded-words.txt" } }, { @@ -170917,18 +180609,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/range", "optional": false, @@ -170962,23 +180642,25 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-4/5", - "content-type": "application/octet-stream", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"fixture-6c30b210f0a8\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-meta-value": "=?UTF-8?B?6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq?=" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" + "data": "MQ==" } } } @@ -170994,27 +180676,72 @@ "value": "ok" } }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-6c30b210f0a8\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": "MQ==" + } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "value": "雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪" + } } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-empty-value", + "id": "operations/s3-express/get-metadata-malformed-encoded-word", "profile": "s3-express", "lane": "core", - "purpose": "get metadata empty value", + "purpose": "Leave a value that only looks like an RFC 2047 encoded word as it is: =ZZ is no hexadecimal byte.", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/empty-value.txt", + "key": "object-tests/metadata/malformed-encoded-word.txt", "op": "get" }, "exchanges": [ @@ -171108,7 +180835,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/empty-value.txt" + "value": "/object-tests/metadata/malformed-encoded-word.txt" } }, { @@ -171155,9 +180882,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-e6096f6fd1ec\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-empty": "" + "x-amz-meta-value": "=?UTF-8?Q?caf=ZZ?=" }, "body": { "encoding": "base64", @@ -171180,7 +180907,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/empty-value.txt" + "value": "/object-tests/metadata/malformed-encoded-word.txt" } }, { @@ -171236,9 +180963,9 @@ "date": { "from": "now" }, - "etag": "\"fixture-e6096f6fd1ec\"", + "etag": "\"fixture-adae183ea4af\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-empty": "" + "x-amz-meta-value": "=?UTF-8?Q?caf=ZZ?=" }, "body": { "encoding": "base64", @@ -171263,7 +180990,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-e6096f6fd1ec\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -171294,34 +181021,36 @@ } }, { - "at": "/value/metadata/empty", + "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MQ==" } }, { - "at": "/value/body_base64", + "at": "/value/metadata", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": { + "value": "=?UTF-8?Q?caf=ZZ?=" + } } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-hyphen-name", + "id": "operations/s3-express/get-metadata-replaced", "profile": "s3-express", "lane": "core", - "purpose": "get metadata hyphen name", + "purpose": "get metadata replaced", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/hyphen-name.txt", + "key": "object-tests/metadata/replaced.txt", "op": "get" }, "exchanges": [ @@ -171415,7 +181144,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/hyphen-name.txt" + "value": "/object-tests/metadata/replaced.txt" } }, { @@ -171462,13 +181191,12 @@ "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-not-valid": "1" + "etag": "\"fixture-8ff37996a1a3\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "Mg==" } } }, @@ -171487,7 +181215,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/hyphen-name.txt" + "value": "/object-tests/metadata/replaced.txt" } }, { @@ -171543,13 +181271,12 @@ "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-not-valid": "1" + "etag": "\"fixture-8ff37996a1a3\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "Mg==" } } } @@ -171570,7 +181297,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-adae183ea4af\"" + "value": "\"fixture-8ff37996a1a3\"" } }, { @@ -171600,35 +181327,27 @@ ] } }, - { - "at": "/value/metadata/not-valid", - "optional": false, - "rule": { - "is": "equal", - "value": "1" - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "Mg==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-punctuation-name", + "id": "operations/s3-express/get-metadata", "profile": "s3-express", "lane": "core", - "purpose": "Report a metadata name that holds any character of an HTTP token.", + "purpose": "get metadata", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/punctuation-name.txt", + "key": "object-tests/metadata/object.txt", "op": "get" }, "exchanges": [ @@ -171722,7 +181441,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/punctuation-name.txt" + "value": "/object-tests/metadata/object.txt" } }, { @@ -171769,9 +181488,10 @@ "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", + "etag": "\"fixture-ee657e36119d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-1a!#$%&'*+.^_`|~b": "1" + "x-amz-meta-name": "value", + "x-amz-meta-second": "2" }, "body": { "encoding": "base64", @@ -171794,7 +181514,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/punctuation-name.txt" + "value": "/object-tests/metadata/object.txt" } }, { @@ -171850,9 +181570,10 @@ "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", + "etag": "\"fixture-ee657e36119d\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-1a!#$%&'*+.^_`|~b": "1" + "x-amz-meta-name": "value", + "x-amz-meta-second": "2" }, "body": { "encoding": "base64", @@ -171877,7 +181598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-adae183ea4af\"" + "value": "\"fixture-ee657e36119d\"" } }, { @@ -171908,36 +181629,42 @@ } }, { - "at": "/value/body_base64", + "at": "/value/metadata/name", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "value" } }, { - "at": "/value/metadata", + "at": "/value/metadata/second", "optional": false, "rule": { "is": "equal", - "value": { - "1a!#$%&'*+.^_`|~b": "1" - } + "value": "2" + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-non-ascii-value", + "id": "operations/s3-express/get-metadata-ignores-unknown-headers", "profile": "s3-express", "lane": "core", - "purpose": "A directory bucket returns an RFC 2047 encoded word as it was stored. A client that encodes on a write decodes it to é; one that keeps metadata to ASCII returns it as stored.", + "purpose": "Surface user metadata; unknown headers must not become metadata.", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], "call": { - "key": "object-tests/metadata/non-ascii.txt", + "key": "object", "op": "get" }, "exchanges": [ @@ -172031,7 +181758,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/non-ascii.txt" + "value": "/object" } }, { @@ -172042,6 +181769,18 @@ "value": "" } }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, { "at": "/headers/host", "optional": false, @@ -172067,24 +181806,24 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?Q?caf=C3=A9?=" + "x-amz-meta-author": "Ada", + "x-amz-request-id": "fixture-request-id", + "x-unrelated": "not metadata" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "aGVsbG8=" } } }, @@ -172103,7 +181842,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/non-ascii.txt" + "value": "/object" } }, { @@ -172114,6 +181853,18 @@ "value": "" } }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, { "at": "/headers/range", "optional": false, @@ -172147,25 +181898,25 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/1", - "content-type": "binary/octet-stream", + "content-range": "bytes 0-4/5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-adae183ea4af\"", + "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?Q?caf=C3=A9?=" + "x-amz-meta-author": "Ada", + "x-amz-request-id": "fixture-request-id", + "x-unrelated": "not metadata" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "aGVsbG8=" } } } @@ -172181,77 +181932,37 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-adae183ea4af\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "aGVsbG8=" } }, { "at": "/value/metadata", "optional": false, "rule": { - "is": "one_of", - "values": [ - { - "value": "café" - }, - { - "value": "=?UTF-8?Q?caf=C3=A9?=" - } - ] + "is": "equal", + "value": { + "author": "Ada" + } } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-outside-latin-1", + "id": "operations/s3-express/get-missing", "profile": "s3-express", "lane": "core", - "purpose": "A directory bucket returns a base64 RFC 2047 encoded word as it was stored. A client that encodes on a write decodes it to 雪; one that keeps metadata to ASCII returns it as stored.", + "purpose": "get missing. A client reports it as not_found: the object is absent", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/outside-latin-1.txt", + "key": "object-tests/read/absent.txt", "op": "get" }, "exchanges": [ @@ -172345,7 +182056,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/outside-latin-1.txt" + "value": "/object-tests/read/absent.txt" } }, { @@ -172386,20 +182097,18 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?B?6Zuq?=" + } }, "body": { - "encoding": "base64", - "data": "MQ==" - } + "encoding": "utf8", + "data": "\nNoSuchKeyFixture error" + }, + "framing": "chunked" } }, { @@ -172417,7 +182126,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/outside-latin-1.txt" + "value": "/object-tests/read/absent.txt" } }, { @@ -172466,21 +182175,18 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 404, "headers": { - "content-range": "bytes 0-0/1", - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?B?6Zuq?=" + } }, "body": { - "encoding": "base64", - "data": "MQ==" - } + "encoding": "utf8", + "data": "\nNoSuchKeyFixture error" + }, + "framing": "chunked" } } ] @@ -172492,80 +182198,47 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-adae183ea4af\"" + "value": "error" } }, { - "at": "/value/size", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 404 } }, { - "at": "/value/content_type", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "NoSuchKey" } }, { - "at": "/value/body_base64", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "MQ==" - } - }, - { - "at": "/value/metadata", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - { - "value": "雪" - }, - { - "value": "=?UTF-8?B?6Zuq?=" - } - ] + "value": "not_found" } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-split-encoded-words", + "id": "operations/s3-express/get-not-modified", "profile": "s3-express", "lane": "core", - "purpose": "Decode a long metadata value that a directory bucket returns as one encoded word", + "purpose": "get not modified", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/split-encoded-words.txt", + "if_none_match": "\"fixture-672b31e65569\"", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -172659,7 +182332,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/split-encoded-words.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -172670,6 +182343,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, { "at": "/headers/host", "optional": false, @@ -172700,19 +182381,16 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 304, "headers": { - "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-6c30b210f0a8\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?B?6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq?=" + "etag": "\"fixture-672b31e65569\"" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "" } } }, @@ -172731,7 +182409,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/split-encoded-words.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -172742,6 +182420,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, { "at": "/headers/range", "optional": false, @@ -172780,20 +182466,16 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 304, "headers": { - "content-range": "bytes 0-0/1", - "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-6c30b210f0a8\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?B?6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq6Zuq?=" + "etag": "\"fixture-672b31e65569\"" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "" } } } @@ -172806,75 +182488,31 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-6c30b210f0a8\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MQ==" + "value": "error" } }, { - "at": "/value/metadata", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": { - "value": "雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪雪" - } + "value": 304 } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-malformed-encoded-word", + "id": "operations/s3-express/get-precondition-failed", "profile": "s3-express", "lane": "core", - "purpose": "Leave a value that only looks like an RFC 2047 encoded word as it is: =ZZ is no hexadecimal byte.", + "purpose": "get precondition failed", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/malformed-encoded-word.txt", + "if_match": "\"fixture-db71b2c0257c\"", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -172968,7 +182606,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/malformed-encoded-word.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -172979,6 +182617,14 @@ "value": "" } }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/host", "optional": false, @@ -173009,20 +182655,18 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?Q?caf=ZZ?=" + } }, "body": { - "encoding": "base64", - "data": "MQ==" - } + "encoding": "utf8", + "data": "\nPreconditionFailedFixture error" + }, + "framing": "chunked" } }, { @@ -173040,7 +182684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/malformed-encoded-word.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -173051,6 +182695,14 @@ "value": "" } }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/range", "optional": false, @@ -173089,21 +182741,18 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 412, "headers": { - "content-range": "bytes 0-0/1", - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-adae183ea4af\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-value": "=?UTF-8?Q?caf=ZZ?=" + } }, "body": { - "encoding": "base64", - "data": "MQ==" - } + "encoding": "utf8", + "data": "\nPreconditionFailedFixture error" + }, + "framing": "chunked" } } ] @@ -173115,76 +182764,43 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-adae183ea4af\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": 412 } }, { - "at": "/value/metadata", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": { - "value": "=?UTF-8?Q?caf=ZZ?=" - } + "value": "PreconditionFailed" } } ], "refusal": null }, { - "id": "operations/s3-express/get-metadata-replaced", + "id": "operations/s3-express/get-range-inverted", "profile": "s3-express", "lane": "core", - "purpose": "get metadata replaced", + "purpose": "get range inverted", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/replaced.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 2, + "start": 6 + } }, "exchanges": [ { @@ -173277,78 +182893,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/replaced.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-8ff37996a1a3\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "Mg==" - } - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/metadata/replaced.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -173363,8 +182908,8 @@ "at": "/headers/range", "optional": false, "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "is": "equal", + "value": "bytes=6-1" } }, { @@ -173397,19 +182942,18 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 0-0/1", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-8ff37996a1a3\"", + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Mg==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -173430,7 +182974,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ff37996a1a3\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -173438,7 +182982,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -173465,23 +183009,53 @@ "optional": false, "rule": { "is": "equal", - "value": "Mg==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "range" + } + } + ], + "decline_permitted": true }, { - "id": "operations/s3-express/get-metadata", + "id": "operations/s3-express/get-range-empty", "profile": "s3-express", "lane": "core", - "purpose": "get metadata", + "purpose": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/object.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 5, + "start": 5 + } }, "exchanges": [ { @@ -173574,80 +183148,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-ee657e36119d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-name": "value", - "x-amz-meta-second": "2" - }, - "body": { - "encoding": "base64", - "data": "MQ==" - } - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/metadata/object.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -173662,8 +183163,8 @@ "at": "/headers/range", "optional": false, "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "is": "equal", + "value": "bytes=5-4" } }, { @@ -173696,21 +183197,18 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 0-0/1", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ee657e36119d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-name": "value", - "x-amz-meta-second": "2" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -173731,7 +183229,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ee657e36119d\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -173739,7 +183237,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -173762,43 +183260,56 @@ } }, { - "at": "/value/metadata/name", + "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "value" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } - }, + } + ], + "refusal": [ { - "at": "/value/metadata/second", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "refused" } }, { - "at": "/value/body_base64", + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "range" } } ], - "refusal": null + "decline_permitted": true }, { - "id": "operations/s3-express/get-metadata-ignores-unknown-headers", + "id": "operations/s3-express/get-range-not-satisfiable", "profile": "s3-express", "lane": "core", - "purpose": "Surface user metadata; unknown headers must not become metadata.", + "purpose": "get range not satisfiable", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "start": 40 + } }, "exchanges": [ { @@ -173891,7 +183402,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -173903,15 +183414,11 @@ } }, { - "at": "/headers/content-type", - "optional": true, + "at": "/headers/range", + "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] + "is": "equal", + "value": "bytes=40-" } }, { @@ -173939,25 +183446,23 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 416, "headers": { - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-author": "Ada", - "x-amz-request-id": "fixture-request-id", - "x-unrelated": "not metadata" + } }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" - } + "encoding": "utf8", + "data": "\nInvalidRangeFixture error" + }, + "framing": "chunked" } }, { @@ -173975,7 +183480,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -173986,24 +183491,12 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/range", "optional": false, "rule": { "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "pattern": "bytes=40-[1-9][0-9]{2,}" } }, { @@ -174031,26 +183524,23 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 206, + "status": 416, "headers": { - "content-range": "bytes 0-4/5", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-author": "Ada", - "x-amz-request-id": "fixture-request-id", - "x-unrelated": "not metadata" + } }, "body": { - "encoding": "base64", - "data": "aGVsbG8=" - } + "encoding": "utf8", + "data": "\nInvalidRangeFixture error" + }, + "framing": "chunked" } } ] @@ -174062,41 +183552,43 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "aGVsbG8=" + "value": 416 } }, { - "at": "/value/metadata", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": { - "author": "Ada" - } + "value": "InvalidRange" } } ], "refusal": null }, { - "id": "operations/s3-express/get-missing", + "id": "operations/s3-express/get-range-past-the-end", "profile": "s3-express", "lane": "core", - "purpose": "get missing. A client reports it as not_found: the object is absent", + "purpose": "Read a range that ends past the object, which the service clips to the object's end. Report the window it served from Content-Range, bytes 28-29/30, so that the caller sees the range was clipped", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/absent.txt", - "op": "get" + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 64, + "start": 28 + } }, "exchanges": [ { @@ -174189,77 +183681,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/absent.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 404, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } - }, - "body": { - "encoding": "utf8", - "data": "\nNoSuchKeyFixture error" - }, - "framing": "chunked" - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/absent.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -174274,8 +183696,8 @@ "at": "/headers/range", "optional": false, "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "is": "equal", + "value": "bytes=28-63" } }, { @@ -174308,18 +183730,20 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 28-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nNoSuchKeyFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "Y3Q=" + } } } ] @@ -174331,48 +183755,78 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-672b31e65569\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "NoSuchKey" + "value": 2 } }, { - "at": "/kind", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "not_found" + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Y3Q=" + } + }, + { + "at": "/value/content_range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes 28-29/30" } } ], "refusal": null }, { - "id": "operations/s3-express/get-not-modified", + "id": "operations/s3-express/get-range-single-byte", "profile": "s3-express", "lane": "core", - "purpose": "get not modified", + "purpose": "get range single byte", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_none_match": "\"fixture-672b31e65569\"", "key": "object-tests/read/object.txt", - "op": "get" + "op": "get", + "range": { + "end": 1, + "start": 0 + } }, "exchanges": [ { @@ -174476,97 +183930,12 @@ "value": "" } }, - { - "at": "/headers/if-none-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 304, - "headers": { - "date": { - "from": "now" - }, - "etag": "\"fixture-672b31e65569\"" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/if-none-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, { "at": "/headers/range", "optional": false, "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "is": "equal", + "value": "bytes=0-0" } }, { @@ -174599,16 +183968,19 @@ ], "allow_query": [], "response": { - "status": 304, + "status": 206, "headers": { + "content-range": "bytes 0-0/30", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "" + "data": "MA==" } } } @@ -174621,32 +183993,70 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 304 + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MA==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-precondition-failed", + "id": "operations/s3-express/get-range", "profile": "s3-express", "lane": "core", - "purpose": "get precondition failed", + "purpose": "get range", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_match": "\"fixture-db71b2c0257c\"", "key": "object-tests/read/object.txt", - "op": "get" + "op": "get", + "range": { + "end": 6, + "start": 2 + } }, "exchanges": [ { @@ -174751,11 +184161,11 @@ } }, { - "at": "/headers/if-match", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-db71b2c0257c\"" + "value": "bytes=2-5" } }, { @@ -174788,104 +184198,20 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 2-5/30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nPreconditionFailedFixture error" - }, - "framing": "chunked" - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-db71b2c0257c\"" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } + "encoding": "base64", + "data": "MjM0NQ==" } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 412, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } - }, - "body": { - "encoding": "utf8", - "data": "\nPreconditionFailedFixture error" - }, - "framing": "chunked" } } ] @@ -174897,42 +184223,68 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-672b31e65569\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "PreconditionFailed" + "value": 4 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MjM0NQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-range-inverted", + "id": "operations/s3-express/get-range-open", "profile": "s3-express", "lane": "core", - "purpose": "get range inverted", + "purpose": "get range open", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object", "op": "get", "range": { - "end": 2, - "start": 6 + "start": 3 } }, "exchanges": [ @@ -175026,7 +184378,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object" } }, { @@ -175042,7 +184394,19 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=6-1" + "value": "bytes=3-" + } + }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -175070,23 +184434,114 @@ } } ], - "allow_headers": [ - "content-type" + "allow_headers": [], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 3-4/5", + "content-type": "application/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" + }, + "body": { + "encoding": "base64", + "data": "bG8=" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=3-[1-9][0-9]{2,}" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } ], + "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { - "content-type": "binary/octet-stream", + "content-range": "bytes 3-4/5", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "bG8=" } } } @@ -175102,92 +184557,33 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" - } - }, - { - "at": "/parameter", - "optional": false, - "rule": { - "is": "equal", - "value": "range" + "value": "bG8=" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/s3-express/get-range-empty", + "id": "operations/s3-express/get-checksum-range", "profile": "s3-express", "lane": "core", - "purpose": "Read a range of no bytes, whose start equals its end. HTTP has no form for it: bytes=5-4 is inverted, and the service ignores it and sends the whole object. A client may refuse it instead", + "purpose": "Read part of an object with checksum mode. S3 sends no checksum for a range that does not cover the whole object, so a client reads it without one, and reports none. x-amz-checksum-mode may be sent or left out", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], "call": { + "checksum_mode": true, "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 5, - "start": 5 + "end": 6, + "start": 2 } }, "exchanges": [ @@ -175297,7 +184693,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=5-4" + "value": "bytes=2-5" } }, { @@ -175323,6 +184719,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": true, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -175330,8 +184734,9 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { + "content-range": "bytes 2-5/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -175341,7 +184746,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -175370,7 +184775,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -175397,52 +184802,30 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": "MjM0NQ==" } }, { - "at": "/parameter", + "at": "/value/checksum", "optional": false, "rule": { - "is": "equal", - "value": "range" + "is": "absent" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/s3-express/get-range-not-satisfiable", + "id": "operations/s3-express/get-replaced", "profile": "s3-express", "lane": "core", - "purpose": "get range not satisfiable", + "purpose": "get replaced", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/object.txt", - "op": "get", - "range": { - "start": 40 - } + "key": "object-tests/multipart/replaced.bin", + "op": "get" }, "exchanges": [ { @@ -175535,7 +184918,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/replaced.bin" } }, { @@ -175546,14 +184929,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=40-" - } - }, { "at": "/headers/host", "optional": false, @@ -175584,18 +184959,19 @@ ], "allow_query": [], "response": { - "status": 416, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-eef5a071f9f6\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nInvalidRangeFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "Yg==" + } } }, { @@ -175613,7 +184989,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/replaced.bin" } }, { @@ -175629,7 +185005,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "bytes=40-[1-9][0-9]{2,}" + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -175662,18 +185038,20 @@ ], "allow_query": [], "response": { - "status": 416, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-0/1", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-eef5a071f9f6\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nInvalidRangeFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "Yg==" + } } } ] @@ -175685,43 +185063,66 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 416 + "value": "\"fixture-eef5a071f9f6\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidRange" + "value": 1 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Yg==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-range-past-the-end", + "id": "operations/s3-express/get-single-part", "profile": "s3-express", "lane": "core", - "purpose": "Read a range that ends past the object, which the service clips to the object's end. Report the window it served from Content-Range, bytes 28-29/30, so that the caller sees the range was clipped", + "purpose": "get single part", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/object.txt", - "op": "get", - "range": { - "end": 64, - "start": 28 - } + "key": "object-tests/multipart/single.bin", + "op": "get" }, "exchanges": [ { @@ -175814,7 +185215,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/single.bin" } }, { @@ -175825,14 +185226,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=28-63" - } - }, { "at": "/headers/host", "optional": false, @@ -175863,180 +185256,21 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 28-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", + "etag": "\"fixture-0841fa5d9c5c\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Y3Q=" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "Y3Q=" - } - }, - { - "at": "/value/content_range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes 28-29/30" - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/get-range-single-byte", - "profile": "s3-express", - "lane": "core", - "purpose": "get range single byte", - "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" - ], - "call": { - "key": "object-tests/read/object.txt", - "op": "get", - "range": { - "end": 1, - "start": 0 - } - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/" - } - }, - { - "at": "/query/session", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "absent" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml" - }, - "body": { - "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" - }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 + "data": "b25seQ==" } } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { @@ -176052,7 +185286,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/single.bin" } }, { @@ -176067,8 +185301,8 @@ "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "bytes=0-0" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -176103,17 +185337,17 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/30", + "content-range": "bytes 0-3/4", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", + "etag": "\"fixture-0841fa5d9c5c\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MA==" + "data": "b25seQ==" } } } @@ -176134,7 +185368,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-672b31e65569\"" + "value": "\"fixture-0841fa5d9c5c\"" } }, { @@ -176142,7 +185376,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 4 } }, { @@ -176169,17 +185403,17 @@ "optional": false, "rule": { "is": "equal", - "value": "MA==" + "value": "b25seQ==" } } ], "refusal": null }, { - "id": "operations/s3-express/get-range", + "id": "operations/s3-express/get-suffix-longer-than-object", "profile": "s3-express", "lane": "core", - "purpose": "get range", + "purpose": "get suffix longer than object", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], @@ -176187,8 +185421,7 @@ "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 6, - "start": 2 + "suffix": 100 } }, "exchanges": [ @@ -176298,7 +185531,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=2-5" + "value": "bytes=-100" } }, { @@ -176333,7 +185566,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 2-5/30", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -176343,7 +185576,181 @@ }, "body": { "encoding": "base64", - "data": "MjM0NQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + }, + { + "request": [ + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-100" + } + } + ], + "then": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-29" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + } + ] + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-length": "30", + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "empty" } } } @@ -176372,7 +185779,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 30 } }, { @@ -176399,25 +185806,25 @@ "optional": false, "rule": { "is": "equal", - "value": "MjM0NQ==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/s3-express/get-range-open", + "id": "operations/s3-express/get-suffix", "profile": "s3-express", "lane": "core", - "purpose": "get range open", + "purpose": "get suffix", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object", + "key": "object-tests/read/object.txt", "op": "get", "range": { - "start": 3 + "suffix": 6 } }, "exchanges": [ @@ -176511,7 +185918,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -176527,19 +185934,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=3-" - } - }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] + "value": "bytes=-6" } }, { @@ -176567,42 +185962,35 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 3-4/5", - "content-type": "application/octet-stream", + "content-range": "bytes 24-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "bG8=" + "data": "b2JqZWN0" } } }, { "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, { "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -176614,23 +186002,11 @@ } }, { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, - { - "at": "/headers/range", + "at": "/method", "optional": false, "rule": { - "is": "matches", - "pattern": "bytes=3-[1-9][0-9]{2,}" + "is": "equal", + "value": "HEAD" } }, { @@ -176656,25 +186032,128 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-6" + } } ], - "allow_headers": [], + "then": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=24-29" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 24-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "b2JqZWN0" + } + } + } + ] + } + ], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 3-4/5", - "content-type": "application/octet-stream", + "content-length": "6", + "content-range": "bytes 24-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "bG8=" + "encoding": "empty" } } } @@ -176690,27 +186169,62 @@ "value": "ok" } }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 6 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "bG8=" + "value": "b2JqZWN0" } } ], "refusal": null }, { - "id": "operations/s3-express/get-replaced", + "id": "operations/s3-express/get-whole", "profile": "s3-express", "lane": "core", - "purpose": "get replaced", + "purpose": "get whole", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/multipart/replaced.bin", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -176804,7 +186318,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/replaced.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -176851,12 +186365,12 @@ "date": { "from": "now" }, - "etag": "\"fixture-eef5a071f9f6\"", + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Yg==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -176875,7 +186389,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/replaced.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -176926,17 +186440,17 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/1", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-eef5a071f9f6\"", + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Yg==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -176957,7 +186471,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-eef5a071f9f6\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -176965,7 +186479,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -176992,22 +186506,24 @@ "optional": false, "rule": { "is": "equal", - "value": "Yg==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/s3-express/get-single-part", + "id": "operations/s3-express/get-checksum", "profile": "s3-express", "lane": "core", - "purpose": "get single part", + "purpose": "Read an object with x-amz-checksum-mode: ENABLED, which makes S3 send the object's stored checksum, here CRC32, in x-amz-checksum-crc32 with x-amz-checksum-type: FULL_OBJECT. A range that covers the whole object gets it too. Check the body against it, and report it", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], "call": { - "key": "object-tests/multipart/single.bin", + "checksum_mode": true, + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -177101,7 +186617,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/single.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -177135,6 +186651,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -177148,12 +186672,14 @@ "date": { "from": "now" }, - "etag": "\"fixture-0841fa5d9c5c\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc32": "zYbXEQ==", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", - "data": "b25seQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -177172,7 +186698,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/single.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -177214,6 +186740,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -177223,17 +186757,19 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-3/4", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-0841fa5d9c5c\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc32": "zYbXEQ==", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", - "data": "b25seQ==" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -177254,7 +186790,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0841fa5d9c5c\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -177262,7 +186798,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 30 } }, { @@ -177289,26 +186825,37 @@ "optional": false, "rule": { "is": "equal", - "value": "b25seQ==" + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc32", + "type": "full_object", + "value_base64": "zYbXEQ==" + } } } ], "refusal": null }, { - "id": "operations/s3-express/get-suffix-longer-than-object", + "id": "operations/s3-express/get-checksum-default", "profile": "s3-express", "lane": "core", - "purpose": "get suffix longer than object", + "purpose": "Read with x-amz-checksum-mode: ENABLED an object written without a checksum. S3 stores a CRC64NVME for every new object and sends it, so a client checks CRC64NVME too", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], "call": { + "checksum_mode": true, "key": "object-tests/read/object.txt", - "op": "get", - "range": { - "suffix": 100 - } + "op": "get" }, "exchanges": [ { @@ -177412,14 +186959,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-100" - } - }, { "at": "/headers/host", "optional": false, @@ -177443,6 +186982,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -177450,15 +186997,16 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", @@ -177468,6 +187016,14 @@ }, { "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, { "at": "/path", "optional": false, @@ -177485,11 +187041,11 @@ } }, { - "at": "/method", + "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "HEAD" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -177517,108 +187073,14 @@ } }, { - "at": "/headers/range", + "at": "/headers/x-amz-checksum-mode", "optional": false, "rule": { "is": "equal", - "value": "bytes=-100" + "value": "ENABLED" } } ], - "then": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=0-29" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 206, - "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - } - ] - } - ], "allow_headers": [ "content-type" ], @@ -177626,17 +187088,19 @@ "response": { "status": 206, "headers": { - "content-length": "30", "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -177694,24 +187158,37 @@ "is": "equal", "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } + } } ], "refusal": null }, { - "id": "operations/s3-express/get-suffix", + "id": "operations/s3-express/get-checksum-mismatch", "profile": "s3-express", "lane": "core", - "purpose": "get suffix", + "purpose": "Report a body that does not match the checksum S3 sent for it as an error of kind checksum_mismatch, not as the object", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], + "origin": "constructed", + "derived_from": "operations/s3-express/get-checksum-default", "call": { + "checksum_mode": true, "key": "object-tests/read/object.txt", - "op": "get", - "range": { - "suffix": 6 - } + "op": "get" }, "exchanges": [ { @@ -177815,14 +187292,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-6" - } - }, { "at": "/headers/host", "optional": false, @@ -177846,6 +187315,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/x-amz-checksum-mode", + "optional": false, + "rule": { + "is": "equal", + "value": "ENABLED" + } } ], "allow_headers": [ @@ -177853,24 +187330,33 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 24-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", - "data": "b2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" } } }, { "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, { "at": "/path", "optional": false, @@ -177888,11 +187374,11 @@ } }, { - "at": "/method", + "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "HEAD" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -177920,108 +187406,14 @@ } }, { - "at": "/headers/range", + "at": "/headers/x-amz-checksum-mode", "optional": false, "rule": { "is": "equal", - "value": "bytes=-6" + "value": "ENABLED" } } ], - "then": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=24-29" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 206, - "headers": { - "content-range": "bytes 24-29/30", - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "b2JqZWN0" - } - } - } - ] - } - ], "allow_headers": [ "content-type" ], @@ -178029,17 +187421,19 @@ "response": { "status": 206, "headers": { - "content-length": "6", - "content-range": "bytes 24-29/30", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" } } } @@ -178052,63 +187446,29 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 6 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "b2JqZWN0" + "value": "checksum_mismatch" } } ], "refusal": null }, { - "id": "operations/s3-express/get-whole", + "id": "operations/s3-express/get-session-expired", "profile": "s3-express", "lane": "core", - "purpose": "get whole", + "purpose": "Renew a session whose Expiration has passed before using it: ask CreateSession again, and sign the GET with the second session", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], + "origin": "constructed", "call": { "key": "object-tests/read/object.txt", "op": "get" @@ -178179,6 +187539,79 @@ "encoding": "utf8", "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": -60 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-token-2fixture-secret-key-2fixture-access-key-2SESSION_EXPIRATION" + }, "body_time": { "text": "SESSION_EXPIRATION", "offset_seconds": 300 @@ -178228,7 +187661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "fixture-session-token-2" } }, { @@ -178236,7 +187669,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key-2/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], @@ -178307,7 +187740,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "fixture-session-token-2" } }, { @@ -178315,7 +187748,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key-2/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], @@ -178399,16 +187832,15 @@ "refusal": null }, { - "id": "operations/s3-express/get-session-expired", + "id": "operations/s3-express/get-xml-looking", "profile": "s3-express", "lane": "core", - "purpose": "Renew a session whose Expiration has passed before using it: ask CreateSession again, and sign the GET with the second session", + "purpose": "get xml looking", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], - "origin": "constructed", "call": { - "key": "object-tests/read/object.txt", + "key": "object", "op": "get" }, "exchanges": [ @@ -178479,7 +187911,7 @@ }, "body_time": { "text": "SESSION_EXPIRATION", - "offset_seconds": -60 + "offset_seconds": 300 } } } @@ -178502,11 +187934,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "/object" } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -178514,76 +187946,15 @@ } }, { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "absent" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml" - }, - "body": { - "encoding": "utf8", - "data": "\nfixture-session-token-2fixture-secret-key-2fixture-access-key-2SESSION_EXPIRATION" - }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } - } - } - ] - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, + "at": "/headers/content-type", + "optional": true, "rule": { - "is": "equal", - "value": "" + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] } }, { @@ -178599,7 +187970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token-2" + "value": "fixture-session-token" } }, { @@ -178607,27 +187978,26 @@ "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key-2/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } }, @@ -178646,7 +188016,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object" } }, { @@ -178657,6 +188027,18 @@ "value": "" } }, + { + "at": "/headers/content-type", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + "application/xml", + "application/octet-stream", + "binary/octet-stream" + ] + } + }, { "at": "/headers/range", "optional": false, @@ -178678,7 +188060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token-2" + "value": "fixture-session-token" } }, { @@ -178686,28 +188068,27 @@ "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key-2/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-range": "bytes 0-32/33", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-request-id": "fixture-request-id" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } } @@ -178723,60 +188104,26 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/body_base64", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } ], "refusal": null }, { - "id": "operations/s3-express/get-xml-looking", + "id": "operations/s3-express/get-noise-tolerance", "profile": "s3-express", "lane": "core", - "purpose": "get xml looking", + "purpose": "get noise tolerance", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" ], + "origin": "constructed", "call": { "key": "object", "op": "get" @@ -178929,13 +188276,14 @@ "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"a-different-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-request-id": "another-id", + "x-fixture-unknown": "ignored" }, "body": { "encoding": "base64", - "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "data": "aGVsbG8=" } } }, @@ -179015,18 +188363,19 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-32/33", + "content-range": "bytes 0-4/5", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-etag\"", + "etag": "\"a-different-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "fixture-request-id" + "x-amz-request-id": "another-id", + "x-fixture-unknown": "ignored" }, "body": { "encoding": "base64", - "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "data": "aGVsbG8=" } } } @@ -179047,23 +188396,24 @@ "optional": false, "rule": { "is": "equal", - "value": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "value": "aGVsbG8=" } } ], "refusal": null }, { - "id": "operations/s3-express/get-noise-tolerance", + "id": "operations/s3-express/get-body-cut-short", "profile": "s3-express", "lane": "core", - "purpose": "get noise tolerance", + "purpose": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" + "https://www.rfc-editor.org/rfc/rfc9112#section-8", + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_client.cpp" ], - "origin": "constructed", + "origin": "transient", "call": { - "key": "object", + "key": "object-tests/read/object.txt", "op": "get" }, "exchanges": [ @@ -179157,7 +188507,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -179168,18 +188518,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/host", "optional": false, @@ -179205,24 +188543,25 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "application/octet-stream", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"a-different-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "another-id", - "x-fixture-unknown": "ignored" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" - } + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + }, + "truncate_body_after": 15 } }, { @@ -179240,7 +188579,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -179251,18 +188590,6 @@ "value": "" } }, - { - "at": "/headers/content-type", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/octet-stream", - "binary/octet-stream" - ] - } - }, { "at": "/headers/range", "optional": false, @@ -179296,65 +188623,30 @@ } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 206, "headers": { - "content-range": "bytes 0-4/5", - "content-type": "application/octet-stream", + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"a-different-etag\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-request-id": "another-id", - "x-fixture-unknown": "ignored" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "aGVsbG8=" - } + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + }, + "truncate_body_after": 15 } } ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "aGVsbG8=" - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/get-body-cut-short", - "profile": "s3-express", - "lane": "core", - "purpose": "Report a body that ends before its Content-Length as an error, or resume it, but never return the short body", - "sources": [ - "https://www.rfc-editor.org/rfc/rfc9112#section-8", - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_client.cpp" - ], - "origin": "transient", - "call": { - "key": "object-tests/read/object.txt", - "op": "get" - }, - "exchanges": [ { "alternatives": [ { @@ -179372,11 +188664,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "/object-tests/read/object.txt" } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -179392,44 +188684,43 @@ } }, { - "at": "/headers/authorization", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "fixture-session-token" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "absent" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], "allow_headers": [ + "content-type", "content-type" ], "allow_query": [], "response": { "status": 200, "headers": { - "content-type": "application/xml" + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" - }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { @@ -179456,6 +188747,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, { "at": "/headers/host", "optional": false, @@ -179482,12 +188781,14 @@ } ], "allow_headers": [ + "content-type", "content-type" ], "allow_query": [], "response": { - "status": 200, + "status": 206, "headers": { + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -179498,8 +188799,7 @@ "body": { "encoding": "base64", "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - }, - "truncate_body_after": 15 + } } }, { @@ -179531,9 +188831,179 @@ { "at": "/headers/range", "optional": false, + "rule": { + "is": "equal", + "value": "bytes=15-" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 206, + "headers": { + "content-range": "bytes 15-29/30", + "content-type": "binary/octet-stream", + "date": { + "from": "now" + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "Y3QtdGVzdHMtb2JqZWN0" + } + } + } + ], + "optional": true + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "error", + "ok" + ] + } + }, + { + "at": "/value/body_base64", + "optional": true, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/get-slow-down", + "profile": "s3-express", + "lane": "core", + "purpose": "Report a 503 SlowDown answer as an error, after at most 5 retries", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" + ], + "origin": "transient", + "call": { + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, "rule": { "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/read/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" } }, { @@ -179566,27 +189036,20 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 503, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" }, - "truncate_body_after": 15 + "framing": "chunked" } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { @@ -179613,6 +189076,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, { "at": "/headers/host", "optional": false, @@ -179639,26 +189110,28 @@ } ], "allow_headers": [ - "content-type", "content-type" ], "allow_query": [], "response": { - "status": 200, + "status": 503, "headers": { - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" } - }, + } + ] + }, + { + "alternatives": [ { "request": [ { @@ -179685,14 +189158,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" - } - }, { "at": "/headers/host", "optional": false, @@ -179719,25 +189184,22 @@ } ], "allow_headers": [ - "content-type", "content-type" ], "allow_query": [], "response": { - "status": 206, + "status": 503, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } + "encoding": "utf8", + "data": "\nSlowDownPlease reduce your request rate.fixture" + }, + "framing": "chunked" } }, { @@ -179770,113 +189232,24 @@ "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "bytes=15-" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 206, - "headers": { - "content-range": "bytes 15-29/30", - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" - } - } - } - ], - "optional": true - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "error", - "ok" - ] - } - }, - { - "at": "/value/body_base64", - "optional": true, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/get-slow-down", - "profile": "s3-express", - "lane": "core", - "purpose": "Report a 503 SlowDown answer as an error, after at most 5 retries", - "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" - ], - "origin": "transient", - "call": { - "key": "object-tests/read/object.txt", - "op": "get" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { - "at": "/query/session", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/headers/host", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "value": "fixture-session-token" } }, { @@ -179884,14 +189257,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "absent" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } } ], @@ -179900,21 +189266,22 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 503, "headers": { - "content-type": "application/xml" + "content-type": "application/xml", + "date": { + "from": "now" + } }, "body": { "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "\nSlowDownPlease reduce your request rate.fixture" }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } + "framing": "chunked" } } - ] + ], + "optional": true }, { "alternatives": [ @@ -180066,7 +189433,8 @@ "framing": "chunked" } } - ] + ], + "optional": true }, { "alternatives": [ @@ -180292,90 +189660,7 @@ }, "framing": "chunked" } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/read/object.txt" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } - }, - "body": { - "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" - }, - "framing": "chunked" - } - } - ], - "optional": true - }, - { - "alternatives": [ + }, { "request": [ { @@ -180402,6 +189687,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, { "at": "/headers/host", "optional": false, @@ -180445,7 +189738,12 @@ }, "framing": "chunked" } - }, + } + ], + "optional": true + }, + { + "alternatives": [ { "request": [ { @@ -180472,14 +189770,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" - } - }, { "at": "/headers/host", "optional": false, @@ -180523,12 +189813,7 @@ }, "framing": "chunked" } - } - ], - "optional": true - }, - { - "alternatives": [ + }, { "request": [ { @@ -180555,6 +189840,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" + } + }, { "at": "/headers/host", "optional": false, @@ -180598,7 +189891,55 @@ }, "framing": "chunked" } - }, + } + ], + "optional": true + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 503 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "SlowDown" + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/get-if-unmodified-since-past", + "profile": "s3-express", + "lane": "core", + "purpose": "Refuse a read with 412 when the object changed after If-Unmodified-Since", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -180614,25 +189955,17 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/" } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" - } - }, { "at": "/headers/host", "optional": false, @@ -180642,19 +189975,18 @@ } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/authorization", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "absent" } } ], @@ -180663,22 +189995,21 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } - ], - "optional": true + ] }, { "alternatives": [ @@ -180731,6 +190062,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/if-unmodified-since", + "optional": false, + "rule": { + "is": "equal", + "value": "Sat, 01 Jan 2000 00:00:00 GMT" + } } ], "allow_headers": [ @@ -180738,7 +190077,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 412, "headers": { "content-type": "application/xml", "date": { @@ -180747,7 +190086,7 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nPreconditionFailedFixture error" }, "framing": "chunked" } @@ -180809,6 +190148,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/if-unmodified-since", + "optional": false, + "rule": { + "is": "equal", + "value": "Sat, 01 Jan 2000 00:00:00 GMT" + } } ], "allow_headers": [ @@ -180816,7 +190163,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 412, "headers": { "content-type": "application/xml", "date": { @@ -180825,13 +190172,12 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nPreconditionFailedFixture error" }, "framing": "chunked" } } - ], - "optional": true + ] } ], "expect": [ @@ -180848,7 +190194,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 412 } }, { @@ -180856,22 +190202,22 @@ "optional": false, "rule": { "is": "equal", - "value": "SlowDown" + "value": "PreconditionFailed" } } ], "refusal": null }, { - "id": "operations/s3-express/get-if-unmodified-since-past", + "id": "operations/s3-express/get-if-modified-since-future", "profile": "s3-express", "lane": "core", - "purpose": "Refuse a read with 412 when the object changed after If-Unmodified-Since", + "purpose": "Read an object when If-Modified-Since names a future date", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "if_modified_since": "Fri, 01 Jan 2100 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "get" }, @@ -181002,11 +190348,11 @@ } }, { - "at": "/headers/if-unmodified-since", + "at": "/headers/if-modified-since", "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "Fri, 01 Jan 2100 00:00:00 GMT" } } ], @@ -181015,18 +190361,19 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nPreconditionFailedFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } }, { @@ -181088,11 +190435,11 @@ } }, { - "at": "/headers/if-unmodified-since", + "at": "/headers/if-modified-since", "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "Fri, 01 Jan 2100 00:00:00 GMT" } } ], @@ -181101,18 +190448,20 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 206, "headers": { - "content-type": "application/xml", + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "\nPreconditionFailedFixture error" - }, - "framing": "chunked" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } } ] @@ -181124,38 +190473,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-672b31e65569\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "PreconditionFailed" + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], "refusal": null }, { - "id": "operations/s3-express/get-if-modified-since-future", + "id": "operations/s3-express/get-if-modified-since-past", "profile": "s3-express", "lane": "core", - "purpose": "Read an object when If-Modified-Since names a future date", + "purpose": "Read an object modified since a past date", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_modified_since": "Fri, 01 Jan 2100 00:00:00 GMT", + "if_modified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "get" }, @@ -181290,7 +190666,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Fri, 01 Jan 2100 00:00:00 GMT" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], @@ -181377,7 +190753,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Fri, 01 Jan 2100 00:00:00 GMT" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], @@ -181461,15 +190837,15 @@ "refusal": null }, { - "id": "operations/s3-express/get-if-modified-since-past", + "id": "operations/s3-express/get-if-modified-since-unchanged", "profile": "s3-express", "lane": "core", - "purpose": "Read an object modified since a past date", + "purpose": "Report an object not changed since the If-Modified-Since date as 304 Not Modified, not as an error of the service or an empty object", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_modified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "if_modified_since": "Mon, 01 Jan 2024 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "get" }, @@ -181604,7 +190980,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "Mon, 01 Jan 2024 00:00:00 GMT" } } ], @@ -181613,18 +190989,16 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 304, "headers": { - "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", + "etag": "\"fixture-ad03f2ab332a\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "encoding": "empty" } } }, @@ -181691,7 +191065,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "Mon, 01 Jan 2024 00:00:00 GMT" } } ], @@ -181700,19 +191074,16 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 304, "headers": { - "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", + "etag": "\"fixture-ad03f2ab332a\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "encoding": "empty" } } } @@ -181725,65 +191096,30 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": 304 } } ], "refusal": null }, { - "id": "operations/s3-express/get-if-modified-since-unchanged", + "id": "operations/s3-express/get-if-modified-since-invalid", "profile": "s3-express", "lane": "core", - "purpose": "Report an object not changed since the If-Modified-Since date as 304 Not Modified, not as an error of the service or an empty object", + "purpose": "Read an object when If-Modified-Since is not an HTTP date, which S3 ignores. A client may refuse the date instead", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_modified_since": "Mon, 01 Jan 2024 00:00:00 GMT", + "if_modified_since": "not a date", "key": "object-tests/read/object.txt", "op": "get" }, @@ -181918,7 +191254,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "not a date" } } ], @@ -181927,16 +191263,18 @@ ], "allow_query": [], "response": { - "status": 304, + "status": 200, "headers": { + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ad03f2ab332a\"", + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -182003,7 +191341,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "not a date" } } ], @@ -182012,16 +191350,19 @@ ], "allow_query": [], "response": { - "status": 304, + "status": 206, "headers": { + "content-range": "bytes 0-29/30", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ad03f2ab332a\"", + "etag": "\"fixture-672b31e65569\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -182034,30 +191375,90 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 304 + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "if_modified_since" + } + } + ], + "decline_permitted": true }, { - "id": "operations/s3-express/get-if-modified-since-invalid", + "id": "operations/s3-express/get-content-properties", "profile": "s3-express", "lane": "core", - "purpose": "Read an object when If-Modified-Since is not an HTTP date, which S3 ignores. A client may refuse the date instead", + "purpose": "Return the stored content properties from a GET", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_modified_since": "not a date", "key": "object-tests/read/object.txt", "op": "get" }, @@ -182121,11 +191522,14 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml" + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", + "content-type": "text/plain; charset=utf-8" }, "body": { "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "fixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, "body_time": { "text": "SESSION_EXPIRATION", @@ -182186,14 +191590,6 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } - }, - { - "at": "/headers/if-modified-since", - "optional": false, - "rule": { - "is": "equal", - "value": "not a date" - } } ], "allow_headers": [ @@ -182203,7 +191599,10 @@ "response": { "status": 200, "headers": { - "content-type": "binary/octet-stream", + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", + "content-type": "text/plain; charset=utf-8", "date": { "from": "now" }, @@ -182273,14 +191672,6 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } - }, - { - "at": "/headers/if-modified-since", - "optional": false, - "rule": { - "is": "equal", - "value": "not a date" - } } ], "allow_headers": [ @@ -182290,8 +191681,11 @@ "response": { "status": 206, "headers": { + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", "content-range": "bytes 0-29/30", - "content-type": "binary/octet-stream", + "content-type": "text/plain; charset=utf-8", "date": { "from": "now" }, @@ -182332,14 +191726,6 @@ "value": 30 } }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, { "at": "/value/version", "optional": true, @@ -182358,47 +191744,53 @@ "is": "equal", "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } - } - ], - "refusal": [ + }, { - "at": "/outcome", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "refused" + "value": "text/plain; charset=utf-8" } }, { - "at": "/kind", + "at": "/value/content_language", "optional": false, "rule": { - "is": "matches", - "pattern": ".+" + "is": "equal", + "value": "nl-NL" } }, { - "at": "/parameter", + "at": "/value/content_disposition", "optional": false, "rule": { "is": "equal", - "value": "if_modified_since" + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/value/cache_control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/s3-express/get-content-properties", + "id": "operations/s3-express/head-committed", "profile": "s3-express", "lane": "core", - "purpose": "Return the stored content properties from a GET", + "purpose": "head committed", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/object.txt", - "op": "get" + "key": "object-tests/multipart/object.bin", + "op": "head" }, "exchanges": [ { @@ -182460,14 +191852,11 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-type": "text/plain; charset=utf-8" + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "fixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, "body_time": { "text": "SESSION_EXPIRATION", @@ -182486,7 +191875,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -182494,7 +191883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/object.bin" } }, { @@ -182537,22 +191926,85 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-type": "text/plain; charset=utf-8", + "content-length": "5242886", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", + "etag": "\"fixture-ec4f3b9bcac2\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "" } } - }, + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ec4f3b9bcac2\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 5242886 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/head-metadata", + "profile": "s3-express", + "lane": "core", + "purpose": "head metadata", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/metadata/object.txt", + "op": "head" + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -182568,11 +192020,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/" } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", @@ -182580,11 +192032,76 @@ } }, { - "at": "/headers/range", + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", "optional": false, "rule": { "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/object-tests/metadata/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" } }, { @@ -182617,22 +192134,21 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-range": "bytes 0-29/30", - "content-type": "text/plain; charset=utf-8", + "content-length": "1", + "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "etag": "\"fixture-ee657e36119d\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-meta-name": "value", + "x-amz-meta-second": "2" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "" } } } @@ -182653,7 +192169,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-672b31e65569\"" + "value": "\"fixture-ee657e36119d\"" } }, { @@ -182661,26 +192177,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": 1 } }, { @@ -182688,46 +192185,49 @@ "optional": false, "rule": { "is": "equal", - "value": "text/plain; charset=utf-8" + "value": "binary/octet-stream" } }, { - "at": "/value/content_language", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "nl-NL" + "is": "one_of", + "values": [ + null, + "" + ] } }, { - "at": "/value/content_disposition", + "at": "/value/metadata/name", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "value" } }, { - "at": "/value/cache_control", + "at": "/value/metadata/second", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "2" } } ], "refusal": null }, { - "id": "operations/s3-express/head-committed", + "id": "operations/s3-express/head-missing", "profile": "s3-express", "lane": "core", - "purpose": "head committed", + "purpose": "Report a HEAD answered 404 as not_found or missing. Its answer has no body, so it cannot say whether the object or the bucket is absent", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/multipart/object.bin", + "key": "object-tests/read/absent.txt", "op": "head" }, "exchanges": [ @@ -182821,7 +192321,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/read/absent.txt" } }, { @@ -182862,15 +192362,12 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 404, "headers": { - "content-length": "5242886", - "content-type": "binary/octet-stream", + "content-type": "application/xml", "date": { "from": "now" - }, - "etag": "\"fixture-ec4f3b9bcac2\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { "encoding": "base64", @@ -182887,41 +192384,25 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-ec4f3b9bcac2\"" + "value": "error" } }, { - "at": "/value/size", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": 5242886 + "value": 404 } }, { - "at": "/value/content_type", + "at": "/kind", "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, "rule": { "is": "one_of", "values": [ - null, - "" + "not_found", + "missing" ] } } @@ -182929,15 +192410,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-metadata", + "id": "operations/s3-express/head", "profile": "s3-express", "lane": "core", - "purpose": "head metadata", + "purpose": "head", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/metadata/object.txt", + "key": "object-tests/read/object.txt", "op": "head" }, "exchanges": [ @@ -183031,7 +192512,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/object.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -183074,15 +192555,13 @@ "response": { "status": 200, "headers": { - "content-length": "1", + "content-length": "30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ee657e36119d\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-amz-meta-name": "value", - "x-amz-meta-second": "2" + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", @@ -183107,7 +192586,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ee657e36119d\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -183115,7 +192594,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -183136,36 +192615,20 @@ "" ] } - }, - { - "at": "/value/metadata/name", - "optional": false, - "rule": { - "is": "equal", - "value": "value" - } - }, - { - "at": "/value/metadata/second", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } } ], "refusal": null }, { - "id": "operations/s3-express/head-missing", + "id": "operations/s3-express/head-content-properties", "profile": "s3-express", "lane": "core", - "purpose": "Report a HEAD answered 404 as not_found or missing. Its answer has no body, so it cannot say whether the object or the bucket is absent", + "purpose": "Return the stored content properties from a HEAD", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/absent.txt", + "key": "object-tests/read/object.txt", "op": "head" }, "exchanges": [ @@ -183228,11 +192691,14 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml" + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", + "content-type": "text/plain; charset=utf-8" }, "body": { "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "fixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, "body_time": { "text": "SESSION_EXPIRATION", @@ -183259,7 +192725,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/absent.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -183300,12 +192766,18 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 200, "headers": { - "content-type": "application/xml", + "cache-control": "max-age=3600", + "content-disposition": "attachment; filename=\"report.txt\"", + "content-language": "nl-NL", + "content-length": "30", + "content-type": "text/plain; charset=utf-8", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", @@ -183322,40 +192794,81 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-672b31e65569\"" } }, { - "at": "/kind", + "at": "/value/size", "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/version", + "optional": true, "rule": { "is": "one_of", "values": [ - "not_found", - "missing" + null, + "" ] } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain; charset=utf-8" + } + }, + { + "at": "/value/content_language", + "optional": false, + "rule": { + "is": "equal", + "value": "nl-NL" + } + }, + { + "at": "/value/content_disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename=\"report.txt\"" + } + }, + { + "at": "/value/cache_control", + "optional": false, + "rule": { + "is": "equal", + "value": "max-age=3600" + } } ], "refusal": null }, { - "id": "operations/s3-express/head", + "id": "operations/s3-express/head-if-unmodified-since-past", "profile": "s3-express", "lane": "core", - "purpose": "head", + "purpose": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/read/object.txt", "op": "head" }, @@ -183484,6 +192997,14 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } + }, + { + "at": "/headers/if-unmodified-since", + "optional": false, + "rule": { + "is": "equal", + "value": "Sat, 01 Jan 2000 00:00:00 GMT" + } } ], "allow_headers": [ @@ -183491,19 +193012,14 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { - "content-length": "30", - "content-type": "binary/octet-stream", "date": { "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -183516,57 +193032,30 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 + "value": "error" } }, { - "at": "/value/content_type", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": 412 } } ], "refusal": null }, { - "id": "operations/s3-express/head-content-properties", + "id": "operations/s3-express/head-key-question", "profile": "s3-express", "lane": "core", - "purpose": "Return the stored content properties from a HEAD", + "purpose": "head, with the key \"question?mark.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/read/object.txt", + "key": "object-tests/keys/question?mark.txt", "op": "head" }, "exchanges": [ @@ -183629,14 +193118,11 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", - "content-type": "text/plain; charset=utf-8" + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "fixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, "body_time": { "text": "SESSION_EXPIRATION", @@ -183663,7 +193149,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/keys/question?mark.txt" } }, { @@ -183706,11 +193192,8 @@ "response": { "status": 200, "headers": { - "cache-control": "max-age=3600", - "content-disposition": "attachment; filename=\"report.txt\"", - "content-language": "nl-NL", "content-length": "30", - "content-type": "text/plain; charset=utf-8", + "content-type": "binary/octet-stream", "date": { "from": "now" }, @@ -183751,63 +193234,38 @@ "value": 30 } }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "text/plain; charset=utf-8" - } - }, - { - "at": "/value/content_language", - "optional": false, - "rule": { - "is": "equal", - "value": "nl-NL" - } - }, - { - "at": "/value/content_disposition", - "optional": false, - "rule": { - "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "binary/octet-stream" } }, { - "at": "/value/cache_control", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "max-age=3600" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/s3-express/head-if-unmodified-since-past", + "id": "operations/s3-express/head-key-hash", "profile": "s3-express", "lane": "core", - "purpose": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", + "purpose": "head, with the key \"hash#tag.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", - "key": "object-tests/read/object.txt", + "key": "object-tests/keys/hash#tag.txt", "op": "head" }, "exchanges": [ @@ -183901,7 +193359,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/keys/hash#tag.txt" } }, { @@ -183935,14 +193393,6 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } - }, - { - "at": "/headers/if-unmodified-since", - "optional": false, - "rule": { - "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" - } } ], "allow_headers": [ @@ -183950,14 +193400,19 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 200, "headers": { + "content-length": "30", + "content-type": "binary/octet-stream", "date": { "from": "now" - } + }, + "etag": "\"fixture-672b31e65569\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -183970,30 +193425,57 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-672b31e65569\"" + } + }, + { + "at": "/value/size", + "optional": false, + "rule": { + "is": "equal", + "value": 30 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "binary/octet-stream" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/s3-express/head-key-question", + "id": "operations/s3-express/head-key-percent", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"question?mark.txt\"", + "purpose": "head, with the key \"percent%20.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/question?mark.txt", + "key": "object-tests/keys/percent%20.txt", "op": "head" }, "exchanges": [ @@ -184087,7 +193569,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/question?mark.txt" + "value": "/object-tests/keys/percent%20.txt" } }, { @@ -184195,15 +193677,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-hash", + "id": "operations/s3-express/head-key-plus", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"hash#tag.txt\"", + "purpose": "head, with the key \"plus+plus.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/hash#tag.txt", + "key": "object-tests/keys/plus+plus.txt", "op": "head" }, "exchanges": [ @@ -184297,7 +193779,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/hash#tag.txt" + "value": "/object-tests/keys/plus+plus.txt" } }, { @@ -184405,15 +193887,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-percent", + "id": "operations/s3-express/head-key-space", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"percent%20.txt\"", + "purpose": "head, with the key \"space name.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/percent%20.txt", + "key": "object-tests/keys/space name.txt", "op": "head" }, "exchanges": [ @@ -184507,7 +193989,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/percent%20.txt" + "value": "/object-tests/keys/space name.txt" } }, { @@ -184615,15 +194097,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-plus", + "id": "operations/s3-express/head-key-non-ascii", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"plus+plus.txt\"", + "purpose": "head, with the key \"café/雪.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/plus+plus.txt", + "key": "object-tests/keys/café/雪.txt", "op": "head" }, "exchanges": [ @@ -184717,7 +194199,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/plus+plus.txt" + "value": "/object-tests/keys/café/雪.txt" } }, { @@ -184825,15 +194307,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-space", + "id": "operations/s3-express/head-key-double-slash", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"space name.txt\"", + "purpose": "head, with the key \"double//slash.txt\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/space name.txt", + "key": "object-tests/keys/double//slash.txt", "op": "head" }, "exchanges": [ @@ -184927,7 +194409,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/space name.txt" + "value": "/object-tests/keys/double//slash.txt" } }, { @@ -185035,15 +194517,15 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-non-ascii", + "id": "operations/s3-express/head-key-trailing-slash", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"café/雪.txt\"", + "purpose": "head, with the key \"trailing-slash/\"", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/keys/café/雪.txt", + "key": "object-tests/keys/trailing-slash/", "op": "head" }, "exchanges": [ @@ -185137,7 +194619,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/café/雪.txt" + "value": "/object-tests/keys/trailing-slash/" } }, { @@ -185245,15 +194727,17 @@ "refusal": null }, { - "id": "operations/s3-express/head-key-double-slash", + "id": "operations/s3-express/head-checksum", "profile": "s3-express", "lane": "core", - "purpose": "head, with the key \"double//slash.txt\"", + "purpose": "Ask a HEAD for the object's checksum with x-amz-checksum-mode: ENABLED, and report it", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html", + "https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html" ], "call": { - "key": "object-tests/keys/double//slash.txt", + "checksum_mode": true, + "key": "object-tests/read/object.txt", "op": "head" }, "exchanges": [ @@ -185347,7 +194831,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/double//slash.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -185381,215 +194865,13 @@ "is": "matches", "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-length": "30", - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-672b31e65569\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 30 - } - }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/head-key-trailing-slash", - "profile": "s3-express", - "lane": "core", - "purpose": "head, with the key \"trailing-slash/\"", - "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" - ], - "call": { - "key": "object-tests/keys/trailing-slash/", - "op": "head" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } }, { - "at": "/path", + "at": "/headers/x-amz-checksum-mode", "optional": false, "rule": { "is": "equal", - "value": "/" - } - }, - { - "at": "/query/session", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "absent" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "application/xml" - }, - "body": { - "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" - }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } - } - } - ] - }, - { - "alternatives": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "HEAD" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/object-tests/keys/trailing-slash/" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" - } - }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "value": "ENABLED" } } ], @@ -185606,7 +194888,9 @@ "from": "now" }, "etag": "\"fixture-672b31e65569\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-amz-checksum-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" }, "body": { "encoding": "base64", @@ -185660,6 +194944,18 @@ "" ] } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } + } } ], "refusal": null @@ -188225,38 +197521,1353 @@ } }, { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 10 - } + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 10 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-first-page", + "profile": "s3-express", + "lane": "core", + "purpose": "Send page_size as max-keys, and report a truncated page's NextContinuationToken as the continuation token", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "op": "list_page", + "page_size": 2, + "prefix": "object-tests/board/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=22trueCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + } + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=22urltrueCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/z.txt" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-7d1b875717fa\"" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/nested/c.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-d9b959b4d7a6\"" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/88ab99096baf=" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-service-unavailable", + "profile": "s3-express", + "lane": "core", + "purpose": "Report a 503 ServiceUnavailable answer as an error, after at most 5 retries", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" + ], + "origin": "transient", + "call": { + "op": "list_page", + "page_size": 2, + "prefix": "object-tests/board/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + } + ], + "optional": true }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - } - ], - "refusal": null - }, - { - "id": "operations/s3-express/list-first-page", - "profile": "s3-express", - "lane": "core", - "purpose": "Send page_size as max-keys, and report a truncated page's NextContinuationToken as the continuation token", - "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" - ], - "call": { - "op": "list_page", - "page_size": 2, - "prefix": "object-tests/board/" - }, - "exchanges": [ { "alternatives": [ { @@ -188278,13 +198889,37 @@ } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", "value": "" } }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, { "at": "/headers/host", "optional": false, @@ -188293,19 +198928,122 @@ "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-session-token" + } + }, { "at": "/headers/authorization", "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 503, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/" + } + }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "absent" + "is": "equal", + "value": "fixture-session-token" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/query/encoding-type", + "optional": false, + "rule": { + "is": "equal", + "value": "url" } } ], @@ -188314,21 +199052,22 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 503, "headers": { - "content-type": "application/xml" + "content-type": "application/xml", + "date": { + "from": "now" + } }, "body": { "encoding": "utf8", - "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" }, - "body_time": { - "text": "SESSION_EXPIRATION", - "offset_seconds": 300 - } + "framing": "chunked" } } - ] + ], + "optional": true }, { "alternatives": [ @@ -188412,18 +199151,18 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 503, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=22trueCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" - } + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" } }, { @@ -188514,21 +199253,22 @@ ], "allow_query": [], "response": { - "status": 200, + "status": 503, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + } }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=22urltrueCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" - } + "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + }, + "framing": "chunked" } } - ] + ], + "optional": true } ], "expect": [ @@ -188537,162 +199277,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/z.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-7d1b875717fa\"" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/nested/c.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 + "value": "error" } }, { - "at": "/value/entries/1/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-d9b959b4d7a6\"" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "value": 503 } }, { - "at": "/value/continuation_token", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/88ab99096baf=" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "ServiceUnavailable" } } ], "refusal": null }, { - "id": "operations/s3-express/list-service-unavailable", + "id": "operations/s3-express/list-max-keys-zero", "profile": "s3-express", "lane": "core", - "purpose": "Report a 503 ServiceUnavailable answer as an error, after at most 5 retries", + "purpose": "Send page_size 0 as max-keys=0; S3 answers an empty page that is not truncated", "sources": [ - "https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html" + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], - "origin": "transient", "call": { "op": "list_page", - "page_size": 2, + "page_size": 0, "prefix": "object-tests/board/" }, "exchanges": [ @@ -188818,7 +199435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "0" } }, { @@ -188851,18 +199468,18 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/board/00false" + } } }, { @@ -188912,7 +199529,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "0" } }, { @@ -188953,18 +199570,143 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/board/00urlfalse" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-next-page", + "profile": "s3-express", + "lane": "core", + "purpose": "Send the continuation token as continuation-token, a + in it as %2B, and report an empty token for the last page", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "continuation_token": "fixture-marker+/88ab99096baf=", + "op": "list_page", + "page_size": 2, + "prefix": "object-tests/board/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" } }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } ] @@ -189021,6 +199763,14 @@ "value": "2" } }, + { + "at": "/query/continuation-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/88ab99096baf=" + } + }, { "at": "/headers/host", "optional": false, @@ -189051,18 +199801,18 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=12falseCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + } } }, { @@ -189115,6 +199865,14 @@ "value": "2" } }, + { + "at": "/query/continuation-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/88ab99096baf=" + } + }, { "at": "/headers/host", "optional": false, @@ -189153,22 +199911,202 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "utf8", + "data": "\nfixtureobject-tests/board/Aa76REiOO0gPR6lKkFyUFtl1AAAAAAAAAAGoXKBqAAAAAAQAAAAAAAAAscQ7ZzgAAAAAAAAAQUI4QUFBQUFBQUFBYjJKcVpXTjBMWFJsYzNSekwySnZZWEprTDI1bGMzUmxaQzlqTG5SNGRBRT3cnmYCxwsmD0raHf15FaRAP0L8TRD3Kes0lU2EWDoJdA==12urlfalseCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/a.txt" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 8 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ca40e4206a8d\"" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-order-delimited", + "profile": "s3-express", + "lane": "core", + "purpose": "Report the entries and the common prefixes in the order a directory bucket sends them, without sorting them", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "delimiter": "/", + "op": "list_page", + "prefix": "object-tests/order/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/query/session", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/headers/host", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + } + }, + { + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } - ], - "optional": true + ] }, { "alternatives": [ @@ -189211,15 +200149,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "object-tests/order/" } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "/" } }, { @@ -189252,18 +200190,18 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/order/81000falseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/é2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT/object-tests/order/a/" + } } }, { @@ -189305,15 +200243,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "object-tests/order/" } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "/" } }, { @@ -189354,23 +200292,479 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/order/81000urlfalseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/%C3%A92024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT/object-tests/order/a/" + } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-67e7081fe36a\"" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/é" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-e93bd77ca678\"" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a0" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-b6a492ea4100\"" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a.txt" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-3a908dcdb129\"" + } }, + { + "at": "/value/entries/3/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/4/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/A" + } + }, + { + "at": "/value/entries/4/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a19aa03709bc\"" + } + }, + { + "at": "/value/entries/4/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/5/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a-b" + } + }, + { + "at": "/value/entries/5/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-62a88dc05318\"" + } + }, + { + "at": "/value/entries/5/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/6/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/b" + } + }, + { + "at": "/value/entries/6/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/6/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-58bd4a8a6eb3\"" + } + }, + { + "at": "/value/entries/6/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/6/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/6/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/prefixes/0", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a/" + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 7 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-order", + "profile": "s3-express", + "lane": "core", + "purpose": "Report the entries in the order a directory bucket sends them, which is not sorted, without sorting them again", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/order/" + }, + "exchanges": [ { "alternatives": [ { @@ -189392,7 +200786,7 @@ } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", @@ -189400,29 +200794,94 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/authorization", + "optional": false, + "rule": { + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + } + }, + { + "at": "/headers/x-amz-s3session-token", + "optional": false, + "rule": { + "is": "absent" + } + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-type": "application/xml" + }, + "body": { + "encoding": "utf8", + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" + }, + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ + { + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "GET" } }, { - "at": "/query/max-keys", + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/list-type", "optional": false, "rule": { "is": "equal", "value": "2" } }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/" + } + }, { "at": "/headers/host", "optional": false, @@ -189453,18 +200912,18 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/order/81000falseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/é2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-bdef091a4e21"object-tests/order/a/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + } } }, { @@ -189506,15 +200965,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" + "value": "object-tests/order/" } }, { @@ -189555,23 +201006,529 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" + "data": "\nfixtureobject-tests/order/81000urlfalseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/%C3%A92024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-bdef091a4e21"object-tests/order/a/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-67e7081fe36a\"" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/é" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-e93bd77ca678\"" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a0" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-b6a492ea4100\"" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a.txt" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-3a908dcdb129\"" + } + }, + { + "at": "/value/entries/3/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/3/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/4/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/A" + } + }, + { + "at": "/value/entries/4/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a19aa03709bc\"" + } + }, + { + "at": "/value/entries/4/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/4/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/5/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a/b" + } + }, + { + "at": "/value/entries/5/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-bdef091a4e21\"" + } + }, + { + "at": "/value/entries/5/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/5/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/6/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/a-b" + } + }, + { + "at": "/value/entries/6/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/6/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-62a88dc05318\"" + } + }, + { + "at": "/value/entries/6/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/6/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/6/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/7/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/order/b" + } + }, + { + "at": "/value/entries/7/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/7/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-58bd4a8a6eb3\"" + } + }, + { + "at": "/value/entries/7/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/7/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/7/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 8 + } }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + } + ], + "refusal": null + }, + { + "id": "operations/s3-express/list-other-delimiter", + "profile": "s3-express", + "lane": "core", + "purpose": "Report the 400 InvalidRequest that a directory bucket answers to a delimiter other than /, or refuse it before sending", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "delimiter": "-", + "op": "list_page", + "prefix": "object-tests/board/" + }, + "exchanges": [ { "alternatives": [ { @@ -189593,37 +201550,13 @@ } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", "value": "" } }, - { - "at": "/query/list-type", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, { "at": "/headers/host", "optional": false, @@ -189632,122 +201565,19 @@ "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, - { - "at": "/headers/x-amz-s3session-token", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, { "at": "/headers/authorization", "optional": false, "rule": { "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 503, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } - }, - "body": { - "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" - }, - "framing": "chunked" - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/" - } - }, - { - "at": "/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, - { - "at": "/query/list-type", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/headers/host", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "pattern": "AWS4-HMAC-SHA256 Credential=offline/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" - } - }, - { - "at": "/query/encoding-type", - "optional": false, - "rule": { - "is": "equal", - "value": "url" + "is": "absent" } } ], @@ -189756,22 +201586,21 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - } + "content-type": "application/xml" }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nfixture-session-tokenfixture-secret-keyfixture-access-keySESSION_EXPIRATION" }, - "framing": "chunked" + "body_time": { + "text": "SESSION_EXPIRATION", + "offset_seconds": 300 + } } } - ], - "optional": true + ] }, { "alternatives": [ @@ -189818,11 +201647,11 @@ } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "-" } }, { @@ -189855,7 +201684,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 400, "headers": { "content-type": "application/xml", "date": { @@ -189864,7 +201693,7 @@ }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nInvalidRequestFixture error" }, "framing": "chunked" } @@ -189912,11 +201741,11 @@ } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "-" } }, { @@ -189957,7 +201786,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 400, "headers": { "content-type": "application/xml", "date": { @@ -189966,13 +201795,12 @@ }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nInvalidRequestThis bucket only supports '/' as a delimiter01a36c7dc10001a08269f29d0c1a80c2547f97e2NIAczpdqY" }, "framing": "chunked" } } - ], - "optional": true + ] } ], "expect": [ @@ -189989,7 +201817,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 400 } }, { @@ -189997,23 +201825,63 @@ "optional": false, "rule": { "is": "equal", - "value": "ServiceUnavailable" + "value": "InvalidRequest" } } ], - "refusal": null + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", + "optional": false, + "rule": { + "is": "equal", + "value": "delimiter" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidRequest" + } + } + ] }, { - "id": "operations/s3-express/list-max-keys-zero", + "id": "operations/s3-express/list-page", "profile": "s3-express", "lane": "core", - "purpose": "Send page_size 0 as max-keys=0; S3 answers an empty page that is not truncated", + "purpose": "List a prefix with ListObjectsV2 (list-type=2), and report each entry's key, size and ETag, quotes included", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { "op": "list_page", - "page_size": 0, "prefix": "object-tests/board/" }, "exchanges": [ @@ -190134,14 +202002,6 @@ "value": "object-tests/board/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "0" - } - }, { "at": "/headers/host", "optional": false, @@ -190182,7 +202042,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/00false" + "data": "\nfixtureobject-tests/board/31000falseCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" } } }, @@ -190228,14 +202088,6 @@ "value": "object-tests/board/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "0" - } - }, { "at": "/headers/host", "optional": false, @@ -190284,7 +202136,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/00urlfalse" + "data": "\nfixtureobject-tests/board/31000urlfalseCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" } } } @@ -190300,6 +202152,177 @@ "value": "ok" } }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/z.txt" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-7d1b875717fa\"" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/nested/c.txt" + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-d9b959b4d7a6\"" + } + }, + { + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/a.txt" + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 8 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ca40e4206a8d\"" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, { "at": "/value/continuation_token", "optional": false, @@ -190313,7 +202336,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 3 } }, { @@ -190328,18 +202351,16 @@ "refusal": null }, { - "id": "operations/s3-express/list-next-page", + "id": "operations/s3-express/list-uploads", "profile": "s3-express", "lane": "core", - "purpose": "Send the continuation token as continuation-token, a + in it as %2B, and report an empty token for the last page", + "purpose": "List the multipart uploads in progress under a prefix with ListMultipartUploads, a GET with ?uploads, and report each upload's key and upload ID, in key order", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "continuation_token": "fixture-marker+/88ab99096baf=", - "op": "list_page", - "page_size": 2, - "prefix": "object-tests/board/" + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -190444,59 +202465,46 @@ } }, { - "at": "/query/list-type", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/prefix", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/max-keys", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture-session-token" } }, { - "at": "/query/continuation-token", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture-marker+/88ab99096baf=" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/host", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" - } - }, - { - "at": "/headers/authorization", - "optional": false, - "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "value": "object-tests/uploads/" } } ], @@ -190515,7 +202523,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/fixture-marker+/88ab99096baf=12falseCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000falseobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Zobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } }, @@ -190546,67 +202554,54 @@ } }, { - "at": "/query/list-type", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/max-keys", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/continuation-token", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/88ab99096baf=" + "value": "fixture-session-token" } }, { - "at": "/headers/host", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "url" } }, { - "at": "/headers/authorization", + "at": "/query/uploads", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/query/encoding-type", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "url" + "value": "object-tests/uploads/" } } ], @@ -190625,7 +202620,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/Aa76REiOO0gPR6lKkFyUFtl1AAAAAAAAAAGoXKBqAAAAAAQAAAAAAAAAscQ7ZzgAAAAAAAAAQUI4QUFBQUFBQUFBYjJKcVpXTjBMWFJsYzNSekwySnZZWEprTDI1bGMzUmxaQzlqTG5SNGRBRT3cnmYCxwsmD0raHf15FaRAP0L8TRD3Kes0lU2EWDoJdA==12urlfalseCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/b.binfixture-upload-bobject-tests/uploads/1000urlfalseobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Zobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } } @@ -190642,101 +202637,76 @@ } }, { - "at": "/value/entries/0/key", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/board/a.txt" + "is": "array_length", + "value": 2 } }, { - "at": "/value/entries/0/size", + "at": "/value/uploads/0/key", "optional": false, "rule": { "is": "equal", - "value": 8 + "value": "object-tests/uploads/a.bin" } }, { - "at": "/value/entries/0/etag", + "at": "/value/uploads/0/upload_id", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ca40e4206a8d\"" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "fixture-upload-a" } }, { - "at": "/value/entries/0/is_current_version", - "optional": true, + "at": "/value/uploads/1/key", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": "object-tests/uploads/b.bin" } }, { - "at": "/value/continuation_token", + "at": "/value/uploads/1/upload_id", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-upload-b" } }, { - "at": "/value/entries", + "at": "/value/prefixes", "optional": false, "rule": { "is": "array_length", - "value": 1 + "value": 0 } }, { - "at": "/value/prefixes", + "at": "/value/is_truncated", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": false } } ], "refusal": null }, { - "id": "operations/s3-express/list-order-delimited", + "id": "operations/s3-express/list-uploads-page", "profile": "s3-express", "lane": "core", - "purpose": "Report the entries and the common prefixes in the order a directory bucket sends them, without sorting them", + "purpose": "List one upload a page with max-uploads=1. A truncated page names the next page's start in NextKeyMarker and NextUploadIdMarker, which a client reports", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "delimiter": "/", - "op": "list_page", - "prefix": "object-tests/order/" + "op": "s3.list_uploads", + "page_size": 1, + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -190841,51 +202811,54 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/" + "value": "fixture-session-token" } }, { - "at": "/query/delimiter", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "/" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/host", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "object-tests/uploads/" } }, { - "at": "/headers/authorization", + "at": "/query/max-uploads", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "1" } } ], @@ -190904,7 +202877,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/order/81000falseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/é2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT/object-tests/order/a/" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/a.binfixture-upload-aobject-tests/uploads/1trueobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } }, @@ -190935,59 +202908,62 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/" + "value": "fixture-session-token" } }, { - "at": "/query/delimiter", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "/" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/host", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "value": "url" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/authorization", + "at": "/query/prefix", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "object-tests/uploads/" } }, { - "at": "/query/encoding-type", + "at": "/query/max-uploads", "optional": false, "rule": { "is": "equal", - "value": "url" + "value": "1" } } ], @@ -191006,467 +202982,93 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/order/81000urlfalseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/%C3%A92024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT/object-tests/order/a/" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/a.binfixture-upload-aobject-tests/uploads/1urltrueobject-tests/uploads/a.binfixture-upload-afixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } } ] } ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-67e7081fe36a\"" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/é" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-e93bd77ca678\"" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a0" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b6a492ea4100\"" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/3/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a.txt" - } - }, - { - "at": "/value/entries/3/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/3/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-3a908dcdb129\"" - } - }, - { - "at": "/value/entries/3/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/3/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/3/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/4/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/A" - } - }, - { - "at": "/value/entries/4/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/4/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-a19aa03709bc\"" - } - }, - { - "at": "/value/entries/4/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/4/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/4/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, + "expect": [ { - "at": "/value/entries/5/key", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a-b" + "value": "ok" } }, { - "at": "/value/entries/5/size", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 1 } }, { - "at": "/value/entries/5/etag", + "at": "/value/uploads/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-62a88dc05318\"" - } - }, - { - "at": "/value/entries/5/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/5/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "object-tests/uploads/a.bin" } }, { - "at": "/value/entries/5/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/6/key", + "at": "/value/uploads/0/upload_id", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/b" + "value": "fixture-upload-a" } }, { - "at": "/value/entries/6/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": 1 + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/6/etag", + "at": "/value/is_truncated", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-58bd4a8a6eb3\"" - } - }, - { - "at": "/value/entries/6/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "value": true } }, { - "at": "/value/prefixes/0", + "at": "/value/next_key_marker", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a/" + "value": "object-tests/uploads/a.bin" } }, { - "at": "/value/continuation_token", + "at": "/value/next_upload_id_marker", "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 7 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "fixture-upload-a" } } ], "refusal": null }, { - "id": "operations/s3-express/list-order", + "id": "operations/s3-express/list-uploads-after-key", "profile": "s3-express", "lane": "core", - "purpose": "Report the entries in the order a directory bucket sends them, which is not sorted, without sorting them again", + "purpose": "On a directory bucket, list the uploads after the first page by passing its NextKeyMarker, an opaque token, in key-marker. A key there is refused with 400 InvalidArgument", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "op": "list_page", - "prefix": "object-tests/order/" + "key_marker": "fixture-next-key-marker", + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -191571,43 +203173,54 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/" + "value": "fixture-session-token" } }, { - "at": "/headers/host", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "object-tests/uploads/" } }, { - "at": "/headers/authorization", + "at": "/query/key-marker", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "fixture-next-key-marker" } } ], @@ -191626,7 +203239,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/order/81000falseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/é2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-bdef091a4e21"object-tests/order/a/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3fixture-next-key-markerobject-tests/uploads/1000falseobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } }, @@ -191657,51 +203270,62 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/" + "value": "fixture-session-token" } }, { - "at": "/headers/host", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "url" } }, { - "at": "/headers/authorization", + "at": "/query/uploads", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/query/encoding-type", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "url" + "value": "object-tests/uploads/" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-next-key-marker" } } ], @@ -191720,7 +203344,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/order/81000urlfalseCRC64NVME"fixture-67e7081fe36a"object-tests/order/a2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-e93bd77ca678"object-tests/order/%C3%A92024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-b6a492ea4100"object-tests/order/a02024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-3a908dcdb129"object-tests/order/a.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-a19aa03709bc"object-tests/order/A2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-bdef091a4e21"object-tests/order/a/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-62a88dc05318"object-tests/order/a-b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-58bd4a8a6eb3"object-tests/order/b2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3fixture-next-key-markerobject-tests/uploads/1000urlfalseobject-tests/uploads/b.binfixture-upload-bfixture-initiatorfixture-initiatorEXPRESS_ONEZONE2024-01-01T00:00:00.000Z" } } } @@ -191737,500 +203361,60 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-67e7081fe36a\"" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/é" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-e93bd77ca678\"" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a0" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b6a492ea4100\"" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/3/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a.txt" - } - }, - { - "at": "/value/entries/3/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/3/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-3a908dcdb129\"" - } - }, - { - "at": "/value/entries/3/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/3/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/3/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/4/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/A" - } - }, - { - "at": "/value/entries/4/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/4/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-a19aa03709bc\"" - } - }, - { - "at": "/value/entries/4/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/4/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/4/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/5/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a/b" - } - }, - { - "at": "/value/entries/5/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/5/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-bdef091a4e21\"" - } - }, - { - "at": "/value/entries/5/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/5/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/5/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/6/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/a-b" - } - }, - { - "at": "/value/entries/6/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/6/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-62a88dc05318\"" - } - }, - { - "at": "/value/entries/6/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/6/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/7/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/order/b" - } - }, - { - "at": "/value/entries/7/size", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 1 } }, { - "at": "/value/entries/7/etag", + "at": "/value/uploads/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-58bd4a8a6eb3\"" - } - }, - { - "at": "/value/entries/7/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/7/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/7/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "value": "object-tests/uploads/b.bin" } }, { - "at": "/value/continuation_token", + "at": "/value/uploads/0/upload_id", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-upload-b" } }, { - "at": "/value/entries", + "at": "/value/prefixes", "optional": false, "rule": { "is": "array_length", - "value": 8 + "value": 0 } }, { - "at": "/value/prefixes", + "at": "/value/is_truncated", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": false } } ], "refusal": null }, { - "id": "operations/s3-express/list-other-delimiter", + "id": "operations/s3-express/list-uploads-delimited", "profile": "s3-express", "lane": "core", - "purpose": "Report the 400 InvalidRequest that a directory bucket answers to a delimiter other than /, or refuse it before sending", + "purpose": "List uploads with delimiter=/: the uploads under a deeper prefix are reported as that common prefix", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "delimiter": "-", - "op": "list_page", - "prefix": "object-tests/board/" + "delimiter": "/", + "op": "s3.list_uploads", + "prefix": "object-tests/" }, "exchanges": [ { @@ -192335,51 +203519,54 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "fixture-session-token" } }, { - "at": "/query/delimiter", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "-" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/host", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "object-tests/" } }, { - "at": "/headers/authorization", + "at": "/query/delimiter", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "/" } } ], @@ -192388,18 +203575,18 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nInvalidRequestFixture error" - }, - "framing": "chunked" + "data": "\nfixture--euc1-az1--x-s3/object-tests/1000falseobject-tests/uploads/" + } } }, { @@ -192429,59 +203616,62 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "fixture-session-token" } }, { - "at": "/query/delimiter", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "-" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/host", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "value": "url" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/authorization", + "at": "/query/prefix", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "object-tests/" } }, { - "at": "/query/encoding-type", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "url" + "value": "/" } } ], @@ -192490,18 +203680,18 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "utf8", - "data": "\nInvalidRequestThis bucket only supports '/' as a delimiter01a36c7dc10001a08269f29d0c1a80c2547f97e2NIAczpdqY" - }, - "framing": "chunked" + "data": "\nfixture--euc1-az1--x-s3/object-tests/1000urlfalseobject-tests/uploads/" + } } } ] @@ -192513,80 +203703,55 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidRequest" - } - } - ], - "refusal": [ - { - "at": "/outcome", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", - "value": "refused" + "is": "array_length", + "value": 0 } }, { - "at": "/kind", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "matches", - "pattern": ".+" + "is": "array_length", + "value": 1 } }, { - "at": "/parameter", + "at": "/value/prefixes/0", "optional": false, "rule": { "is": "equal", - "value": "delimiter" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 + "value": "object-tests/uploads/" } }, { - "at": "/code", - "optional": true, + "at": "/value/is_truncated", + "optional": false, "rule": { "is": "equal", - "value": "InvalidRequest" + "value": false } } - ] + ], + "refusal": null }, { - "id": "operations/s3-express/list-page", + "id": "operations/s3-express/list-uploads-none", "profile": "s3-express", "lane": "core", - "purpose": "List a prefix with ListObjectsV2 (list-type=2), and report each entry's key, size and ETag, quotes included", + "purpose": "List a prefix with no upload in progress: an empty list, not an error", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "op": "list_page", - "prefix": "object-tests/board/" + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -192691,43 +203856,46 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "fixture-session-token" } }, { - "at": "/headers/host", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "fixture-session-token" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/headers/authorization", + "at": "/query/prefix", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "equal", + "value": "object-tests/uploads/" } } ], @@ -192746,7 +203914,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/31000falseCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/1000false" } } }, @@ -192777,51 +203945,54 @@ } }, { - "at": "/query/list-type", + "at": "/headers/host", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" } }, { - "at": "/query/prefix", + "at": "/headers/x-amz-s3session-token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "fixture-session-token" } }, { - "at": "/headers/host", + "at": "/headers/authorization", "optional": false, "rule": { - "is": "equal", - "value": "fixture--euc1-az1--x-s3.s3express-euc1-az1.fixture.invalid" + "is": "matches", + "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" } }, { - "at": "/headers/x-amz-s3session-token", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "url" } }, { - "at": "/headers/authorization", + "at": "/query/uploads", "optional": false, "rule": { - "is": "matches", - "pattern": "AWS4-HMAC-SHA256 Credential=fixture-access-key/[0-9]{8}/eu-central-1/s3express/aws4_request, SignedHeaders=.+, Signature=[a-f0-9]{64}" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/query/encoding-type", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "url" + "value": "object-tests/uploads/" } } ], @@ -192840,7 +204011,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/board/31000urlfalseCRC64NVME"fixture-7d1b875717fa"object-tests/board/z.txt2024-01-01T00:00:00.000Z2EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-d9b959b4d7a6"object-tests/board/nested/c.txt2024-01-01T00:00:00.000Z1EXPRESS_ONEZONEFULL_OBJECTCRC64NVME"fixture-ca40e4206a8d"object-tests/board/a.txt2024-01-01T00:00:00.000Z8EXPRESS_ONEZONEFULL_OBJECT" + "data": "\nfixture--euc1-az1--x-s3object-tests/uploads/1000urlfalse" } } } @@ -192857,198 +204028,27 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/z.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-7d1b875717fa\"" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/nested/c.txt" - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-d9b959b4d7a6\"" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/a.txt" - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 8 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-ca40e4206a8d\"" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/continuation_token", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", - "value": "" + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries", + "at": "/value/prefixes", "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 0 } }, { - "at": "/value/prefixes", + "at": "/value/is_truncated", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": false } } ], diff --git a/cases/vectors.json b/cases/vectors.json index 0635b6d..1c49fbb 100644 --- a/cases/vectors.json +++ b/cases/vectors.json @@ -132,8 +132,8 @@ ] }, { - "id": "azure/hmac-sha256-rfc4231", - "profile": "azure", + "id": "s3/hmac-sha256-rfc4231", + "profile": "s3", "lane": "vectors", "purpose": "RFC 4231 test case 1.", "sources": [ @@ -162,17 +162,28 @@ ] }, { - "id": "s3/hmac-sha256-rfc4231", + "id": "s3/sigv4-get-range", "profile": "s3", "lane": "vectors", - "purpose": "RFC 4231 test case 1.", + "purpose": "Sign the AWS documentation's GET with a range header. The exact signature catches canonicalization and key-derivation errors", "sources": [ - "https://www.rfc-editor.org/rfc/rfc4231#section-4.2" + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], "call": { - "op": "hmac_sha256", - "key_base64": "CwsLCwsLCwsLCwsLCwsLCwsLCws=", - "body_base64": "SGkgVGhlcmU=" + "op": "s3.sign", + "method": "GET", + "url": "https://examplebucket.s3.amazonaws.com/test.txt", + "headers": { + "range": "bytes=0-9" + }, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" }, "expect": [ { @@ -183,29 +194,38 @@ } }, { - "at": "/value/digest_base64", + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-content-sha256;x-amz-date, Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, "rule": { "is": "equal", - "value": "sDRMYdjbOFNcqK/OrwvxK4gdwgDJgz2nJuk3bC4yz/c=" + "value": "GET\n/test.txt\n\nhost:examplebucket.s3.amazonaws.com\nrange:bytes=0-9\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;range;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" } } ] }, { - "id": "s3/sigv4-get-range", + "id": "s3/sigv4-path-encoded", "profile": "s3", "lane": "vectors", - "purpose": "Fixed-clock AWS GET range example; exact signature detects canonicalization and key-derivation defects. Whitespace in Authorization is normalized by the sign adapter only if its SDK returns structured fields.", + "purpose": "Sign a path with a space, +, =, ~ and é as sent, percent-encoded once: S3 does not encode the path again, and ~ stays as it is", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], "call": { "op": "s3.sign", "method": "GET", - "url": "https://examplebucket.s3.amazonaws.com/test.txt", - "headers": { - "range": "bytes=0-9" - }, + "url": "https://examplebucket.s3.amazonaws.com/photos/a%20b%2Bc%3Dd~e%C3%A9.jpg", + "headers": {}, "body_base64": "", "clock": "2013-05-24T00:00:00Z", "credentials": { @@ -228,33 +248,42 @@ "rule": { "is": "one_of", "values": [ - "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41", - "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-content-sha256;x-amz-date, Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41" + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=46ba6bcfb3bbdc32c61f378dcc2dfa733dc710c94204f443ad07af7bab996b6b", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=46ba6bcfb3bbdc32c61f378dcc2dfa733dc710c94204f443ad07af7bab996b6b" ] } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "GET\n/photos/a%20b%2Bc%3Dd~e%C3%A9.jpg\n\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } } ] }, { - "id": "s3/canonical-get-range", + "id": "s3/sigv4-path-not-normalized", "profile": "s3", "lane": "vectors", - "purpose": "Canonical text is optional diagnostic coverage; an opaque signer can declare unsupported.", + "purpose": "Sign a path with an empty segment, a . segment and a trailing / as sent. S3 keys keep them, so a signer must not normalize the path", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], "call": { - "op": "s3.canonical_request", + "op": "s3.sign", "method": "GET", - "path": "/test.txt", - "query": [], - "headers": { - "Host": "examplebucket.s3.amazonaws.com", - "Range": "bytes=0-9", - "x-amz-content-sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "x-amz-date": "20130524T000000Z" + "url": "https://examplebucket.s3.amazonaws.com/a//b/./c/", + "headers": {}, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" }, - "payload_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + "region": "us-east-1", + "service": "s3" }, "expect": [ { @@ -265,36 +294,146 @@ } }, { - "at": "/value/text", + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=9e729769b19cb3b56595178e160b82b09055e83f320bc6a8dc8e5beb7bf158d4", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=9e729769b19cb3b56595178e160b82b09055e83f320bc6a8dc8e5beb7bf158d4" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, "rule": { "is": "equal", - "value": "GET\n/test.txt\n\nhost:examplebucket.s3.amazonaws.com\nrange:bytes=0-9\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;range;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + "value": "GET\n/a//b/./c/\n\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" } } ] }, { - "id": "azure/shared-key-encoded-name", - "profile": "azure", + "id": "s3/sigv4-query-sorted", + "profile": "s3", "lane": "vectors", - "purpose": "Document-derived Shared Key example with a public synthetic key; the canonicalized resource keeps the escaped path.", + "purpose": "Sign a query whose parameters arrive out of order: the canonical query sorts them by encoded name", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], "call": { - "op": "azure.sign", + "op": "s3.sign", "method": "GET", - "url": "https://fixture.blob.core.windows.net/fixture/a%20b?comp=metadata", - "headers": { - "x-ms-date": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-version": "2023-11-03" + "url": "https://examplebucket.s3.amazonaws.com/?prefix=photos%2F2024&max-keys=5&list-type=2&delimiter=%2F&encoding-type=url", + "headers": {}, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=ce1ecd0ddb684e93c5b42fc7485057631da71ce4380a0b010a09638d84cd052b", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=ce1ecd0ddb684e93c5b42fc7485057631da71ce4380a0b010a09638d84cd052b" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "GET\n/\ndelimiter=%2F&encoding-type=url&list-type=2&max-keys=5&prefix=photos%2F2024\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + }, + { + "id": "s3/sigv4-query-empty-value", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign a subresource without a value beside one with a value: the canonical query writes it as tagging=, with an empty value", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "GET", + "url": "https://examplebucket.s3.amazonaws.com/test.txt?versionId=3HL4kqtJlcpXroDTDmJ%2BrmSpXd3dIbrHY&tagging", + "headers": {}, "body_base64": "", - "clock": "2024-01-01T00:00:00Z", + "clock": "2013-05-24T00:00:00Z", "credentials": { - "account": "fixture", - "key_base64": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=" + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=f6b600c6d5b18b096cd8d1e97abc47cfd5104e236732b39e4058235313893d8a", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=f6b600c6d5b18b096cd8d1e97abc47cfd5104e236732b39e4058235313893d8a" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "GET\n/test.txt\ntagging=&versionId=3HL4kqtJlcpXroDTDmJ%2BrmSpXd3dIbrHY\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } } + ] + }, + { + "id": "s3/sigv4-query-reencoded", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign query values sent with a raw / and a lowercase %7e: the canonical query decodes each value and encodes it again, as %2F and ~", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "GET", + "url": "https://examplebucket.s3.amazonaws.com/?list-type=2&prefix=photos/2024&start-after=a%7eb", + "headers": {}, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" }, "expect": [ { @@ -306,31 +445,260 @@ }, { "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=3163c4c2b02342c53821b7f7ad4be9296b17e46b6b27ae697a0096db62f532f5", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=3163c4c2b02342c53821b7f7ad4be9296b17e46b6b27ae697a0096db62f532f5" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, "rule": { "is": "equal", - "value": "SharedKey fixture:klWCi6Ppc/uMEOOhAHKe9/os6gErdqBdFvMjaTd9lx4=" + "value": "GET\n/\nlist-type=2&prefix=photos%2F2024&start-after=a~b\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" } } ] }, { - "id": "azure/canonical-shared-key", - "profile": "azure", + "id": "s3/sigv4-query-repeated", + "profile": "s3", "lane": "vectors", - "purpose": "Empty standard fields and final query line are significant; no newline is appended after the resource.", + "purpose": "Sign a parameter sent twice: the canonical query keeps both, sorted by value", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], "call": { - "op": "azure.string_to_sign", + "op": "s3.sign", "method": "GET", - "url": "https://fixture.blob.core.windows.net/fixture/a%20b?comp=metadata", - "account": "fixture", + "url": "https://examplebucket.s3.amazonaws.com/?list-type=2&prefix=b&prefix=a", + "headers": {}, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=43934bb8bce3b95073acc5bff7f2d05d06a541faaa470a16bde4e30de49c5735", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=43934bb8bce3b95073acc5bff7f2d05d06a541faaa470a16bde4e30de49c5735" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "GET\n/\nlist-type=2&prefix=a&prefix=b\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + }, + { + "id": "s3/sigv4-header-whitespace", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign headers with a mixed-case name and a value with spaces around and inside it: the canonical header is lowercase, trimmed, with each run of spaces as one", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "PUT", + "url": "https://examplebucket.s3.amazonaws.com/notes.txt", "headers": { - "x-ms-date": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-version": "2023-11-03" + "Content-Type": "text/plain", + "X-Amz-Meta-Note": " two spaces inside " }, - "body_base64": "" + "body_base64": "aGVsbG8=", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-meta-note,Signature=75def3066cddb5a656f19b5db5cece913ec8ad5b1f8316707da1385787ad6ba8", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-meta-note, Signature=75def3066cddb5a656f19b5db5cece913ec8ad5b1f8316707da1385787ad6ba8" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "PUT\n/notes.txt\n\ncontent-type:text/plain\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824\nx-amz-date:20130524T000000Z\nx-amz-meta-note:two spaces inside\n\ncontent-type;host;x-amz-content-sha256;x-amz-date;x-amz-meta-note\n2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" + } + } + ] + }, + { + "id": "s3/sigv4-header-repeated", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign a header sent twice: the canonical header joins its values with a comma, in the order sent", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "PUT", + "url": "https://examplebucket.s3.amazonaws.com/tags.txt", + "headers": { + "x-amz-meta-tag": [ + "one", + "two" + ] + }, + "body_base64": "aGVsbG8=", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-meta-tag,Signature=0516b9a84faa9af1cf8bfa9da6e0a8efdea9f8db9f6c8f1deb5ca30824cc50ab", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-meta-tag, Signature=0516b9a84faa9af1cf8bfa9da6e0a8efdea9f8db9f6c8f1deb5ca30824cc50ab" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "PUT\n/tags.txt\n\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824\nx-amz-date:20130524T000000Z\nx-amz-meta-tag:one,two\n\nhost;x-amz-content-sha256;x-amz-date;x-amz-meta-tag\n2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" + } + } + ] + }, + { + "id": "s3/sigv4-unsigned-payload", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign a PUT whose body is not hashed: x-amz-content-sha256 is UNSIGNED-PAYLOAD, signed in its place", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "PUT", + "url": "https://examplebucket.s3.amazonaws.com/unsigned.txt", + "headers": {}, + "body_base64": "aGVsbG8=", + "payload_hash": "UNSIGNED-PAYLOAD", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=1db0ae7bc2758ec76c3a4eb728d7aeb744b1b1dfd1b7b8c1443efa0f814de19c", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=1db0ae7bc2758ec76c3a4eb728d7aeb744b1b1dfd1b7b8c1443efa0f814de19c" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "PUT\n/unsigned.txt\n\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:20130524T000000Z\n\nhost;x-amz-content-sha256;x-amz-date\nUNSIGNED-PAYLOAD" + } + } + ] + }, + { + "id": "s3/sigv4-streaming-trailer", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign an aws-chunked PUT with a trailing checksum: x-amz-content-sha256 is STREAMING-UNSIGNED-PAYLOAD-TRAILER, and the chunked headers are signed", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html", + "https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html" + ], + "call": { + "op": "s3.sign", + "method": "PUT", + "url": "https://examplebucket.s3.amazonaws.com/chunked.txt", + "headers": { + "content-encoding": "aws-chunked", + "x-amz-decoded-content-length": "5", + "x-amz-trailer": "x-amz-checksum-crc32" + }, + "body_base64": "", + "payload_hash": "STREAMING-UNSIGNED-PAYLOAD-TRAILER", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + }, + "region": "us-east-1", + "service": "s3" }, "expect": [ { @@ -341,10 +709,79 @@ } }, { - "at": "/value/text", + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=content-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-trailer,Signature=8daf895f8f59abcad7f7e192b546eb49de31bb1567134b2e1cc1b68dfe70a1e7", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=content-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-trailer, Signature=8daf895f8f59abcad7f7e192b546eb49de31bb1567134b2e1cc1b68dfe70a1e7" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "PUT\n/chunked.txt\n\ncontent-encoding:aws-chunked\nhost:examplebucket.s3.amazonaws.com\nx-amz-content-sha256:STREAMING-UNSIGNED-PAYLOAD-TRAILER\nx-amz-date:20130524T000000Z\nx-amz-decoded-content-length:5\nx-amz-trailer:x-amz-checksum-crc32\n\ncontent-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-trailer\nSTREAMING-UNSIGNED-PAYLOAD-TRAILER" + } + } + ] + }, + { + "id": "s3/sigv4-session-token", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign with temporary credentials in eu-central-1: the signer adds x-amz-security-token, signs it, and scopes the signature to the region", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" + ], + "call": { + "op": "s3.sign", + "method": "GET", + "url": "https://examplebucket.s3.eu-central-1.amazonaws.com/test.txt", + "headers": {}, + "body_base64": "", + "clock": "2013-05-24T00:00:00Z", + "credentials": { + "access_key_id": "AKIAIOSFODNN7EXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "session_token": "AQoDYXdzEJr1K2oP+ExampleSessionToken/With+Slash==" + }, + "region": "eu-central-1", + "service": "s3" + }, + "expect": [ + { + "at": "/outcome", + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/authorization", + "rule": { + "is": "one_of", + "values": [ + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/eu-central-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=50d38e8876d089a6a390dd3f3af3ac8f6c8b59446d0eaef776e2675798fd52c2", + "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/eu-central-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=50d38e8876d089a6a390dd3f3af3ac8f6c8b59446d0eaef776e2675798fd52c2" + ] + } + }, + { + "at": "/value/canonical_request", + "optional": true, + "rule": { + "is": "equal", + "value": "GET\n/test.txt\n\nhost:examplebucket.s3.eu-central-1.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:20130524T000000Z\nx-amz-security-token:AQoDYXdzEJr1K2oP+ExampleSessionToken/With+Slash==\n\nhost;x-amz-content-sha256;x-amz-date;x-amz-security-token\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + { + "at": "/value/headers/x-amz-security-token", "rule": { "is": "equal", - "value": "GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Mon, 01 Jan 2024 00:00:00 GMT\nx-ms-version:2023-11-03\n/fixture/fixture/a%20b\ncomp:metadata" + "value": "AQoDYXdzEJr1K2oP+ExampleSessionToken/With+Slash==" } } ] diff --git a/tests/grading.rs b/tests/grading.rs index 4fb4ff8..f7f77f4 100644 --- a/tests/grading.rs +++ b/tests/grading.rs @@ -616,17 +616,18 @@ fn signature_mutation_fails_without_any_crypto_in_grader() { let case = suite .cases .iter() - .find(|case| case.id == "azure/shared-key-encoded-name") + .find(|case| case.id == "s3/sigv4-get-range") .unwrap(); - let Rule::Equal { value } = &case.expect[1].rule else { + let Rule::OneOf { values } = &case.expect[1].rule else { panic!() }; + let value = values[0].as_str().unwrap(); let mut result = json!({ "outcome": "ok", "value": {"authorization": value}, }); assert!(check_assertions(&case.expect, &result, test_time()).is_empty()); - result["value"]["authorization"] = json!(format!("{}0", value.as_str().unwrap())); + result["value"]["authorization"] = json!(format!("{value}0")); assert!(!check_assertions(&case.expect, &result, test_time()).is_empty()); }