{ "$schema": "../schema/vector.schema.json", "vectors": [ { "id": "object-crud-0001", "group": "object-crud", "kind": "api", "title": "Put and get a plain text object", "tags": [ "tier-1", "object-crud", "source:storage-test" ], "source": "https://github.com/olizilla/storage-test/blob/1754e86ef101b1b162323b92c58f3018c419995a/tests.json#L7", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test.txt", "Body": "Hello Platform Portability", "ContentType": "text/plain" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test.txt" }, "expect": { "response": { "ContentType": "text/plain" }, "body": "Hello Platform Portability" } } } ] }, { "id": "object-crud-0002", "group": "object-crud", "kind": "api", "title": "Put and get an empty object", "tags": [ "tier-1", "object-crud", "source:storage-test" ], "source": "https://github.com/olizilla/storage-test/blob/1754e86ef101b1b162323b92c58f3018c419995a/tests.json#L79", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty.dat", "Body": "", "ContentType": "application/octet-stream" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty.dat" }, "expect": { "response": { "ContentType": "application/octet-stream" }, "body": "" } } } ] }, { "id": "object-crud-0003", "group": "object-crud", "kind": "api", "title": "Put and get a key containing subdirectories and spaces", "tags": [ "tier-1", "object-crud", "source:storage-test" ], "source": "https://github.com/olizilla/storage-test/blob/1754e86ef101b1b162323b92c58f3018c419995a/tests.json#L103", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "documents/2026/test report.txt", "Body": "Path-style addressing with special characters.", "ContentType": "text/plain" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "documents/2026/test report.txt" }, "expect": { "response": { "ContentType": "text/plain" }, "body": "Path-style addressing with special characters." } } } ] }, { "id": "object-crud-0004", "group": "object-crud", "kind": "api", "title": "Write, read, delete, then verify absence", "tags": [ "tier-1", "object-crud", "source:storage-test" ], "source": "https://github.com/olizilla/storage-test/blob/1754e86ef101b1b162323b92c58f3018c419995a/tests.json#L132", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "lifecycle-test.bin", "Body": "Temporary lifecycle contents.", "ContentType": "application/octet-stream" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "lifecycle-test.bin" }, "expect": { "body": "Temporary lifecycle contents." } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "lifecycle-test.bin" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "lifecycle-test.bin" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0005", "group": "object-crud", "kind": "api", "title": "GetObject response-* query overrides set the corresponding response headers", "description": "Source also passes ResponseExpires='123' (an invalid timestamp string, never asserted); it is omitted here because a typed SDK ResponseExpires member would reformat it and diverge from the raw source request. The source's bucket/object ACLs are 'private', the defaults, so plain prerequisites are used.", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3445", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "ResponseCacheControl": "no-cache", "ResponseContentDisposition": "bla", "ResponseContentEncoding": "aaa", "ResponseContentLanguage": "esperanto", "ResponseContentType": "foo/bar" }, "expect": { "status": 200, "headers": { "content-type": "foo/bar", "content-disposition": "bla", "content-language": "esperanto", "content-encoding": "aaa", "cache-control": "no-cache" } } } } ] }, { "id": "object-crud-0006", "group": "object-crud", "kind": "api", "title": "GetObject with a non-matching If-Match returns PreconditionFailed", "tags": [ "tier-1", "object-crud", "conditional", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3034", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfMatch": "\"ABCORZ\"" }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "object-crud-0007", "group": "object-crud", "kind": "api", "title": "GetObject with a matching If-Match returns the object", "description": "The source captures the ETag from the PutObject response; the object prerequisite's etag attribute is the same value.", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3024", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfMatch": "${res.o1.etag}" }, "expect": { "body": "bar" } } } ] }, { "id": "object-crud-0008", "group": "object-crud", "kind": "api", "title": "GetObject with a future If-Modified-Since is ignored and returns the object", "description": "AWS ignores a future If-Modified-Since (verified against AWS S3: a future If-Modified-Since on an unmodified object returns 200, not 304). Raw-HTTP form so the header is sent verbatim.", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3075", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$http": { "method": "GET", "path": "/${res.b1.name}/foo", "headers": { "if-modified-since": "Fri, 29 Oct 2100 19:43:31 GMT" }, "expect": { "status": 200, "headers": { "etag": "${res.o1.etag}" } } } } ] }, { "id": "object-crud-0009", "group": "object-crud", "kind": "api", "title": "GetObject with a past If-Modified-Since returns the object", "description": "The source passes 'Sat, 29 Oct 1994 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3065", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfModifiedSince": "1994-10-29T19:43:31Z" }, "expect": { "body": "bar" } } } ] }, { "id": "object-crud-0010", "group": "object-crud", "kind": "api", "title": "GetObject with a non-matching If-None-Match returns the object", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3056", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfNoneMatch": "ABCORZ" }, "expect": { "body": "bar" } } } ] }, { "id": "object-crud-0011", "group": "object-crud", "kind": "api", "title": "GetObject with a matching If-None-Match returns 304 with the ETag header", "description": "A 304 response has no error body; the source additionally asserts boto's synthesized error message 'Not Modified' (the HTTP reason phrase). The raw-HTTP form asserts the wire-defined parts: status 304 and the ETag response header.", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3044", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$http": { "method": "GET", "path": "/${res.b1.name}/foo", "headers": { "if-none-match": "${res.o1.etag}" }, "expect": { "status": 304, "headers": { "etag": "${res.o1.etag}" } } } } ] }, { "id": "object-crud-0012", "group": "object-crud", "kind": "api", "title": "GetObject with a future If-Unmodified-Since returns the object", "description": "The source passes 'Sat, 29 Oct 2100 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.", "tags": [ "tier-1", "object-crud", "conditional", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3108", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfUnmodifiedSince": "2100-10-29T19:43:31Z" }, "expect": { "body": "bar" } } } ] }, { "id": "object-crud-0013", "group": "object-crud", "kind": "api", "title": "GetObject with a past If-Unmodified-Since returns PreconditionFailed", "description": "The source passes 'Sat, 29 Oct 1994 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.", "tags": [ "tier-1", "object-crud", "conditional", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3098", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "IfUnmodifiedSince": "1994-10-29T19:43:31Z" }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "object-crud-0014", "group": "object-crud", "kind": "api", "title": "DeleteObjects removes multiple keys and repeating it reports the missing keys as deleted", "tags": [ "tier-3", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1697", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "key0", "body": "key0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "key1", "body": "key1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "key2", "body": "key2" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$length": 3 } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key0" }, { "Key": "key1" }, { "Key": "key2" } ] } }, "expect": { "response": { "Deleted": { "$length": 3 }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$absent": true } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key0" }, { "Key": "key1" }, { "Key": "key2" } ] } }, "expect": { "response": { "Deleted": { "$length": 3 }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "object-crud-0015", "group": "object-crud", "kind": "api", "title": "DeleteObjects with more than 1000 keys returns 400", "description": "The source test seeds 1001 objects and verifies the count via a listing paginator before the delete; the 400 response to a 1001-key request is request validation independent of the objects existing, so the seeding and pagination count-check are omitted. The source asserts only the 400 status, not an error code.", "tags": [ "tier-1", "object-crud", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1761", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key-0" }, { "Key": "key-1" }, { "Key": "key-2" }, { "Key": "key-3" }, { "Key": "key-4" }, { "Key": "key-5" }, { "Key": "key-6" }, { "Key": "key-7" }, { "Key": "key-8" }, { "Key": "key-9" }, { "Key": "key-10" }, { "Key": "key-11" }, { "Key": "key-12" }, { "Key": "key-13" }, { "Key": "key-14" }, { "Key": "key-15" }, { "Key": "key-16" }, { "Key": "key-17" }, { "Key": "key-18" }, { "Key": "key-19" }, { "Key": "key-20" }, { "Key": "key-21" }, { "Key": "key-22" }, { "Key": "key-23" }, { "Key": "key-24" }, { "Key": "key-25" }, { "Key": "key-26" }, { "Key": "key-27" }, { "Key": "key-28" }, { "Key": "key-29" }, { "Key": "key-30" }, { "Key": "key-31" }, { "Key": "key-32" }, { "Key": "key-33" }, { "Key": "key-34" }, { "Key": "key-35" }, { "Key": "key-36" }, { "Key": "key-37" }, { "Key": "key-38" }, { "Key": "key-39" }, { "Key": "key-40" }, { "Key": "key-41" }, { "Key": "key-42" }, { "Key": "key-43" }, { "Key": "key-44" }, { "Key": "key-45" }, { "Key": "key-46" }, { "Key": "key-47" }, { "Key": "key-48" }, { "Key": "key-49" }, { "Key": "key-50" }, { "Key": "key-51" }, { "Key": "key-52" }, { "Key": "key-53" }, { "Key": "key-54" }, { "Key": "key-55" }, { "Key": "key-56" }, { "Key": "key-57" }, { "Key": "key-58" }, { "Key": "key-59" }, { "Key": "key-60" }, { "Key": "key-61" }, { "Key": "key-62" }, { "Key": "key-63" }, { "Key": "key-64" }, { "Key": "key-65" }, { "Key": "key-66" }, { "Key": "key-67" }, { "Key": "key-68" }, { "Key": "key-69" }, { "Key": "key-70" }, { "Key": "key-71" }, { "Key": "key-72" }, { "Key": "key-73" }, { "Key": "key-74" }, { "Key": "key-75" }, { "Key": "key-76" }, { "Key": "key-77" }, { "Key": "key-78" }, { "Key": "key-79" }, { "Key": "key-80" }, { "Key": "key-81" }, { "Key": "key-82" }, { "Key": "key-83" }, { "Key": "key-84" }, { "Key": "key-85" }, { "Key": "key-86" }, { "Key": "key-87" }, { "Key": "key-88" }, { "Key": "key-89" }, { "Key": "key-90" }, { "Key": "key-91" }, { "Key": "key-92" }, { "Key": "key-93" }, { "Key": "key-94" }, { "Key": "key-95" }, { "Key": "key-96" }, { "Key": "key-97" }, { "Key": "key-98" }, { "Key": "key-99" }, { "Key": "key-100" }, { "Key": "key-101" }, { "Key": "key-102" }, { "Key": "key-103" }, { "Key": "key-104" }, { "Key": "key-105" }, { "Key": "key-106" }, { "Key": "key-107" }, { "Key": "key-108" }, { "Key": "key-109" }, { "Key": "key-110" }, { "Key": "key-111" }, { "Key": "key-112" }, { "Key": "key-113" }, { "Key": "key-114" }, { "Key": "key-115" }, { "Key": "key-116" }, { "Key": "key-117" }, { "Key": "key-118" }, { "Key": "key-119" }, { "Key": "key-120" }, { "Key": "key-121" }, { "Key": "key-122" }, { "Key": "key-123" }, { "Key": "key-124" }, { "Key": "key-125" }, { "Key": "key-126" }, { "Key": "key-127" }, { "Key": "key-128" }, { "Key": "key-129" }, { "Key": "key-130" }, { "Key": "key-131" }, { "Key": "key-132" }, { "Key": "key-133" }, { "Key": "key-134" }, { "Key": "key-135" }, { "Key": "key-136" }, { "Key": "key-137" }, { "Key": "key-138" }, { "Key": "key-139" }, { "Key": "key-140" }, { "Key": "key-141" }, { "Key": "key-142" }, { "Key": "key-143" }, { "Key": "key-144" }, { "Key": "key-145" }, { "Key": "key-146" }, { "Key": "key-147" }, { "Key": "key-148" }, { "Key": "key-149" }, { "Key": "key-150" }, { "Key": "key-151" }, { "Key": "key-152" }, { "Key": "key-153" }, { "Key": "key-154" }, { "Key": "key-155" }, { "Key": "key-156" }, { "Key": "key-157" }, { "Key": "key-158" }, { "Key": "key-159" }, { "Key": "key-160" }, { "Key": "key-161" }, { "Key": "key-162" }, { "Key": "key-163" }, { "Key": "key-164" }, { "Key": "key-165" }, { "Key": "key-166" }, { "Key": "key-167" }, { "Key": "key-168" }, { "Key": "key-169" }, { "Key": "key-170" }, { "Key": "key-171" }, { "Key": "key-172" }, { "Key": "key-173" }, { "Key": "key-174" }, { "Key": "key-175" }, { "Key": "key-176" }, { "Key": "key-177" }, { "Key": "key-178" }, { "Key": "key-179" }, { "Key": "key-180" }, { "Key": "key-181" }, { "Key": "key-182" }, { "Key": "key-183" }, { "Key": "key-184" }, { "Key": "key-185" }, { "Key": "key-186" }, { "Key": "key-187" }, { "Key": "key-188" }, { "Key": "key-189" }, { "Key": "key-190" }, { "Key": "key-191" }, { "Key": "key-192" }, { "Key": "key-193" }, { "Key": "key-194" }, { "Key": "key-195" }, { "Key": "key-196" }, { "Key": "key-197" }, { "Key": "key-198" }, { "Key": "key-199" }, { "Key": "key-200" }, { "Key": "key-201" }, { "Key": "key-202" }, { "Key": "key-203" }, { "Key": "key-204" }, { "Key": "key-205" }, { "Key": "key-206" }, { "Key": "key-207" }, { "Key": "key-208" }, { "Key": "key-209" }, { "Key": "key-210" }, { "Key": "key-211" }, { "Key": "key-212" }, { "Key": "key-213" }, { "Key": "key-214" }, { "Key": "key-215" }, { "Key": "key-216" }, { "Key": "key-217" }, { "Key": "key-218" }, { "Key": "key-219" }, { "Key": "key-220" }, { "Key": "key-221" }, { "Key": "key-222" }, { "Key": "key-223" }, { "Key": "key-224" }, { "Key": "key-225" }, { "Key": "key-226" }, { "Key": "key-227" }, { "Key": "key-228" }, { "Key": "key-229" }, { "Key": "key-230" }, { "Key": "key-231" }, { "Key": "key-232" }, { "Key": "key-233" }, { "Key": "key-234" }, { "Key": "key-235" }, { "Key": "key-236" }, { "Key": "key-237" }, { "Key": "key-238" }, { "Key": "key-239" }, { "Key": "key-240" }, { "Key": "key-241" }, { "Key": "key-242" }, { "Key": "key-243" }, { "Key": "key-244" }, { "Key": "key-245" }, { "Key": "key-246" }, { "Key": "key-247" }, { "Key": "key-248" }, { "Key": "key-249" }, { "Key": "key-250" }, { "Key": "key-251" }, { "Key": "key-252" }, { "Key": "key-253" }, { "Key": "key-254" }, { "Key": "key-255" }, { "Key": "key-256" }, { "Key": "key-257" }, { "Key": "key-258" }, { "Key": "key-259" }, { "Key": "key-260" }, { "Key": "key-261" }, { "Key": "key-262" }, { "Key": "key-263" }, { "Key": "key-264" }, { "Key": "key-265" }, { "Key": "key-266" }, { "Key": "key-267" }, { "Key": "key-268" }, { "Key": "key-269" }, { "Key": "key-270" }, { "Key": "key-271" }, { "Key": "key-272" }, { "Key": "key-273" }, { "Key": "key-274" }, { "Key": "key-275" }, { "Key": "key-276" }, { "Key": "key-277" }, { "Key": "key-278" }, { "Key": "key-279" }, { "Key": "key-280" }, { "Key": "key-281" }, { "Key": "key-282" }, { "Key": "key-283" }, { "Key": "key-284" }, { "Key": "key-285" }, { "Key": "key-286" }, { "Key": "key-287" }, { "Key": "key-288" }, { "Key": "key-289" }, { "Key": "key-290" }, { "Key": "key-291" }, { "Key": "key-292" }, { "Key": "key-293" }, { "Key": "key-294" }, { "Key": "key-295" }, { "Key": "key-296" }, { "Key": "key-297" }, { "Key": "key-298" }, { "Key": "key-299" }, { "Key": "key-300" }, { "Key": "key-301" }, { "Key": "key-302" }, { "Key": "key-303" }, { "Key": "key-304" }, { "Key": "key-305" }, { "Key": "key-306" }, { "Key": "key-307" }, { "Key": "key-308" }, { "Key": "key-309" }, { "Key": "key-310" }, { "Key": "key-311" }, { "Key": "key-312" }, { "Key": "key-313" }, { "Key": "key-314" }, { "Key": "key-315" }, { "Key": "key-316" }, { "Key": "key-317" }, { "Key": "key-318" }, { "Key": "key-319" }, { "Key": "key-320" }, { "Key": "key-321" }, { "Key": "key-322" }, { "Key": "key-323" }, { "Key": "key-324" }, { "Key": "key-325" }, { "Key": "key-326" }, { "Key": "key-327" }, { "Key": "key-328" }, { "Key": "key-329" }, { "Key": "key-330" }, { "Key": "key-331" }, { "Key": "key-332" }, { "Key": "key-333" }, { "Key": "key-334" }, { "Key": "key-335" }, { "Key": "key-336" }, { "Key": "key-337" }, { "Key": "key-338" }, { "Key": "key-339" }, { "Key": "key-340" }, { "Key": "key-341" }, { "Key": "key-342" }, { "Key": "key-343" }, { "Key": "key-344" }, { "Key": "key-345" }, { "Key": "key-346" }, { "Key": "key-347" }, { "Key": "key-348" }, { "Key": "key-349" }, { "Key": "key-350" }, { "Key": "key-351" }, { "Key": "key-352" }, { "Key": "key-353" }, { "Key": "key-354" }, { "Key": "key-355" }, { "Key": "key-356" }, { "Key": "key-357" }, { "Key": "key-358" }, { "Key": "key-359" }, { "Key": "key-360" }, { "Key": "key-361" }, { "Key": "key-362" }, { "Key": "key-363" }, { "Key": "key-364" }, { "Key": "key-365" }, { "Key": "key-366" }, { "Key": "key-367" }, { "Key": "key-368" }, { "Key": "key-369" }, { "Key": "key-370" }, { "Key": "key-371" }, { "Key": "key-372" }, { "Key": "key-373" }, { "Key": "key-374" }, { "Key": "key-375" }, { "Key": "key-376" }, { "Key": "key-377" }, { "Key": "key-378" }, { "Key": "key-379" }, { "Key": "key-380" }, { "Key": "key-381" }, { "Key": "key-382" }, { "Key": "key-383" }, { "Key": "key-384" }, { "Key": "key-385" }, { "Key": "key-386" }, { "Key": "key-387" }, { "Key": "key-388" }, { "Key": "key-389" }, { "Key": "key-390" }, { "Key": "key-391" }, { "Key": "key-392" }, { "Key": "key-393" }, { "Key": "key-394" }, { "Key": "key-395" }, { "Key": "key-396" }, { "Key": "key-397" }, { "Key": "key-398" }, { "Key": "key-399" }, { "Key": "key-400" }, { "Key": "key-401" }, { "Key": "key-402" }, { "Key": "key-403" }, { "Key": "key-404" }, { "Key": "key-405" }, { "Key": "key-406" }, { "Key": "key-407" }, { "Key": "key-408" }, { "Key": "key-409" }, { "Key": "key-410" }, { "Key": "key-411" }, { "Key": "key-412" }, { "Key": "key-413" }, { "Key": "key-414" }, { "Key": "key-415" }, { "Key": "key-416" }, { "Key": "key-417" }, { "Key": "key-418" }, { "Key": "key-419" }, { "Key": "key-420" }, { "Key": "key-421" }, { "Key": "key-422" }, { "Key": "key-423" }, { "Key": "key-424" }, { "Key": "key-425" }, { "Key": "key-426" }, { "Key": "key-427" }, { "Key": "key-428" }, { "Key": "key-429" }, { "Key": "key-430" }, { "Key": "key-431" }, { "Key": "key-432" }, { "Key": "key-433" }, { "Key": "key-434" }, { "Key": "key-435" }, { "Key": "key-436" }, { "Key": "key-437" }, { "Key": "key-438" }, { "Key": "key-439" }, { "Key": "key-440" }, { "Key": "key-441" }, { "Key": "key-442" }, { "Key": "key-443" }, { "Key": "key-444" }, { "Key": "key-445" }, { "Key": "key-446" }, { "Key": "key-447" }, { "Key": "key-448" }, { "Key": "key-449" }, { "Key": "key-450" }, { "Key": "key-451" }, { "Key": "key-452" }, { "Key": "key-453" }, { "Key": "key-454" }, { "Key": "key-455" }, { "Key": "key-456" }, { "Key": "key-457" }, { "Key": "key-458" }, { "Key": "key-459" }, { "Key": "key-460" }, { "Key": "key-461" }, { "Key": "key-462" }, { "Key": "key-463" }, { "Key": "key-464" }, { "Key": "key-465" }, { "Key": "key-466" }, { "Key": "key-467" }, { "Key": "key-468" }, { "Key": "key-469" }, { "Key": "key-470" }, { "Key": "key-471" }, { "Key": "key-472" }, { "Key": "key-473" }, { "Key": "key-474" }, { "Key": "key-475" }, { "Key": "key-476" }, { "Key": "key-477" }, { "Key": "key-478" }, { "Key": "key-479" }, { "Key": "key-480" }, { "Key": "key-481" }, { "Key": "key-482" }, { "Key": "key-483" }, { "Key": "key-484" }, { "Key": "key-485" }, { "Key": "key-486" }, { "Key": "key-487" }, { "Key": "key-488" }, { "Key": "key-489" }, { "Key": "key-490" }, { "Key": "key-491" }, { "Key": "key-492" }, { "Key": "key-493" }, { "Key": "key-494" }, { "Key": "key-495" }, { "Key": "key-496" }, { "Key": "key-497" }, { "Key": "key-498" }, { "Key": "key-499" }, { "Key": "key-500" }, { "Key": "key-501" }, { "Key": "key-502" }, { "Key": "key-503" }, { "Key": "key-504" }, { "Key": "key-505" }, { "Key": "key-506" }, { "Key": "key-507" }, { "Key": "key-508" }, { "Key": "key-509" }, { "Key": "key-510" }, { "Key": "key-511" }, { "Key": "key-512" }, { "Key": "key-513" }, { "Key": "key-514" }, { "Key": "key-515" }, { "Key": "key-516" }, { "Key": "key-517" }, { "Key": "key-518" }, { "Key": "key-519" }, { "Key": "key-520" }, { "Key": "key-521" }, { "Key": "key-522" }, { "Key": "key-523" }, { "Key": "key-524" }, { "Key": "key-525" }, { "Key": "key-526" }, { "Key": "key-527" }, { "Key": "key-528" }, { "Key": "key-529" }, { "Key": "key-530" }, { "Key": "key-531" }, { "Key": "key-532" }, { "Key": "key-533" }, { "Key": "key-534" }, { "Key": "key-535" }, { "Key": "key-536" }, { "Key": "key-537" }, { "Key": "key-538" }, { "Key": "key-539" }, { "Key": "key-540" }, { "Key": "key-541" }, { "Key": "key-542" }, { "Key": "key-543" }, { "Key": "key-544" }, { "Key": "key-545" }, { "Key": "key-546" }, { "Key": "key-547" }, { "Key": "key-548" }, { "Key": "key-549" }, { "Key": "key-550" }, { "Key": "key-551" }, { "Key": "key-552" }, { "Key": "key-553" }, { "Key": "key-554" }, { "Key": "key-555" }, { "Key": "key-556" }, { "Key": "key-557" }, { "Key": "key-558" }, { "Key": "key-559" }, { "Key": "key-560" }, { "Key": "key-561" }, { "Key": "key-562" }, { "Key": "key-563" }, { "Key": "key-564" }, { "Key": "key-565" }, { "Key": "key-566" }, { "Key": "key-567" }, { "Key": "key-568" }, { "Key": "key-569" }, { "Key": "key-570" }, { "Key": "key-571" }, { "Key": "key-572" }, { "Key": "key-573" }, { "Key": "key-574" }, { "Key": "key-575" }, { "Key": "key-576" }, { "Key": "key-577" }, { "Key": "key-578" }, { "Key": "key-579" }, { "Key": "key-580" }, { "Key": "key-581" }, { "Key": "key-582" }, { "Key": "key-583" }, { "Key": "key-584" }, { "Key": "key-585" }, { "Key": "key-586" }, { "Key": "key-587" }, { "Key": "key-588" }, { "Key": "key-589" }, { "Key": "key-590" }, { "Key": "key-591" }, { "Key": "key-592" }, { "Key": "key-593" }, { "Key": "key-594" }, { "Key": "key-595" }, { "Key": "key-596" }, { "Key": "key-597" }, { "Key": "key-598" }, { "Key": "key-599" }, { "Key": "key-600" }, { "Key": "key-601" }, { "Key": "key-602" }, { "Key": "key-603" }, { "Key": "key-604" }, { "Key": "key-605" }, { "Key": "key-606" }, { "Key": "key-607" }, { "Key": "key-608" }, { "Key": "key-609" }, { "Key": "key-610" }, { "Key": "key-611" }, { "Key": "key-612" }, { "Key": "key-613" }, { "Key": "key-614" }, { "Key": "key-615" }, { "Key": "key-616" }, { "Key": "key-617" }, { "Key": "key-618" }, { "Key": "key-619" }, { "Key": "key-620" }, { "Key": "key-621" }, { "Key": "key-622" }, { "Key": "key-623" }, { "Key": "key-624" }, { "Key": "key-625" }, { "Key": "key-626" }, { "Key": "key-627" }, { "Key": "key-628" }, { "Key": "key-629" }, { "Key": "key-630" }, { "Key": "key-631" }, { "Key": "key-632" }, { "Key": "key-633" }, { "Key": "key-634" }, { "Key": "key-635" }, { "Key": "key-636" }, { "Key": "key-637" }, { "Key": "key-638" }, { "Key": "key-639" }, { "Key": "key-640" }, { "Key": "key-641" }, { "Key": "key-642" }, { "Key": "key-643" }, { "Key": "key-644" }, { "Key": "key-645" }, { "Key": "key-646" }, { "Key": "key-647" }, { "Key": "key-648" }, { "Key": "key-649" }, { "Key": "key-650" }, { "Key": "key-651" }, { "Key": "key-652" }, { "Key": "key-653" }, { "Key": "key-654" }, { "Key": "key-655" }, { "Key": "key-656" }, { "Key": "key-657" }, { "Key": "key-658" }, { "Key": "key-659" }, { "Key": "key-660" }, { "Key": "key-661" }, { "Key": "key-662" }, { "Key": "key-663" }, { "Key": "key-664" }, { "Key": "key-665" }, { "Key": "key-666" }, { "Key": "key-667" }, { "Key": "key-668" }, { "Key": "key-669" }, { "Key": "key-670" }, { "Key": "key-671" }, { "Key": "key-672" }, { "Key": "key-673" }, { "Key": "key-674" }, { "Key": "key-675" }, { "Key": "key-676" }, { "Key": "key-677" }, { "Key": "key-678" }, { "Key": "key-679" }, { "Key": "key-680" }, { "Key": "key-681" }, { "Key": "key-682" }, { "Key": "key-683" }, { "Key": "key-684" }, { "Key": "key-685" }, { "Key": "key-686" }, { "Key": "key-687" }, { "Key": "key-688" }, { "Key": "key-689" }, { "Key": "key-690" }, { "Key": "key-691" }, { "Key": "key-692" }, { "Key": "key-693" }, { "Key": "key-694" }, { "Key": "key-695" }, { "Key": "key-696" }, { "Key": "key-697" }, { "Key": "key-698" }, { "Key": "key-699" }, { "Key": "key-700" }, { "Key": "key-701" }, { "Key": "key-702" }, { "Key": "key-703" }, { "Key": "key-704" }, { "Key": "key-705" }, { "Key": "key-706" }, { "Key": "key-707" }, { "Key": "key-708" }, { "Key": "key-709" }, { "Key": "key-710" }, { "Key": "key-711" }, { "Key": "key-712" }, { "Key": "key-713" }, { "Key": "key-714" }, { "Key": "key-715" }, { "Key": "key-716" }, { "Key": "key-717" }, { "Key": "key-718" }, { "Key": "key-719" }, { "Key": "key-720" }, { "Key": "key-721" }, { "Key": "key-722" }, { "Key": "key-723" }, { "Key": "key-724" }, { "Key": "key-725" }, { "Key": "key-726" }, { "Key": "key-727" }, { "Key": "key-728" }, { "Key": "key-729" }, { "Key": "key-730" }, { "Key": "key-731" }, { "Key": "key-732" }, { "Key": "key-733" }, { "Key": "key-734" }, { "Key": "key-735" }, { "Key": "key-736" }, { "Key": "key-737" }, { "Key": "key-738" }, { "Key": "key-739" }, { "Key": "key-740" }, { "Key": "key-741" }, { "Key": "key-742" }, { "Key": "key-743" }, { "Key": "key-744" }, { "Key": "key-745" }, { "Key": "key-746" }, { "Key": "key-747" }, { "Key": "key-748" }, { "Key": "key-749" }, { "Key": "key-750" }, { "Key": "key-751" }, { "Key": "key-752" }, { "Key": "key-753" }, { "Key": "key-754" }, { "Key": "key-755" }, { "Key": "key-756" }, { "Key": "key-757" }, { "Key": "key-758" }, { "Key": "key-759" }, { "Key": "key-760" }, { "Key": "key-761" }, { "Key": "key-762" }, { "Key": "key-763" }, { "Key": "key-764" }, { "Key": "key-765" }, { "Key": "key-766" }, { "Key": "key-767" }, { "Key": "key-768" }, { "Key": "key-769" }, { "Key": "key-770" }, { "Key": "key-771" }, { "Key": "key-772" }, { "Key": "key-773" }, { "Key": "key-774" }, { "Key": "key-775" }, { "Key": "key-776" }, { "Key": "key-777" }, { "Key": "key-778" }, { "Key": "key-779" }, { "Key": "key-780" }, { "Key": "key-781" }, { "Key": "key-782" }, { "Key": "key-783" }, { "Key": "key-784" }, { "Key": "key-785" }, { "Key": "key-786" }, { "Key": "key-787" }, { "Key": "key-788" }, { "Key": "key-789" }, { "Key": "key-790" }, { "Key": "key-791" }, { "Key": "key-792" }, { "Key": "key-793" }, { "Key": "key-794" }, { "Key": "key-795" }, { "Key": "key-796" }, { "Key": "key-797" }, { "Key": "key-798" }, { "Key": "key-799" }, { "Key": "key-800" }, { "Key": "key-801" }, { "Key": "key-802" }, { "Key": "key-803" }, { "Key": "key-804" }, { "Key": "key-805" }, { "Key": "key-806" }, { "Key": "key-807" }, { "Key": "key-808" }, { "Key": "key-809" }, { "Key": "key-810" }, { "Key": "key-811" }, { "Key": "key-812" }, { "Key": "key-813" }, { "Key": "key-814" }, { "Key": "key-815" }, { "Key": "key-816" }, { "Key": "key-817" }, { "Key": "key-818" }, { "Key": "key-819" }, { "Key": "key-820" }, { "Key": "key-821" }, { "Key": "key-822" }, { "Key": "key-823" }, { "Key": "key-824" }, { "Key": "key-825" }, { "Key": "key-826" }, { "Key": "key-827" }, { "Key": "key-828" }, { "Key": "key-829" }, { "Key": "key-830" }, { "Key": "key-831" }, { "Key": "key-832" }, { "Key": "key-833" }, { "Key": "key-834" }, { "Key": "key-835" }, { "Key": "key-836" }, { "Key": "key-837" }, { "Key": "key-838" }, { "Key": "key-839" }, { "Key": "key-840" }, { "Key": "key-841" }, { "Key": "key-842" }, { "Key": "key-843" }, { "Key": "key-844" }, { "Key": "key-845" }, { "Key": "key-846" }, { "Key": "key-847" }, { "Key": "key-848" }, { "Key": "key-849" }, { "Key": "key-850" }, { "Key": "key-851" }, { "Key": "key-852" }, { "Key": "key-853" }, { "Key": "key-854" }, { "Key": "key-855" }, { "Key": "key-856" }, { "Key": "key-857" }, { "Key": "key-858" }, { "Key": "key-859" }, { "Key": "key-860" }, { "Key": "key-861" }, { "Key": "key-862" }, { "Key": "key-863" }, { "Key": "key-864" }, { "Key": "key-865" }, { "Key": "key-866" }, { "Key": "key-867" }, { "Key": "key-868" }, { "Key": "key-869" }, { "Key": "key-870" }, { "Key": "key-871" }, { "Key": "key-872" }, { "Key": "key-873" }, { "Key": "key-874" }, { "Key": "key-875" }, { "Key": "key-876" }, { "Key": "key-877" }, { "Key": "key-878" }, { "Key": "key-879" }, { "Key": "key-880" }, { "Key": "key-881" }, { "Key": "key-882" }, { "Key": "key-883" }, { "Key": "key-884" }, { "Key": "key-885" }, { "Key": "key-886" }, { "Key": "key-887" }, { "Key": "key-888" }, { "Key": "key-889" }, { "Key": "key-890" }, { "Key": "key-891" }, { "Key": "key-892" }, { "Key": "key-893" }, { "Key": "key-894" }, { "Key": "key-895" }, { "Key": "key-896" }, { "Key": "key-897" }, { "Key": "key-898" }, { "Key": "key-899" }, { "Key": "key-900" }, { "Key": "key-901" }, { "Key": "key-902" }, { "Key": "key-903" }, { "Key": "key-904" }, { "Key": "key-905" }, { "Key": "key-906" }, { "Key": "key-907" }, { "Key": "key-908" }, { "Key": "key-909" }, { "Key": "key-910" }, { "Key": "key-911" }, { "Key": "key-912" }, { "Key": "key-913" }, { "Key": "key-914" }, { "Key": "key-915" }, { "Key": "key-916" }, { "Key": "key-917" }, { "Key": "key-918" }, { "Key": "key-919" }, { "Key": "key-920" }, { "Key": "key-921" }, { "Key": "key-922" }, { "Key": "key-923" }, { "Key": "key-924" }, { "Key": "key-925" }, { "Key": "key-926" }, { "Key": "key-927" }, { "Key": "key-928" }, { "Key": "key-929" }, { "Key": "key-930" }, { "Key": "key-931" }, { "Key": "key-932" }, { "Key": "key-933" }, { "Key": "key-934" }, { "Key": "key-935" }, { "Key": "key-936" }, { "Key": "key-937" }, { "Key": "key-938" }, { "Key": "key-939" }, { "Key": "key-940" }, { "Key": "key-941" }, { "Key": "key-942" }, { "Key": "key-943" }, { "Key": "key-944" }, { "Key": "key-945" }, { "Key": "key-946" }, { "Key": "key-947" }, { "Key": "key-948" }, { "Key": "key-949" }, { "Key": "key-950" }, { "Key": "key-951" }, { "Key": "key-952" }, { "Key": "key-953" }, { "Key": "key-954" }, { "Key": "key-955" }, { "Key": "key-956" }, { "Key": "key-957" }, { "Key": "key-958" }, { "Key": "key-959" }, { "Key": "key-960" }, { "Key": "key-961" }, { "Key": "key-962" }, { "Key": "key-963" }, { "Key": "key-964" }, { "Key": "key-965" }, { "Key": "key-966" }, { "Key": "key-967" }, { "Key": "key-968" }, { "Key": "key-969" }, { "Key": "key-970" }, { "Key": "key-971" }, { "Key": "key-972" }, { "Key": "key-973" }, { "Key": "key-974" }, { "Key": "key-975" }, { "Key": "key-976" }, { "Key": "key-977" }, { "Key": "key-978" }, { "Key": "key-979" }, { "Key": "key-980" }, { "Key": "key-981" }, { "Key": "key-982" }, { "Key": "key-983" }, { "Key": "key-984" }, { "Key": "key-985" }, { "Key": "key-986" }, { "Key": "key-987" }, { "Key": "key-988" }, { "Key": "key-989" }, { "Key": "key-990" }, { "Key": "key-991" }, { "Key": "key-992" }, { "Key": "key-993" }, { "Key": "key-994" }, { "Key": "key-995" }, { "Key": "key-996" }, { "Key": "key-997" }, { "Key": "key-998" }, { "Key": "key-999" }, { "Key": "key-1000" } ] } }, "expect": { "status": 400 } } } ] }, { "id": "object-crud-0016", "group": "object-crud", "kind": "api", "title": "DeleteObjects removes multiple keys (verified with ListObjectsV2) and repeating it reports the missing keys as deleted", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1740", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "key0", "body": "key0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "key1", "body": "key1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "key2", "body": "key2" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$length": 3 } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key0" }, { "Key": "key1" }, { "Key": "key2" } ] } }, "expect": { "response": { "Deleted": { "$length": 3 }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$absent": true } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key0" }, { "Key": "key1" }, { "Key": "key2" } ] } }, "expect": { "response": { "Deleted": { "$length": 3 }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "object-crud-0017", "group": "object-crud", "kind": "api", "title": "Content-Encoding set on PutObject is returned by HeadObject", "tags": [ "tier-1", "object-crud", "encoding", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3543", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "gzip" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": "gzip" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "deflate, gzip" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": "deflate, gzip" } } } } ] }, { "id": "object-crud-0018", "group": "object-crud", "kind": "api", "title": "aws-chunked is stripped from the stored Content-Encoding", "description": "S3 removes the aws-chunked token from the Content-Encoding it stores; a Content-Encoding consisting only of aws-chunked tokens is stored as no Content-Encoding at all.", "tags": [ "tier-1", "object-crud", "encoding", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3543", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "gzip, aws-chunked" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": "gzip" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "aws-chunked, gzip" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": "gzip" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "aws-chunked" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding", "ContentEncoding": "aws-chunked, aws-chunked" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding" }, "expect": { "response": { "ContentEncoding": { "$absent": true } } } } } ] }, { "id": "object-crud-0019", "group": "object-crud", "kind": "api", "title": "Anonymous DeleteObject after the bucket is deleted returns NoSuchBucket", "description": "The source sets public-read ACLs on the bucket and object via a shared helper; both are deleted before the tested request, so the ACLs are irrelevant and omitted (bucket prerequisites cannot carry ACLs).", "tags": [ "tier-2", "object-crud", "errors", "anon-access", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3318", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" } } }, { "$operation": { "name": "DeleteBucket", "params": { "Bucket": "${res.b1.name}" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "identity": "anonymous", "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "object-crud-0020", "group": "object-crud", "kind": "api", "title": "HeadObject on an empty object reports ContentLength 0", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1795", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "response": { "ContentLength": 0 } } } } ] }, { "id": "object-crud-0021", "group": "object-crud", "kind": "api", "title": "PutObject without metadata replaces existing metadata", "description": "The source asserts the returned Metadata map is exactly empty; the only metadata ever written is meta1, so absence of the x-amz-meta-meta1 response header expresses the same assertion.", "tags": [ "tier-1", "object-crud", "metadata", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1922", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Metadata": { "meta1": "bar" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "headers": { "x-amz-meta-meta1": { "$absent": true } } } } } ] }, { "id": "object-crud-0022", "group": "object-crud", "kind": "api", "title": "GetObject on a missing key returns NoSuchKey", "tags": [ "tier-1", "object-crud", "errors", "source:ceph-s3-tests", "source:storage-test", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1618", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0023", "group": "object-crud", "kind": "api", "title": "Empty-string user metadata value round-trips", "tags": [ "tier-1", "object-crud", "metadata", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1877", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Metadata": { "meta1": "" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "response": { "Metadata": { "meta1": "" } } } } } ] }, { "id": "object-crud-0024", "group": "object-crud", "kind": "api", "title": "User metadata set on PutObject is returned on GetObject", "tags": [ "tier-1", "object-crud", "metadata", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1873", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Metadata": { "meta1": "mymeta" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "response": { "Metadata": { "meta1": "mymeta" } } } } } ] }, { "id": "object-crud-0025", "group": "object-crud", "kind": "api", "title": "Overwriting an object can replace its metadata value with the empty string", "tags": [ "tier-1", "object-crud", "metadata", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1881", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Metadata": { "meta1": "oldmeta" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "response": { "Metadata": { "meta1": "oldmeta" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Metadata": { "meta1": "" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "response": { "Metadata": { "meta1": "" } } } } } ] }, { "id": "object-crud-0026", "group": "object-crud", "kind": "api", "title": "Cache-Control set on PutObject is returned by HeadObject", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1810", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "CacheControl": "public, max-age=14400" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "headers": { "cache-control": "public, max-age=14400" } } } } ] }, { "id": "object-crud-0027", "group": "object-crud", "kind": "api", "title": "PutObject response ETag is the quoted MD5 of the body", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1803", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar" }, "expect": { "status": 200, "response": { "ETag": "\"37b51d194a7513e45b56f6524f2d51f2\"" } } } } ] }, { "id": "object-crud-0028", "group": "object-crud", "kind": "api", "title": "Expires set on PutObject is returned by HeadObject", "description": "The source sets Expires to now+6000s and compares the round-tripped timestamp; vectors cannot compute relative times, so a fixed far-future instant is used. The expected header value is the RFC 7231 http-date serialization of that instant, which is how SDKs encode timestamp-in-header parameters.", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1819", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar", "Expires": "2030-01-01T00:00:00Z" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "headers": { "expires": "Tue, 01 Jan 2030 00:00:00 GMT" } } } } ] }, { "id": "object-crud-0029", "group": "object-crud", "kind": "api", "title": "PutObject with a binary body reads back identically", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1934", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "body": "bar" } } } ] }, { "id": "object-crud-0030", "group": "object-crud", "kind": "api", "title": "Object write, read, overwrite, re-read and delete round-trip", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1837", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "bar" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "body": "bar" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "soup" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "body": "soup" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" } } } ] }, { "id": "object-crud-0031", "group": "object-crud", "kind": "api", "title": "PutObject to a nonexistent bucket returns NoSuchBucket", "description": "The source uses the literal bucket name 'whatchutalkinboutwillis'; a reserved never-created name is used instead to avoid collisions with real buckets.", "tags": [ "tier-1", "object-crud", "errors", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1582", "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "s3v-ceph-no-such-bucket-putobj", "Key": "foo", "Body": "foo" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "object-crud-0032", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes on a simple object returns size, unquoted ETag and storage class", "description": "ETag is the unquoted MD5 of the 3-byte body 'foo'. Attributes not applicable (DeleteMarker, VersionId, ObjectParts) must be absent.", "tags": [ "tier-3", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19321", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj", "body": "foo" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "ObjectAttributes": [ "ETag", "Checksum", "ObjectParts", "StorageClass", "ObjectSize" ] }, "expect": { "response": { "ObjectSize": 3, "ETag": "acbd18db4cc2f85cedef654fccc4a4d8", "StorageClass": "STANDARD", "DeleteMarker": { "$absent": true }, "VersionId": { "$absent": true }, "ObjectParts": { "$absent": true } } } } } ] }, { "id": "object-crud-0033", "group": "object-crud", "kind": "api", "title": "Authenticated PutObject succeeds with HTTP 200", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L3595", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "foo" }, "expect": { "status": 200 } } } ] }, { "id": "object-crud-0034", "group": "object-crud", "kind": "api", "title": "Control characters in an object key are valid and round-trip", "description": "AWS accepts C1 control characters (e.g. U+008A) as valid object-key bytes; the key round-trips through PutObject/GetObject (verified against AWS S3). An \"unparseable URI\" 400 only arises from a raw request line containing a literal control byte, which an SDK operation cannot produce.", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L14078", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "®Š-", "Body": "data" }, "expect": { "response": { "ETag": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "®Š-" }, "expect": { "body": "data" } } } ] }, { "id": "object-crud-0035", "group": "object-crud", "kind": "api", "title": "Ranged GetObject over an 8 MiB object returns 206 with the correct middle slice", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7582", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": { "$data": "content" } } } ], "data": { "content": { "$prng": { "seed": "object-crud-0035/content", "size": 8388608 } }, "mid": { "$slice": { "of": "content", "offset": 3145728, "length": 2097153 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=3145728-5242880" }, "expect": { "status": 206, "headers": { "content-range": "bytes 3145728-5242880/8388608" }, "body": { "$data": "mid" } } } } ] }, { "id": "object-crud-0036", "group": "object-crud", "kind": "api", "title": "Ranged GetObject on an empty object returns 416 InvalidRange", "tags": [ "tier-1", "object-crud", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7640", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": "" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=40-50" }, "expect": { "status": 416, "error": "InvalidRange" } } } ] }, { "id": "object-crud-0037", "group": "object-crud", "kind": "api", "title": "Ranged GetObject entirely beyond the object size returns 416 InvalidRange", "tags": [ "tier-1", "object-crud", "errors", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7626", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": "testcontent" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=40-50" }, "expect": { "status": 416, "error": "InvalidRange" } } } ] }, { "id": "object-crud-0038", "group": "object-crud", "kind": "api", "title": "Ranged GetObject returns 206 with the requested slice and Content-Range", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7564", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": "testcontent" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=4-7" }, "expect": { "status": 206, "headers": { "content-range": "bytes 4-7/11" }, "body": "cont" } } } ] }, { "id": "object-crud-0039", "group": "object-crud", "kind": "api", "title": "Ranged GetObject with a suffix range returns the trailing bytes", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7612", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": "testcontent" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=-7" }, "expect": { "status": 206, "headers": { "content-range": "bytes 4-10/11" }, "body": "content" } } } ] }, { "id": "object-crud-0040", "group": "object-crud", "kind": "api", "title": "Ranged GetObject with an open-ended range skips leading bytes", "tags": [ "tier-1", "object-crud", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7597", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "testobj", "body": "testcontent" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Range": "bytes=4-" }, "expect": { "status": 206, "headers": { "content-range": "bytes 4-10/11" }, "body": "content" } } } ] }, { "id": "object-crud-0041", "group": "object-crud", "kind": "api", "title": "DeleteObjects bulk-deletes 20 objects and leaves the prefix empty", "description": "Reduced from the source test's batch-operations flow: concurrent copy/tagging phases are omitted; the bulk delete is applied to the batch-uploaded objects.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/19.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "batch/object-000.txt", "body": "Batch object 0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "batch/object-001.txt", "body": "Batch object 1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "batch/object-002.txt", "body": "Batch object 2" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "batch/object-003.txt", "body": "Batch object 3" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "batch/object-004.txt", "body": "Batch object 4" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "batch/object-005.txt", "body": "Batch object 5" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "batch/object-006.txt", "body": "Batch object 6" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "batch/object-007.txt", "body": "Batch object 7" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "batch/object-008.txt", "body": "Batch object 8" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "batch/object-009.txt", "body": "Batch object 9" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "batch/object-010.txt", "body": "Batch object 10" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "batch/object-011.txt", "body": "Batch object 11" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "batch/object-012.txt", "body": "Batch object 12" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "batch/object-013.txt", "body": "Batch object 13" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "batch/object-014.txt", "body": "Batch object 14" } }, { "$object": { "handle": "o16", "bucket": "b1", "key": "batch/object-015.txt", "body": "Batch object 15" } }, { "$object": { "handle": "o17", "bucket": "b1", "key": "batch/object-016.txt", "body": "Batch object 16" } }, { "$object": { "handle": "o18", "bucket": "b1", "key": "batch/object-017.txt", "body": "Batch object 17" } }, { "$object": { "handle": "o19", "bucket": "b1", "key": "batch/object-018.txt", "body": "Batch object 18" } }, { "$object": { "handle": "o20", "bucket": "b1", "key": "batch/object-019.txt", "body": "Batch object 19" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "batch/" }, "expect": { "response": { "KeyCount": 20 } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "batch/object-000.txt" }, { "Key": "batch/object-001.txt" }, { "Key": "batch/object-002.txt" }, { "Key": "batch/object-003.txt" }, { "Key": "batch/object-004.txt" }, { "Key": "batch/object-005.txt" }, { "Key": "batch/object-006.txt" }, { "Key": "batch/object-007.txt" }, { "Key": "batch/object-008.txt" }, { "Key": "batch/object-009.txt" }, { "Key": "batch/object-010.txt" }, { "Key": "batch/object-011.txt" }, { "Key": "batch/object-012.txt" }, { "Key": "batch/object-013.txt" }, { "Key": "batch/object-014.txt" }, { "Key": "batch/object-015.txt" }, { "Key": "batch/object-016.txt" }, { "Key": "batch/object-017.txt" }, { "Key": "batch/object-018.txt" }, { "Key": "batch/object-019.txt" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "batch/" }, "expect": { "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0042", "group": "object-crud", "kind": "api", "title": "Put a simple object, read it back and find it in a listing", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/2.py#L12", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object-002.txt", "Body": "Hello, S3! This is test data for object operations." }, "expect": { "response": { "ETag": { "$exists": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object-002.txt" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object-002.txt" }, "expect": { "body": "Hello, S3! This is test data for object operations." } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$contains": { "Key": "test-object-002.txt" } } } } } } ] }, { "id": "object-crud-0043", "group": "object-crud", "kind": "api", "title": "Deleted object returns NoSuchKey on GET and disappears from listing", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/3.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-1024.bin", "body": { "$data": "seed1k" } } } ], "data": { "seed1k": { "$prng": { "seed": "object-crud-0043/seed1k", "size": 1024 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-1024.bin" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-1024.bin" }, "expect": { "status": 204 } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-1024.bin" }, "expect": { "status": 404 } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-1024.bin" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0044", "group": "object-crud", "kind": "api", "title": "Cache-Control header round-trips for several directive combinations", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/33.py#L12", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "no-cache.txt", "Body": "Cached content", "CacheControl": "no-cache" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "no-cache.txt" }, "expect": { "response": { "CacheControl": "no-cache" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "public.txt", "Body": "Cached content", "CacheControl": "public, max-age=3600" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "public.txt" }, "expect": { "response": { "CacheControl": "public, max-age=3600" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "private.txt", "Body": "Cached content", "CacheControl": "private, max-age=0" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "private.txt" }, "expect": { "response": { "CacheControl": "private, max-age=0" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "immutable.txt", "Body": "Cached content", "CacheControl": "public, max-age=31536000, immutable" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "immutable.txt" }, "expect": { "response": { "CacheControl": "public, max-age=31536000, immutable" } } } } ] }, { "id": "object-crud-0045", "group": "object-crud", "kind": "api", "title": "Content-Encoding gzip header round-trips on a gzip-compressed object", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/34.py#L12", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "compressed.txt.gz", "Body": { "$base64": "H4sIAAAAAAAC/wvJyCxWAKKSjFSF/KLM9My8xByF5Py8ktS8EqBgYolCeWZOjkJSKlAwt6Aotbg4NSVkVM+w0wMAkLUnrAgCAAA=" }, "ContentEncoding": "gzip", "ContentType": "text/plain" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "compressed.txt.gz" }, "expect": { "response": { "ContentEncoding": "gzip" } } } } ] }, { "id": "object-crud-0046", "group": "object-crud", "kind": "api", "title": "Content-Disposition header round-trips for inline, attachment and filename forms", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/35.py#L12", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "inline-file.pdf", "Body": "PDF content", "ContentDisposition": "inline" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "inline-file.pdf" }, "expect": { "response": { "ContentDisposition": "inline" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "download.pdf", "Body": "PDF content", "ContentDisposition": "attachment" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "download.pdf" }, "expect": { "response": { "ContentDisposition": "attachment" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "named.pdf", "Body": "PDF content", "ContentDisposition": "attachment; filename=\"custom-name.pdf\"" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "named.pdf" }, "expect": { "response": { "ContentDisposition": "attachment; filename=\"custom-name.pdf\"" } } } } ] }, { "id": "object-crud-0047", "group": "object-crud", "kind": "api", "title": "Single-part PutObject ETag equals content MD5 and metadata is preserved", "tags": [ "tier-1", "object-crud", "checksums", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/4.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "d": { "$pattern": { "pattern": "This is test data for MD5 validation", "size": 3600 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-md5-validation.bin", "Body": { "$data": "d" }, "Metadata": { "original-md5": "${data.d.md5}" } }, "expect": { "response": { "ETag": "${data.d.etag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-md5-validation.bin" }, "expect": { "response": { "Metadata": { "original-md5": "${data.d.md5}" } }, "body": { "$size": 3600, "$md5": "${data.d.md5}" } } } } ] }, { "id": "object-crud-0048", "group": "object-crud", "kind": "api", "title": "PutObject with 10 user metadata entries, all returned by HeadObject", "tags": [ "tier-1", "object-crud", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/85.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test.txt", "Body": "Content", "Metadata": { "meta-key-0": "meta-value-0", "meta-key-1": "meta-value-1", "meta-key-2": "meta-value-2", "meta-key-3": "meta-value-3", "meta-key-4": "meta-value-4", "meta-key-5": "meta-value-5", "meta-key-6": "meta-value-6", "meta-key-7": "meta-value-7", "meta-key-8": "meta-value-8", "meta-key-9": "meta-value-9" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test.txt" }, "expect": { "response": { "Metadata": { "meta-key-0": "meta-value-0", "meta-key-1": "meta-value-1", "meta-key-2": "meta-value-2", "meta-key-3": "meta-value-3", "meta-key-4": "meta-value-4", "meta-key-5": "meta-value-5", "meta-key-6": "meta-value-6", "meta-key-7": "meta-value-7", "meta-key-8": "meta-value-8", "meta-key-9": "meta-value-9" } } } } } ] }, { "id": "object-crud-0049", "group": "object-crud", "kind": "api", "title": "Put/get round-trip preserves body bytes and the ETag", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "basic": { "$pattern": { "pattern": "This is test data for integrity verification", "size": 4400 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "integrity-basic", "Body": { "$data": "basic" } }, "capture": { "putEtag": "ETag" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "integrity-basic" }, "expect": { "response": { "ETag": "${cap.putEtag}" }, "body": { "$data": "basic" } } } } ] }, { "id": "object-crud-0050", "group": "object-crud", "kind": "api", "title": "10 MiB object round-trips with size and MD5 intact", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$prng": { "seed": "object-crud-0050/big", "size": 10485760 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "integrity-large", "Body": { "$data": "big" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "integrity-large" }, "expect": { "body": { "$size": 10485760, "$md5": "${data.big.md5}" } } } } ] }, { "id": "object-crud-0051", "group": "object-crud", "kind": "api", "title": "ETag determinism: identical bodies share an ETag, different bodies do not", "description": "Five body pairs (identical, differing digit, case, trailing space, both empty). Inequality is asserted with a negative-lookahead regex against the captured first ETag.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-0-a", "Body": "identical data" }, "capture": { "e0": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-0-b", "Body": "identical data" }, "expect": { "response": { "ETag": "${cap.e0}" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-1-a", "Body": "different data 1" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-1-b", "Body": "different data 2" }, "expect": { "response": { "ETag": { "$ne": "${cap.e1}" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-2-a", "Body": "case sensitive" }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-2-b", "Body": "Case Sensitive" }, "expect": { "response": { "ETag": { "$ne": "${cap.e2}" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-3-a", "Body": "trailing space" }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-3-b", "Body": "trailing space " }, "expect": { "response": { "ETag": { "$ne": "${cap.e3}" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-4-a", "Body": "" }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test-4-b", "Body": "" }, "expect": { "response": { "ETag": "${cap.e4}" } } } } ] }, { "id": "object-crud-0052", "group": "object-crud", "kind": "api", "title": "Ranged GETs return exactly the requested bytes of a patterned object", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "digits": { "$pattern": { "pattern": "0123456789", "size": 10000 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "range-integrity", "Body": { "$data": "digits" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "range-integrity", "Range": "bytes=0-9" }, "expect": { "body": "0123456789" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "range-integrity", "Range": "bytes=100-109" }, "expect": { "body": "0123456789" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "range-integrity", "Range": "bytes=500-519" }, "expect": { "body": "01234567890123456789" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "range-integrity", "Range": "bytes=9990-9999" }, "expect": { "body": "0123456789" } } } ] }, { "id": "object-crud-0053", "group": "object-crud", "kind": "api", "title": "All 256 byte values survive a put/get round-trip", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "bin": { "$pattern": { "patternBase64": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", "size": 256000 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "binary-integrity", "Body": { "$data": "bin" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "binary-integrity" }, "expect": { "body": { "$md5": "${data.bin.md5}" } } } } ] }, { "id": "object-crud-0054", "group": "object-crud", "kind": "api", "title": "PutObject ETag is a quoted hex string across object sizes 0 B to 5 MiB", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_data_integrity.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "e1k": { "$pattern": { "pattern": "E", "size": 1024 } }, "e1m": { "$pattern": { "pattern": "E", "size": 1048576 } }, "e5m": { "$pattern": { "pattern": "E", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-format-0", "Body": "" }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]+\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-format-1", "Body": "E" }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]+\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-format-1024", "Body": { "$data": "e1k" } }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]+\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-format-1048576", "Body": { "$data": "e1m" } }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]+\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-format-5242880", "Body": { "$data": "e5m" } }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]+\"$" } } } } } ] }, { "id": "object-crud-0055", "group": "object-crud", "kind": "api", "title": "DeleteObject on 'dir/' succeeds even when nested keys exist under it", "description": "Original tolerated DirectoryNotEmpty/NoSuchKey from POSIX-backed gateways; S3 semantics are idempotent success.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object_additional.py#L80", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "dir/my-obj", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "dir/" } } } ] }, { "id": "object-crud-0056", "group": "object-crud", "kind": "api", "title": "Deleting 'name' does not remove the distinct object 'name/'", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L114", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj/", "body": "" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj/" }, "expect": { "response": { "ContentLength": 0 } } } } ] }, { "id": "object-crud-0057", "group": "object-crud", "kind": "api", "title": "Deleting directory marker 'dir/' leaves nested 'dir/file' intact", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L141", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/", "body": "" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/bar", "body": "nested" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "foo/bar" } ] } } } } ] }, { "id": "object-crud-0058", "group": "object-crud", "kind": "api", "title": "DeleteObject on a missing key succeeds (idempotent)", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L63", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "non-existing-object" } } } ] }, { "id": "object-crud-0059", "group": "object-crud", "kind": "api", "title": "DeleteObject returns HTTP 204", "description": "Original accepted 200 or 204; S3 responds 204 No Content.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L245", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "body50" } } } ], "data": { "body50": { "$prng": { "seed": "object-crud-0059/body50", "size": 50 } } }, "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "status": 204 } } } ] }, { "id": "object-crud-0060", "group": "object-crud", "kind": "api", "title": "DeleteObject on a non-versioned bucket returns no DeleteMarker", "description": "Original accepted DeleteMarker absent or explicitly false; AWS omits the field on non-versioned buckets, asserted here as absent.", "tags": [ "tier-1", "object-crud", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L214", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "body100" } } } ], "data": { "body100": { "$prng": { "seed": "object-crud-0060/body100", "size": 100 } } }, "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "DeleteMarker": { "$absent": true } } } } } ] }, { "id": "object-crud-0061", "group": "object-crud", "kind": "api", "title": "DeleteObject removes the object; subsequent HeadObject returns 404", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L28", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "body100" } } } ], "data": { "body100": { "$prng": { "seed": "object-crud-0061/body100", "size": 100 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0062", "group": "object-crud", "kind": "api", "title": "Deleting the same key twice succeeds both times", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L85", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "body50" } } } ], "data": { "body50": { "$prng": { "seed": "object-crud-0062/body50", "size": 50 } } }, "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" } } } ] }, { "id": "object-crud-0063", "group": "object-crud", "kind": "api", "title": "DeleteObject works with dashes, underscores, dots, spaces and parens in keys", "tags": [ "tier-1", "object-crud", "encoding", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object.py#L174", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-obj-with-dash", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "test_obj_with_underscore", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "test.obj.with.dots", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "test obj with spaces", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "test(obj)with(parens)", "body": "test" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj-with-dash" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj-with-dash" }, "expect": { "status": 404 } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test_obj_with_underscore" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test_obj_with_underscore" }, "expect": { "status": 404 } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test.obj.with.dots" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test.obj.with.dots" }, "expect": { "status": 404 } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test obj with spaces" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test obj with spaces" }, "expect": { "status": 404 } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test(obj)with(parens)" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test(obj)with(parens)" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0064", "group": "object-crud", "kind": "api", "title": "DeleteObjects with a single missing key reports it deleted and leaves others", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L77", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bar", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "baz", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "non-existing-key" } ] } }, "expect": { "response": { "Deleted": { "$length": 1 }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$length": 3 } } } } } ] }, { "id": "object-crud-0065", "group": "object-crud", "kind": "api", "title": "DeleteObjects deletes a 100-key batch in one request", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L334", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "object-000", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "object-001", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "object-002", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "object-003", "body": "data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "object-004", "body": "data" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "object-005", "body": "data" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "object-006", "body": "data" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "object-007", "body": "data" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "object-008", "body": "data" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "object-009", "body": "data" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "object-010", "body": "data" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "object-011", "body": "data" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "object-012", "body": "data" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "object-013", "body": "data" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "object-014", "body": "data" } }, { "$object": { "handle": "o16", "bucket": "b1", "key": "object-015", "body": "data" } }, { "$object": { "handle": "o17", "bucket": "b1", "key": "object-016", "body": "data" } }, { "$object": { "handle": "o18", "bucket": "b1", "key": "object-017", "body": "data" } }, { "$object": { "handle": "o19", "bucket": "b1", "key": "object-018", "body": "data" } }, { "$object": { "handle": "o20", "bucket": "b1", "key": "object-019", "body": "data" } }, { "$object": { "handle": "o21", "bucket": "b1", "key": "object-020", "body": "data" } }, { "$object": { "handle": "o22", "bucket": "b1", "key": "object-021", "body": "data" } }, { "$object": { "handle": "o23", "bucket": "b1", "key": "object-022", "body": "data" } }, { "$object": { "handle": "o24", "bucket": "b1", "key": "object-023", "body": "data" } }, { "$object": { "handle": "o25", "bucket": "b1", "key": "object-024", "body": "data" } }, { "$object": { "handle": "o26", "bucket": "b1", "key": "object-025", "body": "data" } }, { "$object": { "handle": "o27", "bucket": "b1", "key": "object-026", "body": "data" } }, { "$object": { "handle": "o28", "bucket": "b1", "key": "object-027", "body": "data" } }, { "$object": { "handle": "o29", "bucket": "b1", "key": "object-028", "body": "data" } }, { "$object": { "handle": "o30", "bucket": "b1", "key": "object-029", "body": "data" } }, { "$object": { "handle": "o31", "bucket": "b1", "key": "object-030", "body": "data" } }, { "$object": { "handle": "o32", "bucket": "b1", "key": "object-031", "body": "data" } }, { "$object": { "handle": "o33", "bucket": "b1", "key": "object-032", "body": "data" } }, { "$object": { "handle": "o34", "bucket": "b1", "key": "object-033", "body": "data" } }, { "$object": { "handle": "o35", "bucket": "b1", "key": "object-034", "body": "data" } }, { "$object": { "handle": "o36", "bucket": "b1", "key": "object-035", "body": "data" } }, { "$object": { "handle": "o37", "bucket": "b1", "key": "object-036", "body": "data" } }, { "$object": { "handle": "o38", "bucket": "b1", "key": "object-037", "body": "data" } }, { "$object": { "handle": "o39", "bucket": "b1", "key": "object-038", "body": "data" } }, { "$object": { "handle": "o40", "bucket": "b1", "key": "object-039", "body": "data" } }, { "$object": { "handle": "o41", "bucket": "b1", "key": "object-040", "body": "data" } }, { "$object": { "handle": "o42", "bucket": "b1", "key": "object-041", "body": "data" } }, { "$object": { "handle": "o43", "bucket": "b1", "key": "object-042", "body": "data" } }, { "$object": { "handle": "o44", "bucket": "b1", "key": "object-043", "body": "data" } }, { "$object": { "handle": "o45", "bucket": "b1", "key": "object-044", "body": "data" } }, { "$object": { "handle": "o46", "bucket": "b1", "key": "object-045", "body": "data" } }, { "$object": { "handle": "o47", "bucket": "b1", "key": "object-046", "body": "data" } }, { "$object": { "handle": "o48", "bucket": "b1", "key": "object-047", "body": "data" } }, { "$object": { "handle": "o49", "bucket": "b1", "key": "object-048", "body": "data" } }, { "$object": { "handle": "o50", "bucket": "b1", "key": "object-049", "body": "data" } }, { "$object": { "handle": "o51", "bucket": "b1", "key": "object-050", "body": "data" } }, { "$object": { "handle": "o52", "bucket": "b1", "key": "object-051", "body": "data" } }, { "$object": { "handle": "o53", "bucket": "b1", "key": "object-052", "body": "data" } }, { "$object": { "handle": "o54", "bucket": "b1", "key": "object-053", "body": "data" } }, { "$object": { "handle": "o55", "bucket": "b1", "key": "object-054", "body": "data" } }, { "$object": { "handle": "o56", "bucket": "b1", "key": "object-055", "body": "data" } }, { "$object": { "handle": "o57", "bucket": "b1", "key": "object-056", "body": "data" } }, { "$object": { "handle": "o58", "bucket": "b1", "key": "object-057", "body": "data" } }, { "$object": { "handle": "o59", "bucket": "b1", "key": "object-058", "body": "data" } }, { "$object": { "handle": "o60", "bucket": "b1", "key": "object-059", "body": "data" } }, { "$object": { "handle": "o61", "bucket": "b1", "key": "object-060", "body": "data" } }, { "$object": { "handle": "o62", "bucket": "b1", "key": "object-061", "body": "data" } }, { "$object": { "handle": "o63", "bucket": "b1", "key": "object-062", "body": "data" } }, { "$object": { "handle": "o64", "bucket": "b1", "key": "object-063", "body": "data" } }, { "$object": { "handle": "o65", "bucket": "b1", "key": "object-064", "body": "data" } }, { "$object": { "handle": "o66", "bucket": "b1", "key": "object-065", "body": "data" } }, { "$object": { "handle": "o67", "bucket": "b1", "key": "object-066", "body": "data" } }, { "$object": { "handle": "o68", "bucket": "b1", "key": "object-067", "body": "data" } }, { "$object": { "handle": "o69", "bucket": "b1", "key": "object-068", "body": "data" } }, { "$object": { "handle": "o70", "bucket": "b1", "key": "object-069", "body": "data" } }, { "$object": { "handle": "o71", "bucket": "b1", "key": "object-070", "body": "data" } }, { "$object": { "handle": "o72", "bucket": "b1", "key": "object-071", "body": "data" } }, { "$object": { "handle": "o73", "bucket": "b1", "key": "object-072", "body": "data" } }, { "$object": { "handle": "o74", "bucket": "b1", "key": "object-073", "body": "data" } }, { "$object": { "handle": "o75", "bucket": "b1", "key": "object-074", "body": "data" } }, { "$object": { "handle": "o76", "bucket": "b1", "key": "object-075", "body": "data" } }, { "$object": { "handle": "o77", "bucket": "b1", "key": "object-076", "body": "data" } }, { "$object": { "handle": "o78", "bucket": "b1", "key": "object-077", "body": "data" } }, { "$object": { "handle": "o79", "bucket": "b1", "key": "object-078", "body": "data" } }, { "$object": { "handle": "o80", "bucket": "b1", "key": "object-079", "body": "data" } }, { "$object": { "handle": "o81", "bucket": "b1", "key": "object-080", "body": "data" } }, { "$object": { "handle": "o82", "bucket": "b1", "key": "object-081", "body": "data" } }, { "$object": { "handle": "o83", "bucket": "b1", "key": "object-082", "body": "data" } }, { "$object": { "handle": "o84", "bucket": "b1", "key": "object-083", "body": "data" } }, { "$object": { "handle": "o85", "bucket": "b1", "key": "object-084", "body": "data" } }, { "$object": { "handle": "o86", "bucket": "b1", "key": "object-085", "body": "data" } }, { "$object": { "handle": "o87", "bucket": "b1", "key": "object-086", "body": "data" } }, { "$object": { "handle": "o88", "bucket": "b1", "key": "object-087", "body": "data" } }, { "$object": { "handle": "o89", "bucket": "b1", "key": "object-088", "body": "data" } }, { "$object": { "handle": "o90", "bucket": "b1", "key": "object-089", "body": "data" } }, { "$object": { "handle": "o91", "bucket": "b1", "key": "object-090", "body": "data" } }, { "$object": { "handle": "o92", "bucket": "b1", "key": "object-091", "body": "data" } }, { "$object": { "handle": "o93", "bucket": "b1", "key": "object-092", "body": "data" } }, { "$object": { "handle": "o94", "bucket": "b1", "key": "object-093", "body": "data" } }, { "$object": { "handle": "o95", "bucket": "b1", "key": "object-094", "body": "data" } }, { "$object": { "handle": "o96", "bucket": "b1", "key": "object-095", "body": "data" } }, { "$object": { "handle": "o97", "bucket": "b1", "key": "object-096", "body": "data" } }, { "$object": { "handle": "o98", "bucket": "b1", "key": "object-097", "body": "data" } }, { "$object": { "handle": "o99", "bucket": "b1", "key": "object-098", "body": "data" } }, { "$object": { "handle": "o100", "bucket": "b1", "key": "object-099", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "object-000" }, { "Key": "object-001" }, { "Key": "object-002" }, { "Key": "object-003" }, { "Key": "object-004" }, { "Key": "object-005" }, { "Key": "object-006" }, { "Key": "object-007" }, { "Key": "object-008" }, { "Key": "object-009" }, { "Key": "object-010" }, { "Key": "object-011" }, { "Key": "object-012" }, { "Key": "object-013" }, { "Key": "object-014" }, { "Key": "object-015" }, { "Key": "object-016" }, { "Key": "object-017" }, { "Key": "object-018" }, { "Key": "object-019" }, { "Key": "object-020" }, { "Key": "object-021" }, { "Key": "object-022" }, { "Key": "object-023" }, { "Key": "object-024" }, { "Key": "object-025" }, { "Key": "object-026" }, { "Key": "object-027" }, { "Key": "object-028" }, { "Key": "object-029" }, { "Key": "object-030" }, { "Key": "object-031" }, { "Key": "object-032" }, { "Key": "object-033" }, { "Key": "object-034" }, { "Key": "object-035" }, { "Key": "object-036" }, { "Key": "object-037" }, { "Key": "object-038" }, { "Key": "object-039" }, { "Key": "object-040" }, { "Key": "object-041" }, { "Key": "object-042" }, { "Key": "object-043" }, { "Key": "object-044" }, { "Key": "object-045" }, { "Key": "object-046" }, { "Key": "object-047" }, { "Key": "object-048" }, { "Key": "object-049" }, { "Key": "object-050" }, { "Key": "object-051" }, { "Key": "object-052" }, { "Key": "object-053" }, { "Key": "object-054" }, { "Key": "object-055" }, { "Key": "object-056" }, { "Key": "object-057" }, { "Key": "object-058" }, { "Key": "object-059" }, { "Key": "object-060" }, { "Key": "object-061" }, { "Key": "object-062" }, { "Key": "object-063" }, { "Key": "object-064" }, { "Key": "object-065" }, { "Key": "object-066" }, { "Key": "object-067" }, { "Key": "object-068" }, { "Key": "object-069" }, { "Key": "object-070" }, { "Key": "object-071" }, { "Key": "object-072" }, { "Key": "object-073" }, { "Key": "object-074" }, { "Key": "object-075" }, { "Key": "object-076" }, { "Key": "object-077" }, { "Key": "object-078" }, { "Key": "object-079" }, { "Key": "object-080" }, { "Key": "object-081" }, { "Key": "object-082" }, { "Key": "object-083" }, { "Key": "object-084" }, { "Key": "object-085" }, { "Key": "object-086" }, { "Key": "object-087" }, { "Key": "object-088" }, { "Key": "object-089" }, { "Key": "object-090" }, { "Key": "object-091" }, { "Key": "object-092" }, { "Key": "object-093" }, { "Key": "object-094" }, { "Key": "object-095" }, { "Key": "object-096" }, { "Key": "object-097" }, { "Key": "object-098" }, { "Key": "object-099" } ] } }, "expect": { "response": { "Deleted": { "$length": 100 } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0066", "group": "object-crud", "kind": "api", "title": "DeleteObjects mixing existing and missing keys reports all deleted and empties the bucket", "description": "Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible; the emptied bucket is verified by listing.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L147", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "exists1", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "exists2", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "exists1" }, { "Key": "not-exists1" }, { "Key": "exists2" }, { "Key": "not-exists2" } ] } }, "expect": { "response": { "Deleted": { "$length": 4, "$contains": { "Key": "exists1" } }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0067", "group": "object-crud", "kind": "api", "title": "DeleteObjects on a missing bucket returns NoSuchBucket", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L191", "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "non-existing-bucket-12345", "Delete": { "Objects": [ { "Key": "obj1" } ] } }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "object-crud-0068", "group": "object-crud", "kind": "api", "title": "DeleteObjects on missing keys reports them deleted (idempotent)", "description": "Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L113", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "obj1" }, { "Key": "obj2" } ] } }, "expect": { "response": { "Deleted": { "$length": 2, "$contains": { "Key": "obj1" } }, "Errors": { "$absent": true } } } } } ] }, { "id": "object-crud-0069", "group": "object-crud", "kind": "api", "title": "DeleteObjects in Quiet mode omits the Deleted list but deletes the keys", "description": "Original accepted an empty Deleted list as well; AWS omits it entirely in quiet mode.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L251", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj1", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj2", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj3", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "obj1" }, { "Key": "obj2" }, { "Key": "obj3" } ], "Quiet": true } }, "expect": { "response": { "Deleted": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0070", "group": "object-crud", "kind": "api", "title": "DeleteObjects returns HTTP 200", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L372", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-obj", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "test-obj" } ] } }, "expect": { "status": 200 } } } ] }, { "id": "object-crud-0071", "group": "object-crud", "kind": "api", "title": "DeleteObjects response lists every deleted key", "description": "Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L216", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "file3.txt", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "file1.txt" }, { "Key": "file2.txt" }, { "Key": "file3.txt" } ] } }, "expect": { "response": { "Deleted": { "$length": 3, "$contains": { "Key": "file1.txt" } } } } } } ] }, { "id": "object-crud-0072", "group": "object-crud", "kind": "api", "title": "DeleteObjects removes the named keys and leaves the rest", "description": "Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible; the surviving keys are verified by listing.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L30", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "test data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bar", "body": "test data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "baz", "body": "test data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "obj1", "body": "test data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "obj2", "body": "test data" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "obj3", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "foo" }, { "Key": "bar" }, { "Key": "baz" } ] } }, "expect": { "response": { "Deleted": { "$length": 3, "$contains": { "Key": "foo" } }, "Errors": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "obj1" }, { "Key": "obj2" }, { "Key": "obj3" } ] } } } } ] }, { "id": "object-crud-0073", "group": "object-crud", "kind": "api", "title": "DeleteObjects handles keys with spaces, slashes and @", "description": "Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.", "tags": [ "tier-1", "object-crud", "encoding", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_objects.py#L293", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file with spaces.txt", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file-with-dashes.txt", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "file_with_underscores.txt", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "path/to/file.txt", "body": "data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "file@example.com", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "file with spaces.txt" }, { "Key": "file-with-dashes.txt" }, { "Key": "file_with_underscores.txt" }, { "Key": "path/to/file.txt" }, { "Key": "file@example.com" } ] } }, "expect": { "response": { "Deleted": { "$length": 5, "$contains": { "Key": "file with spaces.txt" } } } } } } ] }, { "id": "object-crud-0074", "group": "object-crud", "kind": "api", "title": "Zero-byte object: upload, HEAD, GET and copy all preserve zero length", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_empty_operations.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object", "Body": "" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 }, "body": "" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "copied-empty", "CopySource": "${res.b1.name}/empty-object" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "copied-empty" }, "expect": { "response": { "ContentLength": 0 } } } } ] }, { "id": "object-crud-0075", "group": "object-crud", "kind": "api", "title": "Empty user-metadata map and empty metadata values are accepted, empty values preserved", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_empty_operations.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-metadata-dict", "Body": "test", "Metadata": {} } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-metadata-values", "Body": "test", "Metadata": { "empty-key": "", "another-empty": "" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-metadata-values" }, "expect": { "response": { "Metadata": { "empty-key": "" } } } } } ] }, { "id": "object-crud-0076", "group": "object-crud", "kind": "api", "title": "Single-character object key is accepted", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_empty_operations.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "a", "Body": "single char key" } } } ] }, { "id": "object-crud-0077", "group": "object-crud", "kind": "api", "title": "ETag is identical across PutObject, HeadObject, GetObject and ListObjectsV2", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-consistency", "Body": "ETag consistency test data" }, "capture": { "etag": "ETag" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-consistency" }, "expect": { "response": { "ETag": "${cap.etag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-consistency" }, "expect": { "response": { "ETag": "${cap.etag}" } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "etag-consistency", "ETag": "${cap.etag}" } ] } } } } ] }, { "id": "object-crud-0078", "group": "object-crud", "kind": "api", "title": "Zero-byte object PUT returns an ETag", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-etag", "Body": "" }, "expect": { "response": { "ETag": { "$exists": true } } } } } ] }, { "id": "object-crud-0079", "group": "object-crud", "kind": "api", "title": "Identical content uploaded to two keys yields identical ETags", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "identical-1", "Body": "Identical content test" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "identical-2", "Body": "Identical content test" }, "expect": { "response": { "ETag": "${cap.etag1}" } } } } ] }, { "id": "object-crud-0080", "group": "object-crud", "kind": "api", "title": "Overwriting an object with different content changes its ETag", "description": "The source asserts only inequality of the two ETags; expressed as a negative-lookahead regex against the captured original ETag.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-modification", "Body": "Original content" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-modification", "Body": "Modified content" }, "expect": { "response": { "ETag": { "$ne": "${cap.etag1}" } } } } } ] }, { "id": "object-crud-0081", "group": "object-crud", "kind": "api", "title": "ETag is a quoted hex string of at least 32 characters across object sizes", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "f1k": { "$pattern": { "pattern": "F", "size": 1024 } }, "f1m": { "$pattern": { "pattern": "F", "size": 1048576 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "format-test-1", "Body": "F" }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]{32,}\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "format-test-100", "Body": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]{32,}\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "format-test-1024", "Body": { "$data": "f1k" } }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]{32,}\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "format-test-1048576", "Body": { "$data": "f1m" } }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-fA-F-]{32,}\"$" } } } } } ] }, { "id": "object-crud-0082", "group": "object-crud", "kind": "api", "title": "Binary, control-character, Unicode and embedded-NUL bodies all yield quoted ETags", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "nullmid": { "$pattern": { "patternBase64": "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQBCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC", "size": 2001 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-binary-data", "Body": { "$base64": "AAECA//+/Q==" } }, "expect": { "response": { "ETag": { "$matches": "^\".*\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-control-characters", "Body": { "$base64": "DQoJAA==" } }, "expect": { "response": { "ETag": { "$matches": "^\".*\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-unicode-data", "Body": { "$base64": "8J+agCBVbmljb2RlIHRlc3Qg5rWL6K+V" } }, "expect": { "response": { "ETag": { "$matches": "^\".*\"$" } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-null-in-middle", "Body": { "$data": "nullmid" } }, "expect": { "response": { "ETag": { "$matches": "^\".*\"$" } } } } } ] }, { "id": "object-crud-0083", "group": "object-crud", "kind": "api", "title": "GetObject after DeleteObject returns 404 NoSuchKey", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_additional.py#L335", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0084", "group": "object-crud", "kind": "api", "title": "GetObject on an existing object returns HTTP 200", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_additional.py#L404", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 200 } } } ] }, { "id": "object-crud-0085", "group": "object-crud", "kind": "api", "title": "Expires header set at upload is returned by GetObject", "description": "The source used utcnow() plus one hour; a fixed future date is equivalent since Expires is stored metadata, not enforced behavior.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_additional.py#L301", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "test data", "Expires": "2030-01-01T00:00:00Z" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "Expires": { "$exists": true } } } } } ] }, { "id": "object-crud-0086", "group": "object-crud", "kind": "api", "title": "WebsiteRedirectLocation set at upload is returned by GetObject", "description": "The source tolerated implementations that omit WebsiteRedirectLocation; converted to the AWS round-trip assertion that the value is echoed back.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_additional.py#L364", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "redirect content", "WebsiteRedirectLocation": "/another-page.html" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "WebsiteRedirectLocation": "/another-page.html" } } } } ] }, { "id": "object-crud-0087", "group": "object-crud", "kind": "api", "title": "GetObject on an empty directory-marker key (trailing slash) returns zero-length body", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_advanced.py#L224", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "mydir/", "body": "" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mydir/" }, "expect": { "response": { "ContentLength": 0 }, "body": { "$size": 0 } } } } ] }, { "id": "object-crud-0088", "group": "object-crud", "kind": "api", "title": "GetObject on a key under a non-existing parent path returns NoSuchKey", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_advanced.py#L274", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "nonexistent/dir/file.txt" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0089", "group": "object-crud", "kind": "api", "title": "GetObject on a missing directory-marker key (trailing slash) returns NoSuchKey", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_advanced.py#L251", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "nonexistent/" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0090", "group": "object-crud", "kind": "api", "title": "GetObject with ResponseExpires sets an Expires header in the response", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_advanced.py#L190", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": "test content" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "ResponseExpires": "2025-12-31T23:59:59Z" }, "expect": { "response": { "Expires": { "$exists": true } }, "body": "test content" } } } ] }, { "id": "object-crud-0091", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes with an empty attributes list returns InvalidArgument", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L180", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [] }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "object-crud-0092", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes returns ETag, ObjectSize, StorageClass and LastModified for an existing object", "tags": [ "tier-3", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L211", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": { "$data": "d" } } } ], "data": { "d": { "$pattern": { "pattern": "x", "size": 45679 } } }, "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag", "ObjectSize", "StorageClass" ] }, "expect": { "response": { "ETag": "${data.d.md5}", "ObjectSize": 45679, "StorageClass": "STANDARD", "LastModified": { "$exists": true }, "Checksum": { "$absent": true } } } } } ] }, { "id": "object-crud-0093", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes with an invalid attribute name alongside a valid one returns InvalidArgument", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L84", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag", "Invalid_argument" ] }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "object-crud-0094", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes on a key nested under an existing file object returns NoSuchKey", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L117", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "not-a-dir", "body": "x" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "not-a-dir/bad-obj", "ObjectAttributes": [ "ETag" ] }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0095", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes with a single invalid attribute name returns InvalidArgument", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L150", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "invalid_attr" ] }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "object-crud-0096", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes on a non-existing bucket returns NoSuchBucket", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L28", "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "goa-no-bucket-2f9c41d7e5a8b6", "Key": "my-obj", "ObjectAttributes": [ "ETag" ] }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "object-crud-0097", "group": "object-crud", "kind": "api", "title": "GetObjectAttributes on a non-existing object returns NoSuchKey", "tags": [ "tier-3", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L56", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag" ] }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0098", "group": "object-crud", "kind": "api", "title": "GetObject ContentLength matches the actual body size", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L251", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "sized-object", "body": { "$data": "body" } } } ], "data": { "body": { "$prng": { "seed": "object-crud-0098/body", "size": 512 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "sized-object" }, "expect": { "response": { "ContentLength": 512 }, "body": { "$size": 512 } } } } ] }, { "id": "object-crud-0099", "group": "object-crud", "kind": "api", "title": "GetObject without trailing slash does not match a directory-style key with slash", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L79", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj/", "body": "" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "error": "NoSuchKey" } } } ] }, { "id": "object-crud-0100", "group": "object-crud", "kind": "api", "title": "GetObject returns a 1 MiB object intact", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L279", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "large-object", "body": { "$data": "body" } } } ], "data": { "body": { "$prng": { "seed": "object-crud-0100/body", "size": 1048576 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-object" }, "expect": { "body": { "$data": "body" } } } } ] }, { "id": "object-crud-0101", "group": "object-crud", "kind": "api", "title": "GetObject response includes a LastModified timestamp", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L225", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "timestamped-object", "body": { "$data": "body" } } } ], "data": { "body": { "$prng": { "seed": "object-crud-0101/body", "size": 64 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "timestamped-object" }, "expect": { "response": { "LastModified": { "$exists": true } } } } } ] }, { "id": "object-crud-0102", "group": "object-crud", "kind": "api", "title": "GetObject returns the Cache-Control value set at upload", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L307", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0102/body", "size": 100 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "cached-object", "Body": { "$data": "body" }, "CacheControl": "max-age=3600" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "cached-object" }, "expect": { "response": { "CacheControl": "max-age=3600" } } } } ] }, { "id": "object-crud-0103", "group": "object-crud", "kind": "api", "title": "GetObject returns the ContentType set at upload", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L166", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "typed-object", "body": { "$data": "body" }, "contentType": "application/json" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0103/body", "size": 100 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "typed-object" }, "expect": { "response": { "ContentType": "application/json" } } } } ] }, { "id": "object-crud-0104", "group": "object-crud", "kind": "api", "title": "GetObject returns user metadata set at upload", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L133", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "object-with-meta", "body": { "$data": "body" }, "metadata": { "author": "test", "version": "1.0" } } } ], "data": { "body": { "$prng": { "seed": "object-crud-0104/body", "size": 256 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "object-with-meta" }, "expect": { "response": { "Metadata": { "author": "test", "version": "1.0" } } } } } ] }, { "id": "object-crud-0105", "group": "object-crud", "kind": "api", "title": "GetObject on a zero-length object returns empty body and ContentLength 0", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_edge_cases.py#L107", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "empty-object", "body": "" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 }, "body": "" } } } ] }, { "id": "object-crud-0106", "group": "object-crud", "kind": "api", "title": "Ranged GetObject over a known byte pattern returns exact bytes for several ranges", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_range.py#L337", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$pattern": { "patternBase64": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", "size": 1024 } }, "r0to9": { "$slice": { "of": "obj", "offset": 0, "length": 10 } }, "r100to199": { "$slice": { "of": "obj", "offset": 100, "length": 100 } }, "r1000to1023": { "$slice": { "of": "obj", "offset": 1000, "length": 24 } }, "r256to511": { "$slice": { "of": "obj", "offset": 256, "length": 256 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-9" }, "expect": { "body": { "$data": "r0to9" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=100-199" }, "expect": { "body": { "$data": "r100to199" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=1000-1023" }, "expect": { "body": { "$data": "r1000to1023" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=256-511" }, "expect": { "body": { "$data": "r256to511" } } } } ] }, { "id": "object-crud-0107", "group": "object-crud", "kind": "api", "title": "Range extending past the object end is trimmed to object size", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_range.py#L194", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0107/obj", "size": 100 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-999" }, "expect": { "response": { "ContentRange": "bytes 0-99/100" }, "body": { "$data": "obj" } } } } ] }, { "id": "object-crud-0108", "group": "object-crud", "kind": "api", "title": "Single-byte ranges bytes=0-0 and bytes=99-99 return exactly one byte", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_range.py#L260", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0108/obj", "size": 100 } }, "byte0": { "$slice": { "of": "obj", "offset": 0, "length": 1 } }, "byte99": { "$slice": { "of": "obj", "offset": 99, "length": 1 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-0" }, "expect": { "response": { "ContentRange": "bytes 0-0/100" }, "body": { "$data": "byte0" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=99-99" }, "expect": { "response": { "ContentRange": "bytes 99-99/100" }, "body": { "$data": "byte99" } } } } ] }, { "id": "object-crud-0109", "group": "object-crud", "kind": "api", "title": "HeadObject with Range on a directory-style key ('dir/') returns 206 partial content", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_additional.py#L331", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-dir/", "body": { "$data": "xbody" } } } ], "data": { "xbody": { "$pattern": { "pattern": "x", "size": 1000 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-dir/", "Range": "bytes=0-99" }, "expect": { "status": 206, "response": { "ContentLength": 100, "ContentRange": { "$exists": true } } } } } ] }, { "id": "object-crud-0110", "group": "object-crud", "kind": "api", "title": "HeadObject on 'key' returns 404 when only 'key/' exists", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_additional.py#L129", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-dir/", "body": { "$data": "xbody" }, "metadata": { "key1": "val1", "key2": "val2" } } } ], "data": { "xbody": { "$pattern": { "pattern": "x", "size": 1234567 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-dir" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0111", "group": "object-crud", "kind": "api", "title": "HeadObject on a key nested under an existing file key returns 404", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_additional.py#L263", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "not-a-dir", "body": "x" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "not-a-dir/bad-obj" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0112", "group": "object-crud", "kind": "api", "title": "HeadObject on 'key/' returns 404 when only 'key' exists", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_additional.py#L95", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": { "$data": "xbody" }, "metadata": { "key1": "val1", "key2": "val2" } } } ], "data": { "xbody": { "$pattern": { "pattern": "x", "size": 1234567 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj/" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0113", "group": "object-crud", "kind": "api", "title": "HeadObject returns ContentType, ContentEncoding, ContentLanguage and ContentDisposition", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L309", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0113/obj", "size": 512 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Body": { "$data": "obj" }, "ContentType": "text/plain", "ContentEncoding": "gzip", "ContentLanguage": "en-US", "ContentDisposition": "attachment; filename=\"test.txt\"" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "ContentType": "text/plain", "ContentEncoding": "gzip", "ContentLanguage": "en-US", "ContentDisposition": "attachment; filename=\"test.txt\"" } } } } ] }, { "id": "object-crud-0114", "group": "object-crud", "kind": "api", "title": "HeadObject returns a LastModified timestamp", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L380", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0114/obj", "size": 64 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "LastModified": { "$exists": true } } } } } ] }, { "id": "object-crud-0115", "group": "object-crud", "kind": "api", "title": "HeadObject on a missing key returns 404", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L29", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "non-existing-object" }, "expect": { "status": 404 } } } ] }, { "id": "object-crud-0116", "group": "object-crud", "kind": "api", "title": "HeadObject returns length, content type, ETag, metadata and LastModified", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0116/obj", "size": 1024 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Body": { "$data": "obj" }, "Metadata": { "test-key": "test-value" }, "ContentType": "application/octet-stream" }, "capture": { "putEtag": "ETag" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "ContentLength": 1024, "ContentType": "application/octet-stream", "ETag": "${cap.putEtag}", "Metadata": { "test-key": "test-value" }, "LastModified": { "$exists": true } } } } } ] }, { "id": "object-crud-0117", "group": "object-crud", "kind": "api", "title": "HeadObject returns user-defined metadata", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L270", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" }, "metadata": { "author": "test-suite", "version": "1.0", "category": "testing" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0117/obj", "size": 256 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object" }, "expect": { "response": { "Metadata": { "author": "test-suite", "version": "1.0", "category": "testing" } } } } } ] }, { "id": "object-crud-0118", "group": "object-crud", "kind": "api", "title": "HeadObject Range extending beyond object size is trimmed to the object", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L106", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0118/obj", "size": 100 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-100" }, "expect": { "response": { "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-999999" }, "expect": { "response": { "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=-101" }, "expect": { "response": { "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } } ] }, { "id": "object-crud-0119", "group": "object-crud", "kind": "api", "title": "HeadObject with malformed Range headers returns the full object", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L148", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0119/obj", "size": 100 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=," }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes= -1" }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=abc" }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=a-z" }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "foo=0-1" }, "expect": { "response": { "ContentLength": 100 } } } } ] }, { "id": "object-crud-0120", "group": "object-crud", "kind": "api", "title": "HeadObject with unsatisfiable Range returns 416", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L189", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0120/obj", "size": 100 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=-0" }, "expect": { "status": 416 } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=100-100" }, "expect": { "status": 416 } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=100-110" }, "expect": { "status": 416 } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=200-300" }, "expect": { "status": 416 } } } ] }, { "id": "object-crud-0121", "group": "object-crud", "kind": "api", "title": "HeadObject with valid Range headers returns correct Content-Range and Content-Length", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_edge_cases.py#L53", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-object", "body": { "$data": "obj" } } } ], "data": { "obj": { "$prng": { "seed": "object-crud-0121/obj", "size": 100 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-0" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 1, "ContentRange": "bytes 0-0/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-99" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-49" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 50, "ContentRange": "bytes 0-49/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=50-99" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 50, "ContentRange": "bytes 50-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=50-" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 50, "ContentRange": "bytes 50-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=0-" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=99-99" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 1, "ContentRange": "bytes 99-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=-1" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 1, "ContentRange": "bytes 99-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=-10" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 10, "ContentRange": "bytes 90-99/100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-object", "Range": "bytes=-100" }, "expect": { "response": { "AcceptRanges": "bytes", "ContentLength": 100, "ContentRange": "bytes 0-99/100" } } } } ] }, { "id": "object-crud-0122", "group": "object-crud", "kind": "api", "title": "Standard response headers set at PutObject are returned by HeadObject", "description": "ContentEncoding 'identity' is sent but not asserted: the original test only required 4 of 5 headers to be preserved. The original also sent an Expires timestamp without asserting it; it is omitted here.", "tags": [ "tier-1", "object-crud", "headers", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_header_handling.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "standard-headers", "Body": "test data", "ContentType": "text/plain", "ContentLanguage": "en-US", "ContentEncoding": "identity", "ContentDisposition": "attachment; filename=\"test.txt\"", "CacheControl": "max-age=3600" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "standard-headers" }, "expect": { "response": { "ContentType": "text/plain", "ContentLanguage": "en-US", "ContentDisposition": "attachment; filename=\"test.txt\"", "CacheControl": "max-age=3600" } } } } ] }, { "id": "object-crud-0123", "group": "object-crud", "kind": "api", "title": "Mixed-case metadata keys are handled case-insensitively and returned lowercased", "tags": [ "tier-1", "object-crud", "headers", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_header_handling.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "case-sensitivity", "Body": "test", "Metadata": { "CamelCase": "value1", "lowercase": "value2", "UPPERCASE": "value3", "Mixed-Kebab-Case": "value4" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "case-sensitivity" }, "expect": { "response": { "Metadata": { "camelcase": "value1", "lowercase": "value2", "uppercase": "value3", "mixed-kebab-case": "value4" } } } } } ] }, { "id": "object-crud-0124", "group": "object-crud", "kind": "api", "title": "ASCII metadata values with spaces, quotes and punctuation are preserved", "description": "The original also sent a non-ASCII (unicode) metadata value but only required 4 of 6 values to survive; the unicode value is omitted here because non-ASCII metadata handling is undefined in S3.", "tags": [ "tier-1", "object-crud", "headers", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_header_handling.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-test", "Body": "test", "Metadata": { "ascii": "simple ascii value", "spaces": "value with spaces", "quotes": "value \"with quotes\"", "encoded": "%20encoded%20value%20", "special-chars": "!@#$%^&*()" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-test" }, "expect": { "response": { "Metadata": { "ascii": "simple ascii value", "spaces": "value with spaces", "quotes": "value \"with quotes\"", "encoded": "%20encoded%20value%20", "special-chars": "!@#$%^&*()" } } } } } ] }, { "id": "object-crud-0125", "group": "object-crud", "kind": "api", "title": "ETag is quoted hex and consistent between PutObject and HeadObject; LastModified is returned", "tags": [ "tier-1", "object-crud", "headers", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_header_handling.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test", "Body": "etag test data" }, "capture": { "putEtag": "ETag" }, "expect": { "response": { "ETag": { "$matches": "^\"[0-9a-f]{32}\"$" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-test" }, "expect": { "response": { "ETag": "${cap.putEtag}", "LastModified": { "$exists": true } } } } } ] }, { "id": "object-crud-0126", "group": "object-crud", "kind": "api", "title": "PutObject accepts user metadata just under the 2KB limit", "tags": [ "tier-1", "object-crud", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-size-test", "Body": "test", "Metadata": { "large": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" } } } } ] }, { "id": "object-crud-0127", "group": "object-crud", "kind": "api", "title": "PutObject rejects user metadata over the 2KB limit", "description": "AWS S3 returns MetadataTooLarge; the original test also accepted RequestHeaderSectionTooLarge.", "tags": [ "tier-1", "object-crud", "metadata", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-overlimit", "Body": "test", "Metadata": { "overlimit": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" } }, "expect": { "status": 400, "error": "MetadataTooLarge" } } } ] }, { "id": "object-crud-0128", "group": "object-crud", "kind": "api", "title": "100 user metadata headers round-trip through PutObject and HeadObject", "tags": [ "tier-1", "object-crud", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-headers", "Body": "test", "Metadata": { "header000": "value0", "header001": "value1", "header002": "value2", "header003": "value3", "header004": "value4", "header005": "value5", "header006": "value6", "header007": "value7", "header008": "value8", "header009": "value9", "header010": "value10", "header011": "value11", "header012": "value12", "header013": "value13", "header014": "value14", "header015": "value15", "header016": "value16", "header017": "value17", "header018": "value18", "header019": "value19", "header020": "value20", "header021": "value21", "header022": "value22", "header023": "value23", "header024": "value24", "header025": "value25", "header026": "value26", "header027": "value27", "header028": "value28", "header029": "value29", "header030": "value30", "header031": "value31", "header032": "value32", "header033": "value33", "header034": "value34", "header035": "value35", "header036": "value36", "header037": "value37", "header038": "value38", "header039": "value39", "header040": "value40", "header041": "value41", "header042": "value42", "header043": "value43", "header044": "value44", "header045": "value45", "header046": "value46", "header047": "value47", "header048": "value48", "header049": "value49", "header050": "value50", "header051": "value51", "header052": "value52", "header053": "value53", "header054": "value54", "header055": "value55", "header056": "value56", "header057": "value57", "header058": "value58", "header059": "value59", "header060": "value60", "header061": "value61", "header062": "value62", "header063": "value63", "header064": "value64", "header065": "value65", "header066": "value66", "header067": "value67", "header068": "value68", "header069": "value69", "header070": "value70", "header071": "value71", "header072": "value72", "header073": "value73", "header074": "value74", "header075": "value75", "header076": "value76", "header077": "value77", "header078": "value78", "header079": "value79", "header080": "value80", "header081": "value81", "header082": "value82", "header083": "value83", "header084": "value84", "header085": "value85", "header086": "value86", "header087": "value87", "header088": "value88", "header089": "value89", "header090": "value90", "header091": "value91", "header092": "value92", "header093": "value93", "header094": "value94", "header095": "value95", "header096": "value96", "header097": "value97", "header098": "value98", "header099": "value99" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-headers" }, "expect": { "response": { "Metadata": { "header000": "value0", "header001": "value1", "header002": "value2", "header003": "value3", "header004": "value4", "header005": "value5", "header006": "value6", "header007": "value7", "header008": "value8", "header009": "value9", "header010": "value10", "header011": "value11", "header012": "value12", "header013": "value13", "header014": "value14", "header015": "value15", "header016": "value16", "header017": "value17", "header018": "value18", "header019": "value19", "header020": "value20", "header021": "value21", "header022": "value22", "header023": "value23", "header024": "value24", "header025": "value25", "header026": "value26", "header027": "value27", "header028": "value28", "header029": "value29", "header030": "value30", "header031": "value31", "header032": "value32", "header033": "value33", "header034": "value34", "header035": "value35", "header036": "value36", "header037": "value37", "header038": "value38", "header039": "value39", "header040": "value40", "header041": "value41", "header042": "value42", "header043": "value43", "header044": "value44", "header045": "value45", "header046": "value46", "header047": "value47", "header048": "value48", "header049": "value49", "header050": "value50", "header051": "value51", "header052": "value52", "header053": "value53", "header054": "value54", "header055": "value55", "header056": "value56", "header057": "value57", "header058": "value58", "header059": "value59", "header060": "value60", "header061": "value61", "header062": "value62", "header063": "value63", "header064": "value64", "header065": "value65", "header066": "value66", "header067": "value67", "header068": "value68", "header069": "value69", "header070": "value70", "header071": "value71", "header072": "value72", "header073": "value73", "header074": "value74", "header075": "value75", "header076": "value76", "header077": "value77", "header078": "value78", "header079": "value79", "header080": "value80", "header081": "value81", "header082": "value82", "header083": "value83", "header084": "value84", "header085": "value85", "header086": "value86", "header087": "value87", "header088": "value88", "header089": "value89", "header090": "value90", "header091": "value91", "header092": "value92", "header093": "value93", "header094": "value94", "header095": "value95", "header096": "value96", "header097": "value97", "header098": "value98", "header099": "value99" } } } } } ] }, { "id": "object-crud-0129", "group": "object-crud", "kind": "api", "title": "ASCII special-character user metadata values round-trip unchanged", "tags": [ "tier-1", "object-crud", "metadata", "unicode", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-metadata", "Body": "test", "Metadata": { "spaces": "value with spaces", "empty": "", "numbers": "12345", "special": "!@#$%^&*()" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "special-metadata" }, "expect": { "response": { "Metadata": { "spaces": "value with spaces", "empty": "", "numbers": "12345", "special": "!@#$%^&*()" } } } } } ], "description": "S3 user metadata must be US-ASCII; non-ASCII values are not portably supported (SDKs reject them or AWS RFC2047-encodes them). This vector covers ASCII special characters only." }, { "id": "object-crud-0130", "group": "object-crud", "kind": "api", "title": "User metadata named after system headers does not override system values", "tags": [ "tier-1", "object-crud", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "reserved-headers", "Body": "test", "Metadata": { "content-type": "fake/type", "content-length": "999", "etag": "fake-etag" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "reserved-headers" }, "expect": { "response": { "ContentLength": 4 } } } } ] }, { "id": "object-crud-0131", "group": "object-crud", "kind": "api", "title": "PutObject accepts a 200-character user metadata key name", "description": "Original test also tolerated an InvalidArgument rejection; AWS S3 accepts long metadata key names within the aggregate 2KB metadata limit.", "tags": [ "tier-1", "object-crud", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_metadata_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "key-name-limits", "Body": "test", "Metadata": { "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": "value" } } } } ] }, { "id": "object-crud-0132", "group": "object-crud", "kind": "api", "title": "Object keys are case-sensitive", "description": "Puts four case variations of the same name and lists to confirm four distinct objects (keys in UTF-8 byte order).", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L360", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "File.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "FILE.TXT", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "FiLe.TxT", "Body": "data" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "FILE.TXT" }, { "Key": "FiLe.TxT" }, { "Key": "File.txt" }, { "Key": "file.txt" } ] } } } } ] }, { "id": "object-crud-0133", "group": "object-crud", "kind": "api", "title": "Keys with consecutive slashes are distinct objects", "description": "Puts keys differing only in the number of consecutive slashes, then lists to confirm all are distinct (AWS behavior; keys in UTF-8 byte order). Source test also tolerated vendor-specific rejection.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L219", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path//file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path///file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path////file.txt", "Body": "data" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "path////file.txt" }, { "Key": "path///file.txt" }, { "Key": "path//file.txt" } ] } } } } ] }, { "id": "object-crud-0134", "group": "object-crud", "kind": "api", "title": "PutObject directory-style key with non-empty body is readable", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L124", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "dir/", "Body": "directory data" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "dir/" }, "expect": { "body": "directory data" } } } ] }, { "id": "object-crud-0135", "group": "object-crud", "kind": "api", "title": "Keys with dot segments are stored literally", "description": "Puts keys containing '.' and '..' segments and lists to confirm all four exist as literal keys (AWS behavior; keys in UTF-8 byte order). Source test also tolerated vendor-specific rejection.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L287", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "./file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "../file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path/./file.txt", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path/../file.txt", "Body": "data" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "../file.txt" }, { "Key": "./file.txt" }, { "Key": "path/../file.txt" }, { "Key": "path/./file.txt" } ] } } } } ] }, { "id": "object-crud-0136", "group": "object-crud", "kind": "api", "title": "PutObject with empty key segments (a//b//c) round-trips", "description": "AWS stores the key literally. Source test also tolerated vendor-specific rejection (XMinioInvalidObjectName etc.).", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L258", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "a//b//c", "Body": "data" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "a//b//c" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "a//b//c" }, "expect": { "body": "data" } } } ] }, { "id": "object-crud-0137", "group": "object-crud", "kind": "api", "title": "PutObject and GetObject with a leading-slash key", "description": "AWS treats a leading slash as part of the literal key. Source test also tolerated vendor-specific rejection (XMinioInvalidResourceName/InvalidObjectName).", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L191", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "/file-with-leading-slash.txt", "Body": "data" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "/file-with-leading-slash.txt" }, "expect": { "body": "data" } } } ] }, { "id": "object-crud-0138", "group": "object-crud", "kind": "api", "title": "PutObject creates file key alongside existing directory-style key", "description": "Creates 'foo/' then 'foo' and verifies both exist as separate objects (AWS behavior). Source test also tolerated vendor-specific rejection (ExistingObjectIsDirectory/InvalidRequest) on filesystem-backed implementations.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L29", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/", "Body": "" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "data" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" } } } ] }, { "id": "object-crud-0139", "group": "object-crud", "kind": "api", "title": "PutObject creates directory-style key alongside existing file key", "description": "Creates 'foo' then 'foo/' and verifies both exist as separate objects (AWS behavior). Source test also tolerated vendor-specific rejection (ObjectParentIsFile/InvalidRequest) on filesystem-backed implementations.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L61", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/", "Body": "" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/" } } } ] }, { "id": "object-crud-0140", "group": "object-crud", "kind": "api", "title": "PutObject creates nested key under an existing file key", "description": "Creates 'foo' then 'foo/bar'; keys are independent on AWS. Source test also tolerated vendor-specific rejection (ObjectParentIsFile/InvalidRequest) on filesystem-backed implementations.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L92", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/bar", "Body": "nested data" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/bar" } } } ] }, { "id": "object-crud-0141", "group": "object-crud", "kind": "api", "title": "PutObject overwrite changes content and ETag", "description": "Source test asserted the two PutObject ETags differ; expressed here as each ETag equaling the MD5 of its distinct body.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L327", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "v1": { "$pattern": { "pattern": "version 1", "size": 9 } }, "v2": { "$pattern": { "pattern": "version 2", "size": 9 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-test.txt", "Body": { "$data": "v1" } }, "expect": { "response": { "ETag": "${data.v1.etag}" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-test.txt", "Body": { "$data": "v2" } }, "expect": { "response": { "ETag": "${data.v2.etag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-test.txt" }, "expect": { "body": { "$data": "v2" } } } } ] }, { "id": "object-crud-0142", "group": "object-crud", "kind": "api", "title": "PutObject accepts keys with normal, trailing, doubled and leading slashes", "description": "AWS accepts all of these keys literally. Source test also tolerated vendor-specific rejection (XMinioInvalidObjectName etc.) of the double/leading-slash keys.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_naming.py#L149", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path/to/file.txt", "Body": "data" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "path/to/file.txt" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "trailing/slash/", "Body": "data" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "trailing/slash/" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "path//double//slash", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "///leading/slashes", "Body": "data" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "mixed///slashes///", "Body": "data" } } } ] }, { "id": "object-crud-0143", "group": "object-crud", "kind": "api", "title": "Zero-byte object: GET returns empty body and HEAD reports ContentLength 0", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_size_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object", "Body": "" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "body": { "$size": 0 } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 } } } } ] }, { "id": "object-crud-0144", "group": "object-crud", "kind": "api", "title": "Small object sizes 1 B to 1 KiB report correct ContentLength", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_size_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "sz1": { "$pattern": { "pattern": "X", "size": 1 } }, "sz2": { "$pattern": { "pattern": "X", "size": 2 } }, "sz3": { "$pattern": { "pattern": "X", "size": 3 } }, "sz4": { "$pattern": { "pattern": "X", "size": 4 } }, "sz5": { "$pattern": { "pattern": "X", "size": 5 } }, "sz10": { "$pattern": { "pattern": "X", "size": 10 } }, "sz100": { "$pattern": { "pattern": "X", "size": 100 } }, "sz255": { "$pattern": { "pattern": "X", "size": 255 } }, "sz256": { "$pattern": { "pattern": "X", "size": 256 } }, "sz512": { "$pattern": { "pattern": "X", "size": 512 } }, "sz1023": { "$pattern": { "pattern": "X", "size": 1023 } }, "sz1024": { "$pattern": { "pattern": "X", "size": 1024 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1", "Body": { "$data": "sz1" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1" }, "expect": { "response": { "ContentLength": 1 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-2", "Body": { "$data": "sz2" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-2" }, "expect": { "response": { "ContentLength": 2 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-3", "Body": { "$data": "sz3" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-3" }, "expect": { "response": { "ContentLength": 3 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-4", "Body": { "$data": "sz4" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-4" }, "expect": { "response": { "ContentLength": 4 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-5", "Body": { "$data": "sz5" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-5" }, "expect": { "response": { "ContentLength": 5 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-10", "Body": { "$data": "sz10" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-10" }, "expect": { "response": { "ContentLength": 10 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-100", "Body": { "$data": "sz100" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-100" }, "expect": { "response": { "ContentLength": 100 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-255", "Body": { "$data": "sz255" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-255" }, "expect": { "response": { "ContentLength": 255 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-256", "Body": { "$data": "sz256" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-256" }, "expect": { "response": { "ContentLength": 256 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-512", "Body": { "$data": "sz512" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-512" }, "expect": { "response": { "ContentLength": 512 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1023", "Body": { "$data": "sz1023" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1023" }, "expect": { "response": { "ContentLength": 1023 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1024", "Body": { "$data": "sz1024" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "size-1024" }, "expect": { "response": { "ContentLength": 1024 } } } } ] }, { "id": "object-crud-0145", "group": "object-crud", "kind": "api", "title": "Power-of-two object sizes 1 KiB to 1 MiB report correct ContentLength", "description": "The source loop reuses the single key 'power-20' for every size (a loop-variable artifact), so each PUT overwrites the previous object and HEAD is checked immediately after each PUT; that request sequence is preserved here.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_size_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p10": { "$pattern": { "pattern": "0", "size": 1024 } }, "p11": { "$pattern": { "pattern": "0", "size": 2048 } }, "p12": { "$pattern": { "pattern": "0", "size": 4096 } }, "p13": { "$pattern": { "pattern": "0", "size": 8192 } }, "p14": { "$pattern": { "pattern": "0", "size": 16384 } }, "p15": { "$pattern": { "pattern": "0", "size": 32768 } }, "p16": { "$pattern": { "pattern": "0", "size": 65536 } }, "p17": { "$pattern": { "pattern": "0", "size": 131072 } }, "p18": { "$pattern": { "pattern": "0", "size": 262144 } }, "p19": { "$pattern": { "pattern": "0", "size": 524288 } }, "p20": { "$pattern": { "pattern": "0", "size": 1048576 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p10" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 1024 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p11" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 2048 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p12" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 4096 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p13" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 8192 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p14" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 16384 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p15" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 32768 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p16" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 65536 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p17" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 131072 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p18" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 262144 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p19" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 524288 } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20", "Body": { "$data": "p20" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "power-20" }, "expect": { "response": { "ContentLength": 1048576 } } } } ] }, { "id": "object-crud-0146", "group": "object-crud", "kind": "api", "title": "PutObject preserves ContentLanguage, visible via HeadObject", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_additional.py#L390", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "lang-object", "Body": "language data", "ContentLanguage": "en-US" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "lang-object" }, "expect": { "response": { "ContentLanguage": "en-US" } } } } ] }, { "id": "object-crud-0147", "group": "object-crud", "kind": "api", "title": "PutObject preserves WebsiteRedirectLocation, visible via HeadObject", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_additional.py#L76", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object", "Body": "redirect data", "WebsiteRedirectLocation": "https://example.com/redirect" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object" }, "expect": { "response": { "WebsiteRedirectLocation": "https://example.com/redirect" } } } } ] }, { "id": "object-crud-0148", "group": "object-crud", "kind": "api", "title": "Five sequential overwrites of the same key leave the last-written body", "description": "The source test performs five blocking sequential PutObject calls (not concurrent) writing version-0..version-4, then reads back and accepts any of the five. Under strong read-after-write consistency the deterministic result is version-4 (last write wins).", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_conditionals.py#L287", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": "version-4" } } } ] }, { "id": "object-crud-0149", "group": "object-crud", "kind": "api", "title": "PutObject replacing an object updates its Content-Type", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_conditionals.py#L369", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "data", "contentType": "text/plain" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "data", "ContentType": "application/json" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ContentType": "application/json" } } } } ] }, { "id": "object-crud-0150", "group": "object-crud", "kind": "api", "title": "PutObject stores a 1 KB metadata value", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_edge_cases.py#L313", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0150/body", "size": 100 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-metadata-object", "Body": { "$data": "body" }, "Metadata": { "large-key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "normal-key": "normal-value" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-metadata-object" }, "expect": { "response": { "Metadata": { "large-key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "normal-key": "normal-value" } } } } } ] }, { "id": "object-crud-0151", "group": "object-crud", "kind": "api", "title": "PutObject stores Content-Disposition retrievable via HeadObject", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_edge_cases.py#L215", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0151/body", "size": 150 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "download-object", "Body": { "$data": "body" }, "ContentDisposition": "attachment; filename=\"download.bin\"" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "download-object" }, "expect": { "response": { "ContentDisposition": "attachment; filename=\"download.bin\"" } } } } ] }, { "id": "object-crud-0152", "group": "object-crud", "kind": "api", "title": "PutObject preserves explicit Content-Type across various media types", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_edge_cases.py#L116", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0152/body", "size": 100 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "text.txt", "Body": { "$data": "body" }, "ContentType": "text/plain" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "text.txt" }, "expect": { "response": { "ContentType": "text/plain" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data.json", "Body": { "$data": "body" }, "ContentType": "application/json" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "data.json" }, "expect": { "response": { "ContentType": "application/json" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "image.png", "Body": { "$data": "body" }, "ContentType": "image/png" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "image.png" }, "expect": { "response": { "ContentType": "image/png" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "doc.pdf", "Body": { "$data": "body" }, "ContentType": "application/pdf" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "doc.pdf" }, "expect": { "response": { "ContentType": "application/pdf" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "video.mp4", "Body": { "$data": "body" }, "ContentType": "video/mp4" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "video.mp4" }, "expect": { "response": { "ContentType": "video/mp4" } } } } ] }, { "id": "object-crud-0153", "group": "object-crud", "kind": "api", "title": "PutObject with StorageClass STANDARD stores the object", "description": "The original test only verifies the object was created (ContentLength) since HeadObject may omit StorageClass for STANDARD.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_edge_cases.py#L245", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "body": { "$prng": { "seed": "object-crud-0153/body", "size": 100 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "standard-object", "Body": { "$data": "body" }, "StorageClass": "STANDARD" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "standard-object" }, "expect": { "response": { "ContentLength": 100 } } } } ] }, { "id": "object-crud-0154", "group": "object-crud", "kind": "api", "title": "Zero-length PutObject creates a retrievable empty object", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_put_object_edge_cases.py#L50", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object", "Body": "" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "body": { "$size": 0 } } } } ] }, { "id": "object-crud-0155", "group": "object-crud", "kind": "api", "title": "Explicit Content-Type on PutObject is preserved and returned by HeadObject", "description": "Eight common Content-Type values set explicitly on PutObject must be returned unchanged by HeadObject.", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_content_type_detection.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "text-file.txt", "Body": "plain text", "ContentType": "text/plain" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "text-file.txt" }, "expect": { "response": { "ContentType": "text/plain" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "json-file.json", "Body": "{\"key\": \"value\"}", "ContentType": "application/json" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "json-file.json" }, "expect": { "response": { "ContentType": "application/json" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "html-file.html", "Body": "test", "ContentType": "text/html" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "html-file.html" }, "expect": { "response": { "ContentType": "text/html" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "image-file.jpg", "Body": { "$base64": "/9j/4A==" }, "ContentType": "image/jpeg" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "image-file.jpg" }, "expect": { "response": { "ContentType": "image/jpeg" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "css-file.css", "Body": "body { color: red; }", "ContentType": "text/css" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "css-file.css" }, "expect": { "response": { "ContentType": "text/css" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "js-file.js", "Body": "console.log(\"test\");", "ContentType": "application/javascript" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "js-file.js" }, "expect": { "response": { "ContentType": "application/javascript" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xml-file.xml", "Body": "", "ContentType": "application/xml" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "xml-file.xml" }, "expect": { "response": { "ContentType": "application/xml" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "pdf-file.pdf", "Body": "%PDF-1.4", "ContentType": "application/pdf" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "pdf-file.pdf" }, "expect": { "response": { "ContentType": "application/pdf" } } } } ] }, { "id": "object-crud-0156", "group": "object-crud", "kind": "api", "title": "PutObject preserves Content-Type together with Content-Encoding", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_content_type_detection.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "gzipped-file.txt.gz", "Body": "compressed data", "ContentType": "text/plain", "ContentEncoding": "gzip" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "gzipped-file.txt.gz" }, "expect": { "response": { "ContentType": "text/plain", "ContentEncoding": "gzip" } } } } ] }, { "id": "object-crud-0157", "group": "object-crud", "kind": "api", "title": "Batch DeleteObjects removes a nested prefix completely with no orphans", "description": "Recursive delete of a nested prefix via a single DeleteObjects batch. Object count reduced from the source's 1000 to a representative sample.", "tags": [ "tier-1", "object-crud", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3017.py#L156", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "data-lake/year=2024/month=01/day=01/object-0.json", "body": "{\"id\": 0, \"value\": \"data\"}" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "data-lake/year=2024/month=02/day=02/object-1.json", "body": "{\"id\": 1, \"value\": \"data\"}" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "data-lake/year=2024/month=03/day=03/object-2.json", "body": "{\"id\": 2, \"value\": \"data\"}" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "data-lake/year=2024/month=04/day=04/object-3.json", "body": "{\"id\": 3, \"value\": \"data\"}" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "data-lake/year=2024/month=01/day=01/object-0.json" }, { "Key": "data-lake/year=2024/month=02/day=02/object-1.json" }, { "Key": "data-lake/year=2024/month=03/day=03/object-2.json" }, { "Key": "data-lake/year=2024/month=04/day=04/object-3.json" } ] } }, "expect": { "status": 200, "response": { "Deleted": { "$length": 4 } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "data-lake/" }, "expect": { "status": 200, "response": { "KeyCount": 0 } } } } ] }, { "id": "object-crud-0158", "group": "object-crud", "kind": "api", "title": "GetObject returns exact bytes for checksum verification; overwrite replaces content", "tags": [ "tier-1", "object-crud", "checksums", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3019.py#L303", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$pattern": { "pattern": "verified-content-0", "size": 1800 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/file-0000.bin", "Body": { "$data": "big" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/file-0000.bin" }, "expect": { "status": 200, "response": { "ContentLength": 1800 }, "body": { "$size": 1800, "$sha256": "${data.big.sha256}" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/file-0000.bin", "Body": "THIS IS CORRUPTED DATA" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/file-0000.bin" }, "expect": { "status": 200, "body": "THIS IS CORRUPTED DATA" } } } ] }, { "id": "object-crud-0159", "group": "object-crud", "kind": "api", "title": "Object ETag reflects content and changes on overwrite", "tags": [ "tier-1", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3019.py#L191", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "v1": { "$pattern": { "pattern": "content-0", "size": 9 } }, "v2": { "$pattern": { "pattern": "modified-content-0", "size": 18 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.dat", "Body": { "$data": "v1" } }, "expect": { "response": { "ETag": "${data.v1.etag}" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.dat" }, "expect": { "response": { "ETag": "${data.v1.etag}" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.dat", "Body": { "$data": "v2" } }, "expect": { "response": { "ETag": "${data.v2.etag}" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.dat" }, "expect": { "response": { "ETag": "${data.v2.etag}" } } } } ] }, { "id": "object-crud-0160", "group": "object-crud", "kind": "api", "title": "GetObject in a non-existent bucket returns 404 NoSuchBucket", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_error_handling.py#L15", "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "nonexistent-bucket-a7c3f9e2b1d8", "Key": "any-key" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "object-crud-0161", "group": "object-crud", "kind": "api", "title": "HeadObject with negative PartNumber returns 400", "tags": [ "tier-1", "object-crud", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_head_object_additional.py#L29", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "PartNumber": -3 }, "expect": { "status": 400 } } } ] }, { "id": "object-crud-0162", "group": "object-crud", "kind": "api", "title": "1024-byte object key is accepted; 1025-byte key is rejected", "description": "S3 keys are limited to 1024 bytes. The source test accepted KeyTooLongError or InvalidRequest; AWS returns KeyTooLongError.", "tags": [ "tier-1", "errors", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_special_characters.py#L259", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "Body": "long key test" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, "expect": { "body": "long key test" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "Body": "long key test" }, "expect": { "status": 400, "error": "KeyTooLongError" } } } ] } ] }