S3 compatibility report

Ingot (smelt forge stack)

corpus 1.0.0 92.3% pass (779/844) test time 11m17s

GroupPass %Pass FailBlockedErrors SkippedTotal
acl 100.0% 8 0 0 0 73 81
anon-access 100.0% 1 0 0 0 11 12
bucket 100.0% 30 0 0 0 19 49
bucket-logging 0 0 0 0 11 11
checksums 90.9% 40 4 0 0 0 44
conditional 100.0% 29 0 0 0 29 58
copy 84.8% 39 7 0 0 2 48
cors 100.0% 10 0 0 0 11 21
encoding 100.0% 20 0 0 0 2 22
lifecycle-config 0 0 0 0 29 29
listing 100.0% 105 0 0 0 6 111
misc 100.0% 5 0 0 0 6 11
multipart 85.1% 137 24 0 0 5 166
object-crud 100.0% 161 0 0 0 1 162
object-lock 72.1% 49 19 0 0 0 68
policy 100.0% 4 0 0 0 49 53
presigned 100.0% 5 0 0 0 2 7
sse 0 0 0 0 44 44
tagging 82.1% 32 7 0 0 5 44
versioning 95.6% 86 4 0 0 2 92
wire-headers 100.0% 18 0 0 0 3 21
acl 8/8 passed
acl-0001 0.000s skipped

Canned ACL public-read at create then PutBucketAcl private resets grants to owner FULL_CONTROL only

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0002 0.000s skipped

Canned ACL authenticated-read at create grants READ to AuthenticatedUsers plus owner FULL_CONTROL

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0003 0.000s skipped

CreateBucket with canned ACL public-read grants READ to AllUsers plus owner FULL_CONTROL

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0004 0.000s skipped

PutBucketAcl private on an already-private bucket succeeds with 200

tier-3aclsource:ceph-s3-testssource:msst-s3

skipped: ACL is not supported

acl-0005 0.000s skipped

Canned ACL public-read-write at create grants READ and WRITE to AllUsers plus owner FULL_CONTROL

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0006 0.000s skipped

Default bucket ACL is a single FULL_CONTROL grant to the bucket owner

The source test compares Owner/grantee against configured main-user identity; here the owner identity is captured from GetBucketAcl and the grant list is asserted against it.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0007 0.000s skipped

PutBucketAcl granting by a nonexistent email address returns UnresolvableGrantByEmailAddress

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0008 0.000s skipped

PutBucketAcl granting to a nonexistent canonical user ID returns InvalidArgument

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0009 0.000s skipped

Bucket ACL user grant FULL_CONTROL lets the grantee read, read ACL, write and write ACL; owner is unchanged

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0010 0.000s skipped

Bucket ACL user grant READ lets the grantee read the bucket but not read ACL, write, or write ACL

tier-3aclerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0011 0.000s skipped

Bucket ACL user grant READ_ACP lets the grantee read the ACL but not read, write, or write ACL

tier-3aclerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0012 0.000s skipped

Bucket ACL user grant WRITE lets the grantee write objects but not read, read ACL, or write ACL

tier-3aclerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0013 0.000s skipped

Bucket ACL user grant WRITE_ACP lets the grantee write the ACL but not read, read ACL, or write objects

tier-3aclerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0014 0.000s skipped

PutBucketAcl with an empty grant list revokes all grants including the owner's

The final step restores the owner FULL_CONTROL grant, mirroring the source test's restore so the bucket can be cleaned up.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0015 0.000s skipped

PutObjectAcl replacing the owner grant with FULL_CONTROL reads back the same single grant

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0016 0.000s skipped

Object canned ACL public-read then PutObjectAcl private resets grants to owner FULL_CONTROL only

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0017 0.000s skipped

PutObject with canned ACL authenticated-read grants READ to AuthenticatedUsers plus owner FULL_CONTROL

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0018 0.000s skipped

Canned ACL bucket-owner-full-control on an alt-owned object grants FULL_CONTROL to the bucket owner

The source test creates the bucket with ACL=public-read-write; here the ACL is applied to a prerequisite bucket via PutBucketAcl. Bucket-owner identity is captured from GetBucketAcl.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0019 0.000s skipped

Canned ACL bucket-owner-read on an alt-owned object grants READ to the bucket owner

The source test creates the bucket with ACL=public-read-write; here the ACL is applied to a prerequisite bucket via PutBucketAcl. Bucket-owner identity is captured from GetBucketAcl.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0020 0.000s skipped

PutObject with canned ACL public-read grants READ to AllUsers plus owner FULL_CONTROL

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0021 0.000s skipped

PutObject with canned ACL public-read-write grants READ and WRITE to AllUsers plus owner FULL_CONTROL

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0022 0.000s skipped

Default object ACL is a single FULL_CONTROL grant to the object owner

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0023 0.000s skipped

Replacing an object ACL does not change the object's ContentType or ETag

The source test creates the bucket with ACL=public-read-write (here PutBucketAcl on a prerequisite bucket) and injects an inert x-amz-foo request header via a boto3 event hook, which is dropped here; the asserted behavior is that attributes survive PutObjectAcl.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0024 0.000s skipped

Grantee with FULL_CONTROL can replace the object ACL but object ownership stays with the original owner

The source test creates the bucket with ACL=public-read-write; here the ACL is applied to a prerequisite bucket via PutBucketAcl. Owner identity is captured from GetBucketAcl.

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0025 0.000s skipped

PutObjectAcl replacing the owner grant with READ reads back the same single grant

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0026 0.000s skipped

PutObjectAcl replacing the owner grant with READ_ACP reads back the same single grant

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0027 0.000s skipped

PutObjectAcl replacing the owner grant with WRITE reads back the same single grant

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0028 0.000s skipped

PutObjectAcl replacing the owner grant with WRITE_ACP reads back the same single grant

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0029 0.000s skipped

PutBucketAcl with an explicit AllUsers group READ grant added to the owner grant is readable back

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0030 0.000s skipped

Private bucket with private object denies alt user all object reads, writes and listing

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0031 0.000s skipped

Private bucket with public-read object lets alt user read only that object

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0032 0.000s skipped

Private bucket with public-read-write object: alt user can only read that object, all writes denied

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0033 0.000s skipped

Private bucket with private object denies alt user all object reads, writes and ListObjectsV2

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0034 0.000s skipped

Private bucket with public-read object lets alt user read only that object (ListObjectsV2 denied)

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0035 0.000s skipped

Private bucket with public-read-write object: alt user can only read that object (ListObjectsV2 denied)

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0036 0.000s skipped

Public-read bucket with private objects: alt user can list but not read or write objects

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0037 0.000s skipped

Public-read bucket with public-read object: alt user can list and read the ACLed object, no writes

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0038 0.000s skipped

Public-read bucket with public-read-write object: alt user can list and read the ACLed object, all writes denied

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0039 0.000s skipped

Public-read-write bucket with private objects: alt user can list and write but not read

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0040 0.000s skipped

Public-read-write bucket with public-read object: alt user can list, write, and read only the ACLed object

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0041 0.000s skipped

Public-read-write bucket with public-read-write object: alt user can list, write, and read only the ACLed object

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0042 0.000s skipped

GetBucketOwnershipControls on a bucket created without ownership controls returns OwnershipControlsNotFoundError

tier-3aclerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0043 0.000s skipped

PutBucketOwnershipControls BucketOwnerEnforced: rejected while bucket ACL is public-read, then enforces bucket-owner ownership and rejects non-default ACLs

The source test creates the bucket with ACL=public-read; here the ACL is applied to a prerequisite bucket via PutBucketAcl before setting ownership controls. Bucket-owner identity is captured from GetBucketAcl instead of test configuration.

tier-3aclpolicyerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0044 0.000s skipped

PutBucketOwnershipControls BucketOwnerPreferred: bucket-owner-full-control ACL transfers ownership to bucket owner, other writes stay owned by writer

Bucket-owner identity is captured from GetBucketAcl; the source test's owner-inequality assertions are expressed as equality with the alt writer's canonical ID.

tier-3aclpolicysource:ceph-s3-tests

skipped: ACL is not supported

acl-0045 0.000s skipped

PutBucketOwnershipControls ObjectWriter: all objects stay owned by the writing identity regardless of ACL

The source test's owner-inequality assertions (owner != bucket owner) are expressed as equality with the alt writer's canonical ID.

tier-3aclpolicysource:ceph-s3-tests

skipped: ACL is not supported

acl-0046 0.000s skipped

CreateBucket with x-amz-grant headers grants all five permissions to the grantee

tier-3aclquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0047 0.000s skipped

BucketOwnerEnforced ownership: bucket owner owns all objects and non-default ACLs are rejected

The source compares object owners against the main account's user id from test config; here the bucket owner identity is captured from GetBucketAcl on the newly created bucket.

tier-3aclerrorssource:ceph-s3-tests

skipped: ACL is not supported

acl-0048 0.000s skipped

BucketOwnerPreferred ownership: bucket-owner-full-control transfers object ownership

The source asserts writer-owned objects have an owner different from the bucket owner; since the writer is the alt credential, this is expressed as equality with the alt identity. The bucket owner identity is captured from GetBucketAcl.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0049 0.000s skipped

ObjectWriter ownership: the writer keeps object ownership regardless of ACL

The source asserts written objects have an owner different from the bucket owner; since the writer is the alt credential, this is expressed as equality with the alt identity.

tier-3aclsource:ceph-s3-tests

skipped: ACL is not supported

acl-0050 0.000s skipped

PutObject with x-amz-grant-* headers grants each permission to a second user

The source test injects five raw x-amz-grant-<perm> headers (read, write, read-acp, write-acp, full-control) for the alt user before signing. x-amz-grant-write has NO PutObject API parameter (AWS rejects object WRITE grants, hence quirk:not-aws), so the PUT must be a raw-HTTP step rather than an operation step. GetObjectAcl must then return all five grants for that user; check_grants compares element-wise, so the ordered array asserts the order READ, WRITE, READ_ACP, WRITE_ACP, FULL_CONTROL.

tier-3aclsource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

acl-0051 0.000s skipped

PutObject combining a canned ACL with grant headers is rejected with InvalidRequest

tier-1aclerrorssource:msst-s3

skipped: ACL is not supported

acl-0052 0.000s skipped

PutObjectAcl on a non-existent key returns NoSuchKey

tier-3aclerrorssource:msst-s3

skipped: ACL is not supported

acl-0053 0.000s skipped

PutObjectAcl with malformed grantee id or URI is rejected with InvalidArgument

tier-3aclerrorssource:msst-s3

skipped: ACL is not supported

acl-0054 0.000s skipped

PutObjectAcl with an empty grant list is accepted and the owner retains read access

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0055 0.000s skipped

Owner can read back an object written with ACL private

tier-1aclsource:msst-s3

skipped: ACL is not supported

acl-0056 0.026s pass

DeleteBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
acl-0057 0.000s skipped

After DeleteBucketOwnershipControls, GetBucketOwnershipControls returns not-found

Original test accepts OwnershipControlsNotFoundError, OwnershipControlsNotFound or NoSuchOwnershipControls for the final get; all are HTTP 404, so only the status is asserted.

tier-3aclerrorssource:msst-s3

skipped: ACL is not supported

acl-0058 0.000s skipped

New bucket has default ObjectOwnership of BucketOwnerEnforced

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0059 0.024s pass

GetBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
acl-0060 0.000s skipped

GetBucketOwnershipControls returns the ownership rule that was set

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0061 0.308s pass

PutBucketOwnershipControls with an invalid ObjectOwnership value is rejected

Valid values are BucketOwnerPreferred, BucketOwnerEnforced, ObjectWriter. Original test accepts MalformedXML or InvalidArgument; both are HTTP 400, so only the status is asserted.

tier-3aclerrorssource:msst-s3
acl-0062 0.306s pass

PutBucketOwnershipControls with more than one rule is rejected

Only one ownership rule is allowed. Original test accepts MalformedXML or InvalidArgument; both are HTTP 400, so only the status is asserted.

tier-3aclerrorssource:msst-s3
acl-0063 0.010s pass

PutBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
acl-0064 0.000s skipped

PutBucketOwnershipControls with ObjectWriter succeeds

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0065 0.008s pass

GetBucketAcl on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
acl-0066 0.000s skipped

PutBucketAcl accepts canned ACL public-read

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0067 0.000s skipped

PutBucketAcl accepts canned ACL public-read-write

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0068 0.000s skipped

PutBucketAcl accepts canned ACL authenticated-read

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0069 0.000s skipped

PutBucketAcl GrantReadACP to owner id produces a READ_ACP grant

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0070 0.000s skipped

PutBucketAcl GrantWriteACP to owner id produces a WRITE_ACP grant

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0071 0.275s pass

PutBucketAcl with an invalid canned ACL value returns InvalidArgument

tier-3aclerrorssource:msst-s3
acl-0072 0.000s skipped

PutBucketAcl with both a canned ACL and a grant header returns InvalidRequest

tier-3aclerrorssource:msst-s3

skipped: ACL is not supported

acl-0073 0.008s pass

PutBucketAcl on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
acl-0074 0.000s skipped

PutBucketAcl canned ACL private succeeds and GetBucketAcl returns Owner and Grants

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0075 0.000s skipped

PutBucketAcl canned ACL public-read succeeds and GetBucketAcl returns grants

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0076 0.000s skipped

Bucket ACL can be updated repeatedly across canned values

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0077 0.000s skipped

PutBucketAcl with a full AccessControlPolicy granting owner FULL_CONTROL

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0078 0.000s skipped

PutBucketAcl GrantFullControl to owner id produces a FULL_CONTROL grant

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0079 0.000s skipped

PutBucketAcl GrantRead to owner id produces a READ grant

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0080 0.000s skipped

PutBucketAcl GrantWrite to owner id produces a WRITE grant

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0081 0.000s skipped

Default bucket ACL has an owner and a FULL_CONTROL grant

tier-3aclbucketsource:msst-s3

skipped: ACL is not supported

anon-access 1/1 passed
anon-access-0001 0.398s pass

Anonymous PutObject to a private bucket returns AccessDenied

tier-1anon-accesserrorssource:ceph-s3-tests
anon-access-0002 0.000s skipped

Anonymous PutObject succeeds on a public-read-write bucket

tier-3anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0003 0.000s skipped

Authenticated GetObject succeeds on public-read bucket and object

tier-3anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0004 0.000s skipped

Owner GetObject succeeds on a public-read object despite a private bucket ACL

The source creates the bucket with ACL 'private', which is the default canned ACL for a new bucket, so the bucket prerequisite carries no ACL step.

tier-1anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0005 0.000s skipped

Authenticated GetObject on a deleted bucket returns NoSuchBucket

tier-3anon-accessaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0006 0.000s skipped

Owner GetObject succeeds on a private object in a public-read bucket

tier-3anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0007 0.000s skipped

Authenticated GetObject on a deleted object returns NoSuchKey

tier-3anon-accessaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0008 0.000s skipped

Anonymous GetObject succeeds on public-read bucket and object

tier-3anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0009 0.000s skipped

Anonymous GetObject succeeds on a public-read object in a private bucket

The source creates the bucket with ACL 'private', which is the default canned ACL for a new bucket, so the bucket prerequisite carries no ACL step.

tier-1anon-accessaclsource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0010 0.000s skipped

Anonymous GetObject on a deleted bucket returns NoSuchBucket

tier-3anon-accessaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0011 0.000s skipped

Anonymous GetObject on a private object in a public-read bucket returns AccessDenied

tier-3anon-accessaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

anon-access-0012 0.000s skipped

Anonymous GetObject on a deleted object in a public-read bucket returns NoSuchKey

tier-3anon-accessaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

bucket 30/30 passed
bucket-0001 0.148s pass

DeleteBucket succeeds once, then repeating it returns NoSuchBucket

tier-2bucketerrorssource:ceph-s3-tests
bucket-0002 0.297s pass

CreateBucket on a name owned by another user returns BucketAlreadyExists

tier-2bucketerrorssource:ceph-s3-tests
bucket-0003 0.000s skipped

CreateBucket with an IP-address-formatted name returns InvalidBucketName

tier-2bucketerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0004 0.001s pass

CreateBucket with a one-character name returns InvalidBucketName

tier-2bucketerrorssource:ceph-s3-tests
bucket-0005 0.001s pass

CreateBucket with a two-character name returns InvalidBucketName

tier-2bucketerrorssource:ceph-s3-tests
bucket-0006 0.000s skipped

CreateBucket with a name starting with underscore returns InvalidBucketName

tier-2bucketerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0007 0.000s skipped

Raw CreateBucket with a name ending in a dash returns InvalidBucketName

tier-2bucketerrorswire-headersquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0008 0.000s skipped

Raw CreateBucket with dash-dot in the name returns InvalidBucketName

tier-2bucketerrorswire-headersquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0009 0.000s skipped

Raw CreateBucket with dot-dash in the name returns InvalidBucketName

tier-2bucketerrorswire-headersquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0010 0.000s skipped

Raw CreateBucket with consecutive dots in the name returns InvalidBucketName

tier-2bucketerrorswire-headersquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0011 0.000s skipped

CreateBucket with a maximum-length 63-character DNS name succeeds

tier-2bucketquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0012 0.000s skipped

Raw CreateBucket with an underscore in the name returns InvalidBucketName

tier-2bucketerrorswire-headersquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0013 0.000s skipped

CreateBucket with a 60-character name succeeds

tier-2bucketquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0014 0.000s skipped

CreateBucket with a 61-character name succeeds

tier-2bucketquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0015 0.000s skipped

CreateBucket with a 62-character name succeeds

tier-2bucketquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0016 0.373s pass

DeleteBucket on a non-empty bucket returns BucketNotEmpty

tier-2bucketerrorssource:ceph-s3-testssource:msst-s3
bucket-0017 0.006s pass

DeleteBucket on a nonexistent bucket returns NoSuchBucket

tier-2bucketerrorssource:ceph-s3-testssource:msst-s3
bucket-0018 0.079s pass

HeadBucket on an existing bucket returns 200

tier-1bucketsource:ceph-s3-testssource:msst-s3
bucket-0019 0.005s pass

HeadBucket on a nonexistent bucket returns 404

tier-1bucketerrorssource:ceph-s3-testssource:msst-s3
bucket-0020 0.009s pass

ListObjects on a nonexistent bucket returns NoSuchBucket

tier-3bucketerrorssource:ceph-s3-tests
bucket-0021 0.000s skipped

Recreating an existing bucket with a new ACL returns BucketAlreadyExists

tier-2bucketaclerrorssource:ceph-s3-testssource:msst-s3

skipped: ACL is not supported

bucket-0022 0.000s skipped

Recreating a bucket created with public-read ACL returns BucketAlreadyExists

tier-2bucketaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

bucket-0023 0.518s pass

ListBuckets includes every created bucket

tier-2bucketsource:ceph-s3-tests
bucket-0024 0.006s pass

ListObjectsV2 on a nonexistent bucket returns NoSuchBucket

tier-1bucketerrorssource:ceph-s3-tests
bucket-0025 0.000s skipped

Put, get and delete bucket ownership controls; get after delete returns 404

tier-3bucketerrorssource:ceph-s3-tests

skipped: PutBucketOwnershipControls are not supported

bucket-0026 0.078s pass

CreateBucket succeeds for a name containing a hyphen

tier-2bucketsource:ceph-s3-tests
bucket-0027 0.068s pass

CreateBucket succeeds for a name containing a period

tier-2bucketsource:ceph-s3-tests
bucket-0028 0.071s pass

CreateBucket succeeds for a name starting with a lowercase letter

tier-2bucketsource:ceph-s3-tests
bucket-0029 0.136s pass

CreateBucket succeeds for a name starting with a digit

tier-2bucketsource:ceph-s3-tests
bucket-0030 0.000s skipped

Re-creating an existing bucket does not remove its objects

Re-creating a bucket you own succeeds here (200) — the AWS us-east-1 legacy behavior. Every other region returns BucketAlreadyOwnedByYou (see bucket-0038); the quirk:us-east-1-legacy tag lets non-us-east-1 targets skip this vector.

tier-3bucketquirk:us-east-1-legacysource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0031 0.000s skipped

Anonymous ListBuckets succeeds and returns an empty bucket list

tier-2bucketanon-accessquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0032 0.001s pass

ListBuckets with an unknown access key is rejected with 403

tier-2bucketerrorssource:ceph-s3-tests
bucket-0033 0.000s skipped

Create and list a bucket with a 61-character name

The source builds a 61-character bucket name and verifies the bucket is usable (an object listing succeeds and is empty).

tier-3bucketquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

bucket-0034 0.138s pass

Created bucket appears in ListBuckets and HeadBucket returns 404 after deletion

Bucket creation is covered by the prerequisite; the final not-in-list assertion of the source test is expressed as HeadBucket returning 404 after DeleteBucket.

tier-2bucketsource:msst-s3
bucket-0035 0.000s skipped

Request payment configuration defaults to BucketOwner and can be set to Requester

tier-3bucketsource:msst-s3

skipped: Bucket request-payment configuration is not supported

bucket-0036 0.000s skipped

Transfer acceleration status can be enabled, suspended and re-enabled

tier-3bucketsource:msst-s3

skipped: Bucket transfer acceleration is not supported

bucket-0037 0.024s pass

CreateBucket rejects invalid bucket names

Server-side bucket-naming rules: uppercase, underscores, leading/trailing hyphens, consecutive dots, dot-hyphen sequences, IP-address form, xn-- prefix, reserved -s3alias/--ol-s3 affixes and length limits (3-63). Original test accepted any rejection error; AWS returns InvalidBucketName. Name cases that common SDKs reject client-side (empty, space, slash, punctuation) were dropped, as were the tolerant valid-name and reserved-prefix branches that pass on either outcome; the duplicate-name check is covered by the CreateBucket-on-existing-bucket vector.

tier-2bucketerrorssource:msst-s3
bucket-0038 0.151s pass

CreateBucket on an existing bucket you own returns BucketAlreadyOwnedByYou

Original test also accepted BucketAlreadyExists. Note that AWS us-east-1 has legacy behavior returning 200 for re-creating a bucket you own.

tier-2bucketerrorssource:msst-s3
bucket-0039 0.067s pass

CreateBucket succeeds and the bucket is accessible via HeadBucket

tier-2bucketsource:msst-s3
bucket-0040 0.262s pass

Full bucket lifecycle: create, put and read an object, delete object, delete bucket

tier-2bucketobject-crudsource:msst-s3
bucket-0041 0.081s pass

DeleteBucket removes the bucket

tier-2bucketsource:msst-s3
bucket-0042 0.004s pass

GetBucketLocation on a non-existent bucket returns NoSuchBucket

tier-3bucketerrorssource:msst-s3
bucket-0043 0.060s pass

GetBucketLocation succeeds on an existing bucket

Original test only asserted the LocationConstraint key was present in the boto3 response shape (it is null for us-east-1), so this vector asserts the call succeeds.

tier-3bucketsource:msst-s3
bucket-0044 0.010s pass

ListBuckets returns a Buckets list

tier-2bucketlistingsource:msst-s3
bucket-0045 0.183s pass

ListBuckets includes created buckets

tier-2bucketlistingsource:msst-s3
bucket-0046 0.079s pass

Empty bucket lists zero keys and can be deleted

tier-2bucketsource:msst-s3
bucket-0047 0.083s pass

ListBuckets rejects a negative max-buckets value

Raw HTTP so the out-of-range value reaches the server rather than being caught client-side. AWS's valid MaxBuckets range is 1-10000 and a negative value is rejected with InvalidArgument. The original also probed an over-large value (2000000) but its primary branch accepted success (some implementations cap silently) and only tolerated rejection as an alternative; that undecidable success-or-error case is omitted.

tier-2bucketerrorssource:msst-s3
bucket-0048 0.610s pass

ListBuckets MaxBuckets truncates the listing and ContinuationToken resumes it

Six runner-provisioned buckets guarantee the account holds more than MaxBuckets=3 buckets, so the first page must be truncated. The original tolerated implementations without pagination support.

tier-2bucketlistingsource:msst-s3
bucket-0049 0.517s pass

ListBuckets with Prefix returns only buckets whose names match the prefix

Buckets are created in steps as suffixes of the runner-provisioned bucket name so the prefix is unique to this vector. The original tolerated implementations that ignore Prefix (MinIO); this vector asserts the AWS filtering behavior.

tier-2bucketlistingsource:msst-s3
bucket-logging 0/0 passed
bucket-logging-0001 0.000s skipped

Only the bucket owner may set or remove bucket logging, even with a permissive bucket policy

The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format). The source-bucket policy is written exactly as in the source test (no Resource element).

tier-3bucket-loggingerrorspolicysource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0002 0.000s skipped

PutBucketLogging round-trips minimal, simple-prefix and partitioned-prefix configurations

Converted from ceph s3-tests test_put_bucket_logging. The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format). The TargetGrants portion of the source test is omitted for the same reason. The ceph-extension fields (ObjectRollTime, LoggingType, RecordsBatchSize) are omitted.

tier-3bucket-loggingsource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0003 0.000s skipped

PutBucketLogging with a missing source or target bucket returns NoSuchBucket / NoSuchKey

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0004 0.000s skipped

PutBucketLogging targeting a bucket that itself has logging enabled returns InvalidArgument

The log-bucket policies use a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format).

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0005 0.000s skipped

PutBucketLogging with an invalid PartitionDateSource returns MalformedXML

The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format).

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0006 0.000s skipped

PutBucketLogging with the source bucket as its own target returns InvalidArgument

The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format).

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0007 0.000s skipped

PutBucketLogging targeting a bucket with default encryption returns InvalidArgument

The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format).

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0008 0.000s skipped

PutBucketLogging targeting a requester-pays bucket returns InvalidArgument

The log-bucket policy uses a wildcard aws:SourceAccount (the source test uses the main user id, which is not expressible in the vector format).

tier-3bucket-loggingerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0009 0.000s skipped

PutBucketLogging is denied unless the target bucket policy grants the logging service principal correctly

Each stage sets a log-bucket policy with exactly one invalid element (principal, action, resource, source ARN, or source account) and asserts PutBucketLogging returns AccessDenied. Where the source test uses the main user id for a valid aws:SourceAccount, a wildcard StringLike condition is used instead (the main account id is not expressible in the vector format); the tenant-qualified invalid-account variant is omitted for the same reason.

tier-3bucket-loggingerrorspolicysource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0010 0.000s skipped

Wildcard source account and source-bucket ARN in the log bucket policy allow logging from any source

A second identity creates its own source bucket. With per-bucket statements both owners can enable logging; after removing the second statement the alt owner is denied; with wildcard aws:SourceAccount and aws:SourceArn both succeed again. The main-account statement uses a wildcard aws:SourceAccount throughout (the main account id is not expressible in the vector format); the alt statement uses the alt credential's canonical id.

tier-3bucket-loggingpolicyerrorssource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

bucket-logging-0011 0.000s skipped

Disable bucket logging with an empty BucketLoggingStatus

Grant the S3 logging service PutObject on the target bucket via bucket policy, enable logging on the source bucket, then disable it by putting an empty BucketLoggingStatus; GetBucketLogging must succeed and no longer return LoggingEnabled. The source test's policy also carries an aws:SourceAccount condition on the caller's account id, which is not expressible in the vector format and is omitted here.

tier-3bucket-loggingpolicysource:ceph-s3-tests

