From 52714042b7b62f455b49e11067276265ad811517 Mon Sep 17 00:00:00 2001 From: Tip ten Brink <75669206+tiptenbrink@users.noreply.github.com> Date: Sat, 3 Oct 2026 15:56:21 +0200 Subject: [PATCH 1/5] Authorize Azure with Entra ID only and test From URL copies. Drops the Azure Shared Key and HMAC vectors; a copy source token must be Bearer, and SAS is out of scope. Adds Append Block From URL, Put Page From URL and copies from another storage account, named by the new source_account_url call field. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 2 + REFERENCE.md | 2 + cases/live.json | 4 +- cases/operations.json | 13267 +++++++++++++++++++++++----------------- cases/vectors.json | 106 - tests/grading.rs | 7 +- 6 files changed, 7648 insertions(+), 5740 deletions(-) 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..63b2367 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -33,6 +33,8 @@ Leave out a result property the client does not expose, and name it in `unsuppor 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`. +`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/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/operations.json b/cases/operations.json index 7ddd19c..ce7fc9d 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", @@ -228,6 +233,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", @@ -267,6 +273,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 +304,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 +338,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 +346,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", @@ -529,6 +541,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", @@ -585,6 +598,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 +624,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", @@ -35679,7 +35695,7 @@ "id": "operations/azure/copy-sync", "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": "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-from-url" ], @@ -35733,11 +35749,17 @@ "is": "equal", "value": "true" } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } } ], - "allow_headers": [ - "x-ms-copy-source-authorization" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 202, @@ -35836,11 +35858,17 @@ "is": "equal", "value": "true" } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } } ], - "allow_headers": [ - "x-ms-copy-source-authorization" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 404, @@ -35889,19 +35917,19 @@ "refusal": null }, { - "id": "operations/azure/copy-pending", + "id": "operations/azure/copy-sync-other-account", "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": "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" ], - "origin": "transient", - "derived_from": "operations/azure/copy", "call": { "key": "object-tests/copy/target.txt", "op": "copy", - "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": [ { @@ -35937,7 +35965,23 @@ "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-requires-sync", + "optional": false, + "rule": { + "is": "equal", + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], @@ -35952,7 +35996,7 @@ "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-copy-status": "success" }, "body": { "encoding": "empty" @@ -35976,30 +36020,23 @@ "optional": false, "rule": { "is": "equal", - "value": "pending" - } - }, - { - "at": "/value/copy_id", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-copy-id" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/copy-content-properties", + "id": "operations/azure/copy-pending", "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": "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/copy", "call": { - "content_type": "text/plain", "key": "object-tests/copy/target.txt", "op": "copy", "source_key": "object-tests/copy/source.txt" @@ -36040,14 +36077,6 @@ "is": "matches", "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain" - } } ], "allow_headers": [], @@ -36061,7 +36090,7 @@ "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-copy-status": "pending" }, "body": { "encoding": "empty" @@ -36085,49 +36114,32 @@ "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": ".+" + "value": "pending" } }, { - "at": "/parameter", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": "content_type" + "value": "fixture-copy-id" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/put-from-url", + "id": "operations/azure/copy-content-properties", "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": "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/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { + "content_type": "text/plain", "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", + "op": "copy", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -36168,28 +36180,26 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "text/plain" } } ], - "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" - ], + "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" @@ -36209,29 +36219,54 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "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-from-url-content-properties", + "id": "operations/azure/copy-other-account", "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": "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-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "cache_control": "max-age=3600", - "content_type": "text/plain", "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", + "op": "copy", + "source_account_url": "https://fixtureother.blob.core.windows.net", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -36268,51 +36303,32 @@ "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" + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "max-age=3600" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [ - "x-ms-copy-source-authorization", - "x-ms-copy-source-blob-properties" - ], + "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" } } } @@ -36325,32 +36341,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/put-from-url-missing-source", + "id": "operations/azure/put-from-url", "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": "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-from-url" ], "call": { "key": "object-tests/copy/target.txt", "op": "azure.put_from_url", - "source_key": "object-tests/copy/absent.txt" + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36386,7 +36410,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { @@ -36396,25 +36420,32 @@ "is": "equal", "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": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "encoding": "empty" } } } @@ -36427,42 +36458,34 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/abort-copy", + "id": "operations/azure/put-from-url-content-properties", "profile": "azure", "lane": "core", - "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", + "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/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], - "origin": "transient", - "derived_from": "operations/azure/abort-copy-finished", "call": { - "copy_id": "fixture-copy-id", + "cache_control": "max-age=3600", + "content_type": "text/plain", "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36494,38 +36517,59 @@ } }, { - "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-blob-type", "optional": false, "rule": { "is": "equal", - "value": "copy" + "value": "BlockBlob" } }, { - "at": "/query/copyid", + "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": "fixture-copy-id" + "value": "text/plain" } }, { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-blob-cache-control", "optional": false, "rule": { "is": "equal", - "value": "abort" + "value": "max-age=3600" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "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" @@ -36543,22 +36587,30 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } } ], "refusal": null }, { - "id": "operations/azure/abort-copy-finished", + "id": "operations/azure/put-from-url-missing-source", "profile": "azure", "lane": "core", - "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", + "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/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "copy_id": "fixture-copy-id", "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "op": "azure.put_from_url", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -36590,44 +36642,46 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "copy" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } }, { - "at": "/query/copyid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-copy-action", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "abort" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 409, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "NoPendingCopyOperation" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "NoPendingCopyOperationFixture error" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -36648,7 +36702,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 404 } }, { @@ -36656,23 +36710,25 @@ "optional": false, "rule": { "is": "equal", - "value": "NoPendingCopyOperation" + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/get-page-ranges", + "id": "operations/azure/put-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "List the written ranges of a page blob", + "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-page-ranges" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "key": "object-tests/pages/object.vhd", - "op": "azure.get_page_ranges" + "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": [ { @@ -36684,7 +36740,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -36692,7 +36748,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36704,32 +36760,47 @@ } }, { - "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": "pagelist" + "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-blob-content-length": "1024" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "0511" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -36745,34 +36816,30 @@ } }, { - "at": "/value/ranges", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [ - { - "end": 512, - "start": 0 - } - ] + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages-unaligned", + "id": "operations/azure/abort-copy", "profile": "azure", "lane": "core", - "purpose": "Refuse a page write that does not start on a 512-byte boundary", + "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/put-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure/abort-copy-finished", "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 1, - "op": "azure.upload_pages" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -36792,7 +36859,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36800,7 +36867,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "" } }, { @@ -36808,40 +36875,37 @@ "optional": false, "rule": { "is": "equal", - "value": "page" + "value": "copy" } }, { - "at": "/headers/x-ms-page-write", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "update" + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-range", + "at": "/headers/x-ms-copy-action", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-512" + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 204, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "InvalidHeaderValue" + } }, "body": { - "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "encoding": "empty" } } } @@ -36854,41 +36918,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": "InvalidHeaderValue" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages", + "id": "operations/azure/abort-copy-finished", "profile": "azure", "lane": "core", - "purpose": "Write the first page of a page blob", + "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-page" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], "call": { - "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", - "key": "object-tests/pages/object.vhd", - "offset": 0, - "op": "azure.upload_pages" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -36908,7 +36955,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -36916,7 +36963,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "" } }, { @@ -36924,41 +36971,40 @@ "optional": false, "rule": { "is": "equal", - "value": "page" + "value": "copy" } }, { - "at": "/headers/x-ms-page-write", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "update" + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-range", + "at": "/headers/x-ms-copy-action", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-511" + "value": "abort" } } ], "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-blob-sequence-number": "0", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "NoPendingCopyOperation" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "NoPendingCopyOperationFixture error" } } } @@ -36971,24 +37017,39 @@ "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": "NoPendingCopyOperation" } } ], "refusal": null }, { - "id": "operations/azure/create-page", + "id": "operations/azure/get-page-ranges", "profile": "azure", "lane": "core", - "purpose": "Create a page blob of 1,024 bytes", + "purpose": "List the written ranges of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" ], "call": { "key": "object-tests/pages/object.vhd", - "op": "azure.create_page", - "size": 1024 + "op": "azure.get_page_ranges" }, "exchanges": [ { @@ -37000,7 +37061,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -37020,37 +37081,32 @@ } }, { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "PageBlob" - } - }, - { - "at": "/headers/x-ms-blob-content-length", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "1024" + "value": "pagelist" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-blob-content-length": "1024" }, "body": { - "encoding": "empty" - } + "encoding": "utf8", + "data": "0511" + }, + "framing": "chunked" } } ] @@ -37064,22 +37120,36 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/ranges", + "optional": false, + "rule": { + "is": "equal", + "value": [ + { + "end": 512, + "start": 0 + } + ] + } } ], "refusal": null }, { - "id": "operations/azure/append-block-to-block-blob", + "id": "operations/azure/upload-pages-unaligned", "profile": "azure", "lane": "core", - "purpose": "Refuse an append to a block blob", + "purpose": "Refuse a page write that does not start on a 512-byte boundary", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 1, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -37099,7 +37169,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -37107,7 +37177,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -37115,24 +37185,40 @@ "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "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=1-512" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobType" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "InvalidBlobTypeFixture error" + "data": "InvalidHeaderValueFixture error" } } } @@ -37153,7 +37239,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 400 } }, { @@ -37161,25 +37247,25 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobType" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/append-block-at-wrong-position", + "id": "operations/azure/upload-pages", "profile": "azure", "lane": "core", - "purpose": "Refuse an append whose position condition does not match the blob length", + "purpose": "Write the first page of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "append_position": 0, - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -37199,7 +37285,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -37207,7 +37293,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -37215,32 +37301,41 @@ "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "page" } }, { - "at": "/headers/x-ms-blob-condition-appendpos", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "0" + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" } } ], "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-sequence-number": "0", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "AppendPositionConditionNotMetFixture error" + "encoding": "empty" } } } @@ -37253,40 +37348,29 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "AppendPositionConditionNotMet" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/append-block", + "id": "operations/azure/upload-pages-from-url", "profile": "azure", "lane": "core", - "purpose": "Append a block to an append blob and report its offset", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "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": [ { @@ -37306,7 +37390,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -37314,7 +37398,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -37322,7 +37406,47 @@ "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "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" + } + }, + { + "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 [^ ]+" } } ], @@ -37336,8 +37460,7 @@ }, "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-blob-sequence-number": "0", "x-ms-request-server-encrypted": "true" }, "body": { @@ -37356,37 +37479,28 @@ "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/create-append", + "id": "operations/azure/upload-pages-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Create an empty append blob", + "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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-from-url" ], "call": { - "key": "object-tests/append/object.log", - "op": "azure.create_append" + "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": [ { @@ -37406,7 +37520,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -37418,120 +37532,69 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "AppendBlob" + "value": "page" } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "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" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-leased-if-match-without-lease-id", - "profile": "azure", - "lane": "core", - "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/lease-blob" - ], - "call": { - "body_base64": "c2Vjb25k", - "if_match": "\"fixture-etag\"", - "key": "object-tests/leases/object.txt", - "op": "put" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ { - "at": "/method", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "update" } }, { - "at": "/path", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "bytes=0-511" } }, { - "at": "/body_base64", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "c2Vjb25k" + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/pages/source\\.bin" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "bytes=0-511" } }, { - "at": "/headers/if-match", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "\"fixture-etag\"" + "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": "LeaseIdMissing" + "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": "LeaseIdMissingFixture error" + "encoding": "empty" } } } @@ -37544,41 +37607,24 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "LeaseIdMissing" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/put-leased-with-lease-id", + "id": "operations/azure/create-page", "profile": "azure", "lane": "core", - "purpose": "Write to a leased object with its lease ID", + "purpose": "Create a page blob of 1,024 bytes", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "put" + "key": "object-tests/pages/object.vhd", + "op": "azure.create_page", + "size": 1024 }, "exchanges": [ { @@ -37598,7 +37644,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -37606,7 +37652,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -37614,15 +37660,15 @@ "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "PageBlob" } }, { - "at": "/headers/x-ms-lease-id", + "at": "/headers/x-ms-blob-content-length", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "1024" } } ], @@ -37659,17 +37705,17 @@ "refusal": null }, { - "id": "operations/azure/put-leased-without-lease-id", + "id": "operations/azure/append-block-to-block-blob", "profile": "azure", "lane": "core", - "purpose": "Refuse a write to a leased object that names no lease ID", + "purpose": "Refuse an append to a block blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "op": "put" + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -37689,7 +37735,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -37701,28 +37747,28 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseIdMissing" + "x-ms-error-code": "InvalidBlobType" }, "body": { "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "data": "InvalidBlobTypeFixture error" } } } @@ -37743,7 +37789,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 409 } }, { @@ -37751,25 +37797,25 @@ "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "InvalidBlobType" } } ], "refusal": null }, { - "id": "operations/azure/lease-break", + "id": "operations/azure/append-block-at-wrong-position", "profile": "azure", "lane": "core", - "purpose": "Break a lease at once", + "purpose": "Refuse an append whose position condition does not match the blob length", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "action": "break", - "break_period": 0, - "key": "object-tests/leases/object.txt", - "op": "azure.lease" + "append_position": 0, + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -37789,7 +37835,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -37797,7 +37843,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -37805,19 +37851,11 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "break" + "value": "appendblock" } }, { - "at": "/headers/x-ms-lease-break-period", + "at": "/headers/x-ms-blob-condition-appendpos", "optional": false, "rule": { "is": "equal", @@ -37828,17 +37866,17 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "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-lease-time": "0" + "x-ms-error-code": "AppendPositionConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "AppendPositionConditionNotMetFixture error" } } } @@ -37851,25 +37889,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/lease-release", + "id": "operations/azure/append-block", "profile": "azure", "lane": "core", - "purpose": "Release a lease", + "purpose": "Append a block to an append blob and report its offset", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "action": "release", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "azure.lease" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -37889,7 +37942,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -37897,7 +37950,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -37905,36 +37958,23 @@ "optional": false, "rule": { "is": "equal", - "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" + "value": "appendblock" } } ], "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" + "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" @@ -37952,24 +37992,38 @@ "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/lease-acquire-leased", + "id": "operations/azure/append-block-from-url", "profile": "azure", "lane": "core", - "purpose": "Refuse a second lease while another lease holds the object", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "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/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37989,7 +38043,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -38005,48 +38059,42 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "acquire" + "value": "appendblock" } }, { - "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", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "66666666-7777-8888-9999-000000000000" + "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": "LeaseAlreadyPresent" + "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": "LeaseAlreadyPresentFixture error" + "encoding": "empty" } } } @@ -38059,42 +38107,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": "LeaseAlreadyPresent" + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure/lease-acquire", + "id": "operations/azure/append-block-from-url-range", "profile": "azure", "lane": "core", - "purpose": "Acquire a lease on an object with a proposed lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "action": "acquire", - "duration": 15, - "key": "object-tests/leases/object.txt", - "op": "azure.lease", - "proposed_lease_id": "11111111-2222-3333-4444-555555555555" + "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": [ { @@ -38114,7 +38164,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -38130,31 +38180,31 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" + "value": "appendblock" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "acquire" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-lease-duration", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { "is": "equal", - "value": "15" + "value": "bytes=1-3" } }, { - "at": "/headers/x-ms-proposed-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 [^ ]+" } } ], @@ -38168,7 +38218,9 @@ }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-id": "11111111-2222-3333-4444-555555555555" + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -38188,31 +38240,37 @@ } }, { - "at": "/value/lease_id", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": 5 + } + }, + { + "at": "/value/committed_block_count", + "optional": false, + "rule": { + "is": "equal", + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure/put-with-tags", + "id": "operations/azure/append-block-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Write an object with tags", + "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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "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": [ { @@ -38232,7 +38290,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -38240,23 +38298,31 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "appendblock" } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "project=object-tests" + "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 [^ ]+" } } ], @@ -38270,6 +38336,8 @@ }, "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": { @@ -38288,25 +38356,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-tags-special-characters", + "id": "operations/azure/create-append", "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": "Create an empty append blob", "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": { - "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" - } + "key": "object-tests/append/object.log", + "op": "azure.create_append" }, "exchanges": [ { @@ -38326,7 +38406,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -38334,7 +38414,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { @@ -38342,18 +38422,7 @@ "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" - } - }, - { - "at": "/headers/x-ms-tags", - "optional": false, - "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" - ] + "value": "AppendBlob" } } ], @@ -38390,27 +38459,18 @@ "refusal": null }, { - "id": "operations/azure/put-with-tags-duplicate-key", + "id": "operations/azure/put-leased-if-match-without-lease-id", "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": "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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": [ - { - "key": "project", - "value": "a" - }, - { - "key": "project", - "value": "b" - } - ] + "body_base64": "c2Vjb25k", + "if_match": "\"fixture-etag\"", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -38430,7 +38490,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -38438,7 +38498,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "c2Vjb25k" } }, { @@ -38450,28 +38510,28 @@ } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "project=a&project=b" + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "DuplicateTagNames" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "DuplicateTagNamesFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -38492,7 +38552,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -38500,65 +38560,25 @@ "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": ".+" - } - }, - { - "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" + "value": "LeaseIdMissing" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/get-tags", + "id": "operations/azure/put-leased-with-lease-id", "profile": "azure", "lane": "core", - "purpose": "Read the tags of an object", + "purpose": "Write to a leased object with its lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "put" }, "exchanges": [ { @@ -38570,7 +38590,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38578,7 +38598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -38586,31 +38606,40 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "allow_headers": [], "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": "projectobject-tests" + "encoding": "empty" } } } @@ -38625,31 +38654,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/tags", - "optional": false, - "rule": { - "is": "equal", - "value": { - "project": "object-tests" - } - } } ], "refusal": null }, { - "id": "operations/azure/get-tags-none", + "id": "operations/azure/put-leased-without-lease-id", "profile": "azure", "lane": "core", - "purpose": "Report no blob index tags for a blob without any, which Azure answers with an empty TagSet", + "purpose": "Refuse a write to a leased object that names no lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -38661,7 +38681,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38669,7 +38689,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -38677,31 +38697,32 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "" + "data": "LeaseIdMissingFixture error" } } } @@ -38714,32 +38735,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/tags", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": {} + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "LeaseIdMissing" } } ], "refusal": null }, { - "id": "operations/azure/get-tags-version", + "id": "operations/azure/lease-break", "profile": "azure", "lane": "core", - "purpose": "Get the blob index tags of a previous version, named by versionid in the query", + "purpose": "Break a lease at once", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "version": "2024-01-01T00:00:00.0000000Z" + "action": "break", + "break_period": 0, + "key": "object-tests/leases/object.txt", + "op": "azure.lease" }, "exchanges": [ { @@ -38751,7 +38781,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38759,7 +38789,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -38775,31 +38805,40 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "break" + } + }, + { + "at": "/headers/x-ms-lease-break-period", + "optional": false, + "rule": { + "is": "equal", + "value": "0" } } ], "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-lease-time": "0" }, "body": { - "encoding": "utf8", - "data": "projectobject-tests" + "encoding": "empty" } } } @@ -38814,32 +38853,23 @@ "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/lease-release", "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": "Release a lease", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z" + "action": "release", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "azure.lease" }, "exchanges": [ { @@ -38851,7 +38881,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -38859,7 +38889,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -38875,15 +38905,23 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/query/snapshot", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "release" + } + }, + { + "at": "/headers/x-ms-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], @@ -38892,14 +38930,14 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "utf8", - "data": "projectobject-tests" + "encoding": "empty" } } } @@ -38914,34 +38952,24 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/tags", - "optional": false, - "rule": { - "is": "equal", - "value": { - "project": "object-tests" - } - } } ], "refusal": null }, { - "id": "operations/azure/set-tags", + "id": "operations/azure/lease-acquire-leased", "profile": "azure", "lane": "core", - "purpose": "Replace the tags of an object", + "purpose": "Refuse a second lease while another lease holds the object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - } + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "66666666-7777-8888-9999-000000000000" }, "exchanges": [ { @@ -38961,15 +38989,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -38977,32 +39005,48 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "acquire" + } + }, + { + "at": "/headers/x-ms-lease-duration", + "optional": false, + "rule": { + "is": "equal", + "value": "15" + } + }, + { + "at": "/headers/x-ms-proposed-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "66666666-7777-8888-9999-000000000000" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "LeaseAlreadyPresent" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "LeaseAlreadyPresentFixture error" } } } @@ -39015,35 +39059,42 @@ "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": "LeaseAlreadyPresent" } } ], "refusal": null }, { - "id": "operations/azure/set-tags-10-tags", + "id": "operations/azure/lease-acquire", "profile": "azure", "lane": "core", - "purpose": "Set 10 tags, the most an object takes", + "purpose": "Acquire a lease on an object with a proposed lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "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" - } + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "11111111-2222-3333-4444-555555555555" }, "exchanges": [ { @@ -39063,15 +39114,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9" + "is": "equal", + "value": "" } }, { @@ -39079,29 +39130,45 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "acquire" + } + }, + { + "at": "/headers/x-ms-lease-duration", + "optional": false, + "rule": { + "is": "equal", + "value": "15" + } + }, + { + "at": "/headers/x-ms-proposed-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "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-lease-id": "11111111-2222-3333-4444-555555555555" }, "body": { "encoding": "empty" @@ -39119,33 +39186,32 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/lease_id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-11-tags", + "id": "operations/azure/put-with-tags", "profile": "azure", "lane": "core", - "purpose": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", + "purpose": "Write an object with tags", "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": { + "body_base64": "Zmlyc3Q=", "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", + "op": "put", "tags": { - "tag00": "value0", - "tag01": "value1", - "tag02": "value2", - "tag03": "value3", - "tag04": "value4", - "tag05": "value5", - "tag06": "value6", - "tag07": "value7", - "tag08": "value8", - "tag09": "value9", - "tag10": "value10" + "project": "object-tests" } }, "exchanges": [ @@ -39170,47 +39236,44 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" + "is": "equal", + "value": "Zmlyc3Q=" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-tags", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "project=object-tests" } } ], "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-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "encoding": "empty" } } } @@ -39223,82 +39286,26 @@ "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/put-with-tags-special-characters", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose key has 128 characters, the longest a key may be", + "purpose": "Write a blob with an index tag that holds a space and each of + - = . _ : /, percent-encoded in x-ms-tags", "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": { + "body_base64": "Zmlyc3Q=", "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", + "op": "put", "tags": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" } }, "exchanges": [ @@ -39323,29 +39330,29 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "is": "equal", + "value": "Zmlyc3Q=" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-tags", "optional": false, "rule": { "is": "one_of", "values": [ - "application/xml", - "application/xml; charset=UTF-8" + "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" ] } } @@ -39353,11 +39360,14 @@ "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" @@ -39380,19 +39390,27 @@ "refusal": null }, { - "id": "operations/azure/set-tags-key-129", + "id": "operations/azure/put-with-tags-duplicate-key", "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": "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/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { + "body_base64": "Zmlyc3Q=", "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" - } + "op": "put", + "tags": [ + { + "key": "project", + "value": "a" + }, + { + "key": "project", + "value": "b" + } + ] }, "exchanges": [ { @@ -39416,30 +39434,27 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "is": "equal", + "value": "Zmlyc3Q=" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-tags", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "project=a&project=b" } } ], @@ -39452,11 +39467,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "x-ms-error-code": "DuplicateTagNames" }, "body": { "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "data": "DuplicateTagNamesFixture error" } } } @@ -39485,7 +39500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": "DuplicateTagNames" } } ], @@ -39527,25 +39542,23 @@ "optional": true, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": "DuplicateTagNames" } } - ] + ], + "decline_permitted": true }, { - "id": "operations/azure/set-tags-value-256", + "id": "operations/azure/get-tags", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose value has 256 characters, the longest a value may be", + "purpose": "Read the tags of an object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "op": "azure.get_tags" }, "exchanges": [ { @@ -39557,7 +39570,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -39569,11 +39582,11 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "is": "equal", + "value": "" } }, { @@ -39583,30 +39596,21 @@ "is": "equal", "value": "tags" } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" } }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "projectobject-tests" } } } @@ -39621,24 +39625,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": { + "project": "object-tests" + } + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-value-257", + "id": "operations/azure/get-tags-none", "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": "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/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "op": "azure.get_tags" }, "exchanges": [ { @@ -39650,7 +39661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -39662,11 +39673,11 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "is": "equal", + "value": "" } }, { @@ -39676,33 +39687,21 @@ "is": "equal", "value": "tags" } - }, - { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "TagsTooLarge" + } }, "body": { "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "data": "" } } } @@ -39715,83 +39714,32 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", + "at": "/value/tags", "optional": false, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": {} } } ], - "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/get-tags-version", "profile": "azure", "lane": "core", - "purpose": "Set a blob index tag with a space and each of + - = . _ : /, which Azure allows, escaped as XML text", + "purpose": "Get the blob index tags of a previous version, named by versionid in the query", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "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" - } + "op": "azure.get_tags", + "version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -39803,7 +39751,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -39815,11 +39763,11 @@ } }, { - "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": "" } }, { @@ -39831,28 +39779,27 @@ } }, { - "at": "/headers/content-type", + "at": "/query/versionid", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "2024-01-01T00:00:00.0000000Z" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" } }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "projectobject-tests" } } } @@ -39867,24 +39814,32 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": { + "project": "object-tests" + } + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-invalid-character", + "id": "operations/azure/get-tags-snapshot", "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": "Get the blob index tags of a snapshot, named by snapshot in the query, which keeps the tags the blob had", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "a@b": "c" - } + "op": "azure.get_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -39896,7 +39851,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -39908,11 +39863,11 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "a@bc" + "is": "equal", + "value": "" } }, { @@ -39924,31 +39879,27 @@ } }, { - "at": "/headers/content-type", + "at": "/query/snapshot", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "2024-01-01T00:00:00.0000000Z" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "InvalidTag" + } }, "body": { "encoding": "utf8", - "data": "InvalidTagFixture error" + "data": "projectobject-tests" } } } @@ -39961,90 +39912,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 + "value": "ok" } }, { - "at": "/code", + "at": "/value/tags", "optional": false, "rule": { "is": "equal", - "value": "InvalidTag" + "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": "tags" - } - }, - { - "at": "/status", - "optional": true, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidTag" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-duplicate-key", + "id": "operations/azure/set-tags", "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", + "purpose": "Replace the tags of an object", "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" - } - ] + "tags": { + "project": "object-tests" + } }, "exchanges": [ { @@ -40072,7 +39969,7 @@ "optional": false, "rule": { "is": "xml", - "value": "projectaprojectb" + "value": "projectobject-tests" } }, { @@ -40098,17 +39995,14 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 204, "headers": { - "content-type": "application/xml", "date": { "from": "now" - }, - "x-ms-error-code": "InvalidXmlDocument" + } }, "body": { - "encoding": "utf8", - "data": "InvalidXmlDocumentFixture error" + "encoding": "empty" } } } @@ -40121,75 +40015,17 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidXmlDocument" - } - } - ], - "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" + "value": "ok" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/set-tags-version", + "id": "operations/azure/set-tags-10-tags", "profile": "azure", "lane": "core", - "purpose": "Set blob index tags on a previous version, named by versionid in the query", + "purpose": "Set 10 tags, the most an object takes", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], @@ -40197,9 +40033,17 @@ "key": "object-tests/tags/object.txt", "op": "azure.set_tags", "tags": { - "project": "object-tests" - }, - "version": "2024-01-01T00:00:00.0000000Z" + "tag00": "value0", + "tag01": "value1", + "tag02": "value2", + "tag03": "value3", + "tag04": "value4", + "tag05": "value5", + "tag06": "value6", + "tag07": "value7", + "tag08": "value8", + "tag09": "value9" + } }, "exchanges": [ { @@ -40227,7 +40071,7 @@ "optional": false, "rule": { "is": "xml", - "value": "projectobject-tests" + "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9" } }, { @@ -40248,14 +40092,6 @@ "application/xml; charset=UTF-8" ] } - }, - { - "at": "/query/versionid", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" - } } ], "allow_headers": [], @@ -40288,19 +40124,28 @@ "refusal": null }, { - "id": "operations/azure/set-tags-snapshot", + "id": "operations/azure/set-tags-11-tags", "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": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { "key": "object-tests/tags/object.txt", "op": "azure.set_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z", "tags": { - "project": "object-tests" + "tag00": "value0", + "tag01": "value1", + "tag02": "value2", + "tag03": "value3", + "tag04": "value4", + "tag05": "value5", + "tag06": "value6", + "tag07": "value7", + "tag08": "value8", + "tag09": "value9", + "tag10": "value10" } }, "exchanges": [ @@ -40329,7 +40174,7 @@ "optional": false, "rule": { "is": "xml", - "value": "projectobject-tests" + "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" } }, { @@ -40350,27 +40195,22 @@ "application/xml; charset=UTF-8" ] } - }, - { - "at": "/query/snapshot", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "TagsTooLarge" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -40383,25 +40223,83 @@ "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": "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-with-tier", + "id": "operations/azure/set-tags-key-128", "profile": "azure", "lane": "core", - "purpose": "Write an object straight into the Cool access tier", + "purpose": "Set a tag whose key has 128 characters, the longest a key may be", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tiers/object.txt", - "op": "put", - "tier": "Cool" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } }, "exchanges": [ { @@ -40421,45 +40319,45 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "Zmlyc3Q=" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "Cool" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "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" @@ -40482,17 +40380,19 @@ "refusal": null }, { - "id": "operations/azure/set-tier-unknown", + "id": "operations/azure/set-tags-key-129", "profile": "azure", "lane": "core", - "purpose": "Refuse an access tier the service does not have", + "purpose": "Report a tag key of 129 characters, one more than a key may have, as an error. A client may refuse it", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Warm" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } }, "exchanges": [ { @@ -40512,15 +40412,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { @@ -40528,15 +40428,18 @@ "optional": false, "rule": { "is": "equal", - "value": "tier" + "value": "tags" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "Warm" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], @@ -40549,11 +40452,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "x-ms-error-code": "TagsTooLarge" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "TagsTooLargeFixture error" } } } @@ -40582,24 +40485,67 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "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/set-tier-cool", + "id": "operations/azure/set-tags-value-256", "profile": "azure", "lane": "core", - "purpose": "Move an object to the Cool access tier", + "purpose": "Set a tag whose value has 256 characters, the longest a value may be", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Cool" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } }, "exchanges": [ { @@ -40619,15 +40565,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "" + "is": "xml", + "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" } }, { @@ -40635,22 +40581,25 @@ "optional": false, "rule": { "is": "equal", - "value": "tier" + "value": "tags" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "Cool" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 204, "headers": { "date": { "from": "now" @@ -40677,17 +40626,19 @@ "refusal": null }, { - "id": "operations/azure/set-tier-rehydrate", + "id": "operations/azure/set-tags-value-257", "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": "Report a tag value of 257 characters, one more than a value may have, as an error. A client may refuse it", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Hot" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } }, "exchanges": [ { @@ -40707,15 +40658,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/body_base64", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "" + "is": "xml", + "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" } }, { @@ -40723,29 +40674,35 @@ "optional": false, "rule": { "is": "equal", - "value": "tier" + "value": "tags" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "Hot" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 400, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "TagsTooLarge" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -40758,26 +40715,83 @@ "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": "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-internal-error", + "id": "operations/azure/set-tags-special-characters", "profile": "azure", "lane": "core", - "purpose": "Report a 500 InternalError answer as an error, after at most 5 retries", + "purpose": "Set a blob index tag with a space and each of + - = . _ : /, which Azure allows, escaped as XML text", "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-tags" ], - "origin": "transient", "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/write/object.txt", - "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": [ { @@ -40797,47 +40811,82 @@ "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": "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": 500, + "status": 204, "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." + "encoding": "empty" } } } ] - }, + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/set-tags-invalid-character", + "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", + "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": { + "a@b": "c" + } + }, + "exchanges": [ { "alternatives": [ { @@ -40855,107 +40904,304 @@ "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": "a@bc" } }, { - "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": 500, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "x-ms-error-code": "InvalidTag" }, "body": { "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "data": "InvalidTagFixture error" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } }, { - "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", + "at": "/status", + "optional": false, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidTag" + } + } + ], + "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": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "PUT" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "projectaprojectb" + } + }, + { + "at": "/query/comp", + "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" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InternalError" + "x-ms-error-code": "InvalidXmlDocument" }, "body": { "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "data": "InvalidXmlDocumentFixture 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": "InvalidXmlDocument" + } + } + ], + "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/set-tags-version", + "profile": "azure", + "lane": "core", + "purpose": "Set blob index tags on a previous version, named by versionid in the query", + "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": { + "project": "object-tests" }, + "version": "2024-01-01T00:00:00.0000000Z" + }, + "exchanges": [ { "alternatives": [ { @@ -40973,48 +41219,91 @@ "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": "xml", + "value": "projectobject-tests" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "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": 500, + "status": 204, "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." + "encoding": "empty" } } } - ], - "optional": true - }, + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/set-tags-snapshot", + "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", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + ], + "call": { + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z", + "tags": { + "project": "object-tests" + } + }, + "exchanges": [ { "alternatives": [ { @@ -41032,48 +41321,89 @@ "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": "xml", + "value": "projectobject-tests" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "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": 500, + "status": 204, "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." + "encoding": "empty" } } } - ], - "optional": true - }, + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/put-with-tier", + "profile": "azure", + "lane": "core", + "purpose": "Write an object straight into the Cool access tier", + "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" + }, + "exchanges": [ { "alternatives": [ { @@ -41091,7 +41421,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -41099,7 +41429,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "Zmlyc3Q=" } }, { @@ -41109,29 +41439,34 @@ "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": 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-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "encoding": "empty" } } } - ], - "optional": true + ] } ], "expect": [ @@ -41140,41 +41475,24 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 500 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InternalError" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/put-if-unmodified-since-past", + "id": "operations/azure/set-tier-unknown", "profile": "azure", "lane": "core", - "purpose": "Refuse a write with 412 when the object changed after If-Unmodified-Since", + "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": "MDEyMzQ1Njc4OQ==", - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Warm" }, "exchanges": [ { @@ -41194,7 +41512,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -41202,42 +41520,40 @@ "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": "tier" } }, { - "at": "/headers/if-unmodified-since", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "value": "Warm" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "InvalidHeaderValueFixture error" } } } @@ -41258,7 +41574,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 400 } }, { @@ -41266,25 +41582,24 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/put-content-encoding-gzip", + "id": "operations/azure/set-tier-cool", "profile": "azure", "lane": "core", - "purpose": "Store Content-Encoding: gzip with a write, and the gzip bytes unchanged", + "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": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", - "content_encoding": "gzip", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Cool" }, "exchanges": [ { @@ -41304,7 +41619,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -41312,57 +41627,79 @@ "optional": false, "rule": { "is": "equal", - "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tier" } }, { - "at": "/headers/x-ms-blob-content-encoding", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "gzip" + "value": "Cool" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "headers": { - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "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" } } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/set-tier-rehydrate", + "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", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + ], + "call": { + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Hot" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" } }, { @@ -41370,7 +41707,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -41378,46 +41715,37 @@ "optional": false, "rule": { "is": "equal", - "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tier" } }, { - "at": "/headers/content-encoding", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "gzip" + "value": "Hot" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 202, "headers": { - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "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" } } } @@ -41432,40 +41760,22 @@ "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/put-content-properties", + "id": "operations/azure/put-internal-error", "profile": "azure", "lane": "core", - "purpose": "Store Content-Type, Content-Language, Content-Disposition and Cache-Control with a write", + "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": "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" }, @@ -41505,37 +41815,63 @@ "is": "equal", "value": "BlockBlob" } + } + ], + "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." + } + } + } + ] + }, + { + "alternatives": [ + { + "request": [ { - "at": "/headers/x-ms-blob-content-type", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "text/plain; charset=utf-8" + "value": "PUT" } }, { - "at": "/headers/x-ms-blob-content-language", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "nl-NL" + "value": "/fixture/object-tests/write/object.txt" } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-blob-cache-control", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "BlockBlob" } } ], @@ -41544,24 +41880,25 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "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-error-code": "InternalError" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } - }, + } + ], + "optional": true + }, + { + "alternatives": [ { "request": [ { @@ -41595,37 +41932,64 @@ "is": "equal", "value": "BlockBlob" } + } + ], + "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": "/headers/content-type", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "text/plain; charset=utf-8" + "value": "PUT" } }, { - "at": "/headers/content-language", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "nl-NL" + "value": "/fixture/object-tests/write/object.txt" } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/cache-control", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "BlockBlob" } } ], @@ -41634,70 +41998,23 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "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-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-b9991ef94e3d\"" - } + ], + "optional": true }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-content-type-non-ascii", - "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", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "content_type": "text/plain; name=\"été.txt\"", - "key": "object-tests/write/object.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -41733,13 +42050,64 @@ "is": "equal", "value": "BlockBlob" } + } + ], + "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", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "text/plain; name=\"été.txt\"" + "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" } } ], @@ -41748,25 +42116,22 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "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-error-code": "InternalError" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] + ], + "optional": true } ], "expect": [ @@ -41775,39 +42140,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": 500 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "InternalError" } } ], "refusal": null }, { - "id": "operations/azure/put-content-disposition-non-ascii", + "id": "operations/azure/put-if-unmodified-since-past", "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": "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": "MDEyMzQ1Njc4OQ==", - "content_disposition": "attachment; filename=\"été.txt\"", + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/write/object.txt", "op": "put" }, @@ -41849,11 +42214,11 @@ } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/headers/if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" } } ], @@ -41862,21 +42227,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "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-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -41889,80 +42250,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": 412 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2084665Z" + "value": "ConditionNotMet" } } ], - "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/put-content-encoding-gzip", "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": "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": "MDEyMzQ1Njc4OQ==", - "content_type": " text/plain ", + "body_base64": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", + "content_encoding": "gzip", "key": "object-tests/write/object.txt", "op": "put" }, @@ -41992,7 +42312,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { @@ -42004,11 +42324,11 @@ } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/headers/x-ms-blob-content-encoding", "optional": false, "rule": { "is": "equal", - "value": "text/plain" + "value": "gzip" } } ], @@ -42019,7 +42339,7 @@ "response": { "status": 201, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, @@ -42058,7 +42378,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { @@ -42070,11 +42390,11 @@ } }, { - "at": "/headers/content-type", + "at": "/headers/content-encoding", "optional": false, "rule": { "is": "equal", - "value": "text/plain" + "value": "gzip" } } ], @@ -42085,7 +42405,7 @@ "response": { "status": 201, "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, @@ -42130,44 +42450,23 @@ } } ], - "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/put-content-properties", "profile": "azure", "lane": "core", - "purpose": "put first version", + "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": { - "body_base64": "djE=", - "key": "object-tests/versions-mtydohr2/object.txt", + "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": [ @@ -42188,7 +42487,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -42196,7 +42495,7 @@ "optional": false, "rule": { "is": "equal", - "value": "djE=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -42206,29 +42505,151 @@ "is": "equal", "value": "BlockBlob" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", - "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" }, - "body": { - "encoding": "base64", - "data": "" - } + { + "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": { + "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": "" + } + } + }, + { + "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": "" + } } } ] @@ -42248,7 +42669,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5769a0807b46\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -42256,23 +42677,23 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-if-match-current", + "id": "operations/azure/put-content-type-non-ascii", "profile": "azure", "lane": "core", - "purpose": "put if match current", + "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": { - "body_base64": "cmVwbGFjZWQ=", - "if_match": "\"fixture-b9991ef94e3d\"", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": "text/plain; name=\"été.txt\"", "key": "object-tests/write/object.txt", "op": "put" }, @@ -42302,23 +42723,23 @@ "optional": false, "rule": { "is": "equal", - "value": "cmVwbGFjZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b9991ef94e3d\"" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "text/plain; name=\"été.txt\"" } } ], @@ -42329,15 +42750,15 @@ "response": { "status": 201, "headers": { - "content-md5": "kbskg1kEP+mEFuJZyb3xDQ==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-3e075954b24b\"", + "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.3814952Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -42362,7 +42783,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-3e075954b24b\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -42370,24 +42791,24 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3814952Z" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-if-none-match-missing", + "id": "operations/azure/put-content-disposition-non-ascii", "profile": "azure", "lane": "core", - "purpose": "put if none match missing", + "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": { - "body_base64": "ZnJlc2g=", - "if_none_match": "*", - "key": "object-tests/write/fresh.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_disposition": "attachment; filename=\"été.txt\"", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -42408,7 +42829,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/fresh.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -42416,23 +42837,23 @@ "optional": false, "rule": { "is": "equal", - "value": "ZnJlc2g=" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/if-none-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-blob-content-disposition", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" } } ], @@ -42443,15 +42864,15 @@ "response": { "status": 201, "headers": { - "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-0445b9b5a1dd\"", + "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.2457093Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -42476,7 +42897,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0445b9b5a1dd\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -42484,23 +42905,65 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2457093Z" + "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_disposition" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidMetadata" + } + } + ] }, { - "id": "operations/azure/put-key-1024", + "id": "operations/azure/put-content-type-edge-spaces", "profile": "azure", "lane": "core", - "purpose": "put key 1024", + "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": { - "body_base64": "MQ==", - "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": " text/plain ", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -42521,7 +42984,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -42529,7 +42992,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -42539,6 +43002,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain" + } } ], "allow_headers": [ @@ -42548,69 +43019,22 @@ "response": { "status": 201, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-cf057aba568d\"", + "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.8738118Z" + "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-cf057aba568d\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.8738118Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-key-1025", - "profile": "azure", - "lane": "core", - "purpose": "put key 1025", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MQ==", - "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", - "op": "put" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -42626,7 +43050,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -42634,7 +43058,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -42644,6 +43068,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain" + } } ], "allow_headers": [ @@ -42651,17 +43083,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": "OutOfRangeInputFixture error" + "encoding": "base64", + "data": "" } } } @@ -42674,23 +43110,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" } } ], @@ -42716,38 +43152,22 @@ "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" + "value": "content_type" } } ] }, { - "id": "operations/azure/put-key-under-object", + "id": "operations/azure/put-first-version", "profile": "azure", "lane": "core", - "purpose": "put key under object", + "purpose": "put first version", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/order/a/b", + "body_base64": "djE=", + "key": "object-tests/versions-mtydohr2/object.txt", "op": "put" }, "exchanges": [ @@ -42768,7 +43188,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/order/a/b" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -42776,7 +43196,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "djE=" } }, { @@ -42795,15 +43215,15 @@ "response": { "status": 201, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", "date": { "from": "now" }, - "etag": "\"fixture-17ced520f182\"", + "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.2584945Z" + "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" }, "body": { "encoding": "base64", @@ -42828,7 +43248,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-17ced520f182\"" + "value": "\"fixture-5769a0807b46\"" } }, { @@ -42836,23 +43256,23 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2584945Z" + "value": "2024-01-01T00:00:00.2318906Z" } } ], "refusal": null }, { - "id": "operations/azure/put-lost-the-race-to-create", + "id": "operations/azure/put-if-match-current", "profile": "azure", "lane": "core", - "purpose": "put lost the race to create", + "purpose": "put if match current", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "YW5vdGhlciBvYmplY3Q=", - "if_none_match": "*", + "body_base64": "cmVwbGFjZWQ=", + "if_match": "\"fixture-b9991ef94e3d\"", "key": "object-tests/write/object.txt", "op": "put" }, @@ -42882,15 +43302,15 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" + "value": "cmVwbGFjZWQ=" } }, { - "at": "/headers/if-none-match", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -42907,17 +43327,21 @@ ], "allow_query": [], "response": { - "status": 409, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "kbskg1kEP+mEFuJZyb3xDQ==", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "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": "utf8", - "data": "BlobAlreadyExistsFixture error" + "encoding": "base64", + "data": "" } } } @@ -42930,43 +43354,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "\"fixture-3e075954b24b\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "value": "2024-01-01T00:00:00.3814952Z" } } ], "refusal": null }, { - "id": "operations/azure/put-md5-mismatch", + "id": "operations/azure/put-if-none-match-missing", "profile": "azure", "lane": "core", - "purpose": "put md5 mismatch", + "purpose": "put if none match missing", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "md5", - "value_base64": "eV8yArF8trw9S3cdjGyerw==" - }, - "key": "object-tests/hashes/md5-mismatch.txt", + "body_base64": "ZnJlc2g=", + "if_none_match": "*", + "key": "object-tests/write/fresh.txt", "op": "put" }, "exchanges": [ @@ -42987,7 +43408,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5-mismatch.txt" + "value": "/fixture/object-tests/write/fresh.txt" } }, { @@ -42995,15 +43416,15 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "value": "ZnJlc2g=" } }, { - "at": "/headers/content-md5", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "eV8yArF8trw9S3cdjGyerw==" + "value": "*" } }, { @@ -43020,17 +43441,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", "date": { "from": "now" }, - "x-ms-error-code": "Md5Mismatch" + "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" }, "body": { - "encoding": "utf8", - "data": "Md5MismatchFixture error" + "encoding": "base64", + "data": "" } } } @@ -43043,42 +43468,39 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-0445b9b5a1dd\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "Md5Mismatch" + "value": "2024-01-01T00:00:00.2457093Z" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-empty-value", + "id": "operations/azure/put-key-1024", "profile": "azure", "lane": "core", - "purpose": "put metadata empty value", + "purpose": "put key 1024", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "body_base64": "MQ==", - "key": "object-tests/metadata/empty-value.txt", - "metadata": { - "empty": "" - }, + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", "op": "put" }, "exchanges": [ @@ -43099,7 +43521,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/empty-value.txt" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -43110,14 +43532,6 @@ "value": "MQ==" } }, - { - "at": "/headers/x-ms-meta-empty", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } - }, { "at": "/headers/x-ms-blob-type", "optional": false, @@ -43138,11 +43552,11 @@ "date": { "from": "now" }, - "etag": "\"fixture-333d95b64818\"", + "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.9480929Z" + "x-ms-version-id": "2024-01-01T00:00:00.8738118Z" }, "body": { "encoding": "base64", @@ -43167,7 +43581,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-333d95b64818\"" + "value": "\"fixture-cf057aba568d\"" } }, { @@ -43175,26 +43589,23 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9480929Z" + "value": "2024-01-01T00:00:00.8738118Z" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-invalid-name", + "id": "operations/azure/put-key-1025", "profile": "azure", "lane": "core", - "purpose": "put metadata invalid name", + "purpose": "put key 1025", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "body_base64": "MQ==", - "key": "object-tests/metadata/invalid-name.txt", - "metadata": { - "not-valid": "1" - }, + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", "op": "put" }, "exchanges": [ @@ -43215,7 +43626,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/invalid-name.txt" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -43226,14 +43637,6 @@ "value": "MQ==" } }, - { - "at": "/headers/x-ms-meta-not-valid", - "optional": false, - "rule": { - "is": "equal", - "value": "1" - } - }, { "at": "/headers/x-ms-blob-type", "optional": false, @@ -43254,11 +43657,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "InvalidMetadata" + "x-ms-error-code": "OutOfRangeInput" }, "body": { "encoding": "utf8", - "data": "InvalidMetadataFixture error" + "data": "OutOfRangeInputFixture error" } } } @@ -43287,7 +43690,7 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidMetadata" + "value": "OutOfRangeInput" } } ], @@ -43313,12 +43716,12 @@ "optional": false, "rule": { "is": "equal", - "value": "metadata" + "value": "key" } }, { "at": "/status", - "optional": true, + "optional": false, "rule": { "is": "equal", "value": 400 @@ -43326,25 +43729,25 @@ }, { "at": "/code", - "optional": true, + "optional": false, "rule": { "is": "equal", - "value": "InvalidMetadata" + "value": "OutOfRangeInput" } } ] }, { - "id": "operations/azure/put-metadata-replaced", + "id": "operations/azure/put-key-under-object", "profile": "azure", "lane": "core", - "purpose": "put metadata replaced", + "purpose": "put key under object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "Mg==", - "key": "object-tests/metadata/replaced.txt", + "body_base64": "MQ==", + "key": "object-tests/order/a/b", "op": "put" }, "exchanges": [ @@ -43365,7 +43768,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/replaced.txt" + "value": "/fixture/object-tests/order/a/b" } }, { @@ -43373,7 +43776,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mg==" + "value": "MQ==" } }, { @@ -43392,15 +43795,15 @@ "response": { "status": 201, "headers": { - "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "etag": "\"fixture-37b036d8c13f\"", + "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.7487600Z" + "x-ms-version-id": "2024-01-01T00:00:00.2584945Z" }, "body": { "encoding": "base64", @@ -43425,7 +43828,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-37b036d8c13f\"" + "value": "\"fixture-17ced520f182\"" } }, { @@ -43433,27 +43836,24 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7487600Z" + "value": "2024-01-01T00:00:00.2584945Z" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata", + "id": "operations/azure/put-lost-the-race-to-create", "profile": "azure", "lane": "core", - "purpose": "put metadata", + "purpose": "put lost the race to create", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/object.txt", - "metadata": { - "name": "value", - "second": "2" - }, + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_none_match": "*", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -43474,7 +43874,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -43482,23 +43882,15 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" - } - }, - { - "at": "/headers/x-ms-meta-name", - "optional": false, - "rule": { - "is": "equal", - "value": "value" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/headers/x-ms-meta-second", + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "*" } }, { @@ -43515,21 +43907,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 409, "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": "BlobAlreadyExists" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobAlreadyExistsFixture error" } } } @@ -43542,42 +43930,43 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9abbc5e374ca\"" + "value": 409 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-identifier-name", + "id": "operations/azure/put-md5-mismatch", "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": "put md5 mismatch", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/identifier-name.txt", - "metadata": { - "_a1": "1" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "eV8yArF8trw9S3cdjGyerw==" }, + "key": "object-tests/hashes/md5-mismatch.txt", "op": "put" }, "exchanges": [ @@ -43598,7 +43987,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/identifier-name.txt" + "value": "/fixture/object-tests/hashes/md5-mismatch.txt" } }, { @@ -43606,15 +43995,15 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/headers/x-ms-meta-_a1", + "at": "/headers/content-md5", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "eV8yArF8trw9S3cdjGyerw==" } }, { @@ -43631,21 +44020,17 @@ ], "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": "Md5Mismatch" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "Md5MismatchFixture error" } } } @@ -43658,39 +44043,42 @@ "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": "Md5Mismatch" } } ], "refusal": null }, { - "id": "operations/azure/put-over-snapshotted", + "id": "operations/azure/put-metadata-empty-value", "profile": "azure", "lane": "core", - "purpose": "put over snapshotted", + "purpose": "put metadata empty value", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "dHdv", - "key": "object-tests/snapshots/object.txt", + "body_base64": "MQ==", + "key": "object-tests/metadata/empty-value.txt", + "metadata": { + "empty": "" + }, "op": "put" }, "exchanges": [ @@ -43711,7 +44099,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/metadata/empty-value.txt" } }, { @@ -43719,112 +44107,15 @@ "optional": false, "rule": { "is": "equal", - "value": "dHdv" - } - }, - { - "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": "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": "" - } - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "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", - "profile": "azure", - "lane": "core", - "purpose": "put overwrite", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "b3ZlcndyaXR0ZW4=", - "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" + "value": "MQ==" } }, { - "at": "/body_base64", + "at": "/headers/x-ms-meta-empty", "optional": false, "rule": { "is": "equal", - "value": "b3ZlcndyaXR0ZW4=" + "value": "" } }, { @@ -43843,15 +44134,15 @@ "response": { "status": 201, "headers": { - "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "etag": "\"fixture-cf4724500964\"", + "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.7758823Z" + "x-ms-version-id": "2024-01-01T00:00:00.9480929Z" }, "body": { "encoding": "base64", @@ -43876,7 +44167,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-cf4724500964\"" + "value": "\"fixture-333d95b64818\"" } }, { @@ -43884,24 +44175,26 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7758823Z" + "value": "2024-01-01T00:00:00.9480929Z" } } ], "refusal": null }, { - "id": "operations/azure/put-precondition-failed", + "id": "operations/azure/put-metadata-invalid-name", "profile": "azure", "lane": "core", - "purpose": "put precondition failed", + "purpose": "put metadata invalid name", "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", + "body_base64": "MQ==", + "key": "object-tests/metadata/invalid-name.txt", + "metadata": { + "not-valid": "1" + }, "op": "put" }, "exchanges": [ @@ -43922,7 +44215,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/metadata/invalid-name.txt" } }, { @@ -43930,15 +44223,15 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" + "value": "MQ==" } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-meta-not-valid", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "1" } }, { @@ -43955,17 +44248,17 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "InvalidMetadata" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "InvalidMetadataFixture error" } } } @@ -43986,7 +44279,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 400 } }, { @@ -43994,27 +44287,64 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "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/put-precondition-failed-code-in-body", + "id": "operations/azure/put-metadata-replaced", "profile": "azure", "lane": "core", - "purpose": "put precondition failed, with the error code only in the XML body", + "purpose": "put metadata replaced", "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": { - "body_base64": "YW5vdGhlciBvYmplY3Q=", - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/write/object.txt", + "body_base64": "Mg==", + "key": "object-tests/metadata/replaced.txt", "op": "put" }, "exchanges": [ @@ -44035,7 +44365,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/metadata/replaced.txt" } }, { @@ -44043,15 +44373,7 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "Mg==" } }, { @@ -44068,16 +44390,21 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", + "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-version-id": "2024-01-01T00:00:00.7487600Z" }, "body": { - "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -44090,39 +44417,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-37b036d8c13f\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "2024-01-01T00:00:00.7487600Z" } } ], "refusal": null }, { - "id": "operations/azure/put-refused", + "id": "operations/azure/put-metadata", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "put metadata", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", + "body_base64": "MQ==", + "key": "object-tests/metadata/object.txt", + "metadata": { + "name": "value", + "second": "2" + }, "op": "put" }, "exchanges": [ @@ -44143,7 +44474,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -44151,7 +44482,23 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MQ==" + } + }, + { + "at": "/headers/x-ms-meta-name", + "optional": false, + "rule": { + "is": "equal", + "value": "value" + } + }, + { + "at": "/headers/x-ms-meta-second", + "optional": false, + "rule": { + "is": "equal", + "value": "2" } }, { @@ -44168,17 +44515,21 @@ ], "allow_query": [], "response": { - "status": 403, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "x-ms-error-code": "AuthorizationPermissionMismatch" + "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": "AuthorizationPermissionMismatchFixture error" + "encoding": "base64", + "data": "" } } } @@ -44191,39 +44542,42 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 403 + "value": "\"fixture-9abbc5e374ca\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "AuthorizationPermissionMismatch" + "value": "2024-01-01T00:00:00.7035036Z" } } ], "refusal": null }, { - "id": "operations/azure/put-second-version", + "id": "operations/azure/put-metadata-identifier-name", "profile": "azure", "lane": "core", - "purpose": "put second version", + "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": { - "body_base64": "djI=", - "key": "object-tests/versions-mtydohr2/object.txt", + "body_base64": "MQ==", + "key": "object-tests/metadata/identifier-name.txt", + "metadata": { + "_a1": "1" + }, "op": "put" }, "exchanges": [ @@ -44244,7 +44598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/metadata/identifier-name.txt" } }, { @@ -44252,7 +44606,15 @@ "optional": false, "rule": { "is": "equal", - "value": "djI=" + "value": "MQ==" + } + }, + { + "at": "/headers/x-ms-meta-_a1", + "optional": false, + "rule": { + "is": "equal", + "value": "1" } }, { @@ -44271,15 +44633,15 @@ "response": { "status": 201, "headers": { - "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "etag": "\"fixture-4768de772705\"", + "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.3326281Z" + "x-ms-version-id": "2024-01-01T00:00:00.7035036Z" }, "body": { "encoding": "base64", @@ -44304,7 +44666,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-4768de772705\"" + "value": "\"fixture-9abbc5e374ca\"" } }, { @@ -44312,23 +44674,23 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3326281Z" + "value": "2024-01-01T00:00:00.7035036Z" } } ], "refusal": null }, { - "id": "operations/azure/put-unauthenticated", + "id": "operations/azure/put-over-snapshotted", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "put over snapshotted", "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", + "body_base64": "dHdv", + "key": "object-tests/snapshots/object.txt", "op": "put" }, "exchanges": [ @@ -44349,7 +44711,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -44357,7 +44719,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "dHdv" } }, { @@ -44374,17 +44736,21 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "uKn3Fdu2T9XFbneDxoIKYQ==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "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": "InvalidAuthenticationInfoFixture error" + "encoding": "base64", + "data": "" } } } @@ -44397,43 +44763,39 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 401 + "value": "\"fixture-937c89bb7b5c\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "2024-01-01T00:00:00.6268993Z" } } ], "refusal": null }, { - "id": "operations/azure/put-with-crc64", + "id": "operations/azure/put-overwrite", "profile": "azure", "lane": "core", - "purpose": "put with crc64", + "purpose": "put overwrite", "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": "b3ZlcndyaXR0ZW4=", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44454,7 +44816,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44462,15 +44824,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" - } - }, - { - "at": "/headers/x-ms-content-crc64", - "optional": false, - "rule": { - "is": "equal", - "value": "9XBvAwWoR9o=" + "value": "b3ZlcndyaXR0ZW4=" } }, { @@ -44489,15 +44843,15 @@ "response": { "status": 201, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", "date": { "from": "now" }, - "etag": "\"fixture-90cfcb93036b\"", + "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.1153123Z" + "x-ms-version-id": "2024-01-01T00:00:00.7758823Z" }, "body": { "encoding": "base64", @@ -44522,7 +44876,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-90cfcb93036b\"" + "value": "\"fixture-cf4724500964\"" } }, { @@ -44530,27 +44884,24 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "value": "2024-01-01T00:00:00.7758823Z" } } ], "refusal": null }, { - "id": "operations/azure/put-with-md5", + "id": "operations/azure/put-precondition-failed", "profile": "azure", "lane": "core", - "purpose": "put with md5", + "purpose": "put precondition failed", "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": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44571,7 +44922,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44579,15 +44930,15 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/headers/content-md5", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "\"fixture-088e5dc109cf\"" } }, { @@ -44604,21 +44955,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-type": "application/xml", "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-request-server-encrypted": "true", - "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -44631,39 +44978,44 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-494ad7275bf7\"" + "value": 412 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7803759Z" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/snapshot", + "id": "operations/azure/put-precondition-failed-code-in-body", "profile": "azure", "lane": "core", - "purpose": "snapshot", + "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/snapshots/object.txt", - "op": "azure.snapshot" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -44683,7 +45035,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44691,15 +45043,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "snapshot" + "value": "\"fixture-088e5dc109cf\"" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" } } ], @@ -44708,21 +45068,16 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "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-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": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -44735,33 +45090,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/snapshot", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/stage-empty", + "id": "operations/azure/put-refused", "profile": "azure", "lane": "core", - "purpose": "stage 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": { - "block_id_base64": "MDAwMDAz", - "body_base64": "", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", + "op": "put" }, "exchanges": [ { @@ -44781,7 +45143,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object.txt" } }, { @@ -44789,23 +45151,15 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAz" + "value": "BlockBlob" } } ], @@ -44814,17 +45168,17 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 403, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "x-ms-error-code": "AuthorizationPermissionMismatch" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "AuthorizationPermissionMismatchFixture error" } } } @@ -44845,7 +45199,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 403 } }, { @@ -44853,25 +45207,24 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "AuthorizationPermissionMismatch" } } ], "refusal": null }, { - "id": "operations/azure/stage-escaped-id", + "id": "operations/azure/put-second-version", "profile": "azure", "lane": "core", - "purpose": "stage escaped id", + "purpose": "put second version", "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": "djI=", + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "put" }, "exchanges": [ { @@ -44891,7 +45244,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -44899,23 +45252,15 @@ "optional": false, "rule": { "is": "equal", - "value": "b25l" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "djI=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "+/8=" + "value": "BlockBlob" } } ], @@ -44926,12 +45271,15 @@ "response": { "status": 201, "headers": { + "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.3326281Z" }, "body": { "encoding": "base64", @@ -44953,31 +45301,35 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-4768de772705\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3326281Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-id-too-long", + "id": "operations/azure/put-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "stage id too long", + "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": { - "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -44997,7 +45349,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45005,23 +45357,15 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" + "value": "BlockBlob" } } ], @@ -45030,17 +45374,17 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 401, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OutOfRangeInput" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { "encoding": "utf8", - "data": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -45061,7 +45405,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 401 } }, { @@ -45069,66 +45413,28 @@ "optional": false, "rule": { "is": "equal", - "value": "OutOfRangeInput" + "value": "InvalidAuthenticationInfo" } } ], - "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" - } - } - ] + "refusal": null }, { - "id": "operations/azure/stage-mixed-length-id", + "id": "operations/azure/put-with-crc64", "profile": "azure", "lane": "core", - "purpose": "stage mixed length id", + "purpose": "put with crc64", "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": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "9XBvAwWoR9o=" + }, + "key": "object-tests/hashes/crc64.txt", + "op": "put" }, "exchanges": [ { @@ -45148,7 +45454,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -45156,23 +45462,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-content-crc64", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "9XBvAwWoR9o=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "BlockBlob" } } ], @@ -45181,17 +45487,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobOrBlock" + "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" }, "body": { - "encoding": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "encoding": "base64", + "data": "" } } } @@ -45204,44 +45514,44 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-90cfcb93036b\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobOrBlock" + "value": "2024-01-01T00:00:00.1153123Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-mixed-length-id-code-in-body", + "id": "operations/azure/put-with-md5", "profile": "azure", "lane": "core", - "purpose": "stage mixed length id, with the error code only in the XML body", + "purpose": "put with 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/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": { - "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "N6YZkbg+Lyfxtskwn8iRCg==" + }, + "key": "object-tests/hashes/md5.txt", + "op": "put" }, "exchanges": [ { @@ -45261,7 +45571,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -45269,23 +45579,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/content-md5", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "BlockBlob" } } ], @@ -45294,16 +45604,21 @@ ], "allow_query": [], "response": { - "status": 400, + "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" }, "body": { - "encoding": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "encoding": "base64", + "data": "" } } } @@ -45316,41 +45631,39 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-494ad7275bf7\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobOrBlock" + "value": "2024-01-01T00:00:00.7803759Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-unauthenticated", + "id": "operations/azure/snapshot", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "snapshot", "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" + "key": "object-tests/snapshots/object.txt", + "op": "azure.snapshot" }, "exchanges": [ { @@ -45370,7 +45683,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -45378,7 +45691,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { @@ -45386,15 +45699,7 @@ "optional": false, "rule": { "is": "equal", - "value": "block" - } - }, - { - "at": "/query/blockid", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAx" + "value": "snapshot" } } ], @@ -45403,17 +45708,21 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "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-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": "InvalidAuthenticationInfoFixture error" + "encoding": "base64", + "data": "" } } } @@ -45426,39 +45735,31 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 401 + "value": "ok" } }, { - "at": "/code", + "at": "/value/snapshot", "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "2024-01-01T00:00:00.7351568Z" } } ], "refusal": null }, { - "id": "operations/azure/stage", + "id": "operations/azure/stage-empty", "profile": "azure", "lane": "core", - "purpose": "stage", + "purpose": "stage empty", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", + "block_id_base64": "MDAwMDAz", + "body_base64": "", "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, @@ -45488,7 +45789,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -45504,7 +45805,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "MDAwMDAz" } } ], @@ -45513,18 +45814,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": "InvalidHeaderValue" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -45537,35 +45837,40 @@ "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": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/stage-id-64-bytes", + "id": "operations/azure/stage-escaped-id", "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": "stage escaped id", "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", + "block_id_base64": "+/8=", + "body_base64": "b25l", + "key": "object-tests/multipart/escaped.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -45586,7 +45891,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { @@ -45594,7 +45899,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "b25l" } }, { @@ -45610,7 +45915,7 @@ "optional": false, "rule": { "is": "equal", - "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" + "value": "+/8=" } } ], @@ -45661,17 +45966,17 @@ "refusal": null }, { - "id": "operations/azure/stage-key-question", + "id": "operations/azure/stage-id-too-long", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"question?mark.txt\"", + "purpose": "stage id too long", "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", + "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -45692,7 +45997,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -45700,7 +46005,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "dGhpcmQ=" } }, { @@ -45716,7 +46021,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" } } ], @@ -45725,18 +46030,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": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." } } } @@ -45749,35 +46053,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": "block_id_base64" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "OutOfRangeInput" + } + } + ] }, { - "id": "operations/azure/stage-key-hash", + "id": "operations/azure/stage-mixed-length-id", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"hash#tag.txt\"", + "purpose": "stage mixed length id", "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", + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -45798,7 +46148,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -45806,7 +46156,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "dGhpcmQ=" } }, { @@ -45822,7 +46172,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], @@ -45831,18 +46181,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": "InvalidBlobOrBlock" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidBlobOrBlockFixture error" } } } @@ -45855,35 +46204,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": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-percent", + "id": "operations/azure/stage-mixed-length-id-code-in-body", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"percent%20.txt\"", + "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": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/percent%20.txt", + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -45904,7 +46261,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -45912,7 +46269,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "dGhpcmQ=" } }, { @@ -45928,7 +46285,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], @@ -45937,18 +46294,16 @@ ], "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" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidBlobOrBlockFixture error" } } } @@ -45961,35 +46316,40 @@ "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": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-plus", + "id": "operations/azure/stage-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"plus+plus.txt\"", + "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": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/plus+plus.txt", + "block_id_base64": "MDAwMDAx", + "body_base64": "Zmlyc3Q=", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -46010,7 +46370,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -46018,7 +46378,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "Zmlyc3Q=" } }, { @@ -46034,7 +46394,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "MDAwMDAx" } } ], @@ -46043,18 +46403,17 @@ ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -46067,35 +46426,40 @@ "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": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-space", + "id": "operations/azure/stage", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"space name.txt\"", + "purpose": "stage", "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", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -46116,7 +46480,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -46191,17 +46555,17 @@ "refusal": null }, { - "id": "operations/azure/stage-key-non-ascii", + "id": "operations/azure/stage-id-64-bytes", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"café/雪.txt\"", + "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": { - "block_id_base64": "MDAwMDAy", + "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==", "body_base64": "c2Vjb25k", - "key": "object-tests/keys/café/雪.txt", + "key": "object-tests/multipart/staged.bin", "op": "azure.stage_block" }, "exchanges": [ @@ -46222,7 +46586,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -46246,7 +46610,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" } } ], @@ -46297,17 +46661,17 @@ "refusal": null }, { - "id": "operations/azure/stage-key-double-slash", + "id": "operations/azure/stage-key-question", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"double//slash.txt\"", + "purpose": "stage, with the key \"question?mark.txt\"", "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", + "key": "object-tests/keys/question?mark.txt", "op": "azure.stage_block" }, "exchanges": [ @@ -46328,7 +46692,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -46403,17 +46767,17 @@ "refusal": null }, { - "id": "operations/azure/stage-key-trailing-slash", + "id": "operations/azure/stage-key-hash", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"trailing-slash/\"", + "purpose": "stage, with the key \"hash#tag.txt\"", "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/", + "key": "object-tests/keys/hash#tag.txt", "op": "azure.stage_block" }, "exchanges": [ @@ -46434,7 +46798,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -46509,22 +46873,18 @@ "refusal": null }, { - "id": "operations/azure/stage-from-url", + "id": "operations/azure/stage-key-percent", "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": "stage, with the key \"percent%20.txt\"", "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": "c2Vjb25k", + "key": "object-tests/keys/percent%20.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -46544,7 +46904,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -46552,7 +46912,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -46570,27 +46930,10 @@ "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" - } } ], "allow_headers": [ - "content-type", - "x-ms-copy-source-authorization" + "content-type" ], "allow_query": [], "response": { @@ -46636,17 +46979,18 @@ "refusal": null }, { - "id": "operations/azure/staged-absent", + "id": "operations/azure/stage-key-plus", "profile": "azure", "lane": "core", - "purpose": "staged absent", + "purpose": "stage, 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/multipart/absent.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -46658,7 +47002,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46666,7 +47010,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -46674,7 +47018,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -46682,32 +47026,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "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": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -46720,43 +47067,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": "BlobNotFound" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-absent-code-in-body", + "id": "operations/azure/stage-key-space", "profile": "azure", "lane": "core", - "purpose": "staged absent, 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": { - "key": "object-tests/multipart/absent.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/space name.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -46768,7 +47108,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46776,7 +47116,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -46784,7 +47124,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -46792,31 +47132,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 404, + "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": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -46829,40 +47173,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": "BlobNotFound" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-after-commit", + "id": "operations/azure/stage-key-non-ascii", "profile": "azure", "lane": "core", - "purpose": "staged after commit", + "purpose": "stage, with the key \"café/雪.txt\"", "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" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/café/雪.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -46874,7 +47214,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -46882,7 +47222,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -46890,7 +47230,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -46898,36 +47238,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -46943,68 +47283,32 @@ } }, { - "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", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 0 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-after-replacement", + "id": "operations/azure/stage-key-double-slash", "profile": "azure", "lane": "core", - "purpose": "staged after replacement", + "purpose": "stage, 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/multipart/replaced.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/double//slash.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -47016,7 +47320,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47024,7 +47328,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -47032,7 +47336,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -47040,36 +47344,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47085,52 +47389,32 @@ } }, { - "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", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 - } - }, - { - "at": "/value/uncommitted", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 0 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-after-whole-write", + "id": "operations/azure/stage-key-trailing-slash", "profile": "azure", "lane": "core", - "purpose": "staged after whole write", + "purpose": "stage, with the key \"trailing-slash/\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/whole.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/trailing-slash/", + "op": "azure.stage_block" }, "exchanges": [ { @@ -47142,7 +47426,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47150,7 +47434,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/whole.bin" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -47158,7 +47442,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -47166,36 +47450,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "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" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47211,36 +47495,36 @@ } }, { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/uncommitted", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 0 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-committed-empty", + "id": "operations/azure/stage-from-url", "profile": "azure", "lane": "core", - "purpose": "staged committed empty", + "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": { + "block_id_base64": "MDAwMDAy", "key": "object-tests/multipart/staged.bin", - "kind": "committed", - "op": "azure.list_blocks" + "op": "azure.stage_block_from_url", + "source_key": "object-tests/copy/source.txt", + "source_range": { + "end": 3, + "start": 0 + } }, "exchanges": [ { @@ -47252,7 +47536,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47276,35 +47560,60 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "committed" + "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 [^ ]+" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -47320,34 +47629,164 @@ } }, { - "at": "/value/committed", + "at": "/value/etag", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/stage-from-url-other-account", + "profile": "azure", + "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": { + "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": "array_length", - "value": 0 + "is": "equal", + "value": "ok" } }, { - "at": "/value/uncommitted", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 0 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-committed-nothing", + "id": "operations/azure/staged-absent", "profile": "azure", "lane": "core", - "purpose": "staged committed nothing", + "purpose": "staged absent", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/empty.bin", + "key": "object-tests/multipart/absent.bin", "kind": "all", "op": "azure.list_blocks" }, @@ -47369,7 +47808,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/empty.bin" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { @@ -47400,21 +47839,18 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 404, "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" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "data": "BlobNotFoundFixture error" + } } } ] @@ -47426,38 +47862,41 @@ "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": 404 } }, { - "at": "/value/uncommitted", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/staged-escaped-id", + "id": "operations/azure/staged-absent-code-in-body", "profile": "azure", "lane": "core", - "purpose": "staged escaped id", + "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": { - "key": "object-tests/multipart/escaped.bin", + "key": "object-tests/multipart/absent.bin", "kind": "all", "op": "azure.list_blocks" }, @@ -47479,7 +47918,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { @@ -47510,20 +47949,17 @@ "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" + } }, "body": { "encoding": "utf8", - "data": "+/8=3" - }, - "framing": "chunked" + "data": "BlobNotFoundFixture error" + } } } ] @@ -47535,54 +47971,38 @@ "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": 404 } }, { - "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": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/staged-replacement", + "id": "operations/azure/staged-after-commit", "profile": "azure", "lane": "core", - "purpose": "staged replacement", + "purpose": "staged after commit", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/pending.bin", + "key": "object-tests/multipart/committed.bin", "kind": "all", "op": "azure.list_blocks" }, @@ -47604,7 +48024,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { @@ -47641,13 +48061,13 @@ "date": { "from": "now" }, - "etag": "\"fixture-9c5ca12bcfc9\"", + "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" }, "body": { "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" + "data": "MDAwMDAx5MDAwMDAy6" }, "framing": "chunked" } @@ -47704,43 +48124,27 @@ "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 + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted-only", + "id": "operations/azure/staged-after-replacement", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted only", + "purpose": "staged after replacement", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/staged.bin", + "key": "object-tests/multipart/replaced.bin", "kind": "all", "op": "azure.list_blocks" }, @@ -47762,7 +48166,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -47799,12 +48203,13 @@ "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" }, "body": { "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" + "data": "MDAwMDAx5" }, "framing": "chunked" } @@ -47822,15 +48227,7 @@ } }, { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/uncommitted/0/id_base64", + "at": "/value/committed/0/id_base64", "optional": false, "rule": { "is": "equal", @@ -47838,7 +48235,7 @@ } }, { - "at": "/value/uncommitted/0/size", + "at": "/value/committed/0/size", "optional": false, "rule": { "is": "equal", @@ -47846,19 +48243,11 @@ } }, { - "at": "/value/uncommitted/1/id_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "MDAwMDAy" - } - }, - { - "at": "/value/uncommitted/1/size", + "at": "/value/committed", "optional": false, "rule": { - "is": "equal", - "value": 6 + "is": "array_length", + "value": 1 } }, { @@ -47866,23 +48255,23 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted", + "id": "operations/azure/staged-after-whole-write", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted", + "purpose": "staged after whole write", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/staged.bin", - "kind": "uncommitted", + "key": "object-tests/multipart/whole.bin", + "kind": "all", "op": "azure.list_blocks" }, "exchanges": [ @@ -47903,7 +48292,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/whole.bin" } }, { @@ -47927,7 +48316,7 @@ "optional": false, "rule": { "is": "equal", - "value": "uncommitted" + "value": "all" } } ], @@ -47940,12 +48329,13 @@ "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": "MDAwMDAx5MDAwMDAy6" + "data": "" }, "framing": "chunked" } @@ -47970,61 +48360,29 @@ "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 + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-container-missing", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-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": "staged committed 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" + "key": "object-tests/multipart/staged.bin", + "kind": "committed", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48036,7 +48394,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48044,15 +48402,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": "" } }, { @@ -48062,25 +48420,33 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "committed" + } } ], - "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": "" + }, + "framing": "chunked" } } ] @@ -48092,54 +48458,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", + "at": "/value/committed", "optional": false, "rule": { - "is": "equal", - "value": "ContainerNotFound" + "is": "array_length", + "value": 0 } }, { - "at": "/kind", + "at": "/value/uncommitted", "optional": false, "rule": { - "is": "equal", - "value": "container_not_found" + "is": "array_length", + "value": 0 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-declaring-md5", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-nothing", + "profile": "azure", "lane": "core", - "purpose": "commit declaring md5", + "purpose": "staged committed nothing", "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" + "key": "object-tests/multipart/empty.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48151,7 +48503,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48159,53 +48511,52 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/multipart/empty.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "" } }, { - "at": "/headers/x-ms-blob-content-md5", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "blocklist" } }, { - "at": "/query/comp", + "at": "/query/blocklisttype", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "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-9a581bc70e20\"", + "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", - "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" } } ] @@ -48221,48 +48572,36 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-9a581bc70e20\"" + "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-duplicate-id", - "profile": "azure-hns", + "id": "operations/azure/staged-escaped-id", + "profile": "azure", "lane": "core", - "purpose": "commit duplicate id", + "purpose": "staged escaped 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": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/duplicate.bin", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/escaped.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48274,7 +48613,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48282,15 +48621,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/duplicate.bin" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAx" + "is": "equal", + "value": "" } }, { @@ -48300,27 +48639,33 @@ "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "+/8=3" + }, + "framing": "chunked" } } ] @@ -48336,44 +48681,52 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a8581b642c5f\"" + "value": "+/8=" } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted/0/size", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-escaped-id", - "profile": "azure-hns", + "id": "operations/azure/staged-replacement", + "profile": "azure", "lane": "core", - "purpose": "commit escaped id", + "purpose": "staged replacement", "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" + "key": "object-tests/multipart/pending.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48385,7 +48738,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48393,15 +48746,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "+/8=" + "is": "equal", + "value": "" } }, { @@ -48411,27 +48764,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-77b5e2317b8a\"", + "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", - "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": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" + }, + "framing": "chunked" } } ] @@ -48447,45 +48807,84 @@ } }, { - "at": "/value/etag", + "at": "/value/committed/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-77b5e2317b8a\"" + "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/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/commit-lost-the-race-to-create", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted-only", + "profile": "azure", "lane": "core", - "purpose": "commit lost the race to create", + "purpose": "staged uncommitted only", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "if_none_match": "*", - "key": "object-tests/multipart/pending.bin", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/staged.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48497,7 +48896,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48505,51 +48904,51 @@ "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": "" } }, { - "at": "/headers/if-none-match", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "blocklist" } }, { - "at": "/query/comp", + "at": "/query/blocklisttype", "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "all" } } ], - "allow_headers": [ - "content-type" - ], + "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": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -48561,40 +48960,72 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "MDAwMDAx" } }, { - "at": "/code", + "at": "/value/uncommitted/0/size", "optional": false, "rule": { "is": "equal", - "value": "BlobAlreadyExists" + "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/commit-nothing", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted", + "profile": "azure", "lane": "core", - "purpose": "commit nothing", + "purpose": "staged uncommitted", "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" + "key": "object-tests/multipart/staged.bin", + "kind": "uncommitted", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -48606,7 +49037,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -48614,15 +49045,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": "" } }, { @@ -48632,27 +49063,33 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "uncommitted" + } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 200, "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -48668,43 +49105,67 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-072bed78cc6a\"" + "value": "MDAwMDAx" } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted/0/size", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "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/commit-over-whole-object", + "id": "operations/azure-hns/commit-container-missing", "profile": "azure-hns", "lane": "core", - "purpose": "commit over whole object", + "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": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/over.bin", + "blocks": [], + "key": "object.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -48725,7 +49186,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/over.bin" + "value": "/fixture/object.bin" } }, { @@ -48733,7 +49194,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAx" + "value": "" } }, { @@ -48750,19 +49211,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 404, "headers": { + "content-type": "application/xml", "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" + "x-ms-error-code": "ContainerNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" } } } @@ -48775,36 +49234,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-7dc650e58291\"" + "value": 404 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "ContainerNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "container_not_found" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-precondition-failed", + "id": "operations/azure-hns/commit-declaring-md5", "profile": "azure-hns", "lane": "core", - "purpose": "commit precondition failed", + "purpose": "commit declaring md5", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -48815,8 +49279,8 @@ "kind": "latest" } ], - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/multipart/pending.bin", + "content_md5_base64": "N6YZkbg+Lyfxtskwn8iRCg==", + "key": "object-tests/hashes/committed.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -48837,7 +49301,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { @@ -48849,11 +49313,11 @@ } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-blob-content-md5", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -48870,17 +49334,19 @@ ], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "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" }, "body": { - "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -48893,141 +49359,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-9a581bc70e20\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "ConditionNotMet" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-refused", + "id": "operations/azure-hns/commit-duplicate-id", "profile": "azure-hns", "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": { - "blocks": [], - "key": "object.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.bin" - } - }, - { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "blocklist" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 404, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ContainerNotFound" - }, - "body": { - "encoding": "utf8", - "data": "ContainerNotFoundFixture 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": "ContainerNotFound" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/commit-reordered", - "profile": "azure-hns", - "lane": "core", - "purpose": "commit reordered", + "purpose": "commit duplicate id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "blocks": [ { - "id_base64": "MDAwMDAy", + "id_base64": "MDAwMDAx", "kind": "latest" }, { @@ -49035,7 +49403,7 @@ "kind": "latest" } ], - "key": "object-tests/multipart/reordered.bin", + "key": "object-tests/multipart/duplicate.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49056,7 +49424,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "value": "/fixture/object-tests/multipart/duplicate.bin" } }, { @@ -49064,7 +49432,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAyMDAwMDAx" + "value": "MDAwMDAxMDAwMDAx" } }, { @@ -49086,7 +49454,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-446301cfeaef\"", + "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" @@ -49114,7 +49482,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-446301cfeaef\"" + "value": "\"fixture-a8581b642c5f\"" } }, { @@ -49132,21 +49500,21 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-replacement", + "id": "operations/azure-hns/commit-escaped-id", "profile": "azure-hns", "lane": "core", - "purpose": "commit replacement", + "purpose": "commit escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "blocks": [ { - "id_base64": "MDAwMDAx", + "id_base64": "+/8=", "kind": "latest" } ], - "key": "object-tests/multipart/replaced.bin", + "key": "object-tests/multipart/escaped.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49167,7 +49535,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { @@ -49175,7 +49543,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAx" + "value": "+/8=" } }, { @@ -49197,7 +49565,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-9c5e55ff559c\"", + "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" @@ -49225,7 +49593,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9c5e55ff559c\"" + "value": "\"fixture-77b5e2317b8a\"" } }, { @@ -49243,10 +49611,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id", + "id": "operations/azure-hns/commit-lost-the-race-to-create", "profile": "azure-hns", "lane": "core", - "purpose": "commit unstaged id", + "purpose": "commit lost the race to create", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -49255,13 +49623,10 @@ { "id_base64": "MDAwMDAx", "kind": "latest" - }, - { - "id_base64": "MDAwMDA5", - "kind": "latest" } ], - "key": "object-tests/multipart/staged.bin", + "if_none_match": "*", + "key": "object-tests/multipart/pending.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49282,7 +49647,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -49290,7 +49655,15 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "*" } }, { @@ -49307,17 +49680,17 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlockList" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "data": "BlobAlreadyExistsFixture error" } } } @@ -49338,7 +49711,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 409 } }, { @@ -49346,35 +49719,23 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlockList" + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id-code-in-body", + "id": "operations/azure-hns/commit-nothing", "profile": "azure-hns", "lane": "core", - "purpose": "commit unstaged id, with the error code only in the XML body", + "purpose": "commit nothing", "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", + "blocks": [], + "key": "object-tests/multipart/empty.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49395,7 +49756,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/empty.bin" } }, { @@ -49403,7 +49764,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "value": "" } }, { @@ -49420,16 +49781,19 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "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" }, "body": { - "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "encoding": "base64", + "data": "" } } } @@ -49442,33 +49806,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-072bed78cc6a\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "InvalidBlockList" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit", + "id": "operations/azure-hns/commit-over-whole-object", "profile": "azure-hns", "lane": "core", - "purpose": "commit", + "purpose": "commit over whole object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -49477,13 +49844,9 @@ { "id_base64": "MDAwMDAx", "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" } ], - "key": "object-tests/multipart/committed.bin", + "key": "object-tests/multipart/over.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49504,7 +49867,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/multipart/over.bin" } }, { @@ -49512,7 +49875,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAx" } }, { @@ -49534,7 +49897,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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" @@ -49562,7 +49925,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "\"fixture-7dc650e58291\"" } }, { @@ -49580,10 +49943,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-question", + "id": "operations/azure-hns/commit-precondition-failed", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"question?mark.txt\"", + "purpose": "commit precondition failed", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -49592,13 +49955,10 @@ { "id_base64": "MDAwMDAx", "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" } ], - "key": "object-tests/keys/question?mark.txt", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/multipart/pending.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49619,7 +49979,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -49627,7 +49987,15 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-088e5dc109cf\"" } }, { @@ -49644,19 +50012,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "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": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -49669,51 +50035,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": 412 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-hash", + "id": "operations/azure-hns/commit-refused", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"hash#tag.txt\"", + "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": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/hash#tag.txt", + "blocks": [], + "key": "object.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49734,7 +50088,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object.bin" } }, { @@ -49742,7 +50096,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "" } }, { @@ -49759,19 +50113,17 @@ ], "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": "ContainerNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" } } } @@ -49784,51 +50136,48 @@ "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": "ContainerNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-percent", + "id": "operations/azure-hns/commit-reordered", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"percent%20.txt\"", + "purpose": "commit reordered", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "blocks": [ { - "id_base64": "MDAwMDAx", + "id_base64": "MDAwMDAy", "kind": "latest" }, { - "id_base64": "MDAwMDAy", + "id_base64": "MDAwMDAx", "kind": "latest" } ], - "key": "object-tests/keys/percent%20.txt", + "key": "object-tests/multipart/reordered.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49849,7 +50198,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { @@ -49857,7 +50206,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAyMDAwMDAx" } }, { @@ -49879,7 +50228,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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" @@ -49907,7 +50256,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "\"fixture-446301cfeaef\"" } }, { @@ -49925,10 +50274,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-plus", + "id": "operations/azure-hns/commit-replacement", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"plus+plus.txt\"", + "purpose": "commit replacement", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -49937,13 +50286,9 @@ { "id_base64": "MDAwMDAx", "kind": "latest" - }, - { - "id_base64": "MDAwMDAy", - "kind": "latest" } ], - "key": "object-tests/keys/plus+plus.txt", + "key": "object-tests/multipart/replaced.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -49964,7 +50309,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -49972,7 +50317,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAx" } }, { @@ -49994,7 +50339,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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" @@ -50022,7 +50367,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "\"fixture-9c5e55ff559c\"" } }, { @@ -50040,10 +50385,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-space", + "id": "operations/azure-hns/commit-unstaged-id", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"space name.txt\"", + "purpose": "commit unstaged id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -50054,11 +50399,11 @@ "kind": "latest" }, { - "id_base64": "MDAwMDAy", + "id_base64": "MDAwMDA5", "kind": "latest" } ], - "key": "object-tests/keys/space name.txt", + "key": "object-tests/multipart/staged.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -50079,7 +50424,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -50087,7 +50432,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAxMDAwMDA5" } }, { @@ -50104,19 +50449,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "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": "InvalidBlockList" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidBlockListFixture error" } } } @@ -50129,39 +50472,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": 400 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "InvalidBlockList" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-non-ascii", + "id": "operations/azure-hns/commit-unstaged-id-code-in-body", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"café/雪.txt\"", + "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" + "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": [ { @@ -50169,11 +50512,11 @@ "kind": "latest" }, { - "id_base64": "MDAwMDAy", + "id_base64": "MDAwMDA5", "kind": "latest" } ], - "key": "object-tests/keys/café/雪.txt", + "key": "object-tests/multipart/staged.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -50194,7 +50537,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -50202,7 +50545,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAxMDAwMDA5" } }, { @@ -50219,19 +50562,16 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 400, "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": "InvalidBlockListFixture error" } } } @@ -50244,36 +50584,33 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": 400 } }, { - "at": "/value/version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "InvalidBlockList" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-double-slash", + "id": "operations/azure-hns/commit", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"double//slash.txt\"", + "purpose": "commit", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -50288,7 +50625,7 @@ "kind": "latest" } ], - "key": "object-tests/keys/double//slash.txt", + "key": "object-tests/multipart/committed.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -50309,7 +50646,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { @@ -50385,10 +50722,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-key-trailing-slash", + "id": "operations/azure-hns/commit-key-question", "profile": "azure-hns", "lane": "core", - "purpose": "commit, with the key \"trailing-slash/\"", + "purpose": "commit, with the key \"question?mark.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -50403,7 +50740,7 @@ "kind": "latest" } ], - "key": "object-tests/keys/trailing-slash/", + "key": "object-tests/keys/question?mark.txt", "op": "azure.commit_blocks" }, "exchanges": [ @@ -50424,7 +50761,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -50449,17 +50786,19 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlockList" + "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": "InvalidBlockListFixture error" + "encoding": "base64", + "data": "" } } } @@ -50472,33 +50811,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-8ec031f3abfa\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "InvalidBlockList" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-content-properties", + "id": "operations/azure-hns/commit-key-hash", "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", + "purpose": "commit, with the key \"hash#tag.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -50513,11 +50855,7 @@ "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", + "key": "object-tests/keys/hash#tag.txt", "op": "azure.commit_blocks" }, "exchanges": [ @@ -50538,7 +50876,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -50556,38 +50894,6 @@ "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": [ @@ -50646,10 +50952,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-with-tier", + "id": "operations/azure-hns/commit-key-percent", "profile": "azure-hns", "lane": "core", - "purpose": "Commit a block list into an access tier, named in x-ms-access-tier", + "purpose": "commit, with the key \"percent%20.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -50664,9 +50970,8 @@ "kind": "latest" } ], - "key": "object-tests/multipart/committed.bin", - "op": "azure.commit_blocks", - "tier": "Cool" + "key": "object-tests/keys/percent%20.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -50686,7 +50991,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -50704,14 +51009,6 @@ "is": "equal", "value": "blocklist" } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" - } } ], "allow_headers": [ @@ -50770,16 +51067,26 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-accepted", + "id": "operations/azure-hns/commit-key-plus", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted", + "purpose": "commit, 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/remove/present.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -50791,7 +51098,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -50799,28 +51106,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/remove/present.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -50839,21 +51158,50 @@ "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-key-question", + "id": "operations/azure-hns/commit-key-space", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"question?mark.txt\"", + "purpose": "commit, 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/question?mark.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/space name.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -50865,7 +51213,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -50873,28 +51221,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -50913,21 +51273,50 @@ "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-key-hash", + "id": "operations/azure-hns/commit-key-non-ascii", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"hash#tag.txt\"", + "purpose": "commit, 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/hash#tag.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/café/雪.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -50939,7 +51328,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -50947,28 +51336,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -50987,21 +51388,50 @@ "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-key-percent", + "id": "operations/azure-hns/commit-key-double-slash", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"percent%20.txt\"", + "purpose": "commit, 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/percent%20.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/double//slash.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51013,7 +51443,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51021,28 +51451,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51061,21 +51503,50 @@ "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-key-plus", + "id": "operations/azure-hns/commit-key-trailing-slash", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"plus+plus.txt\"", + "purpose": "commit, 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/plus+plus.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/keys/trailing-slash/", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51087,7 +51558,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51095,32 +51566,42 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "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": "InvalidBlockList" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidBlockListFixture error" } } } @@ -51133,23 +51614,53 @@ "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": "InvalidBlockList" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-space", + "id": "operations/azure-hns/commit-content-properties", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"space name.txt\"", + "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": { - "key": "object-tests/keys/space name.txt", - "op": "delete" + "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": [ { @@ -51161,7 +51672,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51169,28 +51680,72 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "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": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51209,21 +51764,51 @@ "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-key-non-ascii", + "id": "operations/azure-hns/commit-with-tier", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"café/雪.txt\"", + "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": { - "key": "object-tests/keys/café/雪.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } + ], + "key": "object-tests/multipart/committed.bin", + "op": "azure.commit_blocks", + "tier": "Cool" }, "exchanges": [ { @@ -51235,7 +51820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51243,28 +51828,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" + } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Cool" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51283,20 +51888,39 @@ "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-key-double-slash", + "id": "operations/azure-hns/delete-accepted", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"double//slash.txt\"", + "purpose": "delete accepted", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/double//slash.txt", + "key": "object-tests/remove/present.txt", "op": "delete" }, "exchanges": [ @@ -51317,7 +51941,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/remove/present.txt" } }, { @@ -51362,15 +51986,15 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-trailing-slash", + "id": "operations/azure-hns/delete-accepted-key-question", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"trailing-slash/\"", + "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/trailing-slash/", + "key": "object-tests/keys/question?mark.txt", "op": "delete" }, "exchanges": [ @@ -51391,7 +52015,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -51406,17 +52030,17 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidUri" + "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": "InvalidUriFixture error" + "encoding": "base64", + "data": "" } } } @@ -51429,43 +52053,97 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "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": [ { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, + "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": "/code", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "InvalidUri" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many", + "id": "operations/azure-hns/delete-accepted-key-percent", "profile": "azure-hns", "lane": "core", - "purpose": "Delete several objects in one batch and report each result", + "purpose": "delete accepted, with the key \"percent%20.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/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" - ], - "op": "delete_many" + "key": "object-tests/keys/percent%20.txt", + "op": "delete" }, "exchanges": [ { @@ -51477,7 +52155,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "DELETE" } }, { @@ -51485,52 +52163,89 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { - "at": "/headers/content-type", + "at": "/body_base64", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "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": "/query/restype", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "DELETE" } }, { - "at": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { - "at": "", + "at": "/body_base64", "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": "" } } ], @@ -51539,16 +52254,16 @@ "response": { "status": 202, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", "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": "--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" + "encoding": "base64", + "data": "" + } } } ] @@ -51562,50 +52277,169 @@ "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": [ { - "at": "/value/deleted", + "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": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "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": [ { - "at": "/value/errors", + "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": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } - ] + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-denied", + "id": "operations/azure-hns/delete-accepted-key-double-slash", "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": "delete accepted, with the key \"double//slash.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/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" - ], - "op": "delete_many" + "key": "object-tests/keys/double//slash.txt", + "op": "delete" }, "exchanges": [ { @@ -51617,7 +52451,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "DELETE" } }, { @@ -51625,70 +52459,107 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { - "at": "/headers/content-type", + "at": "/body_base64", "optional": false, "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" + "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": "/query/restype", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "DELETE" } }, { - "at": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "at": "", + "at": "/body_base64", "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": "" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 400, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "InvalidUri" }, "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" + "data": "InvalidUriFixture error" + } } } ] @@ -51700,54 +52571,36 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/deleted", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [] + "value": 400 } }, { - "at": "/value/errors", + "at": "/code", "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 - } - ] + "value": "InvalidUri" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-answers-out-of-order", + "id": "operations/azure-hns/delete-many", "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": "Delete several objects in one batch and report each result", "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", @@ -51835,7 +52688,7 @@ }, "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--" + "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" } @@ -51881,15 +52734,13 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-lf-line-endings", + "id": "operations/azure-hns/delete-many-denied", "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": "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" ], - "origin": "constructed", - "derived_from": "operations/azure-hns/delete-many", "call": { "keys": [ "object-tests/batch/a.txt", @@ -51977,7 +52828,7 @@ }, "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--" + "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" } @@ -51990,34 +52841,38 @@ "at": "/outcome", "optional": false, "rule": { - "is": "one_of", - "values": [ - "ok", - "error" - ] + "is": "equal", + "value": "ok" } }, { "at": "/value/deleted", - "optional": true, + "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "value": [] } }, { "at": "/value/errors", - "optional": true, + "optional": false, "rule": { "is": "equal", "value": [ { - "code": "BlobNotFound", + "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": 404 + "status": 403 } ] } @@ -52026,10 +52881,10 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-without-content-id", + "id": "operations/azure-hns/delete-many-answers-out-of-order", "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": "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" ], @@ -52122,7 +52977,7 @@ }, "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--" + "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" } @@ -52136,21 +52991,46 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "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-server-busy", + "id": "operations/azure-hns/delete-many-lf-line-endings", "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": "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": "transient", + "origin": "constructed", "derived_from": "operations/azure-hns/delete-many", "call": { "keys": [ @@ -52230,108 +53110,82 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 503, + "status": 202, "headers": { - "content-type": "application/xml", + "content-type": "multipart/mixed; boundary=batchresponse_fixture", "date": { "from": "now" - }, - "x-ms-error-code": "ServerBusy" + } }, "body": { "encoding": "utf8", - "data": "ServerBusyFixture error" - } + "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" + ] + } }, { - "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 + "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": [ { @@ -52401,23 +53255,54 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 503, + "status": 202, "headers": { - "content-type": "application/xml", + "content-type": "multipart/mixed; boundary=batchresponse_fixture", "date": { "from": "now" - }, - "x-ms-error-code": "ServerBusy" + } }, "body": { "encoding": "utf8", - "data": "ServerBusyFixture error" - } + "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" } } - ], - "optional": true - }, + ] + } + ], + "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": [ { @@ -52501,8 +53386,265 @@ } } } - ], - "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": [ @@ -80825,35 +81967,882 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots-all/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "snapshots" + "value": "object-tests/snapshots-all/" + } + }, + { + "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-all/" + }, + "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-hns/list-snapshots-after-snapshots-deleted", + "profile": "azure-hns", + "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": [ + { + "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-only/" + } + }, + { + "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-only/object-tests/snapshots-only/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d8eb33996d7file4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "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", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-5d8eb33996d7" + } + }, + { + "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/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-hns/list-snapshots-and-versions", + "profile": "azure-hns", + "lane": "core", + "purpose": "list snapshots and versions", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "include": [ + "snapshots", + "versions" + ], + "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,versions" + } + } + ], + "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.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "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-2666f63dbf0b" + } + }, + { + "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/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "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-hns/list-snapshots", + "profile": "azure-hns", + "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.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "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-2666f63dbf0b" + } + }, + { + "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/0/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "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-hns/list-staged-only", + "profile": "azure-hns", + "lane": "core", + "purpose": "list staged only", + "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" + }, + "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/multipart/staged.bin" + } + } + ], + "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/multipart/staged.bin" + }, + "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-hns/list-unauthenticated", + "profile": "azure-hns", + "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": { + "op": "list_page", + "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/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/" } } ], "allow_headers": [], "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": "object-tests/snapshots-all/" - }, - "framing": "chunked" + "data": "InvalidAuthenticationInfoFixture error" + } } } ] @@ -80865,50 +82854,42 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": "error" } }, { - "at": "/value/prefixes", + "at": "/status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 401 } }, { - "at": "/value/continuation_token", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-snapshots-after-snapshots-deleted", + "id": "operations/azure-hns/list-versions-of-deleted-object", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots after snapshots deleted", + "purpose": "list versions of deleted object", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "include": [ - "snapshots" + "versions" ], "op": "list_page", - "prefix": "object-tests/snapshots-only/" + "prefix": "object-tests/versions-mtypy4jp/deleted.txt" }, "exchanges": [ { @@ -80960,7 +82941,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots-only/" + "value": "object-tests/versions-mtypy4jp/deleted.txt" } }, { @@ -80968,7 +82949,7 @@ "optional": false, "rule": { "is": "equal", - "value": "snapshots" + "value": "versions" } } ], @@ -80986,7 +82967,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots-only/object-tests/snapshots-only/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d8eb33996d7file4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/versions-mtypy4jp/deleted.txt" }, "framing": "chunked" } @@ -81003,77 +82984,12 @@ "value": "ok" } }, - { - "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", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-5d8eb33996d7" - } - }, - { - "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/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "TYtghPPRZ7dsrGaiKpG+Ag==" - } - }, { "at": "/value/entries", "optional": false, "rule": { "is": "array_length", - "value": 1 + "value": 0 } }, { @@ -81096,20 +83012,19 @@ "refusal": null }, { - "id": "operations/azure-hns/list-snapshots-and-versions", + "id": "operations/azure-hns/list-versions", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots and versions", + "purpose": "list versions", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "include": [ - "snapshots", "versions" ], "op": "list_page", - "prefix": "object-tests/snapshots/" + "prefix": "object-tests/versions-mtypy4jp/" }, "exchanges": [ { @@ -81161,7 +83076,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/" + "value": "object-tests/versions-mtypy4jp/" } }, { @@ -81169,7 +83084,7 @@ "optional": false, "rule": { "is": "equal", - "value": "snapshots,versions" + "value": "versions" } } ], @@ -81187,7 +83102,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots/object-tests/snapshots/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/versions-mtypy4jp/object-tests/versions-mtypy4jp/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bd163fcc78d6file2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -81209,7 +83124,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/versions-mtypy4jp/object.txt" } }, { @@ -81217,7 +83132,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 2 } }, { @@ -81225,7 +83140,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-2666f63dbf0b" + "value": "fixture-bd163fcc78d6" } }, { @@ -81266,7 +83181,7 @@ "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": "GyZ2GcSBLMRu4oF0eITKUA==" } }, { @@ -81297,19 +83212,16 @@ "refusal": null }, { - "id": "operations/azure-hns/list-snapshots", + "id": "operations/azure-hns/list-written-with-hashes", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots", + "purpose": "list written with hashes", "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/" + "prefix": "object-tests/hashes/" }, "exchanges": [ { @@ -81361,15 +83273,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "snapshots" + "value": "object-tests/hashes/" } } ], @@ -81387,7 +83291,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots/object-tests/snapshots/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/hashes/object-tests/hashes/committed.binMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1e5253c0f65afile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1a8d1824b282file13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b064c67c0acfile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -81409,27 +83313,165 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/hashes/committed.bin" + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 13 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-1e5253c0f65a" + } + }, + { + "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/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-1a8d1824b282" + } + }, + { + "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/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/0/size", + "at": "/value/entries/2/size", "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 13 } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/2/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-2666f63dbf0b" + "value": "fixture-3b064c67c0ac" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/2/snapshot", "optional": true, "rule": { "is": "one_of", @@ -81440,7 +83482,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/2/version", "optional": true, "rule": { "is": "one_of", @@ -81451,7 +83493,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/2/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -81462,11 +83504,11 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -81474,7 +83516,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 1 + "value": 3 } }, { @@ -81497,16 +83539,17 @@ "refusal": null }, { - "id": "operations/azure-hns/list-staged-only", + "id": "operations/azure-hns/put-container-missing", "profile": "azure-hns", "lane": "core", - "purpose": "list staged only", + "purpose": "put 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": { - "op": "list_page", - "prefix": "object-tests/multipart/staged.bin" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", + "op": "put" }, "exchanges": [ { @@ -81518,7 +83561,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -81526,7 +83569,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object.txt" } }, { @@ -81534,51 +83577,35 @@ "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" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "object-tests/multipart/staged.bin" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "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/multipart/staged.bin" - }, - "framing": "chunked" + "data": "ContainerNotFoundFixture error" + } } } ] @@ -81590,47 +83617,52 @@ "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": 404 } }, { - "at": "/value/prefixes", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "ContainerNotFound" } }, { - "at": "/value/continuation_token", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "container_not_found" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-unauthenticated", + "id": "operations/azure-hns/put-crc64-mismatch", "profile": "azure-hns", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "put crc64 mismatch", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list_page", - "prefix": "object-tests/" + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "khqMBK+EUSA=" + }, + "key": "object-tests/hashes/crc64-mismatch.txt", + "op": "put" }, "exchanges": [ { @@ -81642,7 +83674,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -81650,7 +83682,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" } }, { @@ -81658,48 +83690,42 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" + "value": "ZGVjbGFyZWQtYm9keQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-content-crc64", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "khqMBK+EUSA=" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "object-tests/" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 401, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "x-ms-error-code": "Crc64Mismatch" }, "body": { "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" + "data": "Crc64MismatchFixture error" } } } @@ -81720,7 +83746,7 @@ "optional": false, "rule": { "is": "equal", - "value": 401 + "value": 400 } }, { @@ -81728,26 +83754,24 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "Crc64Mismatch" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-versions-of-deleted-object", + "id": "operations/azure-hns/put-created-empty", "profile": "azure-hns", "lane": "core", - "purpose": "list versions of deleted object", + "purpose": "put created empty", "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-mtypy4jp/deleted.txt" + "body_base64": "", + "key": "object-tests/write/empty.bin", + "op": "put" }, "exchanges": [ { @@ -81759,7 +83783,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -81767,7 +83791,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/write/empty.bin" } }, { @@ -81779,55 +83803,34 @@ } }, { - "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-mtypy4jp/deleted.txt" - } - }, - { - "at": "/query/include", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "versions" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "1B2M2Y8AsgTpgAmY7PhCfg==", "date": { "from": "now" }, + "etag": "\"fixture-9373f0410116\"", "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": "utf8", - "data": "object-tests/versions-mtypy4jp/deleted.txt" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -81843,46 +83846,39 @@ } }, { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/prefixes", + "at": "/value/etag", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "\"fixture-9373f0410116\"" } }, { - "at": "/value/continuation_token", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-versions", + "id": "operations/azure-hns/put-created", "profile": "azure-hns", "lane": "core", - "purpose": "list versions", + "purpose": "put created", "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-mtypy4jp/" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -81894,7 +83890,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -81902,7 +83898,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -81910,59 +83906,145 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/restype", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "container" + "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": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { - "at": "/query/prefix", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtypy4jp/" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/include", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "versions" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "object-tests/versions-mtypy4jp/object-tests/versions-mtypy4jp/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bd163fcc78d6file2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -81978,42 +84060,15 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions-mtypy4jp/object.txt" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/0/etag", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-bd163fcc78d6" - } - }, - { - "at": "/value/entries/0/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/value/entries/0/version", + "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -82022,64 +84077,129 @@ "" ] } - }, + } + ], + "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": [ { - "at": "/value/entries/0/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, + "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": "/value/entries/0/content_md5_base64", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "GyZ2GcSBLMRu4oF0eITKUA==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "ok" } }, { - "at": "/value/prefixes", + "at": "/value/etag", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-written-with-hashes", + "id": "operations/azure-hns/put-created-key-percent", "profile": "azure-hns", "lane": "core", - "purpose": "list written with hashes", + "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": { - "op": "list_page", - "prefix": "object-tests/hashes/" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/percent%20.txt", + "op": "put" }, "exchanges": [ { @@ -82091,7 +84211,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -82099,7 +84219,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -82107,51 +84227,38 @@ "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" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "headers": { - "content-type": "application/xml", + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "object-tests/hashes/object-tests/hashes/committed.binMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1e5253c0f65afile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1a8d1824b282file13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b064c67c0acfile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -82167,180 +84274,15 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/hashes/committed.bin" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 13 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-1e5253c0f65a" - } - }, - { - "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/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-1a8d1824b282" - } - }, - { - "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/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", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-3b064c67c0ac" - } - }, - { - "at": "/value/entries/2/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/value/entries/2/version", + "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -82349,64 +84291,21 @@ "" ] } - }, - { - "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": "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-hns/put-container-missing", + "id": "operations/azure-hns/put-created-key-plus", "profile": "azure-hns", "lane": "core", - "purpose": "put container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "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": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/plus+plus.txt", "op": "put" }, "exchanges": [ @@ -82427,7 +84326,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -82435,7 +84334,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -82452,17 +84351,20 @@ ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "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": "utf8", - "data": "ContainerNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -82475,51 +84377,42 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "ContainerNotFound" + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/kind", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "container_not_found" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/put-crc64-mismatch", + "id": "operations/azure-hns/put-created-key-space", "profile": "azure-hns", "lane": "core", - "purpose": "put crc64 mismatch", + "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": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "azure_crc64", - "value_base64": "khqMBK+EUSA=" - }, - "key": "object-tests/hashes/crc64-mismatch.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/space name.txt", "op": "put" }, "exchanges": [ @@ -82540,7 +84433,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -82548,15 +84441,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" - } - }, - { - "at": "/headers/x-ms-content-crc64", - "optional": false, - "rule": { - "is": "equal", - "value": "khqMBK+EUSA=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -82573,17 +84458,20 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "Crc64Mismatch" + "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": "utf8", - "data": "Crc64MismatchFixture error" + "encoding": "base64", + "data": "" } } } @@ -82596,39 +84484,42 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "Crc64Mismatch" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-empty", + "id": "operations/azure-hns/put-created-key-non-ascii", "profile": "azure-hns", "lane": "core", - "purpose": "put created empty", + "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": "", - "key": "object-tests/write/empty.bin", + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/café/雪.txt", "op": "put" }, "exchanges": [ @@ -82649,7 +84540,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/empty.bin" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -82657,7 +84548,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -82676,11 +84567,11 @@ "response": { "status": 201, "headers": { - "content-md5": "1B2M2Y8AsgTpgAmY7PhCfg==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-9373f0410116\"", + "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" @@ -82708,7 +84599,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9373f0410116\"" + "value": "\"fixture-bf139483d631\"" } }, { @@ -82726,16 +84617,16 @@ "refusal": null }, { - "id": "operations/azure-hns/put-created", + "id": "operations/azure-hns/put-created-key-double-slash", "profile": "azure-hns", "lane": "core", - "purpose": "put created", + "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/write/object.txt", + "key": "object-tests/keys/double//slash.txt", "op": "put" }, "exchanges": [ @@ -82756,7 +84647,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -82833,16 +84724,16 @@ "refusal": null }, { - "id": "operations/azure-hns/put-created-key-question", + "id": "operations/azure-hns/put-created-key-trailing-slash", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"question?mark.txt\"", + "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/question?mark.txt", + "key": "object-tests/keys/trailing-slash/", "op": "put" }, "exchanges": [ @@ -82863,7 +84754,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -82883,25 +84774,121 @@ } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [ + "content-type" + ], + "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/copy-missing-source", + "profile": "azure-hns", + "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": 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 +84901,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 +84954,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -82978,37 +84962,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 +85005,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 +85049,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83085,37 +85057,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 +85108,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 +85150,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83192,37 +85158,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 +85209,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 +85251,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83299,37 +85259,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 +85305,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 +85359,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83406,37 +85367,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 +85413,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 +85467,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83513,37 +85475,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 +85521,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 +85575,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -83620,34 +85583,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 +85622,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 +85684,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 +85723,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 +85784,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 +85830,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 +85881,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 +85939,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 +85986,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 +86040,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -84179,25 +86048,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 +86103,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 +86150,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 +86215,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 +86244,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 +86314,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 +86365,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 +86441,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 +86479,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 +86548,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 +86600,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 +86663,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 +86727,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 +86788,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 +86855,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 +86902,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 +86954,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 +87009,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 +87058,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 +87105,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 +87155,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 +87199,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -85264,7 +87207,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85276,55 +87219,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 +87253,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 +87307,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85390,43 +87315,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 +87377,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -85455,26 +87385,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 +87423,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85502,7 +87431,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -85510,37 +87439,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 +87485,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 +87538,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -85602,27 +87550,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 +87575,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 +87608,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 +87637,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -85704,7 +87645,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85712,7 +87653,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -85720,7 +87661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "pagelist" + "value": "appendblock" } } ], @@ -85733,11 +87674,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 +87707,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 +87745,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85812,7 +87753,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "c2Vjb25k" } }, { @@ -85820,40 +87761,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 +87807,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -85882,25 +87815,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 +87852,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -85928,7 +87860,7 @@ "optional": false, "rule": { "is": "equal", - "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" + "value": "c2Vjb25k" } }, { @@ -85936,40 +87868,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 +87900,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 +87953,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -86047,36 +87965,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 +88017,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 +88082,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -86160,130 +88092,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 +88146,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 +88208,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -86367,6 +88218,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 +95792,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": { diff --git a/cases/vectors.json b/cases/vectors.json index 0635b6d..879726b 100644 --- a/cases/vectors.json +++ b/cases/vectors.json @@ -131,36 +131,6 @@ } ] }, - { - "id": "azure/hmac-sha256-rfc4231", - "profile": "azure", - "lane": "vectors", - "purpose": "RFC 4231 test case 1.", - "sources": [ - "https://www.rfc-editor.org/rfc/rfc4231#section-4.2" - ], - "call": { - "op": "hmac_sha256", - "key_base64": "CwsLCwsLCwsLCwsLCwsLCwsLCws=", - "body_base64": "SGkgVGhlcmU=" - }, - "expect": [ - { - "at": "/outcome", - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/digest_base64", - "rule": { - "is": "equal", - "value": "sDRMYdjbOFNcqK/OrwvxK4gdwgDJgz2nJuk3bC4yz/c=" - } - } - ] - }, { "id": "s3/hmac-sha256-rfc4231", "profile": "s3", @@ -273,82 +243,6 @@ } ] }, - { - "id": "azure/shared-key-encoded-name", - "profile": "azure", - "lane": "vectors", - "purpose": "Document-derived Shared Key example with a public synthetic key; the canonicalized resource keeps the escaped path.", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" - ], - "call": { - "op": "azure.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" - }, - "body_base64": "", - "clock": "2024-01-01T00:00:00Z", - "credentials": { - "account": "fixture", - "key_base64": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=" - } - }, - "expect": [ - { - "at": "/outcome", - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/authorization", - "rule": { - "is": "equal", - "value": "SharedKey fixture:klWCi6Ppc/uMEOOhAHKe9/os6gErdqBdFvMjaTd9lx4=" - } - } - ] - }, - { - "id": "azure/canonical-shared-key", - "profile": "azure", - "lane": "vectors", - "purpose": "Empty standard fields and final query line are significant; no newline is appended after the resource.", - "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" - ], - "call": { - "op": "azure.string_to_sign", - "method": "GET", - "url": "https://fixture.blob.core.windows.net/fixture/a%20b?comp=metadata", - "account": "fixture", - "headers": { - "x-ms-date": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-version": "2023-11-03" - }, - "body_base64": "" - }, - "expect": [ - { - "at": "/outcome", - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/text", - "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" - } - } - ] - }, { "id": "azure/crc64-empty", "profile": "azure", 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()); } From 0e9baf7950a960bc28d7c4ce3baa95354a045edd Mon Sep 17 00:00:00 2001 From: Tip ten Brink <75669206+tiptenbrink@users.noreply.github.com> Date: Sat, 3 Oct 2026 16:09:52 +0200 Subject: [PATCH 2/5] Name the missing permission behind Azure's batch version refusal. delete-many-version is refused for a caller without blobs/deleteBlobVersion/action; delete-many-current-version is refused to any caller. Co-Authored-By: Claude Opus 5.5 (1M context) --- cases/operations.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cases/operations.json b/cases/operations.json index ce7fc9d..c0258b0 100644 --- a/cases/operations.json +++ b/cases/operations.json @@ -372,13 +372,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", @@ -10595,7 +10595,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" ], @@ -10736,7 +10736,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" ], From b920945c462cfc0abbe9d63e0c90d916795d0375 Mon Sep 17 00:00:00 2001 From: Tip ten Brink <75669206+tiptenbrink@users.noreply.github.com> Date: Sat, 3 Oct 2026 16:22:34 +0200 Subject: [PATCH 3/5] Test SigV4 signing with vectors aimed at canonicalization traps. Replaces the lone canonical-request vector with 12 SigV4 vectors, each confirmed against S3. s3.sign takes a list-valued header and payload_hash, and may report its canonical_request. Co-Authored-By: Claude Opus 5.5 (1M context) --- REFERENCE.md | 2 + cases/vectors.json | 569 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 558 insertions(+), 13 deletions(-) diff --git a/REFERENCE.md b/REFERENCE.md index 63b2367..8c060d4 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -33,6 +33,8 @@ Leave out a result property the client does not expose, and name it in `unsuppor 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. + `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`. diff --git a/cases/vectors.json b/cases/vectors.json index 879726b..1c49fbb 100644 --- a/cases/vectors.json +++ b/cases/vectors.json @@ -165,7 +165,7 @@ "id": "s3/sigv4-get-range", "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 the AWS documentation's GET with a range header. The exact signature catches canonicalization and key-derivation errors", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html" ], @@ -202,29 +202,341 @@ "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": "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-path-encoded", + "profile": "s3", + "lane": "vectors", + "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/photos/a%20b%2Bc%3Dd~e%C3%A9.jpg", + "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=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/sigv4-path-not-normalized", + "profile": "s3", + "lane": "vectors", + "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.sign", + "method": "GET", + "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" + }, + "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=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/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": "s3/sigv4-query-sorted", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign a query whose parameters arrive out of order: the canonical query sorts them by encoded name", + "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/?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": "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=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/canonical-get-range", + "id": "s3/sigv4-query-reencoded", "profile": "s3", "lane": "vectors", - "purpose": "Canonical text is optional diagnostic coverage; an opaque signer can declare unsupported.", + "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.canonical_request", + "op": "s3.sign", "method": "GET", - "path": "/test.txt", - "query": [], + "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": [ + { + "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=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": "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": "s3/sigv4-query-repeated", + "profile": "s3", + "lane": "vectors", + "purpose": "Sign a parameter sent twice: the canonical query keeps both, sorted by 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/?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": { - "Host": "examplebucket.s3.amazonaws.com", - "Range": "bytes=0-9", - "x-amz-content-sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "x-amz-date": "20130524T000000Z" + "Content-Type": "text/plain", + "X-Amz-Meta-Note": " two spaces inside " + }, + "body_base64": "aGVsbG8=", + "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": [ { @@ -235,10 +547,241 @@ } }, { - "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-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": "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": "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": [ + { + "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-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": "AQoDYXdzEJr1K2oP+ExampleSessionToken/With+Slash==" } } ] From 5b36b5be3270e642661f5d48514311726d28ba55 Mon Sep 17 00:00:00 2001 From: Tip ten Brink <75669206+tiptenbrink@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:08:08 +0200 Subject: [PATCH 4/5] Test read checksums, blob property updates and upload listings. Adds checksum mode on S3 reads, Azure range checksums, Set Blob Metadata and Set Blob Properties, ListMultipartUploads and ListDirectoryBuckets; a failed checksum is the new error kind checksum_mismatch. Co-Authored-By: Claude Opus 5.5 (1M context) --- REFERENCE.md | 4 +- cases/management.json | 234 + cases/operations.json | 62201 +++++++++++++++++++++++----------------- 3 files changed, 35833 insertions(+), 26606 deletions(-) diff --git a/REFERENCE.md b/REFERENCE.md index 8c060d4..132d437 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -27,7 +27,7 @@ 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":"..."}]`. @@ -35,6 +35,8 @@ Keys are unescaped, bodies base64, ranges an offset and an exclusive end. A `che 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`. 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 c0258b0..efa9633 100644 --- a/cases/operations.json +++ b/cases/operations.json @@ -128,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", @@ -264,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", @@ -433,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", @@ -578,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", @@ -687,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", @@ -735,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", @@ -774,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", @@ -929,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", @@ -987,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", @@ -1032,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", @@ -18268,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": [ { @@ -18297,7 +18346,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18307,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": [ { @@ -18418,7 +18415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18428,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==" } } } @@ -18471,7 +18486,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-2184b3e6c2c3\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -18479,7 +18494,7 @@ "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 4 } }, { @@ -18495,7 +18510,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.5387802Z" + "value": "2024-01-01T00:00:00.7556278Z" } }, { @@ -18503,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": [ { @@ -18540,7 +18572,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18552,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": [ { @@ -18678,7 +18641,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -18688,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==" } } } @@ -18720,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": [ { @@ -18787,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" @@ -18804,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", @@ -18812,7 +18803,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } }, @@ -18847,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" @@ -18864,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", @@ -18872,7 +18872,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -18901,7 +18901,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -18913,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": [ { @@ -19014,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" @@ -19074,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" @@ -19139,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, @@ -19162,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": [ { @@ -19232,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": [ { @@ -19313,7 +19444,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -19325,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" } } } @@ -19367,7 +19506,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -19375,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": [ { @@ -19412,7 +19591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { @@ -19422,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=" } } } @@ -19458,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": [ @@ -19510,7 +19712,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -19527,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=" } } } @@ -19564,7 +19765,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-2184b3e6c2c3\"" } }, { @@ -19572,7 +19773,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 5 } }, { @@ -19583,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" } }, { @@ -19604,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": [ { @@ -19640,7 +19834,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -19650,6 +19844,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7351568Z" + } } ], "allow_headers": [], @@ -19657,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" } } } @@ -19690,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": [ @@ -19732,7 +19972,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -19747,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" } } } @@ -19780,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": [ { @@ -19836,6 +20075,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-100" + } } ], "allow_headers": [], @@ -19860,14 +20107,9 @@ "body": { "encoding": "base64", "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - }, - "truncate_body_after": 15 + } } - } - ] - }, - { - "alternatives": [ + }, { "request": [ { @@ -19893,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, @@ -19921,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" @@ -19986,7 +20333,7 @@ }, "body": { "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -20021,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" @@ -20054,12 +20393,11 @@ }, "body": { "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } - ], - "optional": true + ] } ], "expect": [ @@ -20067,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" @@ -20132,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": [ @@ -20408,7 +20562,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 401 } }, { @@ -20416,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": [ { @@ -20453,7 +20607,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -20465,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" } } } @@ -20507,7 +20661,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -20515,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": [ { @@ -20552,7 +20706,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -20564,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" } } } @@ -20604,7 +20760,7 @@ "optional": false, "rule": { "is": "equal", - "value": 304 + "value": 404 } }, { @@ -20612,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" }, @@ -20659,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": [], @@ -20758,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": [ @@ -20787,7 +20934,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -20804,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+" } } } @@ -20837,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": [ @@ -20926,7 +21026,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -20943,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=" } } } @@ -20978,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": [ @@ -21083,7 +21120,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21100,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": [ { @@ -21196,7 +21169,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21204,7 +21177,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21216,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": [ { @@ -21319,7 +21223,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21327,7 +21231,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21337,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": [ { @@ -21433,7 +21291,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21441,7 +21299,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21451,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": [ @@ -21489,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": [ { @@ -21569,7 +21403,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21577,7 +21411,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/absent.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21592,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": [ @@ -21622,7 +21702,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 503 } }, { @@ -21630,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": [ { @@ -21667,7 +21739,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21675,7 +21747,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21687,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" } } } @@ -21728,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": [ { @@ -21797,7 +21838,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21805,7 +21846,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21817,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" } } } @@ -21857,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": [ { @@ -21928,7 +21935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -21936,7 +21943,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -21946,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": [], @@ -21953,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" } } } @@ -21991,7 +22005,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-90cfcb93036b\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -21999,7 +22013,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 30 } }, { @@ -22015,7 +22029,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { @@ -22023,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": [ { @@ -22051,7 +22073,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22059,7 +22081,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -22076,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" } } } @@ -22114,7 +22136,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-494ad7275bf7\"" + "value": "\"fixture-16c44f0af72d\"" } }, { @@ -22122,7 +22144,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 42 } }, { @@ -22138,7 +22160,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "CVsDGvNMZH4SPA4MSLswrA==" } }, { @@ -22146,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": [ { @@ -22174,7 +22212,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22199,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" }, @@ -22216,7 +22256,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -22248,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": [ { @@ -22297,7 +22369,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -22305,7 +22377,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -22322,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=" } } } @@ -22360,7 +22430,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-9c5ca12bcfc9\"" } }, { @@ -22368,7 +22438,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -22380,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": [ @@ -22428,7 +22498,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { @@ -22445,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", @@ -22483,7 +22553,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-39ee25525bc6\"" } }, { @@ -22491,7 +22561,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 } }, { @@ -22507,7 +22577,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -22515,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": [ @@ -22551,7 +22621,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { @@ -22568,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", @@ -22606,7 +22675,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-be8efdb79010\"" } }, { @@ -22614,7 +22683,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -22625,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": [ @@ -22674,7 +22735,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -22691,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", @@ -22729,7 +22792,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-9abbc5e374ca\"" } }, { @@ -22737,7 +22800,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 1 } }, { @@ -22753,7 +22816,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -22761,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": [ @@ -22797,7 +22871,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/read/absent.txt" } }, { @@ -22812,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", @@ -22844,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": [ { @@ -22920,7 +22969,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -22930,6 +22979,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.2318906Z" + } } ], "allow_headers": [], @@ -22937,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", @@ -22975,7 +23030,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-5769a0807b46\"" } }, { @@ -22983,7 +23038,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 2 } }, { @@ -22999,7 +23054,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "ZlTHNMyrj0QP8IJetEPcfw==" } }, { @@ -23007,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": [ { @@ -23043,7 +23099,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -23053,6 +23109,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.7351568Z" + } } ], "allow_headers": [], @@ -23060,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", @@ -23098,7 +23159,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-e3698635ab53\"" } }, { @@ -23106,7 +23167,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 3 } }, { @@ -23122,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": [ @@ -23166,7 +23230,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -23183,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", @@ -23221,7 +23285,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-90cfcb93036b\"" } }, { @@ -23229,7 +23293,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 } }, { @@ -23245,7 +23309,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -23253,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": [ @@ -23289,7 +23353,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -23306,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", @@ -23347,7 +23408,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-16c44f0af72d\"" + "value": "\"fixture-494ad7275bf7\"" } }, { @@ -23355,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 } }, { @@ -23379,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" }, @@ -23450,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": "" } } } @@ -23484,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": [ @@ -23536,7 +23599,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -23553,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" @@ -23561,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": "" } } } @@ -23589,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": [ @@ -23637,7 +23722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -23662,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", @@ -23689,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": [ @@ -23729,7 +23845,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -23754,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", @@ -23814,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": [ { @@ -23848,7 +23960,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -23856,7 +23968,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -23866,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": [], @@ -23897,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": "" } } } @@ -23919,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": [ { @@ -23953,7 +24083,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -23961,7 +24091,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -23971,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": "" } } } @@ -24023,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": [ { @@ -24069,7 +24206,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -24077,7 +24214,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -24087,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": "" } } } @@ -24140,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": [ { @@ -24174,7 +24329,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "HEAD" } }, { @@ -24182,7 +24337,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/archive/object.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -24192,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": "" } } } @@ -24245,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": [ { @@ -24277,7 +24452,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24285,7 +24460,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -24295,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": [], @@ -24326,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": "" + } } } ] @@ -24353,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": [ { @@ -24402,7 +24575,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24410,7 +24583,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -24420,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": "" } } } @@ -24480,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": [ { @@ -24528,7 +24726,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24536,7 +24734,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -24548,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" } } } @@ -24613,7 +24786,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -24621,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": [ { @@ -24649,7 +24822,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -24657,7 +24830,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -24667,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" } } } @@ -24719,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": [ { @@ -24772,7 +24928,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -24780,7 +24936,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -24792,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" } } ], @@ -24829,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" + } } } ] @@ -24856,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": [ { @@ -25031,7 +25158,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25039,7 +25166,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25050,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" + } } } ] @@ -25111,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": [ { @@ -25203,7 +25276,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25211,7 +25284,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25223,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" + } } } ] @@ -25275,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": [ { @@ -25327,7 +25399,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25335,7 +25407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25346,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" } } ], @@ -25376,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" + } } } ] @@ -25411,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": [ { @@ -25443,7 +25492,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -25451,7 +25500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -25462,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" } } ], @@ -25492,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" + } } } ] @@ -25519,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": [ { @@ -26039,7 +25590,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -26047,7 +25598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -26057,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": [], @@ -26088,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": "" + } } } ] @@ -26123,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": "" + } } } ] @@ -26243,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": [ { @@ -26410,7 +25809,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26418,7 +25817,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26429,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" } } ], @@ -26467,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" + } } } ] @@ -26494,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": [ { @@ -26604,7 +25914,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26612,7 +25922,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26623,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": [ { @@ -26684,7 +26030,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26692,7 +26038,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26703,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": [ { @@ -26765,7 +26135,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -26773,7 +26143,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/archive/object.txt" } }, { @@ -26784,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": [ { @@ -26886,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": [ { @@ -26971,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": [ { @@ -27052,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": [ @@ -27095,7 +26574,7 @@ "optional": false, "rule": { "is": "equal", - "value": 500 + "value": 400 } }, { @@ -27103,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": [ { @@ -27169,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" + } } } ] @@ -27212,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": [ { @@ -27371,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": "/" } } ], @@ -27389,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" } @@ -27411,7 +26821,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact" + "value": "object-tests/board/a.txt" } }, { @@ -27419,7 +26829,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 8 } }, { @@ -27427,7 +26837,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-aad9350ee314" + "value": "fixture-704c5ddfc8cb" } }, { @@ -27446,7 +26856,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9097158Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { @@ -27462,7 +26872,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -27470,7 +26880,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact/child" + "value": "object-tests/board/z.txt" } }, { @@ -27478,7 +26888,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 2 } }, { @@ -27486,7 +26896,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bc7e3365fd2c" + "value": "fixture-b905747bf74f" } }, { @@ -27505,7 +26915,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1462797Z" + "value": "2024-01-01T00:00:00.3834597Z" } }, { @@ -27521,7 +26931,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -27532,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 } }, { @@ -27552,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": [ { @@ -27613,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": "-" } } ], @@ -27631,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" } @@ -27653,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" } }, { @@ -27669,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" } }, { @@ -27688,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-" } }, { @@ -27720,7 +27128,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -27735,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": [ { @@ -27797,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" } } ] @@ -27835,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": [ { @@ -27960,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": "" } } ], @@ -27984,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" } @@ -28007,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": [ { @@ -28236,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/" } } ], @@ -28270,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" } @@ -28292,7 +27484,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/z.txt" + "value": "object-tests/names/100%-￾-name.txt" } }, { @@ -28300,7 +27492,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -28308,7 +27500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-b905747bf74f" + "value": "fixture-b0016e7eea41" } }, { @@ -28327,7 +27519,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3834597Z" + "value": "2024-01-01T00:00:00.6773769Z" } }, { @@ -28343,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", @@ -28722,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", @@ -28741,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", @@ -28757,7 +27590,7 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28765,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", @@ -28781,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", @@ -28800,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", @@ -28816,7 +27649,7 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28824,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", @@ -28840,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", @@ -28859,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", @@ -28875,7 +27708,7 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/3/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28883,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", @@ -28899,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", @@ -28918,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", @@ -28934,7 +27767,7 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -28942,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", @@ -28958,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", @@ -28977,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", @@ -28993,7 +27826,7 @@ } }, { - "at": "/value/entries/4/content_md5_base64", + "at": "/value/entries/5/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -29001,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", @@ -29017,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", @@ -29036,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", @@ -29052,7 +27885,7 @@ } }, { - "at": "/value/entries/5/content_md5_base64", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -29060,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", @@ -29076,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", @@ -29095,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", @@ -29111,7 +27944,7 @@ } }, { - "at": "/value/entries/6/content_md5_base64", + "at": "/value/entries/7/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -29123,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" } @@ -29255,7 +28208,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/A" + "value": "object-tests/board/a.txt" } }, { @@ -29263,7 +28216,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 8 } }, { @@ -29271,7 +28224,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-b1567b296bf4" + "value": "fixture-704c5ddfc8cb" } }, { @@ -29290,7 +28243,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6802950Z" + "value": "2024-01-01T00:00:00.9908400Z" } }, { @@ -29306,7 +28259,7 @@ "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -29314,7 +28267,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a" + "value": "object-tests/board/nested/c.txt" } }, { @@ -29330,7 +28283,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-522bf336fec0" + "value": "fixture-48ff0e151ab7" } }, { @@ -29349,7 +28302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6196984Z" + "value": "2024-01-01T00:00:00.7881326Z" } }, { @@ -29365,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", @@ -29463,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", @@ -29479,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": [ { @@ -29808,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": [ @@ -29851,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": [ { @@ -29930,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": "/" } } ], @@ -29948,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" } @@ -29970,7 +29181,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/exact" } }, { @@ -29978,7 +29189,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -29986,7 +29197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "fixture-aad9350ee314" } }, { @@ -30005,7 +29216,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" + "value": "2024-01-01T00:00:00.9097158Z" } }, { @@ -30021,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/" } }, { @@ -30155,7 +29256,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -30170,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": [ { @@ -30231,7 +29332,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/boa" + "value": "object-tests/exact" } } ], @@ -30249,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" } @@ -30271,7 +29372,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/exact" } }, { @@ -30279,7 +29380,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -30287,7 +29388,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-704c5ddfc8cb" + "value": "fixture-aad9350ee314" } }, { @@ -30306,7 +29407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.9908400Z" + "value": "2024-01-01T00:00:00.9097158Z" } }, { @@ -30322,7 +29423,7 @@ "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -30330,7 +29431,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested/c.txt" + "value": "object-tests/exact/child" } }, { @@ -30346,7 +29447,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-48ff0e151ab7" + "value": "fixture-bc7e3365fd2c" } }, { @@ -30365,7 +29466,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7881326Z" + "value": "2024-01-01T00:00:00.1462797Z" } }, { @@ -30381,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==" } }, { @@ -30448,7 +29490,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 2 } }, { @@ -30471,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": [ { @@ -30533,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/" } } ], @@ -30559,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" } @@ -30581,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" } }, { @@ -30597,7 +29630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-99f23038e5ea" + "value": "fixture-bdb8a3090de6" } }, { @@ -30616,7 +29649,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1857029Z" + "value": "2024-01-01T00:00:00.1683367Z" } }, { @@ -30635,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": [ { @@ -30815,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" + } } } ] @@ -30847,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", @@ -30985,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", @@ -31004,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", @@ -31020,7 +30019,7 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -31028,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", @@ -31044,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", @@ -31063,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", @@ -31079,7 +30078,7 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -31087,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", @@ -31181,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", @@ -31197,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==" } }, { @@ -31209,7 +30312,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 6 + "value": 1 } }, { @@ -31232,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": [ { @@ -31293,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" } } ], @@ -31317,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": [ { @@ -31427,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" } } ], @@ -31452,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" } @@ -31475,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": [ { @@ -31626,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": "/" } } ], @@ -31652,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" } @@ -31674,7 +30671,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/A" } }, { @@ -31682,7 +30679,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31690,7 +30687,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "fixture-b1567b296bf4" } }, { @@ -31709,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 } }, { @@ -31728,7 +30722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31736,7 +30730,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a" } }, { @@ -31744,7 +30738,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31752,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", @@ -31774,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 } }, { @@ -31790,7 +30781,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31798,7 +30789,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a-b" } }, { @@ -31806,7 +30797,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31814,7 +30805,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7adbbe4768f3" + "value": "fixture-ffd1d6ff8b0f" } }, { @@ -31833,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 } }, { @@ -31852,7 +30840,7 @@ "optional": false, "rule": { "is": "equal", - "value": "+XxdKZQb+xsv2rCHSQargg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -31860,7 +30848,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/order/a.txt" } }, { @@ -31868,7 +30856,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { @@ -31876,7 +30864,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-222f410e528f" + "value": "fixture-1b029c6aa2e9" } }, { @@ -31895,7 +30883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6268993Z" + "value": "2024-01-01T00:00:00.2739144Z" } }, { @@ -31911,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", @@ -32093,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", @@ -32147,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", @@ -32163,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==" } }, { @@ -32175,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/" } }, { @@ -32183,7 +31100,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 1 } }, { @@ -32198,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": [ { @@ -32259,7 +31176,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/multipart/staged.bin" + "value": "object-tests/order/" } } ], @@ -32277,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" } @@ -32295,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": [ { @@ -32380,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" } } ] @@ -32413,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": [ { @@ -32500,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/" } } ], @@ -32526,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" } @@ -32548,7 +31931,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/a.txt" } }, { @@ -32556,7 +31939,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 8 } }, { @@ -32564,7 +31947,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-3b1602b981e9" + "value": "fixture-704c5ddfc8cb" } }, { @@ -32583,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 } }, { @@ -32602,7 +31982,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ASCk+RlqX5659SPzH5FNpw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -32610,7 +31990,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/nested/c.txt" } }, { @@ -32618,7 +31998,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -32626,7 +32006,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-629d3a175535" + "value": "fixture-48ff0e151ab7" } }, { @@ -32645,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 } }, { @@ -32664,7 +32041,7 @@ "optional": false, "rule": { "is": "equal", - "value": "4cgEiIU9hqudbez+MNiTDw==" + "value": "SooI8J03tzeVZJA4QItfMw==" } }, { @@ -32672,7 +32049,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/deleted.txt" + "value": "object-tests/board/z.txt" } }, { @@ -32688,7 +32065,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-4de1996d2b4b" + "value": "fixture-b905747bf74f" } }, { @@ -32707,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 } }, { @@ -32726,7 +32100,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ip/X39qAKSH9xAefmlKM6A==" + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -32757,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": [ { @@ -32821,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" } } ], @@ -32847,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" } @@ -32869,7 +32232,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/object.txt" + "value": "object-tests/board/a.txt" } }, { @@ -32877,7 +32240,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 8 } }, { @@ -32885,7 +32248,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-9dc9ff8bf513" + "value": "fixture-704c5ddfc8cb" } }, { @@ -32904,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 } }, { @@ -32923,7 +32283,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZlTHNMyrj0QP8IJetEPcfw==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { @@ -32931,7 +32291,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtydohr2/object.txt" + "value": "object-tests/board/nested/c.txt" } }, { @@ -32939,7 +32299,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -32947,7 +32307,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-9e3bb87be41c" + "value": "fixture-48ff0e151ab7" } }, { @@ -32966,7 +32326,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3326281Z" + "value": "2024-01-01T00:00:00.7881326Z" } }, { @@ -32982,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==" } }, { @@ -32990,7 +32409,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 + "value": 3 } }, { @@ -33013,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": [ { @@ -33074,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": "/" } } ], @@ -33092,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" } @@ -33114,7 +32542,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/committed.bin" + "value": "object-tests/separators/..leading" } }, { @@ -33122,7 +32550,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -33130,7 +32558,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-879f71a2d23b" + "value": "fixture-99f23038e5ea" } }, { @@ -33149,7 +32577,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.2802899Z" + "value": "2024-01-01T00:00:00.1857029Z" } }, { @@ -33165,7 +32593,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -33173,7 +32601,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/crc64.txt" + "value": "object-tests/separators/dot" } }, { @@ -33181,7 +32609,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -33189,7 +32617,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-c55cf5f18aae" + "value": "fixture-ccbcb2d75585" } }, { @@ -33208,7 +32636,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "value": "2024-01-01T00:00:00.2106231Z" } }, { @@ -33224,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/" } }, { @@ -33307,7 +32700,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 4 } }, { @@ -33322,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": [ { @@ -33344,7 +32736,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -33352,7 +32744,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture" } }, { @@ -33360,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" } } ] @@ -33400,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": [ { @@ -34196,7 +33217,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34204,7 +33225,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture" } }, { @@ -34212,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" } } ] @@ -34260,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": [ { @@ -34301,7 +33352,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34309,7 +33360,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture" } }, { @@ -34317,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" } } ] @@ -34365,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": [ { @@ -34406,7 +33547,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34414,7 +33555,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture" } }, { @@ -34422,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" } } ] @@ -34470,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": [ { @@ -34715,7 +33927,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34723,7 +33935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34735,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" } } ] @@ -34774,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": [ { @@ -34810,7 +34180,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34818,7 +34188,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34830,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" } } ] @@ -34877,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": [ { @@ -34911,7 +34304,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -34919,7 +34312,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -34931,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" } } } @@ -34974,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": [ { @@ -35012,7 +34421,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35020,7 +34429,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35032,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" } } ] @@ -35074,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": [ { @@ -35120,7 +34742,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35128,7 +34750,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35140,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" } } ] @@ -35182,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": [ { @@ -35228,7 +34995,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -35236,7 +35003,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture" } }, { @@ -35248,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" } } ] @@ -35290,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": [ { @@ -35344,7 +35313,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object.txt" } }, { @@ -35352,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" } } } @@ -35391,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": [ { @@ -35437,7 +35426,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" } }, { @@ -35445,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" } } } @@ -35492,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": [ { @@ -35537,7 +35535,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/write/empty.bin" } }, { @@ -35549,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": "" } } } @@ -35588,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": [ { @@ -35630,7 +35640,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -35638,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": "" } } } @@ -35681,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. Azure reads the source by URL as the caller, or with the 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": [ { @@ -35723,7 +35745,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -35731,49 +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" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "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": "" } } } @@ -35790,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": [ { @@ -35832,7 +35850,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -35840,48 +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" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "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": "" } } } @@ -35894,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-sync-other-account", + "id": "operations/azure/put-created-key-percent", "profile": "azure", "lane": "core", - "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", + "purpose": "put created, with the key \"percent%20.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_account_url": "https://fixtureother.blob.core.windows.net", - "source_key": "object-tests/copy/source.txt", - "sync": true + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/percent%20.txt", + "op": "put" }, "exchanges": [ { @@ -35949,7 +35955,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -35957,49 +35963,38 @@ "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/x-ms-copy-source", - "optional": false, - "rule": { - "is": "matches", - "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/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" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "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": "" } } } @@ -36016,30 +36011,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-pending", + "id": "operations/azure/put-created-key-plus", "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 \"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" ], - "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/plus+plus.txt", + "op": "put" }, "exchanges": [ { @@ -36059,7 +36060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -36067,33 +36068,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": "" } } } @@ -36110,37 +36116,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-space", "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 \"space name.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/space name.txt", + "op": "put" }, "exchanges": [ { @@ -36160,7 +36165,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -36168,41 +36173,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": "" } } } @@ -36219,55 +36221,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/copy-other-account", + "id": "operations/azure/put-created-key-non-ascii", "profile": "azure", "lane": "core", - "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", + "purpose": "put created, with the key \"café/雪.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": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_account_url": "https://fixtureother.blob.core.windows.net", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/café/雪.txt", + "op": "put" }, "exchanges": [ { @@ -36287,7 +36270,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -36295,40 +36278,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://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 [^ ]+" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 401, + "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": "" } } } @@ -36341,40 +36322,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 401 + "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/put-from-url", + "id": "operations/azure/put-created-key-double-slash", "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 \"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/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/double//slash.txt", + "op": "put" }, "exchanges": [ { @@ -36394,7 +36375,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -36402,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/source\\.txt" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -36420,32 +36393,28 @@ "is": "equal", "value": "BlockBlob" } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" - } } ], "allow_headers": [ - "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": "" } } } @@ -36466,26 +36435,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-trailing-slash", "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 \"trailing-slash/\"", "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/trailing-slash/", + "op": "put" }, "exchanges": [ { @@ -36505,7 +36480,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -36513,15 +36488,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==" } }, { @@ -36531,48 +36498,28 @@ "is": "equal", "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-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": "" } } } @@ -36593,23 +36540,31 @@ "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/copy-missing-source", "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": "Refuse a copy whose source does not exist", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", + "op": "copy", "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ @@ -36648,27 +36603,9 @@ "is": "matches", "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.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": [ - "x-ms-copy-source-blob-properties" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 404, @@ -36677,11 +36614,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "data": "BlobNotFoundFixture error" } } } @@ -36710,24 +36647,23 @@ "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure/put-from-url-other-account", + "id": "operations/azure/copy", "profile": "azure", "lane": "core", - "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", + "purpose": "Copy an object to another key in the same container", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_account_url": "https://fixtureother.blob.core.windows.net", + "op": "copy", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -36764,39 +36700,22 @@ "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": "BlockBlob" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } } ], - "allow_headers": [ - "x-ms-copy-source-blob-properties" - ], + "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" @@ -36816,30 +36735,31 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/abort-copy", + "id": "operations/azure/copy-replace-metadata", "profile": "azure", "lane": "core", - "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", + "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/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], - "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" + "metadata": { + "colour": "blue" + }, + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36871,38 +36791,34 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "copy" - } - }, - { - "at": "/query/copyid", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "fixture-copy-id" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-meta-colour", "optional": false, "rule": { "is": "equal", - "value": "abort" + "value": "blue" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "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" @@ -36920,22 +36836,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/abort-copy-finished", + "id": "operations/azure/copy-source-if-match", "profile": "azure", "lane": "core", - "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", + "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/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_if_match": "\"fixture-etag\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -36967,44 +36892,37 @@ } }, { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "copy" - } - }, - { - "at": "/query/copyid", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "fixture-copy-id" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-copy-action", + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "abort" + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "NoPendingCopyOperation" + "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": "NoPendingCopyOperationFixture error" + "encoding": "empty" } } } @@ -37017,39 +36935,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "NoPendingCopyOperation" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/get-page-ranges", + "id": "operations/azure/copy-source-if-match-failed", "profile": "azure", "lane": "core", - "purpose": "List the written ranges of a page blob", + "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/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_if_match": "\"fixture-0123456789ab\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37061,7 +36973,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -37069,7 +36981,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37081,32 +36993,37 @@ } }, { - "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-match", "optional": false, "rule": { "is": "equal", - "value": "pagelist" + "value": "\"fixture-0123456789ab\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "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-blob-content-length": "1024" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { "encoding": "utf8", - "data": "0511" - }, - "framing": "chunked" + "data": "SourceConditionNotMetFixture error" + } } } ] @@ -37118,38 +37035,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/ranges", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [ - { - "end": 512, - "start": 0 - } - ] + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages-unaligned", + "id": "operations/azure/copy-source-if-unmodified-since-failed", "profile": "azure", "lane": "core", - "purpose": "Refuse a page write that does not start on a 512-byte boundary", + "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/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", + "op": "copy", + "source_if_unmodified_since": "Mon, 01 Jan 2024 00:00:00 GMT", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37169,7 +37089,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37177,48 +37097,40 @@ "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-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-512" + "value": "Mon, 01 Jan 2024 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": "InvalidHeaderValue" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "SourceConditionNotMetFixture error" } } } @@ -37239,7 +37151,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -37247,25 +37159,25 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages", + "id": "operations/azure/copy-if-none-match-exists", "profile": "azure", "lane": "core", - "purpose": "Write the first page of a page blob", + "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/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" + "if_none_match": "*", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37285,7 +37197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37293,49 +37205,40 @@ "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/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-511" + "value": "*" } } ], "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-blob-sequence-number": "0", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "BlobAlreadyExistsFixture error" } } } @@ -37348,29 +37251,41 @@ "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": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure/upload-pages-from-url", + "id": "operations/azure/copy-across-containers", "profile": "azure", "lane": "core", - "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", + "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/put-page-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "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 - } + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_container": "source", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -37390,7 +37305,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37401,67 +37316,27 @@ "value": "" } }, - { - "at": "/query/comp", - "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" - } - }, { "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 [^ ]+" + "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-sequence-number": "0", - "x-ms-request-server-encrypted": "true" + "x-ms-copy-id": "fixture-copy-id", + "x-ms-copy-status": "success" }, "body": { "encoding": "empty" @@ -37479,28 +37354,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/upload-pages-from-url-other-account", + "id": "operations/azure/copy-tier", "profile": "azure", "lane": "core", - "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", + "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-page-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "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 - } + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "tier": "Cool" }, "exchanges": [ { @@ -37520,7 +37398,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37532,66 +37410,126 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "page" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-page-write", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "update" + "value": "Cool" } + } + ], + "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/copy-source-key-encoded", + "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 /", + "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/a b+c%é?#.txt" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ { - "at": "/headers/x-ms-range", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-511" + "value": "PUT" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/path", "optional": false, "rule": { - "is": "matches", - "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/pages/source\\.bin" + "is": "equal", + "value": "/fixture/object-tests/copy/target.txt" } }, { - "at": "/headers/x-ms-source-range", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-511" + "value": "" } }, { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, + "at": "/headers/x-ms-copy-source", + "optional": false, "rule": { "is": "matches", - "pattern": "Bearer [^ ]+" + "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": 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" @@ -37609,22 +37547,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-version", "profile": "azure", "lane": "core", - "purpose": "Create a page blob of 1,024 bytes", + "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/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_key": "object-tests/copy/source.txt", + "source_version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -37644,7 +37591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37656,33 +37603,26 @@ } }, { - "at": "/headers/x-ms-blob-type", - "optional": false, - "rule": { - "is": "equal", - "value": "PageBlob" - } - }, - { - "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\\?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" @@ -37700,22 +37640,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/copy_status", + "optional": false, + "rule": { + "is": "equal", + "value": "success" + } } ], "refusal": null }, { - "id": "operations/azure/append-block-to-block-blob", + "id": "operations/azure/copy-sync", "profile": "azure", "lane": "core", - "purpose": "Refuse an append to a block blob", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -37735,7 +37684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37743,32 +37692,49 @@ "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-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobType" + "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": "InvalidBlobTypeFixture error" + "encoding": "empty" } } } @@ -37781,41 +37747,33 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobType" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure/append-block-at-wrong-position", + "id": "operations/azure/copy-sync-missing-source", "profile": "azure", "lane": "core", - "purpose": "Refuse an append whose position condition does not match the blob length", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "append_position": 0, - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/absent.txt", + "sync": true }, "exchanges": [ { @@ -37835,7 +37793,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37843,40 +37801,48 @@ "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/absent\\.txt" } }, { - "at": "/headers/x-ms-blob-condition-appendpos", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "0" + "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": "AppendPositionConditionNotMet" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "AppendPositionConditionNotMetFixture error" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -37897,7 +37863,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -37905,24 +37871,26 @@ "optional": false, "rule": { "is": "equal", - "value": "AppendPositionConditionNotMet" + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/append-block", + "id": "operations/azure/copy-sync-other-account", "profile": "azure", "lane": "core", - "purpose": "Append a block to an append blob and report its offset", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "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": [ { @@ -37942,7 +37910,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -37950,31 +37918,46 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "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-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "true" + } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "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" @@ -37994,35 +37977,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/append-block-from-url", + "id": "operations/azure/copy-pending", "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure/copy", "call": { - "key": "object-tests/append/object.log", - "op": "azure.append_block_from_url", + "key": "object-tests/copy/target.txt", + "op": "copy", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -38043,7 +38020,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38054,14 +38031,6 @@ "value": "" } }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "appendblock" - } - }, { "at": "/headers/x-ms-copy-source", "optional": false, @@ -38069,29 +38038,20 @@ "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": 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": "pending" }, "body": { "encoding": "empty" @@ -38111,40 +38071,37 @@ } }, { - "at": "/value/append_offset", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 5 + "value": "pending" } }, { - "at": "/value/committed_block_count", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure/append-block-from-url-range", + "id": "operations/azure/copy-content-properties", "profile": "azure", "lane": "core", - "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "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 - } + "content_type": "text/plain", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38164,7 +38121,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38175,14 +38132,6 @@ "value": "" } }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "appendblock" - } - }, { "at": "/headers/x-ms-copy-source", "optional": false, @@ -38192,35 +38141,26 @@ } }, { - "at": "/headers/x-ms-source-range", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-3" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "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-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" @@ -38240,35 +38180,53 @@ } }, { - "at": "/value/append_offset", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 5 + "value": "success" + } + } + ], + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" } }, { - "at": "/value/committed_block_count", + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "content_type" } } ], - "refusal": null + "decline_permitted": true }, { - "id": "operations/azure/append-block-from-url-other-account", + "id": "operations/azure/copy-other-account", "profile": "azure", "lane": "core", - "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { - "key": "object-tests/append/object.log", - "op": "azure.append_block_from_url", + "key": "object-tests/copy/target.txt", + "op": "copy", "source_account_url": "https://fixtureother.blob.core.windows.net", "source_key": "object-tests/copy/source.txt" }, @@ -38290,7 +38248,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38301,14 +38259,6 @@ "value": "" } }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "appendblock" - } - }, { "at": "/headers/x-ms-copy-source", "optional": false, @@ -38329,19 +38279,17 @@ "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-blob-append-offset": "5", - "x-ms-blob-committed-block-count": "2", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -38354,39 +38302,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/append_offset", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 401 } }, { - "at": "/value/committed_block_count", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure/create-append", + "id": "operations/azure/put-from-url", "profile": "azure", "lane": "core", - "purpose": "Create an empty append blob", + "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": { - "key": "object-tests/append/object.log", - "op": "azure.create_append" + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -38406,7 +38355,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38417,16 +38366,34 @@ "value": "" } }, + { + "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": "AppendBlob" + "value": "BlockBlob" } - } + }, + { + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, + "rule": { + "is": "matches", + "pattern": "Bearer [^ ]+" + } + } + ], + "allow_headers": [ + "x-ms-copy-source-blob-properties" ], - "allow_headers": [], "allow_query": [], "response": { "status": 201, @@ -38454,23 +38421,32 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-etag\"" + } } ], "refusal": null }, { - "id": "operations/azure/put-leased-if-match-without-lease-id", + "id": "operations/azure/put-from-url-content-properties", "profile": "azure", "lane": "core", - "purpose": "Refuse a write to a leased object whose If-Match holds but that names no lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "if_match": "\"fixture-etag\"", - "key": "object-tests/leases/object.txt", - "op": "put" + "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": [ { @@ -38490,7 +38466,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38498,7 +38474,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { @@ -38510,28 +38494,46 @@ } }, { - "at": "/headers/if-match", + "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": "\"fixture-etag\"" + "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": 412, + "status": 201, "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-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "encoding": "empty" } } } @@ -38544,41 +38546,32 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/put-leased-with-lease-id", + "id": "operations/azure/put-from-url-missing-source", "profile": "azure", "lane": "core", - "purpose": "Write to a leased object with its lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "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": "azure.put_from_url", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -38598,7 +38591,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38606,7 +38599,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } }, { @@ -38618,28 +38619,30 @@ } }, { - "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_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -38652,24 +38655,41 @@ "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/put-leased-without-lease-id", + "id": "operations/azure/put-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Refuse a write to a leased object that names no lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "op": "put" + "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": [ { @@ -38689,7 +38709,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38697,7 +38717,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" + } + }, + { + "at": "/headers/x-ms-copy-source", + "optional": false, + "rule": { + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { @@ -38707,22 +38735,32 @@ "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": 412, + "status": 201, "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-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "encoding": "empty" } } } @@ -38735,41 +38773,34 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 412 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure/lease-break", + "id": "operations/azure/abort-copy", "profile": "azure", "lane": "core", - "purpose": "Break a lease at once", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure/abort-copy-finished", "call": { - "action": "break", - "break_period": 0, - "key": "object-tests/leases/object.txt", - "op": "azure.lease" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -38789,7 +38820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38805,37 +38836,34 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" + "value": "copy" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "break" + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-lease-break-period", + "at": "/headers/x-ms-copy-action", "optional": false, "rule": { "is": "equal", - "value": "0" + "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-lease-time": "0" + } }, "body": { "encoding": "empty" @@ -38858,18 +38886,17 @@ "refusal": null }, { - "id": "operations/azure/lease-release", + "id": "operations/azure/abort-copy-finished", "profile": "azure", "lane": "core", - "purpose": "Release a lease", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], "call": { - "action": "release", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "azure.lease" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -38889,7 +38916,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -38905,39 +38932,40 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" + "value": "copy" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/query/copyid", "optional": false, "rule": { "is": "equal", - "value": "release" + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-lease-id", + "at": "/headers/x-ms-copy-action", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "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-error-code": "NoPendingCopyOperation" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "NoPendingCopyOperationFixture error" } } } @@ -38950,26 +38978,39 @@ "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": "NoPendingCopyOperation" } } ], "refusal": null }, { - "id": "operations/azure/lease-acquire-leased", + "id": "operations/azure/get-page-ranges", "profile": "azure", "lane": "core", - "purpose": "Refuse a second lease while another lease holds the object", + "purpose": "List the written ranges of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" ], "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/pages/object.vhd", + "op": "azure.get_page_ranges" }, "exchanges": [ { @@ -38981,7 +39022,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -38989,7 +39030,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39005,49 +39046,28 @@ "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", - "optional": false, - "rule": { - "is": "equal", - "value": "66666666-7777-8888-9999-000000000000" + "value": "pagelist" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 200, "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-blob-content-length": "1024" }, "body": { "encoding": "utf8", - "data": "LeaseAlreadyPresentFixture error" - } + "data": "0511" + }, + "framing": "chunked" } } ] @@ -39059,42 +39079,38 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/ranges", "optional": false, "rule": { "is": "equal", - "value": "LeaseAlreadyPresent" + "value": [ + { + "end": 512, + "start": 0 + } + ] } } ], "refusal": null }, { - "id": "operations/azure/lease-acquire", + "id": "operations/azure/upload-pages-unaligned", "profile": "azure", "lane": "core", - "purpose": "Acquire a lease on an object with a proposed lease ID", + "purpose": "Refuse a page write that does not start on a 512-byte boundary", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "action": "acquire", - "duration": 15, - "key": "object-tests/leases/object.txt", - "op": "azure.lease", - "proposed_lease_id": "11111111-2222-3333-4444-555555555555" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 1, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -39114,7 +39130,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39122,7 +39138,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { @@ -39130,48 +39146,40 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "acquire" + "value": "page" } }, { - "at": "/headers/x-ms-lease-duration", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "15" + "value": "update" } }, { - "at": "/headers/x-ms-proposed-lease-id", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "bytes=1-512" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "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-lease-id": "11111111-2222-3333-4444-555555555555" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -39184,35 +39192,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/lease_id", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/put-with-tags", + "id": "operations/azure/upload-pages", "profile": "azure", "lane": "core", - "purpose": "Write an object with tags", + "purpose": "Write the first page of a page blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": { - "project": "object-tests" - } + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -39232,7 +39246,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39240,23 +39254,31 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "page" } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "project=object-tests" + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" } } ], @@ -39270,6 +39292,7 @@ }, "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": { @@ -39293,19 +39316,21 @@ "refusal": null }, { - "id": "operations/azure/put-with-tags-special-characters", + "id": "operations/azure/upload-pages-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 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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-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/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": [ @@ -39326,7 +39351,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39334,26 +39359,55 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "page" } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-page-write", "optional": false, "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": "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 [^ ]+" } } ], @@ -39367,6 +39421,7 @@ }, "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": { @@ -39390,27 +39445,23 @@ "refusal": null }, { - "id": "operations/azure/put-with-tags-duplicate-key", + "id": "operations/azure/upload-pages-from-url-other-account", "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 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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page-from-url" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "tags": [ - { - "key": "project", - "value": "a" - }, - { - "key": "project", - "value": "b" - } - ] + "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": [ { @@ -39430,7 +39481,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39438,40 +39489,73 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "page" } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "project=a&project=b" + "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": "DuplicateTagNames" + "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": "DuplicateTagNamesFixture error" + "encoding": "empty" } } } @@ -39484,81 +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": "DuplicateTagNames" - } - } - ], - "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" + "value": "ok" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/get-tags", + "id": "operations/azure/create-page", "profile": "azure", "lane": "core", - "purpose": "Read the tags of an object", + "purpose": "Create a page blob of 1,024 bytes", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "key": "object-tests/pages/object.vhd", + "op": "azure.create_page", + "size": 1024 }, "exchanges": [ { @@ -39570,7 +39597,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -39578,7 +39605,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -39590,27 +39617,36 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "PageBlob" + } + }, + { + "at": "/headers/x-ms-blob-content-length", + "optional": false, + "rule": { + "is": "equal", + "value": "1024" } } ], "allow_headers": [], "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": "projectobject-tests" + "encoding": "empty" } } } @@ -39625,31 +39661,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/tags", - "optional": false, - "rule": { - "is": "equal", - "value": { - "project": "object-tests" - } - } } ], "refusal": null }, { - "id": "operations/azure/get-tags-none", + "id": "operations/azure/append-block-to-block-blob", "profile": "azure", "lane": "core", - "purpose": "Report no blob index tags for a blob without any, which Azure answers with an empty TagSet", + "purpose": "Refuse an append to a block blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39661,7 +39688,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -39669,7 +39696,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -39677,7 +39704,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -39685,23 +39712,24 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "InvalidBlobType" }, "body": { "encoding": "utf8", - "data": "" + "data": "InvalidBlobTypeFixture error" } } } @@ -39714,32 +39742,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/tags", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": {} + "value": 409 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidBlobType" } } ], "refusal": null }, { - "id": "operations/azure/get-tags-version", + "id": "operations/azure/append-block-at-wrong-position", "profile": "azure", "lane": "core", - "purpose": "Get the blob index tags of a previous version, named by versionid in the query", + "purpose": "Refuse an append whose position condition does not match the blob length", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "version": "2024-01-01T00:00:00.0000000Z" + "append_position": 0, + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39751,7 +39788,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -39759,7 +39796,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -39767,7 +39804,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -39775,31 +39812,32 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "appendblock" } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-blob-condition-appendpos", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "AppendPositionConditionNotMet" }, "body": { "encoding": "utf8", - "data": "projectobject-tests" + "data": "AppendPositionConditionNotMetFixture error" } } } @@ -39812,34 +39850,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/tags", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": { - "project": "object-tests" - } + "value": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "AppendPositionConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/get-tags-snapshot", + "id": "operations/azure/append-block", "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": "Append a block to an append blob and report its offset", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -39851,7 +39895,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -39859,7 +39903,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -39867,7 +39911,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -39875,31 +39919,26 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" - } - }, - { - "at": "/query/snapshot", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "appendblock" } } ], "allow_headers": [], "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-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "projectobject-tests" + "encoding": "empty" } } } @@ -39916,32 +39955,36 @@ } }, { - "at": "/value/tags", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": { - "project": "object-tests" - } + "value": 5 + } + }, + { + "at": "/value/committed_block_count", + "optional": false, + "rule": { + "is": "equal", + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure/set-tags", + "id": "operations/azure/append-block-from-url", "profile": "azure", "lane": "core", - "purpose": "Replace the tags of an object", + "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/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" - } + "key": "object-tests/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -39961,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": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -39977,29 +40020,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?://[^/]+/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": 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" @@ -40017,32 +40070,41 @@ "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-10-tags", + "id": "operations/azure/append-block-from-url-range", "profile": "azure", "lane": "core", - "purpose": "Set 10 tags, the most an object takes", + "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": { - "tag00": "value0", - "tag01": "value1", - "tag02": "value2", - "tag03": "value3", - "tag04": "value4", - "tag05": "value5", - "tag06": "value6", - "tag07": "value7", - "tag08": "value8", - "tag09": "value9" + "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": [ @@ -40063,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": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9" + "is": "equal", + "value": "" } }, { @@ -40079,29 +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": "/headers/x-ms-source-range", + "optional": false, + "rule": { + "is": "equal", + "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" @@ -40119,34 +40199,39 @@ "is": "equal", "value": "ok" } - } - ], - "refusal": null - }, - { - "id": "operations/azure/set-tags-11-tags", + }, + { + "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/append-block-from-url-other-account", "profile": "azure", "lane": "core", - "purpose": "Report 11 tags, one more than an object takes, as an error. A client may refuse them", + "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", - "tags": { - "tag00": "value0", - "tag01": "value1", - "tag02": "value2", - "tag03": "value3", - "tag04": "value4", - "tag05": "value5", - "tag06": "value6", - "tag07": "value7", - "tag08": "value8", - "tag09": "value9", - "tag10": "value10" - } + "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": [ { @@ -40166,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": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" + "is": "equal", + "value": "" } }, { @@ -40182,35 +40267,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://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": [], "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-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "encoding": "empty" } } } @@ -40223,83 +40315,39 @@ "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": "TagsTooLarge" + "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": "TagsTooLarge" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-key-128", + "id": "operations/azure/create-append", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose key has 128 characters, the longest a key may be", + "purpose": "Create an empty append blob", "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": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" - } + "key": "object-tests/append/object.log", + "op": "azure.create_append" }, "exchanges": [ { @@ -40319,45 +40367,37 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" - } - }, - { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "value": "/fixture/object-tests/append/object.log" } }, { - "at": "/query/comp", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "AppendBlob" } } ], "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" @@ -40380,19 +40420,18 @@ "refusal": null }, { - "id": "operations/azure/set-tags-key-129", + "id": "operations/azure/put-leased-if-match-without-lease-id", "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": "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-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" - } + "body_base64": "c2Vjb25k", + "if_match": "\"fixture-etag\"", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -40412,51 +40451,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" + "is": "equal", + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/if-match", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -40477,7 +40513,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -40485,67 +40521,25 @@ "optional": false, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": "LeaseIdMissing" } } ], - "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/put-leased-with-lease-id", "profile": "azure", "lane": "core", - "purpose": "Set a tag whose value has 256 characters, the longest a value may be", + "purpose": "Write to a leased object with its lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "put" }, "exchanges": [ { @@ -40565,45 +40559,45 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "is": "equal", + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-id", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "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" @@ -40626,19 +40620,17 @@ "refusal": null }, { - "id": "operations/azure/set-tags-value-257", + "id": "operations/azure/put-leased-without-lease-id", "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 a write to a leased object that names no lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" - } + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -40658,51 +40650,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" - } - }, - { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/query/comp", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "c2Vjb25k" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "BlockBlob" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "TagsTooLarge" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "TagsTooLargeFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -40723,7 +40704,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -40731,67 +40712,25 @@ "optional": false, "rule": { "is": "equal", - "value": "TagsTooLarge" + "value": "LeaseIdMissing" } } ], - "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/lease-break", "profile": "azure", "lane": "core", - "purpose": "Set a blob index tag with a space and each of + - = . _ : /, which Azure allows, escaped as XML text", + "purpose": "Break a lease at once", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "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" - } + "action": "break", + "break_period": 0, + "key": "object-tests/leases/object.txt", + "op": "azure.lease" }, "exchanges": [ { @@ -40811,15 +40750,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "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": "" } }, { @@ -40827,29 +40766,37 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "break" + } + }, + { + "at": "/headers/x-ms-lease-break-period", + "optional": false, + "rule": { + "is": "equal", + "value": "0" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 202, "headers": { "date": { "from": "now" - } + }, + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-lease-time": "0" }, "body": { "encoding": "empty" @@ -40872,19 +40819,18 @@ "refusal": null }, { - "id": "operations/azure/set-tags-invalid-character", + "id": "operations/azure/lease-release", "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": "Release a lease", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "a@b": "c" - } + "action": "release", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "azure.lease" }, "exchanges": [ { @@ -40904,15 +40850,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "a@bc" + "is": "equal", + "value": "" } }, { @@ -40920,35 +40866,39 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "release" + } + }, + { + "at": "/headers/x-ms-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 200, "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" }, "body": { - "encoding": "utf8", - "data": "InvalidTagFixture error" + "encoding": "empty" } } } @@ -40961,90 +40911,26 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidTag" + "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": "InvalidTag" - } - } - ] + "refusal": null }, { - "id": "operations/azure/set-tags-duplicate-key", + "id": "operations/azure/lease-acquire-leased", "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", + "purpose": "Refuse a second lease while another lease holds the object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": [ - { - "key": "project", - "value": "a" - }, - { - "key": "project", - "value": "b" - } - ] + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "66666666-7777-8888-9999-000000000000" }, "exchanges": [ { @@ -41064,15 +40950,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectaprojectb" + "is": "equal", + "value": "" } }, { @@ -41080,35 +40966,48 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "acquire" + } + }, + { + "at": "/headers/x-ms-lease-duration", + "optional": false, + "rule": { + "is": "equal", + "value": "15" + } + }, + { + "at": "/headers/x-ms-proposed-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "66666666-7777-8888-9999-000000000000" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidXmlDocument" + "x-ms-error-code": "LeaseAlreadyPresent" }, "body": { "encoding": "utf8", - "data": "InvalidXmlDocumentFixture error" + "data": "LeaseAlreadyPresentFixture error" } } } @@ -41129,7 +41028,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 409 } }, { @@ -41137,69 +41036,26 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidXmlDocument" - } - } - ], - "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" + "value": "LeaseAlreadyPresent" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure/set-tags-version", + "id": "operations/azure/lease-acquire", "profile": "azure", "lane": "core", - "purpose": "Set blob index tags on a previous version, named by versionid in the query", + "purpose": "Acquire a lease on an object with a proposed lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - }, - "version": "2024-01-01T00:00:00.0000000Z" + "action": "acquire", + "duration": 15, + "key": "object-tests/leases/object.txt", + "op": "azure.lease", + "proposed_lease_id": "11111111-2222-3333-4444-555555555555" }, "exchanges": [ { @@ -41219,15 +41075,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "" } }, { @@ -41235,37 +41091,45 @@ "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "lease" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "acquire" } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-lease-duration", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "15" + } + }, + { + "at": "/headers/x-ms-proposed-lease-id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "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-lease-id": "11111111-2222-3333-4444-555555555555" }, "body": { "encoding": "empty" @@ -41283,22 +41147,30 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/lease_id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" + } } ], "refusal": null }, { - "id": "operations/azure/set-tags-snapshot", + "id": "operations/azure/put-with-tags", "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": "Write an object with tags", "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": { + "body_base64": "Zmlyc3Q=", "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "snapshot": "2024-01-01T00:00:00.0000000Z", + "op": "put", "tags": { "project": "object-tests" } @@ -41325,49 +41197,41 @@ } }, { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "projectobject-tests" - } - }, - { - "at": "/query/comp", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "Zmlyc3Q=" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "BlockBlob" } }, { - "at": "/query/snapshot", + "at": "/headers/x-ms-tags", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "project=object-tests" } } ], "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" @@ -41390,18 +41254,20 @@ "refusal": null }, { - "id": "operations/azure/put-with-tier", + "id": "operations/azure/put-with-tags-special-characters", "profile": "azure", "lane": "core", - "purpose": "Write an object straight into the Cool access tier", + "purpose": "Write a blob with an index tag that holds a space and each of + - = . _ : /, percent-encoded in x-ms-tags", "sources": [ "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { "body_base64": "Zmlyc3Q=", - "key": "object-tests/tiers/object.txt", + "key": "object-tests/tags/object.txt", "op": "put", - "tier": "Cool" + "tags": { + "a b+c-d=e.f_g:h/i": "k l+m-n=o.p_q:r/s" + } }, "exchanges": [ { @@ -41421,7 +41287,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41441,11 +41307,14 @@ } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/x-ms-tags", "optional": false, "rule": { - "is": "equal", - "value": "Cool" + "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" + ] } } ], @@ -41482,17 +41351,27 @@ "refusal": null }, { - "id": "operations/azure/set-tier-unknown", + "id": "operations/azure/put-with-tags-duplicate-key", "profile": "azure", "lane": "core", - "purpose": "Refuse an access tier the service does not have", + "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/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Warm" + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tags/object.txt", + "op": "put", + "tags": [ + { + "key": "project", + "value": "a" + }, + { + "key": "project", + "value": "b" + } + ] }, "exchanges": [ { @@ -41512,7 +41391,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41520,23 +41399,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "Zmlyc3Q=" } }, { - "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-tags", "optional": false, "rule": { "is": "equal", - "value": "Warm" + "value": "project=a&project=b" } } ], @@ -41549,11 +41428,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "x-ms-error-code": "DuplicateTagNames" }, "body": { "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "data": "DuplicateTagNamesFixture error" } } } @@ -41582,24 +41461,65 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "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/set-tier-cool", + "id": "operations/azure/get-tags", "profile": "azure", "lane": "core", - "purpose": "Move an object to the Cool access tier", + "purpose": "Read the tags of an object", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Cool" + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags" }, "exchanges": [ { @@ -41611,7 +41531,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41619,7 +41539,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41635,15 +41555,7 @@ "optional": false, "rule": { "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" + "value": "tags" } } ], @@ -41652,12 +41564,14 @@ "response": { "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" } }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "projectobject-tests" } } } @@ -41672,22 +41586,31 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": { + "project": "object-tests" + } + } } ], "refusal": null }, { - "id": "operations/azure/set-tier-rehydrate", + "id": "operations/azure/get-tags-none", "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": "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/set-blob-tier" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" ], "call": { - "key": "object-tests/tiers/object.txt", - "op": "azure.set_tier", - "tier": "Hot" + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags" }, "exchanges": [ { @@ -41699,7 +41622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41707,7 +41630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41723,29 +41646,23 @@ "optional": false, "rule": { "is": "equal", - "value": "tier" - } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Hot" + "value": "tags" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" } }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "" } } } @@ -41760,24 +41677,30 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": {} + } } ], "refusal": null }, { - "id": "operations/azure/put-internal-error", + "id": "operations/azure/get-tags-version", "profile": "azure", "lane": "core", - "purpose": "Report a 500 InternalError answer as an error, after at most 5 retries", + "purpose": "Get the blob index tags of a previous version, named by versionid in the query", "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/get-blob-tags" ], - "origin": "transient", "call": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "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": [ { @@ -41789,7 +41712,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41797,7 +41720,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41805,98 +41728,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": "tags" + } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.0000000Z" } } ], - "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" + } }, "body": { "encoding": "utf8", - "data": "InternalErrorThe server encountered an internal error. Please retry the request." + "data": "projectobject-tests" } } } ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, { - "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": 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." - } - } + "at": "/value/tags", + "optional": false, + "rule": { + "is": "equal", + "value": { + "project": "object-tests" } - ], - "optional": true - }, + } + } + ], + "refusal": null + }, + { + "id": "operations/azure/get-tags-snapshot", + "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", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + ], + "call": { + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z" + }, + "exchanges": [ { "alternatives": [ { @@ -41906,7 +41812,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -41914,7 +41820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture/object-tests/tags/object.txt" } }, { @@ -41922,99 +41828,83 @@ "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": 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", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } - }, - { - "at": "/path", - "optional": false, - "rule": { - "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "" } }, { - "at": "/body_base64", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-type", + "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": 500, + "status": 200, "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." + "data": "projectobject-tests" } } } - ], - "optional": true + ] + } + ], + "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/set-tags", + "profile": "azure", + "lane": "core", + "purpose": "Replace the tags of an object", + "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": { + "project": "object-tests" + } + }, + "exchanges": [ { "alternatives": [ { @@ -42032,48 +41922,91 @@ "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/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": 500, + "status": 204, "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." + "encoding": "empty" } } } - ], - "optional": true - }, + ] + } + ], + "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": [ { @@ -42091,47 +42024,52 @@ "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": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 204, "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." + "encoding": "empty" } } } - ], - "optional": true + ] } ], "expect": [ @@ -42140,41 +42078,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 500 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InternalError" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure/put-if-unmodified-since-past", + "id": "operations/azure/set-tags-11-tags", "profile": "azure", "lane": "core", - "purpose": "Refuse a write with 412 when the object changed after If-Unmodified-Since", + "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": "MDEyMzQ1Njc4OQ==", - "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", - "key": "object-tests/write/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": [ { @@ -42194,50 +42127,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": "MDEyMzQ1Njc4OQ==" + "is": "xml", + "value": "tag00value0tag01value1tag02value2tag03value3tag04value4tag05value5tag06value6tag07value7tag08value8tag09value9tag10value10" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/if-unmodified-since", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "Sat, 01 Jan 2000 00:00:00 GMT" + "is": "one_of", + "values": [ + "application/xml", + "application/xml; charset=UTF-8" + ] } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "TagsTooLarge" }, "body": { "encoding": "utf8", - "data": "ConditionNotMetFixture error" + "data": "TagsTooLargeFixture error" } } } @@ -42258,7 +42192,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 400 } }, { @@ -42266,25 +42200,67 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "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-content-encoding-gzip", + "id": "operations/azure/set-tags-key-128", "profile": "azure", "lane": "core", - "purpose": "Store Content-Encoding: gzip with a write, and the gzip bytes unchanged", + "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": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", - "content_encoding": "gzip", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } }, "exchanges": [ { @@ -42304,57 +42280,84 @@ "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": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-content-encoding", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "gzip" + "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": "CVsDGvNMZH4SPA4MSLswrA==", "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-key-129", + "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", + "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": { + "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk": "v" + } + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -42370,54 +42373,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": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "is": "xml", + "value": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "tags" } }, { - "at": "/headers/content-encoding", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "gzip" + "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": "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": "TagsTooLarge" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -42430,44 +42430,83 @@ "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": "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-content-properties", + "id": "operations/azure/set-tags-value-256", "profile": "azure", "lane": "core", - "purpose": "Store Content-Type, Content-Language, Content-Disposition and Cache-Control with a write", + "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": "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.set_tags", + "tags": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } }, "exchanges": [ { @@ -42487,81 +42526,84 @@ "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/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" + "value": "/fixture/object-tests/tags/object.txt" } }, { - "at": "/headers/x-ms-blob-content-language", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "nl-NL" + "is": "xml", + "value": "kvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "tags" } }, { - "at": "/headers/x-ms-blob-cache-control", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "max-age=3600" + "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-value-257", + "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", + "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": { + "k": "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" + } + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -42577,78 +42619,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": "MDEyMzQ1Njc4OQ==" + "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": "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" + "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": "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-error-code": "TagsTooLarge" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "TagsTooLargeFixture error" } } } @@ -42661,41 +42676,83 @@ "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": "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-content-type-non-ascii", + "id": "operations/azure/set-tags-special-characters", "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": "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": "MDEyMzQ1Njc4OQ==", - "content_type": "text/plain; name=\"été.txt\"", - "key": "object-tests/write/object.txt", - "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": [ { @@ -42715,54 +42772,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": "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/x-ms-blob-content-type", + "at": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "text/plain; name=\"été.txt\"" + "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" } } } @@ -42777,39 +42828,24 @@ "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/put-content-disposition-non-ascii", + "id": "operations/azure/set-tags-invalid-character", "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": "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": "MDEyMzQ1Njc4OQ==", - "content_disposition": "attachment; filename=\"été.txt\"", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "a@b": "c" + } }, "exchanges": [ { @@ -42829,54 +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": "MDEyMzQ1Njc4OQ==" + "is": "xml", + "value": "a@bc" } }, { - "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": "/headers/content-type", "optional": false, "rule": { - "is": "equal", - "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" + "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": "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-error-code": "InvalidTag" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidTagFixture error" } } } @@ -42889,23 +42922,23 @@ "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": "InvalidTag" } } ], @@ -42931,7 +42964,7 @@ "optional": false, "rule": { "is": "equal", - "value": "content_disposition" + "value": "tags" } }, { @@ -42947,24 +42980,32 @@ "optional": true, "rule": { "is": "equal", - "value": "InvalidMetadata" + "value": "InvalidTag" } } ] }, { - "id": "operations/azure/put-content-type-edge-spaces", + "id": "operations/azure/set-tags-duplicate-key", "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": "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": "MDEyMzQ1Njc4OQ==", - "content_type": " text/plain ", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": [ + { + "key": "project", + "value": "a" + }, + { + "key": "project", + "value": "b" + } + ] }, "exchanges": [ { @@ -42984,120 +43025,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": "MDEyMzQ1Njc4OQ==" + "is": "xml", + "value": "projectaprojectb" } }, { - "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, - "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": "" - } - } - }, - { - "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" - } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, + "status": 400, "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-error-code": "InvalidXmlDocument" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidXmlDocumentFixture error" } } } @@ -43110,23 +43082,23 @@ "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": "InvalidXmlDocument" } } ], @@ -43152,23 +43124,43 @@ "optional": false, "rule": { "is": "equal", - "value": "content_type" + "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-first-version", + "id": "operations/azure/set-tags-version", "profile": "azure", "lane": "core", - "purpose": "put first version", + "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": "djE=", - "key": "object-tests/versions-mtydohr2/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "tags": { + "project": "object-tests" + }, + "version": "2024-01-01T00:00:00.0000000Z" }, "exchanges": [ { @@ -43188,46 +43180,56 @@ "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": "xml", + "value": "projectobject-tests" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "djE=" + "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": "ZlTHNMyrj0QP8IJetEPcfw==", "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" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43242,39 +43244,25 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5769a0807b46\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.2318906Z" - } } ], "refusal": null }, { - "id": "operations/azure/put-if-match-current", + "id": "operations/azure/set-tags-snapshot", "profile": "azure", "lane": "core", - "purpose": "put if match current", + "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": "cmVwbGFjZWQ=", - "if_match": "\"fixture-b9991ef94e3d\"", - "key": "object-tests/write/object.txt", - "op": "put" + "key": "object-tests/tags/object.txt", + "op": "azure.set_tags", + "snapshot": "2024-01-01T00:00:00.0000000Z", + "tags": { + "project": "object-tests" + } }, "exchanges": [ { @@ -43294,54 +43282,56 @@ "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": "projectobject-tests" } }, { - "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": "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": 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" } } } @@ -43356,39 +43346,23 @@ "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/put-with-tier", "profile": "azure", "lane": "core", - "purpose": "put if none match missing", + "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": "ZnJlc2g=", - "if_none_match": "*", - "key": "object-tests/write/fresh.txt", - "op": "put" + "body_base64": "Zmlyc3Q=", + "key": "object-tests/tiers/object.txt", + "op": "put", + "tier": "Cool" }, "exchanges": [ { @@ -43408,7 +43382,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/fresh.txt" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43416,46 +43390,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ZnJlc2g=" + "value": "Zmlyc3Q=" } }, { - "at": "/headers/if-none-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "BlockBlob" } }, { - "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, "headers": { - "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", "date": { "from": "now" }, - "etag": "\"fixture-0445b9b5a1dd\"", + "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.2457093Z" + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -43470,38 +43438,22 @@ "is": "equal", "value": "ok" } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "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/put-key-1024", + "id": "operations/azure/set-tier-unknown", "profile": "azure", "lane": "core", - "purpose": "put key 1024", + "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/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Warm" }, "exchanges": [ { @@ -43521,7 +43473,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43529,38 +43481,40 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "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": "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-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" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -43573,40 +43527,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-cf057aba568d\"" + "value": 400 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.8738118Z" + "value": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/put-key-1025", + "id": "operations/azure/set-tier-cool", "profile": "azure", "lane": "core", - "purpose": "put key 1025", + "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/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Cool" }, "exchanges": [ { @@ -43626,7 +43580,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43634,34 +43588,37 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "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": "Cool" } } ], - "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": "OutOfRangeInput" + } }, "body": { - "encoding": "utf8", - "data": "OutOfRangeInputFixture error" + "encoding": "empty" } } } @@ -43674,81 +43631,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": "OutOfRangeInput" + "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": "key" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "OutOfRangeInput" - } - } - ] + "refusal": null }, { - "id": "operations/azure/put-key-under-object", + "id": "operations/azure/set-tier-rehydrate", "profile": "azure", "lane": "core", - "purpose": "put key under object", + "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": "MQ==", - "key": "object-tests/order/a/b", - "op": "put" + "key": "object-tests/tiers/object.txt", + "op": "azure.set_tier", + "tier": "Hot" }, "exchanges": [ { @@ -43768,7 +43668,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/order/a/b" + "value": "/fixture/object-tests/tiers/object.txt" } }, { @@ -43776,38 +43676,37 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "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": "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" } } } @@ -43822,37 +43721,22 @@ "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/put-internal-error", "profile": "azure", "lane": "core", - "purpose": "put lost the race to create", + "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": "YW5vdGhlciBvYmplY3Q=", - "if_none_match": "*", + "body_base64": "MDEyMzQ1Njc4OQ==", "key": "object-tests/write/object.txt", "op": "put" }, @@ -43882,15 +43766,7 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" - } - }, - { - "at": "/headers/if-none-match", - "optional": false, - "rule": { - "is": "equal", - "value": "*" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -43907,69 +43783,22 @@ ], "allow_query": [], "response": { - "status": 409, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "BlobAlreadyExistsFixture 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": 409 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "BlobAlreadyExists" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-md5-mismatch", - "profile": "azure", - "lane": "core", - "purpose": "put md5 mismatch", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "ZGVjbGFyZWQtYm9keQ==", - "checksum": { - "algorithm": "md5", - "value_base64": "eV8yArF8trw9S3cdjGyerw==" - }, - "key": "object-tests/hashes/md5-mismatch.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -43987,7 +43816,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5-mismatch.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -43995,15 +43824,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" - } - }, - { - "at": "/headers/content-md5", - "optional": false, - "rule": { - "is": "equal", - "value": "eV8yArF8trw9S3cdjGyerw==" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44020,68 +43841,23 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "Md5Mismatch" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "Md5MismatchFixture 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": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "Md5Mismatch" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-metadata-empty-value", - "profile": "azure", - "lane": "core", - "purpose": "put metadata empty value", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/empty-value.txt", - "metadata": { - "empty": "" + ], + "optional": true }, - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44099,7 +43875,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/empty-value.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44107,15 +43883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" - } - }, - { - "at": "/headers/x-ms-meta-empty", - "optional": false, - "rule": { - "is": "equal", - "value": "" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44132,72 +43900,23 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-type": "application/xml", "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" + "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-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", - "profile": "azure", - "lane": "core", - "purpose": "put metadata invalid name", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "MQ==", - "key": "object-tests/metadata/invalid-name.txt", - "metadata": { - "not-valid": "1" + ], + "optional": true }, - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44215,7 +43934,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/invalid-name.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44223,15 +43942,66 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-meta-not-valid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "BlockBlob" + } + } + ], + "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", + "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==" } }, { @@ -44248,106 +44018,23 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 500, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidMetadata" + "x-ms-error-code": "InternalError" }, "body": { "encoding": "utf8", - "data": "InvalidMetadataFixture 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": 400 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "InvalidMetadata" - } - } - ], - "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 - } + ], + "optional": true }, - { - "at": "/code", - "optional": true, - "rule": { - "is": "equal", - "value": "InvalidMetadata" - } - } - ] - }, - { - "id": "operations/azure/put-metadata-replaced", - "profile": "azure", - "lane": "core", - "purpose": "put metadata replaced", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "Mg==", - "key": "object-tests/metadata/replaced.txt", - "op": "put" - }, - "exchanges": [ { "alternatives": [ { @@ -44365,7 +44052,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/replaced.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44373,7 +44060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mg==" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44390,25 +44077,22 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 500, "headers": { - "content-md5": "yB5yjZ1ML2NvBn+JzBSGLA==", + "content-type": "application/xml", "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-version-id": "2024-01-01T00:00:00.7487600Z" + "x-ms-error-code": "InternalError" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InternalErrorThe server encountered an internal error. Please retry the request." } } } - ] + ], + "optional": true } ], "expect": [ @@ -44417,43 +44101,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-37b036d8c13f\"" + "value": 500 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7487600Z" + "value": "InternalError" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata", + "id": "operations/azure/put-if-unmodified-since-past", "profile": "azure", "lane": "core", - "purpose": "put metadata", + "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": "MQ==", - "key": "object-tests/metadata/object.txt", - "metadata": { - "name": "value", - "second": "2" - }, + "body_base64": "MDEyMzQ1Njc4OQ==", + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44474,7 +44155,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44482,31 +44163,23 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" - } - }, - { - "at": "/headers/x-ms-meta-name", - "optional": false, - "rule": { - "is": "equal", - "value": "value" + "value": "MDEyMzQ1Njc4OQ==" } }, { - "at": "/headers/x-ms-meta-second", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "2" + "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" } } ], @@ -44515,21 +44188,17 @@ ], "allow_query": [], "response": { - "status": 201, + "status": 412, "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": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -44542,42 +44211,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9abbc5e374ca\"" + "value": 412 } }, { - "at": "/value/version", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/put-metadata-identifier-name", + "id": "operations/azure/put-content-encoding-gzip", "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": "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": "MQ==", - "key": "object-tests/metadata/identifier-name.txt", - "metadata": { - "_a1": "1" - }, + "body_base64": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA", + "content_encoding": "gzip", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -44598,7 +44265,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/identifier-name.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44606,23 +44273,23 @@ "optional": false, "rule": { "is": "equal", - "value": "MQ==" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { - "at": "/headers/x-ms-meta-_a1", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "BlockBlob" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-blob-content-encoding", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "gzip" } } ], @@ -44633,69 +44300,22 @@ "response": { "status": 201, "headers": { - "content-md5": "xMpCOKC5I4INzFCab3WEmw==", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, - "etag": "\"fixture-9abbc5e374ca\"", + "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.7035036Z" + "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-9abbc5e374ca\"" - } - }, - { - "at": "/value/version", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.7035036Z" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure/put-over-snapshotted", - "profile": "azure", - "lane": "core", - "purpose": "put over snapshotted", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "body_base64": "dHdv", - "key": "object-tests/snapshots/object.txt", - "op": "put" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -44711,7 +44331,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -44719,7 +44339,7 @@ "optional": false, "rule": { "is": "equal", - "value": "dHdv" + "value": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } }, { @@ -44729,6 +44349,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/content-encoding", + "optional": false, + "rule": { + "is": "equal", + "value": "gzip" + } } ], "allow_headers": [ @@ -44738,15 +44366,15 @@ "response": { "status": 201, "headers": { - "content-md5": "uKn3Fdu2T9XFbneDxoIKYQ==", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "date": { "from": "now" }, - "etag": "\"fixture-937c89bb7b5c\"", + "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.6268993Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -44771,7 +44399,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-937c89bb7b5c\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -44779,22 +44407,26 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.6268993Z" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-overwrite", + "id": "operations/azure/put-content-properties", "profile": "azure", "lane": "core", - "purpose": "put overwrite", + "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": { - "body_base64": "b3ZlcndyaXR0ZW4=", + "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" }, @@ -44824,7 +44456,7 @@ "optional": false, "rule": { "is": "equal", - "value": "b3ZlcndyaXR0ZW4=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44834,6 +44466,38 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "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": [ @@ -44843,70 +44507,22 @@ "response": { "status": 201, "headers": { - "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-cf4724500964\"", + "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.7758823Z" + "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-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": [ + }, { "request": [ { @@ -44930,15 +44546,7 @@ "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -44948,118 +44556,37 @@ "is": "equal", "value": "BlockBlob" } - } - ], - "allow_headers": [ - "content-type" - ], - "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" - } - } - ], - "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": [ - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "PUT" - } }, { - "at": "/path", + "at": "/headers/content-type", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "text/plain; charset=utf-8" } }, { - "at": "/body_base64", + "at": "/headers/content-language", "optional": false, "rule": { "is": "equal", - "value": "YW5vdGhlciBvYmplY3Q=" + "value": "nl-NL" } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-blob-content-disposition", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-088e5dc109cf\"" + "value": "attachment; filename=\"report.txt\"" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/cache-control", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "max-age=3600" } } ], @@ -45068,16 +44595,21 @@ ], "allow_query": [], "response": { - "status": 412, + "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": "ConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -45090,39 +44622,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-refused", + "id": "operations/azure/put-content-type-non-ascii", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "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": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": "text/plain; name=\"été.txt\"", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -45143,7 +44676,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45151,7 +44684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -45161,6 +44694,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain; name=\"été.txt\"" + } } ], "allow_headers": [ @@ -45168,17 +44709,21 @@ ], "allow_query": [], "response": { - "status": 403, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "AuthorizationPermissionMismatch" + "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": "AuthorizationPermissionMismatchFixture error" + "encoding": "base64", + "data": "" } } } @@ -45191,39 +44736,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 403 + "value": "\"fixture-b9991ef94e3d\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "AuthorizationPermissionMismatch" + "value": "2024-01-01T00:00:00.2084665Z" } } ], "refusal": null }, { - "id": "operations/azure/put-second-version", + "id": "operations/azure/put-content-disposition-non-ascii", "profile": "azure", "lane": "core", - "purpose": "put second version", + "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": { - "body_base64": "djI=", - "key": "object-tests/versions-mtydohr2/object.txt", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_disposition": "attachment; filename=\"été.txt\"", + "key": "object-tests/write/object.txt", "op": "put" }, "exchanges": [ @@ -45244,7 +44790,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtydohr2/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45252,7 +44798,7 @@ "optional": false, "rule": { "is": "equal", - "value": "djI=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -45262,6 +44808,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/x-ms-blob-content-disposition", + "optional": false, + "rule": { + "is": "equal", + "value": "attachment; filename*=UTF-8''%C3%A9t%C3%A9.txt" + } } ], "allow_headers": [ @@ -45271,15 +44825,15 @@ "response": { "status": 201, "headers": { - "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-4768de772705\"", + "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.3326281Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -45304,7 +44858,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-4768de772705\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -45312,22 +44866,64 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.3326281Z" + "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_disposition" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "InvalidMetadata" + } + } + ] }, { - "id": "operations/azure/put-unauthenticated", + "id": "operations/azure/put-content-type-edge-spaces", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "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": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "body_base64": "MDEyMzQ1Njc4OQ==", + "content_type": " text/plain ", "key": "object-tests/write/object.txt", "op": "put" }, @@ -45357,7 +44953,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bm90aGluZyBpcyBzdG9yZWQ=" + "value": "MDEyMzQ1Njc4OQ==" } }, { @@ -45367,6 +44963,14 @@ "is": "equal", "value": "BlockBlob" } + }, + { + "at": "/headers/x-ms-blob-content-type", + "optional": false, + "rule": { + "is": "equal", + "value": "text/plain" + } } ], "allow_headers": [ @@ -45374,71 +44978,24 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "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": "InvalidAuthenticationInfoFixture error" + "encoding": "base64", + "data": "" } } - } - ] - } - ], - "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/put-with-crc64", - "profile": "azure", - "lane": "core", - "purpose": "put with crc64", - "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", - "op": "put" - }, - "exchanges": [ - { - "alternatives": [ + }, { "request": [ { @@ -45454,7 +45011,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45462,23 +45019,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/content-type", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "text/plain" } } ], @@ -45489,15 +45046,15 @@ "response": { "status": 201, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "etag": "\"fixture-90cfcb93036b\"", + "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.1153123Z" + "x-ms-version-id": "2024-01-01T00:00:00.2084665Z" }, "body": { "encoding": "base64", @@ -45522,7 +45079,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-90cfcb93036b\"" + "value": "\"fixture-b9991ef94e3d\"" } }, { @@ -45530,27 +45087,48 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1153123Z" + "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/put-with-md5", + "id": "operations/azure/put-first-version", "profile": "azure", "lane": "core", - "purpose": "put with md5", + "purpose": "put first version", "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": "djE=", + "key": "object-tests/versions-mtydohr2/object.txt", "op": "put" }, "exchanges": [ @@ -45571,7 +45149,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -45579,15 +45157,7 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" - } - }, - { - "at": "/headers/content-md5", - "optional": false, - "rule": { - "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "djE=" } }, { @@ -45606,15 +45176,15 @@ "response": { "status": 201, "headers": { - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-md5": "ZlTHNMyrj0QP8IJetEPcfw==", "date": { "from": "now" }, - "etag": "\"fixture-494ad7275bf7\"", + "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.7803759Z" + "x-ms-version-id": "2024-01-01T00:00:00.2318906Z" }, "body": { "encoding": "base64", @@ -45639,7 +45209,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-494ad7275bf7\"" + "value": "\"fixture-5769a0807b46\"" } }, { @@ -45647,23 +45217,25 @@ "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7803759Z" + "value": "2024-01-01T00:00:00.2318906Z" } } ], "refusal": null }, { - "id": "operations/azure/snapshot", + "id": "operations/azure/put-if-match-current", "profile": "azure", "lane": "core", - "purpose": "snapshot", + "purpose": "put if match current", "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" + "body_base64": "cmVwbGFjZWQ=", + "if_match": "\"fixture-b9991ef94e3d\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -45683,7 +45255,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -45691,15 +45263,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cmVwbGFjZWQ=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "snapshot" + "value": "\"fixture-b9991ef94e3d\"" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" } } ], @@ -45710,15 +45290,15 @@ "response": { "status": 201, "headers": { + "content-md5": "kbskg1kEP+mEFuJZyb3xDQ==", "date": { "from": "now" }, - "etag": "\"fixture-e3698635ab53\"", + "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": "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.3814952Z" }, "body": { "encoding": "base64", @@ -45739,29 +45319,37 @@ } }, { - "at": "/value/snapshot", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.7351568Z" + "value": "\"fixture-3e075954b24b\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3814952Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-empty", + "id": "operations/azure/put-if-none-match-missing", "profile": "azure", "lane": "core", - "purpose": "stage empty", + "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": "MDAwMDAz", - "body_base64": "", - "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": [ { @@ -45781,7 +45369,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/fresh.txt" } }, { @@ -45789,23 +45377,23 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "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": "MDAwMDAz" + "value": "BlockBlob" } } ], @@ -45814,17 +45402,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "dgEIWMg2LXMC71+UNqpmOQ==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidHeaderValue" + "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" }, "body": { - "encoding": "utf8", - "data": "InvalidHeaderValueFixture error" + "encoding": "base64", + "data": "" } } } @@ -45837,41 +45429,40 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-0445b9b5a1dd\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "2024-01-01T00:00:00.2457093Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-escaped-id", + "id": "operations/azure/put-key-1024", "profile": "azure", "lane": "core", - "purpose": "stage escaped id", + "purpose": "put key 1024", "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": "MQ==", + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", + "op": "put" }, "exchanges": [ { @@ -45891,7 +45482,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -45899,23 +45490,15 @@ "optional": false, "rule": { "is": "equal", - "value": "b25l" - } - }, - { - "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": "+/8=" + "value": "BlockBlob" } } ], @@ -45926,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", @@ -45953,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-id-too-long", + "id": "operations/azure/put-key-1025", "profile": "azure", "lane": "core", - "purpose": "stage id too long", + "purpose": "put key 1025", "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": "MQ==", + "key": "object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", + "op": "put" }, "exchanges": [ { @@ -45997,7 +45587,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/long/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" } }, { @@ -46005,23 +45595,15 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" - } - }, - { - "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": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" + "value": "BlockBlob" } } ], @@ -46040,7 +45622,7 @@ }, "body": { "encoding": "utf8", - "data": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." + "data": "OutOfRangeInputFixture error" } } } @@ -46095,12 +45677,12 @@ "optional": false, "rule": { "is": "equal", - "value": "block_id_base64" + "value": "key" } }, { "at": "/status", - "optional": true, + "optional": false, "rule": { "is": "equal", "value": 400 @@ -46108,7 +45690,7 @@ }, { "at": "/code", - "optional": true, + "optional": false, "rule": { "is": "equal", "value": "OutOfRangeInput" @@ -46117,18 +45699,17 @@ ] }, { - "id": "operations/azure/stage-mixed-length-id", + "id": "operations/azure/put-key-under-object", "profile": "azure", "lane": "core", - "purpose": "stage mixed length id", + "purpose": "put key under object", "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": "MQ==", + "key": "object-tests/order/a/b", + "op": "put" }, "exchanges": [ { @@ -46148,7 +45729,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/order/a/b" } }, { @@ -46156,23 +45737,15 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" - } - }, - { - "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": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "BlockBlob" } } ], @@ -46181,17 +45754,21 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "xMpCOKC5I4INzFCab3WEmw==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobOrBlock" + "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": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "encoding": "base64", + "data": "" } } } @@ -46204,44 +45781,41 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-17ced520f182\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobOrBlock" + "value": "2024-01-01T00:00:00.2584945Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-mixed-length-id-code-in-body", + "id": "operations/azure/put-lost-the-race-to-create", "profile": "azure", "lane": "core", - "purpose": "stage mixed length id, with the error code only in the XML body", + "purpose": "put lost the race to create", "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": { - "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", - "body_base64": "dGhpcmQ=", - "key": "object-tests/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_none_match": "*", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -46261,7 +45835,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -46269,23 +45843,23 @@ "optional": false, "rule": { "is": "equal", - "value": "dGhpcmQ=" + "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": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" + "value": "BlockBlob" } } ], @@ -46294,16 +45868,17 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "BlobAlreadyExists" }, "body": { "encoding": "utf8", - "data": "InvalidBlobOrBlockFixture error" + "data": "BlobAlreadyExistsFixture error" } } } @@ -46324,7 +45899,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 409 } }, { @@ -46332,25 +45907,28 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobOrBlock" + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure/stage-unauthenticated", + "id": "operations/azure/put-md5-mismatch", "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "purpose": "put md5 mismatch", "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": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "eV8yArF8trw9S3cdjGyerw==" + }, + "key": "object-tests/hashes/md5-mismatch.txt", + "op": "put" }, "exchanges": [ { @@ -46370,7 +45948,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/hashes/md5-mismatch.txt" } }, { @@ -46378,23 +45956,23 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "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": "MDAwMDAx" + "value": "BlockBlob" } } ], @@ -46403,17 +45981,17 @@ ], "allow_query": [], "response": { - "status": 401, + "status": 400, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidAuthenticationInfo" + "x-ms-error-code": "Md5Mismatch" }, "body": { "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" + "data": "Md5MismatchFixture error" } } } @@ -46434,7 +46012,7 @@ "optional": false, "rule": { "is": "equal", - "value": 401 + "value": 400 } }, { @@ -46442,25 +46020,27 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": "Md5Mismatch" } } ], "refusal": null }, { - "id": "operations/azure/stage", + "id": "operations/azure/put-metadata-empty-value", "profile": "azure", "lane": "core", - "purpose": "stage", + "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/multipart/staged.bin", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/metadata/empty-value.txt", + "metadata": { + "empty": "" + }, + "op": "put" }, "exchanges": [ { @@ -46480,7 +46060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/metadata/empty-value.txt" } }, { @@ -46488,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" } } ], @@ -46515,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", @@ -46542,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-id-64-bytes", + "id": "operations/azure/put-metadata-invalid-name", "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 metadata invalid name", "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": "MQ==", + "key": "object-tests/metadata/invalid-name.txt", + "metadata": { + "not-valid": "1" + }, + "op": "put" }, "exchanges": [ { @@ -46586,7 +46176,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/metadata/invalid-name.txt" } }, { @@ -46594,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": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" + "value": "BlockBlob" } } ], @@ -46619,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" } } } @@ -46643,43 +46232,88 @@ "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 - }, - { - "id": "operations/azure/stage-key-question", - "profile": "azure", - "lane": "core", - "purpose": "stage, with the key \"question?mark.txt\"", - "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" - }, - "exchanges": [ + "refusal": [ { - "alternatives": [ - { - "request": [ - { + "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/put-metadata-replaced", + "profile": "azure", + "lane": "core", + "purpose": "put metadata replaced", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "body_base64": "Mg==", + "key": "object-tests/metadata/replaced.txt", + "op": "put" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { "at": "/method", "optional": false, "rule": { @@ -46692,7 +46326,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/metadata/replaced.txt" } }, { @@ -46700,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" } } ], @@ -46727,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", @@ -46754,31 +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-key-hash", + "id": "operations/azure/put-metadata", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"hash#tag.txt\"", + "purpose": "put metadata", "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/metadata/object.txt", + "metadata": { + "name": "value", + "second": "2" + }, + "op": "put" }, "exchanges": [ { @@ -46798,7 +46435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -46806,23 +46443,31 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "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" + "value": "2" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" } } ], @@ -46833,12 +46478,15 @@ "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", @@ -46860,31 +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/stage-key-percent", + "id": "operations/azure/put-metadata-identifier-name", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"percent%20.txt\"", + "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": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/percent%20.txt", - "op": "azure.stage_block" + "body_base64": "MQ==", + "key": "object-tests/metadata/identifier-name.txt", + "metadata": { + "_a1": "1" + }, + "op": "put" }, "exchanges": [ { @@ -46904,7 +46559,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/metadata/identifier-name.txt" } }, { @@ -46912,23 +46567,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "MQ==" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-meta-_a1", "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" } } ], @@ -46939,12 +46594,15 @@ "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", @@ -46966,31 +46624,35 @@ }, { "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/stage-key-plus", + "id": "operations/azure/put-over-snapshotted", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"plus+plus.txt\"", + "purpose": "put over snapshotted", "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": "dHdv", + "key": "object-tests/snapshots/object.txt", + "op": "put" }, "exchanges": [ { @@ -47010,7 +46672,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -47018,23 +46680,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "dHdv" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -47045,12 +46699,15 @@ "response": { "status": 201, "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.6268993Z" }, "body": { "encoding": "base64", @@ -47072,31 +46729,35 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "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/stage-key-space", + "id": "operations/azure/put-overwrite", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"space name.txt\"", + "purpose": "put overwrite", "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": "b3ZlcndyaXR0ZW4=", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47116,7 +46777,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47124,23 +46785,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "b3ZlcndyaXR0ZW4=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -47151,12 +46804,15 @@ "response": { "status": 201, "headers": { + "content-md5": "UJ/0v/8wp3EDqsNAaOpGxw==", "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7758823Z" }, "body": { "encoding": "base64", @@ -47178,31 +46834,36 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "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/stage-key-non-ascii", + "id": "operations/azure/put-precondition-failed", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"café/雪.txt\"", + "purpose": "put precondition failed", "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": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47222,7 +46883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47230,23 +46891,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "\"fixture-088e5dc109cf\"" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -47255,18 +46916,17 @@ ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -47279,36 +46939,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": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-double-slash", + "id": "operations/azure/put-precondition-failed-code-in-body", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"double//slash.txt\"", + "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": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/double//slash.txt", - "op": "azure.stage_block" + "body_base64": "YW5vdGhlciBvYmplY3Q=", + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47328,7 +46996,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47336,23 +47004,23 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "YW5vdGhlciBvYmplY3Q=" } }, { - "at": "/query/comp", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "block" + "value": "\"fixture-088e5dc109cf\"" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -47361,18 +47029,16 @@ ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + } }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -47385,36 +47051,40 @@ "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": 412 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure/stage-key-trailing-slash", + "id": "operations/azure/put-refused", "profile": "azure", "lane": "core", - "purpose": "stage, with the key \"trailing-slash/\"", + "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": { - "block_id_base64": "MDAwMDAy", - "body_base64": "c2Vjb25k", - "key": "object-tests/keys/trailing-slash/", - "op": "azure.stage_block" + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", + "op": "put" }, "exchanges": [ { @@ -47434,7 +47104,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object.txt" } }, { @@ -47442,23 +47112,15 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" - } - }, - { - "at": "/query/comp", - "optional": false, - "rule": { - "is": "equal", - "value": "block" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/query/blockid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAy" + "value": "BlockBlob" } } ], @@ -47467,18 +47129,17 @@ ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "AuthorizationPermissionMismatch" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "AuthorizationPermissionMismatchFixture error" } } } @@ -47491,40 +47152,40 @@ "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": 403 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "AuthorizationPermissionMismatch" } } ], "refusal": null }, { - "id": "operations/azure/stage-from-url", + "id": "operations/azure/put-second-version", "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 second version", "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": "djI=", + "key": "object-tests/versions-mtydohr2/object.txt", + "op": "put" }, "exchanges": [ { @@ -47544,7 +47205,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/versions-mtydohr2/object.txt" } }, { @@ -47552,47 +47213,15 @@ "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?://[^/]+/fixture/object-tests/copy/source\\.txt" + "value": "djI=" } }, { - "at": "/headers/x-ms-source-range", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-2" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "BlockBlob" } } ], @@ -47603,12 +47232,15 @@ "response": { "status": 201, "headers": { + "content-md5": "GyZ2GcSBLMRu4oF0eITKUA==", "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.3326281Z" }, "body": { "encoding": "base64", @@ -47630,36 +47262,35 @@ }, { "at": "/value/etag", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "\"fixture-4768de772705\"" + } + }, + { + "at": "/value/version", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.3326281Z" } } ], "refusal": null }, { - "id": "operations/azure/stage-from-url-other-account", + "id": "operations/azure/put-unauthenticated", "profile": "azure", "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", + "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", "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_account_url": "https://fixtureother.blob.core.windows.net", - "source_key": "object-tests/copy/source.txt", - "source_range": { - "end": 3, - "start": 0 - } + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -47679,7 +47310,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -47687,47 +47318,15 @@ "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" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { - "at": "/headers/x-ms-source-range", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "bytes=0-2" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "BlockBlob" } } ], @@ -47736,18 +47335,17 @@ ], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -47760,35 +47358,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": 401 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/staged-absent", + "id": "operations/azure/put-with-crc64", "profile": "azure", "lane": "core", - "purpose": "staged absent", + "purpose": "put with crc64", "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": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "9XBvAwWoR9o=" + }, + "key": "object-tests/hashes/crc64.txt", + "op": "put" }, "exchanges": [ { @@ -47800,7 +47407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47808,7 +47415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -47816,40 +47423,46 @@ "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": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "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" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -47862,43 +47475,44 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-90cfcb93036b\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "2024-01-01T00:00:00.1153123Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-absent-code-in-body", + "id": "operations/azure/put-with-md5", "profile": "azure", "lane": "core", - "purpose": "staged absent, with the error code only in the XML body", + "purpose": "put with 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/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": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "md5", + "value_base64": "N6YZkbg+Lyfxtskwn8iRCg==" + }, + "key": "object-tests/hashes/md5.txt", + "op": "put" }, "exchanges": [ { @@ -47910,7 +47524,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -47918,7 +47532,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/absent.bin" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -47926,39 +47540,46 @@ "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": 404, + "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-request-server-encrypted": "true", + "x-ms-version-id": "2024-01-01T00:00:00.7803759Z" }, "body": { - "encoding": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -47971,40 +47592,39 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-494ad7275bf7\"" } }, { - "at": "/code", + "at": "/value/version", "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "2024-01-01T00:00:00.7803759Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-commit", + "id": "operations/azure/snapshot", "profile": "azure", "lane": "core", - "purpose": "staged after commit", + "purpose": "snapshot", "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" + "key": "object-tests/snapshots/object.txt", + "op": "azure.snapshot" }, "exchanges": [ { @@ -48016,7 +47636,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48024,7 +47644,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -48040,36 +47660,31 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" - } - }, - { - "at": "/query/blocklisttype", - "optional": false, - "rule": { - "is": "equal", - "value": "all" + "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-be8efdb79010\"", + "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": "" + } } } ] @@ -48085,68 +47700,29 @@ } }, { - "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", + "at": "/value/snapshot", "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.7351568Z" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-replacement", + "id": "operations/azure/stage-empty", "profile": "azure", "lane": "core", - "purpose": "staged after replacement", + "purpose": "stage empty", "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" + "block_id_base64": "MDAwMDAz", + "body_base64": "", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48158,7 +47734,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48166,7 +47742,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -48182,36 +47758,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAz" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 400, "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": "InvalidHeaderValue" }, "body": { "encoding": "utf8", - "data": "MDAwMDAx5" - }, - "framing": "chunked" + "data": "InvalidHeaderValueFixture error" + } } } ] @@ -48223,56 +47798,41 @@ "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": 400 } }, { - "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": "InvalidHeaderValue" } } ], "refusal": null }, { - "id": "operations/azure/staged-after-whole-write", + "id": "operations/azure/stage-escaped-id", "profile": "azure", "lane": "core", - "purpose": "staged after whole write", + "purpose": "stage escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/multipart/whole.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "+/8=", + "body_base64": "b25l", + "key": "object-tests/multipart/escaped.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48284,7 +47844,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48292,7 +47852,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/whole.bin" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { @@ -48300,7 +47860,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "b25l" } }, { @@ -48308,36 +47868,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "+/8=" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 201, "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" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -48353,36 +47913,32 @@ } }, { - "at": "/value/committed", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/uncommitted", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 0 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-committed-empty", + "id": "operations/azure/stage-id-too-long", "profile": "azure", "lane": "core", - "purpose": "staged committed empty", + "purpose": "stage id too long", "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", - "kind": "committed", - "op": "azure.list_blocks" + "op": "azure.stage_block" }, "exchanges": [ { @@ -48394,7 +47950,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48410,7 +47966,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "dGhpcmQ=" } }, { @@ -48418,35 +47974,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "committed" + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg=" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "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": "OutOfRangeInput" }, "body": { "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "data": "OutOfRangeInputBlock ID exceeds 64 decoded bytes." + } } } ] @@ -48458,40 +48014,82 @@ "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": 400 } }, { - "at": "/value/uncommitted", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "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/staged-committed-nothing", + "id": "operations/azure/stage-mixed-length-id", "profile": "azure", "lane": "core", - "purpose": "staged committed nothing", + "purpose": "stage mixed length id", "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" + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48503,7 +48101,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48511,7 +48109,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/empty.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -48519,7 +48117,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "dGhpcmQ=" } }, { @@ -48527,36 +48125,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 400, "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" + "x-ms-error-code": "InvalidBlobOrBlock" }, "body": { "encoding": "utf8", - "data": "" - }, - "framing": "chunked" + "data": "InvalidBlobOrBlockFixture error" + } } } ] @@ -48568,40 +48165,44 @@ "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": 400 } }, { - "at": "/value/uncommitted", + "at": "/code", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure/staged-escaped-id", + "id": "operations/azure/stage-mixed-length-id-code-in-body", "profile": "azure", "lane": "core", - "purpose": "staged escaped id", + "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": { - "key": "object-tests/multipart/escaped.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy", + "body_base64": "dGhpcmQ=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48613,7 +48214,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48621,7 +48222,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -48629,7 +48230,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "dGhpcmQ=" } }, { @@ -48637,35 +48238,34 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "YS1tdWNoLWxvbmdlci1ibG9jay1pZGVudGlmaWVy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "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" + } }, "body": { "encoding": "utf8", - "data": "+/8=3" - }, - "framing": "chunked" + "data": "InvalidBlobOrBlockFixture error" + } } } ] @@ -48677,56 +48277,41 @@ "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": 400 } }, { - "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": "InvalidBlobOrBlock" } } ], "refusal": null }, { - "id": "operations/azure/staged-replacement", + "id": "operations/azure/stage-unauthenticated", "profile": "azure", "lane": "core", - "purpose": "staged replacement", + "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/pending.bin", - "kind": "all", - "op": "azure.list_blocks" + "block_id_base64": "MDAwMDAx", + "body_base64": "Zmlyc3Q=", + "key": "object-tests/multipart/staged.bin", + "op": "azure.stage_block" }, "exchanges": [ { @@ -48738,7 +48323,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48746,7 +48331,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -48754,7 +48339,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "Zmlyc3Q=" } }, { @@ -48762,36 +48347,35 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAx" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "status": 401, "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" + "x-ms-error-code": "InvalidAuthenticationInfo" }, "body": { "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" - }, - "framing": "chunked" + "data": "InvalidAuthenticationInfoFixture error" + } } } ] @@ -48803,88 +48387,41 @@ "optional": false, "rule": { "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 + "value": "error" } }, { - "at": "/value/uncommitted/0/id_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "MDAwMDAx" + "value": 401 } }, { - "at": "/value/uncommitted/0/size", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 5 - } - }, - { - "at": "/value/uncommitted", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted-only", + "id": "operations/azure/stage", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted only", + "purpose": "stage", "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", - "kind": "all", - "op": "azure.list_blocks" + "op": "azure.stage_block" }, "exchanges": [ { @@ -48896,7 +48433,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -48912,7 +48449,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -48920,35 +48457,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "all" + "value": "MDAwMDAy" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -48964,68 +48502,32 @@ } }, { - "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, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 2 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure/staged-uncommitted", + "id": "operations/azure/stage-id-64-bytes", "profile": "azure", "lane": "core", - "purpose": "staged uncommitted", + "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": { + "block_id_base64": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==", + "body_base64": "c2Vjb25k", "key": "object-tests/multipart/staged.bin", - "kind": "uncommitted", - "op": "azure.list_blocks" + "op": "azure.stage_block" }, "exchanges": [ { @@ -49037,7 +48539,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -49053,7 +48555,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -49061,35 +48563,36 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } }, { - "at": "/query/blocklisttype", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "uncommitted" + "value": "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 200, + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "MDAwMDAx5MDAwMDAy6" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -49105,68 +48608,32 @@ } }, { - "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, + "at": "/value/etag", + "optional": true, "rule": { - "is": "array_length", - "value": 2 + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-container-missing", - "profile": "azure-hns", + "id": "operations/azure/stage-key-question", + "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, 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": [ { @@ -49186,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" } }, { @@ -49202,7 +48669,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49211,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": "" } } } @@ -49234,54 +48710,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 404 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "ContainerNotFound" + "value": "ok" } }, { - "at": "/kind", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "container_not_found" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-declaring-md5", - "profile": "azure-hns", + "id": "operations/azure/stage-key-hash", + "profile": "azure", "lane": "core", - "purpose": "commit declaring md5", + "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": "MDAwMDAx", - "kind": "latest" - } - ], - "content_md5_base64": "N6YZkbg+Lyfxtskwn8iRCg==", - "key": "object-tests/hashes/committed.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/hash#tag.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49301,31 +48759,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { - "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": "MDAwMDAy" } } ], @@ -49339,7 +48797,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" @@ -49364,14 +48821,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9a581bc70e20\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49385,26 +48834,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-duplicate-id", - "profile": "azure-hns", + "id": "operations/azure/stage-key-percent", + "profile": "azure", "lane": "core", - "purpose": "commit duplicate id", + "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" - }, - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "key": "object-tests/multipart/duplicate.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/percent%20.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49424,15 +48865,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/duplicate.bin" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49440,7 +48881,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49454,7 +48903,6 @@ "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" @@ -49479,14 +48927,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-a8581b642c5f\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49500,22 +48940,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-escaped-id", - "profile": "azure-hns", + "id": "operations/azure/stage-key-plus", + "profile": "azure", "lane": "core", - "purpose": "commit escaped 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": "+/8=", - "kind": "latest" - } - ], - "key": "object-tests/multipart/escaped.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49535,15 +48971,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/escaped.bin" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "+/8=" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49551,7 +48987,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49565,7 +49009,6 @@ "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" @@ -49590,14 +49033,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-77b5e2317b8a\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49611,23 +49046,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-lost-the-race-to-create", - "profile": "azure-hns", + "id": "operations/azure/stage-key-space", + "profile": "azure", "lane": "core", - "purpose": "commit lost the race to create", + "purpose": "stage, with the key \"space name.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - } - ], - "if_none_match": "*", - "key": "object-tests/multipart/pending.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/space name.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49647,31 +49077,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/keys/space name.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { - "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": "MDAwMDAy" } } ], @@ -49680,17 +49110,18 @@ ], "allow_query": [], "response": { - "status": 409, + "status": 201, "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", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "BlobAlreadyExistsFixture error" + "encoding": "base64", + "data": "" } } } @@ -49703,40 +49134,36 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", - "optional": false, + "at": "/value/etag", + "optional": true, "rule": { - "is": "equal", - "value": "BlobAlreadyExists" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-nothing", - "profile": "azure-hns", + "id": "operations/azure/stage-key-non-ascii", + "profile": "azure", "lane": "core", - "purpose": "commit nothing", + "purpose": "stage, with the key \"café/雪.txt\"", "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": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/café/雪.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49756,15 +49183,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/empty.bin" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49772,7 +49199,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49786,7 +49221,6 @@ "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" @@ -49811,14 +49245,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-072bed78cc6a\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49832,22 +49258,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-over-whole-object", - "profile": "azure-hns", + "id": "operations/azure/stage-key-double-slash", + "profile": "azure", "lane": "core", - "purpose": "commit over whole object", + "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" - } - ], - "key": "object-tests/multipart/over.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/double//slash.txt", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49867,15 +49289,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/over.bin" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "c2Vjb25k" } }, { @@ -49883,7 +49305,15 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" + } + }, + { + "at": "/query/blockid", + "optional": false, + "rule": { + "is": "equal", + "value": "MDAwMDAy" } } ], @@ -49897,7 +49327,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" @@ -49922,14 +49351,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-7dc650e58291\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -49943,23 +49364,18 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-precondition-failed", - "profile": "azure-hns", + "id": "operations/azure/stage-key-trailing-slash", + "profile": "azure", "lane": "core", - "purpose": "commit precondition failed", + "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" - } - ], - "if_match": "\"fixture-088e5dc109cf\"", - "key": "object-tests/multipart/pending.bin", - "op": "azure.commit_blocks" + "block_id_base64": "MDAwMDAy", + "body_base64": "c2Vjb25k", + "key": "object-tests/keys/trailing-slash/", + "op": "azure.stage_block" }, "exchanges": [ { @@ -49979,31 +49395,31 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "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": "MDAwMDAy" } } ], @@ -50012,17 +49428,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": "" } } } @@ -50035,40 +49452,40 @@ "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-from-url", + "profile": "azure", "lane": "core", - "purpose": "Report the service authorization error for this operation; signature acceptance is tested separately.", + "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": [], - "key": "object.bin", - "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": [ { @@ -50088,15 +49505,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": "" } }, { @@ -50104,117 +49521,39 @@ "optional": false, "rule": { "is": "equal", - "value": "blocklist" + "value": "block" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 404, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "ContainerNotFound" }, - "body": { - "encoding": "utf8", - "data": "ContainerNotFoundFixture 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": "ContainerNotFound" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/commit-reordered", - "profile": "azure-hns", - "lane": "core", - "purpose": "commit reordered", - "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" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ { - "at": "/method", + "at": "/query/blockid", "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "MDAwMDAy" } }, { - "at": "/path", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/body_text", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAyMDAwMDAx" + "is": "equal", + "value": "bytes=0-2" } }, { - "at": "/query/comp", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "blocklist" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], @@ -50228,7 +49567,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" @@ -50253,14 +49591,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-446301cfeaef\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -50274,28 +49604,29 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-replacement", - "profile": "azure-hns", + "id": "operations/azure/stage-from-url-other-account", + "profile": "azure", "lane": "core", - "purpose": "commit replacement", + "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" - } - ], - "key": "object-tests/multipart/replaced.bin", - "op": "azure.commit_blocks" - }, - "exchanges": [ - { - "alternatives": [ - { - "request": [ + "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, @@ -50309,15 +49640,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAx" + "is": "equal", + "value": "" } }, { @@ -50325,7 +49656,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://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 [^ ]+" } } ], @@ -50339,7 +49702,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" @@ -50364,14 +49726,6 @@ }, { "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-9c5e55ff559c\"" - } - }, - { - "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -50385,26 +49739,17 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id", - "profile": "azure-hns", + "id": "operations/azure/staged-absent", + "profile": "azure", "lane": "core", - "purpose": "commit unstaged id", + "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": "MDAwMDA5", - "kind": "latest" - } - ], - "key": "object-tests/multipart/staged.bin", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/absent.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50416,7 +49761,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50424,15 +49769,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "is": "equal", + "value": "" } }, { @@ -50442,24 +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": 400, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlockList" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "data": "BlobNotFoundFixture error" } } } @@ -50480,7 +49831,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 404 } }, { @@ -50488,17 +49839,17 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlockList" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-unstaged-id-code-in-body", - "profile": "azure-hns", + "id": "operations/azure/staged-absent-code-in-body", + "profile": "azure", "lane": "core", - "purpose": "commit unstaged id, with the error code only in the XML body", + "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", "https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes", @@ -50506,18 +49857,9 @@ ], "origin": "constructed", "call": { - "blocks": [ - { - "id_base64": "MDAwMDAx", - "kind": "latest" - }, - { - "id_base64": "MDAwMDA5", - "kind": "latest" - } - ], - "key": "object-tests/multipart/staged.bin", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/absent.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50529,7 +49871,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50537,15 +49879,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/multipart/absent.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDA5" + "is": "equal", + "value": "" } }, { @@ -50555,14 +49897,20 @@ "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": 404, "headers": { "content-type": "application/xml", "date": { @@ -50571,7 +49919,7 @@ }, "body": { "encoding": "utf8", - "data": "InvalidBlockListFixture error" + "data": "BlobNotFoundFixture error" } } } @@ -50592,7 +49940,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 404 } }, { @@ -50600,33 +49948,24 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidBlockList" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/commit", - "profile": "azure-hns", + "id": "operations/azure/staged-after-commit", + "profile": "azure", "lane": "core", - "purpose": "commit", + "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/multipart/committed.bin", - "op": "azure.commit_blocks" + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50638,7 +49977,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50650,11 +49989,11 @@ } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50664,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" } } ] @@ -50700,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-question", - "profile": "azure-hns", + "id": "operations/azure/staged-after-replacement", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"question?mark.txt\"", + "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/question?mark.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/replaced.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50753,7 +50119,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50761,15 +50127,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50779,27 +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": 201, + "status": 200, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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-request-server-encrypted": "true" + "x-ms-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "MDAwMDAx5" + }, + "framing": "chunked" } } ] @@ -50815,48 +50188,52 @@ } }, { - "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", + "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-key-hash", - "profile": "azure-hns", + "id": "operations/azure/staged-after-whole-write", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"hash#tag.txt\"", + "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" - } - ], - "key": "object-tests/keys/hash#tag.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/whole.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50868,7 +50245,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50876,15 +50253,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/multipart/whole.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -50894,27 +50271,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-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" } } ] @@ -50930,48 +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-key-percent", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-empty", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"percent%20.txt\"", + "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/keys/percent%20.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/staged.bin", + "kind": "committed", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -50983,7 +50355,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -50991,15 +50363,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": "" } }, { @@ -51009,27 +50381,33 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "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" } } ] @@ -51045,48 +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/commit-key-plus", - "profile": "azure-hns", + "id": "operations/azure/staged-committed-nothing", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"plus+plus.txt\"", + "purpose": "staged committed nothing", "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" + "key": "object-tests/multipart/empty.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51098,7 +50464,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -51106,15 +50472,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/empty.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -51124,27 +50490,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-265df060a55b\"", "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" } } ] @@ -51160,48 +50533,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-key-space", - "profile": "azure-hns", + "id": "operations/azure/staged-escaped-id", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"space name.txt\"", + "purpose": "staged escaped 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": "MDAwMDAy", - "kind": "latest" - } - ], - "key": "object-tests/keys/space name.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/escaped.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51213,7 +50574,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -51221,15 +50582,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/escaped.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -51239,27 +50600,33 @@ "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\"", "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": "+/8=3" + }, + "framing": "chunked" } } ] @@ -51275,48 +50642,52 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "+/8=" } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted/0/size", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/uncommitted", + "optional": false, + "rule": { + "is": "array_length", + "value": 1 } } ], "refusal": null }, { - "id": "operations/azure-hns/commit-key-non-ascii", - "profile": "azure-hns", + "id": "operations/azure/staged-replacement", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"café/雪.txt\"", + "purpose": "staged 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/café/雪.txt", - "op": "azure.commit_blocks" + "key": "object-tests/multipart/pending.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51328,7 +50699,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -51336,15 +50707,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -51354,27 +50725,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-9c5ca12bcfc9\"", "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": "MDAwMDAx5MDAwMDAy6MDAwMDAx5" + }, + "framing": "chunked" } } ] @@ -51390,48 +50768,84 @@ } }, { - "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/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/commit-key-double-slash", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted-only", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"double//slash.txt\"", + "purpose": "staged uncommitted only", "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/staged.bin", + "kind": "all", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51443,7 +50857,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -51451,15 +50865,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -51469,27 +50883,33 @@ "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\"", "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" } } ] @@ -51505,48 +50925,68 @@ } }, { - "at": "/value/etag", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "MDAwMDAx" } }, { - "at": "/value/version", - "optional": true, + "at": "/value/uncommitted/0/size", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "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/commit-key-trailing-slash", - "profile": "azure-hns", + "id": "operations/azure/staged-uncommitted", + "profile": "azure", "lane": "core", - "purpose": "commit, with the key \"trailing-slash/\"", + "purpose": "staged uncommitted", "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/staged.bin", + "kind": "uncommitted", + "op": "azure.list_blocks" }, "exchanges": [ { @@ -51558,7 +50998,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -51566,15 +51006,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "is": "equal", + "value": "" } }, { @@ -51584,25 +51024,33 @@ "is": "equal", "value": "blocklist" } + }, + { + "at": "/query/blocklisttype", + "optional": false, + "rule": { + "is": "equal", + "value": "uncommitted" + } } ], - "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" + "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": "MDAwMDAx5MDAwMDAy6" + }, + "framing": "chunked" } } ] @@ -51614,52 +51062,71 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/committed", + "optional": false, + "rule": { + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/uncommitted/0/id_base64", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "MDAwMDAx" } }, { - "at": "/code", + "at": "/value/uncommitted/0/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlockList" + "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/commit-content-properties", + "id": "operations/azure-hns/commit-container-missing", "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", + "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": { - "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", + "blocks": [], + "key": "object.bin", "op": "azure.commit_blocks" }, "exchanges": [ @@ -51680,7 +51147,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object.bin" } }, { @@ -51688,7 +51155,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "" } }, { @@ -51698,37 +51165,128 @@ "is": "equal", "value": "blocklist" } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain; charset=utf-8" + } + ], + "allow_headers": [ + "content-type" + ], + "allow_query": [], + "response": { + "status": 404, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "ContainerNotFound" + }, + "body": { + "encoding": "utf8", + "data": "ContainerNotFoundFixture 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": "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": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" } }, { - "at": "/headers/x-ms-blob-content-language", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "nl-NL" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { - "at": "/headers/x-ms-blob-content-disposition", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/x-ms-blob-content-md5", "optional": false, "rule": { "is": "equal", - "value": "attachment; filename=\"report.txt\"" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { - "at": "/headers/x-ms-blob-cache-control", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "blocklist" } } ], @@ -51742,7 +51300,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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" @@ -51770,7 +51328,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "\"fixture-9a581bc70e20\"" } }, { @@ -51788,10 +51346,10 @@ "refusal": null }, { - "id": "operations/azure-hns/commit-with-tier", + "id": "operations/azure-hns/commit-duplicate-id", "profile": "azure-hns", "lane": "core", - "purpose": "Commit a block list into an access tier, named in x-ms-access-tier", + "purpose": "commit duplicate id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], @@ -51802,13 +51360,12 @@ "kind": "latest" }, { - "id_base64": "MDAwMDAy", + "id_base64": "MDAwMDAx", "kind": "latest" } ], - "key": "object-tests/multipart/committed.bin", - "op": "azure.commit_blocks", - "tier": "Cool" + "key": "object-tests/multipart/duplicate.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51828,7 +51385,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/multipart/duplicate.bin" } }, { @@ -51836,7 +51393,7 @@ "optional": false, "rule": { "is": "xml", - "value": "MDAwMDAxMDAwMDAy" + "value": "MDAwMDAxMDAwMDAx" } }, { @@ -51846,14 +51403,6 @@ "is": "equal", "value": "blocklist" } - }, - { - "at": "/headers/x-ms-access-tier", - "optional": false, - "rule": { - "is": "equal", - "value": "Cool" - } } ], "allow_headers": [ @@ -51866,7 +51415,7 @@ "date": { "from": "now" }, - "etag": "\"fixture-8ec031f3abfa\"", + "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" @@ -51894,7 +51443,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ec031f3abfa\"" + "value": "\"fixture-a8581b642c5f\"" } }, { @@ -51912,16 +51461,22 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-accepted", + "id": "operations/azure-hns/commit-escaped-id", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted", + "purpose": "commit escaped id", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/remove/present.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "+/8=", + "kind": "latest" + } + ], + "key": "object-tests/multipart/escaped.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -51933,7 +51488,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -51941,28 +51496,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/remove/present.txt" + "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": 202, + "status": 201, "headers": { "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -51981,21 +51548,47 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-77b5e2317b8a\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-question", + "id": "operations/azure-hns/commit-lost-the-race-to-create", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"question?mark.txt\"", + "purpose": "commit lost the race to create", "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" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "if_none_match": "*", + "key": "object-tests/multipart/pending.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52007,7 +51600,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52015,32 +51608,50 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/if-none-match", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "*" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "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-error-code": "BlobAlreadyExists" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "BlobAlreadyExistsFixture error" } } } @@ -52053,23 +51664,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": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-hash", + "id": "operations/azure-hns/commit-nothing", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"hash#tag.txt\"", + "purpose": "commit nothing", "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" + "blocks": [], + "key": "object-tests/multipart/empty.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52081,7 +51709,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52089,28 +51717,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/multipart/empty.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": 201, "headers": { "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -52129,21 +51769,46 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-072bed78cc6a\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-percent", + "id": "operations/azure-hns/commit-over-whole-object", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"percent%20.txt\"", + "purpose": "commit over whole object", "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" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "key": "object-tests/multipart/over.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52155,7 +51820,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52163,28 +51828,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/over.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -52203,21 +51880,47 @@ "is": "equal", "value": "ok" } + }, + { + "at": "/value/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-7dc650e58291\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-plus", + "id": "operations/azure-hns/commit-precondition-failed", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"plus+plus.txt\"", + "purpose": "commit precondition failed", "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" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "if_match": "\"fixture-088e5dc109cf\"", + "key": "object-tests/multipart/pending.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52229,7 +51932,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52237,32 +51940,50 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "\"fixture-088e5dc109cf\"" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 202, + "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": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -52275,23 +51996,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": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-space", + "id": "operations/azure-hns/commit-refused", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"space name.txt\"", + "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/keys/space name.txt", - "op": "delete" + "blocks": [], + "key": "object.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52303,7 +52041,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52311,32 +52049,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" } } } @@ -52349,23 +52097,49 @@ "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": "ContainerNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-accepted-key-non-ascii", + "id": "operations/azure-hns/commit-reordered", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"café/雪.txt\"", + "purpose": "commit reordered", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/café/雪.txt", - "op": "delete" + "blocks": [ + { + "id_base64": "MDAwMDAy", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAx", + "kind": "latest" + } + ], + "key": "object-tests/multipart/reordered.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52377,7 +52151,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52385,28 +52159,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAyMDAwMDAx" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -52425,21 +52211,46 @@ "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/delete-accepted-key-double-slash", + "id": "operations/azure-hns/commit-replacement", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"double//slash.txt\"", + "purpose": "commit replacement", "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" + } + ], + "key": "object-tests/multipart/replaced.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52451,7 +52262,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52459,28 +52270,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAx" + } + }, + { + "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "base64", @@ -52499,21 +52322,50 @@ "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/delete-accepted-key-trailing-slash", + "id": "operations/azure-hns/commit-unstaged-id", "profile": "azure-hns", "lane": "core", - "purpose": "delete accepted, with the key \"trailing-slash/\"", + "purpose": "commit unstaged 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": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDA5", + "kind": "latest" + } + ], + "key": "object-tests/multipart/staged.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52525,7 +52377,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "PUT" } }, { @@ -52533,19 +52385,29 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { - "at": "/body_base64", + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "MDAwMDAxMDAwMDA5" + } + }, + { + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "blocklist" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { "status": 400, @@ -52554,11 +52416,11 @@ "date": { "from": "now" }, - "x-ms-error-code": "InvalidUri" + "x-ms-error-code": "InvalidBlockList" }, "body": { "encoding": "utf8", - "data": "InvalidUriFixture error" + "data": "InvalidBlockListFixture error" } } } @@ -52587,27 +52449,36 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidUri" + "value": "InvalidBlockList" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many", + "id": "operations/azure-hns/commit-unstaged-id-code-in-body", "profile": "azure-hns", "lane": "core", - "purpose": "Delete several objects in one batch and report each result", + "purpose": "commit unstaged id, with the error code only in the XML body", "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", + "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": { - "keys": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt", - "object-tests/batch/absent.txt" + "blocks": [ + { + "id_base64": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDA5", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/multipart/staged.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52619,7 +52490,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52627,23 +52498,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" } }, { @@ -52651,46 +52514,26 @@ "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": 400, "headers": { - "content-type": "multipart/mixed; boundary=batchresponse_fixture", + "content-type": "application/xml", "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" + "data": "InvalidBlockListFixture error" + } } } ] @@ -52702,52 +52545,49 @@ "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": 400 } }, { - "at": "/value/errors", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } - ] + "value": "InvalidBlockList" } } ], "refusal": null }, { - "id": "operations/azure-hns/delete-many-denied", + "id": "operations/azure-hns/commit", "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", "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" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/multipart/committed.bin", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52759,7 +52599,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52767,23 +52607,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/committed.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -52791,46 +52623,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-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": "--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": "" + } } } ] @@ -52846,34 +52661,21 @@ } }, { - "at": "/value/deleted", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "\"fixture-8ec031f3abfa\"" } }, { - "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, + "" ] } } @@ -52881,22 +52683,26 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-answers-out-of-order", + "id": "operations/azure-hns/commit-key-question", "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, with the key \"question?mark.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" ], - "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" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/keys/question?mark.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -52908,7 +52714,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -52916,23 +52722,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/keys/question?mark.txt" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -52940,46 +52738,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-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": "--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": "" + } } } ] @@ -52995,27 +52776,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-8ec031f3abfa\"" } }, { - "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, + "" ] } } @@ -53023,22 +52798,26 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-lf-line-endings", + "id": "operations/azure-hns/commit-key-hash", "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, with the key \"hash#tag.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" ], - "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" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/keys/hash#tag.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -53050,7 +52829,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53058,23 +52837,15 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { - "at": "/headers/content-type", - "optional": false, - "rule": { - "is": "matches", - "pattern": "multipart/mixed; boundary=batch_[0-9A-Za-z-]+" - } - }, - { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53082,46 +52853,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-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": "--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" + "encoding": "base64", + "data": "" + } } } ] @@ -53132,35 +52886,26 @@ "at": "/outcome", "optional": false, "rule": { - "is": "one_of", - "values": [ - "ok", - "error" - ] + "is": "equal", + "value": "ok" } }, { - "at": "/value/deleted", - "optional": true, + "at": "/value/etag", + "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/batch/a.txt", - "object-tests/batch/b.txt" - ] + "value": "\"fixture-8ec031f3abfa\"" } }, { - "at": "/value/errors", + "at": "/value/version", "optional": true, "rule": { - "is": "equal", - "value": [ - { - "code": "BlobNotFound", - "key": "object-tests/batch/absent.txt", - "status": 404 - } + "is": "one_of", + "values": [ + null, + "" ] } } @@ -53168,22 +52913,26 @@ "refusal": null }, { - "id": "operations/azure-hns/delete-many-without-content-id", + "id": "operations/azure-hns/commit-key-percent", "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": "commit, with the key \"percent%20.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" ], - "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" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/keys/percent%20.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -53195,7 +52944,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53203,23 +52952,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/keys/percent%20.txt" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53227,46 +52968,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-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": "--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" + "encoding": "base64", + "data": "" + } } } ] @@ -53278,29 +53002,52 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "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-many-server-busy", + "id": "operations/azure-hns/commit-key-plus", "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, with the key \"plus+plus.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" ], - "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": "MDAwMDAx", + "kind": "latest" + }, + { + "id_base64": "MDAwMDAy", + "kind": "latest" + } ], - "op": "delete_many" + "key": "object-tests/keys/plus+plus.txt", + "op": "azure.commit_blocks" }, "exchanges": [ { @@ -53312,7 +53059,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53320,23 +53067,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/keys/plus+plus.txt" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53344,50 +53083,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-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": "" } } } ] + } + ], + "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-space", + "profile": "azure-hns", + "lane": "core", + "purpose": "commit, with the key \"space name.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/space name.txt", + "op": "azure.commit_blocks" + }, + "exchanges": [ { "alternatives": [ { @@ -53397,7 +53174,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53405,23 +53182,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/keys/space name.txt" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53429,51 +53198,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-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-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": [ { @@ -53483,7 +53289,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53491,23 +53297,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/keys/café/雪.txt" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53515,51 +53313,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-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-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": [ { @@ -53569,7 +53404,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53577,75 +53412,218 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/double//slash.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-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": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "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": 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": [ + { + "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": [ { @@ -53655,7 +53633,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53663,75 +53641,137 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/multipart/committed.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": "MDAwMDAxMDAwMDAy" } }, { - "at": "/query/restype", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "blocklist" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "text/plain; charset=utf-8" } }, { - "at": "", + "at": "/headers/x-ms-blob-content-language", "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": "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": [], + "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-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": [ { @@ -53741,7 +53781,7 @@ "optional": false, "rule": { "is": "equal", - "value": "POST" + "value": "PUT" } }, { @@ -53749,23 +53789,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/committed.bin" } }, { - "at": "/query/restype", + "at": "/body_text", "optional": false, "rule": { - "is": "equal", - "value": "container" + "is": "xml", + "value": "MDAwMDAxMDAwMDAy" } }, { @@ -53773,50 +53805,40 @@ "optional": false, "rule": { "is": "equal", - "value": "batch" + "value": "blocklist" } }, { - "at": "", + "at": "/headers/x-ms-access-tier", "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": "Cool" } } ], - "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": [ @@ -53825,294 +53847,726 @@ "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/delete-accepted", "profile": "azure-hns", "lane": "core", - "purpose": "Delete 256 keys in one batch, the most Azure takes", + "purpose": "delete accepted", "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" + "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" }, @@ -54169,276 +54623,1783 @@ "subrequests": [ { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0000.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0001.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0002.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0003.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0004.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0005.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0006.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0007.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0008.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0009.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0010.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0011.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0012.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0013.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0014.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0015.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0016.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0017.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0018.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0019.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0020.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0021.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0022.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0023.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0024.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0025.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0026.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0027.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0028.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0029.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0030.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0031.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0032.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0033.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0034.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0035.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0036.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0037.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0038.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0039.txt" - }, - { - "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0040.txt" - }, + "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/many-0041.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0042.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0043.txt" - }, + "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/many-0044.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0045.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0046.txt" - }, + "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/many-0047.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0048.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0049.txt" - }, + "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/many-0050.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0051.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0052.txt" - }, + "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/many-0053.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0054.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0055.txt" - }, + "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/many-0056.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0057.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0058.txt" - }, + "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/many-0059.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0060.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0061.txt" - }, + "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/many-0062.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0063.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0064.txt" - }, + "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/many-0065.txt" + "path": "/fixture/object-tests/batch/a.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0066.txt" + "path": "/fixture/object-tests/batch/b.txt" }, { "method": "DELETE", - "path": "/fixture/object-tests/batch/many-0067.txt" - }, + "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", + "path": "/fixture/object-tests/batch/many-0001.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0002.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0003.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0004.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0005.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0006.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0007.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0008.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0009.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0010.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0011.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0012.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0013.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0014.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0015.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0016.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0017.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0018.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0019.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0020.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0021.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0022.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0023.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0024.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0025.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0026.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0027.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0028.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0029.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0030.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0031.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0032.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0033.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0034.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0035.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0036.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0037.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0038.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0039.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0040.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0041.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0042.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0043.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0044.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0045.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0046.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0047.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0048.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0049.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0050.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0051.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0052.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0053.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0054.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0055.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0056.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0057.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0058.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0059.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0060.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0061.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0062.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0063.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0064.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0065.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0066.txt" + }, + { + "method": "DELETE", + "path": "/fixture/object-tests/batch/many-0067.txt" + }, { "method": "DELETE", "path": "/fixture/object-tests/batch/many-0068.txt" @@ -65315,16 +67276,21 @@ "refusal": null }, { - "id": "operations/azure-hns/get-reordered", + "id": "operations/azure-hns/get-range-md5", "profile": "azure-hns", "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": [ { @@ -65344,7 +67310,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/reordered.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -65354,18 +67320,36 @@ "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-446301cfeaef\"", + "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", @@ -65375,83 +67359,10 @@ }, "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-446301cfeaef\"" - } - }, - { - "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": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "c2Vjb25kZmlyc3Q=" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/get-replacement", - "profile": "azure-hns", - "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": [ { @@ -65467,7 +67378,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -65477,18 +67388,36 @@ "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-9c5e55ff559c\"", + "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", @@ -65498,7 +67427,7 @@ }, "body": { "encoding": "base64", - "data": "RklSU1Q=" + "data": "MjM0NQ==" } } } @@ -65519,7 +67448,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9c5e55ff559c\"" + "value": "\"fixture-5295cdfd25ff\"" } }, { @@ -65527,7 +67456,7 @@ "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 4 } }, { @@ -65554,24 +67483,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-hns/get-snapshot", + "id": "operations/azure-hns/get-range-md5-mismatch", "profile": "azure-hns", "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-hns/get-range-md5", "call": { - "key": "object-tests/snapshots/object.txt", + "key": "object-tests/read/object.txt", "op": "get", - "snapshot": "2024-01-01T00:00:00.1577201Z" + "range": { + "end": 6, + "start": 2 + }, + "range_checksum": "md5" }, "exchanges": [ { @@ -65591,7 +67537,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -65603,77 +67549,47 @@ } }, { - "at": "/query/snapshot", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1577201Z" + "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-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": "MjM0YQ==" } } - } - ] - } - ], - "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-staged-only", - "profile": "azure-hns", - "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": [ { @@ -65689,7 +67605,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/staged.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -65699,22 +67615,46 @@ "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-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": "MjM0YQ==" } } } @@ -65731,38 +67671,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-hns/get-suffix-longer-than-object", + "id": "operations/azure-hns/get-range-crc64", "profile": "azure-hns", "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": [ { @@ -65798,16 +67732,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" @@ -65815,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", @@ -65822,7 +67765,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } }, @@ -65857,16 +67800,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" @@ -65874,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", @@ -65881,7 +67833,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -65910,7 +67862,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -65921,14 +67873,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -65945,52 +67889,220 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "MjM0NQ==" } - } - ], - "refusal": [ + }, { - "at": "/outcome", + "at": "/value/checksum", "optional": false, "rule": { "is": "equal", - "value": "refused" + "value": { + "algorithm": "azure_crc64", + "value_base64": "0F+fuGFLNdI=" + } } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-range-crc64-mismatch", + "profile": "azure-hns", + "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-hns/get-range-crc64", + "call": { + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 6, + "start": 2 }, + "range_checksum": "azure_crc64" + }, + "exchanges": [ { - "at": "/kind", + "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-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", + "x-ms-server-encrypted": "true" + }, + "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-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", + "x-ms-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "MjM0YQ==" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", "optional": false, "rule": { - "is": "matches", - "pattern": ".+" + "is": "equal", + "value": "error" } }, { - "at": "/parameter", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "range" + "value": "checksum_mismatch" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure-hns/get-suffix", + "id": "operations/azure-hns/get-range-md5-largest", "profile": "azure-hns", "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": [ { @@ -66026,16 +68138,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" @@ -66085,16 +68206,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" @@ -66149,14 +68279,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -66175,47 +68297,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-hns/get-unauthenticated", + "id": "operations/azure-hns/get-range-md5-too-large", "profile": "azure-hns", "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": [ { @@ -66245,72 +68357,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-hns/get-unknown-snapshot", - "profile": "azure-hns", - "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": [ { @@ -66326,7 +68407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -66338,28 +68419,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" } } } @@ -66380,7 +68469,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 400 } }, { @@ -66388,24 +68477,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-hns/get-unknown-version", + "id": "operations/azure-hns/get-reordered", "profile": "azure-hns", "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-mtypy4jp/object.txt", - "op": "get", - "version": "2024-01-01T00:00:00.4364169Z" + "key": "object-tests/multipart/reordered.bin", + "op": "get" }, "exchanges": [ { @@ -66425,7 +68554,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" + "value": "/fixture/object-tests/multipart/reordered.bin" } }, { @@ -66435,30 +68564,28 @@ "is": "equal", "value": "" } - }, - { - "at": "/query/versionid", - "optional": false, - "rule": { - "is": "equal", - "value": "2024-01-01T00:00:00.4364169Z" - } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 200, "headers": { - "content-type": "application/xml", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "etag": "\"fixture-446301cfeaef\"", + "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": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "base64", + "data": "c2Vjb25kZmlyc3Q=" } } } @@ -66471,38 +68598,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "\"fixture-446301cfeaef\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": 11 + } + }, + { + "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": "c2Vjb25kZmlyc3Q=" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-whole", + "id": "operations/azure-hns/get-replacement", "profile": "azure-hns", "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": [ @@ -66523,7 +68677,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -66540,12 +68694,11 @@ "response": { "status": 200, "headers": { - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-5295cdfd25ff\"", + "etag": "\"fixture-9c5e55ff559c\"", "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", @@ -66555,7 +68708,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "RklSU1Q=" } } } @@ -66576,7 +68729,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-9c5e55ff559c\"" } }, { @@ -66584,7 +68737,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 5 } }, { @@ -66595,14 +68748,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -66619,23 +68764,24 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "RklSU1Q=" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-xml-looking", + "id": "operations/azure-hns/get-snapshot", "profile": "azure-hns", "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.1577201Z" }, "exchanges": [ { @@ -66655,7 +68801,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -66665,31 +68811,30 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.1577201Z" + } } ], "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": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -66702,31 +68847,38 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/body_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" + "value": 404 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-noise-tolerance", + "id": "operations/azure-hns/get-staged-only", "profile": "azure-hns", "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": [ @@ -66747,7 +68899,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object" + "value": "/fixture/object-tests/multipart/staged.bin" } }, { @@ -66762,27 +68914,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" } } } @@ -66795,33 +68937,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-hns/get-body-cut-short", + "id": "operations/azure-hns/get-suffix-longer-than-object", "profile": "azure-hns", "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": [ { @@ -66851,67 +69002,17 @@ "is": "equal", "value": "" } - } - ], - "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" - }, - "truncate_body_after": 15 - } - } - ] - }, - { - "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", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "bytes=-100" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { "status": 200, @@ -66962,28 +69063,20 @@ } }, { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=15-" - } - }, - { - "at": "/headers/if-match", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "bytes=-100" } } ], "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" @@ -66998,117 +69091,116 @@ }, "body": { "encoding": "base64", - "data": "Y3QtdGVzdHMtb2JqZWN0" - } - } - }, - { - "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=15-" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 206, - "headers": { - "content-range": "bytes 15-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": "Y3QtdGVzdHMtb2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } - ], - "optional": true + ] } ], "expect": [ { "at": "/outcome", "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": 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": [ - "error", - "ok" + null, + "" ] } }, { "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-hns/get-server-busy", + "id": "operations/azure-hns/get-suffix", "profile": "azure-hns", "lane": "core", - "purpose": "Report a 503 ServerBusy answer as an error, after at most 5 retries", + "purpose": "get suffix", "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" + "op": "get", + "range": { + "suffix": 6 + } }, "exchanges": [ { @@ -67138,78 +69230,40 @@ "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." - } - } - } - ] - }, - { - "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", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "bytes=-6" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "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": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } - } - ], - "optional": true - }, - { - "alternatives": [ + }, { "request": [ { @@ -67235,126 +69289,145 @@ "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", + "at": "/headers/x-ms-range", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "bytes=-6" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 503, + "status": 200, "headers": { - "content-type": "application/xml", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ServerBusy" + "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": "ServerBusyThe server is currently unable to receive requests. Please retry your request." + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, { - "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 + "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" + } + } + ], + "decline_permitted": true + }, + { + "id": "operations/azure-hns/get-unauthenticated", + "profile": "azure-hns", + "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": { + "key": "object-tests/read/object.txt", + "op": "get" + }, + "exchanges": [ { "alternatives": [ { @@ -67387,22 +69460,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" } } } - ], - "optional": true + ] } ], "expect": [ @@ -67419,7 +69491,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 401 } }, { @@ -67427,24 +69499,24 @@ "optional": false, "rule": { "is": "equal", - "value": "ServerBusy" + "value": "InvalidAuthenticationInfo" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-if-unmodified-since-past", + "id": "operations/azure-hns/get-unknown-snapshot", "profile": "azure-hns", "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": [ { @@ -67464,7 +69536,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -67476,28 +69548,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" } } } @@ -67518,7 +69590,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -67526,24 +69598,24 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-if-modified-since-future", + "id": "operations/azure-hns/get-unknown-version", "profile": "azure-hns", "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-mtypy4jp/object.txt", + "op": "get", + "version": "2024-01-01T00:00:00.4364169Z" }, "exchanges": [ { @@ -67563,7 +69635,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" } }, { @@ -67575,26 +69647,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": 409, "headers": { + "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -67615,7 +69689,7 @@ "optional": false, "rule": { "is": "equal", - "value": 304 + "value": 409 } }, { @@ -67623,22 +69697,21 @@ "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-if-modified-since-past", + "id": "operations/azure-hns/get-whole", "profile": "azure-hns", "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" }, @@ -67670,14 +69743,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": [], @@ -67771,15 +69836,15 @@ "refusal": null }, { - "id": "operations/azure-hns/get-content-encoding-gzip", + "id": "operations/azure-hns/get-xml-looking", "profile": "azure-hns", "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": [ @@ -67800,7 +69865,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -67817,23 +69882,24 @@ "response": { "status": 200, "headers": { - "content-encoding": "gzip", - "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "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": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" + "data": "PEVycm9yPnN0aWxsIG9iamVjdCBieXRlczwvRXJyb3I+" } } } @@ -67849,78 +69915,28 @@ "value": "ok" } }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" - } - }, - { - "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": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, { "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-hns/get-content-properties", + "id": "operations/azure-hns/get-noise-tolerance", "profile": "azure-hns", "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": [ @@ -67941,7 +69957,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object" } }, { @@ -67958,25 +69974,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-5295cdfd25ff\"", + "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-server-encrypted": "true" + "x-ms-request-id": "another-id", + "x-ms-request-server-encrypted": "true", + "x-ms-server-encrypted": "true", + "x-ms-version": "2023-11-03" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "aGVsbG8=" } } } @@ -67992,94 +70008,29 @@ "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_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" - } - }, - { - "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-hns/get-with-staged-blocks", + "id": "operations/azure-hns/get-body-cut-short", "profile": "azure-hns", "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": [ @@ -68100,7 +70051,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/pending.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68117,11 +70068,12 @@ "response": { "status": 200, "headers": { + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ce92c4d48b08\"", + "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", @@ -68131,81 +70083,13 @@ }, "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-ce92c4d48b08\"" - } - }, - { - "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": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } }, - { - "at": "/value/body_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "Zmlyc3RzZWNvbmQ=" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/head-committed-declaring-md5", - "profile": "azure-hns", - "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": [ { @@ -68215,7 +70099,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68223,7 +70107,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68235,18 +70119,19 @@ } } ], - "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-9a581bc70e20\"", + "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", @@ -68256,83 +70141,10 @@ }, "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-9a581bc70e20\"" - } - }, - { - "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": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/head-committed", - "profile": "azure-hns", - "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": [ { @@ -68340,7 +70152,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68348,7 +70160,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/committed.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68358,19 +70170,35 @@ "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-5295cdfd25ff\"" + } } ], "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-8ec031f3abfa\"", + "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", @@ -68380,75 +70208,10 @@ }, "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-8ec031f3abfa\"" - } - }, - { - "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": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/head-metadata", - "profile": "azure-hns", - "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": [ { @@ -68456,7 +70219,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68464,7 +70227,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/metadata/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68474,115 +70237,88 @@ "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-5295cdfd25ff\"" + } } ], "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-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": "" + "data": "Y3QtdGVzdHMtb2JqZWN0" } } } - ] + ], + "optional": true } ], "expect": [ { "at": "/outcome", "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-4d04dba3441e\"" - } - }, - { - "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, - "" + "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-hns/head-missing", + "id": "operations/azure-hns/get-server-busy", "profile": "azure-hns", "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": [ { @@ -68594,7 +70330,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68602,7 +70338,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/absent.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68617,72 +70353,71 @@ "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." } } } ] - } - ], - "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" - } + "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 }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "equal", - "value": "not_found" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/head-previous-version", - "profile": "azure-hns", - "lane": "core", - "purpose": "head 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": "head", - "version": "none-1" - }, - "exchanges": [ { "alternatives": [ { @@ -68692,7 +70427,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68700,7 +70435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68710,68 +70445,77 @@ "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": "/query/versionid", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "none-1" + "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": 400, + "status": 503, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "ServerBusy" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ServerBusyThe server is currently unable to receive requests. Please retry your request." } } } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } + ], + "optional": true }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 400 - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/head-snapshot", - "profile": "azure-hns", - "lane": "core", - "purpose": "head snapshot", - "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.1577201Z" - }, - "exchanges": [ { "alternatives": [ { @@ -68781,7 +70525,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68789,7 +70533,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/snapshots/object.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68799,33 +70543,76 @@ "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": "/query/snapshot", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.1577201Z" + "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": 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." } } } - ] + ], + "optional": true } ], "expect": [ @@ -68842,7 +70629,7 @@ "optional": false, "rule": { "is": "equal", - "value": 404 + "value": 503 } }, { @@ -68850,23 +70637,24 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobNotFound" + "value": "ServerBusy" } } ], "refusal": null }, { - "id": "operations/azure-hns/head-written-with-crc64", + "id": "operations/azure-hns/get-if-unmodified-since-past", "profile": "azure-hns", "lane": "core", - "purpose": "head written with crc64", + "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/hashes/crc64.txt", - "op": "head" + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -68878,7 +70666,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -68886,7 +70674,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -68896,30 +70684,30 @@ "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": 200, + "status": 412, "headers": { - "content-length": "13", - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", - "content-type": "application/octet-stream", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-bf462a2f52f2\"", - "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-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ConditionNotMetFixture error" } } } @@ -68932,66 +70720,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-bf462a2f52f2\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 13 + "value": "error" } }, { - "at": "/value/content_type", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "application/octet-stream" + "value": 412 } }, { - "at": "/value/content_md5_base64", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/head-written-with-md5", + "id": "operations/azure-hns/get-if-modified-since-future", "profile": "azure-hns", "lane": "core", - "purpose": "head written with md5", + "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/hashes/md5.txt", - "op": "head" + "if_modified_since": "Fri, 01 Jan 2100 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -69003,7 +70765,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -69011,7 +70773,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/md5.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -69021,30 +70783,28 @@ "is": "equal", "value": "" } + }, + { + "at": "/headers/if-modified-since", + "optional": false, + "rule": { + "is": "equal", + "value": "Fri, 01 Jan 2100 00:00:00 GMT" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "status": 304, "headers": { - "content-length": "13", - "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", - "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-15ae0acd3480\"", - "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-error-code": "ConditionNotMet" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "empty" } } } @@ -69057,66 +70817,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-15ae0acd3480\"" - } - }, - { - "at": "/value/size", - "optional": false, - "rule": { - "is": "equal", - "value": 13 + "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": "N6YZkbg+Lyfxtskwn8iRCg==" - } - }, - { - "at": "/value/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "ConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/head", + "id": "operations/azure-hns/get-if-modified-since-past", "profile": "azure-hns", "lane": "core", - "purpose": "head", + "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": { + "if_modified_since": "Sat, 01 Jan 2000 00:00:00 GMT", "key": "object-tests/read/object.txt", - "op": "head" + "op": "get" }, "exchanges": [ { @@ -69128,7 +70862,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -69146,6 +70880,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": [], @@ -69153,7 +70895,6 @@ "response": { "status": 200, "headers": { - "content-length": "30", "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { @@ -69169,7 +70910,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -69227,21 +70968,29 @@ "" ] } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + } } ], "refusal": null }, { - "id": "operations/azure-hns/head-key-question", + "id": "operations/azure-hns/get-content-encoding-gzip", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"question?mark.txt\"", + "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/keys/question?mark.txt", - "op": "head" + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -69253,7 +71002,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -69261,7 +71010,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -69278,8 +71027,8 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-encoding": "gzip", + "content-md5": "CVsDGvNMZH4SPA4MSLswrA==", "content-type": "application/octet-stream", "date": { "from": "now" @@ -69294,7 +71043,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "H4sIAAAAAAACA0vOzy0oSi0uTk1RyM9TKCgtKsgvTuUCAAHVPIcWAAAA" } } } @@ -69323,7 +71072,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 42 } }, { @@ -69339,7 +71088,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "CVsDGvNMZH4SPA4MSLswrA==" } }, { @@ -69352,21 +71101,37 @@ "" ] } + }, + { + "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-hns/head-key-hash", + "id": "operations/azure-hns/get-content-properties", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"hash#tag.txt\"", + "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/keys/hash#tag.txt", - "op": "head" + "key": "object-tests/read/object.txt", + "op": "get" }, "exchanges": [ { @@ -69378,7 +71143,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -69386,7 +71151,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -69403,9 +71168,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" }, @@ -69419,7 +71186,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -69451,14 +71218,6 @@ "value": 30 } }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "application/octet-stream" - } - }, { "at": "/value/content_md5_base64", "optional": false, @@ -69477,21 +71236,61 @@ "" ] } + }, + { + "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" + } } ], "refusal": null }, { - "id": "operations/azure-hns/head-key-percent", + "id": "operations/azure-hns/get-with-staged-blocks", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"percent%20.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/percent%20.txt", - "op": "head" + "key": "object-tests/multipart/pending.bin", + "op": "get" }, "exchanges": [ { @@ -69503,7 +71302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "HEAD" + "value": "GET" } }, { @@ -69511,7 +71310,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture/object-tests/multipart/pending.bin" } }, { @@ -69528,13 +71327,11 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-5295cdfd25ff\"", + "etag": "\"fixture-ce92c4d48b08\"", "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", @@ -69544,7 +71341,7 @@ }, "body": { "encoding": "base64", - "data": "" + "data": "Zmlyc3RzZWNvbmQ=" } } } @@ -69565,7 +71362,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-ce92c4d48b08\"" } }, { @@ -69573,7 +71370,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -69584,14 +71381,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -69602,20 +71391,28 @@ "" ] } + }, + { + "at": "/value/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Zmlyc3RzZWNvbmQ=" + } } ], "refusal": null }, { - "id": "operations/azure-hns/head-key-plus", + "id": "operations/azure-hns/head-committed-declaring-md5", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"plus+plus.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/plus+plus.txt", + "key": "object-tests/hashes/committed.bin", "op": "head" }, "exchanges": [ @@ -69636,7 +71433,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture/object-tests/hashes/committed.bin" } }, { @@ -69653,13 +71450,13 @@ "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-5295cdfd25ff\"", + "etag": "\"fixture-9a581bc70e20\"", "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", @@ -69690,7 +71487,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-9a581bc70e20\"" } }, { @@ -69698,7 +71495,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 } }, { @@ -69714,7 +71511,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -69732,15 +71529,15 @@ "refusal": null }, { - "id": "operations/azure-hns/head-key-space", + "id": "operations/azure-hns/head-committed", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"space name.txt\"", + "purpose": "head committed", "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/multipart/committed.bin", "op": "head" }, "exchanges": [ @@ -69761,7 +71558,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture/object-tests/multipart/committed.bin" } }, { @@ -69778,13 +71575,12 @@ "response": { "status": 200, "headers": { - "content-length": "30", - "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-length": "11", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-5295cdfd25ff\"", + "etag": "\"fixture-8ec031f3abfa\"", "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", @@ -69815,7 +71611,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-8ec031f3abfa\"" } }, { @@ -69823,7 +71619,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 11 } }, { @@ -69834,14 +71630,6 @@ "value": "application/octet-stream" } }, - { - "at": "/value/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" - } - }, { "at": "/value/version", "optional": true, @@ -69857,15 +71645,15 @@ "refusal": null }, { - "id": "operations/azure-hns/head-key-non-ascii", + "id": "operations/azure-hns/head-metadata", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"café/雪.txt\"", + "purpose": "head metadata", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/café/雪.txt", + "key": "object-tests/metadata/object.txt", "op": "head" }, "exchanges": [ @@ -69886,7 +71674,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object-tests/metadata/object.txt" } }, { @@ -69903,18 +71691,20 @@ "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-5295cdfd25ff\"", + "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": { @@ -69940,7 +71730,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-4d04dba3441e\"" } }, { @@ -69948,7 +71738,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 1 } }, { @@ -69964,7 +71754,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -69977,20 +71767,31 @@ "" ] } + }, + { + "at": "/value/metadata", + "optional": false, + "rule": { + "is": "equal", + "value": { + "name": "value", + "second": "2" + } + } } ], "refusal": null }, { - "id": "operations/azure-hns/head-key-double-slash", + "id": "operations/azure-hns/head-missing", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"double//slash.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/double//slash.txt", + "key": "object-tests/read/absent.txt", "op": "head" }, "exchanges": [ @@ -70011,7 +71812,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/read/absent.txt" } }, { @@ -70026,21 +71827,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-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" + "x-ms-error-code": "BlobNotFound" }, "body": { "encoding": "base64", @@ -70057,66 +71849,137 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": 404 } }, { - "at": "/value/size", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 30 + "value": "BlobNotFound" } }, { - "at": "/value/content_type", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "application/octet-stream" + "value": "not_found" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/head-previous-version", + "profile": "azure-hns", + "lane": "core", + "purpose": "head 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": "head", + "version": "none-1" + }, + "exchanges": [ { - "at": "/value/content_md5_base64", + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/versions-mtypy4jp/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "none-1" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "date": { + "from": "now" + } + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "error" } }, { - "at": "/value/version", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 400 } } ], "refusal": null }, { - "id": "operations/azure-hns/head-key-trailing-slash", + "id": "operations/azure-hns/head-snapshot", "profile": "azure-hns", "lane": "core", - "purpose": "head, with the key \"trailing-slash/\"", + "purpose": "head snapshot", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "key": "object-tests/keys/trailing-slash/", - "op": "head" + "key": "object-tests/snapshots/object.txt", + "op": "head", + "snapshot": "2024-01-01T00:00:00.1577201Z" }, "exchanges": [ { @@ -70136,7 +71999,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/snapshots/object.txt" } }, { @@ -70146,6 +72009,14 @@ "is": "equal", "value": "" } + }, + { + "at": "/query/snapshot", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.1577201Z" + } } ], "allow_headers": [], @@ -70159,7 +72030,8 @@ "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -70195,15 +72067,15 @@ "refusal": null }, { - "id": "operations/azure-hns/head-content-properties", + "id": "operations/azure-hns/head-written-with-crc64", "profile": "azure-hns", "lane": "core", - "purpose": "Return the stored content properties from a HEAD", + "purpose": "head written with crc64", "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/crc64.txt", "op": "head" }, "exchanges": [ @@ -70224,7 +72096,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/hashes/crc64.txt" } }, { @@ -70241,16 +72113,13 @@ "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-5295cdfd25ff\"", + "etag": "\"fixture-bf462a2f52f2\"", "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", @@ -70281,7 +72150,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-5295cdfd25ff\"" + "value": "\"fixture-bf462a2f52f2\"" } }, { @@ -70289,7 +72158,15 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 13 + } + }, + { + "at": "/value/content_type", + "optional": false, + "rule": { + "is": "equal", + "value": "application/octet-stream" } }, { @@ -70297,7 +72174,7 @@ "optional": false, "rule": { "is": "equal", - "value": "H1VC0PNTmj+yaCRN4U931g==" + "value": "N6YZkbg+Lyfxtskwn8iRCg==" } }, { @@ -70310,53 +72187,20 @@ "" ] } - }, - { - "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-hns/head-if-unmodified-since-past", + "id": "operations/azure-hns/head-written-with-md5", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a HEAD with 412 when the object changed after If-Unmodified-Since", + "purpose": "head written with md5", "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", + "key": "object-tests/hashes/md5.txt", "op": "head" }, "exchanges": [ @@ -70377,7 +72221,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/hashes/md5.txt" } }, { @@ -70387,28 +72231,30 @@ "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": "13", + "content-md5": "N6YZkbg+Lyfxtskwn8iRCg==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ConditionNotMet" + "etag": "\"fixture-15ae0acd3480\"", + "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": "empty" + "encoding": "base64", + "data": "" } } } @@ -70421,38 +72267,65 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-15ae0acd3480\"" } }, { - "at": "/code", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "ConditionNotMet" + "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": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/head-copy-status", + "id": "operations/azure-hns/head", "profile": "azure-hns", "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", "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/read/object.txt", "op": "head" }, "exchanges": [ @@ -70473,7 +72346,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -70490,26 +72363,23 @@ "response": { "status": 200, "headers": { - "content-length": "5", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", "content-type": "application/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-16c44f0af72d\"", + "etag": "\"fixture-5295cdfd25ff\"", "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": "empty" + "encoding": "base64", + "data": "" } } } @@ -70526,34 +72396,61 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-5295cdfd25ff\"" } }, { - "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": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/head-access-tier", + "id": "operations/azure-hns/head-key-question", "profile": "azure-hns", "lane": "core", - "purpose": "Report a blob's access tier, which Azure sends in x-ms-access-tier", + "purpose": "head, 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/read/object.txt", + "key": "object-tests/keys/question?mark.txt", "op": "head" }, "exchanges": [ @@ -70574,7 +72471,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -70599,7 +72496,6 @@ }, "etag": "\"fixture-5295cdfd25ff\"", "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", @@ -70625,27 +72521,62 @@ } }, { - "at": "/value/access_tier", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "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, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-after-delete-with-versions", + "id": "operations/azure-hns/head-key-hash", "profile": "azure-hns", "lane": "core", - "purpose": "list after delete with versions", + "purpose": "head, with the key \"hash#tag.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list_page", - "prefix": "object-tests/versions-mtypy4jp/deleted.txt" + "key": "object-tests/keys/hash#tag.txt", + "op": "head" }, "exchanges": [ { @@ -70657,7 +72588,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -70665,7 +72596,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -70675,30 +72606,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-mtypy4jp/deleted.txt" - } } ], "allow_headers": [], @@ -70706,18 +72613,24 @@ "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-5295cdfd25ff\"", "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" }, "body": { - "encoding": "utf8", - "data": "object-tests/versions-mtypy4jp/deleted.txt" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -70733,44 +72646,62 @@ } }, { - "at": "/value/entries", + "at": "/value/etag", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "\"fixture-5295cdfd25ff\"" } }, { - "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": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-bad-marker", + "id": "operations/azure-hns/head-key-percent", "profile": "azure-hns", "lane": "core", - "purpose": "list bad marker", + "purpose": "head, with the key \"percent%20.txt\"", "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/keys/percent%20.txt", + "op": "head" }, "exchanges": [ { @@ -70782,7 +72713,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -70790,7 +72721,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -70800,54 +72731,30 @@ "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", + "content-length": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "InvalidQueryParameterValue" + "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": "" } } } @@ -70860,43 +72767,66 @@ "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": 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, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-bad-marker-code-in-body", + "id": "operations/azure-hns/head-key-plus", "profile": "azure-hns", "lane": "core", - "purpose": "list bad marker, with the error code only in the XML body", + "purpose": "head, with the key \"plus+plus.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": { - "continuation_token": "fixture-marker+/1d52c72a655f=", - "op": "list_page", - "prefix": "object-tests/board/" + "key": "object-tests/keys/plus+plus.txt", + "op": "head" }, "exchanges": [ { @@ -70908,7 +72838,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -70916,7 +72846,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -70926,53 +72856,30 @@ "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", + "content-length": "30", + "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": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "base64", + "data": "" } } } @@ -70985,39 +72892,66 @@ "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": 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, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-container-missing", + "id": "operations/azure-hns/head-key-space", "profile": "azure-hns", "lane": "core", - "purpose": "list container missing. A client reports it as container_not_found: the bucket or container is absent, not the object", + "purpose": "head, with the key \"space name.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list_page", - "prefix": "" + "key": "object-tests/keys/space name.txt", + "op": "head" }, "exchanges": [ { @@ -71029,7 +72963,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -71037,7 +72971,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -71047,46 +72981,30 @@ "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": "30", + "content-md5": "H1VC0PNTmj+yaCRN4U931g==", + "content-type": "application/octet-stream", "date": { "from": "now" }, - "x-ms-error-code": "ContainerNotFound" + "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": "ContainerNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -71099,48 +73017,66 @@ "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": "ContainerNotFound" + "value": 30 } }, { - "at": "/kind", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "container_not_found" + "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, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-delimited", + "id": "operations/azure-hns/head-key-non-ascii", "profile": "azure-hns", "lane": "core", - "purpose": "list delimited", + "purpose": "head, with the key \"café/雪.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "delimiter": "/", - "op": "list_page", - "prefix": "object-tests/board/" + "key": "object-tests/keys/café/雪.txt", + "op": "head" }, "exchanges": [ { @@ -71152,7 +73088,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -71160,7 +73096,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -71170,38 +73106,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/board/" - } - }, - { - "at": "/query/delimiter", - "optional": false, - "rule": { - "is": "equal", - "value": "/" - } } ], "allow_headers": [], @@ -71209,18 +73113,24 @@ "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-5295cdfd25ff\"", "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" }, "body": { - "encoding": "utf8", - "data": "object-tests/board//object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAC3E874Cdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "base64", + "data": "" + } } } ] @@ -71236,107 +73146,39 @@ } }, { - "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-e8a4acb31ab1" - } - }, - { - "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/0/content_md5_base64", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "value": "\"fixture-5295cdfd25ff\"" } }, { - "at": "/value/entries/1/key", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/z.txt" + "value": 30 } }, { - "at": "/value/entries/1/size", + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "application/octet-stream" } }, { - "at": "/value/entries/1/etag", + "at": "/value/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "fixture-0d608f7e2d51" - } - }, - { - "at": "/value/entries/1/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { - "at": "/value/entries/1/version", + "at": "/value/version", "optional": true, "rule": { "is": "one_of", @@ -71345,73 +73187,21 @@ "" ] } - }, - { - "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": "Je0by0I7C3IA9IX8X/ccjg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "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": 1 - } - }, - { - "at": "/value/continuation_token", - "optional": false, - "rule": { - "is": "equal", - "value": "" - } } ], "refusal": null }, { - "id": "operations/azure-hns/list-other-delimiter", + "id": "operations/azure-hns/head-key-double-slash", "profile": "azure-hns", "lane": "core", - "purpose": "Report the 400 DelimiterIsInvalidForHNS that an HNS account answers to any delimiter but /", + "purpose": "head, with the key \"double//slash.txt\"", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "delimiter": "-", - "op": "list_page", - "prefix": "object-tests/dashes/" + "key": "object-tests/keys/double//slash.txt", + "op": "head" }, "exchanges": [ { @@ -71423,7 +73213,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -71431,7 +73221,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -71441,54 +73231,145 @@ "is": "equal", "value": "" } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-length": "30", + "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": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "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": 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, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/head-key-trailing-slash", + "profile": "azure-hns", + "lane": "core", + "purpose": "head, 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": "head" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, - { - "at": "/query/comp", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "HEAD" } }, { - "at": "/query/prefix", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "object-tests/dashes/" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { - "at": "/query/delimiter", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "-" + "value": "" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 404, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "DelimiterIsInvalidForHNS" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "utf8", - "data": "DelimiterIsInvalidForHNSThe only delimiter supported for hierarchical namespace accounts is '/'." + "encoding": "empty" } } } @@ -71509,7 +73390,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 404 } }, { @@ -71517,64 +73398,176 @@ "optional": false, "rule": { "is": "equal", - "value": "DelimiterIsInvalidForHNS" + "value": "BlobNotFound" } } ], - "refusal": [ + "refusal": null + }, + { + "id": "operations/azure-hns/head-content-properties", + "profile": "azure-hns", + "lane": "core", + "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": { + "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": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "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", + "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": "" + } + } + } + ] + } + ], + "expect": [ { "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "refused" + "value": "ok" } }, { - "at": "/kind", + "at": "/value/etag", "optional": false, "rule": { - "is": "matches", - "pattern": ".+" + "is": "equal", + "value": "\"fixture-5295cdfd25ff\"" } }, { - "at": "/parameter", + "at": "/value/size", "optional": false, "rule": { "is": "equal", - "value": "delimiter" + "value": 30 } }, { - "at": "/status", + "at": "/value/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "H1VC0PNTmj+yaCRN4U931g==" } }, { - "at": "/code", + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/content_type", "optional": false, "rule": { "is": "equal", - "value": "DelimiterIsInvalidForHNS" + "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-hns/list-empty", + "id": "operations/azure-hns/head-if-unmodified-since-past", "profile": "azure-hns", "lane": "core", - "purpose": "list empty", + "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" ], "call": { - "op": "list_page", - "prefix": "object-tests/nothing/" + "if_unmodified_since": "Sat, 01 Jan 2000 00:00:00 GMT", + "key": "object-tests/read/object.txt", + "op": "head" }, "exchanges": [ { @@ -71586,7 +73579,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -71594,7 +73587,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -71606,27 +73599,99 @@ } }, { - "at": "/query/restype", + "at": "/headers/if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "container" + "value": "Sat, 01 Jan 2000 00:00:00 GMT" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 412, + "headers": { + "date": { + "from": "now" + }, + "x-ms-error-code": "ConditionNotMet" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "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" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/head-copy-status", + "profile": "azure-hns", + "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", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-properties" + ], + "call": { + "key": "object-tests/copy/target.txt", + "op": "head" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" } }, { - "at": "/query/comp", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "/fixture/object-tests/copy/target.txt" } }, { - "at": "/query/prefix", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "object-tests/nothing/" + "value": "" } } ], @@ -71635,18 +73700,27 @@ "response": { "status": 200, "headers": { - "content-type": "application/xml", + "content-length": "5", + "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-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": "object-tests/nothing/" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -71662,43 +73736,40 @@ } }, { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 - } - }, - { - "at": "/value/prefixes", + "at": "/value/copy_status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "success" } }, { - "at": "/value/continuation_token", + "at": "/value/copy_id", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-all-empty", + "id": "operations/azure-hns/set-properties-all", "profile": "azure-hns", "lane": "core", - "purpose": "list empty", + "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/list-blobs" + "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-properties" ], "call": { - "op": "list", - "prefix": "" + "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": [ { @@ -71710,7 +73781,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -71718,7 +73789,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -71730,27 +73801,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", - "optional": true, + "at": "/headers/x-ms-blob-content-encoding", + "optional": false, "rule": { "is": "equal", - "value": "" + "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" } } ], @@ -71759,26 +73854,15 @@ "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" + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -71794,27 +73878,28 @@ } }, { - "at": "/value/keys", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-encoded-names", + "id": "operations/azure-hns/set-properties", "profile": "azure-hns", "lane": "core", - "purpose": "list encoded names", + "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": [ - "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": { - "op": "list_page", - "prefix": "object-tests/names/" + "content_type": "application/json", + "key": "object-tests/properties/object.txt", + "op": "azure.set_properties" }, "exchanges": [ { @@ -71826,7 +73911,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -71834,7 +73919,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/fixture/object-tests/properties/object.txt" } }, { @@ -71845,28 +73930,20 @@ "value": "" } }, - { - "at": "/query/restype", - "optional": false, - "rule": { - "is": "equal", - "value": "container" - } - }, { "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "list" + "value": "properties" } }, { - "at": "/query/prefix", + "at": "/headers/x-ms-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/" + "value": "application/json" } } ], @@ -71875,18 +73952,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/names/object-tests%2Fnames%2F100%25-%EF%BF%BE-name.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-78b47742a630file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/a&b.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-f951d7d7ec22file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/backMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e64e63e9a87bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/names/back/slash.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e9c0e2dbcfe1file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/café.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7d8cf0126958file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/hash#tag.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-abf3c382e0bafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/percent%20.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7ded7554e543file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/plus+plus.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-235b28f1c86ffile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/q?mark.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb57b84f4392file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" + "encoding": "empty" + } } } ] @@ -71902,627 +73976,924 @@ } }, { - "at": "/value/entries/0/key", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/100%-￾-name.txt" + "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": [ { - "at": "/value/entries/0/size", + "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": 1 + "value": "error" } }, { - "at": "/value/entries/0/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "fixture-78b47742a630" - } - }, - { - "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 - ] + "value": 404 } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "BlobNotFound" } }, { - "at": "/value/entries/1/key", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/a&b.txt" + "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": [ { - "at": "/value/entries/1/size", + "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": 1 + "value": "error" } }, { - "at": "/value/entries/1/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "fixture-f951d7d7ec22" - } - }, - { - "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": 412 } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": "ConditionNotMet" } }, { - "at": "/value/entries/2/key", + "at": "/kind", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/back" + "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": [ { - "at": "/value/entries/2/size", + "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": 0 + "value": "ok" } }, { - "at": "/value/entries/2/etag", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e64e63e9a87b" - } - }, - { - "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, - "" - ] + "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": [ { - "at": "/value/entries/2/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, + "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": "/value/entries/2/directory", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": true + "value": "ok" } }, { - "at": "/value/entries/3/key", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/back/slash.txt" + "value": "\"fixture-etag\"" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/head-access-tier", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report a blob's access tier, which Azure sends in x-ms-access-tier", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "key": "object-tests/read/object.txt", + "op": "head" + }, + "exchanges": [ { - "at": "/value/entries/3/size", + "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": "" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "content-length": "30", + "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-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-server-encrypted": "true" + }, + "body": { + "encoding": "base64", + "data": "" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": "ok" } }, { - "at": "/value/entries/3/etag", + "at": "/value/access_tier", "optional": false, "rule": { "is": "equal", - "value": "fixture-e9c0e2dbcfe1" + "value": "Cool" } - }, - { - "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/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/café.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-7d8cf0126958" - } - }, - { - "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/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/hash#tag.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-abf3c382e0ba" - } - }, - { - "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/5/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-after-delete-with-versions", + "profile": "azure-hns", + "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-mtypy4jp/deleted.txt" + }, + "exchanges": [ { - "at": "/value/entries/6/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/names/percent%20.txt" - } - }, + "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/versions-mtypy4jp/deleted.txt" + } + } + ], + "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/versions-mtypy4jp/deleted.txt" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/6/size", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": "ok" } }, { - "at": "/value/entries/6/etag", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "fixture-7ded7554e543" - } - }, - { - "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 - ] + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/6/content_md5_base64", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/7/key", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/plus+plus.txt" + "value": "" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-bad-marker", + "profile": "azure-hns", + "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": [ { - "at": "/value/entries/7/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, + "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/marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/1d52c72a655f=" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "InvalidQueryParameterValue" + }, + "body": { + "encoding": "utf8", + "data": "InvalidQueryParameterValueFixture error" + } + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/7/etag", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "fixture-235b28f1c86f" - } - }, - { - "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": "error" } }, { - "at": "/value/entries/7/content_md5_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": 400 } }, { - "at": "/value/entries/8/key", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "object-tests/names/q?mark.txt" + "value": "InvalidQueryParameterValue" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-bad-marker-code-in-body", + "profile": "azure-hns", + "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": [ { - "at": "/value/entries/8/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, + "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/marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/1d52c72a655f=" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + } + }, + "body": { + "encoding": "utf8", + "data": "InvalidQueryParameterValueFixture error" + } + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/8/etag", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "fixture-cb57b84f4392" - } - }, - { - "at": "/value/entries/8/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/8/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/8/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "value": "error" } }, { - "at": "/value/entries/8/content_md5_base64", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 9 - } - }, - { - "at": "/value/prefixes", - "optional": false, - "rule": { - "is": "array_length", - "value": 0 + "value": 400 } }, { - "at": "/value/continuation_token", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "InvalidQueryParameterValue" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-xml-escaped", + "id": "operations/azure-hns/list-container-missing", "profile": "azure-hns", "lane": "core", - "purpose": "list xml escaped", + "purpose": "list 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/list-blobs" + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "op": "list", + "op": "list_page", "prefix": "" }, "exchanges": [ @@ -72582,28 +74953,18 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 200, + "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-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": "ContainerNotFound" }, "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YSZhbXA7YjwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+YyZsdDtkPC9OYW1lPjxQcm9wZXJ0aWVzPjxMYXN0LU1vZGlmaWVkPk1vbiwgMDEgSmFuIDIwMjQgMDA6MDA6MDAgR01UPC9MYXN0LU1vZGlmaWVkPjxFdGFnPiJmaXh0dXJlIjwvRXRhZz48Q29udGVudC1MZW5ndGg+NTwvQ29udGVudC1MZW5ndGg+PEJsb2JUeXBlPkJsb2NrQmxvYjwvQmxvYlR5cGU+PC9Qcm9wZXJ0aWVzPjwvQmxvYj48L0Jsb2JzPjxOZXh0TWFya2VyPjwvTmV4dE1hcmtlcj48L0VudW1lcmF0aW9uUmVzdWx0cz4=" - }, - "framing": "chunked" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" + } } } ] @@ -72615,34 +74976,47 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/keys", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [ - "a&b", - "cobject-tests/board/2object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletruefixture-marker+/17aa95c4a402=" + "data": "object-tests/board//object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAC3E874Cdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -72808,7 +75182,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested" + "value": "object-tests/board/z.txt" } }, { @@ -72816,7 +75190,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 2 } }, { @@ -72824,7 +75198,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bcf8c9e06f70" + "value": "fixture-0d608f7e2d51" } }, { @@ -72861,11 +75235,11 @@ } }, { - "at": "/value/entries/1/directory", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -72876,12 +75250,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 } }, { @@ -72889,24 +75271,24 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/17aa95c4a402=" + "value": "" } } ], "refusal": null }, { - "id": "operations/azure-hns/list-page-size-one", + "id": "operations/azure-hns/list-other-delimiter", "profile": "azure-hns", "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": "Report the 400 DelimiterIsInvalidForHNS that an HNS account answers to any delimiter but /", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { + "delimiter": "-", "op": "list_page", - "page_size": 1, - "prefix": "object-tests/board/" + "prefix": "object-tests/dashes/" }, "exchanges": [ { @@ -72958,35 +75340,33 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "object-tests/dashes/" } }, { - "at": "/query/maxresults", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "1" + "value": "-" } } ], "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": "DelimiterIsInvalidForHNS" }, "body": { "encoding": "utf8", - "data": "object-tests/board/1object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletruefixture-marker+/17aa95c4a402=" - }, - "framing": "chunked" + "data": "DelimiterIsInvalidForHNSThe only delimiter supported for hierarchical namespace accounts is '/'." + } } } ] @@ -72998,115 +75378,80 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/entries/0/key", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": 400 } }, { - "at": "/value/entries/0/size", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 8 + "value": "DelimiterIsInvalidForHNS" } - }, + } + ], + "refusal": [ { - "at": "/value/entries/0/etag", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": "fixture-e8a4acb31ab1" - } - }, - { - "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 - ] + "value": "refused" } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/kind", "optional": false, "rule": { - "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "is": "matches", + "pattern": ".+" } }, { - "at": "/value/entries", + "at": "/parameter", "optional": false, "rule": { - "is": "array_length", - "value": 1 + "is": "equal", + "value": "delimiter" } }, { - "at": "/value/prefixes", + "at": "/status", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 400 } }, { - "at": "/value/continuation_token", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "fixture-marker+/17aa95c4a402=" + "value": "DelimiterIsInvalidForHNS" } } - ], - "refusal": null + ] }, { - "id": "operations/azure-hns/list-operation-timed-out", + "id": "operations/azure-hns/list-empty", "profile": "azure-hns", "lane": "core", - "purpose": "Report a 500 OperationTimedOut answer as an error, after at most 5 retries", + "purpose": "list empty", "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": { "op": "list_page", - "page_size": 2, - "prefix": "object-tests/board/" + "prefix": "object-tests/nothing/" }, "exchanges": [ { @@ -73158,37 +75503,81 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "2" + "value": "object-tests/nothing/" } } ], "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/nothing/" + }, + "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-hns/list-all-empty", + "profile": "azure-hns", + "lane": "core", + "purpose": "list empty", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + ], + "call": { + "op": "list", + "prefix": "" + }, + "exchanges": [ { "alternatives": [ { @@ -73235,41 +75624,76 @@ }, { "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "2" + "value": "" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 500, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "OperationTimedOut" + "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": "OperationTimedOutThe operation could not be completed within the permitted time." - } + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" + }, + "framing": "chunked" } } - ], - "optional": true + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, + { + "at": "/value/keys", + "optional": false, + "rule": { + "is": "equal", + "value": [] + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-encoded-names", + "profile": "azure-hns", + "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": [ { @@ -73319,611 +75743,47 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "2" + "value": "object-tests/names/" } } ], "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/names/object-tests%2Fnames%2F100%25-%EF%BF%BE-name.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-78b47742a630file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/a&b.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-f951d7d7ec22file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/backMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e64e63e9a87bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/names/back/slash.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e9c0e2dbcfe1file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/café.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7d8cf0126958file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/hash#tag.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-abf3c382e0bafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/percent%20.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7ded7554e543file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/plus+plus.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-235b28f1c86ffile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/names/q?mark.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb57b84f4392file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } - ], - "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": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 500 - } - }, - { - "at": "/code", - "optional": false, - "rule": { - "is": "equal", - "value": "OperationTimedOut" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-key-equal-to-prefix-delimited", - "profile": "azure-hns", - "lane": "core", - "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/exact" - }, - "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/exact" - } - }, - { - "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/exact/object-tests/exactMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fef6be204aeafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "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-fef6be204aea" - } - }, - { - "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/0/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "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-hns/list-key-equal-to-prefix", - "profile": "azure-hns", - "lane": "core", - "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/exact" - }, - "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/exact" - } - } - ], - "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/exactobject-tests/exactMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fef6be204aeafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } }, { "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/exact" + "value": "object-tests/names/100%-￾-name.txt" } }, { @@ -73939,7 +75799,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-fef6be204aea" + "value": "fixture-78b47742a630" } }, { @@ -73983,201 +75843,12 @@ "value": "xMpCOKC5I4INzFCab3WEmw==" } }, - { - "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-hns/list-many-segments", - "profile": "azure-hns", - "lane": "core", - "purpose": "list many segments", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "op": "list_page", - "prefix": "object-tests/s/" - }, - "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/s/" - } - } - ], - "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/s/object-tests/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a1b39dcffaf3directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8159be643ac0directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-80c8a1f73c94directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7b0fdb4b59dddirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4f1babf5f716directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5f419d87193edirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c32f2de5b421directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-51d97c94b354directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-581e4ea356a1directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5eb2172133aedirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d32c38634d37directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3bdc7f728acbdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a1c17d8d892directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-53277b21dbd0directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-18b5ffb0f548directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2250c2114935directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8ce858fcdc2bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d8660a5bc252directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4ec0409f150bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aede66c75766directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3316748edb9bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-f7f3bc0b3f92directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-6a1f4f7934bfdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-87c3fdda2bdadirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4d2fcc081fd8directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8956db6ae017directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7f1f55a3463bdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-44dd81206643directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-952096734190directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-db4655ce498cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b2a6d305ae63directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-23d914b576fbdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0fe87110b578directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-55cf88c7a2e2directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-6815a7113351directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-70df51065efedirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0e76caa6ea5fdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-97f6d7ad109ddirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b7df38492c3edirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ac2f2336ab74directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c2a19efa033cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b9e90b553fffdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d7c0a17f740directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e1d35759d4acdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1389b2ea70e1directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-11c5ee820f55directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ba489a3d8cb9directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-548645ff94c6directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b21f6737ba6cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-23eb881b6618directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-02c3be7f3363directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-86bca962bd30directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1696791242e8directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b40699a1e1dbdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d3fa18807e94directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d55c43fd1f89directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-989ce64e20d6directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e6b534521353file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" - } - }, - { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/s/s" - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 0 - } - }, - { - "at": "/value/entries/0/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-a1b39dcffaf3" - } - }, - { - "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/0/directory", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, { "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s" + "value": "object-tests/names/a&b.txt" } }, { @@ -74185,7 +75856,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74193,7 +75864,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-8159be643ac0" + "value": "fixture-f951d7d7ec22" } }, { @@ -74230,11 +75901,11 @@ } }, { - "at": "/value/entries/1/directory", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74242,7 +75913,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s" + "value": "object-tests/names/back" } }, { @@ -74258,7 +75929,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-80c8a1f73c94" + "value": "fixture-e64e63e9a87b" } }, { @@ -74307,7 +75978,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s" + "value": "object-tests/names/back/slash.txt" } }, { @@ -74315,7 +75986,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74323,7 +75994,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-7b0fdb4b59dd" + "value": "fixture-e9c0e2dbcfe1" } }, { @@ -74360,11 +76031,11 @@ } }, { - "at": "/value/entries/3/directory", + "at": "/value/entries/3/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74372,7 +76043,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s" + "value": "object-tests/names/café.txt" } }, { @@ -74380,7 +76051,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74388,7 +76059,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-4f1babf5f716" + "value": "fixture-7d8cf0126958" } }, { @@ -74425,11 +76096,11 @@ } }, { - "at": "/value/entries/4/directory", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74437,7 +76108,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s" + "value": "object-tests/names/hash#tag.txt" } }, { @@ -74445,7 +76116,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74453,7 +76124,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-5f419d87193e" + "value": "fixture-abf3c382e0ba" } }, { @@ -74490,11 +76161,11 @@ } }, { - "at": "/value/entries/5/directory", + "at": "/value/entries/5/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74502,7 +76173,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s" + "value": "object-tests/names/percent%20.txt" } }, { @@ -74510,7 +76181,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74518,7 +76189,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-c32f2de5b421" + "value": "fixture-7ded7554e543" } }, { @@ -74555,11 +76226,11 @@ } }, { - "at": "/value/entries/6/directory", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74567,7 +76238,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s" + "value": "object-tests/names/plus+plus.txt" } }, { @@ -74575,7 +76246,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74583,7 +76254,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-51d97c94b354" + "value": "fixture-235b28f1c86f" } }, { @@ -74620,11 +76291,11 @@ } }, { - "at": "/value/entries/7/directory", + "at": "/value/entries/7/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -74632,7 +76303,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s" + "value": "object-tests/names/q?mark.txt" } }, { @@ -74640,7 +76311,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -74648,7 +76319,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-581e4ea356a1" + "value": "fixture-cb57b84f4392" } }, { @@ -74685,169 +76356,291 @@ } }, { - "at": "/value/entries/8/directory", + "at": "/value/entries/8/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/9/key", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s" + "is": "array_length", + "value": 9 } }, { - "at": "/value/entries/9/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 0 } }, { - "at": "/value/entries/9/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-5eb2172133ae" - } - }, - { - "at": "/value/entries/9/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/9/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/9/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/9/directory", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": true + "value": "" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-xml-escaped", + "profile": "azure-hns", + "lane": "core", + "purpose": "list xml escaped", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs" + ], + "call": { + "op": "list", + "prefix": "" + }, + "exchanges": [ { - "at": "/value/entries/10/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s" - } - }, + "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": "/value/entries/10/size", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": 0 + "value": "ok" } }, { - "at": "/value/entries/10/etag", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": "fixture-d32c38634d37" - } - }, - { - "at": "/value/entries/10/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" + "value": [ + "a&b", + "cobject-tests/board/2object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletruefixture-marker+/17aa95c4a402=" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/10/directory", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": true + "value": "ok" } }, { - "at": "/value/entries/11/key", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s" + "value": "object-tests/board/a.txt" } }, { - "at": "/value/entries/11/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 8 } }, { - "at": "/value/entries/11/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-3bdc7f728acb" + "value": "fixture-e8a4acb31ab1" } }, { - "at": "/value/entries/11/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -74858,7 +76651,7 @@ } }, { - "at": "/value/entries/11/version", + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -74869,7 +76662,7 @@ } }, { - "at": "/value/entries/11/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -74880,23 +76673,23 @@ } }, { - "at": "/value/entries/11/directory", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { - "at": "/value/entries/12/key", + "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s" + "value": "object-tests/board/nested" } }, { - "at": "/value/entries/12/size", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", @@ -74904,15 +76697,15 @@ } }, { - "at": "/value/entries/12/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-8a1c17d8d892" + "value": "fixture-bcf8c9e06f70" } }, { - "at": "/value/entries/12/snapshot", + "at": "/value/entries/1/snapshot", "optional": true, "rule": { "is": "one_of", @@ -74923,7 +76716,7 @@ } }, { - "at": "/value/entries/12/version", + "at": "/value/entries/1/version", "optional": true, "rule": { "is": "one_of", @@ -74934,7 +76727,7 @@ } }, { - "at": "/value/entries/12/is_current_version", + "at": "/value/entries/1/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -74945,7 +76738,7 @@ } }, { - "at": "/value/entries/12/directory", + "at": "/value/entries/1/directory", "optional": false, "rule": { "is": "equal", @@ -74953,96 +76746,164 @@ } }, { - "at": "/value/entries/13/key", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" + "is": "array_length", + "value": 2 } }, { - "at": "/value/entries/13/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 0 } }, { - "at": "/value/entries/13/etag", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "fixture-53277b21dbd0" - } - }, - { - "at": "/value/entries/13/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] - } - }, - { - "at": "/value/entries/13/version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "fixture-marker+/17aa95c4a402=" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-page-size-one", + "profile": "azure-hns", + "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/13/is_current_version", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, + "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.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletruefixture-marker+/17aa95c4a402=" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ { - "at": "/value/entries/13/directory", + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": true + "value": "ok" } }, { - "at": "/value/entries/14/key", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" + "value": "object-tests/board/a.txt" } }, { - "at": "/value/entries/14/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 8 } }, { - "at": "/value/entries/14/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-18b5ffb0f548" + "value": "fixture-e8a4acb31ab1" } }, { - "at": "/value/entries/14/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75053,7 +76914,7 @@ } }, { - "at": "/value/entries/14/version", + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -75064,7 +76925,7 @@ } }, { - "at": "/value/entries/14/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75075,104 +76936,702 @@ } }, { - "at": "/value/entries/14/directory", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { - "at": "/value/entries/15/key", + "at": "/value/entries", "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" + "is": "array_length", + "value": 1 } }, { - "at": "/value/entries/15/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 0 } }, { - "at": "/value/entries/15/etag", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "fixture-2250c2114935" + "value": "fixture-marker+/17aa95c4a402=" } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-operation-timed-out", + "profile": "azure-hns", + "lane": "core", + "purpose": "Report a 500 OperationTimedOut answer as an error, after at most 5 retries", + "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" + ], + "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": "/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." + } + } + } + ] }, { - "at": "/value/entries/15/snapshot", - "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 + }, + { + "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": [ + { + "at": "/outcome", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "error" } }, { - "at": "/value/entries/15/version", - "optional": true, + "at": "/status", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": 500 } }, { - "at": "/value/entries/15/is_current_version", - "optional": true, + "at": "/code", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "equal", + "value": "OperationTimedOut" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-key-equal-to-prefix-delimited", + "profile": "azure-hns", + "lane": "core", + "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/exact" + }, + "exchanges": [ { - "at": "/value/entries/15/directory", + "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/exact" + } + }, + { + "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/exact/object-tests/exactMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fef6be204aeafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", "optional": false, "rule": { "is": "equal", - "value": true + "value": "ok" } }, { - "at": "/value/entries/16/key", + "at": "/value/entries/0/key", "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" + "value": "object-tests/exact" } }, { - "at": "/value/entries/16/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { - "at": "/value/entries/16/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-8ce858fcdc2b" + "value": "fixture-fef6be204aea" } }, { - "at": "/value/entries/16/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75183,7 +77642,7 @@ } }, { - "at": "/value/entries/16/version", + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -75194,7 +77653,7 @@ } }, { - "at": "/value/entries/16/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75205,50 +77664,163 @@ } }, { - "at": "/value/entries/16/directory", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/17/key", + "at": "/value/entries", "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" + "is": "array_length", + "value": 1 } }, { - "at": "/value/entries/17/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", + "is": "array_length", "value": 0 } }, { - "at": "/value/entries/17/etag", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "fixture-d8660a5bc252" - } - }, - { - "at": "/value/entries/17/snapshot", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "" } - }, + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-key-equal-to-prefix", + "profile": "azure-hns", + "lane": "core", + "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/exact" + }, + "exchanges": [ { - "at": "/value/entries/17/version", + "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/exact" + } + } + ], + "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/exactobject-tests/exactMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-fef6be204aeafile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "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-fef6be204aea" + } + }, + { + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75259,7 +77831,18 @@ } }, { - "at": "/value/entries/17/is_current_version", + "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", @@ -75270,23 +77853,147 @@ } }, { - "at": "/value/entries/17/directory", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/18/key", + "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": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" + "value": "" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/list-many-segments", + "profile": "azure-hns", + "lane": "core", + "purpose": "list many segments", + "sources": [ + "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/s/" + }, + "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/s/" + } + } + ], + "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/s/object-tests/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a1b39dcffaf3directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8159be643ac0directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-80c8a1f73c94directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7b0fdb4b59dddirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4f1babf5f716directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5f419d87193edirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c32f2de5b421directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-51d97c94b354directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-581e4ea356a1directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5eb2172133aedirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d32c38634d37directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3bdc7f728acbdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a1c17d8d892directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-53277b21dbd0directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-18b5ffb0f548directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2250c2114935directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8ce858fcdc2bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d8660a5bc252directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4ec0409f150bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-aede66c75766directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3316748edb9bdirectory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-f7f3bc0b3f92directory0BlockBlobHottrueunlockedavailabletrueobject-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-6a1f4f7934bfdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-87c3fdda2bdadirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4d2fcc081fd8directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8956db6ae017directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-7f1f55a3463bdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-44dd81206643directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-952096734190directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-db4655ce498cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b2a6d305ae63directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-23d914b576fbdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0fe87110b578directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-55cf88c7a2e2directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-6815a7113351directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-70df51065efedirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0e76caa6ea5fdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-97f6d7ad109ddirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b7df38492c3edirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ac2f2336ab74directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-c2a19efa033cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b9e90b553fffdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d7c0a17f740directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e1d35759d4acdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1389b2ea70e1directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-11c5ee820f55directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ba489a3d8cb9directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-548645ff94c6directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b21f6737ba6cdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-23eb881b6618directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-02c3be7f3363directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-86bca962bd30directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1696791242e8directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-b40699a1e1dbdirectory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d3fa18807e94directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-d55c43fd1f89directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-989ce64e20d6directory0BlockBlobHottrueunlockedavailabletrueobject-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/sMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e6b534521353file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" } }, { - "at": "/value/entries/18/size", + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/s/s" + } + }, + { + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", @@ -75294,15 +78001,15 @@ } }, { - "at": "/value/entries/18/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-4ec0409f150b" + "value": "fixture-a1b39dcffaf3" } }, { - "at": "/value/entries/18/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75313,7 +78020,7 @@ } }, { - "at": "/value/entries/18/version", + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -75324,7 +78031,7 @@ } }, { - "at": "/value/entries/18/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75335,7 +78042,7 @@ } }, { - "at": "/value/entries/18/directory", + "at": "/value/entries/0/directory", "optional": false, "rule": { "is": "equal", @@ -75343,15 +78050,15 @@ } }, { - "at": "/value/entries/19/key", + "at": "/value/entries/1/key", "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" + "value": "object-tests/s/s/s" } }, { - "at": "/value/entries/19/size", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", @@ -75359,15 +78066,15 @@ } }, { - "at": "/value/entries/19/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-aede66c75766" + "value": "fixture-8159be643ac0" } }, { - "at": "/value/entries/19/snapshot", + "at": "/value/entries/1/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75378,7 +78085,7 @@ } }, { - "at": "/value/entries/19/version", + "at": "/value/entries/1/version", "optional": true, "rule": { "is": "one_of", @@ -75389,7 +78096,7 @@ } }, { - "at": "/value/entries/19/is_current_version", + "at": "/value/entries/1/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75400,7 +78107,7 @@ } }, { - "at": "/value/entries/19/directory", + "at": "/value/entries/1/directory", "optional": false, "rule": { "is": "equal", @@ -75408,15 +78115,15 @@ } }, { - "at": "/value/entries/20/key", + "at": "/value/entries/2/key", "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" + "value": "object-tests/s/s/s/s" } }, { - "at": "/value/entries/20/size", + "at": "/value/entries/2/size", "optional": false, "rule": { "is": "equal", @@ -75424,15 +78131,15 @@ } }, { - "at": "/value/entries/20/etag", + "at": "/value/entries/2/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-3316748edb9b" + "value": "fixture-80c8a1f73c94" } }, { - "at": "/value/entries/20/snapshot", + "at": "/value/entries/2/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75443,7 +78150,7 @@ } }, { - "at": "/value/entries/20/version", + "at": "/value/entries/2/version", "optional": true, "rule": { "is": "one_of", @@ -75454,7 +78161,7 @@ } }, { - "at": "/value/entries/20/is_current_version", + "at": "/value/entries/2/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75465,7 +78172,7 @@ } }, { - "at": "/value/entries/20/directory", + "at": "/value/entries/2/directory", "optional": false, "rule": { "is": "equal", @@ -75473,15 +78180,15 @@ } }, { - "at": "/value/entries/21/key", + "at": "/value/entries/3/key", "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" + "value": "object-tests/s/s/s/s/s" } }, { - "at": "/value/entries/21/size", + "at": "/value/entries/3/size", "optional": false, "rule": { "is": "equal", @@ -75489,15 +78196,15 @@ } }, { - "at": "/value/entries/21/etag", + "at": "/value/entries/3/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-f7f3bc0b3f92" + "value": "fixture-7b0fdb4b59dd" } }, { - "at": "/value/entries/21/snapshot", + "at": "/value/entries/3/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75508,7 +78215,7 @@ } }, { - "at": "/value/entries/21/version", + "at": "/value/entries/3/version", "optional": true, "rule": { "is": "one_of", @@ -75519,7 +78226,7 @@ } }, { - "at": "/value/entries/21/is_current_version", + "at": "/value/entries/3/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75530,7 +78237,7 @@ } }, { - "at": "/value/entries/21/directory", + "at": "/value/entries/3/directory", "optional": false, "rule": { "is": "equal", @@ -75538,15 +78245,15 @@ } }, { - "at": "/value/entries/22/key", + "at": "/value/entries/4/key", "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" + "value": "object-tests/s/s/s/s/s/s" } }, { - "at": "/value/entries/22/size", + "at": "/value/entries/4/size", "optional": false, "rule": { "is": "equal", @@ -75554,15 +78261,15 @@ } }, { - "at": "/value/entries/22/etag", + "at": "/value/entries/4/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-6a1f4f7934bf" + "value": "fixture-4f1babf5f716" } }, { - "at": "/value/entries/22/snapshot", + "at": "/value/entries/4/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75573,7 +78280,7 @@ } }, { - "at": "/value/entries/22/version", + "at": "/value/entries/4/version", "optional": true, "rule": { "is": "one_of", @@ -75584,7 +78291,7 @@ } }, { - "at": "/value/entries/22/is_current_version", + "at": "/value/entries/4/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75595,7 +78302,7 @@ } }, { - "at": "/value/entries/22/directory", + "at": "/value/entries/4/directory", "optional": false, "rule": { "is": "equal", @@ -75603,15 +78310,15 @@ } }, { - "at": "/value/entries/23/key", + "at": "/value/entries/5/key", "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" + "value": "object-tests/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/23/size", + "at": "/value/entries/5/size", "optional": false, "rule": { "is": "equal", @@ -75619,15 +78326,15 @@ } }, { - "at": "/value/entries/23/etag", + "at": "/value/entries/5/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-87c3fdda2bda" + "value": "fixture-5f419d87193e" } }, { - "at": "/value/entries/23/snapshot", + "at": "/value/entries/5/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75638,7 +78345,7 @@ } }, { - "at": "/value/entries/23/version", + "at": "/value/entries/5/version", "optional": true, "rule": { "is": "one_of", @@ -75649,7 +78356,7 @@ } }, { - "at": "/value/entries/23/is_current_version", + "at": "/value/entries/5/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75660,7 +78367,7 @@ } }, { - "at": "/value/entries/23/directory", + "at": "/value/entries/5/directory", "optional": false, "rule": { "is": "equal", @@ -75668,15 +78375,15 @@ } }, { - "at": "/value/entries/24/key", + "at": "/value/entries/6/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/24/size", + "at": "/value/entries/6/size", "optional": false, "rule": { "is": "equal", @@ -75684,15 +78391,15 @@ } }, { - "at": "/value/entries/24/etag", + "at": "/value/entries/6/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-4d2fcc081fd8" + "value": "fixture-c32f2de5b421" } }, { - "at": "/value/entries/24/snapshot", + "at": "/value/entries/6/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75703,7 +78410,7 @@ } }, { - "at": "/value/entries/24/version", + "at": "/value/entries/6/version", "optional": true, "rule": { "is": "one_of", @@ -75714,7 +78421,7 @@ } }, { - "at": "/value/entries/24/is_current_version", + "at": "/value/entries/6/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75725,7 +78432,7 @@ } }, { - "at": "/value/entries/24/directory", + "at": "/value/entries/6/directory", "optional": false, "rule": { "is": "equal", @@ -75733,15 +78440,15 @@ } }, { - "at": "/value/entries/25/key", + "at": "/value/entries/7/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/25/size", + "at": "/value/entries/7/size", "optional": false, "rule": { "is": "equal", @@ -75749,15 +78456,15 @@ } }, { - "at": "/value/entries/25/etag", + "at": "/value/entries/7/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-8956db6ae017" + "value": "fixture-51d97c94b354" } }, { - "at": "/value/entries/25/snapshot", + "at": "/value/entries/7/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75768,7 +78475,7 @@ } }, { - "at": "/value/entries/25/version", + "at": "/value/entries/7/version", "optional": true, "rule": { "is": "one_of", @@ -75779,7 +78486,7 @@ } }, { - "at": "/value/entries/25/is_current_version", + "at": "/value/entries/7/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75790,7 +78497,7 @@ } }, { - "at": "/value/entries/25/directory", + "at": "/value/entries/7/directory", "optional": false, "rule": { "is": "equal", @@ -75798,15 +78505,15 @@ } }, { - "at": "/value/entries/26/key", + "at": "/value/entries/8/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/26/size", + "at": "/value/entries/8/size", "optional": false, "rule": { "is": "equal", @@ -75814,15 +78521,15 @@ } }, { - "at": "/value/entries/26/etag", + "at": "/value/entries/8/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-7f1f55a3463b" + "value": "fixture-581e4ea356a1" } }, { - "at": "/value/entries/26/snapshot", + "at": "/value/entries/8/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75833,7 +78540,7 @@ } }, { - "at": "/value/entries/26/version", + "at": "/value/entries/8/version", "optional": true, "rule": { "is": "one_of", @@ -75844,7 +78551,7 @@ } }, { - "at": "/value/entries/26/is_current_version", + "at": "/value/entries/8/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75855,7 +78562,7 @@ } }, { - "at": "/value/entries/26/directory", + "at": "/value/entries/8/directory", "optional": false, "rule": { "is": "equal", @@ -75863,15 +78570,15 @@ } }, { - "at": "/value/entries/27/key", + "at": "/value/entries/9/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/27/size", + "at": "/value/entries/9/size", "optional": false, "rule": { "is": "equal", @@ -75879,15 +78586,15 @@ } }, { - "at": "/value/entries/27/etag", + "at": "/value/entries/9/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-44dd81206643" + "value": "fixture-5eb2172133ae" } }, { - "at": "/value/entries/27/snapshot", + "at": "/value/entries/9/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75898,7 +78605,7 @@ } }, { - "at": "/value/entries/27/version", + "at": "/value/entries/9/version", "optional": true, "rule": { "is": "one_of", @@ -75909,7 +78616,7 @@ } }, { - "at": "/value/entries/27/is_current_version", + "at": "/value/entries/9/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75920,7 +78627,7 @@ } }, { - "at": "/value/entries/27/directory", + "at": "/value/entries/9/directory", "optional": false, "rule": { "is": "equal", @@ -75928,15 +78635,15 @@ } }, { - "at": "/value/entries/28/key", + "at": "/value/entries/10/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/28/size", + "at": "/value/entries/10/size", "optional": false, "rule": { "is": "equal", @@ -75944,15 +78651,15 @@ } }, { - "at": "/value/entries/28/etag", + "at": "/value/entries/10/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-952096734190" + "value": "fixture-d32c38634d37" } }, { - "at": "/value/entries/28/snapshot", + "at": "/value/entries/10/snapshot", "optional": true, "rule": { "is": "one_of", @@ -75963,7 +78670,7 @@ } }, { - "at": "/value/entries/28/version", + "at": "/value/entries/10/version", "optional": true, "rule": { "is": "one_of", @@ -75974,7 +78681,7 @@ } }, { - "at": "/value/entries/28/is_current_version", + "at": "/value/entries/10/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -75985,7 +78692,7 @@ } }, { - "at": "/value/entries/28/directory", + "at": "/value/entries/10/directory", "optional": false, "rule": { "is": "equal", @@ -75993,15 +78700,15 @@ } }, { - "at": "/value/entries/29/key", + "at": "/value/entries/11/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/29/size", + "at": "/value/entries/11/size", "optional": false, "rule": { "is": "equal", @@ -76009,15 +78716,15 @@ } }, { - "at": "/value/entries/29/etag", + "at": "/value/entries/11/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-db4655ce498c" + "value": "fixture-3bdc7f728acb" } }, { - "at": "/value/entries/29/snapshot", + "at": "/value/entries/11/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76028,7 +78735,7 @@ } }, { - "at": "/value/entries/29/version", + "at": "/value/entries/11/version", "optional": true, "rule": { "is": "one_of", @@ -76039,7 +78746,7 @@ } }, { - "at": "/value/entries/29/is_current_version", + "at": "/value/entries/11/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76050,7 +78757,7 @@ } }, { - "at": "/value/entries/29/directory", + "at": "/value/entries/11/directory", "optional": false, "rule": { "is": "equal", @@ -76058,15 +78765,15 @@ } }, { - "at": "/value/entries/30/key", + "at": "/value/entries/12/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/30/size", + "at": "/value/entries/12/size", "optional": false, "rule": { "is": "equal", @@ -76074,15 +78781,15 @@ } }, { - "at": "/value/entries/30/etag", + "at": "/value/entries/12/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b2a6d305ae63" + "value": "fixture-8a1c17d8d892" } }, { - "at": "/value/entries/30/snapshot", + "at": "/value/entries/12/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76093,7 +78800,7 @@ } }, { - "at": "/value/entries/30/version", + "at": "/value/entries/12/version", "optional": true, "rule": { "is": "one_of", @@ -76104,7 +78811,7 @@ } }, { - "at": "/value/entries/30/is_current_version", + "at": "/value/entries/12/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76115,7 +78822,7 @@ } }, { - "at": "/value/entries/30/directory", + "at": "/value/entries/12/directory", "optional": false, "rule": { "is": "equal", @@ -76123,15 +78830,15 @@ } }, { - "at": "/value/entries/31/key", + "at": "/value/entries/13/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/31/size", + "at": "/value/entries/13/size", "optional": false, "rule": { "is": "equal", @@ -76139,15 +78846,15 @@ } }, { - "at": "/value/entries/31/etag", + "at": "/value/entries/13/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-23d914b576fb" + "value": "fixture-53277b21dbd0" } }, { - "at": "/value/entries/31/snapshot", + "at": "/value/entries/13/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76158,7 +78865,7 @@ } }, { - "at": "/value/entries/31/version", + "at": "/value/entries/13/version", "optional": true, "rule": { "is": "one_of", @@ -76169,7 +78876,7 @@ } }, { - "at": "/value/entries/31/is_current_version", + "at": "/value/entries/13/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76180,7 +78887,7 @@ } }, { - "at": "/value/entries/31/directory", + "at": "/value/entries/13/directory", "optional": false, "rule": { "is": "equal", @@ -76188,15 +78895,15 @@ } }, { - "at": "/value/entries/32/key", + "at": "/value/entries/14/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/32/size", + "at": "/value/entries/14/size", "optional": false, "rule": { "is": "equal", @@ -76204,15 +78911,15 @@ } }, { - "at": "/value/entries/32/etag", + "at": "/value/entries/14/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-0fe87110b578" + "value": "fixture-18b5ffb0f548" } }, { - "at": "/value/entries/32/snapshot", + "at": "/value/entries/14/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76223,7 +78930,7 @@ } }, { - "at": "/value/entries/32/version", + "at": "/value/entries/14/version", "optional": true, "rule": { "is": "one_of", @@ -76234,7 +78941,7 @@ } }, { - "at": "/value/entries/32/is_current_version", + "at": "/value/entries/14/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76245,7 +78952,7 @@ } }, { - "at": "/value/entries/32/directory", + "at": "/value/entries/14/directory", "optional": false, "rule": { "is": "equal", @@ -76253,15 +78960,15 @@ } }, { - "at": "/value/entries/33/key", + "at": "/value/entries/15/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/33/size", + "at": "/value/entries/15/size", "optional": false, "rule": { "is": "equal", @@ -76269,15 +78976,15 @@ } }, { - "at": "/value/entries/33/etag", + "at": "/value/entries/15/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-55cf88c7a2e2" + "value": "fixture-2250c2114935" } }, { - "at": "/value/entries/33/snapshot", + "at": "/value/entries/15/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76288,7 +78995,7 @@ } }, { - "at": "/value/entries/33/version", + "at": "/value/entries/15/version", "optional": true, "rule": { "is": "one_of", @@ -76299,7 +79006,7 @@ } }, { - "at": "/value/entries/33/is_current_version", + "at": "/value/entries/15/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76310,7 +79017,7 @@ } }, { - "at": "/value/entries/33/directory", + "at": "/value/entries/15/directory", "optional": false, "rule": { "is": "equal", @@ -76318,15 +79025,15 @@ } }, { - "at": "/value/entries/34/key", + "at": "/value/entries/16/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/34/size", + "at": "/value/entries/16/size", "optional": false, "rule": { "is": "equal", @@ -76334,15 +79041,15 @@ } }, { - "at": "/value/entries/34/etag", + "at": "/value/entries/16/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-6815a7113351" + "value": "fixture-8ce858fcdc2b" } }, { - "at": "/value/entries/34/snapshot", + "at": "/value/entries/16/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76353,7 +79060,7 @@ } }, { - "at": "/value/entries/34/version", + "at": "/value/entries/16/version", "optional": true, "rule": { "is": "one_of", @@ -76364,7 +79071,7 @@ } }, { - "at": "/value/entries/34/is_current_version", + "at": "/value/entries/16/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76375,7 +79082,7 @@ } }, { - "at": "/value/entries/34/directory", + "at": "/value/entries/16/directory", "optional": false, "rule": { "is": "equal", @@ -76383,15 +79090,15 @@ } }, { - "at": "/value/entries/35/key", + "at": "/value/entries/17/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/35/size", + "at": "/value/entries/17/size", "optional": false, "rule": { "is": "equal", @@ -76399,15 +79106,15 @@ } }, { - "at": "/value/entries/35/etag", + "at": "/value/entries/17/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-70df51065efe" + "value": "fixture-d8660a5bc252" } }, { - "at": "/value/entries/35/snapshot", + "at": "/value/entries/17/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76418,7 +79125,7 @@ } }, { - "at": "/value/entries/35/version", + "at": "/value/entries/17/version", "optional": true, "rule": { "is": "one_of", @@ -76429,7 +79136,7 @@ } }, { - "at": "/value/entries/35/is_current_version", + "at": "/value/entries/17/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76440,7 +79147,7 @@ } }, { - "at": "/value/entries/35/directory", + "at": "/value/entries/17/directory", "optional": false, "rule": { "is": "equal", @@ -76448,15 +79155,15 @@ } }, { - "at": "/value/entries/36/key", + "at": "/value/entries/18/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/36/size", + "at": "/value/entries/18/size", "optional": false, "rule": { "is": "equal", @@ -76464,15 +79171,15 @@ } }, { - "at": "/value/entries/36/etag", + "at": "/value/entries/18/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-0e76caa6ea5f" + "value": "fixture-4ec0409f150b" } }, { - "at": "/value/entries/36/snapshot", + "at": "/value/entries/18/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76483,7 +79190,7 @@ } }, { - "at": "/value/entries/36/version", + "at": "/value/entries/18/version", "optional": true, "rule": { "is": "one_of", @@ -76494,7 +79201,7 @@ } }, { - "at": "/value/entries/36/is_current_version", + "at": "/value/entries/18/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76505,7 +79212,7 @@ } }, { - "at": "/value/entries/36/directory", + "at": "/value/entries/18/directory", "optional": false, "rule": { "is": "equal", @@ -76513,15 +79220,15 @@ } }, { - "at": "/value/entries/37/key", + "at": "/value/entries/19/key", "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" + "value": "object-tests/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s/s" } }, { - "at": "/value/entries/37/size", + "at": "/value/entries/19/size", "optional": false, "rule": { "is": "equal", @@ -76529,15 +79236,15 @@ } }, { - "at": "/value/entries/37/etag", + "at": "/value/entries/19/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-97f6d7ad109d" + "value": "fixture-aede66c75766" } }, { - "at": "/value/entries/37/snapshot", + "at": "/value/entries/19/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76548,7 +79255,7 @@ } }, { - "at": "/value/entries/37/version", + "at": "/value/entries/19/version", "optional": true, "rule": { "is": "one_of", @@ -76559,7 +79266,7 @@ } }, { - "at": "/value/entries/37/is_current_version", + "at": "/value/entries/19/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76570,7 +79277,7 @@ } }, { - "at": "/value/entries/37/directory", + "at": "/value/entries/19/directory", "optional": false, "rule": { "is": "equal", @@ -76578,15 +79285,15 @@ } }, { - "at": "/value/entries/38/key", + "at": "/value/entries/20/key", "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" + "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" } }, { - "at": "/value/entries/38/size", + "at": "/value/entries/20/size", "optional": false, "rule": { "is": "equal", @@ -76594,15 +79301,15 @@ } }, { - "at": "/value/entries/38/etag", + "at": "/value/entries/20/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b7df38492c3e" + "value": "fixture-3316748edb9b" } }, { - "at": "/value/entries/38/snapshot", + "at": "/value/entries/20/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76613,7 +79320,7 @@ } }, { - "at": "/value/entries/38/version", + "at": "/value/entries/20/version", "optional": true, "rule": { "is": "one_of", @@ -76624,7 +79331,7 @@ } }, { - "at": "/value/entries/38/is_current_version", + "at": "/value/entries/20/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76635,7 +79342,7 @@ } }, { - "at": "/value/entries/38/directory", + "at": "/value/entries/20/directory", "optional": false, "rule": { "is": "equal", @@ -76643,15 +79350,15 @@ } }, { - "at": "/value/entries/39/key", + "at": "/value/entries/21/key", "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" + "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" } }, { - "at": "/value/entries/39/size", + "at": "/value/entries/21/size", "optional": false, "rule": { "is": "equal", @@ -76659,15 +79366,15 @@ } }, { - "at": "/value/entries/39/etag", + "at": "/value/entries/21/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-ac2f2336ab74" + "value": "fixture-f7f3bc0b3f92" } }, { - "at": "/value/entries/39/snapshot", + "at": "/value/entries/21/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76678,7 +79385,7 @@ } }, { - "at": "/value/entries/39/version", + "at": "/value/entries/21/version", "optional": true, "rule": { "is": "one_of", @@ -76689,7 +79396,7 @@ } }, { - "at": "/value/entries/39/is_current_version", + "at": "/value/entries/21/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76700,7 +79407,7 @@ } }, { - "at": "/value/entries/39/directory", + "at": "/value/entries/21/directory", "optional": false, "rule": { "is": "equal", @@ -76708,15 +79415,15 @@ } }, { - "at": "/value/entries/40/key", + "at": "/value/entries/22/key", "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" + "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" } }, { - "at": "/value/entries/40/size", + "at": "/value/entries/22/size", "optional": false, "rule": { "is": "equal", @@ -76724,15 +79431,15 @@ } }, { - "at": "/value/entries/40/etag", + "at": "/value/entries/22/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-c2a19efa033c" + "value": "fixture-6a1f4f7934bf" } }, { - "at": "/value/entries/40/snapshot", + "at": "/value/entries/22/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76743,7 +79450,7 @@ } }, { - "at": "/value/entries/40/version", + "at": "/value/entries/22/version", "optional": true, "rule": { "is": "one_of", @@ -76754,7 +79461,7 @@ } }, { - "at": "/value/entries/40/is_current_version", + "at": "/value/entries/22/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76765,7 +79472,7 @@ } }, { - "at": "/value/entries/40/directory", + "at": "/value/entries/22/directory", "optional": false, "rule": { "is": "equal", @@ -76773,15 +79480,15 @@ } }, { - "at": "/value/entries/41/key", + "at": "/value/entries/23/key", "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" + "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" } }, { - "at": "/value/entries/41/size", + "at": "/value/entries/23/size", "optional": false, "rule": { "is": "equal", @@ -76789,15 +79496,15 @@ } }, { - "at": "/value/entries/41/etag", + "at": "/value/entries/23/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b9e90b553fff" + "value": "fixture-87c3fdda2bda" } }, { - "at": "/value/entries/41/snapshot", + "at": "/value/entries/23/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76808,7 +79515,7 @@ } }, { - "at": "/value/entries/41/version", + "at": "/value/entries/23/version", "optional": true, "rule": { "is": "one_of", @@ -76819,7 +79526,7 @@ } }, { - "at": "/value/entries/41/is_current_version", + "at": "/value/entries/23/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76830,7 +79537,7 @@ } }, { - "at": "/value/entries/41/directory", + "at": "/value/entries/23/directory", "optional": false, "rule": { "is": "equal", @@ -76838,15 +79545,15 @@ } }, { - "at": "/value/entries/42/key", + "at": "/value/entries/24/key", "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" + "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" } }, { - "at": "/value/entries/42/size", + "at": "/value/entries/24/size", "optional": false, "rule": { "is": "equal", @@ -76854,15 +79561,15 @@ } }, { - "at": "/value/entries/42/etag", + "at": "/value/entries/24/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-0d7c0a17f740" + "value": "fixture-4d2fcc081fd8" } }, { - "at": "/value/entries/42/snapshot", + "at": "/value/entries/24/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76873,7 +79580,7 @@ } }, { - "at": "/value/entries/42/version", + "at": "/value/entries/24/version", "optional": true, "rule": { "is": "one_of", @@ -76884,7 +79591,7 @@ } }, { - "at": "/value/entries/42/is_current_version", + "at": "/value/entries/24/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76895,7 +79602,7 @@ } }, { - "at": "/value/entries/42/directory", + "at": "/value/entries/24/directory", "optional": false, "rule": { "is": "equal", @@ -76903,15 +79610,15 @@ } }, { - "at": "/value/entries/43/key", + "at": "/value/entries/25/key", "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" + "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" } }, { - "at": "/value/entries/43/size", + "at": "/value/entries/25/size", "optional": false, "rule": { "is": "equal", @@ -76919,15 +79626,15 @@ } }, { - "at": "/value/entries/43/etag", + "at": "/value/entries/25/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e1d35759d4ac" + "value": "fixture-8956db6ae017" } }, { - "at": "/value/entries/43/snapshot", + "at": "/value/entries/25/snapshot", "optional": true, "rule": { "is": "one_of", @@ -76938,7 +79645,7 @@ } }, { - "at": "/value/entries/43/version", + "at": "/value/entries/25/version", "optional": true, "rule": { "is": "one_of", @@ -76949,7 +79656,7 @@ } }, { - "at": "/value/entries/43/is_current_version", + "at": "/value/entries/25/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -76960,7 +79667,7 @@ } }, { - "at": "/value/entries/43/directory", + "at": "/value/entries/25/directory", "optional": false, "rule": { "is": "equal", @@ -76968,15 +79675,15 @@ } }, { - "at": "/value/entries/44/key", + "at": "/value/entries/26/key", "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" + "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" } }, { - "at": "/value/entries/44/size", + "at": "/value/entries/26/size", "optional": false, "rule": { "is": "equal", @@ -76984,15 +79691,15 @@ } }, { - "at": "/value/entries/44/etag", + "at": "/value/entries/26/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-1389b2ea70e1" + "value": "fixture-7f1f55a3463b" } }, { - "at": "/value/entries/44/snapshot", + "at": "/value/entries/26/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77003,7 +79710,7 @@ } }, { - "at": "/value/entries/44/version", + "at": "/value/entries/26/version", "optional": true, "rule": { "is": "one_of", @@ -77014,7 +79721,7 @@ } }, { - "at": "/value/entries/44/is_current_version", + "at": "/value/entries/26/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77025,7 +79732,7 @@ } }, { - "at": "/value/entries/44/directory", + "at": "/value/entries/26/directory", "optional": false, "rule": { "is": "equal", @@ -77033,15 +79740,15 @@ } }, { - "at": "/value/entries/45/key", + "at": "/value/entries/27/key", "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" + "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" } }, { - "at": "/value/entries/45/size", + "at": "/value/entries/27/size", "optional": false, "rule": { "is": "equal", @@ -77049,15 +79756,15 @@ } }, { - "at": "/value/entries/45/etag", + "at": "/value/entries/27/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-11c5ee820f55" + "value": "fixture-44dd81206643" } }, { - "at": "/value/entries/45/snapshot", + "at": "/value/entries/27/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77068,7 +79775,7 @@ } }, { - "at": "/value/entries/45/version", + "at": "/value/entries/27/version", "optional": true, "rule": { "is": "one_of", @@ -77079,7 +79786,7 @@ } }, { - "at": "/value/entries/45/is_current_version", + "at": "/value/entries/27/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77090,7 +79797,7 @@ } }, { - "at": "/value/entries/45/directory", + "at": "/value/entries/27/directory", "optional": false, "rule": { "is": "equal", @@ -77098,15 +79805,15 @@ } }, { - "at": "/value/entries/46/key", + "at": "/value/entries/28/key", "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" + "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" } }, { - "at": "/value/entries/46/size", + "at": "/value/entries/28/size", "optional": false, "rule": { "is": "equal", @@ -77114,15 +79821,15 @@ } }, { - "at": "/value/entries/46/etag", + "at": "/value/entries/28/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-ba489a3d8cb9" + "value": "fixture-952096734190" } }, { - "at": "/value/entries/46/snapshot", + "at": "/value/entries/28/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77133,7 +79840,7 @@ } }, { - "at": "/value/entries/46/version", + "at": "/value/entries/28/version", "optional": true, "rule": { "is": "one_of", @@ -77144,7 +79851,7 @@ } }, { - "at": "/value/entries/46/is_current_version", + "at": "/value/entries/28/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77155,7 +79862,7 @@ } }, { - "at": "/value/entries/46/directory", + "at": "/value/entries/28/directory", "optional": false, "rule": { "is": "equal", @@ -77163,15 +79870,15 @@ } }, { - "at": "/value/entries/47/key", + "at": "/value/entries/29/key", "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" + "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" } }, { - "at": "/value/entries/47/size", + "at": "/value/entries/29/size", "optional": false, "rule": { "is": "equal", @@ -77179,15 +79886,15 @@ } }, { - "at": "/value/entries/47/etag", + "at": "/value/entries/29/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-548645ff94c6" + "value": "fixture-db4655ce498c" } }, { - "at": "/value/entries/47/snapshot", + "at": "/value/entries/29/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77198,7 +79905,7 @@ } }, { - "at": "/value/entries/47/version", + "at": "/value/entries/29/version", "optional": true, "rule": { "is": "one_of", @@ -77209,7 +79916,7 @@ } }, { - "at": "/value/entries/47/is_current_version", + "at": "/value/entries/29/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77220,7 +79927,7 @@ } }, { - "at": "/value/entries/47/directory", + "at": "/value/entries/29/directory", "optional": false, "rule": { "is": "equal", @@ -77228,15 +79935,15 @@ } }, { - "at": "/value/entries/48/key", + "at": "/value/entries/30/key", "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" + "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" } }, { - "at": "/value/entries/48/size", + "at": "/value/entries/30/size", "optional": false, "rule": { "is": "equal", @@ -77244,15 +79951,15 @@ } }, { - "at": "/value/entries/48/etag", + "at": "/value/entries/30/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b21f6737ba6c" + "value": "fixture-b2a6d305ae63" } }, { - "at": "/value/entries/48/snapshot", + "at": "/value/entries/30/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77263,7 +79970,7 @@ } }, { - "at": "/value/entries/48/version", + "at": "/value/entries/30/version", "optional": true, "rule": { "is": "one_of", @@ -77274,7 +79981,7 @@ } }, { - "at": "/value/entries/48/is_current_version", + "at": "/value/entries/30/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77285,7 +79992,7 @@ } }, { - "at": "/value/entries/48/directory", + "at": "/value/entries/30/directory", "optional": false, "rule": { "is": "equal", @@ -77293,15 +80000,15 @@ } }, { - "at": "/value/entries/49/key", + "at": "/value/entries/31/key", "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" + "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" } }, { - "at": "/value/entries/49/size", + "at": "/value/entries/31/size", "optional": false, "rule": { "is": "equal", @@ -77309,15 +80016,15 @@ } }, { - "at": "/value/entries/49/etag", + "at": "/value/entries/31/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-23eb881b6618" + "value": "fixture-23d914b576fb" } }, { - "at": "/value/entries/49/snapshot", + "at": "/value/entries/31/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77328,7 +80035,7 @@ } }, { - "at": "/value/entries/49/version", + "at": "/value/entries/31/version", "optional": true, "rule": { "is": "one_of", @@ -77339,7 +80046,7 @@ } }, { - "at": "/value/entries/49/is_current_version", + "at": "/value/entries/31/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77350,7 +80057,7 @@ } }, { - "at": "/value/entries/49/directory", + "at": "/value/entries/31/directory", "optional": false, "rule": { "is": "equal", @@ -77358,15 +80065,15 @@ } }, { - "at": "/value/entries/50/key", + "at": "/value/entries/32/key", "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" + "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" } }, { - "at": "/value/entries/50/size", + "at": "/value/entries/32/size", "optional": false, "rule": { "is": "equal", @@ -77374,15 +80081,15 @@ } }, { - "at": "/value/entries/50/etag", + "at": "/value/entries/32/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-02c3be7f3363" + "value": "fixture-0fe87110b578" } }, { - "at": "/value/entries/50/snapshot", + "at": "/value/entries/32/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77393,7 +80100,7 @@ } }, { - "at": "/value/entries/50/version", + "at": "/value/entries/32/version", "optional": true, "rule": { "is": "one_of", @@ -77404,7 +80111,7 @@ } }, { - "at": "/value/entries/50/is_current_version", + "at": "/value/entries/32/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77415,7 +80122,7 @@ } }, { - "at": "/value/entries/50/directory", + "at": "/value/entries/32/directory", "optional": false, "rule": { "is": "equal", @@ -77423,15 +80130,15 @@ } }, { - "at": "/value/entries/51/key", + "at": "/value/entries/33/key", "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" + "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" } }, { - "at": "/value/entries/51/size", + "at": "/value/entries/33/size", "optional": false, "rule": { "is": "equal", @@ -77439,15 +80146,15 @@ } }, { - "at": "/value/entries/51/etag", + "at": "/value/entries/33/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-86bca962bd30" + "value": "fixture-55cf88c7a2e2" } }, { - "at": "/value/entries/51/snapshot", + "at": "/value/entries/33/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77458,7 +80165,7 @@ } }, { - "at": "/value/entries/51/version", + "at": "/value/entries/33/version", "optional": true, "rule": { "is": "one_of", @@ -77469,7 +80176,7 @@ } }, { - "at": "/value/entries/51/is_current_version", + "at": "/value/entries/33/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77480,7 +80187,7 @@ } }, { - "at": "/value/entries/51/directory", + "at": "/value/entries/33/directory", "optional": false, "rule": { "is": "equal", @@ -77488,15 +80195,15 @@ } }, { - "at": "/value/entries/52/key", + "at": "/value/entries/34/key", "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" + "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" } }, { - "at": "/value/entries/52/size", + "at": "/value/entries/34/size", "optional": false, "rule": { "is": "equal", @@ -77504,15 +80211,15 @@ } }, { - "at": "/value/entries/52/etag", + "at": "/value/entries/34/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-1696791242e8" + "value": "fixture-6815a7113351" } }, { - "at": "/value/entries/52/snapshot", + "at": "/value/entries/34/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77523,7 +80230,7 @@ } }, { - "at": "/value/entries/52/version", + "at": "/value/entries/34/version", "optional": true, "rule": { "is": "one_of", @@ -77534,7 +80241,7 @@ } }, { - "at": "/value/entries/52/is_current_version", + "at": "/value/entries/34/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77545,7 +80252,7 @@ } }, { - "at": "/value/entries/52/directory", + "at": "/value/entries/34/directory", "optional": false, "rule": { "is": "equal", @@ -77553,15 +80260,15 @@ } }, { - "at": "/value/entries/53/key", + "at": "/value/entries/35/key", "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" + "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" } }, { - "at": "/value/entries/53/size", + "at": "/value/entries/35/size", "optional": false, "rule": { "is": "equal", @@ -77569,15 +80276,15 @@ } }, { - "at": "/value/entries/53/etag", + "at": "/value/entries/35/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-b40699a1e1db" + "value": "fixture-70df51065efe" } }, { - "at": "/value/entries/53/snapshot", + "at": "/value/entries/35/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77588,7 +80295,7 @@ } }, { - "at": "/value/entries/53/version", + "at": "/value/entries/35/version", "optional": true, "rule": { "is": "one_of", @@ -77599,7 +80306,7 @@ } }, { - "at": "/value/entries/53/is_current_version", + "at": "/value/entries/35/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77610,7 +80317,7 @@ } }, { - "at": "/value/entries/53/directory", + "at": "/value/entries/35/directory", "optional": false, "rule": { "is": "equal", @@ -77618,15 +80325,15 @@ } }, { - "at": "/value/entries/54/key", + "at": "/value/entries/36/key", "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" + "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" } }, { - "at": "/value/entries/54/size", + "at": "/value/entries/36/size", "optional": false, "rule": { "is": "equal", @@ -77634,15 +80341,15 @@ } }, { - "at": "/value/entries/54/etag", + "at": "/value/entries/36/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-d3fa18807e94" + "value": "fixture-0e76caa6ea5f" } }, { - "at": "/value/entries/54/snapshot", + "at": "/value/entries/36/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77653,7 +80360,7 @@ } }, { - "at": "/value/entries/54/version", + "at": "/value/entries/36/version", "optional": true, "rule": { "is": "one_of", @@ -77664,7 +80371,7 @@ } }, { - "at": "/value/entries/54/is_current_version", + "at": "/value/entries/36/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77675,7 +80382,7 @@ } }, { - "at": "/value/entries/54/directory", + "at": "/value/entries/36/directory", "optional": false, "rule": { "is": "equal", @@ -77683,15 +80390,15 @@ } }, { - "at": "/value/entries/55/key", + "at": "/value/entries/37/key", "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" + "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" } }, { - "at": "/value/entries/55/size", + "at": "/value/entries/37/size", "optional": false, "rule": { "is": "equal", @@ -77699,15 +80406,15 @@ } }, { - "at": "/value/entries/55/etag", + "at": "/value/entries/37/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-d55c43fd1f89" + "value": "fixture-97f6d7ad109d" } }, { - "at": "/value/entries/55/snapshot", + "at": "/value/entries/37/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77718,7 +80425,7 @@ } }, { - "at": "/value/entries/55/version", + "at": "/value/entries/37/version", "optional": true, "rule": { "is": "one_of", @@ -77729,7 +80436,7 @@ } }, { - "at": "/value/entries/55/is_current_version", + "at": "/value/entries/37/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77740,7 +80447,7 @@ } }, { - "at": "/value/entries/55/directory", + "at": "/value/entries/37/directory", "optional": false, "rule": { "is": "equal", @@ -77748,15 +80455,15 @@ } }, { - "at": "/value/entries/56/key", + "at": "/value/entries/38/key", "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" + "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" } }, { - "at": "/value/entries/56/size", + "at": "/value/entries/38/size", "optional": false, "rule": { "is": "equal", @@ -77764,15 +80471,15 @@ } }, { - "at": "/value/entries/56/etag", + "at": "/value/entries/38/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-989ce64e20d6" + "value": "fixture-b7df38492c3e" } }, { - "at": "/value/entries/56/snapshot", + "at": "/value/entries/38/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77783,7 +80490,7 @@ } }, { - "at": "/value/entries/56/version", + "at": "/value/entries/38/version", "optional": true, "rule": { "is": "one_of", @@ -77794,7 +80501,7 @@ } }, { - "at": "/value/entries/56/is_current_version", + "at": "/value/entries/38/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77805,7 +80512,7 @@ } }, { - "at": "/value/entries/56/directory", + "at": "/value/entries/38/directory", "optional": false, "rule": { "is": "equal", @@ -77813,31 +80520,31 @@ } }, { - "at": "/value/entries/57/key", + "at": "/value/entries/39/key", "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" + "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" } }, { - "at": "/value/entries/57/size", + "at": "/value/entries/39/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/57/etag", + "at": "/value/entries/39/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e6b534521353" + "value": "fixture-ac2f2336ab74" } }, { - "at": "/value/entries/57/snapshot", + "at": "/value/entries/39/snapshot", "optional": true, "rule": { "is": "one_of", @@ -77848,7 +80555,7 @@ } }, { - "at": "/value/entries/57/version", + "at": "/value/entries/39/version", "optional": true, "rule": { "is": "one_of", @@ -77859,7 +80566,7 @@ } }, { - "at": "/value/entries/57/is_current_version", + "at": "/value/entries/39/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -77870,338 +80577,104 @@ } }, { - "at": "/value/entries/57/content_md5_base64", + "at": "/value/entries/39/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries", + "at": "/value/entries/40/key", "optional": false, "rule": { - "is": "array_length", - "value": 58 + "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" } }, { - "at": "/value/prefixes", + "at": "/value/entries/40/size", "optional": false, "rule": { - "is": "array_length", + "is": "equal", "value": 0 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/40/etag", "optional": false, "rule": { "is": "equal", - "value": "" - } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-max-keys-zero", - "profile": "azure-hns", - "lane": "core", - "purpose": "list max keys zero", - "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/" - }, - "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/board/" - } - }, - { - "at": "/query/maxresults", - "optional": false, - "rule": { - "is": "equal", - "value": "0" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 400, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "OutOfRangeQueryParameterValue" - }, - "body": { - "encoding": "utf8", - "data": "OutOfRangeQueryParameterValueFixture 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": "OutOfRangeQueryParameterValue" - } - } - ], - "refusal": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": "fixture-c2a19efa033c" } }, { - "at": "/parameter", - "optional": false, + "at": "/value/entries/40/snapshot", + "optional": true, "rule": { - "is": "equal", - "value": "page_size" + "is": "one_of", + "values": [ + null, + "" + ] } }, { - "at": "/status", + "at": "/value/entries/40/version", "optional": true, "rule": { - "is": "equal", - "value": 400 + "is": "one_of", + "values": [ + null, + "" + ] } }, { - "at": "/code", + "at": "/value/entries/40/is_current_version", "optional": true, "rule": { - "is": "equal", - "value": "OutOfRangeQueryParameterValue" + "is": "one_of", + "values": [ + null, + false + ] } - } - ] - }, - { - "id": "operations/azure-hns/list-metadata", - "profile": "azure-hns", - "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": [ - { - "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.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a2cc4a9b7156file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/metadata-listed/shadowed.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3471a2a78a02file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletruex" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + }, { - "at": "/outcome", + "at": "/value/entries/40/directory", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": true } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/41/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/metadata-listed/plain.txt" + "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" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/41/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/41/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-a2cc4a9b7156" + "value": "fixture-b9e90b553fff" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/41/snapshot", "optional": true, "rule": { "is": "one_of", @@ -78212,7 +80685,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/41/version", "optional": true, "rule": { "is": "one_of", @@ -78223,7 +80696,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/41/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -78234,39 +80707,39 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/41/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/42/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/metadata-listed/shadowed.txt" + "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" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/42/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/42/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-3471a2a78a02" + "value": "fixture-0d7c0a17f740" } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/42/snapshot", "optional": true, "rule": { "is": "one_of", @@ -78277,7 +80750,7 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/42/version", "optional": true, "rule": { "is": "one_of", @@ -78288,7 +80761,7 @@ } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/42/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -78299,202 +80772,104 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/42/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries", + "at": "/value/entries/43/key", "optional": false, "rule": { - "is": "array_length", - "value": 2 + "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" } }, { - "at": "/value/prefixes", + "at": "/value/entries/43/size", "optional": false, "rule": { - "is": "array_length", + "is": "equal", "value": 0 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/43/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-e1d35759d4ac" } }, { - "at": "/value/entries/0/metadata", - "optional": false, + "at": "/value/entries/43/snapshot", + "optional": true, "rule": { - "is": "equal", - "value": { - "label": "c" - } + "is": "one_of", + "values": [ + null, + "" + ] } }, { - "at": "/value/entries/1/metadata", - "optional": false, + "at": "/value/entries/43/version", + "optional": true, "rule": { - "is": "equal", - "value": { - "Metadata": "x", - "label": "b" - } + "is": "one_of", + "values": [ + null, + "" + ] } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-next-page", - "profile": "azure-hns", - "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+/17aa95c4a402=", - "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": "/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+/17aa95c4a402=" - } - } - ], - "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+/17aa95c4a402=2object-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/43/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, { - "at": "/outcome", + "at": "/value/entries/43/directory", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": true } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/44/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested/c.txt" + "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" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/44/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/44/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-4125625a1056" + "value": "fixture-1389b2ea70e1" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/44/snapshot", "optional": true, "rule": { "is": "one_of", @@ -78505,7 +80880,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/44/version", "optional": true, "rule": { "is": "one_of", @@ -78516,7 +80891,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/44/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -78527,39 +80902,39 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/44/directory", "optional": false, "rule": { "is": "equal", - "value": "SooI8J03tzeVZJA4QItfMw==" + "value": true } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/45/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/z.txt" + "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" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/45/size", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 0 } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/45/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-0d608f7e2d51" + "value": "fixture-11c5ee820f55" } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/45/snapshot", "optional": true, "rule": { "is": "one_of", @@ -78570,7 +80945,7 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/45/version", "optional": true, "rule": { "is": "one_of", @@ -78581,7 +80956,7 @@ } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/45/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -78592,398 +80967,104 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/45/directory", "optional": false, "rule": { "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" + "value": true } }, { - "at": "/value/entries", + "at": "/value/entries/46/key", "optional": false, "rule": { - "is": "array_length", - "value": 2 + "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" } }, { - "at": "/value/prefixes", + "at": "/value/entries/46/size", "optional": false, "rule": { - "is": "array_length", + "is": "equal", "value": 0 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/46/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-ba489a3d8cb9" } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-pagination", - "profile": "azure-hns", - "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, + "at": "/value/entries/46/snapshot", + "optional": true, "rule": { - "is": "equal", - "value": "ok" + "is": "one_of", + "values": [ + null, + "" + ] } }, { - "at": "/value/keys", - "optional": false, + "at": "/value/entries/46/version", + "optional": true, "rule": { - "is": "equal", - "value": [ - "first", - "second" + "is": "one_of", + "values": [ + null, + "" ] } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-order-delimited", - "profile": "azure-hns", - "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/AMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-033751098c10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/aMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1450d5552b20file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-179d07a80272file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d99f4a9cbbefile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a0Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e5b8569421a3file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2ccf5ed23a16file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/éMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb02153208adfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/46/is_current_version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, { - "at": "/outcome", + "at": "/value/entries/46/directory", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": true } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/47/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/A" + "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" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/47/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/47/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-033751098c10" + "value": "fixture-548645ff94c6" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/47/snapshot", "optional": true, "rule": { "is": "one_of", @@ -78994,7 +81075,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/47/version", "optional": true, "rule": { "is": "one_of", @@ -79005,7 +81086,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/47/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79016,39 +81097,39 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/47/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/48/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a" + "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" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/48/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/48/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-1450d5552b20" + "value": "fixture-b21f6737ba6c" } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/48/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79059,7 +81140,7 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/48/version", "optional": true, "rule": { "is": "one_of", @@ -79070,7 +81151,7 @@ } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/48/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79081,39 +81162,39 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/48/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/2/key", + "at": "/value/entries/49/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a-b" + "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" } }, { - "at": "/value/entries/2/size", + "at": "/value/entries/49/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/2/etag", + "at": "/value/entries/49/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-179d07a80272" + "value": "fixture-23eb881b6618" } }, { - "at": "/value/entries/2/snapshot", + "at": "/value/entries/49/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79124,7 +81205,7 @@ } }, { - "at": "/value/entries/2/version", + "at": "/value/entries/49/version", "optional": true, "rule": { "is": "one_of", @@ -79135,7 +81216,7 @@ } }, { - "at": "/value/entries/2/is_current_version", + "at": "/value/entries/49/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79146,39 +81227,39 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/49/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/50/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a.txt" + "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" } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/50/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/50/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-5d99f4a9cbbe" + "value": "fixture-02c3be7f3363" } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/50/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79189,7 +81270,7 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/50/version", "optional": true, "rule": { "is": "one_of", @@ -79200,7 +81281,7 @@ } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/50/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79211,39 +81292,39 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/50/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/4/key", + "at": "/value/entries/51/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a0" + "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" } }, { - "at": "/value/entries/4/size", + "at": "/value/entries/51/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/4/etag", + "at": "/value/entries/51/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e5b8569421a3" + "value": "fixture-86bca962bd30" } }, { - "at": "/value/entries/4/snapshot", + "at": "/value/entries/51/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79254,7 +81335,7 @@ } }, { - "at": "/value/entries/4/version", + "at": "/value/entries/51/version", "optional": true, "rule": { "is": "one_of", @@ -79265,7 +81346,7 @@ } }, { - "at": "/value/entries/4/is_current_version", + "at": "/value/entries/51/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79276,39 +81357,39 @@ } }, { - "at": "/value/entries/4/content_md5_base64", + "at": "/value/entries/51/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/5/key", + "at": "/value/entries/52/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/b" + "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" } }, { - "at": "/value/entries/5/size", + "at": "/value/entries/52/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/5/etag", + "at": "/value/entries/52/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-2ccf5ed23a16" + "value": "fixture-1696791242e8" } }, { - "at": "/value/entries/5/snapshot", + "at": "/value/entries/52/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79319,7 +81400,7 @@ } }, { - "at": "/value/entries/5/version", + "at": "/value/entries/52/version", "optional": true, "rule": { "is": "one_of", @@ -79330,7 +81411,7 @@ } }, { - "at": "/value/entries/5/is_current_version", + "at": "/value/entries/52/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79341,39 +81422,39 @@ } }, { - "at": "/value/entries/5/content_md5_base64", + "at": "/value/entries/52/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/6/key", + "at": "/value/entries/53/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/é" + "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" } }, { - "at": "/value/entries/6/size", + "at": "/value/entries/53/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/6/etag", + "at": "/value/entries/53/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-cb02153208ad" + "value": "fixture-b40699a1e1db" } }, { - "at": "/value/entries/6/snapshot", + "at": "/value/entries/53/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79384,7 +81465,7 @@ } }, { - "at": "/value/entries/6/version", + "at": "/value/entries/53/version", "optional": true, "rule": { "is": "one_of", @@ -79395,7 +81476,7 @@ } }, { - "at": "/value/entries/6/is_current_version", + "at": "/value/entries/53/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79406,358 +81487,39 @@ } }, { - "at": "/value/entries/6/content_md5_base64", - "optional": false, - "rule": { - "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 7 - } - }, - { - "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-hns/list-order", - "profile": "azure-hns", - "lane": "core", - "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/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/" - } - } - ], - "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/AMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-033751098c10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/aMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1450d5552b20file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-179d07a80272file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d99f4a9cbbefile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a0Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e5b8569421a3file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2ccf5ed23a16file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/éMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb02153208adfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "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-033751098c10" - } - }, - { - "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/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-1450d5552b20" - } - }, - { - "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/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-179d07a80272" - } - }, - { - "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/2/content_md5_base64", + "at": "/value/entries/53/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/54/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a.txt" + "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" } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/54/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/54/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-5d99f4a9cbbe" + "value": "fixture-d3fa18807e94" } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/54/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79768,7 +81530,7 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/54/version", "optional": true, "rule": { "is": "one_of", @@ -79779,7 +81541,7 @@ } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/54/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79790,39 +81552,39 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/54/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/4/key", + "at": "/value/entries/55/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/a0" + "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" } }, { - "at": "/value/entries/4/size", + "at": "/value/entries/55/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/4/etag", + "at": "/value/entries/55/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-e5b8569421a3" + "value": "fixture-d55c43fd1f89" } }, { - "at": "/value/entries/4/snapshot", + "at": "/value/entries/55/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79833,7 +81595,7 @@ } }, { - "at": "/value/entries/4/version", + "at": "/value/entries/55/version", "optional": true, "rule": { "is": "one_of", @@ -79844,7 +81606,7 @@ } }, { - "at": "/value/entries/4/is_current_version", + "at": "/value/entries/55/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79855,39 +81617,39 @@ } }, { - "at": "/value/entries/4/content_md5_base64", + "at": "/value/entries/55/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/5/key", + "at": "/value/entries/56/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/b" + "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" } }, { - "at": "/value/entries/5/size", + "at": "/value/entries/56/size", "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 0 } }, { - "at": "/value/entries/5/etag", + "at": "/value/entries/56/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-2ccf5ed23a16" + "value": "fixture-989ce64e20d6" } }, { - "at": "/value/entries/5/snapshot", + "at": "/value/entries/56/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79898,7 +81660,7 @@ } }, { - "at": "/value/entries/5/version", + "at": "/value/entries/56/version", "optional": true, "rule": { "is": "one_of", @@ -79909,7 +81671,7 @@ } }, { - "at": "/value/entries/5/is_current_version", + "at": "/value/entries/56/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79920,23 +81682,23 @@ } }, { - "at": "/value/entries/5/content_md5_base64", + "at": "/value/entries/56/directory", "optional": false, "rule": { "is": "equal", - "value": "xMpCOKC5I4INzFCab3WEmw==" + "value": true } }, { - "at": "/value/entries/6/key", + "at": "/value/entries/57/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/order/é" + "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" } }, { - "at": "/value/entries/6/size", + "at": "/value/entries/57/size", "optional": false, "rule": { "is": "equal", @@ -79944,15 +81706,15 @@ } }, { - "at": "/value/entries/6/etag", + "at": "/value/entries/57/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-cb02153208ad" + "value": "fixture-e6b534521353" } }, { - "at": "/value/entries/6/snapshot", + "at": "/value/entries/57/snapshot", "optional": true, "rule": { "is": "one_of", @@ -79963,7 +81725,7 @@ } }, { - "at": "/value/entries/6/version", + "at": "/value/entries/57/version", "optional": true, "rule": { "is": "one_of", @@ -79974,7 +81736,7 @@ } }, { - "at": "/value/entries/6/is_current_version", + "at": "/value/entries/57/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -79985,7 +81747,7 @@ } }, { - "at": "/value/entries/6/content_md5_base64", + "at": "/value/entries/57/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -79997,7 +81759,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 7 + "value": 58 } }, { @@ -80020,16 +81782,17 @@ "refusal": null }, { - "id": "operations/azure-hns/list-all-order", + "id": "operations/azure-hns/list-max-keys-zero", "profile": "azure-hns", "lane": "core", - "purpose": "list order", + "purpose": "list max keys zero", "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": "" + "op": "list_page", + "page_size": 0, + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -80078,38 +81841,36 @@ }, { "at": "/query/prefix", - "optional": true, + "optional": false, "rule": { "is": "equal", - "value": "" + "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" }, - "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": "OutOfRangeQueryParameterValue" }, "body": { - "encoding": "base64", - "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YTwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+ejwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" - }, - "framing": "chunked" + "encoding": "utf8", + "data": "OutOfRangeQueryParameterValueFixture error" + } } } ] @@ -80121,34 +81882,83 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/keys", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": [ - "a", - "z" - ] + "value": 400 + } + }, + { + "at": "/code", + "optional": false, + "rule": { + "is": "equal", + "value": "OutOfRangeQueryParameterValue" } } ], - "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": "page_size" + } + }, + { + "at": "/status", + "optional": true, + "rule": { + "is": "equal", + "value": 400 + } + }, + { + "at": "/code", + "optional": true, + "rule": { + "is": "equal", + "value": "OutOfRangeQueryParameterValue" + } + } + ] }, { - "id": "operations/azure-hns/list-page", + "id": "operations/azure-hns/list-metadata", "profile": "azure-hns", "lane": "core", - "purpose": "list page", + "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/board/" + "prefix": "object-tests/metadata-listed/" }, "exchanges": [ { @@ -80200,7 +82010,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/" + "value": "object-tests/metadata-listed/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "metadata" } } ], @@ -80218,7 +82036,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/board/object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/metadata-listed/object-tests/metadata-listed/plain.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-a2cc4a9b7156file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/metadata-listed/shadowed.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3471a2a78a02file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletruex" }, "framing": "chunked" } @@ -80240,7 +82058,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/metadata-listed/plain.txt" } }, { @@ -80248,7 +82066,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -80256,7 +82074,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-e8a4acb31ab1" + "value": "fixture-a2cc4a9b7156" } }, { @@ -80297,7 +82115,7 @@ "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -80305,7 +82123,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested" + "value": "object-tests/metadata-listed/shadowed.txt" } }, { @@ -80313,7 +82131,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -80321,7 +82139,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bcf8c9e06f70" + "value": "fixture-3471a2a78a02" } }, { @@ -80358,15 +82176,178 @@ } }, { - "at": "/value/entries/1/directory", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/2/key", + "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-hns/list-next-page", + "profile": "azure-hns", + "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+/17aa95c4a402=", + "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": "/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+/17aa95c4a402=" + } + } + ], + "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+/17aa95c4a402=2object-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", @@ -80374,7 +82355,7 @@ } }, { - "at": "/value/entries/2/size", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", @@ -80382,7 +82363,7 @@ } }, { - "at": "/value/entries/2/etag", + "at": "/value/entries/0/etag", "optional": false, "rule": { "is": "equal", @@ -80390,7 +82371,7 @@ } }, { - "at": "/value/entries/2/snapshot", + "at": "/value/entries/0/snapshot", "optional": true, "rule": { "is": "one_of", @@ -80401,7 +82382,7 @@ } }, { - "at": "/value/entries/2/version", + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -80412,7 +82393,7 @@ } }, { - "at": "/value/entries/2/is_current_version", + "at": "/value/entries/0/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -80423,7 +82404,7 @@ } }, { - "at": "/value/entries/2/content_md5_base64", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -80431,7 +82412,7 @@ } }, { - "at": "/value/entries/3/key", + "at": "/value/entries/1/key", "optional": false, "rule": { "is": "equal", @@ -80439,7 +82420,7 @@ } }, { - "at": "/value/entries/3/size", + "at": "/value/entries/1/size", "optional": false, "rule": { "is": "equal", @@ -80447,7 +82428,7 @@ } }, { - "at": "/value/entries/3/etag", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", @@ -80455,7 +82436,7 @@ } }, { - "at": "/value/entries/3/snapshot", + "at": "/value/entries/1/snapshot", "optional": true, "rule": { "is": "one_of", @@ -80466,7 +82447,7 @@ } }, { - "at": "/value/entries/3/version", + "at": "/value/entries/1/version", "optional": true, "rule": { "is": "one_of", @@ -80477,7 +82458,7 @@ } }, { - "at": "/value/entries/3/is_current_version", + "at": "/value/entries/1/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -80488,7 +82469,7 @@ } }, { - "at": "/value/entries/3/content_md5_base64", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -80500,7 +82481,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 4 + "value": 2 } }, { @@ -80523,16 +82504,243 @@ "refusal": null }, { - "id": "operations/azure-hns/list-prefix-without-slash", + "id": "operations/azure-hns/list-pagination", "profile": "azure-hns", "lane": "core", - "purpose": "list prefix without slash", + "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-hns/list-order-delimited", + "profile": "azure-hns", + "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/boa" + "prefix": "object-tests/order/" }, "exchanges": [ { @@ -80584,7 +82792,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/boa" + "value": "object-tests/order/" + } + }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" } } ], @@ -80602,7 +82818,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/boaobject-tests/boardMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-113173402488directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/order//object-tests/order/AMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-033751098c10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/aMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1450d5552b20file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-179d07a80272file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d99f4a9cbbefile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a0Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e5b8569421a3file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2ccf5ed23a16file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/éMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb02153208adfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -80624,7 +82840,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board" + "value": "object-tests/order/A" } }, { @@ -80632,7 +82848,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -80640,7 +82856,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-113173402488" + "value": "fixture-033751098c10" } }, { @@ -80677,11 +82893,11 @@ } }, { - "at": "/value/entries/0/directory", + "at": "/value/entries/0/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -80689,7 +82905,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/a.txt" + "value": "object-tests/order/a" } }, { @@ -80697,7 +82913,7 @@ "optional": false, "rule": { "is": "equal", - "value": 8 + "value": 1 } }, { @@ -80705,7 +82921,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-e8a4acb31ab1" + "value": "fixture-1450d5552b20" } }, { @@ -80746,7 +82962,7 @@ "optional": false, "rule": { "is": "equal", - "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -80754,7 +82970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested" + "value": "object-tests/order/a-b" } }, { @@ -80762,7 +82978,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -80770,7 +82986,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bcf8c9e06f70" + "value": "fixture-179d07a80272" } }, { @@ -80807,11 +83023,11 @@ } }, { - "at": "/value/entries/2/directory", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -80819,7 +83035,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/nested/c.txt" + "value": "object-tests/order/a.txt" } }, { @@ -80835,7 +83051,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-4125625a1056" + "value": "fixture-5d99f4a9cbbe" } }, { @@ -80876,7 +83092,7 @@ "optional": false, "rule": { "is": "equal", - "value": "SooI8J03tzeVZJA4QItfMw==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -80884,7 +83100,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/board/z.txt" + "value": "object-tests/order/a0" } }, { @@ -80892,7 +83108,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -80900,7 +83116,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-0d608f7e2d51" + "value": "fixture-e5b8569421a3" } }, { @@ -80941,152 +83157,19 @@ "optional": false, "rule": { "is": "equal", - "value": "Je0by0I7C3IA9IX8X/ccjg==" - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 5 - } - }, - { - "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-hns/list-separator-keys-delimited", - "profile": "azure-hns", - "lane": "core", - "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/separators/" - }, - "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/separators/" - } - }, - { - "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/separators//object-tests/separators/..leadingMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-15c8f76b7db4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD54C650directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dotMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a6559c18a1cfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD3AE784directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD472F18directory0BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ - { - "at": "/outcome", - "optional": false, - "rule": { - "is": "equal", - "value": "ok" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/5/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/..leading" + "value": "object-tests/order/b" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/5/size", "optional": false, "rule": { "is": "equal", @@ -81094,15 +83177,15 @@ } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/5/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-15c8f76b7db4" + "value": "fixture-2ccf5ed23a16" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/5/snapshot", "optional": true, "rule": { "is": "one_of", @@ -81113,7 +83196,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/5/version", "optional": true, "rule": { "is": "one_of", @@ -81124,7 +83207,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/5/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -81135,7 +83218,7 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/5/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -81143,15 +83226,15 @@ } }, { - "at": "/value/entries/1/key", + "at": "/value/entries/6/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/dot" + "value": "object-tests/order/é" } }, { - "at": "/value/entries/1/size", + "at": "/value/entries/6/size", "optional": false, "rule": { "is": "equal", @@ -81159,15 +83242,15 @@ } }, { - "at": "/value/entries/1/etag", + "at": "/value/entries/6/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-8a6559c18a1c" + "value": "fixture-cb02153208ad" } }, { - "at": "/value/entries/1/snapshot", + "at": "/value/entries/6/snapshot", "optional": true, "rule": { "is": "one_of", @@ -81178,7 +83261,7 @@ } }, { - "at": "/value/entries/1/version", + "at": "/value/entries/6/version", "optional": true, "rule": { "is": "one_of", @@ -81189,7 +83272,7 @@ } }, { - "at": "/value/entries/1/is_current_version", + "at": "/value/entries/6/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -81200,7 +83283,7 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -81212,31 +83295,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 - } - }, - { - "at": "/value/prefixes/0", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/a.b/" - } - }, - { - "at": "/value/prefixes/1", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/double/" - } - }, - { - "at": "/value/prefixes/2", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/space /" + "value": 7 } }, { @@ -81244,7 +83303,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 0 } }, { @@ -81259,16 +83318,16 @@ "refusal": null }, { - "id": "operations/azure-hns/list-separator-keys", + "id": "operations/azure-hns/list-order", "profile": "azure-hns", "lane": "core", - "purpose": "list separator keys", + "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/separators/" + "prefix": "object-tests/order/" }, "exchanges": [ { @@ -81320,7 +83379,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/" + "value": "object-tests/order/" } } ], @@ -81338,7 +83397,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/separators/object-tests/separators/..leadingMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-15c8f76b7db4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1647f69dced7directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/cMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-75bdde0ebaf4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dotMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a6559c18a1cfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/doubleMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8e02901b8187directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/slashMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-dffbfc983f10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-978fd2f2d938directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /xMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ddc1aad6dee1file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/order/object-tests/order/AMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-033751098c10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/aMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1450d5552b20file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a-bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-179d07a80272file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d99f4a9cbbefile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/a0Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e5b8569421a3file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2ccf5ed23a16file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/order/éMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-cb02153208adfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -81360,7 +83419,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/..leading" + "value": "object-tests/order/A" } }, { @@ -81376,7 +83435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-15c8f76b7db4" + "value": "fixture-033751098c10" } }, { @@ -81425,7 +83484,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/a.b" + "value": "object-tests/order/a" } }, { @@ -81433,7 +83492,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -81441,7 +83500,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-1647f69dced7" + "value": "fixture-1450d5552b20" } }, { @@ -81478,11 +83537,11 @@ } }, { - "at": "/value/entries/1/directory", + "at": "/value/entries/1/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -81490,7 +83549,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/a.b/c" + "value": "object-tests/order/a-b" } }, { @@ -81506,7 +83565,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-75bdde0ebaf4" + "value": "fixture-179d07a80272" } }, { @@ -81555,7 +83614,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/dot" + "value": "object-tests/order/a.txt" } }, { @@ -81571,7 +83630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-8a6559c18a1c" + "value": "fixture-5d99f4a9cbbe" } }, { @@ -81620,7 +83679,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/double" + "value": "object-tests/order/a0" } }, { @@ -81628,7 +83687,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -81636,7 +83695,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-8e02901b8187" + "value": "fixture-e5b8569421a3" } }, { @@ -81673,11 +83732,11 @@ } }, { - "at": "/value/entries/4/directory", + "at": "/value/entries/4/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": true + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -81685,7 +83744,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/double/slash" + "value": "object-tests/order/b" } }, { @@ -81701,7 +83760,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-dffbfc983f10" + "value": "fixture-2ccf5ed23a16" } }, { @@ -81750,7 +83809,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/separators/space " + "value": "object-tests/order/é" } }, { @@ -81758,7 +83817,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -81766,7 +83825,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-978fd2f2d938" + "value": "fixture-cb02153208ad" } }, { @@ -81803,72 +83862,7 @@ } }, { - "at": "/value/entries/6/directory", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/7/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/separators/space /x" - } - }, - { - "at": "/value/entries/7/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/7/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-ddc1aad6dee1" - } - }, - { - "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/entries/7/content_md5_base64", + "at": "/value/entries/6/content_md5_base64", "optional": false, "rule": { "is": "equal", @@ -81880,7 +83874,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 8 + "value": 7 } }, { @@ -81903,19 +83897,16 @@ "refusal": null }, { - "id": "operations/azure-hns/list-snapshots-after-delete", + "id": "operations/azure-hns/list-all-order", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots after delete", + "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": { - "include": [ - "snapshots" - ], - "op": "list_page", - "prefix": "object-tests/snapshots-all/" + "op": "list", + "prefix": "" }, "exchanges": [ { @@ -81964,18 +83955,10 @@ }, { "at": "/query/prefix", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/snapshots-all/" - } - }, - { - "at": "/query/include", - "optional": false, + "optional": true, "rule": { "is": "equal", - "value": "snapshots" + "value": "" } } ], @@ -81988,12 +83971,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-all/" + "encoding": "base64", + "data": "PEVudW1lcmF0aW9uUmVzdWx0cyBTZXJ2aWNlRW5kcG9pbnQ9Imh0dHA6Ly9maXh0dXJlLyIgQ29udGFpbmVyTmFtZT0iZml4dHVyZSI+PFByZWZpeD48L1ByZWZpeD48QmxvYnM+PEJsb2I+PE5hbWU+YTwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PEJsb2I+PE5hbWU+ejwvTmFtZT48UHJvcGVydGllcz48TGFzdC1Nb2RpZmllZD5Nb24sIDAxIEphbiAyMDI0IDAwOjAwOjAwIEdNVDwvTGFzdC1Nb2RpZmllZD48RXRhZz4iZml4dHVyZSI8L0V0YWc+PENvbnRlbnQtTGVuZ3RoPjU8L0NvbnRlbnQtTGVuZ3RoPjxCbG9iVHlwZT5CbG9ja0Jsb2I8L0Jsb2JUeXBlPjwvUHJvcGVydGllcz48L0Jsb2I+PC9CbG9icz48TmV4dE1hcmtlcj48L05leHRNYXJrZXI+PC9FbnVtZXJhdGlvblJlc3VsdHM+" }, "framing": "chunked" } @@ -82011,46 +84002,30 @@ } }, { - "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", + "at": "/value/keys", "optional": false, "rule": { "is": "equal", - "value": "" + "value": [ + "a", + "z" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/list-snapshots-after-snapshots-deleted", + "id": "operations/azure-hns/list-page", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots after snapshots deleted", + "purpose": "list page", "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/" + "prefix": "object-tests/board/" }, "exchanges": [ { @@ -82102,15 +84077,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots-only/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "snapshots" + "value": "object-tests/board/" } } ], @@ -82128,7 +84095,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots-only/object-tests/snapshots-only/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d8eb33996d7file4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/board/object-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -82150,7 +84117,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots-only/object.txt" + "value": "object-tests/board/a.txt" } }, { @@ -82158,7 +84125,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 8 } }, { @@ -82166,7 +84133,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-5d8eb33996d7" + "value": "fixture-e8a4acb31ab1" } }, { @@ -82207,171 +84174,100 @@ "optional": false, "rule": { "is": "equal", - "value": "TYtghPPRZ7dsrGaiKpG+Ag==" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { - "at": "/value/entries", + "at": "/value/entries/1/key", "optional": false, "rule": { - "is": "array_length", - "value": 1 + "is": "equal", + "value": "object-tests/board/nested" } }, { - "at": "/value/prefixes", + "at": "/value/entries/1/size", "optional": false, "rule": { - "is": "array_length", + "is": "equal", "value": 0 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-bcf8c9e06f70" } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-snapshots-and-versions", - "profile": "azure-hns", - "lane": "core", - "purpose": "list snapshots and versions", - "sources": [ - "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" - ], - "call": { - "include": [ - "snapshots", - "versions" - ], - "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,versions" - } - } - ], - "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.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { - "at": "/outcome", + "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/directory", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": true } }, { - "at": "/value/entries/0/key", + "at": "/value/entries/2/key", "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/board/nested/c.txt" } }, { - "at": "/value/entries/0/size", + "at": "/value/entries/2/size", "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 1 } }, { - "at": "/value/entries/0/etag", + "at": "/value/entries/2/etag", "optional": false, "rule": { "is": "equal", - "value": "fixture-2666f63dbf0b" + "value": "fixture-4125625a1056" } }, { - "at": "/value/entries/0/snapshot", + "at": "/value/entries/2/snapshot", "optional": true, "rule": { "is": "one_of", @@ -82382,7 +84278,7 @@ } }, { - "at": "/value/entries/0/version", + "at": "/value/entries/2/version", "optional": true, "rule": { "is": "one_of", @@ -82393,7 +84289,7 @@ } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/entries/2/is_current_version", "optional": true, "rule": { "is": "one_of", @@ -82404,11 +84300,76 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/2/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": "SooI8J03tzeVZJA4QItfMw==" + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/z.txt" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-0d608f7e2d51" + } + }, + { + "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/3/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -82416,7 +84377,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 1 + "value": 4 } }, { @@ -82439,19 +84400,16 @@ "refusal": null }, { - "id": "operations/azure-hns/list-snapshots", + "id": "operations/azure-hns/list-prefix-without-slash", "profile": "azure-hns", "lane": "core", - "purpose": "list snapshots", + "purpose": "list prefix without slash", "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/" + "prefix": "object-tests/boa" }, "exchanges": [ { @@ -82503,15 +84461,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "snapshots" + "value": "object-tests/boa" } } ], @@ -82529,7 +84479,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/snapshots/object-tests/snapshots/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/boaobject-tests/boardMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-113173402488directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/a.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-e8a4acb31ab1file8application/octet-streamJdVa0oOqQAr0ZMdtcTwHrQ==BlockBlobHottrueunlockedavailabletrueobject-tests/board/nestedMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bcf8c9e06f70directory0BlockBlobHottrueunlockedavailabletrueobject-tests/board/nested/c.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-4125625a1056file1application/octet-streamSooI8J03tzeVZJA4QItfMw==BlockBlobHottrueunlockedavailabletrueobject-tests/board/z.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-0d608f7e2d51file2application/octet-streamJe0by0I7C3IA9IX8X/ccjg==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -82551,7 +84501,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/snapshots/object.txt" + "value": "object-tests/board" } }, { @@ -82559,7 +84509,7 @@ "optional": false, "rule": { "is": "equal", - "value": 3 + "value": 0 } }, { @@ -82567,7 +84517,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-2666f63dbf0b" + "value": "fixture-113173402488" } }, { @@ -82604,384 +84554,271 @@ } }, { - "at": "/value/entries/0/content_md5_base64", + "at": "/value/entries/0/directory", "optional": false, "rule": { "is": "equal", - "value": "uKn3Fdu2T9XFbneDxoIKYQ==" + "value": true } }, { - "at": "/value/entries", + "at": "/value/entries/1/key", "optional": false, "rule": { - "is": "array_length", - "value": 1 + "is": "equal", + "value": "object-tests/board/a.txt" } }, { - "at": "/value/prefixes", + "at": "/value/entries/1/size", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": 8 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/1/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-e8a4acb31ab1" } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-staged-only", - "profile": "azure-hns", - "lane": "core", - "purpose": "list staged only", - "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" - }, - "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/multipart/staged.bin" - } - } - ], - "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/multipart/staged.bin" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/1/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { - "at": "/outcome", + "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": "ok" + "value": "JdVa0oOqQAr0ZMdtcTwHrQ==" } }, { - "at": "/value/entries", + "at": "/value/entries/2/key", "optional": false, "rule": { - "is": "array_length", - "value": 0 + "is": "equal", + "value": "object-tests/board/nested" } }, { - "at": "/value/prefixes", + "at": "/value/entries/2/size", "optional": false, "rule": { - "is": "array_length", + "is": "equal", "value": 0 } }, { - "at": "/value/continuation_token", + "at": "/value/entries/2/etag", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "fixture-bcf8c9e06f70" } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-unauthenticated", - "profile": "azure-hns", - "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": { - "op": "list_page", - "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/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/" - } - } - ], - "allow_headers": [], - "allow_query": [], - "response": { - "status": 401, - "headers": { - "content-type": "application/xml", - "date": { - "from": "now" - }, - "x-ms-error-code": "InvalidAuthenticationInfo" - }, - "body": { - "encoding": "utf8", - "data": "InvalidAuthenticationInfoFixture error" - } - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, { - "at": "/outcome", + "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/2/directory", "optional": false, "rule": { "is": "equal", - "value": "error" + "value": true } }, { - "at": "/status", + "at": "/value/entries/3/key", "optional": false, "rule": { "is": "equal", - "value": 401 + "value": "object-tests/board/nested/c.txt" } }, { - "at": "/code", + "at": "/value/entries/3/size", "optional": false, "rule": { "is": "equal", - "value": "InvalidAuthenticationInfo" + "value": 1 } - } - ], - "refusal": null - }, - { - "id": "operations/azure-hns/list-versions-of-deleted-object", - "profile": "azure-hns", - "lane": "core", - "purpose": "list versions of deleted object", - "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-mtypy4jp/deleted.txt" - }, - "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/versions-mtypy4jp/deleted.txt" - } - }, - { - "at": "/query/include", - "optional": false, - "rule": { - "is": "equal", - "value": "versions" - } - } - ], - "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/versions-mtypy4jp/deleted.txt" - }, - "framing": "chunked" - } - } - ] - } - ], - "expect": [ + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-4125625a1056" + } + }, { - "at": "/outcome", + "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/3/content_md5_base64", "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "SooI8J03tzeVZJA4QItfMw==" + } + }, + { + "at": "/value/entries/4/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/board/z.txt" + } + }, + { + "at": "/value/entries/4/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-0d608f7e2d51" + } + }, + { + "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/4/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Je0by0I7C3IA9IX8X/ccjg==" } }, { @@ -82989,7 +84826,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 5 } }, { @@ -83012,19 +84849,17 @@ "refusal": null }, { - "id": "operations/azure-hns/list-versions", + "id": "operations/azure-hns/list-separator-keys-delimited", "profile": "azure-hns", "lane": "core", - "purpose": "list versions", + "purpose": "list separator keys delimited", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "include": [ - "versions" - ], + "delimiter": "/", "op": "list_page", - "prefix": "object-tests/versions-mtypy4jp/" + "prefix": "object-tests/separators/" }, "exchanges": [ { @@ -83076,15 +84911,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtypy4jp/" + "value": "object-tests/separators/" } }, { - "at": "/query/include", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "versions" + "value": "/" } } ], @@ -83102,7 +84937,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/versions-mtypy4jp/object-tests/versions-mtypy4jp/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bd163fcc78d6file2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/separators//object-tests/separators/..leadingMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-15c8f76b7db4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD54C650directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dotMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a6559c18a1cfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD3AE784directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMT0x8DF10FBAD472F18directory0BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -83124,7 +84959,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions-mtypy4jp/object.txt" + "value": "object-tests/separators/..leading" } }, { @@ -83132,7 +84967,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -83140,7 +84975,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-bd163fcc78d6" + "value": "fixture-15c8f76b7db4" } }, { @@ -83181,7 +85016,72 @@ "optional": false, "rule": { "is": "equal", - "value": "GyZ2GcSBLMRu4oF0eITKUA==" + "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-8a6559c18a1c" + } + }, + { + "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/1/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -83189,7 +85089,31 @@ "optional": false, "rule": { "is": "array_length", - "value": 1 + "value": 2 + } + }, + { + "at": "/value/prefixes/0", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/a.b/" + } + }, + { + "at": "/value/prefixes/1", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/double/" + } + }, + { + "at": "/value/prefixes/2", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/space /" } }, { @@ -83197,7 +85121,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 3 } }, { @@ -83212,16 +85136,16 @@ "refusal": null }, { - "id": "operations/azure-hns/list-written-with-hashes", + "id": "operations/azure-hns/list-separator-keys", "profile": "azure-hns", "lane": "core", - "purpose": "list written with hashes", + "purpose": "list separator keys", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { "op": "list_page", - "prefix": "object-tests/hashes/" + "prefix": "object-tests/separators/" }, "exchanges": [ { @@ -83273,7 +85197,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/" + "value": "object-tests/separators/" } } ], @@ -83291,7 +85215,7 @@ }, "body": { "encoding": "utf8", - "data": "object-tests/hashes/object-tests/hashes/committed.binMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1e5253c0f65afile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1a8d1824b282file13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b064c67c0acfile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" + "data": "object-tests/separators/object-tests/separators/..leadingMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-15c8f76b7db4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.bMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1647f69dced7directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/a.b/cMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-75bdde0ebaf4file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/dotMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8a6559c18a1cfile1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/doubleMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-8e02901b8187directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/double/slashMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-dffbfc983f10file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space Mon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-978fd2f2d938directory0BlockBlobHottrueunlockedavailabletrueobject-tests/separators/space /xMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-ddc1aad6dee1file1application/octet-streamxMpCOKC5I4INzFCab3WEmw==BlockBlobHottrueunlockedavailabletrue" }, "framing": "chunked" } @@ -83313,7 +85237,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/committed.bin" + "value": "object-tests/separators/..leading" } }, { @@ -83321,7 +85245,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -83329,7 +85253,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-1e5253c0f65a" + "value": "fixture-15c8f76b7db4" } }, { @@ -83370,7 +85294,7 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -83378,7 +85302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/hashes/crc64.txt" + "value": "object-tests/separators/a.b" } }, { @@ -83386,7 +85310,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 0 } }, { @@ -83394,7 +85318,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-1a8d1824b282" + "value": "fixture-1647f69dced7" } }, { @@ -83431,27 +85355,19 @@ } }, { - "at": "/value/entries/1/content_md5_base64", + "at": "/value/entries/1/directory", "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": true } }, { - "at": "/value/entries/1/content_crc64_base64", + "at": "/value/entries/2/key", "optional": false, "rule": { "is": "equal", - "value": "9XBvAwWoR9o=" - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/hashes/md5.txt" + "value": "object-tests/separators/a.b/c" } }, { @@ -83459,7 +85375,7 @@ "optional": false, "rule": { "is": "equal", - "value": 13 + "value": 1 } }, { @@ -83467,7 +85383,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-3b064c67c0ac" + "value": "fixture-75bdde0ebaf4" } }, { @@ -83508,7 +85424,332 @@ "optional": false, "rule": { "is": "equal", - "value": "N6YZkbg+Lyfxtskwn8iRCg==" + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/3/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/dot" + } + }, + { + "at": "/value/entries/3/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/3/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-8a6559c18a1c" + } + }, + { + "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/3/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/4/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/double" + } + }, + { + "at": "/value/entries/4/size", + "optional": false, + "rule": { + "is": "equal", + "value": 0 + } + }, + { + "at": "/value/entries/4/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-8e02901b8187" + } + }, + { + "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/4/directory", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/5/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/double/slash" + } + }, + { + "at": "/value/entries/5/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/5/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-dffbfc983f10" + } + }, + { + "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/5/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" + } + }, + { + "at": "/value/entries/6/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/space " + } + }, + { + "at": "/value/entries/6/size", + "optional": false, + "rule": { + "is": "equal", + "value": 0 + } + }, + { + "at": "/value/entries/6/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-978fd2f2d938" + } + }, + { + "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/6/directory", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/7/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/separators/space /x" + } + }, + { + "at": "/value/entries/7/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/7/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-ddc1aad6dee1" + } + }, + { + "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/entries/7/content_md5_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "xMpCOKC5I4INzFCab3WEmw==" } }, { @@ -83516,7 +85757,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 8 } }, { @@ -83539,17 +85780,19 @@ "refusal": null }, { - "id": "operations/azure-hns/put-container-missing", + "id": "operations/azure-hns/list-snapshots-after-delete", "profile": "azure-hns", "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 snapshots after delete", "sources": [ "azure-sdk-for-cpp/sdk/storage/azure-storage-blobs/src/blob_rest_client.cpp" ], "call": { - "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", - "key": "object.txt", - "op": "put" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots-all/" }, "exchanges": [ { @@ -83561,7 +85804,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -83569,7 +85812,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object.txt" + "value": "/fixture" } }, { @@ -83577,35 +85820,59 @@ "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/snapshots-all/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "snapshots" } } ], - "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/snapshots-all/" + }, + "framing": "chunked" } } ] @@ -83617,52 +85884,50 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": 404 + "is": "array_length", + "value": 0 } }, { - "at": "/code", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": "ContainerNotFound" + "is": "array_length", + "value": 0 } }, { - "at": "/kind", + "at": "/value/continuation_token", "optional": false, "rule": { "is": "equal", - "value": "container_not_found" + "value": "" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-crc64-mismatch", + "id": "operations/azure-hns/list-snapshots-after-snapshots-deleted", "profile": "azure-hns", "lane": "core", - "purpose": "put crc64 mismatch", + "purpose": "list snapshots after snapshots deleted", "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" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots-only/" }, "exchanges": [ { @@ -83674,7 +85939,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -83682,7 +85947,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" + "value": "/fixture" } }, { @@ -83690,43 +85955,59 @@ "optional": false, "rule": { "is": "equal", - "value": "ZGVjbGFyZWQtYm9keQ==" + "value": "" } }, { - "at": "/headers/x-ms-content-crc64", + "at": "/query/restype", "optional": false, "rule": { "is": "equal", - "value": "khqMBK+EUSA=" + "value": "container" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "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": 400, + "status": 200, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "Crc64Mismatch" + "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": "Crc64MismatchFixture error" - } + "data": "object-tests/snapshots-only/object-tests/snapshots-only/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-5d8eb33996d7file4application/octet-streamTYtghPPRZ7dsrGaiKpG+Ag==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -83738,40 +86019,116 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "object-tests/snapshots-only/object.txt" } }, { - "at": "/code", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": "Crc64Mismatch" + "value": 4 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-5d8eb33996d7" + } + }, + { + "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/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-hns/put-created-empty", + "id": "operations/azure-hns/list-snapshots-and-versions", "profile": "azure-hns", "lane": "core", - "purpose": "put created empty", + "purpose": "list snapshots and versions", "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" + "include": [ + "snapshots", + "versions" + ], + "op": "list_page", + "prefix": "object-tests/snapshots/" }, "exchanges": [ { @@ -83783,7 +86140,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -83791,7 +86148,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/empty.bin" + "value": "/fixture" } }, { @@ -83803,34 +86160,55 @@ } }, { - "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": "1B2M2Y8AsgTpgAmY7PhCfg==", + "content-type": "application/xml", "date": { "from": "now" }, - "etag": "\"fixture-9373f0410116\"", "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": "object-tests/snapshots/object-tests/snapshots/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -83846,15 +86224,42 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-9373f0410116\"" + "value": "object-tests/snapshots/object.txt" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-2666f63dbf0b" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -83863,22 +86268,67 @@ "" ] } + }, + { + "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": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "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-hns/put-created", + "id": "operations/azure-hns/list-snapshots", "profile": "azure-hns", "lane": "core", - "purpose": "put created", + "purpose": "list snapshots", "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" + "include": [ + "snapshots" + ], + "op": "list_page", + "prefix": "object-tests/snapshots/" }, "exchanges": [ { @@ -83890,7 +86340,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -83898,7 +86348,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/write/object.txt" + "value": "/fixture" } }, { @@ -83906,38 +86356,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" } } ], - "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/snapshots/object-tests/snapshots/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-2666f63dbf0bfile3application/octet-streamuKn3Fdu2T9XFbneDxoIKYQ==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -83953,15 +86424,42 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": "object-tests/snapshots/object.txt" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 3 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-2666f63dbf0b" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -83970,22 +86468,64 @@ "" ] } + }, + { + "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": "uKn3Fdu2T9XFbneDxoIKYQ==" + } + }, + { + "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-hns/put-created-key-question", + "id": "operations/azure-hns/list-staged-only", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"question?mark.txt\"", + "purpose": "list staged only", "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" + "op": "list_page", + "prefix": "object-tests/multipart/staged.bin" }, "exchanges": [ { @@ -83997,7 +86537,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -84005,7 +86545,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/question?mark.txt" + "value": "/fixture" } }, { @@ -84013,38 +86553,51 @@ "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/multipart/staged.bin" } } ], - "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/multipart/staged.bin" + }, + "framing": "chunked" } } ] @@ -84060,39 +86613,43 @@ } }, { - "at": "/value/etag", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-bf139483d631\"" + "is": "array_length", + "value": 0 } }, { - "at": "/value/version", - "optional": true, + "at": "/value/prefixes", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-hash", + "id": "operations/azure-hns/list-unauthenticated", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"hash#tag.txt\"", + "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": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/hash#tag.txt", - "op": "put" + "op": "list_page", + "prefix": "object-tests/" }, "exchanges": [ { @@ -84104,7 +86661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -84112,7 +86669,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/hash#tag.txt" + "value": "/fixture" } }, { @@ -84120,37 +86677,48 @@ "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/" } } ], - "allow_headers": [ - "content-type" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 401, "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": "InvalidAuthenticationInfo" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "InvalidAuthenticationInfoFixture error" } } } @@ -84163,43 +86731,42 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/etag", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "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/put-created-key-percent", + "id": "operations/azure-hns/list-versions-of-deleted-object", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"percent%20.txt\"", + "purpose": "list versions of deleted object", "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" + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions-mtypy4jp/deleted.txt" }, "exchanges": [ { @@ -84211,7 +86778,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -84219,7 +86786,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/percent%20.txt" + "value": "/fixture" } }, { @@ -84227,38 +86794,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" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 201, - "headers": { - "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "list" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions-mtypy4jp/deleted.txt" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "versions" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 200, + "headers": { + "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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/versions-mtypy4jp/deleted.txt" + }, + "framing": "chunked" } } ] @@ -84274,39 +86862,46 @@ } }, { - "at": "/value/etag", + "at": "/value/entries", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-bf139483d631\"" + "is": "array_length", + "value": 0 } }, { - "at": "/value/version", - "optional": true, + "at": "/value/prefixes", + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "array_length", + "value": 0 + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-plus", + "id": "operations/azure-hns/list-versions", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"plus+plus.txt\"", + "purpose": "list versions", "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" + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions-mtypy4jp/" }, "exchanges": [ { @@ -84318,7 +86913,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -84326,7 +86921,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/plus+plus.txt" + "value": "/fixture" } }, { @@ -84334,38 +86929,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/versions-mtypy4jp/" + } + }, + { + "at": "/query/include", + "optional": false, + "rule": { + "is": "equal", + "value": "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/versions-mtypy4jp/object-tests/versions-mtypy4jp/object.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-bd163fcc78d6file2application/octet-streamGyZ2GcSBLMRu4oF0eITKUA==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -84381,15 +86997,42 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": "object-tests/versions-mtypy4jp/object.txt" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-bd163fcc78d6" + } + }, + { + "at": "/value/entries/0/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/0/version", "optional": true, "rule": { "is": "one_of", @@ -84398,22 +87041,64 @@ "" ] } + }, + { + "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": "GyZ2GcSBLMRu4oF0eITKUA==" + } + }, + { + "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-hns/put-created-key-space", + "id": "operations/azure-hns/list-written-with-hashes", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"space name.txt\"", + "purpose": "list written with hashes", "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" + "op": "list_page", + "prefix": "object-tests/hashes/" }, "exchanges": [ { @@ -84425,7 +87110,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -84433,7 +87118,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/space name.txt" + "value": "/fixture" } }, { @@ -84441,38 +87126,51 @@ "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/hashes/" } } ], - "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-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-creation-time": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "base64", - "data": "" - } + "encoding": "utf8", + "data": "object-tests/hashes/object-tests/hashes/committed.binMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1e5253c0f65afile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/crc64.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-1a8d1824b282file13application/octet-stream9XBvAwWoR9o=N6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrueobject-tests/hashes/md5.txtMon, 01 Jan 2024 00:00:00 GMTMon, 01 Jan 2024 00:00:00 GMTfixture-3b064c67c0acfile13application/octet-streamN6YZkbg+Lyfxtskwn8iRCg==BlockBlobHottrueunlockedavailabletrue" + }, + "framing": "chunked" } } ] @@ -84488,15 +87186,180 @@ } }, { - "at": "/value/etag", + "at": "/value/entries/0/key", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-bf139483d631\"" + "value": "object-tests/hashes/committed.bin" } }, { - "at": "/value/version", + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 13 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-1e5253c0f65a" + } + }, + { + "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/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-1a8d1824b282" + } + }, + { + "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/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-3b064c67c0ac" + } + }, + { + "at": "/value/entries/2/snapshot", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + }, + { + "at": "/value/entries/2/version", "optional": true, "rule": { "is": "one_of", @@ -84505,21 +87368,64 @@ "" ] } + }, + { + "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": "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-hns/put-created-key-non-ascii", + "id": "operations/azure-hns/put-container-missing", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"café/雪.txt\"", + "purpose": "put 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": { - "body_base64": "MDEyMzQ1Njc4OQ==", - "key": "object-tests/keys/café/雪.txt", + "body_base64": "bm90aGluZyBpcyBzdG9yZWQ=", + "key": "object.txt", "op": "put" }, "exchanges": [ @@ -84540,7 +87446,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/café/雪.txt" + "value": "/fixture/object.txt" } }, { @@ -84548,7 +87454,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "bm90aGluZyBpcyBzdG9yZWQ=" } }, { @@ -84565,20 +87471,17 @@ ], "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": "ContainerNotFound" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "ContainerNotFoundFixture error" } } } @@ -84591,42 +87494,51 @@ "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": "ContainerNotFound" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "container_not_found" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-double-slash", + "id": "operations/azure-hns/put-crc64-mismatch", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"double//slash.txt\"", + "purpose": "put crc64 mismatch", "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", + "body_base64": "ZGVjbGFyZWQtYm9keQ==", + "checksum": { + "algorithm": "azure_crc64", + "value_base64": "khqMBK+EUSA=" + }, + "key": "object-tests/hashes/crc64-mismatch.txt", "op": "put" }, "exchanges": [ @@ -84647,7 +87559,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/double//slash.txt" + "value": "/fixture/object-tests/hashes/crc64-mismatch.txt" } }, { @@ -84655,7 +87567,15 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "ZGVjbGFyZWQtYm9keQ==" + } + }, + { + "at": "/headers/x-ms-content-crc64", + "optional": false, + "rule": { + "is": "equal", + "value": "khqMBK+EUSA=" } }, { @@ -84672,20 +87592,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": "Crc64Mismatch" }, "body": { - "encoding": "base64", - "data": "" + "encoding": "utf8", + "data": "Crc64MismatchFixture error" } } } @@ -84698,42 +87615,39 @@ "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": "Crc64Mismatch" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-created-key-trailing-slash", + "id": "operations/azure-hns/put-created-empty", "profile": "azure-hns", "lane": "core", - "purpose": "put created, with the key \"trailing-slash/\"", + "purpose": "put created empty", "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/", + "body_base64": "", + "key": "object-tests/write/empty.bin", "op": "put" }, "exchanges": [ @@ -84754,7 +87668,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/keys/trailing-slash/" + "value": "/fixture/object-tests/write/empty.bin" } }, { @@ -84762,7 +87676,7 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OQ==" + "value": "" } }, { @@ -84779,17 +87693,20 @@ ], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "1B2M2Y8AsgTpgAmY7PhCfg==", "date": { "from": "now" }, - "x-ms-error-code": "InvalidUri" + "etag": "\"fixture-9373f0410116\"", + "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": "" } } } @@ -84802,40 +87719,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "\"fixture-9373f0410116\"" } }, { - "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/copy-missing-source", + "id": "operations/azure-hns/put-created", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a copy whose source does not exist", + "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/absent.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/write/object.txt", + "op": "put" }, "exchanges": [ { @@ -84855,7 +87775,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/write/object.txt" } }, { @@ -84863,32 +87783,37 @@ "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/absent\\.txt" + "is": "equal", + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 404, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "BlobNotFound" + "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": "utf8", - "data": "BlobNotFoundFixture error" + "encoding": "base64", + "data": "" } } } @@ -84901,40 +87826,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 404 + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "BlobNotFound" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy", + "id": "operations/azure-hns/put-created-key-question", "profile": "azure-hns", "lane": "core", - "purpose": "Copy an object to another key in the same container", + "purpose": "put created, with the key \"question?mark.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": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/question?mark.txt", + "op": "put" }, "exchanges": [ { @@ -84954,7 +87882,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/question?mark.txt" } }, { @@ -84962,33 +87890,37 @@ "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-bf139483d631\"", "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" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -85005,31 +87937,39 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-replace-metadata", + "id": "operations/azure-hns/put-created-key-hash", "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": "put created, with the key \"hash#tag.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": { - "key": "object-tests/copy/target.txt", - "metadata": { - "colour": "blue" - }, - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/hash#tag.txt", + "op": "put" }, "exchanges": [ { @@ -85049,7 +87989,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/hash#tag.txt" } }, { @@ -85057,41 +87997,37 @@ "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-meta-colour", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "blue" + "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-bf139483d631\"", "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" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -85108,29 +88044,39 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-if-match", + "id": "operations/azure-hns/put-created-key-percent", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob only if the source still has this ETag, named in x-ms-source-if-match", + "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" ], "call": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_match": "\"fixture-etag\"", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/percent%20.txt", + "op": "put" }, "exchanges": [ { @@ -85150,7 +88096,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/percent%20.txt" } }, { @@ -85158,41 +88104,37 @@ "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-source-if-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "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-bf139483d631\"", "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" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -85209,29 +88151,39 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-if-match-failed", + "id": "operations/azure-hns/put-created-key-plus", "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": "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": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_if_match": "\"fixture-0123456789ab\"", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/plus+plus.txt", + "op": "put" }, "exchanges": [ { @@ -85251,7 +88203,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/plus+plus.txt" } }, { @@ -85259,40 +88211,37 @@ "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-source-if-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0123456789ab\"" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "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": "utf8", - "data": "SourceConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -85305,41 +88254,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "SourceConditionNotMet" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-if-unmodified-since-failed", + "id": "operations/azure-hns/put-created-key-space", "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": "put created, with the key \"space name.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": { - "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" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/space name.txt", + "op": "put" }, "exchanges": [ { @@ -85359,7 +88310,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/space name.txt" } }, { @@ -85367,40 +88318,37 @@ "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-source-if-unmodified-since", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 412, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "SourceConditionNotMet" + "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": "utf8", - "data": "SourceConditionNotMetFixture error" + "encoding": "base64", + "data": "" } } } @@ -85413,41 +88361,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 412 + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "SourceConditionNotMet" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-if-none-match-exists", + "id": "operations/azure-hns/put-created-key-non-ascii", "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": "put created, with the key \"café/雪.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": { - "if_none_match": "*", - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/café/雪.txt", + "op": "put" }, "exchanges": [ { @@ -85467,7 +88417,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/café/雪.txt" } }, { @@ -85475,40 +88425,37 @@ "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/if-none-match", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "*" + "value": "BlockBlob" } } ], - "allow_headers": [], + "allow_headers": [ + "content-type" + ], "allow_query": [], "response": { - "status": 409, + "status": 201, "headers": { - "content-type": "application/xml", + "content-md5": "eB5eJF1ptWaXm4bijSPyxw==", "date": { "from": "now" }, - "x-ms-error-code": "BlobAlreadyExists" + "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": "utf8", - "data": "BlobAlreadyExistsFixture error" + "encoding": "base64", + "data": "" } } } @@ -85521,41 +88468,43 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 409 + "value": "\"fixture-bf139483d631\"" } }, { - "at": "/code", - "optional": false, + "at": "/value/version", + "optional": true, "rule": { - "is": "equal", - "value": "BlobAlreadyExists" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-across-containers", + "id": "operations/azure-hns/put-created-key-double-slash", "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": "put created, with the key \"double//slash.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": { - "key": "object-tests/copy/target.txt", - "op": "copy", - "source_container": "source", - "source_key": "object-tests/copy/source.txt" + "body_base64": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/double//slash.txt", + "op": "put" }, "exchanges": [ { @@ -85575,7 +88524,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/double//slash.txt" } }, { @@ -85583,33 +88532,37 @@ "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?://[^/]+/source/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-bf139483d631\"", "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" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "" } } } @@ -85626,29 +88579,39 @@ } }, { - "at": "/value/copy_status", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "success" + "value": "\"fixture-bf139483d631\"" + } + }, + { + "at": "/value/version", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-tier", + "id": "operations/azure-hns/put-created-key-trailing-slash", "profile": "azure-hns", "lane": "core", - "purpose": "Copy a blob into another access tier, named in x-ms-access-tier", + "purpose": "put created, with the key \"trailing-slash/\"", "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": "MDEyMzQ1Njc4OQ==", + "key": "object-tests/keys/trailing-slash/", + "op": "put" }, "exchanges": [ { @@ -85668,7 +88631,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/copy/target.txt" + "value": "/fixture/object-tests/keys/trailing-slash/" } }, { @@ -85676,41 +88639,34 @@ "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-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": "InvalidUri" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "InvalidUriFixture error" } } } @@ -85723,32 +88679,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": "InvalidUri" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-source-key-encoded", + "id": "operations/azure-hns/copy-missing-source", "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": "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/a b+c%é?#.txt" + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -85784,25 +88748,24 @@ "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/absent\\.txt" } } ], "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-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "BlobNotFound" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "BlobNotFoundFixture error" } } } @@ -85815,33 +88778,40 @@ "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": "BlobNotFound" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-sync", + "id": "operations/azure-hns/copy", "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. Azure reads the source by URL as the caller, or with the bearer token in x-ms-copy-source-authorization", + "purpose": "Copy an object to another key in the same container", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" + "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", - "sync": true + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -85879,22 +88849,6 @@ "is": "matches", "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } - }, - { - "at": "/headers/x-ms-requires-sync", - "optional": false, - "rule": { - "is": "equal", - "value": "true" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" - } } ], "allow_headers": [], @@ -85939,18 +88893,20 @@ "refusal": null }, { - "id": "operations/azure-hns/copy-sync-missing-source", + "id": "operations/azure-hns/copy-replace-metadata", "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": "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/copy-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", + "metadata": { + "colour": "blue" + }, "op": "copy", - "source_key": "object-tests/copy/absent.txt", - "sync": true + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -85986,40 +88942,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-requires-sync", + "at": "/headers/x-ms-meta-colour", "optional": false, "rule": { "is": "equal", - "value": "true" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "blue" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "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": "CannotVerifyCopySourceFixture error" + "encoding": "empty" } } } @@ -86032,42 +88981,33 @@ "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": "CannotVerifyCopySource" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-sync-other-account", + "id": "operations/azure-hns/copy-source-if-match", "profile": "azure-hns", "lane": "core", - "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", + "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-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "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 + "source_if_match": "\"fixture-etag\"", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -86103,23 +89043,15 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-requires-sync", + "at": "/headers/x-ms-source-if-match", "optional": false, "rule": { "is": "equal", - "value": "true" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "\"fixture-etag\"" } } ], @@ -86165,18 +89097,17 @@ "refusal": null }, { - "id": "operations/azure-hns/copy-pending", + "id": "operations/azure-hns/copy-source-if-match-failed", "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": "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/copy-blob" ], - "origin": "transient", - "derived_from": "operations/azure-hns/copy", "call": { "key": "object-tests/copy/target.txt", "op": "copy", + "source_if_match": "\"fixture-0123456789ab\"", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -86215,23 +89146,30 @@ "is": "matches", "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } + }, + { + "at": "/headers/x-ms-source-if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-0123456789ab\"" + } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "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-copy-id": "fixture-copy-id", - "x-ms-copy-status": "pending" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "SourceConditionNotMetFixture error" } } } @@ -86244,40 +89182,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "pending" + "value": 412 } }, { - "at": "/value/copy_id", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "SourceConditionNotMet" } } ], "refusal": null }, { - "id": "operations/azure-hns/copy-content-properties", + "id": "operations/azure-hns/copy-source-if-unmodified-since-failed", "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": "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/copy-blob" ], "call": { - "content_type": "text/plain", "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": [ @@ -86318,29 +89256,28 @@ } }, { - "at": "/headers/x-ms-blob-content-type", + "at": "/headers/x-ms-source-if-unmodified-since", "optional": false, "rule": { "is": "equal", - "value": "text/plain" + "value": "Mon, 01 Jan 2024 00:00:00 GMT" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "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-copy-id": "fixture-copy-id", - "x-ms-copy-status": "success" + "x-ms-error-code": "SourceConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "SourceConditionNotMetFixture error" } } } @@ -86353,58 +89290,40 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/copy_status", - "optional": false, - "rule": { - "is": "equal", - "value": "success" - } - } - ], - "refusal": [ - { - "at": "/outcome", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": "refused" - } - }, - { - "at": "/kind", - "optional": false, - "rule": { - "is": "matches", - "pattern": ".+" + "value": 412 } }, { - "at": "/parameter", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": "content_type" + "value": "SourceConditionNotMet" } } ], - "decline_permitted": true + "refusal": null }, { - "id": "operations/azure-hns/copy-other-account", + "id": "operations/azure-hns/copy-if-none-match-exists", "profile": "azure-hns", "lane": "core", - "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", + "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_account_url": "https://fixtureother.blob.core.windows.net", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -86441,32 +89360,32 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, + "at": "/headers/if-none-match", + "optional": false, "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "is": "equal", + "value": "*" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 401, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "x-ms-error-code": "BlobAlreadyExists" }, "body": { "encoding": "utf8", - "data": "CannotVerifyCopySourceFixture error" + "data": "BlobAlreadyExistsFixture error" } } } @@ -86487,7 +89406,7 @@ "optional": false, "rule": { "is": "equal", - "value": 401 + "value": 409 } }, { @@ -86495,23 +89414,24 @@ "optional": false, "rule": { "is": "equal", - "value": "CannotVerifyCopySource" + "value": "BlobAlreadyExists" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url", + "id": "operations/azure-hns/copy-across-containers", "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": "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/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", + "op": "copy", + "source_container": "source", "source_key": "object-tests/copy/source.txt" }, "exchanges": [ @@ -86548,39 +89468,22 @@ "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-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "pattern": "https?://[^/]+/source/object-tests/copy/source\\.txt" } } ], - "allow_headers": [ - "x-ms-copy-source-blob-properties" - ], + "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" @@ -86600,30 +89503,29 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url-content-properties", + "id": "operations/azure-hns/copy-tier", "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": "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-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "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" + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "tier": "Cool" }, "exchanges": [ { @@ -86663,51 +89565,26 @@ } }, { - "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 [^ ]+" - } - }, - { - "at": "/headers/x-ms-blob-content-type", - "optional": false, - "rule": { - "is": "equal", - "value": "text/plain" - } - }, - { - "at": "/headers/x-ms-blob-cache-control", + "at": "/headers/x-ms-access-tier", "optional": false, "rule": { "is": "equal", - "value": "max-age=3600" + "value": "Cool" } } ], - "allow_headers": [ - "x-ms-copy-source-blob-properties" - ], + "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" @@ -86727,28 +89604,28 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url-missing-source", + "id": "operations/azure-hns/copy-source-key-encoded", "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": "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/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], "call": { "key": "object-tests/copy/target.txt", - "op": "azure.put_from_url", - "source_key": "object-tests/copy/absent.txt" + "op": "copy", + "source_key": "object-tests/copy/a b+c%é?#.txt" }, "exchanges": [ { @@ -86784,42 +89661,25 @@ "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": "BlockBlob" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "pattern": "https?://[^/]+/fixture/object-tests/copy/a%20b%2[Bb]c%25%[Cc]3%[Aa]9%3[Ff]%23\\.txt" } } ], - "allow_headers": [ - "x-ms-copy-source-blob-properties" - ], + "allow_headers": [], "allow_query": [], "response": { - "status": 404, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "CannotVerifyCopySource" + "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": "CannotVerifyCopySourceFixture error" + "encoding": "empty" } } } @@ -86832,41 +89692,33 @@ "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": "CannotVerifyCopySource" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-from-url-other-account", + "id": "operations/azure-hns/copy-sync", "profile": "azure-hns", "lane": "core", - "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", + "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/put-blob-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { "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" + "op": "copy", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -86902,15 +89754,15 @@ "optional": false, "rule": { "is": "matches", - "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "true" } }, { @@ -86922,19 +89774,18 @@ } } ], - "allow_headers": [ - "x-ms-copy-source-blob-properties" - ], + "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" @@ -86954,30 +89805,29 @@ } }, { - "at": "/value/etag", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/abort-copy", + "id": "operations/azure-hns/copy-sync-missing-source", "profile": "azure-hns", "lane": "core", - "purpose": "Abort a pending copy by its copy ID, with x-ms-copy-action: abort", + "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/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], - "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" + "op": "copy", + "source_key": "object-tests/copy/absent.txt", + "sync": true }, "exchanges": [ { @@ -87009,41 +89859,44 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "copy" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/absent\\.txt" } }, { - "at": "/query/copyid", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "true" } }, { - "at": "/headers/x-ms-copy-action", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "abort" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 204, + "status": 404, "headers": { + "content-type": "application/xml", "date": { "from": "now" - } + }, + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "CannotVerifyCopySourceFixture error" } } } @@ -87056,24 +89909,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-hns/abort-copy-finished", + "id": "operations/azure-hns/copy-sync-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Report an abort of a copy that has finished as an error, 409 NoPendingCopyOperation", + "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/abort-copy-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url" ], "call": { - "copy_id": "fixture-copy-id", "key": "object-tests/copy/target.txt", - "op": "azure.abort_copy" + "op": "copy", + "source_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt", + "sync": true }, "exchanges": [ { @@ -87105,44 +89976,45 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "copy" + "is": "matches", + "pattern": "https://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/query/copyid", + "at": "/headers/x-ms-requires-sync", "optional": false, "rule": { "is": "equal", - "value": "fixture-copy-id" + "value": "true" } }, { - "at": "/headers/x-ms-copy-action", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "abort" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 202, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "NoPendingCopyOperation" + "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": "NoPendingCopyOperationFixture error" + "encoding": "empty" } } } @@ -87155,39 +90027,34 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": "NoPendingCopyOperation" + "value": "success" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-page-ranges", + "id": "operations/azure-hns/copy-pending", "profile": "azure-hns", "lane": "core", - "purpose": "List the written ranges of a page blob, which an HNS account does not support", + "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/get-page-ranges" + "https://learn.microsoft.com/en-us/rest/api/storageservices/copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure-hns/copy", "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": [ { @@ -87199,7 +90066,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -87207,7 +90074,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87219,28 +90086,29 @@ } }, { - "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": 409, + "status": 202, "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-copy-id": "fixture-copy-id", + "x-ms-copy-status": "pending" }, "body": { - "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "empty" } } } @@ -87253,41 +90121,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": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "fixture-copy-id" } } ], "refusal": null }, { - "id": "operations/azure-hns/upload-pages-unaligned", + "id": "operations/azure-hns/copy-content-properties", "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": "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/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" + "content_type": "text/plain", + "key": "object-tests/copy/target.txt", + "op": "copy", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -87307,7 +90175,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87315,48 +90183,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-blob-content-type", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-512" + "value": "text/plain" } } ], "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" } } } @@ -87369,41 +90230,59 @@ "optional": false, "rule": { "is": "equal", - "value": "error" + "value": "ok" } }, { - "at": "/status", + "at": "/value/copy_status", "optional": false, "rule": { "is": "equal", - "value": 400 + "value": "success" + } + } + ], + "refusal": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "refused" } }, { - "at": "/code", + "at": "/kind", + "optional": false, + "rule": { + "is": "matches", + "pattern": ".+" + } + }, + { + "at": "/parameter", "optional": false, "rule": { "is": "equal", - "value": "InvalidHeaderValue" + "value": "content_type" } } ], - "refusal": null + "decline_permitted": true }, { - "id": "operations/azure-hns/upload-pages", + "id": "operations/azure-hns/copy-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Write the first page of a page blob, which an HNS account does not support", + "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-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_account_url": "https://fixtureother.blob.core.windows.net", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -87423,7 +90302,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87431,48 +90310,40 @@ "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://fixtureother\\.blob\\.core\\.windows\\.net/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-range", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "bytes=0-511" + "is": "matches", + "pattern": "Bearer [^ ]+" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 409, + "status": 401, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -87493,7 +90364,7 @@ "optional": false, "rule": { "is": "equal", - "value": 409 + "value": 401 } }, { @@ -87501,24 +90372,24 @@ "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure-hns/create-page", + "id": "operations/azure-hns/put-from-url", "profile": "azure-hns", "lane": "core", - "purpose": "Create a page blob of 1,024 bytes, which an HNS account does not support", + "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": { - "key": "object-tests/pages/object.vhd", - "op": "azure.create_page", - "size": 1024 + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -87538,7 +90409,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/pages/object.vhd" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87550,36 +90421,46 @@ } }, { - "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-blob-type", "optional": false, "rule": { "is": "equal", - "value": "1024" + "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": 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-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "empty" } } } @@ -87592,40 +90473,34 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block-to-block-blob", + "id": "operations/azure-hns/put-from-url-content-properties", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse an append to a block blob", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "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": [ { @@ -87645,7 +90520,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87653,32 +90528,66 @@ "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-blob-type", "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "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": [], + "allow_headers": [ + "x-ms-copy-source-blob-properties" + ], "allow_query": [], "response": { - "status": 409, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidBlobType" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidBlobTypeFixture error" + "encoding": "empty" } } } @@ -87691,41 +90600,32 @@ "optional": false, "rule": { "is": "equal", - "value": "error" - } - }, - { - "at": "/status", - "optional": false, - "rule": { - "is": "equal", - "value": 409 + "value": "ok" } }, { - "at": "/code", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": "InvalidBlobType" + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block-at-wrong-position", + "id": "operations/azure-hns/put-from-url-missing-source", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse an append whose position condition does not match the blob length", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "append_position": 0, - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "key": "object-tests/copy/target.txt", + "op": "azure.put_from_url", + "source_key": "object-tests/copy/absent.txt" }, "exchanges": [ { @@ -87745,7 +90645,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87753,40 +90653,50 @@ "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/absent\\.txt" } }, { - "at": "/headers/x-ms-blob-condition-appendpos", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "0" + "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": 412, + "status": 404, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "AppendPositionConditionNotMet" + "x-ms-error-code": "CannotVerifyCopySource" }, "body": { "encoding": "utf8", - "data": "AppendPositionConditionNotMetFixture error" + "data": "CannotVerifyCopySourceFixture error" } } } @@ -87807,7 +90717,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 404 } }, { @@ -87815,24 +90725,25 @@ "optional": false, "rule": { "is": "equal", - "value": "AppendPositionConditionNotMet" + "value": "CannotVerifyCopySource" } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block", + "id": "operations/azure-hns/put-from-url-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Append a block to an append blob and report its offset", + "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/append-block" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob-from-url" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/append/object.log", - "op": "azure.append_block" + "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": [ { @@ -87852,7 +90763,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87860,19 +90771,37 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { - "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": "appendblock" + "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": 201, @@ -87882,8 +90811,6 @@ }, "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": { @@ -87904,36 +90831,30 @@ } }, { - "at": "/value/append_offset", - "optional": false, - "rule": { - "is": "equal", - "value": 5 - } - }, - { - "at": "/value/committed_block_count", + "at": "/value/etag", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "\"fixture-etag\"" } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block-from-url", + "id": "operations/azure-hns/abort-copy", "profile": "azure-hns", "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], + "origin": "transient", + "derived_from": "operations/azure-hns/abort-copy-finished", "call": { - "key": "object-tests/append/object.log", - "op": "azure.append_block_from_url", - "source_key": "object-tests/copy/source.txt" + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -87953,7 +90874,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -87969,39 +90890,34 @@ "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "copy" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/copyid", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, + "at": "/headers/x-ms-copy-action", + "optional": false, "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "is": "equal", + "value": "abort" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "status": 204, "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" @@ -88019,42 +90935,22 @@ "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-hns/append-block-from-url-range", + "id": "operations/azure-hns/abort-copy-finished", "profile": "azure-hns", "lane": "core", - "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/abort-copy-blob" ], "call": { - "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 - } + "copy_id": "fixture-copy-id", + "key": "object-tests/copy/target.txt", + "op": "azure.abort_copy" }, "exchanges": [ { @@ -88074,7 +90970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/copy/target.txt" } }, { @@ -88090,50 +90986,40 @@ "optional": false, "rule": { "is": "equal", - "value": "appendblock" + "value": "copy" } }, { - "at": "/headers/x-ms-copy-source", + "at": "/query/copyid", "optional": false, "rule": { - "is": "matches", - "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" + "is": "equal", + "value": "fixture-copy-id" } }, { - "at": "/headers/x-ms-source-range", + "at": "/headers/x-ms-copy-action", "optional": false, "rule": { "is": "equal", - "value": "bytes=1-3" - } - }, - { - "at": "/headers/x-ms-copy-source-authorization", - "optional": true, - "rule": { - "is": "matches", - "pattern": "Bearer [^ ]+" + "value": "abort" } } ], "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-blob-append-offset": "5", - "x-ms-blob-committed-block-count": "2", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "NoPendingCopyOperation" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "NoPendingCopyOperationFixture error" } } } @@ -88146,41 +91032,39 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/append_offset", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 409 } }, { - "at": "/value/committed_block_count", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "NoPendingCopyOperation" } } ], "refusal": null }, { - "id": "operations/azure-hns/append-block-from-url-other-account", + "id": "operations/azure-hns/get-page-ranges", "profile": "azure-hns", "lane": "core", - "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", + "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/append-block-from-url" + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-page-ranges" ], "call": { - "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" + "key": "object-tests/pages/object.vhd", + "op": "azure.get_page_ranges" }, "exchanges": [ { @@ -88192,7 +91076,7 @@ "optional": false, "rule": { "is": "equal", - "value": "PUT" + "value": "GET" } }, { @@ -88200,7 +91084,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -88216,42 +91100,24 @@ "optional": false, "rule": { "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 [^ ]+" + "value": "pagelist" } } ], "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-blob-append-offset": "5", - "x-ms-blob-committed-block-count": "2", - "x-ms-request-server-encrypted": "true" + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -88264,39 +91130,41 @@ "optional": false, "rule": { "is": "equal", - "value": "ok" + "value": "error" } }, { - "at": "/value/append_offset", + "at": "/status", "optional": false, "rule": { "is": "equal", - "value": 5 + "value": 409 } }, { - "at": "/value/committed_block_count", + "at": "/code", "optional": false, "rule": { "is": "equal", - "value": 2 + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/create-append", + "id": "operations/azure-hns/upload-pages-unaligned", "profile": "azure-hns", "lane": "core", - "purpose": "Create an empty append blob", + "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" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "key": "object-tests/append/object.log", - "op": "azure.create_append" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 1, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -88316,7 +91184,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/append/object.log" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -88324,32 +91192,48 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "AppendBlob" + "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=1-512" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 201, + "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-request-server-encrypted": "true" + "x-ms-error-code": "InvalidHeaderValue" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "InvalidHeaderValueFixture error" } } } @@ -88362,25 +91246,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-hns/put-leased-if-match-without-lease-id", + "id": "operations/azure-hns/upload-pages", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a write to a leased object whose If-Match holds but that names no lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-page" ], "call": { - "body_base64": "c2Vjb25k", - "if_match": "\"fixture-etag\"", - "key": "object-tests/leases/object.txt", - "op": "put" + "body_base64": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=", + "key": "object-tests/pages/object.vhd", + "offset": 0, + "op": "azure.upload_pages" }, "exchanges": [ { @@ -88400,7 +91300,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -88408,40 +91308,48 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHA=" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "page" } }, { - "at": "/headers/if-match", + "at": "/headers/x-ms-page-write", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-etag\"" + "value": "update" + } + }, + { + "at": "/headers/x-ms-range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=0-511" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseIdMissing" + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" }, "body": { "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture error" } } } @@ -88462,7 +91370,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 409 } }, { @@ -88470,25 +91378,24 @@ "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-leased-with-lease-id", + "id": "operations/azure-hns/create-page", "profile": "azure-hns", "lane": "core", - "purpose": "Write to a leased object with its lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "put" + "key": "object-tests/pages/object.vhd", + "op": "azure.create_page", + "size": 1024 }, "exchanges": [ { @@ -88508,7 +91415,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/pages/object.vhd" } }, { @@ -88516,7 +91423,7 @@ "optional": false, "rule": { "is": "equal", - "value": "c2Vjb25k" + "value": "" } }, { @@ -88524,32 +91431,32 @@ "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "PageBlob" } }, { - "at": "/headers/x-ms-lease-id", + "at": "/headers/x-ms-blob-content-length", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": "1024" } } ], "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" } } } @@ -88562,24 +91469,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/put-leased-without-lease-id", + "id": "operations/azure-hns/append-block-to-block-blob", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a write to a leased object that names no lease ID", + "purpose": "Refuse an append to a block blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { "body_base64": "c2Vjb25k", - "key": "object-tests/leases/object.txt", - "op": "put" + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -88599,7 +91522,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -88611,28 +91534,28 @@ } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "appendblock" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 412, + "status": 409, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "LeaseIdMissing" + "x-ms-error-code": "InvalidBlobType" }, "body": { "encoding": "utf8", - "data": "LeaseIdMissingFixture error" + "data": "InvalidBlobTypeFixture error" } } } @@ -88653,7 +91576,7 @@ "optional": false, "rule": { "is": "equal", - "value": 412 + "value": 409 } }, { @@ -88661,25 +91584,25 @@ "optional": false, "rule": { "is": "equal", - "value": "LeaseIdMissing" + "value": "InvalidBlobType" } } ], "refusal": null }, { - "id": "operations/azure-hns/lease-break", + "id": "operations/azure-hns/append-block-at-wrong-position", "profile": "azure-hns", "lane": "core", - "purpose": "Break a lease at once", + "purpose": "Refuse an append whose position condition does not match the blob length", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "action": "break", - "break_period": 0, - "key": "object-tests/leases/object.txt", - "op": "azure.lease" + "append_position": 0, + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -88699,7 +91622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -88707,7 +91630,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -88715,19 +91638,11 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "break" + "value": "appendblock" } }, { - "at": "/headers/x-ms-lease-break-period", + "at": "/headers/x-ms-blob-condition-appendpos", "optional": false, "rule": { "is": "equal", @@ -88738,17 +91653,17 @@ "allow_headers": [], "allow_query": [], "response": { - "status": 202, + "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-lease-time": "0" + "x-ms-error-code": "AppendPositionConditionNotMet" }, "body": { - "encoding": "empty" + "encoding": "utf8", + "data": "AppendPositionConditionNotMetFixture error" } } } @@ -88761,25 +91676,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-hns/lease-release", + "id": "operations/azure-hns/append-block", "profile": "azure-hns", "lane": "core", - "purpose": "Release a lease", + "purpose": "Append a block to an append blob and report its offset", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block" ], "call": { - "action": "release", - "key": "object-tests/leases/object.txt", - "lease_id": "11111111-2222-3333-4444-555555555555", - "op": "azure.lease" + "body_base64": "c2Vjb25k", + "key": "object-tests/append/object.log", + "op": "azure.append_block" }, "exchanges": [ { @@ -88799,7 +91729,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -88807,7 +91737,7 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { @@ -88815,36 +91745,23 @@ "optional": false, "rule": { "is": "equal", - "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" + "value": "appendblock" } } ], "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" + "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" @@ -88862,24 +91779,38 @@ "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-hns/lease-acquire-leased", + "id": "operations/azure-hns/append-block-from-url", "profile": "azure-hns", "lane": "core", - "purpose": "Refuse a second lease while another lease holds the object", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "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/append/object.log", + "op": "azure.append_block_from_url", + "source_key": "object-tests/copy/source.txt" }, "exchanges": [ { @@ -88899,7 +91830,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -88915,48 +91846,42 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" - } - }, - { - "at": "/headers/x-ms-lease-action", - "optional": false, - "rule": { - "is": "equal", - "value": "acquire" + "value": "appendblock" } }, { - "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", - "optional": false, + "at": "/headers/x-ms-copy-source-authorization", + "optional": true, "rule": { - "is": "equal", - "value": "66666666-7777-8888-9999-000000000000" + "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": "LeaseAlreadyPresent" + "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": "LeaseAlreadyPresentFixture error" + "encoding": "empty" } } } @@ -88969,42 +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": "LeaseAlreadyPresent" + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure-hns/lease-acquire", + "id": "operations/azure-hns/append-block-from-url-range", "profile": "azure-hns", "lane": "core", - "purpose": "Acquire a lease on an object with a proposed lease ID", + "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/lease-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "action": "acquire", - "duration": 15, - "key": "object-tests/leases/object.txt", - "op": "azure.lease", - "proposed_lease_id": "11111111-2222-3333-4444-555555555555" + "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": [ { @@ -89024,7 +91951,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/leases/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -89040,31 +91967,31 @@ "optional": false, "rule": { "is": "equal", - "value": "lease" + "value": "appendblock" } }, { - "at": "/headers/x-ms-lease-action", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "acquire" + "is": "matches", + "pattern": "https?://[^/]+/fixture/object-tests/copy/source\\.txt" } }, { - "at": "/headers/x-ms-lease-duration", + "at": "/headers/x-ms-source-range", "optional": false, "rule": { "is": "equal", - "value": "15" + "value": "bytes=1-3" } }, { - "at": "/headers/x-ms-proposed-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 [^ ]+" } } ], @@ -89078,7 +92005,9 @@ }, "etag": "\"fixture-etag\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", - "x-ms-lease-id": "11111111-2222-3333-4444-555555555555" + "x-ms-blob-append-offset": "5", + "x-ms-blob-committed-block-count": "2", + "x-ms-request-server-encrypted": "true" }, "body": { "encoding": "empty" @@ -89098,31 +92027,37 @@ } }, { - "at": "/value/lease_id", + "at": "/value/append_offset", "optional": false, "rule": { "is": "equal", - "value": "11111111-2222-3333-4444-555555555555" + "value": 5 + } + }, + { + "at": "/value/committed_block_count", + "optional": false, + "rule": { + "is": "equal", + "value": 2 } } ], "refusal": null }, { - "id": "operations/azure-hns/put-with-tags", + "id": "operations/azure-hns/append-block-from-url-other-account", "profile": "azure-hns", "lane": "core", - "purpose": "Write an object with tags, which an HNS account does not support", + "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/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/append-block-from-url" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tags/object.txt", - "op": "put", - "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": [ { @@ -89142,7 +92077,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -89150,40 +92085,50 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "appendblock" } }, { - "at": "/headers/x-ms-tags", + "at": "/headers/x-ms-copy-source", "optional": false, "rule": { - "is": "equal", - "value": "project=object-tests" + "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": [], "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" } } } @@ -89196,39 +92141,39 @@ "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/get-tags", + "id": "operations/azure-hns/create-append", "profile": "azure-hns", "lane": "core", - "purpose": "Read the tags of an object, which an HNS account does not support", + "purpose": "Create an empty append blob", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags" + "key": "object-tests/append/object.log", + "op": "azure.create_append" }, "exchanges": [ { @@ -89240,7 +92185,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -89248,7 +92193,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/append/object.log" } }, { @@ -89260,28 +92205,28 @@ } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "AppendBlob" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidQueryParameterValue" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "encoding": "empty" } } } @@ -89294,40 +92239,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": "InvalidQueryParameterValue" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure-hns/get-tags-version", + "id": "operations/azure-hns/put-leased-if-match-without-lease-id", "profile": "azure-hns", "lane": "core", - "purpose": "Send a tag call on a version to an HNS account, which refuses it as it refuses the blob's", + "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/get-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.get_tags", - "version": "2024-01-01T00:00:00.0000000Z" + "body_base64": "c2Vjb25k", + "if_match": "\"fixture-etag\"", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -89339,7 +92269,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "PUT" } }, { @@ -89347,7 +92277,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -89355,40 +92285,40 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/query/versionid", + "at": "/headers/if-match", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "\"fixture-etag\"" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "InvalidQueryParameterValue" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "InvalidQueryParameterValueFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -89409,7 +92339,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -89417,26 +92347,25 @@ "optional": false, "rule": { "is": "equal", - "value": "InvalidQueryParameterValue" + "value": "LeaseIdMissing" } } ], "refusal": null }, { - "id": "operations/azure-hns/set-tags", + "id": "operations/azure-hns/put-leased-with-lease-id", "profile": "azure-hns", "lane": "core", - "purpose": "Replace the tags of an object, which an HNS account does not support", + "purpose": "Write to a leased object with its lease ID", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - } + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "lease_id": "11111111-2222-3333-4444-555555555555", + "op": "put" }, "exchanges": [ { @@ -89456,51 +92385,48 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/body_text", + "at": "/body_base64", "optional": false, "rule": { - "is": "xml", - "value": "projectobject-tests" + "is": "equal", + "value": "c2Vjb25k" } }, { - "at": "/query/comp", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "tags" + "value": "BlockBlob" } }, { - "at": "/headers/content-type", + "at": "/headers/x-ms-lease-id", "optional": false, "rule": { - "is": "one_of", - "values": [ - "application/xml", - "application/xml; charset=UTF-8" - ] + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 201, "headers": { - "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + "etag": "\"fixture-etag\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT", + "x-ms-request-server-encrypted": "true" }, "body": { - "encoding": "utf8", - "data": "BlobApiNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "encoding": "empty" } } } @@ -89513,43 +92439,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": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "ok" } } ], "refusal": null }, { - "id": "operations/azure-hns/set-tags-version", + "id": "operations/azure-hns/put-leased-without-lease-id", "profile": "azure-hns", "lane": "core", - "purpose": "Send a tag call on a version to an HNS account, which refuses it as it refuses the blob's", + "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-tags" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "key": "object-tests/tags/object.txt", - "op": "azure.set_tags", - "tags": { - "project": "object-tests" - }, - "version": "2024-01-01T00:00:00.0000000Z" + "body_base64": "c2Vjb25k", + "key": "object-tests/leases/object.txt", + "op": "put" }, "exchanges": [ { @@ -89569,59 +92476,40 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tags/object.txt" - } - }, - { - "at": "/body_text", - "optional": false, - "rule": { - "is": "xml", - "value": "projectobject-tests" + "value": "/fixture/object-tests/leases/object.txt" } }, { - "at": "/query/comp", + "at": "/body_base64", "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": "c2Vjb25k" } }, { - "at": "/query/versionid", + "at": "/headers/x-ms-blob-type", "optional": false, "rule": { "is": "equal", - "value": "2024-01-01T00:00:00.0000000Z" + "value": "BlockBlob" } } ], "allow_headers": [], "allow_query": [], "response": { - "status": 400, + "status": 412, "headers": { "content-type": "application/xml", "date": { "from": "now" }, - "x-ms-error-code": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + "x-ms-error-code": "LeaseIdMissing" }, "body": { "encoding": "utf8", - "data": "BlobApiNotYetSupportedForHierarchicalNamespaceAccountsFixture error" + "data": "LeaseIdMissingFixture error" } } } @@ -89642,7 +92530,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 412 } }, { @@ -89650,25 +92538,25 @@ "optional": false, "rule": { "is": "equal", - "value": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + "value": "LeaseIdMissing" } } ], "refusal": null }, { - "id": "operations/azure-hns/put-with-tier", + "id": "operations/azure-hns/lease-break", "profile": "azure-hns", "lane": "core", - "purpose": "Write an object straight into the Cool access tier", + "purpose": "Break a lease at once", "sources": [ - "https://learn.microsoft.com/en-us/rest/api/storageservices/put-blob" + "https://learn.microsoft.com/en-us/rest/api/storageservices/lease-blob" ], "call": { - "body_base64": "Zmlyc3Q=", - "key": "object-tests/tiers/object.txt", - "op": "put", - "tier": "Cool" + "action": "break", + "break_period": 0, + "key": "object-tests/leases/object.txt", + "op": "azure.lease" }, "exchanges": [ { @@ -89688,7 +92576,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/tiers/object.txt" + "value": "/fixture/object-tests/leases/object.txt" } }, { @@ -89696,37 +92584,1026 @@ "optional": false, "rule": { "is": "equal", - "value": "Zmlyc3Q=" + "value": "" } }, { - "at": "/headers/x-ms-blob-type", + "at": "/query/comp", "optional": false, "rule": { "is": "equal", - "value": "BlockBlob" + "value": "lease" } }, { - "at": "/headers/x-ms-access-tier", + "at": "/headers/x-ms-lease-action", "optional": false, "rule": { "is": "equal", - "value": "Cool" + "value": "break" + } + }, + { + "at": "/headers/x-ms-lease-break-period", + "optional": false, + "rule": { + "is": "equal", + "value": "0" } } ], "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-lease-time": "0" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/lease-release", + "profile": "azure-hns", + "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": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/leases/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "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": [], + "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" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/lease-acquire-leased", + "profile": "azure-hns", + "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": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/leases/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "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", + "optional": false, + "rule": { + "is": "equal", + "value": "66666666-7777-8888-9999-000000000000" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 409, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "LeaseAlreadyPresent" + }, + "body": { + "encoding": "utf8", + "data": "LeaseAlreadyPresentFixture 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": "LeaseAlreadyPresent" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/lease-acquire", + "profile": "azure-hns", + "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": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/leases/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "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", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 201, + "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" + }, + "body": { + "encoding": "empty" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/lease_id", + "optional": false, + "rule": { + "is": "equal", + "value": "11111111-2222-3333-4444-555555555555" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-with-tags", + "profile": "azure-hns", + "lane": "core", + "purpose": "Write an object with tags, which an HNS account does not support", + "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": { + "project": "object-tests" + } + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Zmlyc3Q=" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-tags", + "optional": false, + "rule": { + "is": "equal", + "value": "project=object-tests" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 409, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + }, + "body": { + "encoding": "utf8", + "data": "FeatureNotYetSupportedForHierarchicalNamespaceAccountsFixture 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": "FeatureNotYetSupportedForHierarchicalNamespaceAccounts" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-tags", + "profile": "azure-hns", + "lane": "core", + "purpose": "Read the tags of an object, which an HNS account does not support", + "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": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "InvalidQueryParameterValue" + }, + "body": { + "encoding": "utf8", + "data": "InvalidQueryParameterValueFixture 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": "InvalidQueryParameterValue" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/get-tags-version", + "profile": "azure-hns", + "lane": "core", + "purpose": "Send a tag call on a version to an HNS account, which refuses it as it refuses the blob's", + "sources": [ + "https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob-tags" + ], + "call": { + "key": "object-tests/tags/object.txt", + "op": "azure.get_tags", + "version": "2024-01-01T00:00:00.0000000Z" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/comp", + "optional": false, + "rule": { + "is": "equal", + "value": "tags" + } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.0000000Z" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "InvalidQueryParameterValue" + }, + "body": { + "encoding": "utf8", + "data": "InvalidQueryParameterValueFixture 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": "InvalidQueryParameterValue" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-tags", + "profile": "azure-hns", + "lane": "core", + "purpose": "Replace the tags of an object, which an HNS account does not support", + "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": { + "project": "object-tests" + } + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "projectobject-tests" + } + }, + { + "at": "/query/comp", + "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" + ] + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + }, + "body": { + "encoding": "utf8", + "data": "BlobApiNotYetSupportedForHierarchicalNamespaceAccountsFixture 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": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/set-tags-version", + "profile": "azure-hns", + "lane": "core", + "purpose": "Send a tag call on a version to an HNS account, which refuses it as it refuses the blob's", + "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": { + "project": "object-tests" + }, + "version": "2024-01-01T00:00:00.0000000Z" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tags/object.txt" + } + }, + { + "at": "/body_text", + "optional": false, + "rule": { + "is": "xml", + "value": "projectobject-tests" + } + }, + { + "at": "/query/comp", + "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" + ] + } + }, + { + "at": "/query/versionid", + "optional": false, + "rule": { + "is": "equal", + "value": "2024-01-01T00:00:00.0000000Z" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "status": 400, + "headers": { + "content-type": "application/xml", + "date": { + "from": "now" + }, + "x-ms-error-code": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + }, + "body": { + "encoding": "utf8", + "data": "BlobApiNotYetSupportedForHierarchicalNamespaceAccountsFixture 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": "BlobApiNotYetSupportedForHierarchicalNamespaceAccounts" + } + } + ], + "refusal": null + }, + { + "id": "operations/azure-hns/put-with-tier", + "profile": "azure-hns", + "lane": "core", + "purpose": "Write an object straight into the Cool access tier", + "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" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "PUT" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture/object-tests/tiers/object.txt" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "Zmlyc3Q=" + } + }, + { + "at": "/headers/x-ms-blob-type", + "optional": false, + "rule": { + "is": "equal", + "value": "BlockBlob" + } + }, + { + "at": "/headers/x-ms-access-tier", + "optional": false, + "rule": { + "is": "equal", + "value": "Cool" + } + } + ], + "allow_headers": [], + "allow_query": [], + "response": { + "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" @@ -114288,16 +118165,22 @@ "refusal": null }, { - "id": "operations/s3/get-replaced", + "id": "operations/s3/get-checksum-range", "profile": "s3", "lane": "core", - "purpose": "get replaced", + "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": { - "key": "object-tests/multipart/replaced.bin", - "op": "get" + "checksum_mode": true, + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "end": 6, + "start": 2 + } }, "exchanges": [ { @@ -114317,7 +118200,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "/fixture/object-tests/read/object.txt" } }, { @@ -114327,60 +118210,21 @@ "is": "equal", "value": "" } - } - ], - "allow_headers": [ - "content-type" - ], - "allow_query": [], - "response": { - "status": 200, - "headers": { - "content-type": "binary/octet-stream", - "date": { - "from": "now" - }, - "etag": "\"fixture-8631a8b6edf7\"", - "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" - }, - "body": { - "encoding": "base64", - "data": "Yg==" - } - } - }, - { - "request": [ - { - "at": "/method", - "optional": false, - "rule": { - "is": "equal", - "value": "GET" - } }, { - "at": "/path", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/replaced.bin" + "value": "bytes=2-5" } }, { - "at": "/body_base64", - "optional": false, + "at": "/headers/x-amz-checksum-mode", + "optional": true, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "matches", - "pattern": "bytes=0-[1-9][0-9]{2,}" + "value": "ENABLED" } } ], @@ -114391,17 +118235,17 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-0/1", + "content-range": "bytes 2-5/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-8631a8b6edf7\"", + "etag": "\"fixture-ad03f2ab332a\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "Yg==" + "data": "MjM0NQ==" } } } @@ -114422,7 +118266,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8631a8b6edf7\"" + "value": "\"fixture-ad03f2ab332a\"" } }, { @@ -114430,7 +118274,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 4 } }, { @@ -114457,22 +118301,29 @@ "optional": false, "rule": { "is": "equal", - "value": "Yg==" + "value": "MjM0NQ==" + } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "absent" } } ], "refusal": null }, { - "id": "operations/s3/get-single-part", + "id": "operations/s3/get-replaced", "profile": "s3", "lane": "core", - "purpose": "get single part", + "purpose": "get replaced", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], "call": { - "key": "object-tests/multipart/single.bin", + "key": "object-tests/multipart/replaced.bin", "op": "get" }, "exchanges": [ @@ -114493,7 +118344,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/single.bin" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -114516,12 +118367,12 @@ "date": { "from": "now" }, - "etag": "\"fixture-69ebdafc497f\"", + "etag": "\"fixture-8631a8b6edf7\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "b25seQ==" + "data": "Yg==" } } }, @@ -114540,7 +118391,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/multipart/single.bin" + "value": "/fixture/object-tests/multipart/replaced.bin" } }, { @@ -114567,17 +118418,17 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 0-3/4", + "content-range": "bytes 0-0/1", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-69ebdafc497f\"", + "etag": "\"fixture-8631a8b6edf7\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "b25seQ==" + "data": "Yg==" } } } @@ -114598,7 +118449,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-69ebdafc497f\"" + "value": "\"fixture-8631a8b6edf7\"" } }, { @@ -114606,7 +118457,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 1 } }, { @@ -114633,26 +118484,23 @@ "optional": false, "rule": { "is": "equal", - "value": "b25seQ==" + "value": "Yg==" } } ], "refusal": null }, { - "id": "operations/s3/get-suffix-longer-than-object", + "id": "operations/s3/get-single-part", "profile": "s3", "lane": "core", - "purpose": "get suffix longer than object", + "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": { - "suffix": 100 - } + "key": "object-tests/multipart/single.bin", + "op": "get" }, "exchanges": [ { @@ -114672,7 +118520,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/fixture/object-tests/read/object.txt" + "value": "/fixture/object-tests/multipart/single.bin" } }, { @@ -114682,14 +118530,6 @@ "is": "equal", "value": "" } - }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-100" - } } ], "allow_headers": [ @@ -114697,127 +118537,56 @@ ], "allow_query": [], "response": { - "status": 206, + "status": 200, "headers": { - "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ad03f2ab332a\"", + "etag": "\"fixture-69ebdafc497f\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "b25seQ==" } } }, { "request": [ { - "at": "/path", + "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/multipart/single.bin" } }, { - "at": "/headers/range", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "bytes=-100" + "value": "" } }, { - "at": "/method", + "at": "/headers/range", "optional": false, "rule": { - "is": "equal", - "value": "HEAD" + "is": "matches", + "pattern": "bytes=0-[1-9][0-9]{2,}" } } ], - "then": [ - { - "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=0-29" - } - }, - { - "at": "/headers/if-match", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-ad03f2ab332a\"" - } - } - ], - "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" - } - } - } - ] - } - ], "allow_headers": [ "content-type" ], @@ -114825,17 +118594,17 @@ "response": { "status": 206, "headers": { - "content-length": "30", - "content-range": "bytes 0-29/30", + "content-range": "bytes 0-3/4", "content-type": "binary/octet-stream", "date": { "from": "now" }, - "etag": "\"fixture-ad03f2ab332a\"", + "etag": "\"fixture-69ebdafc497f\"", "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" }, "body": { - "encoding": "empty" + "encoding": "base64", + "data": "b25seQ==" } } } @@ -114856,7 +118625,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ad03f2ab332a\"" + "value": "\"fixture-69ebdafc497f\"" } }, { @@ -114864,7 +118633,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -114891,17 +118660,17 @@ "optional": false, "rule": { "is": "equal", - "value": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "value": "b25seQ==" } } ], "refusal": null }, { - "id": "operations/s3/get-suffix", + "id": "operations/s3/get-suffix-longer-than-object", "profile": "s3", "lane": "core", - "purpose": "get suffix", + "purpose": "get suffix longer than object", "sources": [ "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" ], @@ -114909,7 +118678,7 @@ "key": "object-tests/read/object.txt", "op": "get", "range": { - "suffix": 6 + "suffix": 100 } }, "exchanges": [ @@ -114946,7 +118715,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-6" + "value": "bytes=-100" } } ], @@ -114957,7 +118726,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 24-29/30", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -114967,7 +118736,7 @@ }, "body": { "encoding": "base64", - "data": "b2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } }, @@ -114994,7 +118763,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=-6" + "value": "bytes=-100" } }, { @@ -115040,7 +118809,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=24-29" + "value": "bytes=0-29" } }, { @@ -115059,7 +118828,7 @@ "response": { "status": 206, "headers": { - "content-range": "bytes 24-29/30", + "content-range": "bytes 0-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -115069,7 +118838,7 @@ }, "body": { "encoding": "base64", - "data": "b2JqZWN0" + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" } } } @@ -115083,8 +118852,266 @@ "response": { "status": 206, "headers": { - "content-length": "6", - "content-range": "bytes 24-29/30", + "content-length": "30", + "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": "empty" + } + } + } + ] + } + ], + "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-suffix", + "profile": "s3", + "lane": "core", + "purpose": "get suffix", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "key": "object-tests/read/object.txt", + "op": "get", + "range": { + "suffix": 6 + } + }, + "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=-6" + } + } + ], + "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-ad03f2ab332a\"", + "last-modified": "Mon, 01 Jan 2024 00:00:00 GMT" + }, + "body": { + "encoding": "base64", + "data": "b2JqZWN0" + } + } + }, + { + "request": [ + { + "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=-6" + } + }, + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "HEAD" + } + } + ], + "then": [ + { + "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=24-29" + } + }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-ad03f2ab332a\"" + } + } + ], + "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-ad03f2ab332a\"", + "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-length": "6", + "content-range": "bytes 24-29/30", "content-type": "binary/octet-stream", "date": { "from": "now" @@ -115477,6 +119504,591 @@ ], "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-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": "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": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/get-checksum-mismatch", + "profile": "s3", + "lane": "core", + "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": [ + "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" + }, + "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": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" + } + } + }, + { + "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-crc64nvme": "efafnZ4dTjo=", + "x-amz-checksum-type": "FULL_OBJECT" + }, + "body": { + "encoding": "base64", + "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWNh" + } + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "error" + } + }, + { + "at": "/kind", + "optional": false, + "rule": { + "is": "equal", + "value": "checksum_mismatch" + } + } + ], + "refusal": null + }, { "id": "operations/s3/get-xml-looking", "profile": "s3", @@ -120375,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", @@ -127029,19 +131778,16 @@ "refusal": null }, { - "id": "operations/s3/list-versions-unversioned", + "id": "operations/s3/list-uploads", "profile": "s3", "lane": "core", - "purpose": "List the versions in a bucket that was never versioned, where each key has one version named null", + "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_ListObjectVersions.html" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "include": [ - "versions" - ], - "op": "list_page", - "prefix": "object-tests/versions/" + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -127057,15 +131803,15 @@ } }, { - "at": "/body_base64", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "/fixture" } }, { - "at": "/query/versions", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -127073,19 +131819,22 @@ } }, { - "at": "/query/prefix", + "at": "/query/uploads", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/versions/" + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { - "at": "/path", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "object-tests/uploads/" } } ], @@ -127104,7 +131853,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "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" } @@ -127119,6 +131868,14 @@ "value": "GET" } }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, { "at": "/body_base64", "optional": false, @@ -127128,11 +131885,22 @@ } }, { - "at": "/query/versions", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { @@ -127140,7 +131908,125 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/" + "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" } }, { @@ -127152,11 +132038,38 @@ } }, { - "at": "/query/encoding-type", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "url" + "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" } } ], @@ -127175,7 +132088,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" + "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" } @@ -127190,6 +132103,14 @@ "value": "GET" } }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, { "at": "/body_base64", "optional": false, @@ -127199,11 +132120,22 @@ } }, { - "at": "/query/versions", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "versions" + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { @@ -127211,15 +132143,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/" + "value": "object-tests/uploads/" } }, { - "at": "/path", + "at": "/query/max-uploads", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "1" } } ], @@ -127238,7 +132170,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "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" } @@ -127256,108 +132188,76 @@ } }, { - "at": "/value/entries/0/key", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", - "value": "object-tests/versions/a.txt" + "is": "array_length", + "value": 1 } }, { - "at": "/value/entries/0/version", + "at": "/value/uploads/0/key", "optional": false, "rule": { "is": "equal", - "value": "null" + "value": "object-tests/uploads/a.bin" } }, { - "at": "/value/entries/0/is_current_version", + "at": "/value/uploads/0/upload_id", "optional": false, "rule": { "is": "equal", - "value": true + "value": "fixture-upload-a" } }, { - "at": "/value/entries/0/size", + "at": "/value/prefixes", "optional": false, "rule": { - "is": "equal", - "value": 2 + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries/0/etag", + "at": "/value/is_truncated", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a1\"" - } - }, - { - "at": "/value/entries/0/delete_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries", - "optional": false, - "rule": { - "is": "array_length", - "value": 1 + "value": true } }, { - "at": "/value/prefixes", + "at": "/value/next_key_marker", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "object-tests/uploads/a.bin" } }, { - "at": "/value/continuation_token", + "at": "/value/next_upload_id_marker", "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/value/next_version_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": "fixture-upload-a" } } ], "refusal": null }, { - "id": "operations/s3/list-versions-encoded-key", + "id": "operations/s3/list-uploads-after-key", "profile": "s3", "lane": "core", - "purpose": "List the versions of a key with a space and a non-ASCII letter, which an encoded listing sends encoded", + "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_ListObjectVersions.html" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "include": [ - "versions" - ], - "op": "list_page", - "prefix": "object-tests/versions/" + "key_marker": "object-tests/uploads/a.bin", + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -127373,35 +132273,46 @@ } }, { - "at": "/body_base64", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "/fixture" } }, { - "at": "/query/versions", + "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/versions/" + "value": "object-tests/uploads/" } }, { - "at": "/path", + "at": "/query/key-marker", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "object-tests/uploads/a.bin" } } ], @@ -127420,7 +132331,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a b é.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "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" } @@ -127435,6 +132346,14 @@ "value": "GET" } }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, { "at": "/body_base64", "optional": false, @@ -127444,11 +132363,22 @@ } }, { - "at": "/query/versions", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { @@ -127456,7 +132386,117 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/" + "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" } }, { @@ -127468,11 +132508,38 @@ } }, { - "at": "/query/encoding-type", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "url" + "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": "/" } } ], @@ -127491,7 +132558,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a+b+%C3%A9.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" + "data": "\nfixture/object-tests/1000falseobject-tests/uploads/" }, "framing": "chunked" } @@ -127506,6 +132573,14 @@ "value": "GET" } }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, { "at": "/body_base64", "optional": false, @@ -127515,11 +132590,22 @@ } }, { - "at": "/query/versions", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "versions" + "value": "url" + } + }, + { + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] } }, { @@ -127527,15 +132613,15 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/" + "value": "object-tests/" } }, { - "at": "/path", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "/" } } ], @@ -127554,7 +132640,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a b é.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "data": "\nfixture/object-tests/1000urlfalseobject-tests/uploads/" }, "framing": "chunked" } @@ -127572,58 +132658,15 @@ } }, { - "at": "/value/entries/0/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions/a b é.txt" - } - }, - { - "at": "/value/entries/0/version", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-version-1" - } - }, - { - "at": "/value/entries/0/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/0/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/0/etag", + "at": "/value/uploads", "optional": false, "rule": { - "is": "equal", - "value": "\"fixture-a1\"" - } - }, - { - "at": "/value/entries/0/delete_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] + "is": "array_length", + "value": 0 } }, { - "at": "/value/entries", + "at": "/value/prefixes", "optional": false, "rule": { "is": "array_length", @@ -127631,52 +132674,35 @@ } }, { - "at": "/value/prefixes", + "at": "/value/prefixes/0", "optional": false, "rule": { "is": "equal", - "value": [] + "value": "object-tests/uploads/" } }, { - "at": "/value/continuation_token", + "at": "/value/is_truncated", "optional": false, "rule": { "is": "equal", - "value": "" - } - }, - { - "at": "/value/next_version_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "value": false } } ], "refusal": null }, { - "id": "operations/s3/list-versions-next-page", + "id": "operations/s3/list-uploads-none", "profile": "s3", "lane": "core", - "purpose": "List the next page of versions from a key marker and a version marker", + "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_ListObjectVersions.html" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html" ], "call": { - "continuation_token": "object-tests/versions/a.txt", - "include": [ - "versions" - ], - "op": "list_page", - "page_size": 2, - "prefix": "object-tests/versions/", - "version_marker": "fixture-version-1" + "op": "s3.list_uploads", + "prefix": "object-tests/uploads/" }, "exchanges": [ { @@ -127692,59 +132718,112 @@ } }, { - "at": "/body_base64", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "" + "value": "/fixture" } }, { - "at": "/query/versions", + "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/versions/" + "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": "/query/max-keys", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "/fixture" } }, { - "at": "/query/key-marker", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/a.txt" + "value": "" } }, { - "at": "/query/version-id-marker", + "at": "/query/encoding-type", "optional": false, "rule": { "is": "equal", - "value": "fixture-version-1" + "value": "url" } }, { - "at": "/path", + "at": "/query/uploads", + "optional": false, + "rule": { + "is": "one_of", + "values": [ + "", + "uploads" + ] + } + }, + { + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "object-tests/uploads/" } } ], @@ -127763,11 +132842,68 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + "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", + "lane": "core", + "purpose": "List the versions in a bucket that was never versioned, where each key has one version named null", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" + ], + "call": { + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions/" + }, + "exchanges": [ + { + "alternatives": [ { "request": [ { @@ -127803,27 +132939,66 @@ } }, { - "at": "/query/max-keys", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "/fixture" } + } + ], + "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/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, + "framing": "chunked" + } + }, + { + "request": [ { - "at": "/query/key-marker", + "at": "/method", "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/a.txt" + "value": "GET" } }, { - "at": "/query/version-id-marker", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "fixture-version-1" + "value": "" + } + }, + { + "at": "/query/versions", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/" } }, { @@ -127858,7 +133033,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARDurl" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" }, "framing": "chunked" } @@ -127897,30 +133072,6 @@ "value": "object-tests/versions/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, - { - "at": "/query/key-marker", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions/a.txt" - } - }, - { - "at": "/query/version-id-marker", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-version-1" - } - }, { "at": "/path", "optional": false, @@ -127945,7 +133096,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtnulltrue2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -127967,7 +133118,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/b.txt" + "value": "object-tests/versions/a.txt" } }, { @@ -127975,7 +133126,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-version-3" + "value": "null" } }, { @@ -127991,7 +133142,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 2 } }, { @@ -127999,7 +133150,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-b1\"" + "value": "\"fixture-a1\"" } }, { @@ -128052,10 +133203,10 @@ "refusal": null }, { - "id": "operations/s3/list-versions-first-page", + "id": "operations/s3/list-versions-encoded-key", "profile": "s3", "lane": "core", - "purpose": "List the first page of versions, which names the key and version to continue from", + "purpose": "List the versions of a key with a space and a non-ASCII letter, which an encoded listing sends encoded", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" ], @@ -128064,7 +133215,6 @@ "versions" ], "op": "list_page", - "page_size": 2, "prefix": "object-tests/versions/" }, "exchanges": [ @@ -128104,14 +133254,6 @@ "value": "object-tests/versions/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, { "at": "/path", "optional": false, @@ -128136,7 +133278,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a b é.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -128175,14 +133317,6 @@ "value": "object-tests/versions/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, { "at": "/path", "optional": false, @@ -128215,7 +133349,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a+b+%C3%A9.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" }, "framing": "chunked" } @@ -128254,14 +133388,6 @@ "value": "object-tests/versions/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "2" - } - }, { "at": "/path", "optional": false, @@ -128286,7 +133412,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a b é.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -128308,7 +133434,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/a.txt" + "value": "object-tests/versions/a b é.txt" } }, { @@ -128316,7 +133442,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-version-2" + "value": "fixture-version-1" } }, { @@ -128338,64 +133464,13 @@ { "at": "/value/entries/0/etag", "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-a2\"" - } - }, - { - "at": "/value/entries/0/delete_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions/a.txt" - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-version-1" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": false - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, "rule": { "is": "equal", "value": "\"fixture-a1\"" } }, { - "at": "/value/entries/1/delete_marker", + "at": "/value/entries/0/delete_marker", "optional": true, "rule": { "is": "one_of", @@ -128410,7 +133485,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 2 + "value": 1 } }, { @@ -128426,35 +133501,40 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/a.txt" + "value": "" } }, { "at": "/value/next_version_marker", - "optional": false, + "optional": true, "rule": { - "is": "equal", - "value": "fixture-version-1" + "is": "one_of", + "values": [ + null, + "" + ] } } ], "refusal": null }, { - "id": "operations/s3/list-versions-delimited", + "id": "operations/s3/list-versions-next-page", "profile": "s3", "lane": "core", - "purpose": "List versions with a delimiter, which rolls the versions under a deeper prefix into one common prefix", + "purpose": "List the next page of versions from a key marker and a version marker", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" ], "call": { - "delimiter": "/", + "continuation_token": "object-tests/versions/a.txt", "include": [ "versions" ], "op": "list_page", - "prefix": "object-tests/versions/" + "page_size": 2, + "prefix": "object-tests/versions/", + "version_marker": "fixture-version-1" }, "exchanges": [ { @@ -128494,11 +133574,27 @@ } }, { - "at": "/query/delimiter", + "at": "/query/max-keys", "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "2" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/query/version-id-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-1" } }, { @@ -128525,7 +133621,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" }, "framing": "chunked" } @@ -128565,11 +133661,27 @@ } }, { - "at": "/query/delimiter", + "at": "/query/max-keys", "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "2" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/query/version-id-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-1" } }, { @@ -128604,7 +133716,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/url" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARDurl" }, "framing": "chunked" } @@ -128644,11 +133756,27 @@ } }, { - "at": "/query/delimiter", + "at": "/query/max-keys", "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "2" + } + }, + { + "at": "/query/key-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/query/version-id-marker", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-1" } }, { @@ -128675,7 +133803,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12falseobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" }, "framing": "chunked" } @@ -128697,7 +133825,7 @@ "optional": false, "rule": { "is": "equal", - "value": "object-tests/versions/a.txt" + "value": "object-tests/versions/b.txt" } }, { @@ -128705,7 +133833,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-version-1" + "value": "fixture-version-3" } }, { @@ -128721,7 +133849,7 @@ "optional": false, "rule": { "is": "equal", - "value": 2 + "value": 1 } }, { @@ -128729,7 +133857,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a1\"" + "value": "\"fixture-b1\"" } }, { @@ -128756,9 +133884,7 @@ "optional": false, "rule": { "is": "equal", - "value": [ - "object-tests/versions/nested/" - ] + "value": [] } }, { @@ -128784,10 +133910,10 @@ "refusal": null }, { - "id": "operations/s3/list-versions-delete-marker", + "id": "operations/s3/list-versions-first-page", "profile": "s3", "lane": "core", - "purpose": "List a deleted key's delete marker as its current entry, before the version it hides", + "purpose": "List the first page of versions, which names the key and version to continue from", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" ], @@ -128796,6 +133922,7 @@ "versions" ], "op": "list_page", + "page_size": 2, "prefix": "object-tests/versions/" }, "exchanges": [ @@ -128835,6 +133962,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, { "at": "/path", "optional": false, @@ -128859,7 +133994,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -128898,6 +134033,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, { "at": "/path", "optional": false, @@ -128930,7 +134073,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" }, "framing": "chunked" } @@ -128969,6 +134112,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/max-keys", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, { "at": "/path", "optional": false, @@ -128993,7 +134144,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + "data": "\nfixtureobject-tests/versions/object-tests/versions/a.txtfixture-version-12trueobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -129023,7 +134174,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-marker-1" + "value": "fixture-version-2" } }, { @@ -129035,11 +134186,30 @@ } }, { - "at": "/value/entries/0/delete_marker", + "at": "/value/entries/0/size", "optional": false, "rule": { "is": "equal", - "value": true + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a2\"" + } + }, + { + "at": "/value/entries/0/delete_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] } }, { @@ -129114,32 +134284,30 @@ "optional": false, "rule": { "is": "equal", - "value": "" + "value": "object-tests/versions/a.txt" } }, { "at": "/value/next_version_marker", - "optional": true, + "optional": false, "rule": { - "is": "one_of", - "values": [ - null, - "" - ] + "is": "equal", + "value": "fixture-version-1" } } ], "refusal": null }, { - "id": "operations/s3/list-versions", + "id": "operations/s3/list-versions-delimited", "profile": "s3", "lane": "core", - "purpose": "List every version of each key, newest first, with the current one marked IsLatest", + "purpose": "List versions with a delimiter, which rolls the versions under a deeper prefix into one common prefix", "sources": [ "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" ], "call": { + "delimiter": "/", "include": [ "versions" ], @@ -129183,6 +134351,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, { "at": "/path", "optional": false, @@ -129207,7 +134383,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/" }, "framing": "chunked" } @@ -129246,6 +134422,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, { "at": "/path", "optional": false, @@ -129278,7 +134462,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARDurl" + "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/url" }, "framing": "chunked" } @@ -129317,6 +134501,14 @@ "value": "object-tests/versions/" } }, + { + "at": "/query/delimiter", + "optional": false, + "rule": { + "is": "equal", + "value": "/" + } + }, { "at": "/path", "optional": false, @@ -129341,7 +134533,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + "data": "\nfixtureobject-tests/versions/1000/falseobject-tests/versions/a.txtfixture-version-1true2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/nested/" }, "framing": "chunked" } @@ -129371,7 +134563,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-version-2" + "value": "fixture-version-1" } }, { @@ -129393,115 +134585,13 @@ { "at": "/value/entries/0/etag", "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-a2\"" - } - }, - { - "at": "/value/entries/0/delete_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/1/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions/a.txt" - } - }, - { - "at": "/value/entries/1/version", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-version-1" - } - }, - { - "at": "/value/entries/1/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": false - } - }, - { - "at": "/value/entries/1/size", - "optional": false, - "rule": { - "is": "equal", - "value": 2 - } - }, - { - "at": "/value/entries/1/etag", - "optional": false, "rule": { "is": "equal", "value": "\"fixture-a1\"" } }, { - "at": "/value/entries/1/delete_marker", - "optional": true, - "rule": { - "is": "one_of", - "values": [ - null, - false - ] - } - }, - { - "at": "/value/entries/2/key", - "optional": false, - "rule": { - "is": "equal", - "value": "object-tests/versions/b.txt" - } - }, - { - "at": "/value/entries/2/version", - "optional": false, - "rule": { - "is": "equal", - "value": "fixture-version-3" - } - }, - { - "at": "/value/entries/2/is_current_version", - "optional": false, - "rule": { - "is": "equal", - "value": true - } - }, - { - "at": "/value/entries/2/size", - "optional": false, - "rule": { - "is": "equal", - "value": 1 - } - }, - { - "at": "/value/entries/2/etag", - "optional": false, - "rule": { - "is": "equal", - "value": "\"fixture-b1\"" - } - }, - { - "at": "/value/entries/2/delete_marker", + "at": "/value/entries/0/delete_marker", "optional": true, "rule": { "is": "one_of", @@ -129516,7 +134606,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 3 + "value": 1 } }, { @@ -129524,7 +134614,9 @@ "optional": false, "rule": { "is": "equal", - "value": [] + "value": [ + "object-tests/versions/nested/" + ] } }, { @@ -129550,16 +134642,19 @@ "refusal": null }, { - "id": "operations/s3/list-prefix-without-slash", + "id": "operations/s3/list-versions-delete-marker", "profile": "s3", "lane": "core", - "purpose": "Match the prefix as the start of the key, not as a directory: object-tests/boa matches object-tests/board/", + "purpose": "List a deleted key's delete marker as its current entry, before the version it hides", "sources": [ - "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" ], "call": { + "include": [ + "versions" + ], "op": "list_page", - "prefix": "object-tests/boa" + "prefix": "object-tests/versions/" }, "exchanges": [ { @@ -129575,15 +134670,15 @@ } }, { - "at": "/path", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "" } }, { - "at": "/body_base64", + "at": "/query/versions", "optional": false, "rule": { "is": "equal", @@ -129591,19 +134686,19 @@ } }, { - "at": "/query/list-type", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "object-tests/versions/" } }, { - "at": "/query/prefix", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "object-tests/boa" + "value": "/fixture" } } ], @@ -129622,7 +134717,7 @@ }, "body": { "encoding": "utf8", - "data": "\nfixtureobject-tests/boa31000falseobject-tests/board/a.txt2024-01-01T00:00:00.000Z"fixture-1d83e6eb69df"CRC64NVMEFULL_OBJECT8STANDARDobject-tests/board/nested/c.txt2024-01-01T00:00:00.000Z"fixture-a1cfb9bcbc61"CRC64NVMEFULL_OBJECT1STANDARDobject-tests/board/z.txt2024-01-01T00:00:00.000Z"fixture-4d347fee6a7b"CRC64NVMEFULL_OBJECT2STANDARD" + "data": "\nfixtureobject-tests/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" }, "framing": "chunked" } @@ -129638,15 +134733,15 @@ } }, { - "at": "/path", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", - "value": "/fixture" + "value": "" } }, { - "at": "/body_base64", + "at": "/query/versions", "optional": false, "rule": { "is": "equal", @@ -129654,19 +134749,782 @@ } }, { - "at": "/query/list-type", + "at": "/query/prefix", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "object-tests/versions/" } }, { - "at": "/query/prefix", + "at": "/path", "optional": false, "rule": { "is": "equal", - "value": "object-tests/boa" + "value": "/fixture" + } + }, + { + "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/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDurl" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/versions", + "optional": false, + "rule": { + "is": "equal", + "value": "versions" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + } + ], + "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/versions/1000falseobject-tests/versions/a.txtfixture-marker-1true2024-01-01T00:00:00.000Zobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARD" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker-1" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/0/delete_marker", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-1" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a1\"" + } + }, + { + "at": "/value/entries/1/delete_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 2 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "equal", + "value": [] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/next_version_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-versions", + "profile": "s3", + "lane": "core", + "purpose": "List every version of each key, newest first, with the current one marked IsLatest", + "sources": [ + "https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html" + ], + "call": { + "include": [ + "versions" + ], + "op": "list_page", + "prefix": "object-tests/versions/" + }, + "exchanges": [ + { + "alternatives": [ + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/versions", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + } + ], + "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/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/versions", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + }, + { + "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/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARDurl" + }, + "framing": "chunked" + } + }, + { + "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, + { + "at": "/body_base64", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/query/versions", + "optional": false, + "rule": { + "is": "equal", + "value": "versions" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/" + } + }, + { + "at": "/path", + "optional": false, + "rule": { + "is": "equal", + "value": "/fixture" + } + } + ], + "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/versions/1000falseobject-tests/versions/a.txtfixture-version-2true2024-01-01T00:00:00.000Z"fixture-a2"2STANDARDobject-tests/versions/a.txtfixture-version-1false2024-01-01T00:00:00.000Z"fixture-a1"2STANDARDobject-tests/versions/b.txtfixture-version-3true2024-01-01T00:00:00.000Z"fixture-b1"1STANDARD" + }, + "framing": "chunked" + } + } + ] + } + ], + "expect": [ + { + "at": "/outcome", + "optional": false, + "rule": { + "is": "equal", + "value": "ok" + } + }, + { + "at": "/value/entries/0/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/value/entries/0/version", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-2" + } + }, + { + "at": "/value/entries/0/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/0/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/0/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a2\"" + } + }, + { + "at": "/value/entries/0/delete_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/1/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/a.txt" + } + }, + { + "at": "/value/entries/1/version", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-1" + } + }, + { + "at": "/value/entries/1/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": false + } + }, + { + "at": "/value/entries/1/size", + "optional": false, + "rule": { + "is": "equal", + "value": 2 + } + }, + { + "at": "/value/entries/1/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-a1\"" + } + }, + { + "at": "/value/entries/1/delete_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries/2/key", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/versions/b.txt" + } + }, + { + "at": "/value/entries/2/version", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-version-3" + } + }, + { + "at": "/value/entries/2/is_current_version", + "optional": false, + "rule": { + "is": "equal", + "value": true + } + }, + { + "at": "/value/entries/2/size", + "optional": false, + "rule": { + "is": "equal", + "value": 1 + } + }, + { + "at": "/value/entries/2/etag", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-b1\"" + } + }, + { + "at": "/value/entries/2/delete_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + false + ] + } + }, + { + "at": "/value/entries", + "optional": false, + "rule": { + "is": "array_length", + "value": 3 + } + }, + { + "at": "/value/prefixes", + "optional": false, + "rule": { + "is": "equal", + "value": [] + } + }, + { + "at": "/value/continuation_token", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, + { + "at": "/value/next_version_marker", + "optional": true, + "rule": { + "is": "one_of", + "values": [ + null, + "" + ] + } + } + ], + "refusal": null + }, + { + "id": "operations/s3/list-prefix-without-slash", + "profile": "s3", + "lane": "core", + "purpose": "Match the prefix as the start of the key, not as a directory: object-tests/boa matches object-tests/board/", + "sources": [ + "aws-sdk-cpp/generated/src/aws-cpp-sdk-s3-crt" + ], + "call": { + "op": "list_page", + "prefix": "object-tests/boa" + }, + "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/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/boa" + } + } + ], + "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/boa31000falseobject-tests/board/a.txt2024-01-01T00:00:00.000Z"fixture-1d83e6eb69df"CRC64NVMEFULL_OBJECT8STANDARDobject-tests/board/nested/c.txt2024-01-01T00:00:00.000Z"fixture-a1cfb9bcbc61"CRC64NVMEFULL_OBJECT1STANDARDobject-tests/board/z.txt2024-01-01T00:00:00.000Z"fixture-4d347fee6a7b"CRC64NVMEFULL_OBJECT2STANDARD" + }, + "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/list-type", + "optional": false, + "rule": { + "is": "equal", + "value": "2" + } + }, + { + "at": "/query/prefix", + "optional": false, + "rule": { + "is": "equal", + "value": "object-tests/boa" } }, { @@ -167748,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", @@ -167767,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": [ @@ -167889,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" } } ] @@ -167920,7 +175202,7 @@ "optional": false, "rule": { "is": "equal", - "value": 400 + "value": 404 } }, { @@ -167928,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": [ { @@ -168071,7 +175314,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168079,7 +175322,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/multipart/object.bin" } }, { @@ -168090,6 +175333,14 @@ "value": "" } }, + { + "at": "/headers/range", + "optional": false, + "rule": { + "is": "equal", + "value": "bytes=-10" + } + }, { "at": "/headers/host", "optional": false, @@ -168120,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" } }, { @@ -168187,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": [ @@ -168194,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": [ @@ -168220,7 +175714,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168228,7 +175722,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -168269,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": [ { @@ -168295,7 +175785,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168303,7 +175793,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -168314,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, @@ -168339,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": [ { @@ -168370,7 +176028,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168378,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", @@ -168398,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" } } ], @@ -168419,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": [ @@ -168445,7 +176101,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168453,7 +176109,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/present.txt" + "value": "/object-tests/write/empty.bin" } }, { @@ -168487,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": [ @@ -168494,8 +176158,9 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 416, "headers": { + "content-range": "bytes */0", "content-type": "application/xml", "date": { "from": "now" @@ -168503,13 +176168,12 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nInvalidRangeFixture error" }, "framing": "chunked" } } - ], - "optional": true + ] } ], "expect": [ @@ -168526,7 +176190,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 416 } }, { @@ -168534,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": [ { @@ -168636,7 +176300,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168644,7 +176308,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/conditional.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -168660,7 +176324,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-137dbea0e0a1\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -168693,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" } } } @@ -168717,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": [ { @@ -168816,7 +176614,7 @@ "optional": false, "rule": { "is": "equal", - "value": "DELETE" + "value": "GET" } }, { @@ -168824,7 +176622,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/remove/absent.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -168835,6 +176633,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/host", "optional": false, @@ -168865,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": [ { @@ -168924,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", @@ -168936,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,}" } }, { @@ -169046,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" + } } } ] @@ -169069,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": [ @@ -169194,7 +176935,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/hash#tag.txt" } }, { @@ -169235,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==" + } } }, { @@ -169264,7 +177006,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/hash#tag.txt" } }, { @@ -169313,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==" + } } } ] @@ -169336,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": [ { @@ -169464,7 +177232,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/names/percent%20.txt" } }, { @@ -169475,14 +177243,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-10" - } - }, { "at": "/headers/host", "optional": false, @@ -169513,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" } }, { @@ -169548,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,}" } }, { @@ -169578,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": [ @@ -169689,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==" } } } @@ -169720,7 +177385,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ec4f3b9bcac2\"" + "value": "\"fixture-a16607f00956\"" } }, { @@ -169728,7 +177393,7 @@ "optional": false, "rule": { "is": "equal", - "value": 10 + "value": 1 } }, { @@ -169755,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": [ @@ -169864,7 +177529,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/plus+plus.txt" } }, { @@ -169911,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==" } } }, @@ -169935,7 +177600,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/plus+plus.txt" } }, { @@ -169979,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==" + } } } ] @@ -170103,7 +177682,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-de1997e62b9b\"" + "value": "\"fixture-1b1e630ad692\"" } }, { @@ -170111,7 +177690,7 @@ "optional": false, "rule": { "is": "equal", - "value": 0 + "value": 1 } }, { @@ -170138,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": [ { @@ -170251,7 +177826,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/write/empty.bin" + "value": "/object-tests/names/space name.txt" } }, { @@ -170285,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}" } } ], @@ -170300,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==" + } } } ] @@ -170324,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": [ @@ -170450,7 +178123,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/a?b" } }, { @@ -170462,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" + ] } }, { @@ -170494,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=" } } }, @@ -170529,7 +178205,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/a?b" } }, { @@ -170541,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" + ] } }, { @@ -170581,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=" } } } @@ -170614,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": [ @@ -170764,7 +178407,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/café/雪" } }, { @@ -170776,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" + ] } }, { @@ -170808,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=" } } }, @@ -170843,7 +178489,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/café/雪" } }, { @@ -170855,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" + ] } }, { @@ -170895,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=" } } } @@ -170928,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": [ @@ -171077,7 +178691,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/hash#tag.txt" + "value": "/a//b/" } }, { @@ -171088,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, @@ -171113,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=" } } }, @@ -171148,7 +178773,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/hash#tag.txt" + "value": "/a//b/" } }, { @@ -171159,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, @@ -171192,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=" } } } @@ -171225,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": [ @@ -171374,7 +178975,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/percent%20.txt" + "value": "/object-tests/metadata/empty-value.txt" } }, { @@ -171421,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", @@ -171445,7 +179047,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/percent%20.txt" + "value": "/object-tests/metadata/empty-value.txt" } }, { @@ -171501,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", @@ -171527,7 +179130,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-a16607f00956\"" + "value": "\"fixture-e6096f6fd1ec\"" } }, { @@ -171557,6 +179160,14 @@ ] } }, + { + "at": "/value/metadata/empty", + "optional": false, + "rule": { + "is": "equal", + "value": "" + } + }, { "at": "/value/body_base64", "optional": false, @@ -171569,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": [ @@ -171671,7 +179282,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/plus+plus.txt" + "value": "/object-tests/metadata/hyphen-name.txt" } }, { @@ -171718,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", @@ -171742,7 +179354,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/plus+plus.txt" + "value": "/object-tests/metadata/hyphen-name.txt" } }, { @@ -171798,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", @@ -171824,7 +179437,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-1b1e630ad692\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -171854,6 +179467,14 @@ ] } }, + { + "at": "/value/metadata/not-valid", + "optional": false, + "rule": { + "is": "equal", + "value": "1" + } + }, { "at": "/value/body_base64", "optional": false, @@ -171866,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": [ @@ -171968,7 +179589,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/space name.txt" + "value": "/object-tests/metadata/punctuation-name.txt" } }, { @@ -172015,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", @@ -172039,7 +179661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/names/space name.txt" + "value": "/object-tests/metadata/punctuation-name.txt" } }, { @@ -172095,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", @@ -172121,7 +179744,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-d614f09fca44\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -172158,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": [ @@ -172265,7 +179898,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a?b" + "value": "/object-tests/metadata/non-ascii.txt" } }, { @@ -172276,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, @@ -172313,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==" } } }, @@ -172347,7 +179970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a?b" + "value": "/object-tests/metadata/non-ascii.txt" } }, { @@ -172358,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, @@ -172403,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==" } } } @@ -172435,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": [ @@ -172549,7 +180212,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/café/雪" + "value": "/object-tests/metadata/outside-latin-1.txt" } }, { @@ -172560,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, @@ -172597,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==" } } }, @@ -172631,7 +180284,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/café/雪" + "value": "/object-tests/metadata/outside-latin-1.txt" } }, { @@ -172642,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, @@ -172687,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==" } } } @@ -172719,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": [ @@ -172833,7 +180526,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a//b/" + "value": "/object-tests/metadata/split-encoded-words.txt" } }, { @@ -172844,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, @@ -172881,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==" } } }, @@ -172915,7 +180598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/a//b/" + "value": "/object-tests/metadata/split-encoded-words.txt" } }, { @@ -172926,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, @@ -172971,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==" } } } @@ -173003,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": [ @@ -173117,7 +180835,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/empty-value.txt" + "value": "/object-tests/metadata/malformed-encoded-word.txt" } }, { @@ -173164,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", @@ -173189,7 +180907,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/empty-value.txt" + "value": "/object-tests/metadata/malformed-encoded-word.txt" } }, { @@ -173245,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", @@ -173272,7 +180990,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-e6096f6fd1ec\"" + "value": "\"fixture-adae183ea4af\"" } }, { @@ -173303,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": [ @@ -173424,7 +181144,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/hyphen-name.txt" + "value": "/object-tests/metadata/replaced.txt" } }, { @@ -173471,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==" } } }, @@ -173496,7 +181215,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/hyphen-name.txt" + "value": "/object-tests/metadata/replaced.txt" } }, { @@ -173552,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==" } } } @@ -173579,7 +181297,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-adae183ea4af\"" + "value": "\"fixture-8ff37996a1a3\"" } }, { @@ -173609,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": [ @@ -173731,7 +181441,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/punctuation-name.txt" + "value": "/object-tests/metadata/object.txt" } }, { @@ -173778,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", @@ -173803,7 +181514,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/punctuation-name.txt" + "value": "/object-tests/metadata/object.txt" } }, { @@ -173859,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", @@ -173886,7 +181598,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-adae183ea4af\"" + "value": "\"fixture-ee657e36119d\"" } }, { @@ -173917,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": [ @@ -174040,7 +181758,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/non-ascii.txt" + "value": "/object" } }, { @@ -174051,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, @@ -174076,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=" } } }, @@ -174112,7 +181842,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/non-ascii.txt" + "value": "/object" } }, { @@ -174123,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, @@ -174156,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=" } } } @@ -174190,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": [ @@ -174354,7 +182056,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/outside-latin-1.txt" + "value": "/object-tests/read/absent.txt" } }, { @@ -174395,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" } }, { @@ -174426,7 +182126,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/outside-latin-1.txt" + "value": "/object-tests/read/absent.txt" } }, { @@ -174475,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" } } ] @@ -174501,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": [ @@ -174668,7 +182332,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/split-encoded-words.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -174679,6 +182343,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, { "at": "/headers/host", "optional": false, @@ -174709,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": "" } } }, @@ -174740,7 +182409,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/split-encoded-words.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -174751,6 +182420,14 @@ "value": "" } }, + { + "at": "/headers/if-none-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-672b31e65569\"" + } + }, { "at": "/headers/range", "optional": false, @@ -174789,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": "" } } } @@ -174815,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": [ @@ -174977,7 +182606,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/malformed-encoded-word.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -174988,6 +182617,14 @@ "value": "" } }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/host", "optional": false, @@ -175018,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" } }, { @@ -175049,7 +182684,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/malformed-encoded-word.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -175060,6 +182695,14 @@ "value": "" } }, + { + "at": "/headers/if-match", + "optional": false, + "rule": { + "is": "equal", + "value": "\"fixture-db71b2c0257c\"" + } + }, { "at": "/headers/range", "optional": false, @@ -175098,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" } } ] @@ -175124,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": [ { @@ -175286,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" } }, { @@ -175372,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" } }, { @@ -175406,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" } } } @@ -175439,7 +182974,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-8ff37996a1a3\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -175447,7 +182982,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -175474,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": [ { @@ -175583,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" } }, { @@ -175671,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" } }, { @@ -175705,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" } } } @@ -175740,7 +183229,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ee657e36119d\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -175748,7 +183237,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -175771,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": [ { @@ -175900,7 +183402,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -175912,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-" } }, { @@ -175948,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" } }, { @@ -175984,7 +183480,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -175995,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,}" } }, { @@ -176040,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" } } ] @@ -176071,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": [ { @@ -176198,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" } }, { @@ -176283,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" } }, { @@ -176317,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=" + } } } ] @@ -176340,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": [ { @@ -176485,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" } }, { @@ -176608,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==" } } } @@ -176630,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": [ { @@ -176760,11 +184161,11 @@ } }, { - "at": "/headers/if-match", + "at": "/headers/range", "optional": false, "rule": { "is": "equal", - "value": "\"fixture-db71b2c0257c\"" + "value": "bytes=2-5" } }, { @@ -176797,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" } } ] @@ -176906,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": [ @@ -177035,7 +184378,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object" } }, { @@ -177051,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" + ] } }, { @@ -177079,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=" } } } @@ -177111,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": [ @@ -177306,7 +184693,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=5-4" + "value": "bytes=2-5" } }, { @@ -177332,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": [ @@ -177339,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" @@ -177350,7 +184746,7 @@ }, "body": { "encoding": "base64", - "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" + "data": "MjM0NQ==" } } } @@ -177379,7 +184775,7 @@ "optional": false, "rule": { "is": "equal", - "value": 30 + "value": 4 } }, { @@ -177406,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": [ { @@ -177544,7 +184918,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/replaced.bin" } }, { @@ -177555,14 +184929,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=40-" - } - }, { "at": "/headers/host", "optional": false, @@ -177593,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==" + } } }, { @@ -177622,7 +184989,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/replaced.bin" } }, { @@ -177638,7 +185005,7 @@ "optional": false, "rule": { "is": "matches", - "pattern": "bytes=40-[1-9][0-9]{2,}" + "pattern": "bytes=0-[1-9][0-9]{2,}" } }, { @@ -177671,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==" + } } } ] @@ -177694,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": [ { @@ -177823,7 +185215,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/single.bin" } }, { @@ -177834,14 +185226,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=28-63" - } - }, { "at": "/headers/host", "optional": false, @@ -177872,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": [ { @@ -178061,7 +185286,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/single.bin" } }, { @@ -178076,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,}" } }, { @@ -178112,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==" } } } @@ -178143,7 +185368,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-672b31e65569\"" + "value": "\"fixture-0841fa5d9c5c\"" } }, { @@ -178151,7 +185376,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 4 } }, { @@ -178178,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" ], @@ -178196,8 +185421,7 @@ "key": "object-tests/read/object.txt", "op": "get", "range": { - "end": 6, - "start": 2 + "suffix": 100 } }, "exchanges": [ @@ -178307,7 +185531,7 @@ "optional": false, "rule": { "is": "equal", - "value": "bytes=2-5" + "value": "bytes=-100" } }, { @@ -178342,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" @@ -178352,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" } } } @@ -178381,7 +185779,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 30 } }, { @@ -178408,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": [ @@ -178520,7 +185918,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -178536,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" } }, { @@ -178576,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" } }, { @@ -178623,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" } }, { @@ -178665,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" } } } @@ -178699,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": [ @@ -178813,7 +186318,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/replaced.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -178860,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" } } }, @@ -178884,7 +186389,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/replaced.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -178935,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" } } } @@ -178966,7 +186471,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-eef5a071f9f6\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -178974,7 +186479,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -179001,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": [ @@ -179110,7 +186617,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/single.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -179144,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": [ @@ -179157,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" } } }, @@ -179181,7 +186698,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/single.bin" + "value": "/object-tests/read/object.txt" } }, { @@ -179223,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": [ @@ -179232,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" } } } @@ -179263,7 +186790,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-0841fa5d9c5c\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -179271,7 +186798,7 @@ "optional": false, "rule": { "is": "equal", - "value": 4 + "value": 30 } }, { @@ -179298,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": [ { @@ -179421,14 +186959,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-100" - } - }, { "at": "/headers/host", "optional": false, @@ -179452,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": [ @@ -179459,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", @@ -179477,6 +187016,14 @@ }, { "request": [ + { + "at": "/method", + "optional": false, + "rule": { + "is": "equal", + "value": "GET" + } + }, { "at": "/path", "optional": false, @@ -179494,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,}" } }, { @@ -179526,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" ], @@ -179635,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" } } } @@ -179703,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": [ { @@ -179824,14 +187292,6 @@ "value": "" } }, - { - "at": "/headers/range", - "optional": false, - "rule": { - "is": "equal", - "value": "bytes=-6" - } - }, { "at": "/headers/host", "optional": false, @@ -179855,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": [ @@ -179862,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, @@ -179897,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,}" } }, { @@ -179929,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" ], @@ -180038,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" } } } @@ -180061,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" @@ -180188,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 @@ -180237,7 +187661,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "fixture-session-token-2" } }, { @@ -180245,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}" } } ], @@ -180316,7 +187740,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token" + "value": "fixture-session-token-2" } }, { @@ -180324,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}" } } ], @@ -180408,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": [ @@ -180488,7 +187911,7 @@ }, "body_time": { "text": "SESSION_EXPIRATION", - "offset_seconds": -60 + "offset_seconds": 300 } } } @@ -180511,11 +187934,11 @@ "optional": false, "rule": { "is": "equal", - "value": "/" + "value": "/object" } }, { - "at": "/query/session", + "at": "/body_base64", "optional": false, "rule": { "is": "equal", @@ -180523,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" + ] } }, { @@ -180608,7 +187970,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token-2" + "value": "fixture-session-token" } }, { @@ -180616,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+" } } }, @@ -180655,7 +188016,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object" } }, { @@ -180666,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, @@ -180687,7 +188060,7 @@ "optional": false, "rule": { "is": "equal", - "value": "fixture-session-token-2" + "value": "fixture-session-token" } }, { @@ -180695,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+" } } } @@ -180732,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" @@ -180938,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=" } } }, @@ -181024,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=" } } } @@ -181056,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": [ @@ -181166,7 +188507,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -181177,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, @@ -181214,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 } }, { @@ -181249,7 +188579,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object" + "value": "/object-tests/read/object.txt" } }, { @@ -181260,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, @@ -181305,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": [ { @@ -181381,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", @@ -181401,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": [ { @@ -181465,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, @@ -181491,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" @@ -181507,8 +188799,7 @@ "body": { "encoding": "base64", "data": "MDEyMzQ1Njc4OS1vYmplY3QtdGVzdHMtb2JqZWN0" - }, - "truncate_body_after": 15 + } } }, { @@ -181540,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": "" } }, { @@ -181575,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": [ { @@ -181622,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, @@ -181648,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": [ { @@ -181694,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, @@ -181728,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" } }, { @@ -181779,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" } }, { @@ -181893,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}" } } ], @@ -181909,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": [ @@ -182075,7 +189433,8 @@ "framing": "chunked" } } - ] + ], + "optional": true }, { "alternatives": [ @@ -182301,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": [ { @@ -182411,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, @@ -182454,7 +189738,12 @@ }, "framing": "chunked" } - }, + } + ], + "optional": true + }, + { + "alternatives": [ { "request": [ { @@ -182481,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, @@ -182532,12 +189813,7 @@ }, "framing": "chunked" } - } - ], - "optional": true - }, - { - "alternatives": [ + }, { "request": [ { @@ -182564,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, @@ -182607,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": [ { @@ -182623,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, @@ -182651,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" } } ], @@ -182672,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": [ @@ -182740,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": [ @@ -182747,7 +190077,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 412, "headers": { "content-type": "application/xml", "date": { @@ -182756,7 +190086,7 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nPreconditionFailedFixture error" }, "framing": "chunked" } @@ -182818,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": [ @@ -182825,7 +190163,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 412, "headers": { "content-type": "application/xml", "date": { @@ -182834,13 +190172,12 @@ }, "body": { "encoding": "utf8", - "data": "\nSlowDownPlease reduce your request rate.fixture" + "data": "\nPreconditionFailedFixture error" }, "framing": "chunked" } } - ], - "optional": true + ] } ], "expect": [ @@ -182857,7 +190194,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 412 } }, { @@ -182865,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" }, @@ -183011,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" } } ], @@ -183024,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" + } } }, { @@ -183097,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" } } ], @@ -183110,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" + } } } ] @@ -183133,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" }, @@ -183299,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" } } ], @@ -183386,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" } } ], @@ -183470,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" }, @@ -183613,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" } } ], @@ -183622,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" } } }, @@ -183700,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" } } ], @@ -183709,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" } } } @@ -183734,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" }, @@ -183927,7 +191254,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "not a date" } } ], @@ -183936,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" } } }, @@ -184012,7 +191341,7 @@ "optional": false, "rule": { "is": "equal", - "value": "Mon, 01 Jan 2024 00:00:00 GMT" + "value": "not a date" } } ], @@ -184021,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" } } } @@ -184043,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" }, @@ -184130,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", @@ -184195,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": [ @@ -184212,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" }, @@ -184282,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": [ @@ -184299,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" }, @@ -184341,14 +191726,6 @@ "value": 30 } }, - { - "at": "/value/content_type", - "optional": false, - "rule": { - "is": "equal", - "value": "binary/octet-stream" - } - }, { "at": "/value/version", "optional": true, @@ -184367,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": [ { @@ -184469,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", @@ -184495,7 +191875,7 @@ "optional": false, "rule": { "is": "equal", - "value": "GET" + "value": "HEAD" } }, { @@ -184503,7 +191883,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/multipart/object.bin" } }, { @@ -184546,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": [ { @@ -184577,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", @@ -184589,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": "" } }, { @@ -184626,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": "" } } } @@ -184662,7 +192169,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-672b31e65569\"" + "value": "\"fixture-ee657e36119d\"" } }, { @@ -184670,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 } }, { @@ -184697,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": [ @@ -184830,7 +192321,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/multipart/object.bin" + "value": "/object-tests/read/absent.txt" } }, { @@ -184871,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", @@ -184896,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" ] } } @@ -184938,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": [ @@ -185040,7 +192512,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/metadata/object.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -185083,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", @@ -185116,7 +192586,7 @@ "optional": false, "rule": { "is": "equal", - "value": "\"fixture-ee657e36119d\"" + "value": "\"fixture-672b31e65569\"" } }, { @@ -185124,7 +192594,7 @@ "optional": false, "rule": { "is": "equal", - "value": 1 + "value": 30 } }, { @@ -185145,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": [ @@ -185237,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", @@ -185268,7 +192725,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/absent.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -185309,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", @@ -185331,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" }, @@ -185493,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": [ @@ -185500,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" } } } @@ -185525,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": [ @@ -185638,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", @@ -185672,7 +193149,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/keys/question?mark.txt" } }, { @@ -185715,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" }, @@ -185760,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": [ @@ -185910,7 +193359,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/read/object.txt" + "value": "/object-tests/keys/hash#tag.txt" } }, { @@ -185944,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": [ @@ -185959,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": "" } } } @@ -185979,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": [ @@ -186096,7 +193569,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/question?mark.txt" + "value": "/object-tests/keys/percent%20.txt" } }, { @@ -186204,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": [ @@ -186306,7 +193779,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/hash#tag.txt" + "value": "/object-tests/keys/plus+plus.txt" } }, { @@ -186414,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": [ @@ -186516,7 +193989,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/percent%20.txt" + "value": "/object-tests/keys/space name.txt" } }, { @@ -186624,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": [ @@ -186726,7 +194199,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/plus+plus.txt" + "value": "/object-tests/keys/café/雪.txt" } }, { @@ -186834,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": [ @@ -186936,7 +194409,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/space name.txt" + "value": "/object-tests/keys/double//slash.txt" } }, { @@ -187044,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": [ @@ -187146,7 +194619,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/café/雪.txt" + "value": "/object-tests/keys/trailing-slash/" } }, { @@ -187254,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": [ @@ -187356,7 +194831,7 @@ "optional": false, "rule": { "is": "equal", - "value": "/object-tests/keys/double//slash.txt" + "value": "/object-tests/read/object.txt" } }, { @@ -187390,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" } } ], @@ -187615,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", @@ -187669,6 +194944,18 @@ "" ] } + }, + { + "at": "/value/checksum", + "optional": false, + "rule": { + "is": "equal", + "value": { + "algorithm": "crc64nvme", + "type": "full_object", + "value_base64": "efafnZ4dTjo=" + } + } } ], "refusal": null @@ -190234,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": [ { @@ -190287,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, @@ -190302,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" } } ], @@ -190323,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": [ @@ -190421,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" } }, { @@ -190523,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": [ @@ -190546,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": [ @@ -190827,7 +199435,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "0" } }, { @@ -190860,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" + } } }, { @@ -190921,7 +199529,7 @@ "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "0" } }, { @@ -190962,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 + } } } ] @@ -191030,6 +199763,14 @@ "value": "2" } }, + { + "at": "/query/continuation-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/88ab99096baf=" + } + }, { "at": "/headers/host", "optional": false, @@ -191060,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" + } } }, { @@ -191124,6 +199865,14 @@ "value": "2" } }, + { + "at": "/query/continuation-token", + "optional": false, + "rule": { + "is": "equal", + "value": "fixture-marker+/88ab99096baf=" + } + }, { "at": "/headers/host", "optional": false, @@ -191162,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": [ @@ -191220,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": "/" } }, { @@ -191261,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/" + } } }, { @@ -191314,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": "/" } }, { @@ -191363,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": [ { @@ -191401,7 +200786,7 @@ } }, { - "at": "/body_base64", + "at": "/query/session", "optional": false, "rule": { "is": "equal", @@ -191409,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, @@ -191462,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" + } } }, { @@ -191515,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/" } }, { @@ -191564,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": [ { @@ -191602,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, @@ -191641,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" } } ], @@ -191765,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": [ @@ -191827,11 +201647,11 @@ } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "-" } }, { @@ -191864,7 +201684,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 400, "headers": { "content-type": "application/xml", "date": { @@ -191873,7 +201693,7 @@ }, "body": { "encoding": "utf8", - "data": "\nServiceUnavailablePlease reduce your request rate.fixture" + "data": "\nInvalidRequestFixture error" }, "framing": "chunked" } @@ -191921,11 +201741,11 @@ } }, { - "at": "/query/max-keys", + "at": "/query/delimiter", "optional": false, "rule": { "is": "equal", - "value": "2" + "value": "-" } }, { @@ -191966,7 +201786,7 @@ ], "allow_query": [], "response": { - "status": 503, + "status": 400, "headers": { "content-type": "application/xml", "date": { @@ -191975,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": [ @@ -191998,7 +201817,7 @@ "optional": false, "rule": { "is": "equal", - "value": 503 + "value": 400 } }, { @@ -192006,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": [ @@ -192143,14 +202002,6 @@ "value": "object-tests/board/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "0" - } - }, { "at": "/headers/host", "optional": false, @@ -192191,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" } } }, @@ -192237,14 +202088,6 @@ "value": "object-tests/board/" } }, - { - "at": "/query/max-keys", - "optional": false, - "rule": { - "is": "equal", - "value": "0" - } - }, { "at": "/headers/host", "optional": false, @@ -192293,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" } } } @@ -192309,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, @@ -192322,7 +202336,7 @@ "optional": false, "rule": { "is": "array_length", - "value": 0 + "value": 3 } }, { @@ -192337,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": [ { @@ -192453,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/" } } ], @@ -192524,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" } } }, @@ -192555,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/" } } ], @@ -192634,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" } } } @@ -192651,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": [ { @@ -192850,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" } } ], @@ -192913,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" } } }, @@ -192944,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" } } ], @@ -193015,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": [ { @@ -193580,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" } } ], @@ -193635,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" } } }, @@ -193666,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" } } ], @@ -193729,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" } } } @@ -193746,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": [ { @@ -194344,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": "/" } } ], @@ -194397,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/" + } } }, { @@ -194438,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": "/" } } ], @@ -194499,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/" + } } } ] @@ -194522,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": [ { @@ -194700,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/" } } ], @@ -194755,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" } } }, @@ -194786,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/" } } ], @@ -194849,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" } } } @@ -194866,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 } } ], From 7873082a0957f43ff0685d815f3be4cfaf2498d0 Mon Sep 17 00:00:00 2001 From: Tip ten Brink <75669206+tiptenbrink@users.noreply.github.com> Date: Sat, 3 Oct 2026 18:21:50 +0200 Subject: [PATCH 5/5] Pin the borink adapter at object-storage 3439c0d. That commit, on borink-org/object-storage#43, speaks this branch's protocol and passes its vectors. Co-Authored-By: Claude Opus 5.5 (1M context) --- adapters/borink/Cargo.lock | 6 +++--- adapters/borink/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) 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.