skipped: PutBucketPolicy and PutBucketLogging are not supported

checksums 40/44 passed
checksums-0001 0.405s pass

GetObjectAttributes on a SHA256-checksummed single-part object reports size, ETag, storage class and checksum with no ObjectParts

tier-3checksumssource:ceph-s3-testssource:msst-s3
checksums-0002 7.866s pass

GetObjectAttributes on a SHA256-checksummed 13-part multipart object reports size, composite checksum and per-part checksums

tier-3checksumsmultipartsource:ceph-s3-tests
checksums-0003 0.251s pass

PutObject with CRC64NVME checksum: echoed on put, hidden on plain HEAD, shown with ChecksumMode, bad digest rejected

tier-1checksumserrorssource:ceph-s3-tests
checksums-0004 0.398s pass

PutObject with SHA256 checksum: echoed on put, hidden on plain HEAD, shown with ChecksumMode, bad digest rejected

tier-1checksumserrorssource:ceph-s3-tests
checksums-0005 0.405s pass

Object uploaded with ChecksumAlgorithm SHA256 is retrievable with intact body

tier-1checksumsobject-crudsource:msst-s3
checksums-0006 0.247s pass

HeadObject with ChecksumMode=ENABLED returns the CRC32 checksum from PutObject

tier-1checksumssource:msst-s3
checksums-0007 0.234s pass

HeadObject with ChecksumMode=ENABLED returns the SHA1 checksum from PutObject

tier-1checksumssource:msst-s3
checksums-0008 0.231s pass

HeadObject with ChecksumMode=ENABLED returns the SHA256 checksum from PutObject

tier-1checksumssource:msst-s3
checksums-0009 0.095s pass

PutObject with an incorrect ChecksumSHA256 returns BadDigest

The supplied checksum is a valid base64 32-byte value that does not match the body. The original test accepts several codes (InvalidRequest, BadDigest, XAmzContentSHA256Mismatch, XAmzContentChecksumMismatch); AWS returns BadDigest.

tier-1checksumserrorssource:msst-s3
checksums-0010 0.207s pass

PutObject with a correct ChecksumCRC32 succeeds and echoes the checksum

tier-1checksumssource:msst-s3
checksums-0011 0.237s pass

PutObject with a correct ChecksumSHA256 succeeds and echoes the checksum

tier-1checksumssource:msst-s3
checksums-0012 0.077s pass

UploadPart with ChecksumAlgorithm CRC32 but a CRC32C checksum header is rejected

The multipart upload and the part both declare CRC32, but the part carries an x-amz-checksum-crc32c value instead. The source test accepted InvalidRequest or InvalidArgument; both are HTTP 400.

tier-1checksumsmultiparterrorssource:msst-s3
checksums-0013 0.115s pass

UploadPart declaring a checksum algorithm different from the multipart upload's is rejected

The multipart upload was initialized with CRC32 but the part declares ChecksumAlgorithm SHA1. The source test accepted InvalidRequest or InvalidArgument; both are HTTP 400.

tier-1checksumsmultiparterrorssource:msst-s3
checksums-0014 0.089s pass

UploadPart with a checksum value of a different algorithm than the upload's is rejected

The multipart upload was initialized with CRC32 but the part carries an x-amz-checksum-sha256 value. The source test accepted InvalidRequest or InvalidArgument; both are HTTP 400.

tier-1checksumsmultiparterrorssource:msst-s3
checksums-0015 0.189s fail

UploadPartCopy succeeds when source and multipart upload use different checksum algorithms

The source object carries a SHA1 checksum while the multipart upload declares SHA256; the copy must succeed and return a CopyPartResult with an ETag. The source test skipped on InvalidArgument/NotImplemented (MinIO tolerance); on AWS the copy succeeds.

tier-1checksumsmultipartcopysource:msst-s3
step 3 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
checksums-0016 0.181s fail

UploadPartCopy from a CRC32-checksummed source into a CRC32 multipart upload succeeds

Source object and multipart upload use the same checksum algorithm; the copy must succeed and return a CopyPartResult with an ETag. The source test skipped on NotImplemented/InvalidArgument (MinIO tolerance); on AWS the copy succeeds.

tier-1checksumsmultipartcopysource:msst-s3
step 3 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
checksums-0017 0.179s fail

UploadPartCopy into a checksum-less multipart upload returns no checksums in CopyPartResult

The source object was uploaded with a SHA1 checksum but the multipart upload declares no checksum algorithm, so the CopyPartResult must not contain any checksum members.

tier-1checksumsmultipartcopysource:msst-s3
step 3 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
checksums-0018 0.063s pass

UploadPart with two different checksum headers is rejected

The part carries both an x-amz-checksum-sha1 and an x-amz-checksum-crc32c value. The source test accepted InvalidRequest or InvalidArgument; both are HTTP 400.

tier-1checksumsmultiparterrorssource:msst-s3
checksums-0019 0.113s pass

UploadPart with ChecksumAlgorithm CRC32 succeeds and returns an ETag

tier-1checksumsmultipartsource:msst-s3
checksums-0020 0.113s pass

UploadPart with ChecksumAlgorithm SHA1 succeeds and returns an ETag

tier-1checksumsmultipartsource:msst-s3
checksums-0021 0.119s pass

UploadPart with ChecksumAlgorithm SHA256 succeeds and returns an ETag

tier-1checksumsmultipartsource:msst-s3
checksums-0022 0.182s pass

GetObjectAttributes checksum matches PutObject checksum (CRC32)

One of four per-algorithm cases from the source loop.

tier-3checksumssource:msst-s3
checksums-0023 0.193s pass

GetObjectAttributes checksum matches PutObject checksum (CRC32C)

One of four per-algorithm cases from the source loop.

tier-3checksumssource:msst-s3
checksums-0024 0.207s pass

GetObjectAttributes checksum matches PutObject checksum (SHA1)

One of four per-algorithm cases from the source loop.

tier-3checksumssource:msst-s3
checksums-0025 0.452s pass

ListObjectsV2 lists all objects uploaded with checksum algorithms

Uploads four objects with CRC32/CRC32C/SHA1/SHA256 checksum algorithms and lists the bucket. The source test's per-entry ChecksumAlgorithm shape check was conditional on the field being present and is not asserted here.

tier-1checksumslistingsource:msst-s3
checksums-0026 0.090s pass

PutObject of an empty body with ChecksumAlgorithm CRC32 returns a CRC32 checksum

One of four per-algorithm cases from the source loop; this iteration's body size is 200 * 0 = 0 bytes.

tier-1checksumssource:msst-s3
checksums-0027 0.196s pass

PutObject with ChecksumAlgorithm CRC32C returns a CRC32C checksum

One of four per-algorithm cases from the source loop.

tier-1checksumssource:msst-s3
checksums-0028 0.185s pass

PutObject with ChecksumAlgorithm SHA1 returns a SHA1 checksum

One of four per-algorithm cases from the source loop.

tier-1checksumssource:msst-s3
checksums-0029 0.187s pass

PutObject with ChecksumAlgorithm SHA256 returns a SHA256 checksum (600-byte body)

One of four per-algorithm cases from the source loop.

tier-1checksumssource:msst-s3
checksums-0030 0.191s pass

PutObject with ChecksumAlgorithm CRC32 returns a CRC32 checksum

The source test also asserted ChecksumType == FULL_OBJECT only when the field was present; that conditional check is omitted.

tier-1checksumssource:msst-s3
checksums-0031 0.069s pass

PutObject with an incorrect client-provided CRC32 checksum is rejected

AWS returns 400 BadDigest for an x-amz-checksum-crc32 mismatch. The source test also accepted InvalidRequest, InvalidDigest and XAmzContentChecksumMismatch from other implementations.

tier-1checksumserrorssource:msst-s3
checksums-0032 0.220s pass

PutObject with a correct client-provided CRC32 checksum succeeds and echoes it

tier-1checksumssource:msst-s3
checksums-0033 0.441s pass

Multipart upload with CRC32 part checksums completes successfully

tier-1multipartchecksumssource:msst-s3
checksums-0034 0.450s pass

Multipart upload with SHA256 part checksums completes successfully

tier-1multipartchecksumssource:msst-s3
checksums-0035 0.224s fail

CopyObject across buckets preserves the source SHA256 checksum

tier-1checksumscopysource:msst-s3
step 2 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
checksums-0036 0.217s pass

CopyObject with MetadataDirective=COPY preserves the source checksum

tier-1checksumscopysource:msst-s3
checksums-0037 0.212s pass

CopyObject with ChecksumAlgorithm=CRC32 computes a CRC32 checksum for the destination

tier-1checksumscopysource:msst-s3
checksums-0038 0.198s pass

CopyObject with ChecksumAlgorithm=SHA256 computes a checksum for the destination

Source object has no checksum; copying with ChecksumAlgorithm=SHA256 returns the computed SHA256 in CopyObjectResult.

tier-1checksumscopysource:msst-s3
checksums-0039 0.181s pass

CopyObject with ChecksumAlgorithm=SHA1 computes a SHA1 checksum

tier-1checksumscopysource:msst-s3
checksums-0040 0.171s pass

CopyObject with ChecksumAlgorithm=SHA256 computes a SHA256 checksum

tier-1checksumscopysource:msst-s3
checksums-0041 0.175s pass

CopyObject preserves the source object's existing SHA256 checksum

tier-1checksumscopysource:msst-s3
checksums-0042 0.198s pass

CopyObject with ChecksumAlgorithm=SHA256 replaces the source's CRC32 checksum

tier-1checksumscopysource:msst-s3
checksums-0043 0.189s pass

CopyObject onto itself with MetadataDirective=REPLACE adds a SHA256 checksum

tier-1checksumscopysource:msst-s3
checksums-0044 0.075s pass

CreateMultipartUpload with ChecksumAlgorithm CRC32 echoes the algorithm

tier-1checksumsmultipartsource:msst-s3
conditional 29/29 passed
conditional-0001 0.000s skipped

DeleteObject with If-Match ETag precondition against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0002 0.000s skipped

DeleteObject with last-modified-time precondition against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0003 0.000s skipped

DeleteObject with size precondition against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0004 0.000s skipped

DeleteObject with If-Match on a nonexistent key is idempotent

RGW ignores an If-Match precondition when the key does not exist and returns 204; AWS evaluates the precondition and returns NoSuchKey.

tier-1conditionalerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0005 0.000s skipped

DeleteObject with last-modified-time precondition on an unversioned bucket

tier-1conditionalerrorssource:ceph-s3-testsquirk:directory-bucket

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0006 0.000s skipped

DeleteObject with size precondition on an unversioned bucket

tier-1conditionalerrorssource:ceph-s3-testsquirk:directory-bucket

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0007 0.000s skipped

DeleteObject with If-Match ETag precondition on a specific version

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0008 0.000s skipped

DeleteObject with last-modified-time precondition on a specific version

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0009 0.000s skipped

DeleteObject with size precondition on a specific version

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0010 0.000s skipped

DeleteObjects with per-key ETag precondition against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0011 0.000s skipped

DeleteObjects with per-key last-modified-time precondition against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0012 0.000s skipped

DeleteObjects with a per-key ETag on a nonexistent key succeeds

RGW ignores a per-key ETag precondition when the key does not exist and reports it Deleted; AWS returns a NoSuchKey error entry.

tier-1conditionalerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0013 0.000s skipped

DeleteObjects with per-key last-modified-time precondition on an unversioned bucket

tier-1conditionalerrorssource:ceph-s3-testsquirk:directory-bucket

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0014 0.000s skipped

DeleteObjects with per-key size precondition on an unversioned bucket

tier-1conditionalerrorssource:ceph-s3-testsquirk:directory-bucket

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0015 0.000s skipped

DeleteObjects with per-key ETag precondition on a specific version

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0016 0.000s skipped

DeleteObjects with per-key last-modified-time precondition on a specific noncurrent version

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0017 0.000s skipped

PutObject If-Match is evaluated against the current version on a versioned bucket

tier-1conditionalversioningerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0018 0.294s pass

PutObject If-None-Match: * is evaluated against the current version on a versioned bucket

tier-1conditionalversioningerrorssource:ceph-s3-tests
conditional-0019 0.000s skipped

PutObject preconditions treat a delete marker as a nonexistent current object

tier-1conditionalversioningerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0020 0.000s skipped

PutObject If-Match/If-None-Match precondition matrix on an unversioned bucket

tier-1conditionalerrorsquirk:not-awssource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0021 0.196s pass

PutObject with non-matching If-Match ETag fails with PreconditionFailed and leaves object intact

tier-1conditionalerrorssource:ceph-s3-tests
conditional-0022 0.000s skipped

PutObject with If-Match: * on a nonexistent key fails with NoSuchKey and creates nothing

tier-1conditionalerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0023 0.000s skipped

PutObject with If-Match: * overwrites an existing object

tier-1conditionalsource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0024 0.000s skipped

PutObject with matching If-None-Match ETag fails with PreconditionFailed and leaves object intact

tier-1conditionalerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0025 0.000s skipped

PutObject with non-matching If-None-Match ETag overwrites the object

tier-1conditionalsource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0026 0.189s pass

PutObject with If-None-Match: * creates a nonexistent key

tier-1conditionalsource:ceph-s3-tests
conditional-0027 0.220s pass

PutObject with If-None-Match: * on an existing key fails with PreconditionFailed and leaves object intact

tier-1conditionalerrorssource:ceph-s3-tests
conditional-0028 0.000s skipped

DeleteObjects Size precondition on current version: mismatch errors, match creates delete marker, then delete marker blocks further match

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0029 0.000s skipped

DeleteObjects by VersionId with Size precondition: mismatch errors, match deletes the version, repeat on gone version returns 200

tier-1conditionalversioningerrorssource:ceph-s3-testsquirk:not-aws

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0030 0.219s pass

Conditional DeleteObject with matching IfMatch ETag succeeds with 204

tier-1conditionalsource:msst-s3
conditional-0031 0.218s pass

Conditional DeleteObject with a wrong IfMatch ETag returns PreconditionFailed

Original tolerated implementations that ignore IfMatch on DeleteObject (MinIO) or return InvalidArgument; AWS enforces the precondition.

tier-1conditionalerrorssource:msst-s3
conditional-0032 0.214s pass

PutObject with a non-matching If-Match returns 412 and leaves the object unchanged

tier-1conditionalsource:msst-s3
conditional-0033 0.191s pass

GetObject with If-Unmodified-Since in the past returns 412 PreconditionFailed

The source used utcnow() minus one day; a fixed date guaranteed to precede any object creation preserves the semantics.

tier-1conditionalsource:msst-s3
conditional-0034 0.217s pass

GetObject with non-matching If-Match ETag returns PreconditionFailed

tier-1conditionalerrorssource:msst-s3
conditional-0035 0.182s pass

GetObject with matching If-Match ETag returns the object

tier-1conditionalsource:msst-s3
conditional-0036 0.000s skipped

PutObject with If-None-Match on a non-existent key succeeds

The original test also sends If-Match on a non-existent key but accepts either success (AWS) or PreconditionFailed/NoSuchKey (MinIO); that either-or expectation is not expressible and is omitted here.

tier-1conditionalquirk:not-awssource:msst-s3

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0037 0.000s skipped

PutObject with matching If-Match plus matching If-None-Match returns PreconditionFailed

When both conditional headers are sent and both match the current ETag, the If-None-Match condition fails and the write is rejected.

tier-1conditionalerrorsquirk:not-awssource:msst-s3

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0038 0.181s pass

PutObject with non-matching If-Match returns PreconditionFailed

tier-1conditionalerrorssource:msst-s3
conditional-0039 0.312s pass

PutObject with If-Match matching the current ETag succeeds and returns a new ETag

tier-1conditionalsource:msst-s3
conditional-0040 0.000s skipped

PutObject with If-None-Match matching the current ETag returns PreconditionFailed

tier-1conditionalerrorsquirk:not-awssource:msst-s3

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0041 0.000s skipped

PutObject with non-matching If-None-Match on an existing object succeeds

tier-1conditionalquirk:not-awssource:msst-s3

skipped: quirk vector skipped by default (run it with NoSkip)

conditional-0042 0.356s pass

CompleteMultipartUpload with non-matching If-Match returns PreconditionFailed

tier-1multipartconditionalerrorssource:msst-s3
conditional-0043 0.415s pass

CompleteMultipartUpload with If-Match matching the existing object's ETag succeeds

tier-1multipartconditionalsource:msst-s3
conditional-0044 0.205s pass

CopyObject with a non-matching CopySourceIfMatch returns 412 PreconditionFailed

tier-1conditionalcopyerrorssource:msst-s3
conditional-0045 0.194s pass

CopyObject with a matching CopySourceIfMatch copies the object

tier-1conditionalcopysource:msst-s3
conditional-0046 0.200s pass

CopyObject with a past CopySourceIfModifiedSince copies the object

The source used now-1h; a fixed past date guaranteed to precede the object's LastModified preserves the semantics.

tier-1conditionalcopysource:msst-s3
conditional-0047 0.226s pass

CopyObject with a matching CopySourceIfNoneMatch returns 412 PreconditionFailed

tier-1conditionalcopyerrorssource:msst-s3
conditional-0048 0.589s pass

CopyObject with a past CopySourceIfUnmodifiedSince returns 412 PreconditionFailed

The source used now-1h; a fixed past date guaranteed to precede the object's LastModified preserves the semantics.

tier-1conditionalcopyerrorssource:msst-s3
conditional-0049 0.570s pass

GetObject with a future If-Modified-Since is ignored and returns the object

The source used now+1h; a fixed far-future date guaranteed to postdate the object's LastModified preserves the semantics.

tier-1conditionalsource:msst-s3
conditional-0050 0.556s pass

GetObject with a matching If-None-Match returns 304 Not Modified

The source accepted error code NotModified or the bare '304'.

tier-1conditionalsource:msst-s3
conditional-0051 0.220s pass

HeadObject with a non-matching If-Match returns 412 PreconditionFailed

tier-1conditionalerrorssource:msst-s3
conditional-0052 0.222s pass

HeadObject with a matching If-Match returns the object metadata

tier-1conditionalsource:msst-s3
conditional-0053 0.212s pass

HeadObject with a future If-Modified-Since is ignored and returns the object

The source used now+1h; a fixed far-future date guaranteed to postdate the object's LastModified preserves the semantics.

tier-1conditionalsource:msst-s3
conditional-0054 0.199s pass

HeadObject with a matching If-None-Match returns 304 Not Modified

The source accepted error code NotModified or the bare '304'.

tier-1conditionalsource:msst-s3
conditional-0055 0.174s pass

HeadObject with a future If-Unmodified-Since succeeds

The source used now+1h; a fixed far-future date guaranteed to postdate the object's LastModified preserves the semantics.

tier-1conditionalsource:msst-s3
conditional-0056 0.198s pass

Conditional DeleteObject with If-Match rejects stale ETag, succeeds on match

tier-1conditionalobject-cruderrorssource:msst-s3
conditional-0057 0.307s pass

DeleteObject with If-Match: * deletes an existing object

tier-1conditionalsource:ceph-s3-tests
conditional-0058 0.212s pass

DeleteObjects with a per-key If-Match ETag precondition on an unversioned bucket

tier-1conditionalerrorssource:ceph-s3-tests
copy 39/46 passed
copy-0001 0.494s pass

CopyObject with non-matching x-amz-copy-source-if-match returns PreconditionFailed

tier-1copyconditionalerrorssource:ceph-s3-tests
copy-0002 0.508s pass

CopyObject with matching x-amz-copy-source-if-match succeeds

tier-1copyconditionalsource:ceph-s3-tests
copy-0003 0.539s pass

CopyObject with non-matching x-amz-copy-source-if-none-match succeeds

tier-1copyconditionalsource:ceph-s3-tests
copy-0004 0.290s pass

CopyObject with matching x-amz-copy-source-if-none-match returns PreconditionFailed

tier-1copyconditionalerrorssource:ceph-s3-tests
copy-0005 0.719s pass

Copy a 16 MiB object within a bucket

tier-1copysource:ceph-s3-tests
copy-0006 0.071s pass

Copy from a non-existent source bucket returns 404

tier-1copyerrorssource:ceph-s3-tests
copy-0007 0.000s skipped

CopyObject applies a canned public-read ACL to the destination

tier-1copyaclsource:ceph-s3-tests

skipped: ACL is not supported

copy-0008 0.391s fail

Copy an object to a different bucket

tier-1copysource:ceph-s3-testssource:msst-s3
step 1 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0009 0.466s fail

Copy from another user's private object into own bucket is denied

tier-2copyerrorssource:ceph-s3-tests
step 2 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0010 0.000s skipped

Grantee with FULL_CONTROL on object and bucket can copy within the owner's bucket

tier-3copyaclsource:ceph-s3-tests

skipped: ACL is not supported

copy-0011 0.414s pass

Copy with REPLACE directive overwrites metadata and content type (3-byte object)

tier-1copysource:ceph-s3-tests
copy-0012 0.401s pass

Copy retains metadata and content type (3-byte object)

tier-1copysource:ceph-s3-tests
copy-0013 0.367s pass

Copy an object onto itself without changes returns InvalidRequest

tier-1copyerrorssource:ceph-s3-testssource:msst-s3
copy-0014 0.553s pass

Copy an object onto itself with the REPLACE metadata directive

tier-1copysource:ceph-s3-tests
copy-0015 0.512s pass

Copy preserves the source object's Content-Type

tier-1copysource:ceph-s3-testssource:msst-s3
copy-0016 1.177s fail

Copy specific versions across versioned and non-versioned buckets

tier-1copyversioningsource:ceph-s3-tests
step 5 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0017 0.149s pass

Copy a specific version of an object whose key needs URL encoding

tier-1copyversioningencodingsource:ceph-s3-tests
copy-0018 3.839s fail

Copy versions of a multipart object across versioned and non-versioned buckets, retaining body, metadata and content type

tier-1copyversioningmultipartsource:ceph-s3-tests
step 14 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0019 0.497s pass

Copy a zero-length object

tier-1copysource:ceph-s3-tests
copy-0020 1.332s pass

Checksums are preserved across overwrite and server-side copy

Reduced to the firm assertions of the source test: STANDARD upload ETag equals MD5, overwrite keeps content identical, and a server-side copy has identical content. Vendor-tolerant storage-class transition loops are omitted.

tier-1copyobject-crudchecksumssource:msst-s3
copy-0021 0.979s pass

CopyObject to a new key within the same bucket succeeds

tier-1copysource:msst-s3
copy-0022 1.042s fail

CopySource with a leading slash is accepted

tier-1copysource:msst-s3
step 1 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0023 0.546s pass

CopyObject onto itself with an invalid MetadataDirective is rejected

Original test accepts InvalidArgument or InvalidRequest; both are HTTP 400, so only the status is asserted.

tier-1copyerrorssource:msst-s3
copy-0024 0.572s pass

CopySource without a bucket/key slash separator is rejected

Original test accepts InvalidArgument, InvalidRequest, NoSuchKey or NoSuchBucket; AWS returns 400 InvalidArgument for a copy source lacking a slash, which is asserted here.

tier-1copyerrorssource:msst-s3
copy-0025 0.598s pass

CopyObject with an invalid TaggingDirective is rejected

Original test accepts InvalidArgument or InvalidRequest; both are HTTP 400, so only the status is asserted.

tier-1copytaggingerrorssource:msst-s3
copy-0026 0.585s pass

CopyObject with MetadataDirective=COPY preserves metadata and Content-Type

tier-1copysource:msst-s3
copy-0027 0.546s pass

CopyObject with MetadataDirective=REPLACE applies new metadata and Content-Type

tier-1copysource:msst-s3
copy-0028 0.132s pass

CopyObject of a non-existent directory-style key returns NoSuchKey

tier-1copyerrorssource:msst-s3
copy-0029 0.351s pass

CopyObject with MetadataDirective=REPLACE updates content headers

tier-1copysource:msst-s3
copy-0030 0.431s pass

CopyObject with spaces in the source key

tier-1copyencodingsource:msst-s3
copy-0031 0.395s pass

CopyObject with TaggingDirective=COPY preserves source tags

tier-3copytaggingsource:msst-s3
copy-0032 0.285s pass

CopyObject with TaggingDirective=REPLACE applies new tags

tier-3copytaggingsource:msst-s3
copy-0033 0.063s pass

CopyObject with a malformed x-amz-copy-source (no bucket/key separator) is rejected

The original test accepted InvalidArgument or InvalidRequest; AWS returns InvalidArgument for a copy source without a bucket/key separator. Expressed as a raw-HTTP step so the malformed header bypasses SDK client-side validation.

tier-1copyerrorssource:msst-s3
copy-0034 0.294s pass

CopyObject to a non-existing destination bucket returns NoSuchBucket

tier-1copyerrorssource:msst-s3
copy-0035 0.175s pass

CopyObject with a non-existing source key returns NoSuchKey

tier-1copyerrorssource:msst-s3source:ceph-s3-tests
copy-0036 0.515s pass

CopyObject preserves the source ContentType by default

tier-1copysource:msst-s3
copy-0037 0.412s pass

CopyObject response includes a CopyObjectResult and the copy has an ETag

tier-1copysource:msst-s3
copy-0038 0.396s pass

CopyObject with default tagging directive copies the source tags

tier-3copytaggingsource:msst-s3
copy-0039 0.224s pass

CopyObject with TaggingDirective REPLACE replaces the source tags

tier-3copytaggingsource:msst-s3
copy-0040 0.273s fail

CopyObject between buckets preserves ContentType and custom metadata

tier-1copysource:msst-s3
step 1 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0041 0.217s pass

CopyObject preserves all content headers and custom metadata by default

The original test set Expires to a dynamic now+10h timestamp; a fixed future HTTP-date is used instead (Expires is not asserted here).

tier-1copysource:msst-s3
copy-0042 0.181s pass

CopyObject onto itself with REPLACE sets the new metadata map

tier-1copysource:msst-s3
copy-0043 0.190s pass

CopyObject preserves CacheControl and Expires headers

The original test set Expires to a dynamic now+24h timestamp; a fixed future HTTP-date is used instead, and only the presence of Expires is asserted (as in the original).

tier-1copysource:msst-s3
copy-0044 0.212s pass

CopyObject preserves the CRC32 checksum of the source object

tier-3copychecksumssource:msst-s3
copy-0045 0.220s pass

CopyObject tagging directives: default copies tags, REPLACE substitutes them

tier-3copytaggingsource:msst-s3
copy-0046 0.215s pass

CopyObject with CopySourceIfMatch: matching ETag succeeds, wrong ETag fails

Original test accepted any error for the wrong-ETag copy (bare except); the canonical S3 behavior of 412 PreconditionFailed is asserted here.

tier-1copyconditionalsource:msst-s3
copy-0047 0.485s fail

CopyObject of a 6 MiB object preserves its size

tier-1copysource:msst-s3
step 1 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
copy-0048 0.807s pass

Prefix rename via CopyObject + DeleteObject leaves old prefix empty and content intact

Directory rename emulated as copy-to-new-prefix then delete-from-old. Object count reduced from the source's 1000 to a representative sample.

tier-1copylistingobject-crudsource:msst-s3
cors 10/10 passed
cors-0001 0.000s skipped

CORS preflight requesting a non-allowed header is rejected

A rule allows origin '*' for GET and exposes x-amz-meta-header1 but declares no AllowedHeaders; an OPTIONS preflight asking for x-amz-meta-header2 returns 403 with no CORS headers. The source test sleeps 3s after PutBucketCors for propagation; the sleep is omitted here.

tier-3corserrorssource:ceph-s3-tests

skipped: PutBucketAcl is not supported

cors-0002 0.000s skipped

CORS origin wildcard matching on unauthenticated GET, PUT and OPTIONS requests

With rules for origins '*suffix', 'start*end', 'prefix*' (GET) and '*.put' (PUT) on a public-read bucket, checks access-control-allow-origin/access-control-allow-methods on plain requests and OPTIONS preflights for matching and non-matching origins. The source test sleeps 3s after PutBucketCors for propagation; the sleep is omitted here.

tier-3corsanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

cors-0003 0.000s skipped

CORS wildcard '*' origin echoes '*' in access-control-allow-origin

With a single GET rule allowing origin '*' on a public-read bucket, a request without an Origin header gets no CORS headers and a request with any Origin gets access-control-allow-origin '*'. The source test sleeps 3s after PutBucketCors for propagation; the sleep is omitted here.

tier-3corsanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

cors-0004 0.000s skipped

Put, get and delete bucket CORS configuration

GetBucketCors returns 404 before any configuration is set, the stored rules round-trip exactly, and GetBucketCors returns 404 again after DeleteBucketCors.

tier-3corserrorssource:ceph-s3-tests

skipped: PutBucketCors is not supported

cors-0005 0.000s skipped

CORS configuration: put, replace with multiple rules, update, and delete returns NoSuchCORSConfiguration

tier-3corssource:msst-s3

skipped: PutBucketCors is not supported

cors-0006 0.000s skipped

CORS rule limit: 100 rules accepted, 101 rules rejected

The original test accepted either TooManyRules or InvalidRequest for the 101-rule case; only the shared 400 status is asserted here.

tier-3corserrorssource:msst-s3

skipped: PutBucketCors is not supported

cors-0007 0.084s pass

PutBucketCors rejects unsupported HTTP methods in AllowedMethods

The original test accepted either InvalidArgument or MalformedXML; only the shared 400 status is asserted here.

tier-3corserrorssource:msst-s3
cors-0008 0.000s skipped

MaxAgeSeconds: negative rejected, zero and large values accepted

The original test accepted any error for the negative case; a 400 rejection is asserted here.

tier-3corserrorssource:msst-s3

skipped: PutBucketCors is not supported

cors-0009 0.000s skipped

DeleteBucketCors removes the configuration; GetBucketCors then returns NoSuchCORSConfiguration

tier-3corserrorssource:msst-s3

skipped: PutBucketCors is not supported

cors-0010 0.003s pass

DeleteBucketCors on a non-existent bucket returns NoSuchBucket

tier-3corserrorssource:msst-s3
cors-0011 0.000s skipped

DeleteBucketCors succeeds on unset configuration and removes a set configuration

tier-3corssource:msst-s3

skipped: DeleteBucketCors is not supported

cors-0012 0.069s pass

GetBucketCors on a bucket without CORS configuration returns NoSuchCORSConfiguration

tier-3corserrorssource:msst-s3
cors-0013 0.005s pass

GetBucketCors on a non-existent bucket returns NoSuchBucket

tier-3corserrorssource:msst-s3
cors-0014 0.000s skipped

PutBucketCors then GetBucketCors round-trips the rules

Original test compared the list members as sets; this vector asserts them in the order they were put, which is the order S3 returns them.

tier-3corssource:msst-s3

skipped: PutBucketCors is not supported

cors-0015 0.069s pass

PutBucketCors with an empty CORSRules array returns MalformedXML

Original test also accepted InvalidRequest as the error code.

tier-3corserrorssource:msst-s3
cors-0016 0.188s pass

PutBucketCors rejects invalid header names in AllowedHeaders

Header names containing spaces, colons, parentheses, slashes, brackets, equals or quotes are invalid. Original test also accepted InvalidArgument or AccessControlAllowRequestHeaderNotAllowed as the error code.

tier-3corserrorssource:msst-s3
cors-0017 0.164s pass

PutBucketCors rejects invalid header names in ExposeHeaders

Header names containing spaces, colons, parentheses, slashes, brackets, equals or quotes are invalid. Original test also accepted InvalidArgument or UnexpectedContent as the error code.

tier-3corserrorssource:msst-s3
cors-0018 0.127s pass

PutBucketCors rejects invalid HTTP methods in AllowedMethods

Only uppercase GET, PUT, POST, DELETE, HEAD are valid CORS methods. Original test also accepted CORSInvalidAccessControlMethod or InvalidArgument as the error code.

tier-3corserrorssource:msst-s3
cors-0019 0.115s pass

PutBucketCors with malformed Content-MD5 returns InvalidDigest and wrong Content-MD5 returns BadDigest

Original test accepted InvalidDigest or InvalidRequest for the malformed value, and BadDigest or InvalidDigest for the well-formed-but-wrong value.

tier-3corserrorssource:msst-s3
cors-0020 0.016s pass

PutBucketCors on a non-existent bucket returns NoSuchBucket

tier-3corserrorssource:msst-s3
cors-0021 0.000s skipped

PutBucketCors accepts multiple rules with wildcard origins and negative MaxAgeSeconds

tier-3corssource:msst-s3

skipped: PutBucketCors is not supported

encoding 20/20 passed
encoding-0001 0.000s skipped

Keys with special characters list correctly, read back their bodies and accept ACLs

tier-3encodingaclsource:ceph-s3-tests

skipped: ACL is not supported

encoding-0002 0.839s pass

Keys containing URL-encoding-like characters round-trip literally

Keys that look percent-encoded or contain '+', '?' and '#' must be stored and retrieved literally, not decoded.

tier-1encodingsource:msst-s3
encoding-0003 0.969s pass

Path-traversal-like keys and Windows reserved names round-trip

Keys containing ../ or ..\ sequences must be stored literally (no path normalization); Windows reserved device names are ordinary keys.

tier-1encodingsource:msst-s3
encoding-0004 0.440s pass

Keys containing CR/LF and escape control characters round-trip

The original also tried a key containing a NUL (0x00) byte, accepting either success or InvalidArgument rejection; that case is omitted because the accept-or-reject disjunction is not expressible.

tier-1encodingsource:msst-s3
encoding-0005 0.000s skipped

Slash-only keys and a 1024-byte maximum-length key round-trip

tier-1encodingsource:msst-s3

skipped: Known deviation: slash-only object keys route to the bucket handler: fiber trims trailing slashes when matching, so PUT /bucket// resolves to CreateBucket

encoding-0006 0.071s pass

Key longer than 1024 bytes is rejected

The original accepted KeyTooLong* or InvalidRequest; AWS returns KeyTooLongError.

tier-1encodingerrorssource:msst-s3
encoding-0007 0.221s pass

Unicode object key round-trip

tier-1encodingunicodesource:msst-s3
encoding-0008 0.229s pass

Object key containing '+' is listable by literal '+' prefix and HEADable

The source test branches on an SDK capability flag for legacy '+'-as-space URL encoding; the correct S3 behavior (default branch) is that '+' in a key is a literal plus sign.

tier-1encodinglistingsource:msst-s3
encoding-0009 0.755s pass

Real-world object keys mixing paths, dates, '@', parentheses, colons, '#' and brackets round-trip

Listing order assertion relies on S3's guaranteed ascending UTF-8 binary key order.

tier-1encodinglistingsource:msst-s3
encoding-0010 0.721s pass

Path-like object keys (nested, leading/trailing/double slashes, directory markers) list correctly

Listing order assertion relies on S3's guaranteed ascending UTF-8 binary key order.

tier-1encodinglistingsource:msst-s3
encoding-0011 4.585s pass

Object keys with 24 common special characters can be created, listed and read back

Listing order assertion relies on S3's guaranteed ascending UTF-8 binary key order.

tier-1encodinglistingsource:msst-s3
encoding-0012 0.890s pass

Object keys with non-ASCII Unicode characters (CJK, accents, Cyrillic, emoji) list correctly

Listing order assertion relies on S3's guaranteed ascending UTF-8 binary key order.

tier-1encodingunicodelistingsource:msst-s3
encoding-0013 0.875s pass

Object keys requiring URL encoding round-trip through put, get and list

tier-1encodinglistingsource:msst-s3
encoding-0014 1.006s pass

Keys with URL-special ASCII characters round-trip through PutObject/GetObject

Space, plus, percent, question mark, hash, ampersand, equals and at-sign in object keys. The original accepted InvalidArgument rejection as an alternative outcome for lenient vendors; AWS S3 accepts all of these keys, so the vector asserts the round-trip.

tier-1encodingsource:msst-s3
encoding-0015 1.124s pass

Path-separator variations in keys are stored as-is and listable by prefix

Double/triple slashes, leading slash, dot and dot-dot segments must not be normalized: each key appears verbatim in a prefix listing (prefixes are the first five characters of the key, as in the original test).

tier-1encodinglistingsource:msst-s3
encoding-0016 0.285s pass

A raw space and a percent-encoded space are distinct object keys

'test space.txt' and 'test%20space.txt' are two different objects. The original also tolerated normalization to a single form; AWS S3 stores both distinctly, so the listing asserts exactly the two keys.

tier-1encodinglistingsource:msst-s3
encoding-0017 1.466s pass

UTF-8 international keys round-trip through PutObject/GetObject

Accented Latin, Cyrillic, Chinese, Japanese and Korean keys. The original accepted InvalidArgument rejection as an alternative outcome; AWS S3 accepts any UTF-8 key, so the vector asserts the round-trip.

tier-1encodingunicodesource:msst-s3
encoding-0018 1.251s pass

Spaces and percent sequences in directory and file parts are accepted

PutObject with reserved characters at different path positions, then ListObjectsV2 with the directory part as Prefix and '/' Delimiter. The original recorded the listing outcome without failing on absence, so the converted steps assert only that both operations succeed.

tier-1encodinglistingsource:msst-s3
encoding-0019 0.833s pass

Query-string-like characters in keys are accepted and retrievable

Keys containing '?', '&', '=' and '#' sequences that resemble query strings or fragments must not be interpreted as such. The original accepted InvalidArgument rejection as an alternative outcome; AWS S3 accepts these keys.

tier-1encodingsource:msst-s3
encoding-0020 2.292s pass

Object keys are case-sensitive

GetObject with the case-swapped form of each stored key must fail. The original accepted any error; AWS S3 returns 404 NoSuchKey since the case-swapped key does not exist.

tier-1encodingerrorssource:msst-s3
encoding-0021 0.188s pass

An 819-character key round-trips

A long key approaching URL length limits (within the 1024-byte S3 key limit). The original accepted KeyTooLong/RequestURITooLong as an alternative outcome; AWS S3 accepts keys up to 1024 bytes, so the vector asserts the round-trip.

tier-1encodingsource:msst-s3
encoding-0022 0.084s pass

CreateMultipartUpload preserves keys with non-ASCII (Greek, Chinese) characters

tier-1multipartencodingunicodesource:msst-s3
lifecycle-config 0/0 passed
lifecycle-config-0001 0.000s skipped

DeleteBucketLifecycle returns 204 with or without a configuration and removes it

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0002 0.000s skipped

Lifecycle expiration rule with Days of 0 is rejected with InvalidArgument

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0003 0.000s skipped

No x-amz-expiration header when object tags do not match an And tag-filtered rule

tier-3lifecycle-configtaggingsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0004 0.000s skipped

HeadObject response carries x-amz-expiration header for a matching lifecycle rule

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0005 0.000s skipped

PutObject response carries x-amz-expiration header for a matching lifecycle rule

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0006 0.000s skipped

x-amz-expiration header follows tag-filtered lifecycle rule matches on HeadObject

tier-3lifecycle-configtaggingsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0007 0.000s skipped

GetBucketLifecycleConfiguration returns the rules that were put

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0008 0.000s skipped

Lifecycle rules stored without an ID are returned with a generated ID

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0009 0.000s skipped

Lifecycle rule ID longer than 255 characters is rejected with InvalidArgument

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0010 0.000s skipped

Lifecycle rule with invalid Status casing or value is rejected with MalformedXML

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0011 0.000s skipped

Lifecycle configuration with duplicate rule IDs is rejected with InvalidArgument

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0012 0.000s skipped

PutBucketLifecycleConfiguration with two prefix rules succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0013 0.000s skipped

Lifecycle expiration rule with an absolute Date succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0014 0.000s skipped

PutBucketLifecycleConfiguration with ExpiredObjectDeleteMarker rule succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0015 0.000s skipped

PutBucketLifecycleConfiguration with an empty Filter succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0016 0.000s skipped

PutBucketLifecycleConfiguration with a Filter Prefix succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0017 0.000s skipped

Lifecycle expiration Date not in ISO 8601 extended format is rejected

tier-3lifecycle-configerrorswire-headerssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0018 0.000s skipped

PutBucketLifecycleConfiguration with NoncurrentVersionExpiration rules succeeds

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0019 0.000s skipped

Set lifecycle configuration with AbortIncompleteMultipartUpload rules

tier-3lifecycle-configsource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0020 0.000s skipped

Set lifecycle transition with a malformed date is rejected with 400

tier-3lifecycle-configerrorssource:ceph-s3-tests

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0021 0.000s skipped

Lifecycle configuration: put, replace with multiple rules, disabled rules, and delete

tier-3lifecycle-configsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0022 0.000s skipped

Basic lifecycle configuration with prefix filter, expiration and transition round-trips

tier-3lifecycle-configsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0023 0.000s skipped

Lifecycle rule with multiple correctly ordered storage-class transitions is accepted

tier-3lifecycle-configsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0024 0.000s skipped

Lifecycle rule with out-of-order transition days is rejected

tier-3lifecycle-configerrorssource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0025 0.000s skipped

Lifecycle rule with And filter combining prefix and tags is accepted

tier-3lifecycle-configtaggingsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0026 0.000s skipped

Lifecycle rule with AbortIncompleteMultipartUpload is accepted

tier-3lifecycle-configmultipartsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0027 0.000s skipped

Lifecycle rule with date-based expiration is accepted

The source computed now+30 days; a fixed far-future midnight-UTC date preserves the assertion (a Date expiration is accepted) without time dependence.

tier-3lifecycle-configsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0028 0.000s skipped

Lifecycle configuration with 100 rules is accepted

tier-3lifecycle-configsource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

lifecycle-config-0029 0.000s skipped

DeleteBucketLifecycle removes configuration; subsequent get returns NoSuchLifecycleConfiguration

tier-3lifecycle-configerrorssource:msst-s3

skipped: GetBucketLifecycleConfiguration and PutBucketLifecycleConfiguration are not supported

listing 105/105 passed
listing-0001 0.920s pass

ListObjectsV2 KeyCount matches the number of keys in the bucket

tier-1listingsource:ceph-s3-tests
listing-0002 2.619s pass

ListObjects with letter delimiter groups keys into common prefixes

tier-3listingsource:ceph-s3-tests
listing-0003 1.969s pass

ListObjects with slash delimiter rolls keys up into common prefixes

tier-3listingsource:ceph-s3-testssource:msst-s3
listing-0004 1.659s pass

ListObjects with dot delimiter groups keys into common prefixes

tier-3listingsource:ceph-s3-tests
listing-0005 1.691s pass

ListObjects with empty delimiter behaves as no delimiter and echoes none

tier-3listingsource:ceph-s3-tests
listing-0006 1.758s pass

ListObjects without a delimiter returns all keys and echoes no delimiter

tier-3listingsource:ceph-s3-testssource:msst-s3
listing-0007 1.572s pass

ListObjects with percent delimiter groups keys into common prefixes

tier-3listingsource:ceph-s3-tests
listing-0008 1.565s pass

ListObjects delimiter and prefix pagination with Marker and NextMarker

tier-3listingsource:ceph-s3-tests
listing-0009 0.564s pass

ListObjects with prefix ending in the delimiter returns the exact-match key

tier-3listingsource:ceph-s3-tests
listing-0010 0.565s pass

ListObjects with newline delimiter matches no keys and returns all objects

tier-3listingsource:ceph-s3-tests
listing-0011 0.563s pass

ListObjects with whitespace delimiter groups keys into common prefixes

tier-3listingsource:ceph-s3-tests
listing-0012 0.311s pass

Objects in one bucket do not appear when listing a different bucket

tier-3listingsource:ceph-s3-tests
listing-0013 0.773s pass

ListObjects with url encoding-type URL-encodes keys and common prefixes

tier-3listingencodingsource:ceph-s3-tests
listing-0014 0.609s pass

ListObjects paginates with MaxKeys and Marker

tier-3listingsource:ceph-s3-tests
listing-0015 0.713s pass

ListObjectsV2 with letter delimiter groups keys into common prefixes

tier-1listingsource:ceph-s3-tests
listing-0016 0.730s pass

ListObjectsV2 with slash delimiter rolls keys up into common prefixes and counts them in KeyCount

tier-1listingsource:ceph-s3-tests
listing-0017 0.539s pass

ListObjectsV2 with dot delimiter groups keys into common prefixes

tier-1listingsource:ceph-s3-tests
listing-0018 0.658s pass

ListObjectsV2 with empty delimiter behaves as no delimiter and echoes none

tier-1listingsource:ceph-s3-tests
listing-0019 1.105s pass

ListObjectsV2 without a delimiter returns all keys and echoes no delimiter

tier-1listingsource:ceph-s3-tests
listing-0020 1.197s pass

ListObjectsV2 with percent delimiter groups keys into common prefixes

tier-1listingsource:ceph-s3-tests
listing-0021 1.551s pass

ListObjectsV2 delimiter and prefix pagination with continuation tokens

tier-1listingsource:ceph-s3-tests
listing-0022 0.590s pass

ListObjectsV2 with prefix ending in the delimiter returns the exact-match key

tier-1listingsource:ceph-s3-tests
listing-0023 1.437s pass

ListObjectsV2 with newline delimiter matches no keys and returns all objects

tier-1listingsource:ceph-s3-tests
listing-0024 1.538s pass

ListObjectsV2 with whitespace delimiter groups keys into common prefixes

tier-1listingsource:ceph-s3-tests
listing-0025 1.411s pass

ListObjectsV2 with url encoding-type URL-encodes keys and common prefixes

tier-1listingencodingsource:ceph-s3-tests
listing-0026 1.226s pass

ListObjectsV2 with FetchOwner=true includes Owner in listed objects

tier-1listingsource:ceph-s3-tests
listing-0027 0.830s pass

ListObjectsV2 paginates with MaxKeys and StartAfter

tier-1listingsource:ceph-s3-tests
listing-0028 1.377s pass

ListObjects with a delimiter matching no keys returns all keys and no common prefixes

tier-3listingsource:ceph-s3-tests
listing-0029 1.378s pass

ListObjects with MaxKeys=1 truncates after the first key and Marker resumes the listing

tier-3listingsource:ceph-s3-tests
listing-0030 1.228s pass

ListObjects with MaxKeys=0 returns no keys and is not truncated

tier-3listingsource:ceph-s3-tests
listing-0031 0.983s pass

ListObjects prefix filtering works on non-slash prefixes

tier-3listingsource:ceph-s3-tests
listing-0032 0.469s pass

ListObjects with a directory prefix returns only keys under that prefix

tier-3listingsource:ceph-s3-tests
listing-0033 0.578s pass

ListObjects prefix and delimiter logic works with non-slash delimiter

tier-3listingsource:ceph-s3-tests
listing-0034 0.937s pass

ListObjects with prefix and delimiter returns direct keys and rolls up deeper keys

tier-3listingsource:ceph-s3-testssource:msst-s3
listing-0035 0.936s pass

ListObjects with a matching prefix but non-matching delimiter returns all prefixed keys uncollapsed

tier-3listingsource:ceph-s3-tests
listing-0036 1.334s pass

ListObjects with non-matching prefix and non-matching delimiter returns an empty listing

tier-3listingsource:ceph-s3-tests
listing-0037 1.200s pass

ListObjects with an empty prefix returns all keys

tier-3listingsource:ceph-s3-tests
listing-0038 0.817s pass

ListObjects with a prefix matching no keys returns an empty listing

tier-3listingsource:ceph-s3-tests
listing-0039 0.812s pass

ListObjects with an unprintable (newline) prefix returns an empty listing and echoes the prefix

tier-3listingsource:ceph-s3-tests
listing-0040 0.561s pass

ListObjectsV2 with a delimiter matching no keys returns all keys and no common prefixes

tier-1listingsource:ceph-s3-tests
listing-0041 0.415s pass

ListObjectsV2 without FetchOwner omits Owner from listed objects

tier-1listingsource:ceph-s3-tests
listing-0042 0.542s pass

ListObjectsV2 with FetchOwner=false omits Owner from listed objects

tier-1listingsource:ceph-s3-tests
listing-0043 0.908s pass

ListObjectsV2 with MaxKeys=1 truncates after the first key and StartAfter resumes the listing

tier-1listingsource:ceph-s3-tests
listing-0044 0.751s pass

ListObjectsV2 prefix filtering works on non-slash prefixes

tier-1listingsource:ceph-s3-tests
listing-0045 0.744s pass

ListObjectsV2 with a directory prefix returns only keys under that prefix

tier-1listingsource:ceph-s3-tests
listing-0046 0.801s pass

ListObjectsV2 prefix and delimiter logic works with non-slash delimiter

tier-1listingsource:ceph-s3-tests
listing-0047 0.652s pass

ListObjectsV2 with prefix and delimiter returns direct keys and rolls up deeper keys

tier-1listingsource:ceph-s3-testssource:msst-s3
listing-0048 0.597s pass

ListObjectsV2 with a matching prefix but non-matching delimiter returns all prefixed keys uncollapsed

tier-1listingsource:ceph-s3-tests
listing-0049 0.559s pass

ListObjectsV2 with non-matching prefix and non-matching delimiter returns an empty listing

tier-1listingsource:ceph-s3-tests
listing-0050 0.581s pass

ListObjectsV2 with an empty prefix returns all keys

tier-1listingsource:ceph-s3-tests
listing-0051 0.605s pass

ListObjectsV2 with a prefix matching no keys returns an empty listing

tier-1listingsource:ceph-s3-tests
listing-0052 0.765s pass

ListObjectsV2 with an unprintable (newline) prefix returns an empty listing and echoes the prefix

tier-1listingsource:ceph-s3-tests
listing-0053 1.105s pass

ListObjects marker past the last key returns no keys

tier-3listingsource:ceph-s3-tests
listing-0054 1.143s pass

ListObjects with an empty marker returns all keys

tier-3listingsource:ceph-s3-tests
listing-0055 1.518s pass

ListObjects without a marker echoes an empty Marker

tier-3listingsource:ceph-s3-tests
listing-0056 1.362s pass

ListObjects marker between keys starts listing after its sort position

tier-3listingsource:ceph-s3-tests
listing-0057 1.122s pass

ListObjects with an unprintable marker echoes it and returns all keys

tier-3listingsource:ceph-s3-tests
listing-0058 1.163s pass

ListObjects with non-numeric max-keys returns InvalidArgument

tier-3listingerrorswire-headerssource:ceph-s3-tests
listing-0059 0.937s pass

ListObjects default MaxKeys is 1000 and returns all keys

tier-3listingsource:ceph-s3-tests
listing-0060 0.000s skipped

Anonymous ListObjects succeeds on a public-read bucket

tier-3listingaclanon-accesssource:ceph-s3-tests

skipped: ACL is not supported

listing-0061 0.000s skipped

Anonymous ListObjects on a private bucket returns AccessDenied

tier-3listingerrorsanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

listing-0062 0.000s skipped

ListObjects entries carry the per-object ETag, Size and Owner

The source test also compares LastModified (truncated to whole seconds) between HeadObject and the listing; that sub-second-tolerant comparison is not expressible and is omitted.

tier-3listingsource:ceph-s3-tests

skipped: GetObjectAcl is not supported

listing-0063 0.000s skipped

ListObjectVersions entries carry the per-object ETag, Size, Owner and VersionId

The source test also compares LastModified (truncated to whole seconds) between HeadObject and the listing; that sub-second-tolerant comparison is not expressible and is omitted.

tier-3listingversioningsource:ceph-s3-tests

skipped: GetObjectAcl is not supported

listing-0064 1.014s pass

ListObjects with an underscore-prefixed key prefix returns the matching keys

tier-3listingsource:ceph-s3-tests
listing-0065 0.881s pass

ListObjectsV2 with both ContinuationToken and StartAfter resumes from the token

tier-1listingsource:ceph-s3-tests
listing-0066 0.900s pass

ListObjectsV2 resumes listing from NextContinuationToken

tier-1listingsource:ceph-s3-tests
listing-0067 0.995s pass

ListObjectsV2 with an empty ContinuationToken returns InvalidArgument

AWS rejects an empty continuation token with 400 InvalidArgument (verified against AWS S3); an empty token is not treated as "no token".

tier-1listingsource:ceph-s3-tests
listing-0068 1.159s pass

ListObjectsV2 default MaxKeys is 1000 and returns all keys

tier-1listingsource:ceph-s3-tests
listing-0069 1.312s pass

ListObjectsV2 with MaxKeys=0 returns no keys and is not truncated

tier-1listingsource:ceph-s3-tests
listing-0070 0.000s skipped

Anonymous ListObjectsV2 succeeds on a public-read bucket

tier-3listingaclanon-accesssource:ceph-s3-tests

skipped: ACL is not supported

listing-0071 0.000s skipped

Anonymous ListObjectsV2 on a private bucket returns AccessDenied

tier-1listingerrorsanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

listing-0072 1.342s pass

ListObjectsV2 StartAfter past the last key returns no keys

tier-1listingsource:ceph-s3-tests
listing-0073 1.065s pass

ListObjectsV2 StartAfter between keys starts listing after its sort position

tier-1listingsource:ceph-s3-tests
listing-0074 1.667s pass

ListObjectsV2 with an unprintable StartAfter echoes it and returns all keys

tier-1listingsource:ceph-s3-tests
listing-0075 3.267s pass

ListObjectsV2 with a prefix returns all 10 seeded objects

tier-1listingsource:msst-s3
listing-0076 0.148s pass

ListObjectsV2 accepts an empty Prefix and an empty Delimiter

tier-1listingsource:msst-s3
listing-0077 0.074s pass

ListObjects (v1) on an empty bucket returns no contents and is not truncated

The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.

tier-3listingsource:msst-s3source:ceph-s3-tests
listing-0078 0.252s pass

ListObjects (v1) with negative MaxKeys is rejected

The original test only asserts that some error is raised for MaxKeys=-1; AWS returns 400 InvalidArgument, but only the 400 status is asserted here.

tier-3listingerrorssource:msst-s3
listing-0079 1.733s pass

ListObjects (v1) Marker need not be an existing key

tier-3listingsource:msst-s3
listing-0080 1.569s pass

ListObjects (v1) with MaxKeys=0 returns no objects and is not truncated

The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.

tier-3listingsource:msst-s3
listing-0081 1.309s pass

ListObjects (v1) Prefix on a nested hierarchy returns only keys under the prefix

tier-3listingsource:msst-s3
listing-0082 0.005s pass

ListObjects (v1) on a non-existing bucket returns NoSuchBucket

tier-3listingerrorssource:msst-s3
listing-0083 1.880s pass

ListObjects (v1) sets IsTruncated when MaxKeys is smaller than the object count

tier-3listingsource:msst-s3
listing-0084 2.394s pass

ListObjects (v1) with Prefix returns only matching keys and echoes the prefix

tier-3listingsource:msst-s3
listing-0085 0.530s pass

ListObjectsV2 returns empty results for an empty bucket and a non-matching prefix

The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here. The object is created mid-test, so PutObject is a step.

tier-1listingsource:msst-s3
listing-0086 0.078s pass

ListObjectsV2 with negative MaxKeys is rejected

The original test accepts error code InvalidArgument or InvalidRequest; code alternation is not expressible, so only the 400 status is asserted.

tier-1listingerrorssource:msst-s3
listing-0087 5.044s pass

ListObjectsV2 accepts MaxKeys above the 1000 cap

MaxKeys=2000 must succeed; with 10 objects in the bucket all 10 are returned (the original test asserted at most 1000).

tier-1listingsource:msst-s3
listing-0088 2.915s pass

ListObjectsV2 with MaxKeys=0 returns no objects

The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.

tier-1listingsource:msst-s3
listing-0089 2.404s pass

ListObjectsV2 with Delimiter navigates a nested hierarchy level by level

tier-1listingsource:msst-s3
listing-0090 6.964s pass

ListObjectsV2 paginates 25 objects in three pages via NextContinuationToken

tier-1listingsource:msst-s3
listing-0091 1.782s pass

ListObjectsV2 StartAfter beyond all keys returns an empty result

The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.

tier-1listingsource:msst-s3
listing-0092 1.785s pass

ListObjectsV2 StartAfter need not be an existing key

tier-1listingsource:msst-s3
listing-0093 3.087s pass

ListObjectsV2 truncates when common prefixes exceed MaxKeys

15 single-object folders listed with Delimiter and MaxKeys=10: response is truncated and common prefixes are capped at MaxKeys (the original test asserted <= 10; the deterministic count is 10).

tier-1listingsource:msst-s3
listing-0094 0.336s pass

ListObjectsV2 with FetchOwner returns the single object listing

The original test only checks Owner sub-fields conditionally when Owner is present, so only the Contents count is asserted.

tier-1listingsource:msst-s3
listing-0095 1.085s pass

ListObjectsV2 Prefix filter returns only keys under each prefix

tier-1listingsource:msst-s3
listing-0096 2.047s pass

ListObjectsV2 StartAfter returns only keys strictly after the given key

tier-1listingsource:msst-s3
listing-0097 2.854s pass

ListObjectsV2 MaxKeys limits the page and sets IsTruncated

tier-1listingsource:msst-s3
listing-0098 3.460s pass

ListObjectsV2 continuation tokens page through all 15 objects in 5 pages

Original test looped with ContinuationToken until IsTruncated was false and checked all 15 keys were returned; unrolled here as 5 pages of 3.

tier-1listingsource:msst-s3
listing-0099 3.373s pass

ListObjectsV2 with delimiter rolls directories into CommonPrefixes

Original test asserted at least the 3 expected directory prefixes; AWS returns exactly dir1/, dir2/ and special/ sorted.

tier-1listingsource:msst-s3
listing-0100 3.772s pass

ListObjectsV2 with Prefix returns only matching keys

tier-1listingsource:msst-s3
listing-0101 3.627s pass

ListObjectsV2 with Prefix and Delimiter returns subdirectory CommonPrefixes

Original test asserted dir1/subdir1/ and dir1/subdir2/ both appear in CommonPrefixes.

tier-1listingsource:msst-s3
listing-0102 3.243s pass

ListObjectsV2 StartAfter skips keys up to and including the marker

Original test asserted dir1/file1.txt is excluded and dir1/file2.txt is included; KeyCount 13 is the 13 keys sorting after the marker, which implies the exclusion.

tier-1listingsource:msst-s3
listing-0103 0.062s pass

ListObjectsV2 on an empty bucket returns KeyCount 0 and no Contents

tier-1listingsource:msst-s3
listing-0104 2.982s pass

ListObjectsV2 with a prefix lists keys containing special characters

tier-1listingencodingsource:msst-s3
listing-0105 2.380s pass

ListObjects (v1) and ListObjectsV2 return the same count for MaxKeys 5

tier-3listingsource:msst-s3
listing-0106 2.498s pass

ListObjectsV2 with FetchOwner includes Owner in Contents entries

tier-1listingsource:msst-s3
listing-0107 32.273s pass

100 small objects in one bucket are all reported by ListObjectsV2

Source asserted KeyCount >= 100; the bucket contains exactly 100 objects so KeyCount 100 is the equivalent assertion.

tier-1listingsource:msst-s3
listing-0108 0.742s pass

ListObjectsV2 pagination returns every key exactly once in order

Listing with a small MaxKeys and following ContinuationToken returns all keys across pages with no duplicates or omissions, in lexical order.

tier-1listingsource:msst-s3
listing-0109 1.170s pass

Deleted objects do not appear in ListObjectsV2 (no phantoms)

Read-after-delete for listings: after deleting every key under a prefix an immediate list is empty. Object count reduced from the source's 50 to a representative sample.

tier-1listingobject-crudsource:msst-s3
listing-0110 1.328s pass

Objects are immediately visible in ListObjectsV2 after PUT

Read-after-write for listings: keys PUT under a prefix appear in an immediate list. Object count reduced from the source's 100 to a representative sample; no pagination boundary is crossed.

tier-1listingsource:msst-s3
listing-0111 3.059s pass

ListObjectsV2 with delimiter groups top-level prefixes; full list returns every object

Lists a multi-level hierarchy with Delimiter="/" (CommonPrefixes) and without a delimiter (all keys). Object count reduced from the source's 1000 to a representative sample.

tier-1listingsource:msst-s3
misc 5/5 passed
misc-0001 0.000s skipped

Requests with a wrong ExpectedBucketOwner are denied even on a public bucket

The source test uses the main user's id with 'foo' appended as the incorrect owner; the main account id is not referenceable in vectors, so a fixed wrong account id is used instead.

tier-3miscerrorsaclanon-accesssource:ceph-s3-tests

skipped: ACL is not supported

misc-0002 0.259s pass

GetObject with PartNumber on a non-multipart object: part 2 fails, part 1 returns the whole object

tier-1miscerrorssource:ceph-s3-tests
misc-0003 0.000s skipped

GetObject with PartNumber on a non-multipart SSE-C object: part 2 fails, part 1 returns the whole object

tier-1miscsseerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

misc-0004 6.261s pass

GetObjectAttributes on a 6-part multipart object reports size, parts and composite ETag

tier-3miscmultipartsource:ceph-s3-tests
misc-0005 6.062s pass

GetObjectAttributes paginates the multipart part list with MaxParts and PartNumberMarker

tier-3miscmultipartsource:ceph-s3-tests
misc-0006 0.952s pass

GetObjectAttributes on a single-part multipart object lists one part

tier-3miscmultipartsource:ceph-s3-tests
misc-0007 1.682s pass

GetObjectAttributes returns VersionId and honors an explicit VersionId on a versioned object

tier-3miscversioningsource:ceph-s3-tests
misc-0008 0.000s skipped

Website configuration: put with index/error documents, update, and minimal index-only form

tier-3miscsource:msst-s3

skipped: PutBucketWebsite is not supported

misc-0009 0.000s skipped

Inventory configuration: create daily CSV report config, verify, and update in place

tier-3miscsource:msst-s3

skipped: PutBucketInventoryConfiguration is not supported

misc-0010 0.000s skipped

Metrics configuration: create, add prefix-filtered config, update filter, and delete

tier-3miscsource:msst-s3

skipped: PutBucketMetricsConfiguration is not supported

misc-0011 0.000s skipped

Analytics configuration: create storage-class analysis configs, verify, update, and delete

tier-3miscsource:msst-s3

skipped: PutBucketAnalyticsConfiguration is not supported

multipart 137/161 passed
multipart-0001 1.442s pass

Aborting a multipart upload leaves no object

tier-1multipartsource:ceph-s3-tests
multipart-0002 0.437s pass

AbortMultipartUpload with an unknown UploadId returns NoSuchUpload

tier-1multiparterrorssource:ceph-s3-tests
multipart-0003 0.571s pass

An in-progress multipart upload does not replace the existing object until completed

tier-1multipartsource:ceph-s3-tests
multipart-0004 0.449s pass

ListMultipartUploads reports all in-progress uploads

tier-1multipartsource:ceph-s3-tests
multipart-0005 0.000s skipped

ListMultipartUploads reports each upload's initiator and owner identity

tier-3multipartaclsource:ceph-s3-tests

skipped: ACL is not supported

multipart-0006 0.153s pass

CompleteMultipartUpload with a bad top-level SHA256 checksum returns BadDigest

tier-1multipartchecksumserrorssource:ceph-s3-tests
multipart-0007 0.137s pass

CompleteMultipartUpload with a missing per-part checksum and bad top-level checksum returns BadDigest

tier-1multipartchecksumserrorssource:ceph-s3-tests
multipart-0008 0.385s pass

Multipart upload with SHA256 checksum completes and reports the composite checksum on demand

tier-1multipartchecksumssource:ceph-s3-tests
multipart-0009 0.399s fail

UploadPartCopy with syntactically invalid CopySourceRange values returns InvalidArgument

tier-1multipartcopyerrorssource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 400, got 501 error: expected InvalidArgument, got NotImplemented
multipart-0010 0.366s fail

UploadPartCopy with a CopySourceRange past the end of the source returns InvalidRange

Original accepts HTTP status 400 or 416 with error code InvalidRange; only the error code is asserted here.

tier-1multipartcopyerrorssource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected InvalidArgument, got NotImplemented
multipart-0011 0.906s fail

Multipart copy of a prefix of a 12MiB source at sizes straddling the part boundary

Original copies six prefix sizes; this vector covers representative 1-, 2- and 3-part copy sizes and verifies each destination equals the source prefix.

tier-1multipartcopysource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0012 0.879s fail

UploadPartCopy of a single byte from a 7MiB source object

tier-1multipartcopysource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0013 2.649s fail

Multipart copy from source keys with special names (space, underscores, '?versionId')

tier-1multipartcopysource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0014 3.128s fail

Multipart copy of each version of a versioned source object

tier-1multipartcopyversioningsource:ceph-s3-tests
step 5 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0015 1.194s fail

UploadPartCopy without CopySourceRange copies the whole source object

tier-1multipartcopysource:ceph-s3-tests
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0016 2.180s pass

GetObject/HeadObject with PartNumber on a completed multipart object

tier-1multipartsource:ceph-s3-tests
multipart-0017 1.431s pass

Three-part SHA256 multipart upload yields a stable composite ETag and checksum across repeated completes

tier-1multipartchecksumssource:ceph-s3-tests
multipart-0018 0.440s pass

GetObject/HeadObject with PartNumber on a single-part multipart object

tier-1multipartsource:ceph-s3-tests
multipart-0019 0.000s skipped

GetObject/HeadObject with PartNumber on an SSE-C multipart object

SSE-C customer key is the well-known s3-tests test key, supplied as raw key bytes via $base64.

tier-1multipartsseencryptionsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

multipart-0020 4.031s pass

30MiB multipart upload with metadata and content-type, full and ranged read-back

Original also verifies the whole object via _check_content_using_range in 1MB and 10MB steps; a representative ranged GET of the first 1MB is asserted here.

tier-1multipartsource:ceph-s3-tests
multipart-0021 0.074s pass

CompleteMultipartUpload with an unknown UploadId returns NoSuchUpload

tier-1multiparterrorssource:ceph-s3-testssource:msst-s3
multipart-0022 1.331s pass

Multipart upload of three 5MiB parts plus a 3MiB tail reads back concatenated

tier-1multipartsource:ceph-s3-tests
multipart-0023 0.093s pass

CompleteMultipartUpload with no parts (empty body) returns MalformedXML

boto3 sends an empty request body when MultipartUpload is omitted; expressed as a raw POST ?uploadId with an empty body.

tier-1multiparterrorssource:ceph-s3-tests
multipart-0024 0.257s pass

CompleteMultipartUpload with a wrong part ETag returns InvalidPart

tier-1multiparterrorssource:ceph-s3-tests
multipart-0025 0.204s pass

CompleteMultipartUpload referencing a part number that was never uploaded returns InvalidPart

tier-1multiparterrorssource:ceph-s3-testssource:msst-s3
multipart-0026 1.594s pass

Multipart uploads at sizes straddling the 5MiB part boundary complete

Original exercises six sizes (5MiB, +100KiB, +600KiB, 10MiB+100KiB, 10MiB+600KiB, 10MiB); this vector covers representative 1-, 2- and 3-part sizes on the same key.

tier-1multipartsource:ceph-s3-tests
multipart-0027 0.000s skipped

Multipart upload succeeds on a bucket carrying an allow-all bucket policy

Original uploads 50MiB; a 10MiB two-part upload is used here since the point is that the bucket policy does not block the owner's multipart upload.

tier-3multipartpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

multipart-0028 0.980s pass

Multipart upload overwrites an existing single-PUT object

tier-1multipartsource:ceph-s3-tests
multipart-0029 3.832s pass

Re-uploading a part with identical data before completing produces the correct object

Original repeats this for several resend sets ([0],[1],[2],[1,2],[0..5]); this vector re-sends part 2 as a representative case.

tier-1multipartsource:ceph-s3-tests
multipart-0030 2.381s pass

Completing a multipart upload whose non-final parts are below 5MiB returns EntityTooSmall

tier-1multiparterrorssource:ceph-s3-tests
multipart-0031 0.234s pass

One-byte multipart upload completes; retrying the complete is idempotent

tier-1multipartsource:ceph-s3-tests
multipart-0032 0.434s fail

CompleteMultipartUpload If-Match is evaluated against the current version on a versioned bucket

tier-1multipartconditionalversioningerrorssource:ceph-s3-tests
step 3 (CompleteMultipartUpload) failed
Expected vs actual
status: expected 501, got 404 error: expected NotImplemented, got NoSuchKey
multipart-0033 1.072s pass

CompleteMultipartUpload If-None-Match is evaluated against the current version on a versioned bucket

tier-1multipartconditionalversioningerrorssource:ceph-s3-tests
multipart-0034 0.135s fail

CompleteMultipartUpload If-Match/If-None-Match conditions on an unversioned bucket, including after delete

tier-1multipartconditionalerrorssource:ceph-s3-tests
step 3 (CompleteMultipartUpload) failed
Expected vs actual
status: expected 501, got 404 error: expected NotImplemented, got NoSuchKey
multipart-0035 0.926s pass

Three-part multipart upload with CRC32 FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0036 1.446s pass

Three-part multipart upload with CRC32C FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0037 1.440s pass

Three-part multipart upload with CRC64NVME FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0038 1.627s pass

Three-part multipart upload with SHA1 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0039 3.904s pass

Three-part multipart upload with SHA256 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0040 3.698s pass

10 MiB two-part multipart upload preserves content integrity and size

tier-1multipartsource:msst-s3
multipart-0041 5.584s pass

In-progress multipart upload is discoverable via ListMultipartUploads/ListParts and can be resumed and completed

tier-1multipartsource:msst-s3
multipart-0042 2.420s pass

Multipart ETag differs from the single-part ETag of the same content and contains a dash

tier-1multipartsource:msst-s3
multipart-0043 0.531s fail

Aborting an already-aborted multipart upload is idempotent and returns 204

The source tolerated MinIO's idempotent second abort; converted to the AWS behavior where a second AbortMultipartUpload on the same upload id fails with NoSuchUpload.

tier-1multiparterrorssource:msst-s3
step 3 (AbortMultipartUpload) failed
Expected vs actual
error: expected success, got status 404, error NoSuchUpload: The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.
multipart-0044 0.920s pass

CacheControl set on CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0045 0.663s pass

ContentType set on CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0046 0.116s pass

ListMultipartUploads accepts a KeyMarker parameter

The source tolerates both full KeyMarker filtering (AWS) and implementations that return all uploads (MinIO); only the unconditional assertion (the request succeeds and Uploads is present) is converted.

tier-1multipartsource:msst-s3
multipart-0047 0.601s pass

ListParts with PartNumberMarker returns only the parts after the marker

tier-1multipartsource:msst-s3
multipart-0048 0.091s pass

ListMultipartUploads reports an Initiated timestamp for an in-progress upload

tier-1multipartsource:msst-s3
multipart-0049 0.436s pass

Completed multipart upload no longer appears in ListMultipartUploads

The source asserts the specific upload id is absent from the listing; in this dedicated bucket that is equivalent to Uploads being absent from the parsed response.

tier-1multipartsource:msst-s3
multipart-0050 0.061s pass

UploadPart accepts a zero-byte part and returns an ETag

The source tolerated implementations rejecting zero-byte parts; converted to the AWS behavior where UploadPart accepts an empty body and returns an ETag (the 5 MiB minimum is enforced only at CompleteMultipartUpload, never on an individual UploadPart).

tier-1multipartsource:msst-s3
multipart-0051 1.985s pass

GetObject with PartNumber returns exactly that part's bytes and PartsCount

tier-1multipartsource:msst-s3
multipart-0052 1.175s pass

GetObjectAttributes on a completed multipart object reports total size and ObjectParts count

tier-3multipartobject-crudsource:msst-s3
multipart-0053 0.082s pass

ListMultipartUploads on a bucket with no active uploads returns no uploads

tier-1multipartlistingsource:msst-s3
multipart-0054 0.129s pass

ListMultipartUploads accepts a MaxUploads value above the server cap

The original additionally asserted the echoed MaxUploads is >= 1000 (AWS caps at 1000, MinIO at 10000, others echo the request); a numeric lower-bound is not expressible, so only presence is asserted.

tier-1multipartlistingsource:msst-s3
multipart-0055 0.119s pass

UploadIdMarker without KeyMarker is ignored by ListMultipartUploads

tier-1multipartlistingsource:msst-s3
multipart-0056 0.096s pass

ListMultipartUploads KeyMarker past all keys yields an empty upload list

Per the source test's stated intent: a KeyMarker lexicographically after every upload key returns no uploads. The literal boto3 assertion ('Uploads' key present) contradicts AWS, which omits the element when empty.

tier-1multipartlistingsource:msst-s3
multipart-0057 0.519s pass

ListMultipartUploads with negative MaxUploads returns InvalidArgument

The original accepted InvalidArgument or InvalidRequest; AWS returns InvalidArgument.

tier-1multiparterrorssource:msst-s3
multipart-0058 0.109s pass

ListMultipartUploads MaxUploads truncates with continuation markers

The original tolerated implementations that do not truncate (MinIO); this vector asserts the AWS truncation behavior.

tier-1multipartlistingsource:msst-s3
multipart-0059 0.069s pass

ListMultipartUploads lists active uploads with key, upload id and storage class

StorageClass is asserted as STANDARD, REDUCED_REDUNDANCY or empty, matching the original's accepted set.

tier-1multipartlistingsource:msst-s3
multipart-0060 0.557s pass

ListMultipartUploads reports ChecksumAlgorithm CRC32

tier-1multipartchecksumslistingsource:msst-s3
multipart-0061 0.562s pass

ListMultipartUploads reports ChecksumAlgorithm CRC32C

tier-1multipartchecksumslistingsource:msst-s3
multipart-0062 0.072s pass

ListMultipartUploads reports ChecksumAlgorithm SHA1

tier-1multipartchecksumslistingsource:msst-s3
multipart-0063 0.077s pass

ListMultipartUploads reports ChecksumAlgorithm SHA256

tier-1multipartchecksumslistingsource:msst-s3
multipart-0064 0.076s pass

ListMultipartUploads reports ChecksumAlgorithm CRC64NVME

tier-1multipartchecksumslistingsource:msst-s3
multipart-0065 0.344s pass

ListParts after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0066 0.076s pass

ListParts default MaxParts is 1000

Original test also accepted 10000 (MinIO); AWS S3 defaults MaxParts to 1000.

tier-1multipartsource:msst-s3
multipart-0067 0.063s pass

ListParts on an upload with no parts returns an empty, non-truncated listing

Original test accepted Parts absent or an empty list; AWS returns no Part elements so the parsed response has no Parts member.

tier-1multipartsource:msst-s3
multipart-0068 0.137s pass

ListParts with a valid upload id but wrong object key returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0069 0.129s pass

ListParts with a nonexistent upload id returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0070 0.377s pass

ListParts with negative MaxParts returns InvalidArgument

tier-1multiparterrorssource:msst-s3
multipart-0071 3.544s pass

ListParts returns all uploaded parts with number, ETag, size and storage class

tier-1multipartsource:msst-s3
multipart-0072 2.964s pass

ListParts pagination: MaxParts truncation and NextPartNumberMarker resume

tier-1multipartsource:msst-s3
multipart-0073 1.157s pass

AbortMultipartUpload with a valid upload id but wrong key returns NoSuchUpload

Original test also tolerated an idempotent success (MinIO); AWS S3 scopes the upload id to the key and returns NoSuchUpload.

tier-1multiparterrorssource:msst-s3
multipart-0074 0.121s pass

AbortMultipartUpload with a nonexistent upload id returns NoSuchUpload

Original test also tolerated an idempotent success (MinIO); AWS S3 returns NoSuchUpload.

tier-1multiparterrorssource:msst-s3
multipart-0075 0.004s pass

AbortMultipartUpload on a nonexistent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0076 0.103s pass

AbortMultipartUpload returns HTTP 204 No Content

tier-1multipartsource:msst-s3
multipart-0077 1.002s pass

AbortMultipartUpload removes the upload from ListMultipartUploads

Original test asserted zero uploads remain; AWS returns no Upload elements so the parsed response has no Uploads member.

tier-1multipartsource:msst-s3
multipart-0078 0.127s pass

Aborted upload disappears from ListMultipartUploads

tier-1multipartsource:msst-s3
multipart-0079 0.121s pass

ListMultipartUploads lists all in-progress uploads

Original test compared the key set; AWS returns uploads sorted by key so an ordered match is equivalent.

tier-1multipartsource:msst-s3
multipart-0080 0.006s pass

ListMultipartUploads on a nonexistent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0081 0.525s pass

ListMultipartUploads honors MaxUploads and sets IsTruncated

Original test tolerated MinIO ignoring MaxUploads but asserted IsTruncated when the page was short; AWS returns exactly 2 uploads with IsTruncated true.

tier-1multipartsource:msst-s3
multipart-0082 0.500s pass

ListMultipartUploads lists a single in-progress upload with key and upload id

tier-1multipartsource:msst-s3
multipart-0083 0.498s pass

ListMultipartUploads with a Delimiter parameter succeeds

Original test only asserted a non-empty combined result (uploads plus common prefixes), which is not directly expressible; this vector requires the delimited listing call to succeed.

tier-1multipartsource:msst-s3
multipart-0084 0.243s pass

ListMultipartUploads with a Prefix parameter succeeds

Original test made no effective assertion on the filtering result (its check was vacuous), so this vector only requires the prefixed listing call to succeed.

tier-1multipartsource:msst-s3
multipart-0085 5.014s pass

Three-part multipart upload of 5 MiB parts reports total ContentLength

tier-1multipartsource:msst-s3
multipart-0086 0.242s fail

UploadPart after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
step 3 (UploadPart) failed
Expected vs actual
status: expected 404, got 0 error: expected NoSuchUpload, got (no error)
multipart-0087 0.209s pass

UploadPart with part numbers outside 1-10000 returns InvalidArgument

The source test accepted InvalidArgument, InvalidPartNumber or InvalidPart; AWS returns InvalidArgument for out-of-range part numbers.

tier-1multiparterrorssource:msst-s3
multipart-0088 4.622s pass

Parts uploaded out of order (3, 1, 2) are listed in ascending part-number order

tier-1multipartsource:msst-s3
multipart-0089 0.006s pass

UploadPart to a non-existent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0090 0.610s pass

UploadPart with a valid upload ID but a different key returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0091 0.603s pass

UploadPart with a non-existent upload ID returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0092 3.979s pass

Re-uploading the same part number overwrites the part; ListParts shows only the latest ETag

The source asserts the two upload ETags differ; this is expressed by asserting each equals the MD5 ETag of its distinct part data.

tier-1multipartsource:msst-s3
multipart-0093 1.032s pass

UploadPart responds with HTTP 200 and an ETag

tier-1multipartsource:msst-s3
multipart-0094 3.088s fail

UploadPartCopy with malformed CopySourceRange values is rejected

AWS returns 400 InvalidArgument for a CopySourceRange that is not of the form bytes=first-last (including a start greater than the end). The source test also accepted InvalidRange.

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 400, got 501 error: expected InvalidArgument, got NotImplemented
multipart-0095 1.190s fail

UploadPartCopy with CopySourceRange copies exactly the requested bytes

bytes=100-200 is inclusive, so the resulting part is 101 bytes.

tier-1multipartcopysource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0096 0.884s fail

UploadPartCopy CopySourceIfMatch: matching ETag succeeds, wrong ETag returns PreconditionFailed

tier-1multipartcopyconditionalsource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0097 0.833s fail

UploadPartCopy CopySourceIfModifiedSince: past date succeeds, future date returns PreconditionFailed

The source test used now-1day and now+1day; fixed far-past and far-future dates preserve the semantics. AWS returns 412 PreconditionFailed for the unmet condition; the source test also accepted NotModified from other implementations.

tier-1multipartcopyconditionalsource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0098 0.970s fail

UploadPartCopy CopySourceIfNoneMatch: non-matching ETag succeeds, matching ETag returns PreconditionFailed

AWS returns 412 PreconditionFailed when x-amz-copy-source-if-none-match matches the source ETag. The source test also accepted NotModified from other implementations.

tier-1multipartcopyconditionalsource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0099 0.538s fail

UploadPartCopy CopySourceIfUnmodifiedSince: future date succeeds, past date returns PreconditionFailed

The source test used now+1day and now-1day; fixed far-future and far-past dates preserve the semantics.

tier-1multipartcopyconditionalsource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0100 0.522s fail

UploadPartCopy with a range extending past the source object end is rejected

Unlike a ranged GET, UploadPartCopy strictly validates CopySourceRange against the source size: bytes=0-2000 on a 1024-byte object is 400 InvalidArgument on AWS. The source test also accepted InvalidRange.

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 400, got 501 error: expected InvalidArgument, got NotImplemented
multipart-0101 0.364s fail

UploadPartCopy with a range starting beyond the source object end is rejected

bytes=2000-3000 on a 1024-byte source object is 400 InvalidArgument on AWS. The source test also accepted InvalidRange.

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 400, got 501 error: expected InvalidRequest, got NotImplemented
multipart-0102 0.341s fail

UploadPartCopy with a key different from the multipart upload's returns NoSuchUpload

An upload id is tied to the key it was created for; using it with another key must fail.

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchUpload, got NotImplemented
multipart-0103 0.411s fail

UploadPartCopy with an unknown upload id returns NoSuchUpload

tier-1multipartcopyerrorssource:msst-s3
step 1 (UploadPartCopy) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchUpload, got NotImplemented
multipart-0104 0.149s pass

UploadPartCopy with a malformed CopySource is rejected

CopySource must be of the form bucket/key. AWS returns 400 InvalidArgument for each malformed value; the source test also accepted NoSuchBucket, NoSuchKey and InvalidRequest from implementations that parse the source before validating it.

tier-1multipartcopyerrorssource:msst-s3
multipart-0105 0.429s pass

UploadPartCopy with part numbers outside 1-10000 is rejected

AWS returns 400 InvalidArgument for part numbers 0, -1 and 10001. The source test also accepted InvalidPartNumber and InvalidPart from other implementations.

tier-1multipartcopyerrorssource:msst-s3
multipart-0106 0.006s pass

UploadPartCopy to a non-existent destination bucket returns NoSuchBucket

tier-1multipartcopyerrorssource:msst-s3
multipart-0107 0.205s fail

UploadPartCopy from a non-existent source bucket returns NoSuchBucket

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchBucket, got NotImplemented
multipart-0108 0.138s fail

UploadPartCopy from a non-existent source key returns NoSuchKey

tier-1multipartcopyerrorssource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchKey, got NotImplemented
multipart-0109 0.476s fail

UploadPartCopy copies a whole 5 MiB object into a part; ListParts shows its size and ETag

tier-1multipartcopysource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
multipart-0110 0.379s pass

CompleteMultipartUpload after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0111 0.307s pass

CompleteMultipartUpload with an empty Parts list returns MalformedXML

AWS returns MalformedXML for an empty CompleteMultipartUpload Parts list. The source test also accepted InvalidRequest from other implementations.

tier-1multiparterrorssource:msst-s3
multipart-0112 0.947s pass

CompleteMultipartUpload with parts out of ascending order returns InvalidPartOrder

tier-1multiparterrorssource:msst-s3
multipart-0113 0.270s pass

CompleteMultipartUpload with an invalid ETag returns InvalidPart

tier-1multiparterrorssource:msst-s3
multipart-0114 0.264s pass

CompleteMultipartUpload with a negative part number is rejected

AWS returns 400 InvalidArgument for a part number outside 1-10000. The source test also accepted InvalidPart from other implementations.

tier-1multiparterrorssource:msst-s3
multipart-0115 0.405s pass

Single-part multipart upload completes and has the correct size

tier-1multipartsource:msst-s3
multipart-0116 0.460s pass

CompleteMultipartUpload with non-final parts under 5 MiB returns EntityTooSmall

tier-1multiparterrorssource:msst-s3
multipart-0117 0.304s pass

CompleteMultipartUpload succeeds when MpuObjectSize matches the actual object size

tier-1multipartsource:msst-s3
multipart-0118 0.733s pass

Multipart ETag has hash-partcount format and HeadObject returns the same ETag

tier-1multipartsource:msst-s3
multipart-0119 0.574s pass

CompleteMultipartUpload replaces an existing object at the same key

tier-1multipartobject-crudsource:msst-s3
multipart-0120 0.000s skipped

Multipart upload initiated with a private canned ACL yields grants on the completed object

tier-3multipartaclsource:msst-s3

skipped: ACL is not supported

multipart-0121 0.295s pass

CreateMultipartUpload accepts an Expires header and the upload completes

The original test treats preservation of Expires as implementation-specific and only asserts the operations succeed, so no Expires response assertion is made.

tier-1multipartsource:msst-s3
multipart-0122 0.000s skipped

Multipart upload initiated with SSE-S3 preserves AES256 encryption on the completed object

tier-1multipartssesource:msst-s3

skipped: Server Side Encryption is not supported

multipart-0123 0.306s pass

WebsiteRedirectLocation set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0124 2.946s pass

Assembled multipart object content equals the concatenation of its parts

tier-1multipartsource:msst-s3
multipart-0125 6.548s pass

50 MiB multipart upload of ten 5 MiB parts completes with correct ContentLength

tier-1multipartsource:msst-s3
multipart-0126 4.535s pass

Parts uploaded in reverse order assemble in part-number order on complete

tier-1multipartsource:msst-s3
multipart-0127 2.612s pass

Metadata, tags and content type from CreateMultipartUpload are preserved on the completed object

tier-3multiparttaggingsource:msst-s3
multipart-0128 1.923s pass

Multipart upload initiated with StorageClass STANDARD completes and the object is readable

The original test's StorageClass assertion is vacuous (always true); the converted assertion is that all operations succeed.

tier-1multipartsource:msst-s3
multipart-0129 2.157s pass

Last multipart part may be smaller than the 5 MiB minimum

tier-1multipartsource:msst-s3
multipart-0130 24.163s pass

Multipart upload with 50 parts assembles correctly

Each part is 5 MiB of its decimal part number repeated; the read-back digest covers the 250 MB concatenation.

tier-1multipartsource:msst-s3
multipart-0131 0.348s pass

Multipart upload with the maximum part number 10000 succeeds

tier-1multipartsource:msst-s3
multipart-0132 1.157s pass

CompleteMultipartUpload with a non-last part under 5 MiB returns EntityTooSmall

The source accepted EntityTooSmall or InvalidPart; the canonical S3 code EntityTooSmall is asserted here.

tier-1multiparterrorssource:msst-s3
multipart-0133 0.563s pass

CompleteMultipartUpload naming parts that were never uploaded returns InvalidPart

The source accepted InvalidPart or NoSuchKey; the canonical S3 code InvalidPart is asserted here.

tier-1multiparterrorssource:msst-s3
multipart-0134 2.888s pass

Multipart part numbers need not be consecutive

Parts 1, 5 and 10 are uploaded; the assembled object must be their concatenation (digest of 5 MiB 'a' + 5 MiB 'b' + 5 MiB 'c').

tier-1multipartsource:msst-s3
multipart-0135 0.399s pass

Multipart upload of a single empty part creates a zero-length object

The source skipped when the server rejected empty parts with EntityTooSmall/InvalidPart; AWS accepts a single empty part, asserted here.

tier-1multipartsource:msst-s3
multipart-0136 0.911s pass

CreateMultipartUpload rejects duplicate tag keys

Original test accepted InvalidTag or InvalidRequest; alternatives are not expressible, so the common HTTP 400 status is asserted.

tier-1multiparttaggingerrorssource:msst-s3
multipart-0137 1.448s pass

CreateMultipartUpload accepts degenerate empty tagging strings

tier-1multiparttaggingsource:msst-s3
multipart-0138 0.586s pass

CreateMultipartUpload rejects tag keys and values with invalid characters

Original test accepted InvalidTag, InvalidTagKey or InvalidTagValue; alternatives are not expressible, so the common HTTP 400 status is asserted.

tier-1multiparttaggingerrorssource:msst-s3
multipart-0139 0.093s pass

Multiple concurrent multipart uploads are allowed for the same key

Original test also asserted the three upload IDs differ; value inequality is not expressible, but three listed uploads for the key implies three distinct uploads.

tier-1multipartsource:msst-s3
multipart-0140 0.004s pass

CreateMultipartUpload on a non-existing bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0141 0.488s pass

CreateMultipartUpload accepts - _ . / in tag keys and values

tier-3multiparttaggingsource:msst-s3
multipart-0142 0.090s pass

CreateMultipartUpload returns a non-empty upload ID with bucket and key

tier-1multipartsource:msst-s3
multipart-0143 0.398s pass

CreateMultipartUpload metadata and content headers are preserved on the completed object

tier-1multipartmetadatasource:msst-s3
multipart-0144 0.717s pass

CreateMultipartUpload with StorageClass STANDARD completes successfully

Original test only verified the object exists after completion (ETag present); it did not assert the storage class on HeadObject.

tier-1multipartsource:msst-s3
multipart-0145 0.714s pass

CreateMultipartUpload with Tagging applies tags to the completed object

tier-3multiparttaggingsource:msst-s3
multipart-0146 0.301s pass

CreateMultipartUpload response contains Bucket, Key and UploadId

tier-1multipartsource:msst-s3
multipart-0147 0.141s pass

CreateMultipartUpload returns a non-empty UploadId for each new upload

The source test also asserts the two UploadIds differ; inequality between captured values is not expressible, so only the non-empty-string assertion is carried over.

tier-1multipartsource:msst-s3
multipart-0148 0.441s pass

ContentDisposition set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0149 0.348s pass

ContentEncoding set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0150 0.334s pass

ContentLanguage set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0151 0.131s pass

CreateMultipartUpload preserves keys with special ASCII characters

tier-1multipartencodingsource:msst-s3
multipart-0152 0.066s pass

CreateMultipartUpload accepts a 1024-byte key (maximum allowed)

tier-1multipartsource:msst-s3
multipart-0153 0.789s pass

Basic two-part multipart upload completes

tier-1multipartsource:msst-s3
multipart-0154 0.740s pass

Aborted multipart upload leaves no object and invalidates the UploadId

tier-1multiparterrorssource:msst-s3
multipart-0155 0.910s pass

Complete one multipart upload and abort another in the same bucket

tier-1multiparterrorssource:msst-s3
multipart-0156 0.444s pass

ListParts returns an uploaded part

tier-1multipartsource:msst-s3
multipart-0157 1.293s pass

Parts uploaded out of order are assembled in part-number order

tier-1multipartsource:msst-s3
multipart-0158 0.633s pass

Re-uploading the same part number overwrites with the later part

tier-1multipartsource:msst-s3
multipart-0159 0.106s pass

UploadPart rejects out-of-range part numbers with InvalidArgument

tier-1multiparterrorssource:msst-s3
multipart-0160 4.318s pass

Complete a 5-part multipart upload and read back with matching checksum

tier-1multipartsource:msst-s3
multipart-0161 0.571s pass

UploadPart returns the part ETag

tier-1multipartsource:msst-s3
multipart-0162 1.476s pass

ListParts reports the size of each uploaded multipart part

After uploading three 10 MiB parts to an in-progress upload, ListParts returns all three parts with correct Size, and the upload can be aborted.

tier-1multipartsource:msst-s3
multipart-0163 1.029s pass

ListMultipartUploads lists only in-progress uploads, not completed or aborted

Completed and aborted multipart uploads do not appear in ListMultipartUploads; abandoned (in-progress) uploads do, and can be aborted to clear the list.

tier-1multipartsource:msst-s3
multipart-0164 2.217s pass

Re-uploading the same part number with the same data is idempotent

Uploading part 1 three times with identical bytes returns the same ETag each time and ListParts shows a single part.

tier-1multipartsource:msst-s3
multipart-0165 2.300s pass

Resume a multipart upload using ListParts as a checkpoint

After uploading some parts, ListParts reports the uploaded parts; remaining parts are uploaded and the object completes with the full combined size.

tier-1multipartsource:msst-s3
multipart-0166 0.161s pass

CreateMultipartUpload with a 1025-byte key returns KeyTooLongError

The source test accepts KeyTooLongError or InvalidArgument; KeyTooLongError is the AWS S3 error code.

tier-1errorsmultipartsource:msst-s3
object-crud 161/161 passed
object-crud-0001 0.175s pass

Put and get a plain text object

tier-1object-crudsource:storage-test
object-crud-0002 0.089s pass

Put and get an empty object

tier-1object-crudsource:storage-test
object-crud-0003 0.377s pass

Put and get a key containing subdirectories and spaces

tier-1object-crudsource:storage-test
object-crud-0004 0.405s pass

Write, read, delete, then verify absence

tier-1object-crudsource:storage-test
object-crud-0005 0.267s pass

GetObject response-* query overrides set the corresponding response headers

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.

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0006 0.170s pass

GetObject with a non-matching If-Match returns PreconditionFailed

tier-1object-crudconditionalerrorssource:ceph-s3-tests
object-crud-0007 0.174s pass

GetObject with a matching If-Match returns the object

The source captures the ETag from the PutObject response; the object prerequisite's etag attribute is the same value.

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0008 0.163s pass

GetObject with a future If-Modified-Since is ignored and returns the object

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.

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0009 0.345s pass

GetObject with a past If-Modified-Since returns the object

The source passes 'Sat, 29 Oct 1994 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0010 0.350s pass

GetObject with a non-matching If-None-Match returns the object

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0011 0.339s pass

GetObject with a matching If-None-Match returns 304 with the ETag header

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.

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0012 0.590s pass

GetObject with a future If-Unmodified-Since returns the object

The source passes 'Sat, 29 Oct 2100 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0013 0.581s pass

GetObject with a past If-Unmodified-Since returns PreconditionFailed

The source passes 'Sat, 29 Oct 1994 19:43:31 GMT'; the same instant is written in ISO 8601 form for the timestamp parameter.

tier-1object-crudconditionalerrorssource:ceph-s3-tests
object-crud-0014 1.321s pass

DeleteObjects removes multiple keys and repeating it reports the missing keys as deleted

tier-3object-crudsource:ceph-s3-tests
object-crud-0015 0.154s pass

DeleteObjects with more than 1000 keys returns 400

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.

tier-1object-cruderrorssource:ceph-s3-tests
object-crud-0016 1.056s pass

DeleteObjects removes multiple keys (verified with ListObjectsV2) and repeating it reports the missing keys as deleted

tier-1object-crudsource:ceph-s3-tests
object-crud-0017 0.546s pass

Content-Encoding set on PutObject is returned by HeadObject

tier-1object-crudencodingsource:ceph-s3-tests
object-crud-0018 0.119s pass

aws-chunked is stripped from the stored Content-Encoding

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.

tier-1object-crudencodingsource:ceph-s3-tests
object-crud-0019 0.000s skipped

Anonymous DeleteObject after the bucket is deleted returns NoSuchBucket

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).

tier-2object-cruderrorsanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

object-crud-0020 0.184s pass

HeadObject on an empty object reports ContentLength 0

tier-1object-crudsource:ceph-s3-tests
object-crud-0021 0.918s pass

PutObject without metadata replaces existing metadata

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.

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0022 0.079s pass

GetObject on a missing key returns NoSuchKey

tier-1object-cruderrorssource:ceph-s3-testssource:storage-testsource:msst-s3
object-crud-0023 0.695s pass

Empty-string user metadata value round-trips

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0024 0.751s pass

User metadata set on PutObject is returned on GetObject

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0025 0.726s pass

Overwriting an object can replace its metadata value with the empty string

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0026 0.461s pass

Cache-Control set on PutObject is returned by HeadObject

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0027 0.368s pass

PutObject response ETag is the quoted MD5 of the body

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0028 0.447s pass

Expires set on PutObject is returned by HeadObject

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.

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0029 0.442s pass

PutObject with a binary body reads back identically

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0030 0.561s pass

Object write, read, overwrite, re-read and delete round-trip

tier-1object-crudsource:ceph-s3-tests
object-crud-0031 0.006s pass

PutObject to a nonexistent bucket returns NoSuchBucket

The source uses the literal bucket name 'whatchutalkinboutwillis'; a reserved never-created name is used instead to avoid collisions with real buckets.

tier-1object-cruderrorssource:ceph-s3-testssource:msst-s3
object-crud-0032 0.368s pass

GetObjectAttributes on a simple object returns size, unquoted ETag and storage class

ETag is the unquoted MD5 of the 3-byte body 'foo'. Attributes not applicable (DeleteMarker, VersionId, ObjectParts) must be absent.

tier-3object-crudsource:ceph-s3-tests
object-crud-0033 0.336s pass

Authenticated PutObject succeeds with HTTP 200

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0034 3.893s pass

Control characters in an object key are valid and round-trip

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.

tier-1object-crudsource:ceph-s3-tests
object-crud-0035 3.966s pass

Ranged GetObject over an 8 MiB object returns 206 with the correct middle slice

tier-1object-crudsource:ceph-s3-tests
object-crud-0036 3.735s pass

Ranged GetObject on an empty object returns 416 InvalidRange

tier-1object-cruderrorssource:ceph-s3-tests
object-crud-0037 0.666s pass

Ranged GetObject entirely beyond the object size returns 416 InvalidRange

tier-1object-cruderrorssource:ceph-s3-testssource:msst-s3
object-crud-0038 0.989s pass

Ranged GetObject returns 206 with the requested slice and Content-Range

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0039 0.876s pass

Ranged GetObject with a suffix range returns the trailing bytes

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0040 1.019s pass

Ranged GetObject with an open-ended range skips leading bytes

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0041 4.122s pass

DeleteObjects bulk-deletes 20 objects and leaves the prefix empty

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.

tier-1object-crudlistingsource:msst-s3
object-crud-0042 0.671s pass

Put a simple object, read it back and find it in a listing

tier-1object-crudlistingsource:msst-s3
object-crud-0043 0.277s pass

Deleted object returns NoSuchKey on GET and disappears from listing

tier-1object-cruderrorssource:msst-s3
object-crud-0044 0.801s pass

Cache-Control header round-trips for several directive combinations

tier-1object-crudsource:msst-s3
object-crud-0045 0.238s pass

Content-Encoding gzip header round-trips on a gzip-compressed object

tier-1object-crudsource:msst-s3
object-crud-0046 0.506s pass

Content-Disposition header round-trips for inline, attachment and filename forms

tier-1object-crudsource:msst-s3
object-crud-0047 0.237s pass

Single-part PutObject ETag equals content MD5 and metadata is preserved

tier-1object-crudchecksumssource:msst-s3
object-crud-0048 0.264s pass

PutObject with 10 user metadata entries, all returned by HeadObject

tier-1object-crudmetadatasource:msst-s3
object-crud-0049 0.308s pass

Put/get round-trip preserves body bytes and the ETag

tier-1object-crudsource:msst-s3
object-crud-0050 0.366s pass

10 MiB object round-trips with size and MD5 intact

tier-1object-crudsource:msst-s3
object-crud-0051 1.224s pass

ETag determinism: identical bodies share an ETag, different bodies do not

Five body pairs (identical, differing digit, case, trailing space, both empty). Inequality is asserted with a negative-lookahead regex against the captured first ETag.

tier-1object-crudsource:msst-s3
object-crud-0052 0.262s pass

Ranged GETs return exactly the requested bytes of a patterned object

tier-1object-crudsource:msst-s3
object-crud-0053 0.354s pass

All 256 byte values survive a put/get round-trip

tier-1object-crudsource:msst-s3
object-crud-0054 1.537s pass

PutObject ETag is a quoted hex string across object sizes 0 B to 5 MiB

tier-1object-crudsource:msst-s3
object-crud-0055 1.077s pass

DeleteObject on 'dir/' succeeds even when nested keys exist under it

Original tolerated DirectoryNotEmpty/NoSuchKey from POSIX-backed gateways; S3 semantics are idempotent success.

tier-1object-crudsource:msst-s3
object-crud-0056 0.192s pass

Deleting 'name' does not remove the distinct object 'name/'

tier-1object-crudsource:msst-s3
object-crud-0057 0.317s pass

Deleting directory marker 'dir/' leaves nested 'dir/file' intact

tier-1object-crudlistingsource:msst-s3
object-crud-0058 0.066s pass

DeleteObject on a missing key succeeds (idempotent)

tier-1object-crudsource:msst-s3
object-crud-0059 0.309s pass

DeleteObject returns HTTP 204

Original accepted 200 or 204; S3 responds 204 No Content.

tier-1object-crudsource:msst-s3
object-crud-0060 0.955s pass

DeleteObject on a non-versioned bucket returns no DeleteMarker

Original accepted DeleteMarker absent or explicitly false; AWS omits the field on non-versioned buckets, asserted here as absent.

tier-1object-crudversioningsource:msst-s3
object-crud-0061 0.947s pass

DeleteObject removes the object; subsequent HeadObject returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0062 0.944s pass

Deleting the same key twice succeeds both times

tier-1object-crudsource:msst-s3
object-crud-0063 1.296s pass

DeleteObject works with dashes, underscores, dots, spaces and parens in keys

tier-1object-crudencodingsource:msst-s3
object-crud-0064 0.484s pass

DeleteObjects with a single missing key reports it deleted and leaves others

tier-1object-crudlistingsource:msst-s3
object-crud-0065 19.608s pass

DeleteObjects deletes a 100-key batch in one request

tier-1object-crudlistingsource:msst-s3
object-crud-0066 0.391s pass

DeleteObjects mixing existing and missing keys reports all deleted and empties the bucket

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.

tier-1object-crudlistingsource:msst-s3
object-crud-0067 0.005s pass

DeleteObjects on a missing bucket returns NoSuchBucket

tier-1object-cruderrorssource:msst-s3
object-crud-0068 0.064s pass

DeleteObjects on missing keys reports them deleted (idempotent)

Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.

tier-1object-crudsource:msst-s3
object-crud-0069 0.631s pass

DeleteObjects in Quiet mode omits the Deleted list but deletes the keys

Original accepted an empty Deleted list as well; AWS omits it entirely in quiet mode.

tier-1object-crudlistingsource:msst-s3
object-crud-0070 0.198s pass

DeleteObjects returns HTTP 200

tier-1object-crudsource:msst-s3
object-crud-0071 1.004s pass

DeleteObjects response lists every deleted key

Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.

tier-1object-crudsource:msst-s3
object-crud-0072 1.828s pass

DeleteObjects removes the named keys and leaves the rest

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.

tier-1object-crudlistingsource:msst-s3
object-crud-0073 1.485s pass

DeleteObjects handles keys with spaces, slashes and @

Original asserted set equality of Deleted keys; unordered set equality beyond length plus one membership probe is not expressible.

tier-1object-crudencodingsource:msst-s3
object-crud-0074 0.340s pass

Zero-byte object: upload, HEAD, GET and copy all preserve zero length

tier-1object-crudsource:msst-s3
object-crud-0075 0.599s pass

Empty user-metadata map and empty metadata values are accepted, empty values preserved

tier-1object-crudsource:msst-s3
object-crud-0076 0.669s pass

Single-character object key is accepted

tier-1object-crudsource:msst-s3
object-crud-0077 0.713s pass

ETag is identical across PutObject, HeadObject, GetObject and ListObjectsV2

tier-1object-crudsource:msst-s3
object-crud-0078 0.546s pass

Zero-byte object PUT returns an ETag

tier-1object-crudsource:msst-s3
object-crud-0079 0.351s pass

Identical content uploaded to two keys yields identical ETags

tier-1object-crudsource:msst-s3
object-crud-0080 0.309s pass

Overwriting an object with different content changes its ETag

The source asserts only inequality of the two ETags; expressed as a negative-lookahead regex against the captured original ETag.

tier-1object-crudsource:msst-s3
object-crud-0081 1.341s pass

ETag is a quoted hex string of at least 32 characters across object sizes

tier-1object-crudsource:msst-s3
object-crud-0082 1.356s pass

Binary, control-character, Unicode and embedded-NUL bodies all yield quoted ETags

tier-1object-crudsource:msst-s3
object-crud-0083 0.952s pass

GetObject after DeleteObject returns 404 NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0084 0.299s pass

GetObject on an existing object returns HTTP 200

tier-1object-crudsource:msst-s3
object-crud-0085 0.248s pass

Expires header set at upload is returned by GetObject

The source used utcnow() plus one hour; a fixed future date is equivalent since Expires is stored metadata, not enforced behavior.

tier-1object-crudsource:msst-s3
object-crud-0086 0.202s pass

WebsiteRedirectLocation set at upload is returned by GetObject

The source tolerated implementations that omit WebsiteRedirectLocation; converted to the AWS round-trip assertion that the value is echoed back.

tier-1object-crudsource:msst-s3
object-crud-0087 0.097s pass

GetObject on an empty directory-marker key (trailing slash) returns zero-length body

tier-1object-crudsource:msst-s3
object-crud-0088 0.071s pass

GetObject on a key under a non-existing parent path returns NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0089 0.074s pass

GetObject on a missing directory-marker key (trailing slash) returns NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0090 0.225s pass

GetObject with ResponseExpires sets an Expires header in the response

tier-1object-crudsource:msst-s3
object-crud-0091 0.235s pass

GetObjectAttributes with an empty attributes list returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0092 0.197s pass

GetObjectAttributes returns ETag, ObjectSize, StorageClass and LastModified for an existing object

tier-3object-crudsource:msst-s3
object-crud-0093 0.493s pass

GetObjectAttributes with an invalid attribute name alongside a valid one returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0094 0.471s pass

GetObjectAttributes on a key nested under an existing file object returns NoSuchKey

tier-3object-cruderrorssource:msst-s3
object-crud-0095 0.058s pass

GetObjectAttributes with a single invalid attribute name returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0096 0.004s pass

GetObjectAttributes on a non-existing bucket returns NoSuchBucket

tier-3object-cruderrorssource:msst-s3
object-crud-0097 0.110s pass

GetObjectAttributes on a non-existing object returns NoSuchKey

tier-3object-cruderrorssource:msst-s3
object-crud-0098 0.527s pass

GetObject ContentLength matches the actual body size

tier-1object-crudsource:msst-s3
object-crud-0099 0.218s pass

GetObject without trailing slash does not match a directory-style key with slash

tier-1object-cruderrorssource:msst-s3
object-crud-0100 0.323s pass

GetObject returns a 1 MiB object intact

tier-1object-crudsource:msst-s3
object-crud-0101 0.256s pass

GetObject response includes a LastModified timestamp

tier-1object-crudsource:msst-s3
object-crud-0102 0.257s pass

GetObject returns the Cache-Control value set at upload

tier-1object-crudsource:msst-s3
object-crud-0103 0.339s pass

GetObject returns the ContentType set at upload

tier-1object-crudsource:msst-s3
object-crud-0104 0.475s pass

GetObject returns user metadata set at upload

tier-1object-crudsource:msst-s3
object-crud-0105 0.214s pass

GetObject on a zero-length object returns empty body and ContentLength 0

tier-1object-crudsource:msst-s3
object-crud-0106 0.878s pass

Ranged GetObject over a known byte pattern returns exact bytes for several ranges

tier-1object-crudsource:msst-s3
object-crud-0107 0.839s pass

Range extending past the object end is trimmed to object size

tier-1object-crudsource:msst-s3
object-crud-0108 1.033s pass

Single-byte ranges bytes=0-0 and bytes=99-99 return exactly one byte

tier-1object-crudsource:msst-s3
object-crud-0109 0.785s pass

HeadObject with Range on a directory-style key ('dir/') returns 206 partial content

tier-1object-crudsource:msst-s3
object-crud-0110 0.783s pass

HeadObject on 'key' returns 404 when only 'key/' exists

tier-1object-cruderrorssource:msst-s3
object-crud-0111 0.425s pass

HeadObject on a key nested under an existing file key returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0112 0.531s pass

HeadObject on 'key/' returns 404 when only 'key' exists

tier-1object-cruderrorssource:msst-s3
object-crud-0113 0.506s pass

HeadObject returns ContentType, ContentEncoding, ContentLanguage and ContentDisposition

tier-1object-crudsource:msst-s3
object-crud-0114 0.566s pass

HeadObject returns a LastModified timestamp

tier-1object-crudsource:msst-s3
object-crud-0115 0.133s pass

HeadObject on a missing key returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0116 0.342s pass

HeadObject returns length, content type, ETag, metadata and LastModified

tier-1object-crudsource:msst-s3
object-crud-0117 0.623s pass

HeadObject returns user-defined metadata

tier-1object-crudsource:msst-s3
object-crud-0118 0.620s pass

HeadObject Range extending beyond object size is trimmed to the object

tier-1object-crudsource:msst-s3
object-crud-0119 1.796s pass

HeadObject with malformed Range headers returns the full object

tier-1object-crudsource:msst-s3
object-crud-0120 1.756s pass

HeadObject with unsatisfiable Range returns 416

tier-1object-cruderrorssource:msst-s3
object-crud-0121 1.762s pass

HeadObject with valid Range headers returns correct Content-Range and Content-Length

tier-1object-crudsource:msst-s3
object-crud-0122 0.649s pass

Standard response headers set at PutObject are returned by HeadObject

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.

tier-1object-crudheaderssource:msst-s3
object-crud-0123 0.463s pass

Mixed-case metadata keys are handled case-insensitively and returned lowercased

tier-1object-crudheadersmetadatasource:msst-s3
object-crud-0124 0.451s pass

ASCII metadata values with spaces, quotes and punctuation are preserved

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.

tier-1object-crudheadersmetadatasource:msst-s3
object-crud-0125 0.198s pass

ETag is quoted hex and consistent between PutObject and HeadObject; LastModified is returned

tier-1object-crudheaderssource:msst-s3
object-crud-0126 0.304s pass

PutObject accepts user metadata just under the 2KB limit

tier-1object-crudmetadatasource:msst-s3
object-crud-0127 0.067s pass

PutObject rejects user metadata over the 2KB limit

AWS S3 returns MetadataTooLarge; the original test also accepted RequestHeaderSectionTooLarge.

tier-1object-crudmetadataerrorssource:msst-s3
object-crud-0128 0.368s pass

100 user metadata headers round-trip through PutObject and HeadObject

tier-1object-crudmetadatasource:msst-s3
object-crud-0129 0.374s pass

ASCII special-character user metadata values round-trip unchanged

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.

tier-1object-crudmetadataunicodesource:msst-s3
object-crud-0130 0.306s pass

User metadata named after system headers does not override system values

tier-1object-crudmetadatasource:msst-s3
object-crud-0131 0.245s pass

PutObject accepts a 200-character user metadata key name

Original test also tolerated an InvalidArgument rejection; AWS S3 accepts long metadata key names within the aggregate 2KB metadata limit.

tier-1object-crudmetadatasource:msst-s3
object-crud-0132 0.559s pass

Object keys are case-sensitive

Puts four case variations of the same name and lists to confirm four distinct objects (keys in UTF-8 byte order).

tier-1object-crudlistingsource:msst-s3
object-crud-0133 0.436s pass

Keys with consecutive slashes are distinct objects

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.

tier-1object-crudlistingsource:msst-s3
object-crud-0134 0.220s pass

PutObject directory-style key with non-empty body is readable

tier-1object-crudsource:msst-s3
object-crud-0135 0.616s pass

Keys with dot segments are stored literally

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.

tier-1object-crudlistingsource:msst-s3
object-crud-0136 0.286s pass

PutObject with empty key segments (a//b//c) round-trips

AWS stores the key literally. Source test also tolerated vendor-specific rejection (XMinioInvalidObjectName etc.).

tier-1object-crudsource:msst-s3
object-crud-0137 0.305s pass

PutObject and GetObject with a leading-slash key

AWS treats a leading slash as part of the literal key. Source test also tolerated vendor-specific rejection (XMinioInvalidResourceName/InvalidObjectName).

tier-1object-crudsource:msst-s3
object-crud-0138 0.230s pass

PutObject creates file key alongside existing directory-style key

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.

tier-1object-crudsource:msst-s3
object-crud-0139 0.246s pass

PutObject creates directory-style key alongside existing file key

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.

tier-1object-crudsource:msst-s3
object-crud-0140 0.420s pass

PutObject creates nested key under an existing file key

Creates 'foo' then 'foo/bar'; keys are independent on AWS. Source test also tolerated vendor-specific rejection (ObjectParentIsFile/InvalidRequest) on filesystem-backed implementations.

tier-1object-crudsource:msst-s3
object-crud-0141 0.410s pass

PutObject overwrite changes content and ETag

Source test asserted the two PutObject ETags differ; expressed here as each ETag equaling the MD5 of its distinct body.

tier-1object-crudsource:msst-s3
object-crud-0142 1.273s pass

PutObject accepts keys with normal, trailing, doubled and leading slashes

AWS accepts all of these keys literally. Source test also tolerated vendor-specific rejection (XMinioInvalidObjectName etc.) of the double/leading-slash keys.

tier-1object-crudsource:msst-s3
object-crud-0143 0.189s pass

Zero-byte object: GET returns empty body and HEAD reports ContentLength 0

tier-1object-crudsource:msst-s3
object-crud-0144 2.188s pass

Small object sizes 1 B to 1 KiB report correct ContentLength

tier-1object-crudsource:msst-s3
object-crud-0145 1.974s pass

Power-of-two object sizes 1 KiB to 1 MiB report correct ContentLength

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.

tier-1object-crudsource:msst-s3
object-crud-0146 0.256s pass

PutObject preserves ContentLanguage, visible via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0147 0.218s pass

PutObject preserves WebsiteRedirectLocation, visible via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0148 0.730s pass

Five sequential overwrites of the same key leave the last-written body

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).

tier-1object-crudsource:msst-s3
object-crud-0149 0.273s pass

PutObject replacing an object updates its Content-Type

tier-1object-crudsource:msst-s3
object-crud-0150 0.167s pass

PutObject stores a 1 KB metadata value

tier-1object-crudsource:msst-s3
object-crud-0151 0.198s pass

PutObject stores Content-Disposition retrievable via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0152 0.781s pass

PutObject preserves explicit Content-Type across various media types

tier-1object-crudsource:msst-s3
object-crud-0153 0.325s pass

PutObject with StorageClass STANDARD stores the object

The original test only verifies the object was created (ContentLength) since HeadObject may omit StorageClass for STANDARD.

tier-1object-crudsource:msst-s3
object-crud-0154 0.091s pass

Zero-length PutObject creates a retrievable empty object

tier-1object-crudsource:msst-s3
object-crud-0155 1.230s pass

Explicit Content-Type on PutObject is preserved and returned by HeadObject

Eight common Content-Type values set explicitly on PutObject must be returned unchanged by HeadObject.

tier-1object-crudsource:msst-s3
object-crud-0156 0.226s pass

PutObject preserves Content-Type together with Content-Encoding

tier-1object-crudsource:msst-s3
object-crud-0157 0.602s pass

Batch DeleteObjects removes a nested prefix completely with no orphans

Recursive delete of a nested prefix via a single DeleteObjects batch. Object count reduced from the source's 1000 to a representative sample.

tier-1object-crudlistingsource:msst-s3
object-crud-0158 0.412s pass

GetObject returns exact bytes for checksum verification; overwrite replaces content

tier-1object-crudchecksumssource:msst-s3
object-crud-0159 0.333s pass

Object ETag reflects content and changes on overwrite

tier-1object-crudsource:msst-s3
object-crud-0160 0.005s pass

GetObject in a non-existent bucket returns 404 NoSuchBucket

tier-1object-cruderrorssource:msst-s3
object-crud-0161 0.058s pass

HeadObject with negative PartNumber returns 400

tier-1object-cruderrorssource:msst-s3
object-crud-0162 0.256s pass

1024-byte object key is accepted; 1025-byte key is rejected

S3 keys are limited to 1024 bytes. The source test accepted KeyTooLongError or InvalidRequest; AWS returns KeyTooLongError.

tier-1errorsobject-crudsource:msst-s3
object-lock 49/68 passed
object-lock-0001 0.253s fail

Multipart object created with object-lock retention resists delete until bypassed

tier-1object-lockmultiparterrorssource:ceph-s3-tests
step 5 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0001-b1-eb3890fd: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: VUTI8XTQXXKLSDSE, HostID: qc5alRpIeg4iop0uKVqpO4Am/5pyKGDdDOUJOJ4ix8vlWjrE2YkM2DFt1nLfhx8HIk6BNeAHWXQ7g9KFsXduzL0=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0001-b1-eb3890fd: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 2WJTB4VQ5TTPD5R6, HostID: VWmSmpQZ/oar8hdmsLpD1COp6vxt13mCV2VAJ4vznKzSfemVqNTUnr03a2mNB/0pNntfZY95Cyheh574jlI0c5Q=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0002 0.240s fail

Deleting a version under GOVERNANCE retention fails without bypass and succeeds with it

tier-3object-lockerrorssource:ceph-s3-tests
step 3 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0002-b1-06183df6: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7FBDC9S73EH49ZHA, HostID: A6ZZ3u6NfNCWLnXJmucnFI5ngWF0OwAUzKuOKPfMd6GHilpV9xUuRiTxUw1yBBVvq+pUFe8+bOzTVA5xHj+JFlU=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0002-b1-06183df6: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 3SSS5OQ3ROXHMS55, HostID: +Fp5Xybd+YbtjNM9BFjfMdx6r9yMv/+yldIcIReYACnZzafn0XSkSFfZZzqjbiUcqiE/VKCgIQwC9jnWwMwocCY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0003 0.250s fail

GOVERNANCE retention still blocks version delete after creating and removing a delete marker

tier-3object-lockversioningerrorssource:ceph-s3-tests
step 6 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0003-b1-1523ae45: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: SRKGTSGLPT3LXWDJ, HostID: 2LduFqZqv8buyYGZ8Z+50IAs8gsZmxLU/HErDQ32BQb/KnJ1p9Bv6y2oY6T/r8jAoHs7Oy6PpgrQYyrdWZ1lZSA=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0003-b1-1523ae45: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 4DJGGD3UOZ0B7HDE, HostID: S+TUT330031KSFeR5kMsU29O4uNT06t04hj9InVw/W2ZPwtCzHAiXJlcVDUv8H7oYFFEscuHl8B93zpJ7rK23oA=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0004 0.199s pass

GetObjectLegalHold reflects legal hold status after setting ON then OFF

tier-3object-locksource:ceph-s3-testssource:msst-s3
object-lock-0005 0.063s pass

GetObjectLockConfiguration returns the stored default retention configuration

tier-3object-locksource:ceph-s3-testssource:msst-s3
object-lock-0006 0.059s pass

GetObjectLockConfiguration on a bucket without object lock returns ObjectLockConfigurationNotFoundError

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0007 0.201s pass

GetObjectRetention on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0008 0.156s fail

HeadObject exposes x-amz-object-lock-retain-until-date as an ISO 8601 timestamp

tier-3object-lockwire-headerssource:ceph-s3-tests
step 3 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0008-b1-fdd60fc7: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: HM9I09KDX6YPUQSH, HostID: 30Mk08JfngLKFo8bvSQiYSrCDBMrpHHTzWNuN2HGMQF3I70z2aiJHNmyDFmAJyhaHW89/CKT+oA5d/mtzVxFoLk=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0008-b1-fdd60fc7: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: QL78UD5S1FPK0IQ4, HostID: 6q7JzB8+C2otey82B+3/OSHQGxRXD/Q8EFYOTjDFi3Kon/ZnnO43Z/Own5RgF4s/jsQImiAgfeTP25kszoxP4KY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0009 0.244s fail

DeleteObjects reports AccessDenied for a retained version and deletes the unretained one

tier-3object-lockerrorssource:ceph-s3-tests
step 2 (DeleteObjects) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0009-b1-2861dda3: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: JJX0MW0ZWDEDCSZN, HostID: aYnBthTtwPcRVmJMXMXeZUhf8GuqacIag0Uxc85MxkITtK2kM14SHZ3GpMh/f0kdSdsE+a7kYewulqqsBXbUHDg=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0009-b1-2861dda3: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: N0M4EBR36U4AYLB3, HostID: k5D4v2TFquaf9pMgHoXXt4iOftjQKGAYeJYnITBIfVw3wPPU4wKqb3gjSWwseJR6x92tnOrD4wljxNcbRau4Xkk=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0010 0.282s pass

PutObjectLegalHold accepts Status ON and OFF

tier-3object-locksource:ceph-s3-tests
object-lock-0011 0.246s pass

PutObjectLegalHold on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0012 0.259s pass

PutObjectLegalHold with an invalid status returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0013 0.074s pass

PutObjectLockConfiguration accepts GOVERNANCE/Days and COMPLIANCE/Years defaults and implies versioning enabled

tier-3object-lockversioningsource:ceph-s3-tests
object-lock-0014 0.091s pass

PutObjectLockConfiguration fails on unversioned or suspended bucket but succeeds once versioning is enabled

tier-3object-lockversioningerrorssource:ceph-s3-tests
object-lock-0015 0.070s pass

PutObjectLockConfiguration on a bucket without object lock returns InvalidBucketState

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0016 0.070s fail

PutObjectLockConfiguration with Days of 0 returns InvalidRetentionPeriod

tier-3object-lockerrorssource:ceph-s3-tests
step 1 (PutObjectLockConfiguration) failed
Expected vs actual
error: expected InvalidRetentionPeriod, got InvalidArgument
object-lock-0017 0.077s pass

PutObjectLockConfiguration with an invalid or lowercase retention mode returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0018 0.080s pass

PutObjectLockConfiguration with ObjectLockEnabled of Disabled returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0019 0.060s fail

PutObjectLockConfiguration with negative Years returns InvalidRetentionPeriod

tier-3object-lockerrorssource:ceph-s3-tests
step 1 (PutObjectLockConfiguration) failed
Expected vs actual
error: expected InvalidRetentionPeriod, got InvalidArgument
object-lock-0020 0.064s pass

PutObjectLockConfiguration with both Days and Years returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0021 0.232s fail

PutObjectRetention stores GOVERNANCE retention readable via GetObjectRetention

tier-3object-locksource:ceph-s3-tests
step 3 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0021-b1-44e6c665: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: LHPTX3NWNZYWVO69, HostID: 8dHDyLVadDpfjxs0xKGi5yvUBz5ngVv583xXOYbzru2I1Yk0n/aZ4SBV86GPnOydDmEho+RyanpX1mLwLl5zV+Y=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0021-b1-44e6c665: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: UCPQMAC83V9PEGZZ, HostID: InTGOyq8C5W6fZnzCSJRIikhZUtmcLWoV42jymil2UysXlqqsEBQGUj2NjoMGxhKz7pqvpSbCLgNRg9hm1DR/VI=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0022 0.242s fail

PutObjectRetention can extend an existing GOVERNANCE retention period

tier-3object-locksource:ceph-s3-tests
step 4 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0022-b1-e8d108d4: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: VWR9JI2R2UXLNKCR, HostID: h6OqHOMrx/9IkauBkj2RHJX9Zev6++uQqqVPZeAXMmuRkPJQ22BsMAKLtgzxbmURrA3QboCZvXwu1kD+OYI1cQ4=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0022-b1-e8d108d4: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: J8RMUCPX4LUH3S6B, HostID: 0VYnMVwWGqXVIiYk46vg+9aTD4OmLWh1WzkvohJioSa/JptW3Z6jQ+mDc6ktjnz5DbnqapsSVh83rBQ1MDLyYFg=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0023 0.298s pass

PutObjectRetention on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0024 0.300s pass

PutObjectRetention with lowercase or invalid mode returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0025 0.265s fail

Explicit PutObjectRetention overrides the bucket default retention

tier-3object-locksource:ceph-s3-tests
step 5 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0025-b1-fc6f86fb: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: L5Q592FD37MKH7FG, HostID: M7wuCzY+ldnbNAmPKgosnQM2Zc2Sf2tHkl6WydLvd9xdAD2VpaQ3O9IZ+IhF39+ocf496q13v3fhEevwxFQ6Oq8=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0025-b1-fc6f86fb: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: KXDBZCX0S1VSI07Z, HostID: NiDJdVmYpfeY1EaNbRKIWpeWWP4OQplDC/XGisksKsVe1Qct3nSn0Gb6lZGgXjuhw93IfHN2KMU1rj8mHuL7FTg=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0026 0.232s fail

Shortening a GOVERNANCE retention period without bypass returns AccessDenied

tier-3object-lockerrorssource:ceph-s3-tests
step 2 (PutObjectRetention) failed
Expected vs actual
error: expected "AccessDenied", got success (status 200)

warning: teardown s3tests-object-lock-0026-b1-cdb22320: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: GDOQ51CFVESZR0IB, HostID: +1UPqaW4dgC33Avo2NbRHK4rynNReWPHzvpclwNDj3+gfM3CUccUg1loRuXG/tQSHuA7Tpu9dxGoVYSh16spPEI=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0026-b1-cdb22320: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: UO51TNADMZT9AF9P, HostID: dwyiMhADfd+RDO8MSQI1+68HpnS1NgkD1mXhHiHFvOKR7MkHJLTVriHOuZmQ9DIFl7vWpfS6G1HCCxvZnaqFWNM=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0027 0.197s fail

Shortening a GOVERNANCE retention period succeeds with BypassGovernanceRetention

tier-3object-locksource:ceph-s3-tests
step 4 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0027-b1-d37a7bcc: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: GDXIOEQ64AJWNDX6, HostID: bylkd/hjoTB+CwXu3AF8JQPt0Y3vyJ99IXLUPZ0RCzi9o8yAh6kLMV3uTiRQfIi7+4v4REKIqcP0KzslQvGGYYg=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0027-b1-d37a7bcc: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: J80J3VCGCUNR4OOW, HostID: 53NDfhrd4JdWLAKlc7EdisSC5grbOlYI41U5ELtpVAcjRcq/9UCTO1ivbpcEyFl95rUfQgidSTSR22ljffUv/a4=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0028 0.256s fail

PutObjectRetention targeting a specific version stores retention readable for that version

tier-3object-lockversioningsource:ceph-s3-tests
step 3 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0028-b1-c7eb6769: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: XJ2B0EZJWM8RK6C2, HostID: /RHqCvf/m5al1CGehREDn10D9pOpqkASQrwO0Eh9kW2clNKLyflDAUkSrTsPuDNV65GWAMAbSXkzbPc/gq9Khn8=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0028-b1-c7eb6769: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 54TS916KVXAWITGA, HostID: qveiC4q/U9bl4eNGMWgqV16pzSjgwXos503eiWrZHXmtQy6rMVJlvnXVM8fOOkTYi02jwxz3SiQH7Gd9TBGvBkE=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0029 0.082s fail

Suspending versioning on an object-lock bucket returns InvalidBucketState

tier-3object-lockversioningerrorssource:ceph-s3-tests
step 1 (PutBucketVersioning) failed
Expected vs actual
status: expected 409, got 400
object-lock-0030 0.160s pass

PutObjectRetention changing GOVERNANCE to COMPLIANCE without bypass returns AccessDenied

The source test uses a retain-until date 10 seconds in the future; a fixed future date is used here since GOVERNANCE retention remains bypassable for cleanup.

tier-3object-lockerrorssource:ceph-s3-tests

warning: teardown s3tests-object-lock-0030-b1-c9efad15: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: SE6JIQFPQNCAG4PV, HostID: IOgWwMTAmLzylYHu8XJYntooevjtPD2zAMWVirhcMd6sln52EWZqcEdygnq9QEdhGwpTH0M1SQrIwCODSyOrgXw=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0030-b1-c9efad15: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: SOX71LV0CCPPNGC4, HostID: 1itDvDhhu7xN+Mdrqpnrf4sJRZcWIYNw866yKAn3m3dopIWuT2TUpMy/XL5A80ZiscjESkkPgeiqnacBjzshyiA=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0031 0.296s pass

DeleteObject on a multipart-uploaded version created with legal hold ON returns AccessDenied

tier-3object-lockmultipartversioningerrorssource:ceph-s3-tests
object-lock-0032 0.334s pass

DeleteObject on a version with legal hold OFF succeeds with 204

tier-3object-lockversioningsource:ceph-s3-tests
object-lock-0033 0.343s pass

DeleteObject on a version with legal hold ON returns AccessDenied

tier-3object-lockversioningerrorssource:ceph-s3-tests
object-lock-0034 0.254s pass

GetObjectLegalHold on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0035 0.175s fail

HeadObject reports object lock mode, retain-until date and legal hold status

tier-3object-locksource:ceph-s3-tests
step 5 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0035-b1-bf64ef3b: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: FCX7Z3GZM1623QJ7, HostID: FL1PEpjpstQyT80orS+E8QCRJO4r0DcKe+ZMpScYaiifqJLvfB81iPbFJEfFtIXlc905h8wbHpxOS0GbhvXMNvo=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0035-b1-bf64ef3b: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: W8DIE5HRB22YQ8LG, HostID: Yn3cfheb+9cKL2FKxWZeOccKTSpRgafv5gsFG8uGxkpBX9+iruuCqTAVK/gqkZt4PPz1hbUyyChIvOBCgCPD/VU=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0036 0.162s fail

PutObject with object lock parameters; HeadObject reports them back

tier-3object-locksource:ceph-s3-tests
step 4 (DeleteObject) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0036-b1-7f7a3965: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7GK13YD6XIZ55Z3J, HostID: aRXETtWcgxF+R0y023mV8SqfU4P9uM1XjDF2tkKdqndRODHqh45ivqe5iUqsjpQs4BqUrwtt6UFWgFrGBbYjf/E=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0036-b1-7f7a3965: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: XSZMUPLXI35KJ74T, HostID: 5Y/ebMpX/9d6a6uuRyHz9PYGAPQGDWGWM1lUUvLA9swAhVbmjN1Sd9V4o63G4ZS80B081zqy3pKx+uY+q8wFtIY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0037 0.005s pass

GetObjectLegalHold on a non-existent bucket returns NoSuchBucket

Source test also tolerated InvalidRequest/NoSuchKey (MinIO); the primary expected AWS code NoSuchBucket is asserted.

tier-3object-lockerrorssource:msst-s3
object-lock-0038 0.071s pass

GetObjectLegalHold on a missing key in a lock-enabled bucket returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0039 0.292s pass

GetObjectLegalHold on an object with no legal hold set returns NoSuchObjectLockConfiguration

Source test also tolerated InvalidRequest; the primary expected AWS code NoSuchObjectLockConfiguration is asserted.

tier-3object-lockerrorssource:msst-s3
object-lock-0040 0.068s pass

PutObjectLegalHold with no legal-hold body returns MalformedXML

Source test also tolerated InvalidArgument/InvalidRequest; the primary expected AWS code MalformedXML is asserted.

tier-3object-lockerrorssource:msst-s3
object-lock-0041 0.005s pass

PutObjectLegalHold on a non-existent bucket returns NoSuchBucket

tier-3object-lockerrorssource:msst-s3
object-lock-0042 0.070s pass

PutObjectLegalHold on a missing key in a lock-enabled bucket returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0043 0.299s pass

Legal hold set to ON is readable via GetObjectLegalHold

tier-3object-locksource:msst-s3
object-lock-0044 0.007s pass

GetObjectLockConfiguration on a non-existent bucket returns NoSuchBucket

Source test also tolerated ObjectLockConfigurationNotFound(Error) (MinIO); the primary expected AWS code NoSuchBucket is asserted.

tier-3object-lockerrorssource:msst-s3
object-lock-0045 0.115s pass

Object lock configuration with COMPLIANCE default retention round-trips

tier-3object-locksource:msst-s3
object-lock-0046 0.117s pass

Default retention specifying both Days and Years returns MalformedXML

Source test also tolerated InvalidArgument/InvalidRequest; the primary expected AWS code MalformedXML is asserted. Bucket is created without object lock, matching the source test.

tier-3object-lockerrorssource:msst-s3
object-lock-0047 0.058s fail

PutObjectLockConfiguration with no configuration body returns MalformedXML

Source test also tolerated InvalidArgument/InvalidRequest; the primary expected AWS code MalformedXML is asserted.

tier-3object-lockerrorssource:msst-s3
step 1 (PutObjectLockConfiguration) failed
Expected vs actual
error: expected MalformedXML, got MissingRequestBodyError
object-lock-0048 0.093s pass

Negative default retention Days or Years returns InvalidArgument

Source test also tolerated InvalidRequest; the primary expected AWS code InvalidArgument is asserted. Bucket is created without object lock, matching the source test.

tier-3object-lockerrorssource:msst-s3
object-lock-0049 0.006s pass

PutObjectLockConfiguration on a non-existent bucket returns NoSuchBucket

Source test also tolerated InvalidBucketState (MinIO); the primary expected AWS code NoSuchBucket is asserted.

tier-3object-lockerrorssource:msst-s3
object-lock-0050 0.081s pass

Minimal object lock configuration round-trips on a lock-enabled bucket

tier-3object-locksource:msst-s3
object-lock-0051 0.007s pass

GetObjectRetention on missing bucket returns NoSuchBucket

Source test also accepted NoSuchKey/InvalidRequest; AWS returns NoSuchBucket.

tier-3object-lockerrorssource:msst-s3
object-lock-0052 0.065s pass

GetObjectRetention on missing key returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0053 0.183s pass

GetObjectRetention returns the mode and retain-until date that were set

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0053-b1-b87b2653: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: ZWCKV6YMINQRO3YW, HostID: MEx0SvsskNymFcnFuB+dGt+pPcJTJHqyBp7ltkno2irW97JvMWeoawA2VWBxXFjOQbibRAi2FEivG1e98dDZD3M=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0053-b1-b87b2653: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: XPV5SPNFZO0KPNAM, HostID: YVUCaVGkOGevsdcy/RsHbFsBs6weJmwNtPmu/40CV2Sj5lKrlfbo5dMH7eRnXH98jD7xEKxSsmB0NAQsg2BgPb4=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0054 0.241s fail

GetObjectRetention with no retention set returns NoSuchObjectLockConfiguration

Source test also accepted InvalidRequest; AWS returns NoSuchObjectLockConfiguration.

tier-3object-lockerrorssource:msst-s3
step 1 (GetObjectRetention) failed
Expected vs actual
status: expected 404, got 400
object-lock-0055 0.066s pass

PutObjectRetention with past RetainUntilDate returns InvalidArgument

The source test never creates the key, matching its request exactly. It also accepted InvalidRequest and MalformedXML; AWS returns InvalidArgument (the retain until date must be in the future).

tier-3object-lockerrorssource:msst-s3
object-lock-0056 0.005s pass

PutObjectRetention on missing bucket returns NoSuchBucket

tier-3object-lockerrorssource:msst-s3
object-lock-0057 0.111s pass

PutObjectRetention on missing key returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0058 0.203s pass

COMPLIANCE retention cannot be overwritten with GOVERNANCE

Source test also accepted vendor codes ObjectLocked/InvalidRequest; AWS returns AccessDenied. Leaves a COMPLIANCE-locked object: runner cleanup is blocked until the retention date passes.

tier-3object-lockerrorssource:msst-s3

warning: teardown s3tests-object-lock-0058-b1-07411a75: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 2QYTJCH1NRJTJOWQ, HostID: 29z2fjkxiayCN+6arpThW0OwSKHA2ZAjyG1U16kU2F0iffG1PS7EBi9eB5A724x/vRjhy5qJaojYiZ6BPcceMHM=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0058-b1-07411a75: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: TT88R86TLW6Y286G, HostID: thogQruM79OZOCo8r8EWl5tsKYIf9Jx3AfY/mp/kMJLGJzKoxOc2K4OO+wnDSIKILlAvjMJwYERr3E1ekvOyx/A=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0059 0.175s pass

COMPLIANCE retention can be extended to a later date

Leaves a COMPLIANCE-locked object: runner cleanup is blocked until the retention date passes.

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0059-b1-16197c9a: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: MJ0PIOEZCNEYI9BL, HostID: q6IysW1PeiXU7Sz2iAnX6BzUVui7ROCNLaqiq27CcSsMr5iI1vOu9h0Xci40zrUDscto9saEtp7Xeb2lFKu1dm4=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0059-b1-16197c9a: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: L2S1RIWKVLCGC0PJ, HostID: mnJHMmInjI4qX2JvjBANzxODBV7uqp+vypZ3QG1Sxet4a7fvIPa+8t5xE0a/7hsX7MMIW3Hpy28VMbCIeldv9lA=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0060 0.172s pass

GOVERNANCE retention can be extended to a later date

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0060-b1-0918ec93: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: DNT8BDG8SMDWFP1O, HostID: cukwupz9groZplLk5mcoXpJHAI/Z0WRSxh9QVu5fB3Abfqkb3GNkJwpaPIJOl+ZliqLV+XPyhR+YGdBfGJexO7w=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0060-b1-0918ec93: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: E7R0X1SWK8DMXEG8, HostID: yokCgx4kLRKFOIneHA02QVSDCz+DQk+40Tj7srLgrY1WKsPc9fRHiKj/MOHYJPXv6bjut4MI1/SAyuzswI2l+Bk=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0061 0.212s fail

GOVERNANCE retention overwritten with BypassGovernanceRetention

Source test skipped when bypass permission was unavailable; the runner's main identity is assumed to hold s3:BypassGovernanceRetention. Leaves a COMPLIANCE-locked object: runner cleanup is blocked until the retention date passes.

tier-3object-locksource:msst-s3
step 2 (PutObjectRetention) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0061-b1-84ddcd54: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: S42GEMT3RTOCSQFP, HostID: KbNiUGHfQBbKvng8y3J/pMJ2DqlDo3zSCeZ87tC4VkNOSFGcPbqam2QMBCUhtPH3leNU8oI0rPuCD4pZVU7lu1U=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0061-b1-84ddcd54: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: X11KJR2G9I7P9I9Y, HostID: stFQONH3D1GNHpdHy152qe8GP9xsHdQ97cLAUYkySNl28xkGvjsXI231uBoFkCXgzb0GOHFnm/JHfgKLB199960=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0062 0.201s pass

GOVERNANCE to COMPLIANCE change without bypass is denied

Source test also accepted vendor codes ObjectLocked/InvalidRequest; AWS returns AccessDenied.

tier-3object-lockerrorssource:msst-s3

warning: teardown s3tests-object-lock-0062-b1-bbf534a7: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: AFS5EEVBG04G54UK, HostID: VF38cw+lIdEAgJwr4jWXKxq/trxBf3mVxIUMxdsmoOYexschAixPht2Sa7pKVH8P4YDz6Ua/Nk9L22/El4nZg6E=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0062-b1-bbf534a7: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: Q9OJBDDA6BM4RQ2F, HostID: pmjyI1RA1oO9neNhIUolRHK8ijp0/oH1fy+7vUTKO9AwjTYsjGtGqBghwgtQYsTyCcv8I1pS1Q9VlZPWZGMDlL4=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0063 0.239s pass

PutObject with ObjectLockLegalHoldStatus ON sets a legal hold, visible via HeadObject

The original test used a plain bucket and skipped when object lock was unavailable; here an object-lock-enabled bucket prerequisite is used so the behavior is actually exercised. Runner cleanup must remove the legal hold before deleting the object.

tier-1object-locksource:msst-s3
object-lock-0064 0.172s pass

PutObject with GOVERNANCE ObjectLockMode and a future RetainUntilDate sets retention, visible via HeadObject

The original test used a plain bucket, a retain-until date of now+30 days, and skipped when object lock was unavailable; here an object-lock-enabled bucket prerequisite and a fixed far-future date are used. Runner cleanup must delete with governance bypass.

tier-1object-locksource:msst-s3

warning: teardown s3tests-object-lock-0064-b1-f7741ed0: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: PNPSRHU91P3SJYQQ, HostID: XFVxgyB0I94oGkXFjszJjqc4PMDcNoHgCV18brXYwwZIU4dEKe1TZEUA98LcXNUrwt354emBVgG2VCJI6mpeP6Y=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0064-b1-f7741ed0: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 5JD1P4SPQS91T2Q2, HostID: WrdCHyKehjyppZRL82BPOdbZuTl/SNKS3leJilzaKa6SbLtjp9/hvMe3p6kFfDsK0qiF+OMSeLOYhB564ghkLik=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0065 0.127s pass

CreateBucket with ObjectLockEnabledForBucket enables object lock

tier-3object-lockbucketsource:msst-s3
object-lock-0066 0.151s pass

PutObject with GOVERNANCE retention, read back via GetObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0066-b1-f05f1018: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: UPPLFSSP71DJAV35, HostID: c14mtGI56yyisvOXoPX1ZAoGw+wIu5llMGXvjQuxBvJZqUGxfr1bIso0NZtCUtLhl2OZUBqoc60AKbDwbgW4mug=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0066-b1-f05f1018: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: M5YU7U5PR0TYFS78, HostID: iiAOr/DZ7LvYUP1LfokXShG85/2zBdAdw9PE3OV98P0ZEtUVZRjH4sjW20znD9GYG6vodJBrEi+PXxaA0MFR3EA=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0067 0.154s pass

PutObject with COMPLIANCE retention, read back via GetObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0067-b1-5e709ef6: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: AMG8SE6S72B6UBIX, HostID: XR//M64bolJCGfhZqBZhKtx2dOi2QGUPu7AHZfiqigLwAzmpr3f7+/8aE+PsP58mzFWBTZbLFpICkfObA1Qfbmk=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0067-b1-5e709ef6: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: HN2PCWBH8P3A7150, HostID: utjeMg94ADBlhjq67nF69lhnnhnKOSnOyPpXW7m/NZ744tnO0+7vI7N3q1nk5qBlw2GzSC6lJ+bgcV3tUwJGZPY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0068 0.164s pass

Extend a GOVERNANCE retention period with PutObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0068-b1-dd1ec65c: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 10BS963PZ3PR6EBL, HostID: P/nIb0rsIaTpszxAS9BsXZIMTe9eg4m+OhcWC6+e0zVQNzOypcIsd0F1aSgDXEui/0nueUcYMQ0FmcWfB/nmV5k=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0068-b1-dd1ec65c: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: E3X8K8D6BIUJ1565, HostID: z+vkkGuuXbpjK3fGhrrVfSQUUdTaFhqUuAwhDkv3rqADvYrhRiNKTp6KpmBBWBSEUOd5tocT5wSLc/6+yDI8qPg=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

policy 4/4 passed
policy-0001 0.000s skipped

GetBucketPolicyStatus reports IsPublic true after an authenticated-read canned ACL

tier-3policyaclsource:ceph-s3-tests

skipped: ACL is not supported

policy-0002 0.000s skipped

GetBucketPolicyStatus on a fresh private bucket reports IsPublic false

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0003 0.000s skipped

GetBucketPolicyStatus stays IsPublic false after attaching a policy restricted by source IP

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0004 0.000s skipped

GetBucketPolicyStatus reports IsPublic true after a public-read canned ACL

tier-3policyaclsource:ceph-s3-tests

skipped: ACL is not supported

policy-0005 0.000s skipped

GetBucketPolicyStatus flips to IsPublic true after attaching a public bucket policy

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0006 0.000s skipped

Put, get and delete a bucket policy; get after delete returns NoSuchBucketPolicy

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0007 0.000s skipped

Allow policy restricted to a specific principal reports non-public policy status

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0008 0.000s skipped

Deny bucket policy blocks GetPublicAccessBlock

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0009 0.000s skipped

HeadObject under a prefix-conditioned ListBucket policy: 404 inside the prefix, 403 outside

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0010 0.000s skipped

IgnorePublicAcls makes public-read ACLs behave as private

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0011 0.000s skipped

Delete public access block, then get returns NoSuchPublicAccessBlockConfiguration

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0012 0.000s skipped

PutPublicAccessBlock round-trips the configuration

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0013 0.000s skipped

GetPublicAccessBlock after deleting the configuration returns NoSuchPublicAccessBlockConfiguration

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0014 0.000s skipped

BlockPublicAcls rejects PutObject with public canned ACLs but allows private

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0015 0.000s skipped

BlockPublicPolicy rejects putting a public bucket policy

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0016 0.000s skipped

BlockPublicAcls rejects PutBucketAcl with public and authenticated-read canned ACLs

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0017 0.000s skipped

Bucket policy allowing s3:ListBucket to everyone grants list access to another account (ListObjects)

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0018 0.000s skipped

Deny s3:ListBucket bucket policy overrides authenticated-read bucket ACL (ListObjects)

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0019 0.000s skipped

Bucket policy combining Allow effect with NotPrincipal is rejected

The source accepts either InvalidArgument or MalformedPolicy as the error code (AWS returns MalformedPolicy); only the 400 status is asserted here.

tier-3policyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0020 0.000s skipped

Wildcard-resource policy fetched via GetBucketPolicy can be applied to another bucket (ListObjects)

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0021 0.000s skipped

GetObjectAcl allowed only when s3:ExistingObjectTag condition matches; other operations stay denied

tier-3policytaggingaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0022 0.000s skipped

GetObject allowed only when s3:ExistingObjectTag condition matches the object's tag

tier-3policytaggingerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0023 0.000s skipped

CreateMultipartUpload requires s3:PutObject on the object ARN, not the bucket ARN

tier-3policymultiparterrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0024 0.000s skipped

Deny statement on s3:x-amz-acl public* blocks PutObject with a public canned ACL but not a plain put

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0025 0.000s skipped

PutObject conditioned on s3:x-amz-copy-source restricts which sources may be copied

tier-3policycopyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0026 0.000s skipped

PutObject conditioned on s3:x-amz-metadata-directive allows COPY and denies copies without it

tier-3policycopyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0027 0.000s skipped

Policy requiring aws:kms denies PutObject requesting AES256 encryption

tier-3policysseerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0028 0.000s skipped

PutObject allowed only when s3:RequestObjectTag condition matches the request tagging

The source test intends the second put to carry the x-amz-tagging header (its event hook is registered on the wrong client); expressed here via the Tagging parameter.

tier-3policytaggingerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0029 0.000s skipped

StringNotEquals deny on s3:x-amz-server-side-encryption rejects wrong SSE algorithm and accepts AES256

tier-3policysseerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0030 0.000s skipped

Policy requiring AES256 denies PutObject requesting aws:kms encryption

The KMS key id does not need to exist: the request is denied by the bucket policy before any KMS use.

tier-3policysseerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0031 0.000s skipped

Deny unencrypted PutObject via Null condition on s3:x-amz-server-side-encryption

tier-3policysseerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0032 0.000s skipped

StringLikeIfExists condition on aws:Referer allows matching referers and denies non-matching ones

tier-3policywire-headerserrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0033 0.000s skipped

Bucket policy allowing s3:ListBucket to everyone grants list access to another account (ListObjectsV2)

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0034 0.000s skipped

Deny s3:ListBucket bucket policy overrides authenticated-read bucket ACL (ListObjectsV2)

tier-3policyaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

policy-0035 0.000s skipped

Wildcard-resource policy fetched via GetBucketPolicy can be applied to another bucket (ListObjectsV2)

tier-3policysource:ceph-s3-tests

skipped: Bucket policies are not supported

policy-0036 0.000s skipped

RestrictPublicBuckets public access block revokes anonymous access granted by a public bucket policy

tier-3policyanon-accesssource:ceph-s3-tests

skipped: Anonymous access is not supported

policy-0037 0.000s skipped

Public access block configuration round-trips full, partial and all-false settings and can be deleted

tier-3policyaclsource:msst-s3

skipped: ACL is not supported

policy-0038 0.000s skipped

PutBucketPolicy accepts Action and Resource as arrays

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0039 0.000s skipped

PutBucketPolicy accepts a policy with multiple Allow and Deny statements

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0040 0.000s skipped

PutBucketPolicy accepts an AWS service Principal

The source test skipped when MinIO rejected the Service principal with MalformedPolicy; AWS accepts service principals such as logging.s3.amazonaws.com.

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0041 0.000s skipped

PutBucketPolicy accepts wildcard Resource patterns including a prefix wildcard

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0042 0.000s skipped

PutBucketPolicy accepts the s3:* wildcard Action

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0043 0.000s skipped

PutBucketPolicy replaces an existing bucket policy

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0044 0.000s skipped

DeleteBucketPolicy removes the policy; subsequent GetBucketPolicy returns NoSuchBucketPolicy

tier-3policyerrorssource:msst-s3

skipped: Bucket policies are not supported

policy-0045 0.068s pass

GetBucketPolicy on a bucket without a policy returns NoSuchBucketPolicy

tier-3policyerrorssource:msst-s3
policy-0046 0.005s pass

GetBucketPolicy on a non-existent bucket returns NoSuchBucket

The source test also tolerated NoSuchBucketPolicy (MinIO); AWS returns NoSuchBucket when the bucket itself does not exist.

tier-3policyerrorssource:msst-s3
policy-0047 0.066s pass

PutBucketPolicy with syntactically invalid JSON returns MalformedPolicy

The source test also tolerated InvalidArgument and InvalidJSON; AWS returns MalformedPolicy for a policy document that is not valid JSON.

tier-3policyerrorssource:msst-s3
policy-0048 0.008s pass

PutBucketPolicy on a non-existent bucket returns NoSuchBucket

tier-3policyerrorssource:msst-s3
policy-0049 0.000s skipped

PutBucketPolicy with a Deny statement succeeds and is retrievable

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0050 0.000s skipped

PutBucketPolicy accepts an IpAddress condition block and GetBucketPolicy returns it

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0051 0.000s skipped

PutBucketPolicy accepts a StringLike condition block and GetBucketPolicy returns it

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0052 0.000s skipped

PutBucketPolicy stores a policy that GetBucketPolicy returns

tier-3policysource:msst-s3

skipped: Bucket policies are not supported

policy-0053 0.000s skipped

DeleteBucketPolicy removes the policy so GetBucketPolicy returns NoSuchBucketPolicy

tier-3policyerrorssource:msst-s3

skipped: Bucket policies are not supported

presigned 5/5 passed
presigned-0001 0.000s skipped

Presigned GetObject URL succeeds before its expiry

The source additionally sends an OPTIONS request to the presigned URL expecting 400; that part is not expressible (the presigned URL is runner-minted per step) and is omitted.

tier-3presignedaclsource:ceph-s3-tests

skipped: ACL is not supported

presigned-0002 0.000s skipped

Presigned PUT with ACL parameter then presigned GET reads the body back

tier-1presignedaclsource:ceph-s3-tests

skipped: ACL is not supported

presigned-0003 0.189s pass

Presigned GET URL returns the object body

tier-1presignedsource:msst-s3
presigned-0004 0.190s pass

Presigned PUT URL uploads the object

tier-1presignedsource:msst-s3
presigned-0005 0.212s pass

Presigned GET URL honors ResponseContentDisposition override

tier-1presignedsource:msst-s3
presigned-0006 0.060s pass

Presigned GET URL for a missing key returns 404

tier-1presignederrorssource:msst-s3
presigned-0007 0.247s pass

Presigned DELETE URL removes the object

tier-1presignedsource:msst-s3
sse 0/0 passed
sse-0001 0.000s skipped

Copy an SSE-S3 encrypted object to an SSE-S3 encrypted destination

Covers the sse-s3 -> sse-s3, STANDARD -> STANDARD, 8 MiB parametrization of test_copy_enc; KMS and non-STANDARD storage-class combinations need server-side provisioning and are not expressible.

tier-1ssecopysource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0002 0.000s skipped

Copy an SSE-C encrypted object to an SSE-C destination with a different key

Covers the sse-c -> sse-c, STANDARD -> STANDARD, 8 MiB parametrization of test_copy_enc; KMS and non-STANDARD storage-class combinations need server-side provisioning and are not expressible.

tier-1ssecopysource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0003 0.000s skipped

UploadPartCopy from an SSE-S3 source into an SSE-S3 multipart upload

Covers the sse-s3 -> sse-s3, STANDARD -> STANDARD, 8 MiB parametrization of test_copy_part_enc; KMS and non-STANDARD storage-class combinations need server-side provisioning and are not expressible.

tier-1ssecopymultipartsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0004 0.000s skipped

UploadPartCopy from an SSE-C source into an SSE-C multipart upload enforces SSE-C headers

Covers the sse-c -> sse-c, STANDARD -> STANDARD, 8 MiB parametrization of test_copy_part_enc; KMS and non-STANDARD storage-class combinations need server-side provisioning and are not expressible.

tier-1ssecopymultiparterrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0005 0.000s skipped

SSE-C write and read-back of a 13-byte object

tier-1ssesource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0006 0.000s skipped

DeleteBucketEncryption is idempotent and removes the SSE-S3 configuration

tier-3sseerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0007 0.000s skipped

GetBucketEncryption before and after configuring SSE-S3 default encryption

tier-3sseerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0008 0.000s skipped

GetObjectAttributes on an SSE-C object requires the customer key headers

The source also asserts the attributes ETag equals the PutObject ETag; that exact equality is not expressible here (the source strips the quotes before comparing and the SSE-C ETag value is not derivable), so the ETag is asserted as present.

tier-3sseerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0009 0.000s skipped

PutBucketEncryption with SSE-S3 default encryption succeeds

tier-3ssesource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0010 0.000s skipped

PutObject with an invalid server-side encryption algorithm returns 400 InvalidArgument

x-amz-server-side-encryption: 'aes:kms' (aes, not aws) is not a valid algorithm. The source injects it as a raw header before signing; expressed as a raw-HTTP PUT so no SDK enum validation intervenes. Empty object body.

tier-1sseerrorswire-headerssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0011 0.000s skipped

PutObject with both SSE-KMS and SSE-C headers returns 400 InvalidArgument

The source test injects the conflicting raw headers before signing, using a dummy KMS key id ('fool-me-once') and the ceph s3-tests public dummy SSE-C fixture. Empty object body.

tier-1sseerrorswire-headerssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0012 0.000s skipped

PutObject with both SSE-S3 and SSE-C headers returns 400 InvalidArgument

The source test injects the conflicting raw headers before signing; the SSE-C key is the ceph s3-tests public dummy fixture. Empty object body.

tier-1sseerrorswire-headerssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0013 0.000s skipped

PutObject with SSE-S3 AES256 plus a KMS key id returns 400 InvalidArgument

x-amz-server-side-encryption: AES256 conflicts with x-amz-server-side-encryption-aws-kms-key-id; the key id is a dummy value ('fool-me-once'). Empty object body.

tier-1sseerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0014 0.000s skipped

PutObject with SSE-C key and key-MD5 but no algorithm header returns 400

Raw-HTTP step: the request deliberately omits the customer-algorithm header.

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0015 0.000s skipped

Bucket policy denying non-AES256 SSE-C algorithms: AES192 PutObject gets 403, AES256 succeeds

tier-3ssesse-cpolicyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

sse-0016 0.000s skipped

Bucket policy denying unencrypted uploads: plain PutObject gets 403, SSE-C PutObject succeeds

tier-3ssesse-cpolicyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

sse-0017 0.000s skipped

PutObject with SSE-C key and a non-matching key MD5 returns 400

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0018 0.000s skipped

SSE-C object: HEAD without the key returns 400, HEAD with the key succeeds

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0019 0.000s skipped

Completed SSE-C multipart object: readable with the upload key, GET with a different key returns 400

tier-1ssesse-cmultiparterrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0020 0.000s skipped

UploadPart with a different SSE-C key than the multipart initiation returns 400

tier-1ssesse-cmultiparterrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0021 0.000s skipped

UploadPart with the multipart SSE-C key but a non-matching key MD5 returns 400

tier-1ssesse-cmultiparterrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0022 0.000s skipped

SSE-C multipart upload (6 aligned 5MiB parts): complete, list size, full read-back and boundary-sampling ranged reads

The source test range-reads the whole object at step sizes 1000000, 10000000 and partlen-1/partlen/partlen+1; this vector samples the boundary-relevant chunks of each pass (first chunk, part-boundary-crossing chunk, tail chunk).

tier-1ssesse-cmultipartsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0023 0.000s skipped

PutObject with SSE-C algorithm header but no key is rejected

Raw-HTTP step: the request deliberately sends only the customer-algorithm header with no key material.

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0024 0.000s skipped

PutObject with SSE-C algorithm and key but no key-MD5 header is rejected

The source test injects the headers at the wire level to bypass the SDK's automatic key-MD5 computation, so this is a raw-HTTP step.

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0025 0.000s skipped

SSE-C object read with a different key returns 400

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0026 0.000s skipped

SSE-C object cannot be read without supplying the key

tier-1ssesse-cerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0027 0.000s skipped

SSE-C multipart upload with parts not aligned to the 4k encryption block size: complete, list size, full and ranged read-back

Parts are 5MiB+1 bytes (not a multiple of the 4k encryption block size). The source test range-reads the whole object at several step sizes; this vector samples the boundary-relevant chunks of each pass.

tier-1ssesse-cmultipartsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0028 0.000s skipped

PutObject with a KMS key id but without declaring aws:kms encryption returns 400

tier-1ssesse-kmserrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0029 0.000s skipped

GetObject with SSE-KMS request headers returns 400

Raw-HTTP step: the GetObject API has no server-side-encryption request members, so the source test injects the x-amz-server-side-encryption headers at the wire level.

tier-1ssesse-kmserrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0030 0.000s skipped

Bucket default SSE-S3 encryption: 1-byte upload and read-back report x-amz-server-side-encryption: AES256

tier-3ssesse-s3bucket-encryptionsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0031 0.000s skipped

Bucket default SSE-S3 encryption: HEAD reports AES256; HEAD carrying an x-amz-server-side-encryption request header returns 400

tier-3ssesse-s3bucket-encryptionerrorssource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0032 0.000s skipped

Bucket default SSE-S3 encryption: multipart upload (6 aligned 5MiB parts) completes, lists at full size, and reads back AES256-encrypted with metadata and ranged reads

The source test range-reads the whole object at step sizes 1000000 and 10000000; this vector samples the boundary-relevant chunks of each pass (first chunk, part-boundary-crossing chunk, tail chunk).

tier-3ssesse-s3bucket-encryptionmultipartsource:ceph-s3-tests

skipped: Server Side Encryption is not supported

sse-0033 0.000s skipped

Explicit SSE-S3 (ServerSideEncryption=AES256): 1-byte upload and read-back report x-amz-server-side-encryption: AES256

tier-1ssesse-s3source:ceph-s3-testssource:msst-s3

skipped: Server Side Encryption is not supported

sse-0034 0.000s skipped

SSE-S3 (AES256) round-trip on PutObject, CopyObject and multipart upload

SSE-C portion of the source test is omitted: its customer key is 34 bytes, which AWS rejects, so the test self-skips that branch.

tier-1ssemultipartsource:msst-s3

skipped: Server Side Encryption is not supported

sse-0035 0.000s skipped

Bucket default encryption (AES256) is applied to objects uploaded without SSE parameters

tier-3ssesource:msst-s3

skipped: Server Side Encryption is not supported

sse-0036 0.000s skipped

GetObject with a mismatched SSE-C key is denied

SSE-C keys are the well-known test bytes '0'*32 (upload) and '1'*32 (mismatched read). The source accepted BadRequest, InvalidRequest or 403; converted to the AWS behavior of 403 AccessDenied.

tier-1sseerrorssource:msst-s3

skipped: Server Side Encryption is not supported

sse-0037 0.000s skipped

PutObject with SSE-S3 (AES256) reports the encryption in PutObject and HeadObject responses

tier-1ssesource:msst-s3

skipped: Server Side Encryption is not supported

sse-0038 0.000s skipped

CreateMultipartUpload with SSE-S3 echoes ServerSideEncryption AES256

tier-1ssemultipartsource:msst-s3

skipped: Server Side Encryption is not supported

sse-0039 0.000s skipped

SSE-C object is readable only with the customer key

tier-1sseerrorssource:msst-s3

skipped: Server Side Encryption is not supported

sse-0040 0.000s skipped

Bucket default encryption applies SSE-S3 to uploads that specify none

tier-3ssesource:msst-s3

skipped: Server Side Encryption is not supported

sse-0041 0.000s skipped

Invalid SSE algorithm and undersized SSE-C key are rejected

tier-1sseerrorssource:msst-s3

skipped: Server Side Encryption is not supported

sse-0042 0.000s skipped

SSE-S3 bucket encryption configuration round-trips

tier-3ssesource:msst-s3

skipped: Server Side Encryption is not supported

sse-0043 0.000s skipped

CopyObject can add SSE-S3 encryption to an unencrypted object

tier-1ssecopysource:msst-s3

skipped: Server Side Encryption is not supported

sse-0044 0.000s skipped

Multipart upload initiated with SSE-S3 produces an encrypted object

tier-1ssemultipartsource:msst-s3

skipped: Server Side Encryption is not supported

tagging 32/39 passed
tagging-0001 0.000s skipped

GetObjectTagging allowed only when s3:ExistingObjectTag condition matches the object's tag

tier-3taggingpolicyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0002 0.000s skipped

PutObjectTagging allowed only while s3:ExistingObjectTag condition matches, and replacing the matching tag revokes access

tier-3taggingpolicyerrorssource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0003 0.000s skipped

Bucket policy allowing s3:DeleteObjectTagging to everyone lets another account delete object tags

tier-3taggingpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0004 0.312s pass

HeadObject reports the number of tags in the x-amz-tagging-count header

tier-3taggingsource:ceph-s3-tests
tagging-0005 0.000s skipped

Bucket policy allowing s3:GetObjectTagging to everyone lets another account read object tags

tier-3taggingpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0006 0.331s pass

DeleteObjectTagging returns 204 and removes all tags

tier-3taggingsource:ceph-s3-tests
tagging-0007 0.296s pass

PutObjectTagging with 129-char tag keys fails with InvalidTag and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0008 0.271s pass

PutObjectTagging with 11 tags fails with BadRequest and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0009 0.195s pass

PutObjectTagging with 257-char tag values fails with InvalidTag and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0010 0.208s pass

PutObjectTagging accepts 10 tags with maximum-size 128-char keys and 256-char values

The original test used random strings and only asserted each returned pair was among the input pairs; this vector uses deterministic strings and asserts one representative pair round-trips and the count is 10.

tier-3taggingsource:ceph-s3-tests
tagging-0011 0.199s fail

PutObjectTagging accepts the maximum of 10 tags and returns them all

tier-3taggingsource:ceph-s3-tests
step 2 (GetObjectTagging) failed
Expected vs actual
response.TagSet[0].Key: expected "0", got "4" response.TagSet[0].Value: expected "0", got "4" response.TagSet[1].Key: expected "1", got "6" response.TagSet[1].Value: expected "1", got "6" response.TagSet[2].Key: expected "2", got "7" response.TagSet[2].Value: expected "2", got "7" response.TagSet[3].Key: expected "3", got "0" response.TagSet[3].Value: expected "3", got "0" response.TagSet[4].Key: expected "4", got "3" response.TagSet[4].Value: expected "4", got "3" response.TagSet[6].Key: expected "6", got "8" response.TagSet[6].Value: expected "6", got "8" response.TagSet[7].Key: expected "7", got "9" response.TagSet[7].Value: expected "7", got "9" response.TagSet[8].Key: expected "8", got "1" response.TagSet[8].Value: expected "8", got "1" response.TagSet[9].Key: expected "9", got "2" response.TagSet[9].Value: expected "9", got "2"
tagging-0012 0.223s pass

A second PutObjectTagging replaces the previous tag set entirely

tier-3taggingsource:ceph-s3-tests
tagging-0013 0.227s pass

PutObject with an x-amz-tagging header (including a valueless tag) stores tags readable via GetObjectTagging

tier-3taggingsource:ceph-s3-tests
tagging-0014 0.000s skipped

Bucket policy allowing s3:PutObjectTagging to everyone lets another account write object tags

tier-3taggingpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0015 0.067s fail

Bucket tagging lifecycle: NoSuchTagSet before set, tag readable after put, NoSuchTagSet again after delete

tier-3taggingbucketerrorssource:ceph-s3-tests
step 1 (GetBucketTagging) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchTagSet, got NotImplemented
tagging-0016 0.250s pass

Tagging supplied on CreateMultipartUpload is readable after complete and removable via DeleteObjectTagging

tier-3taggingmultipartsource:ceph-s3-tests
tagging-0017 0.405s pass

Object tagging: set at upload, update, special characters, 10-tag maximum, and delete

tier-3taggingsource:msst-s3
tagging-0018 0.265s pass

Tags supplied at CreateMultipartUpload are present on the completed object

tier-3taggingmultipartsource:msst-s3
tagging-0019 0.063s pass

DeleteObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0020 0.188s pass

DeleteObjectTagging removes all tags

AWS behavior after deletion: 200 with an empty TagSet. The source test also tolerated a NoSuchTagSet/NoSuchTagSetError error from some implementations; the AWS path is asserted.

tier-3taggingsource:msst-s3
tagging-0021 0.193s pass

DeleteObjectTagging succeeds on a tagged object

The source test accepted HTTP 200 or 204; alternative statuses are not expressible, so generic success (2xx) is asserted (AWS returns 204).

tier-3taggingsource:msst-s3
tagging-0022 0.246s pass

GetObjectTagging for a key nested under an existing file-like key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0023 0.133s pass

GetObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0024 0.275s pass

GetObjectTagging returns exactly the three tags that were set

tier-3taggingsource:msst-s3
tagging-0025 0.261s pass

GetObjectTagging on an untagged object returns an empty TagSet

AWS behavior: 200 with an empty TagSet. The source test also tolerated a NoSuchTagSet/NoSuchTagSetError error from some implementations; that alternative is not expressible and the AWS path is asserted.

tier-3taggingsource:msst-s3
tagging-0026 0.195s pass

Tags can be set, updated and deleted repeatedly on one object

After deletion the source test tolerated NoSuchTagSet/NoSuchTagSetError from some implementations; the AWS behavior (200 with empty TagSet) is asserted.

tier-3taggingsource:msst-s3
tagging-0027 0.196s pass

Tag values may contain slashes, at-signs and spaces

tier-3taggingsource:msst-s3
tagging-0028 0.186s pass

Duplicate tag keys in one TagSet are rejected

The source test accepted any of InvalidTag/DuplicateTagKeys/InvalidArgument; alternative codes are not expressible, so only the 400 status is asserted (AWS returns InvalidTag).

tier-3taggingerrorssource:msst-s3
tagging-0029 0.181s pass

Tag key over 128 chars or tag value over 256 chars is rejected

The source test accepted any of InvalidTagKey/InvalidTag/InvalidArgument (key) and InvalidTagValue/InvalidTag/InvalidArgument (value); alternative codes are not expressible, so only the 400 status is asserted (AWS returns InvalidTag).

tier-3taggingerrorssource:msst-s3
tagging-0030 0.057s pass

PutObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0031 0.216s pass

PutObjectTagging replaces the entire existing tag set

tier-3taggingsource:msst-s3
tagging-0032 0.210s pass

PutObjectTagging sets tags retrievable via GetObjectTagging

tier-3taggingsource:msst-s3
tagging-0033 0.209s pass

More than 10 tags on an object is rejected

The source test accepted any of BadRequest/InvalidTag/InvalidArgument; alternative codes are not expressible, so only the 400 status is asserted (AWS returns BadRequest).

tier-3taggingerrorssource:msst-s3
tagging-0034 0.080s fail

DeleteBucketTagging removes all bucket tags

tier-3taggingsource:msst-s3
step 1 (PutBucketTagging) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
tagging-0035 0.063s fail

GetBucketTagging on a bucket with no tags returns NoSuchTagSet

tier-3taggingerrorssource:msst-s3
step 1 (GetBucketTagging) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchTagSet, got NotImplemented
tagging-0036 0.004s pass

GetBucketTagging on a non-existent bucket returns NoSuchBucket

tier-3taggingerrorssource:msst-s3
tagging-0037 0.084s pass

PutBucketTagging with duplicate tag keys returns InvalidTag

tier-3taggingerrorssource:msst-s3
tagging-0038 0.107s pass

PutBucketTagging rejects a 200-char tag key and a 300-char tag value with InvalidTag

Tag keys are limited to 128 characters and tag values to 256 characters.

tier-3taggingerrorssource:msst-s3
tagging-0039 0.006s pass

PutBucketTagging on a non-existent bucket returns NoSuchBucket

tier-3taggingerrorssource:msst-s3
tagging-0040 0.077s fail

PutBucketTagging with two valid tags succeeds and GetBucketTagging returns exactly those tags

tier-3taggingsource:msst-s3
step 1 (PutBucketTagging) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
tagging-0041 0.077s fail

PutBucketTagging with a valid tag succeeds

The original test accepts HTTP 200 or 204; that disjunction is expressed as the step simply succeeding (2xx).

tier-3taggingsource:msst-s3
step 1 (PutBucketTagging) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
tagging-0042 0.079s pass

PutBucketTagging with 51 tags is rejected with a 400 error

Buckets allow at most 50 tags. The original test accepts several error codes (InvalidTag, BadRequest, InvalidArgument, MalformedXML), so only the 400 status is asserted.

tier-3taggingerrorssource:msst-s3
tagging-0043 0.067s fail

PutBucketTagging replaces the entire existing tag set

tier-3taggingsource:msst-s3
step 1 (PutBucketTagging) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
tagging-0044 0.208s pass

PutObject with Tagging sets tags readable via GetObjectTagging

Two GetObjectTagging steps assert membership of each tag independently, mirroring the original's unordered dict comparison.

tier-3taggingsource:msst-s3
versioning 86/90 passed
versioning-0001 0.200s pass

HEAD after delete in an unversioned bucket returns 404 with no delete-marker header

tier-1versioningerrorssource:ceph-s3-tests
versioning-0002 0.263s pass

Delete under suspended versioning still creates a delete marker

tier-3versioningerrorssource:ceph-s3-tests
versioning-0003 0.253s pass

HEAD after delete in a versioned bucket reports x-amz-delete-marker true

tier-1versioningerrorssource:ceph-s3-tests
versioning-0004 0.000s skipped

Get and put the ACL of a specific object version

The owner's canonical ID and display name are captured from a first ACL read and asserted on later reads, since the runner's primary identity attributes are not directly referenceable.

tier-3versioningaclsource:ceph-s3-tests

skipped: ACL is not supported

versioning-0005 0.000s skipped

PutObjectAcl without VersionId applies to the current object version

The owner's canonical ID and display name are captured from a first ACL read and asserted on later reads, since the runner's primary identity attributes are not directly referenceable.

tier-3versioningaclsource:ceph-s3-tests

skipped: ACL is not supported

versioning-0006 0.411s pass

PutObject returns a VersionId only on a versioning-enabled bucket

tier-3versioningsource:ceph-s3-tests
versioning-0007 0.127s pass

Toggle bucket versioning between Suspended and Enabled and read back the status

tier-3versioningsource:ceph-s3-tests
versioning-0008 7.080s pass

CompleteMultipartUpload returns a VersionId only on a versioning-enabled bucket

The same 30 MiB dataset is uploaded in six 5 MiB parts to an enabled, an unversioned and a suspended bucket; only the enabled bucket must return a VersionId.

tier-3versioningmultipartsource:ceph-s3-tests
versioning-0009 1.093s fail

Copy specific object versions by VersionId within and across buckets

tier-1versioningcopysource:ceph-s3-tests
step 10 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
versioning-0010 0.541s pass

DeleteObjects removes specific versions by VersionId and is idempotent

tier-3versioningsource:ceph-s3-tests
versioning-0011 0.809s pass

DeleteObjects removes versions and a delete marker by VersionId, and is idempotent

tier-3versioningsource:ceph-s3-tests
versioning-0012 0.193s pass

DeleteObjects on a missing key creates a delete marker and reports its version id

tier-3versioningsource:ceph-s3-tests

warning: teardown s3tests-versioning-0012-b1-4b8fd840: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 500, RequestID: 0Q2YC6E50N8QZ5ZV, HostID: RBkECjpQPkbJ3cwmc3dHQHu07Djn5v31Dbov8DWBqfxcn8Rl/VCz8HAdk+d/jCDo/hKAwEqbXgiLq1eytwEhl1s=, api error InternalError: We encountered an internal error, please try again.

versioning-0013 5.073s pass

Three multipart overwrites of one key create distinct versions readable by VersionId, then remove all versions

The source builds each 18 MiB object from a random 5-char string repeated to 5 MiB (uploaded as parts 1-3) plus a 3 MiB "123" pattern last part; fixed 5-char patterns are used here so full-body MD5s are deterministic.

tier-3versioningmultipartsource:ceph-s3-tests
versioning-0014 1.585s pass

Create five object versions and delete them newest-first, verifying remaining versions after each delete

One removal-order round of the source test (removal order: version 5, then version 4, then version 3, then version 2, then version 1). After each delete the remaining versions are listed newest-first and each remaining version body is read back.

tier-3versioningsource:ceph-s3-tests
versioning-0015 1.494s pass

Create five object versions and delete them oldest-first, verifying remaining versions after each delete

One removal-order round of the source test (removal order: version 1, then version 2, then version 3, then version 4, then version 5). After each delete the remaining versions are listed newest-first and each remaining version body is read back.

tier-3versioningsource:ceph-s3-tests
versioning-0016 1.801s pass

Create five object versions and delete the second-oldest remaining version each time, verifying remaining versions

One removal-order round of the source test (removal order: version 2, then version 3, then version 4, then version 5, then version 1). After each delete the remaining versions are listed newest-first and each remaining version body is read back.

tier-3versioningsource:ceph-s3-tests
versioning-0017 1.741s pass

Create five object versions and delete them in mixed order, verifying remaining versions after each delete

One removal-order round of the source test (removal order: version 4, then version 3, then version 1, then version 2, then version 5). After each delete the remaining versions are listed newest-first and each remaining version body is read back.

tier-3versioningsource:ceph-s3-tests
versioning-0018 0.886s pass

Delete the newest version by id, then add a delete marker; listing shows remaining versions and the marker

tier-3versioningsource:ceph-s3-tests
versioning-0019 2.553s pass

Create ten object versions and remove them one by one in mixed order, verifying remaining versions after each delete

Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10.

tier-3versioningsource:ceph-s3-tests
versioning-0020 3.344s pass

Create and remove ten versions of a key with special name ":"

Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10. One key of the source test per vector.

tier-3versioningsource:ceph-s3-tests
versioning-0021 3.359s pass

Create and remove ten versions of a key with special name " "

Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10. One key of the source test per vector.

tier-3versioningsource:ceph-s3-tests
versioning-0022 2.720s pass

ListObjectVersions orders versions by key, newest first within each key

tier-3versioninglistingsource:ceph-s3-tests
versioning-0023 1.097s pass

Overwrite a pre-versioning object after enabling versioning, then delete each version by id

tier-3versioningerrorssource:ceph-s3-tests
versioning-0024 0.957s pass

Overwriting a pre-versioning object under suspended versioning replaces the null version

tier-3versioningerrorssource:ceph-s3-tests
versioning-0025 0.510s pass

Deleting the null version of a pre-versioning object removes it entirely

tier-3versioningerrorssource:ceph-s3-tests
versioning-0026 1.633s pass

Suspend and re-enable versioning with interleaved deletes and overwrites, then remove every version by id

Five versions are created while enabled; under suspension the key is deleted and overwritten repeatedly (null versions replace each other); three more versions are created after re-enabling. All eight surviving real versions are then removed one by one, re-listing and re-reading remaining versions after each delete.

tier-3versioningsource:ceph-s3-tests
versioning-0027 0.533s fail

Copy a null-version object under suspended versioning within and across buckets

tier-3versioningcopysource:ceph-s3-tests
step 6 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
versioning-0028 0.334s pass

Repeated unversioned deletes on a versioned key stack delete markers

tier-3versioningsource:ceph-s3-tests
versioning-0029 0.267s pass

Deleting a specific version of a nested key echoes that VersionId

Original skipped when versioning was unsupported; here the versioned bucket is a prerequisite, so unsupported versioning reports blocked.

tier-1versioningsource:msst-s3
versioning-0030 0.382s pass

Objects uploaded with checksum algorithms appear in the version listing

tier-3versioningchecksumslistingsource:msst-s3
versioning-0031 0.503s pass

Version created while versioning is suspended is listed with VersionId null

tier-3versioninglistingsource:msst-s3
versioning-0032 1.492s pass

ListObjectVersions returns every version of every key, grouped by key

The ordered key expectation encodes the original's per-key version counts (bar=3, baz=5, foo=4) plus AWS key ordering.

tier-3versioninglistingsource:msst-s3
versioning-0033 0.629s pass

All versions of a single key are listed newest-first with IsLatest on the first

tier-3versioninglistingsource:msst-s3
versioning-0034 1.363s pass

MaxKeys truncates the version listing and markers resume it

tier-3versioninglistingsource:msst-s3
versioning-0035 0.062s pass

ListObjectVersions on a missing bucket returns NoSuchBucket

The missing bucket name is derived from a runner-provisioned bucket name to avoid colliding with foreign buckets in a shared namespace.

tier-3versioningerrorssource:msst-s3
versioning-0036 0.249s pass

Pre-versioning object is listed as the null version beneath its delete marker

tier-3versioninglistingsource:msst-s3
versioning-0037 0.383s pass

Delete marker appears in DeleteMarkers with IsLatest alongside older versions

tier-3versioninglistingsource:msst-s3
versioning-0038 0.703s pass

ListObjectVersions on an unversioned bucket returns null version IDs

Objects created with versioning never enabled appear as versions with a null VersionId ('null' or empty per the original test), IsLatest true, and correct Key/Size. ETag and StorageClass must be present.

tier-3versioninglistingsource:msst-s3
versioning-0039 0.100s pass

Versioning toggles through unset, Enabled, Suspended and back to Enabled

For the initial unconfigured read the original test also tolerates an empty-string Status; in the parsed API model an unconfigured bucket has no Status member.

tier-3versioningsource:msst-s3
versioning-0040 0.005s pass

GetBucketVersioning on a non-existing bucket returns NoSuchBucket

tier-3versioningerrorssource:msst-s3
versioning-0041 0.063s pass

GetBucketVersioning on a versioning-enabled bucket returns Status Enabled

tier-3versioningsource:msst-s3
versioning-0042 0.057s pass

PutBucketVersioning with an invalid Status value is rejected

Original test accepts MalformedXML, InvalidArgument or IllegalVersioningConfigurationException; all are HTTP 400, so only the status is asserted.

tier-3versioningerrorssource:msst-s3
versioning-0043 0.074s pass

Enabling bucket versioning succeeds and is reflected by GetBucketVersioning

tier-3versioningsource:msst-s3
versioning-0044 0.095s pass

Suspending versioning after enabling it succeeds and is reflected by GetBucketVersioning

tier-3versioningsource:msst-s3
versioning-0045 0.532s pass

DeleteBucket on a versioned bucket holding object versions fails

Original test accepts BucketNotEmpty or VersionedBucketNotEmpty; both are HTTP 409, so only the status is asserted.

tier-2versioningerrorssource:msst-s3
versioning-0046 0.905s pass

Five rapid overwrites of one key create five distinct, individually retrievable versions

The original asserted five unique version ids appear in ListObjectVersions in any order; AWS lists versions newest-first, so the listing asserts the exact order v4..v0. Each version body is read back by version id.

tier-3versioningsource:msst-s3
versioning-0047 0.330s pass

CopyObject from a versioned source key containing '?' and '&' echoes CopySourceVersionId

The source key 'my-obj?test&data' must be URL-encoded in the x-amz-copy-source header (?->%3F, &->%26) while the trailing ?versionId= suffix stays literal (the original relied on boto3 to do this). Original tolerated a missing CopySourceVersionId (MinIO); AWS returns it.

tier-1versioningcopyencodingsource:msst-s3
versioning-0048 0.267s pass

GetObjectAttributes on a delete marker fails

Original accepted NoSuchKey/MethodNotAllowed/404/405 for the delete-marker version and NoSuchKey/404 without a version id; AWS S3 returns 405 MethodNotAllowed for the delete-marker version and 404 NoSuchKey when the latest version is a delete marker.

tier-3versioningerrorssource:msst-s3
versioning-0049 0.396s pass

GetObjectAttributes returns per-version attributes and defaults to the latest version

tier-3versioningsource:msst-s3
versioning-0050 0.437s pass

DeleteObject with VersionId permanently removes that version only

Deleting a specific version echoes its VersionId without a DeleteMarker flag (original also accepted an explicit false); that version is then gone while the other version remains latest. Original accepted NoSuchVersion/NoSuchKey/404 for the deleted version; AWS returns 404 NoSuchVersion.

tier-1versioningsource:msst-s3
versioning-0051 0.182s pass

DeleteObject on a non-existing key in a versioned bucket returns 204

AWS S3 creates a delete marker, but the original only asserted the 204 status (MinIO returns no VersionId/DeleteMarker for this case).

tier-1versioningsource:msst-s3
versioning-0052 0.269s pass

GetObject with a malformed VersionId returns InvalidArgument

Original accepted NoSuchVersion or InvalidArgument; AWS S3 returns 400 InvalidArgument for a version id that is not a valid version id format.

tier-1versioningerrorssource:msst-s3
versioning-0053 0.340s pass

GetObject with VersionId=null retrieves the pre-versioning object

An object stored before versioning was enabled is retrievable as VersionId=null while a plain GET returns the newer version. Original tolerated a missing VersionId on the null-version GET (MinIO); AWS returns 'null'.

tier-3versioningsource:msst-s3
versioning-0054 0.217s pass

GetObject by VersionId and without it both return the stored version

tier-1versioningsource:msst-s3
versioning-0055 0.209s pass

HeadObject with a malformed VersionId returns 400

HEAD responses carry no error body, so only the status is asserted. Original accepted NoSuchVersion/404/400/NoSuchKey/InvalidArgument; AWS S3 returns 400 (InvalidArgument) for a malformed version id.

tier-1versioningerrorssource:msst-s3
versioning-0056 0.200s pass

HeadObject with and without VersionId returns the version's metadata

tier-1versioningsource:msst-s3
versioning-0057 0.537s pass

HeadObject without VersionId returns the latest version

tier-1versioningsource:msst-s3
versioning-0058 0.532s pass

Object created before versioning is enabled remains readable as versionId=null

PutObject before versioning returns no VersionId; after enabling versioning a new PUT gets a real VersionId, GetObject with VersionId=null returns the original bytes, and a plain GetObject returns the new version. Original tolerated a missing VersionId on the null-version GET (MinIO); AWS returns 'null'.

tier-3versioningsource:msst-s3
versioning-0059 0.616s pass

Overwrites after enabling versioning create new versions above the null version

A null-version object exists, versioning is enabled, then two more PUTs. The latest GET returns the newest body and VersionId, and the intermediate version stays retrievable by its id (which also proves the two new version ids differ, as the original asserted).

tier-3versioningsource:msst-s3
versioning-0060 0.397s pass

PutObject to a versioning-enabled bucket returns a non-empty VersionId

tier-1versioningsource:msst-s3
versioning-0061 0.836s pass

CopyObject with a versionId CopySource copies the specified (older) version

tier-1versioningcopysource:msst-s3
versioning-0062 1.050s fail

CopyObject onto an existing key in a versioned bucket creates a new version

tier-1versioningcopysource:msst-s3
step 1 (CopyObject) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
versioning-0063 0.873s pass

DeleteObject with VersionId=null permanently removes the pre-versioning null version

An object written before versioning is enabled has version id "null". Deleting that null version specifically removes it; a versioned GET of the null version then fails. The source test accepted NoSuchVersion/NoSuchKey/404; AWS returns NoSuchVersion.

tier-3versioningerrorssource:msst-s3
versioning-0064 0.838s pass

Deleting a delete marker restores visibility of the previous version

tier-1versioningsource:msst-s3
versioning-0065 0.364s pass

DeleteObject with versioning suspended returns 204 and existing versions remain readable

tier-3versioningsource:msst-s3
versioning-0066 0.347s pass

DeleteObjects with explicit version IDs permanently removes the delete marker and the object version

tier-1versioningerrorssource:msst-s3
versioning-0067 0.617s pass

DeleteObjects on a versioned bucket creates delete markers hiding all keys

tier-1versioningerrorssource:msst-s3
versioning-0068 0.341s pass

GetObject addressing a delete-marker version returns MethodNotAllowed

tier-1versioningerrorssource:msst-s3
versioning-0069 0.307s pass

GetObject without version ID on a key whose latest version is a delete marker returns NoSuchKey

tier-1versioningerrorssource:msst-s3
versioning-0070 0.309s pass

HeadObject on a delete-marker version returns 405; HeadObject without version returns 404

tier-1versioningerrorssource:msst-s3
versioning-0071 0.236s pass

Aborted multipart upload on a versioned bucket creates no version

tier-3versioningmultiparterrorssource:msst-s3
versioning-0072 1.111s pass

Multipart upload over existing versions creates a distinct third, latest version

tier-3versioningmultipartsource:msst-s3
versioning-0073 2.033s pass

CompleteMultipartUpload on a versioned bucket returns a VersionId

tier-1versioningmultipartsource:msst-s3
versioning-0074 0.923s pass

Multipart upload metadata and content type are preserved on the created version

tier-1versioningmultipartsource:msst-s3
versioning-0075 0.698s fail

UploadPartCopy from a specific source version copies that version's bytes

tier-1versioningmultipartcopysource:msst-s3
step 2 (UploadPartCopy) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
versioning-0076 0.691s pass

Copy-to-self with REPLACE metadata creates a new version each time

On a versioned bucket, each CopyObject onto the same key with MetadataDirective REPLACE creates a distinct version that retains its own metadata.

tier-3versioningcopysource:msst-s3
versioning-0077 1.988s pass

A captured version is immutable under subsequent overwrites

After capturing version IDs, overwriting the keys with new versions does not change the bytes returned when reading the captured versions by VersionId.

tier-1versioningsource:msst-s3
versioning-0078 1.715s pass

Historical versions are retrievable by VersionId

On a versioned bucket, each PutObject creates a distinct version; GetObject with a VersionId returns that version's bytes, and GetObject without one returns the latest.

tier-3versioningsource:msst-s3
versioning-0079 1.591s pass

Enable then suspend bucket versioning across the object version lifecycle

New bucket reports no versioning; enabling produces distinct versions retrievable by VersionId; suspending stops new-version creation and GetObject returns the latest write.

tier-3versioningsource:msst-s3
versioning-0080 1.115s pass

Three PUTs of one key on a versioned bucket yield three versions

tier-3versioningsource:msst-s3
versioning-0081 0.130s pass

New bucket reports no versioning status

tier-3versioningsource:msst-s3
versioning-0082 1.419s pass

Repeated puts create distinct retrievable versions, listed newest-first

tier-3versioningsource:msst-s3
versioning-0083 1.833s pass

Deleting a specific version leaves the other versions intact

tier-3versioningsource:msst-s3
versioning-0084 1.729s pass

Deleting current version creates a delete marker; removing it restores the object

tier-3versioningerrorssource:msst-s3
versioning-0085 0.704s pass

Suspending versioning makes a new put get the null version id

tier-3versioningsource:msst-s3
versioning-0086 1.935s pass

Each version retains its own user metadata

tier-1versioningsource:msst-s3
versioning-0087 1.432s pass

Copy the current object and copy a specific version by id

tier-1versioningcopysource:msst-s3
versioning-0088 2.024s pass

Two multipart uploads to one key create two independent versions

tier-1versioningmultipartsource:msst-s3
versioning-0089 1.458s pass

Delete marker hides object, version-id read bypasses it, removing the marker restores it

tier-1versioningerrorssource:msst-s3
versioning-0090 1.641s pass

Three put/delete cycles yield three versions and three delete markers

tier-3versioningsource:msst-s3
versioning-0091 1.556s pass

Deleting a non-current version preserves the remaining versions

tier-1versioningerrorssource:msst-s3
versioning-0092 0.605s pass

Deleting an already-deleted object creates a second, distinct delete marker

tier-3versioningsource:msst-s3
wire-headers 18/18 passed
wire-headers-0001 0.057s pass

CreateBucket with an empty Authorization header returns AccessDenied

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0002 0.091s pass

CreateBucket without an Authorization header returns AccessDenied

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0003 0.084s pass

CreateBucket with an empty Content-Length header returns 400

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0004 0.445s pass

CreateBucket with a negative Content-Length header returns 400

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0005 0.000s skipped

CreateBucket with an empty Expect header succeeds

tier-2wire-headersquirk:us-east-1-legacysource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

wire-headers-0006 0.000s skipped

PutBucketAcl with an invalid canned ACL value in x-amz-acl returns 400

tier-3wire-headersaclerrorssource:ceph-s3-tests

skipped: ACL is not supported

wire-headers-0007 0.446s pass

PutObject with an empty Authorization header returns 403

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0008 0.080s pass

PutObject without an Authorization header returns 403

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0009 0.066s pass

PutObject with an empty Content-Length header returns 400

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0010 0.225s pass

PutObject with a negative Content-Length header returns 400

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0011 0.793s pass

PutObject with an empty Content-Type succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0012 0.798s pass

PutObject with an ordinary Content-Type header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0013 0.795s pass

PutObject with an empty Expect header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0014 0.664s pass

PutObject without an Expect header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0015 0.062s pass

PutObject with a well-formed but non-matching Content-MD5 returns BadDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0016 0.082s pass

PutObject with an empty Content-MD5 header returns InvalidDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0017 0.080s pass

PutObject with a Content-MD5 that decodes to the wrong length returns InvalidDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0018 0.001s pass

CreateBucket with malformed SigV2-style Authorization header 'AWS HAHAHA' returns InvalidArgument

The request is sent byte-literal (unsigned) with a two-token 'AWS HAHAHA' Authorization header; the server must reject the malformed header with 400 InvalidArgument before evaluating anything else, so the target bucket is never created.

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0019 0.000s skipped

CreateBucket with an empty User-Agent header succeeds

Source test used a SigV2 client, but User-Agent is not part of either signature scheme, so the behavior under test (server accepts an empty User-Agent) is signing-independent; the runner signs SigV4.

tier-2wire-headersquirk:us-east-1-legacysource:ceph-s3-tests

skipped: quirk vector skipped by default (run it with NoSkip)

wire-headers-0020 0.054s pass

PutObject with malformed SigV2-style Authorization header 'AWS HAHAHA' returns InvalidArgument

The request is sent byte-literal (unsigned) with a two-token 'AWS HAHAHA' Authorization header; the server must reject the malformed header with 400 InvalidArgument.

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0021 0.167s pass

PutObject with an empty User-Agent header succeeds

Source test used a SigV2 client, but User-Agent is not part of either signature scheme, so the behavior under test (server accepts an empty User-Agent) is signing-independent; the runner signs SigV4. The source performs two puts to the same key with the empty User-Agent, first with an empty body, then with body 'bar'.

tier-1wire-headerssource:ceph-s3-tests
Provenance
TargetIngot (smelt forge stack)
Corpus version1.0.0
Generated2026-09-10 19:10:44 UTC
Total test time11m17s