S3 compatibility report

Ingot (smelt forge stack)

corpus 1.0.0 95.0% pass (824/867) test time 13m18s

GroupPass %Pass FailBlockedErrors SkippedTotal
acl 12.5% 1 7 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 100.0% 44 0 0 0 0 44
conditional 100.0% 29 0 0 0 29 58
copy 100.0% 47 0 0 0 2 49
cors 20.0% 2 8 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 97.5% 157 4 0 0 5 166
object-crud 99.4% 160 1 0 0 1 162
object-lock 72.1% 49 19 0 0 0 68
policy 0.0% 0 4 0 0 49 53
presigned 100.0% 5 0 0 0 2 7
sse 100.0% 22 0 0 0 22 44
tagging 100.0% 39 0 0 0 5 44
versioning 100.0% 90 0 0 0 2 92
wire-headers 100.0% 18 0 0 0 3 21
acl 1/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.037s fail

DeleteBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
step 1 (DeleteBucketOwnershipControls) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchBucket, got NotImplemented
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.044s fail

GetBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
step 1 (GetBucketOwnershipControls) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchBucket, got NotImplemented
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.252s fail

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
step 1 (PutBucketOwnershipControls) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
acl-0062 0.245s fail

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
step 1 (PutBucketOwnershipControls) failed
Expected vs actual
error: expected success, got status 501, error NotImplemented: A header you provided implies functionality that is not implemented.
acl-0063 0.019s fail

PutBucketOwnershipControls on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
step 1 (PutBucketOwnershipControls) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchBucket, got NotImplemented
acl-0064 0.000s skipped

PutBucketOwnershipControls with ObjectWriter succeeds

tier-3aclsource:msst-s3

skipped: ACL is not supported

acl-0065 0.024s 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.183s fail

PutBucketAcl with an invalid canned ACL value returns InvalidArgument

tier-3aclerrorssource:msst-s3
step 1 (PutBucketAcl) failed
Expected vs actual
status: expected 400, got 501 error: expected InvalidArgument, got NotImplemented
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.009s fail

PutBucketAcl on a non-existing bucket returns NoSuchBucket

tier-3aclerrorssource:msst-s3
step 1 (PutBucketAcl) failed
Expected vs actual
status: expected 404, got 501 error: expected NoSuchBucket, got NotImplemented
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.312s 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.185s pass

DeleteBucket succeeds once, then repeating it returns NoSuchBucket

tier-2bucketerrorssource:ceph-s3-tests
bucket-0002 0.495s 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.002s pass

CreateBucket with a one-character name returns InvalidBucketName

tier-2bucketerrorssource:ceph-s3-tests
bucket-0005 0.002s 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.546s pass

DeleteBucket on a non-empty bucket returns BucketNotEmpty

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

DeleteBucket on a nonexistent bucket returns NoSuchBucket

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

HeadBucket on an existing bucket returns 200

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

HeadBucket on a nonexistent bucket returns 404

tier-1bucketerrorssource:ceph-s3-testssource:msst-s3
bucket-0020 0.011s 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.827s pass

ListBuckets includes every created bucket

tier-2bucketsource:ceph-s3-tests
bucket-0024 0.014s 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.113s pass

CreateBucket succeeds for a name containing a hyphen

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

CreateBucket succeeds for a name containing a period

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

CreateBucket succeeds for a name starting with a lowercase letter

tier-2bucketsource:ceph-s3-tests
bucket-0029 0.142s 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.002s 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.141s 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.042s 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.153s 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.150s pass

CreateBucket succeeds and the bucket is accessible via HeadBucket

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

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

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

DeleteBucket removes the bucket

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

GetBucketLocation on a non-existent bucket returns NoSuchBucket

tier-3bucketerrorssource:msst-s3
bucket-0043 0.122s 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.012s pass

ListBuckets returns a Buckets list

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

ListBuckets includes created buckets

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

Empty bucket lists zero keys and can be deleted

tier-2bucketsource:msst-s3
bucket-0047 0.132s 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.790s 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.657s 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 44/44 passed ▸
checksums-0001 0.316s 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 3.261s 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.435s 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.361s 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.437s pass

Object uploaded with ChecksumAlgorithm SHA256 is retrievable with intact body

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

HeadObject with ChecksumMode=ENABLED returns the CRC32 checksum from PutObject

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

HeadObject with ChecksumMode=ENABLED returns the SHA1 checksum from PutObject

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

HeadObject with ChecksumMode=ENABLED returns the SHA256 checksum from PutObject

tier-1checksumssource:msst-s3
checksums-0009 0.170s 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.310s pass

PutObject with a correct ChecksumCRC32 succeeds and echoes the checksum

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

PutObject with a correct ChecksumSHA256 succeeds and echoes the checksum

tier-1checksumssource:msst-s3
checksums-0012 0.126s 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.124s 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.149s 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.577s pass

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
checksums-0016 0.632s pass

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
checksums-0017 0.648s pass

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
checksums-0018 0.127s 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.335s pass

UploadPart with ChecksumAlgorithm CRC32 succeeds and returns an ETag

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

UploadPart with ChecksumAlgorithm SHA1 succeeds and returns an ETag

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

UploadPart with ChecksumAlgorithm SHA256 succeeds and returns an ETag

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

GetObjectAttributes checksum matches PutObject checksum (CRC32)

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

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

GetObjectAttributes checksum matches PutObject checksum (CRC32C)

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

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

GetObjectAttributes checksum matches PutObject checksum (SHA1)

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

tier-3checksumssource:msst-s3
checksums-0025 0.588s 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.180s 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.301s 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.272s 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.332s 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.332s 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.147s 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.316s pass

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

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

Multipart upload with CRC32 part checksums completes successfully

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

Multipart upload with SHA256 part checksums completes successfully

tier-1multipartchecksumssource:msst-s3
checksums-0035 0.640s pass

CopyObject across buckets preserves the source SHA256 checksum

tier-1checksumscopysource:msst-s3
checksums-0036 0.367s pass

CopyObject with MetadataDirective=COPY preserves the source checksum

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

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

tier-1checksumscopysource:msst-s3
checksums-0038 0.343s 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.313s pass

CopyObject with ChecksumAlgorithm=SHA1 computes a SHA1 checksum

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

CopyObject with ChecksumAlgorithm=SHA256 computes a SHA256 checksum

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

CopyObject preserves the source object's existing SHA256 checksum

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

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

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

CopyObject onto itself with MetadataDirective=REPLACE adds a SHA256 checksum

tier-1checksumscopysource:msst-s3
checksums-0044 0.123s 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.452s 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.297s 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.304s pass

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

tier-1conditionalsource:ceph-s3-tests
conditional-0027 0.303s 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.272s pass

Conditional DeleteObject with matching IfMatch ETag succeeds with 204

tier-1conditionalsource:msst-s3
conditional-0031 0.282s 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.274s pass

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

tier-1conditionalsource:msst-s3
conditional-0033 0.274s 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.275s pass

GetObject with non-matching If-Match ETag returns PreconditionFailed

tier-1conditionalerrorssource:msst-s3
conditional-0035 0.277s 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.298s pass

PutObject with non-matching If-Match returns PreconditionFailed

tier-1conditionalerrorssource:msst-s3
conditional-0039 0.425s 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.468s pass

CompleteMultipartUpload with non-matching If-Match returns PreconditionFailed

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

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

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

CopyObject with a non-matching CopySourceIfMatch returns 412 PreconditionFailed

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

CopyObject with a matching CopySourceIfMatch copies the object

tier-1conditionalcopysource:msst-s3
conditional-0046 0.313s 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.302s pass

CopyObject with a matching CopySourceIfNoneMatch returns 412 PreconditionFailed

tier-1conditionalcopyerrorssource:msst-s3
conditional-0048 0.285s 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.277s 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.299s 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.286s pass

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

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

HeadObject with a matching If-Match returns the object metadata

tier-1conditionalsource:msst-s3
conditional-0053 0.272s 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.256s 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.250s 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.348s pass

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

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

DeleteObject with If-Match: * deletes an existing object

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

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

tier-1conditionalerrorssource:ceph-s3-tests
copy 47/47 passed ▸
copy-0001 0.365s pass

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

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

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

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

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

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

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

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

Copy a 16 MiB object within a bucket

tier-1copysource:ceph-s3-tests
copy-0006 0.162s 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.599s pass

Copy an object to a different bucket

tier-1copysource:ceph-s3-testssource:msst-s3
copy-0009 0.384s pass

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

tier-2copyerrorssource:ceph-s3-tests

warning: teardown s3tests-copy-0009-b1-4f57327d-alt: ListMultipartUploads: operation error S3: ListMultipartUploads, https response error StatusCode: 403, RequestID: YXW0WMSPOX32X2RT, HostID: liTirZlBI8Le9vN6iHLBHhqbRDgdekfWG8pBuUEOyX3KnfCmU8rB2HcXGiDWUp4PIgGWpzlrSfippBnFgzNKeO4=, api error AccessDenied: Access Denied.

warning: teardown s3tests-copy-0009-b1-4f57327d-alt: ListObjectVersions: operation error S3: ListObjectVersions, https response error StatusCode: 403, RequestID: RAAVZ0JUSB9ZW6OG, HostID: zwb4j1Z/LFvjrlH+om2MO83IFcpWZB59n3Mo0nkimxZt9kyF6gnYGezECfcrBVtiwWS6suoC5H6Z+bc/YolpH8c=, api error AccessDenied: Access Denied.

warning: teardown s3tests-copy-0009-b1-4f57327d-alt: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 403, RequestID: BIV3W43UV72KNNTH, HostID: m8lGFmiWOy5m8RBD1CDZjupy6CBGzof+b0Vb40mxjgXfdmhdLaNI021Mcf1LuQogKK368DV5TP+smBmafICHZFs=, api error AccessDenied: Access Denied.

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.335s pass

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

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

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

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

Copy an object onto itself without changes returns InvalidRequest

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

Copy an object onto itself with the REPLACE metadata directive

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

Copy preserves the source object's Content-Type

tier-1copysource:ceph-s3-testssource:msst-s3
copy-0016 1.358s pass

Copy specific versions across versioned and non-versioned buckets

tier-1copyversioningsource:ceph-s3-tests
copy-0017 0.235s pass

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

tier-1copyversioningencodingsource:ceph-s3-tests
copy-0018 5.345s pass

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

tier-1copyversioningmultipartsource:ceph-s3-tests
copy-0019 0.357s pass

Copy a zero-length object

tier-1copysource:ceph-s3-tests
copy-0020 0.526s 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.340s pass

CopyObject to a new key within the same bucket succeeds

tier-1copysource:msst-s3
copy-0022 0.769s pass

CopySource with a leading slash is accepted

tier-1copysource:msst-s3
copy-0023 0.359s 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.338s 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.336s 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.325s pass

CopyObject with MetadataDirective=COPY preserves metadata and Content-Type

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

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

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

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

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

CopyObject with MetadataDirective=REPLACE updates content headers

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

CopyObject with spaces in the source key

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

CopyObject with TaggingDirective=COPY preserves source tags

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

CopyObject with TaggingDirective=REPLACE applies new tags

tier-3copytaggingsource:msst-s3
copy-0033 0.111s 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.359s pass

CopyObject to a non-existing destination bucket returns NoSuchBucket

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

CopyObject with a non-existing source key returns NoSuchKey

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

CopyObject preserves the source ContentType by default

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

CopyObject response includes a CopyObjectResult and the copy has an ETag

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

CopyObject with default tagging directive copies the source tags

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

CopyObject with TaggingDirective REPLACE replaces the source tags

tier-3copytaggingsource:msst-s3
copy-0040 0.547s pass

CopyObject between buckets preserves ContentType and custom metadata

tier-1copysource:msst-s3
copy-0041 0.328s 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.358s pass

CopyObject onto itself with REPLACE sets the new metadata map

tier-1copysource:msst-s3
copy-0043 0.403s 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.342s pass

CopyObject preserves the CRC32 checksum of the source object

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

CopyObject tagging directives: default copies tags, REPLACE substitutes them

tier-3copytaggingsource:msst-s3
copy-0046 0.503s 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.898s pass

CopyObject of a 6 MiB object preserves its size

tier-1copysource:msst-s3
copy-0048 0.956s 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
copy-0049 197.892s pass

CopyObject of an object over 5 GiB is rejected; UploadPartCopy in parts copies it

S3 copies at most 5 GiB in one CopyObject and directs larger objects to multipart copy. The source is one byte over the limit, so it is itself built as two parts (a single PUT is capped at 5 GiB). The single-request copy fails with InvalidRequest; the same object copies as two UploadPartCopy ranges. Tagged large: the run generates and uploads 5 GiB.

tier-1copymultiparterrorslargesource:aws-docs
cors 2/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.104s fail

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
step 1 (PutBucketCors) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied.
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.007s fail

DeleteBucketCors on a non-existent bucket returns NoSuchBucket

tier-3corserrorssource:msst-s3
step 1 (DeleteBucketCors) failed
Expected vs actual
error: expected NoSuchBucket, got AccessDenied
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.117s pass

GetBucketCors on a bucket without CORS configuration returns NoSuchCORSConfiguration

tier-3corserrorssource:msst-s3
cors-0013 0.007s 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.112s fail

PutBucketCors with an empty CORSRules array returns MalformedXML

Original test also accepted InvalidRequest as the error code.

tier-3corserrorssource:msst-s3
step 1 (PutBucketCors) failed
Expected vs actual
error: expected MalformedXML, got AccessDenied
cors-0016 0.125s fail

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
step 1 (PutBucketCors) failed
Expected vs actual
error: expected InvalidRequest, got AccessDenied
cors-0017 0.119s fail

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
step 1 (PutBucketCors) failed
Expected vs actual
error: expected InvalidRequest, got AccessDenied
cors-0018 0.107s fail

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
step 1 (PutBucketCors) failed
Expected vs actual
error: expected InvalidRequest, got AccessDenied
cors-0019 0.122s fail

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
step 1 (PutBucketCors) failed
Expected vs actual
error: expected InvalidDigest, got AccessDenied
cors-0020 0.006s fail

PutBucketCors on a non-existent bucket returns NoSuchBucket

tier-3corserrorssource:msst-s3
step 1 (PutBucketCors) failed
Expected vs actual
error: expected NoSuchBucket, got AccessDenied
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 1.216s 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 1.352s 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.366s 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.132s pass

Key longer than 1024 bytes is rejected

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

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

Unicode object key round-trip

tier-1encodingunicodesource:msst-s3
encoding-0008 0.272s 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.950s 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.893s 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 3.707s 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 1.095s 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 1.195s pass

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

tier-1encodinglistingsource:msst-s3
encoding-0014 1.393s 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.383s 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.419s 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.235s 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 0.936s 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.753s 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 0.835s 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.392s 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.135s 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.317s pass

ListObjectsV2 KeyCount matches the number of keys in the bucket

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

ListObjects with letter delimiter groups keys into common prefixes

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

ListObjects with slash delimiter rolls keys up into common prefixes

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

ListObjects with dot delimiter groups keys into common prefixes

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

ListObjects with empty delimiter behaves as no delimiter and echoes none

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

ListObjects without a delimiter returns all keys and echoes no delimiter

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

ListObjects with percent delimiter groups keys into common prefixes

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

ListObjects delimiter and prefix pagination with Marker and NextMarker

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

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

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

ListObjects with newline delimiter matches no keys and returns all objects

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

ListObjects with whitespace delimiter groups keys into common prefixes

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

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

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

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

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

ListObjects paginates with MaxKeys and Marker

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

ListObjectsV2 with letter delimiter groups keys into common prefixes

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

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

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

ListObjectsV2 with dot delimiter groups keys into common prefixes

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

ListObjectsV2 with empty delimiter behaves as no delimiter and echoes none

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

ListObjectsV2 without a delimiter returns all keys and echoes no delimiter

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

ListObjectsV2 with percent delimiter groups keys into common prefixes

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

ListObjectsV2 delimiter and prefix pagination with continuation tokens

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

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

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

ListObjectsV2 with newline delimiter matches no keys and returns all objects

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

ListObjectsV2 with whitespace delimiter groups keys into common prefixes

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

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

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

ListObjectsV2 with FetchOwner=true includes Owner in listed objects

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

ListObjectsV2 paginates with MaxKeys and StartAfter

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

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

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

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

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

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

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

ListObjects prefix filtering works on non-slash prefixes

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

ListObjects with a directory prefix returns only keys under that prefix

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

ListObjects prefix and delimiter logic works with non-slash delimiter

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

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

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

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

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

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

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

ListObjects with an empty prefix returns all keys

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

ListObjects with a prefix matching no keys returns an empty listing

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

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

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

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

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

ListObjectsV2 without FetchOwner omits Owner from listed objects

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

ListObjectsV2 with FetchOwner=false omits Owner from listed objects

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

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

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

ListObjectsV2 prefix filtering works on non-slash prefixes

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

ListObjectsV2 with a directory prefix returns only keys under that prefix

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

ListObjectsV2 prefix and delimiter logic works with non-slash delimiter

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

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

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

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

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

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

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

ListObjectsV2 with an empty prefix returns all keys

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

ListObjectsV2 with a prefix matching no keys returns an empty listing

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

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

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

ListObjects marker past the last key returns no keys

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

ListObjects with an empty marker returns all keys

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

ListObjects without a marker echoes an empty Marker

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

ListObjects marker between keys starts listing after its sort position

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

ListObjects with an unprintable marker echoes it and returns all keys

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

ListObjects with non-numeric max-keys returns InvalidArgument

tier-3listingerrorswire-headerssource:ceph-s3-tests
listing-0059 0.779s 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.010s pass

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

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

ListObjectsV2 with both ContinuationToken and StartAfter resumes from the token

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

ListObjectsV2 resumes listing from NextContinuationToken

tier-1listingsource:ceph-s3-tests
listing-0067 2.315s 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 2.306s pass

ListObjectsV2 default MaxKeys is 1000 and returns all keys

tier-1listingsource:ceph-s3-tests
listing-0069 2.305s 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 0.865s pass

ListObjectsV2 StartAfter past the last key returns no keys

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

ListObjectsV2 StartAfter between keys starts listing after its sort position

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

ListObjectsV2 with an unprintable StartAfter echoes it and returns all keys

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

ListObjectsV2 with a prefix returns all 10 seeded objects

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

ListObjectsV2 accepts an empty Prefix and an empty Delimiter

tier-1listingsource:msst-s3
listing-0077 0.157s 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.153s 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 0.636s pass

ListObjects (v1) Marker need not be an existing key

tier-3listingsource:msst-s3
listing-0080 0.621s 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 0.792s pass

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

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

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

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

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

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

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

tier-3listingsource:msst-s3
listing-0085 0.340s 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.122s 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 2.665s 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 1.320s 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 1.866s pass

ListObjectsV2 with Delimiter navigates a nested hierarchy level by level

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

ListObjectsV2 paginates 25 objects in three pages via NextContinuationToken

tier-1listingsource:msst-s3
listing-0091 0.747s 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 0.800s pass

ListObjectsV2 StartAfter need not be an existing key

tier-1listingsource:msst-s3
listing-0093 2.994s 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.325s 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 0.970s pass

ListObjectsV2 Prefix filter returns only keys under each prefix

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

ListObjectsV2 StartAfter returns only keys strictly after the given key

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

ListObjectsV2 MaxKeys limits the page and sets IsTruncated

tier-1listingsource:msst-s3
listing-0098 3.340s 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.369s 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 4.567s pass

ListObjectsV2 with Prefix returns only matching keys

tier-1listingsource:msst-s3
listing-0101 3.815s 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.781s 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.127s pass

ListObjectsV2 on an empty bucket returns KeyCount 0 and no Contents

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

ListObjectsV2 with a prefix lists keys containing special characters

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

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

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

ListObjectsV2 with FetchOwner includes Owner in Contents entries

tier-1listingsource:msst-s3
listing-0107 20.082s 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 1.758s 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.799s 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 0.930s 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 1.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.304s 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: SSE-C is not supported

misc-0004 2.215s pass

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

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

GetObjectAttributes paginates the multipart part list with MaxParts and PartNumberMarker

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

GetObjectAttributes on a single-part multipart object lists one part

tier-3miscmultipartsource:ceph-s3-tests
misc-0007 0.554s 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 157/161 passed ▸
multipart-0001 0.899s pass

Aborting a multipart upload leaves no object

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

AbortMultipartUpload with an unknown UploadId returns NoSuchUpload

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

An in-progress multipart upload does not replace the existing object until completed

tier-1multipartsource:ceph-s3-tests
multipart-0004 0.171s 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.254s pass

CompleteMultipartUpload with a bad top-level SHA256 checksum returns BadDigest

tier-1multipartchecksumserrorssource:ceph-s3-tests
multipart-0007 0.249s pass

CompleteMultipartUpload with a missing per-part checksum and bad top-level checksum returns BadDigest

tier-1multipartchecksumserrorssource:ceph-s3-tests
multipart-0008 0.313s pass

Multipart upload with SHA256 checksum completes and reports the composite checksum on demand

tier-1multipartchecksumssource:ceph-s3-tests
multipart-0009 0.307s pass

UploadPartCopy with syntactically invalid CopySourceRange values returns InvalidArgument

tier-1multipartcopyerrorssource:ceph-s3-tests
multipart-0010 0.311s pass

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
multipart-0011 2.836s pass

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
multipart-0012 0.909s pass

UploadPartCopy of a single byte from a 7MiB source object

tier-1multipartcopysource:ceph-s3-tests
multipart-0013 3.450s pass

Multipart copy from source keys with special names (space, underscores, '?versionId')

tier-1multipartcopysource:ceph-s3-tests
multipart-0014 5.318s pass

Multipart copy of each version of a versioned source object

tier-1multipartcopyversioningsource:ceph-s3-tests
multipart-0015 0.639s pass

UploadPartCopy without CopySourceRange copies the whole source object

tier-1multipartcopysource:ceph-s3-tests
multipart-0016 1.696s pass

GetObject/HeadObject with PartNumber on a completed multipart object

tier-1multipartsource:ceph-s3-tests
multipart-0017 0.992s pass

Three-part SHA256 multipart upload yields a stable composite ETag and checksum across repeated completes

tier-1multipartchecksumssource:ceph-s3-tests
multipart-0018 0.551s 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: SSE-C is not supported

multipart-0020 2.973s 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.127s pass

CompleteMultipartUpload with an unknown UploadId returns NoSuchUpload

tier-1multiparterrorssource:ceph-s3-testssource:msst-s3
multipart-0022 2.247s pass

Multipart upload of three 5MiB parts plus a 3MiB tail reads back concatenated

tier-1multipartsource:ceph-s3-tests
multipart-0023 0.120s 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.273s pass

CompleteMultipartUpload with a wrong part ETag returns InvalidPart

tier-1multiparterrorssource:ceph-s3-tests
multipart-0025 0.221s pass

CompleteMultipartUpload referencing a part number that was never uploaded returns InvalidPart

tier-1multiparterrorssource:ceph-s3-testssource:msst-s3
multipart-0026 2.107s 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 1.470s pass

Multipart upload overwrites an existing single-PUT object

tier-1multipartsource:ceph-s3-tests
multipart-0029 2.815s 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 1.881s pass

Completing a multipart upload whose non-final parts are below 5MiB returns EntityTooSmall

tier-1multiparterrorssource:ceph-s3-tests
multipart-0031 1.001s pass

One-byte multipart upload completes; retrying the complete is idempotent

tier-1multipartsource:ceph-s3-tests
multipart-0032 0.325s 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.006s pass

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

tier-1multipartconditionalversioningerrorssource:ceph-s3-tests
multipart-0034 0.241s 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.998s 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.053s pass

Three-part multipart upload with CRC32C FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0037 0.976s 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.047s pass

Three-part multipart upload with SHA1 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0039 1.072s pass

Three-part multipart upload with SHA256 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET

tier-3multipartchecksumssource:ceph-s3-tests
multipart-0040 1.923s pass

10 MiB two-part multipart upload preserves content integrity and size

tier-1multipartsource:msst-s3
multipart-0041 2.966s pass

In-progress multipart upload is discoverable via ListMultipartUploads/ListParts and can be resumed and completed

tier-1multipartsource:msst-s3
multipart-0042 2.315s pass

Multipart ETag differs from the single-part ETag of the same content and contains a dash

tier-1multipartsource:msst-s3
multipart-0043 0.238s 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.505s pass

CacheControl set on CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0045 0.439s pass

ContentType set on CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0046 0.204s 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.770s pass

ListParts with PartNumberMarker returns only the parts after the marker

tier-1multipartsource:msst-s3
multipart-0048 0.143s pass

ListMultipartUploads reports an Initiated timestamp for an in-progress upload

tier-1multipartsource:msst-s3
multipart-0049 0.547s 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.131s 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.453s pass

GetObject with PartNumber returns exactly that part's bytes and PartsCount

tier-1multipartsource:msst-s3
multipart-0052 0.962s pass

GetObjectAttributes on a completed multipart object reports total size and ObjectParts count

tier-3multipartobject-crudsource:msst-s3
multipart-0053 0.133s pass

ListMultipartUploads on a bucket with no active uploads returns no uploads

tier-1multipartlistingsource:msst-s3
multipart-0054 0.115s 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.170s pass

UploadIdMarker without KeyMarker is ignored by ListMultipartUploads

tier-1multipartlistingsource:msst-s3
multipart-0056 0.146s 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.121s pass

ListMultipartUploads with negative MaxUploads returns InvalidArgument

The original accepted InvalidArgument or InvalidRequest; AWS returns InvalidArgument.

tier-1multiparterrorssource:msst-s3
multipart-0058 0.232s 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.137s 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.138s pass

ListMultipartUploads reports ChecksumAlgorithm CRC32

tier-1multipartchecksumslistingsource:msst-s3
multipart-0061 0.135s pass

ListMultipartUploads reports ChecksumAlgorithm CRC32C

tier-1multipartchecksumslistingsource:msst-s3
multipart-0062 0.129s pass

ListMultipartUploads reports ChecksumAlgorithm SHA1

tier-1multipartchecksumslistingsource:msst-s3
multipart-0063 0.138s pass

ListMultipartUploads reports ChecksumAlgorithm SHA256

tier-1multipartchecksumslistingsource:msst-s3
multipart-0064 0.147s pass

ListMultipartUploads reports ChecksumAlgorithm CRC64NVME

tier-1multipartchecksumslistingsource:msst-s3
multipart-0065 0.389s pass

ListParts after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0066 0.119s 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.148s 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.144s pass

ListParts with a valid upload id but wrong object key returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0069 0.133s pass

ListParts with a nonexistent upload id returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0070 0.130s pass

ListParts with negative MaxParts returns InvalidArgument

tier-1multiparterrorssource:msst-s3
multipart-0071 2.073s pass

ListParts returns all uploaded parts with number, ETag, size and storage class

tier-1multipartsource:msst-s3
multipart-0072 1.697s pass

ListParts pagination: MaxParts truncation and NextPartNumberMarker resume

tier-1multipartsource:msst-s3
multipart-0073 0.152s 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.123s 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.009s pass

AbortMultipartUpload on a nonexistent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0076 0.151s pass

AbortMultipartUpload returns HTTP 204 No Content

tier-1multipartsource:msst-s3
multipart-0077 0.415s 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.161s pass

Aborted upload disappears from ListMultipartUploads

tier-1multipartsource:msst-s3
multipart-0079 0.163s 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.009s pass

ListMultipartUploads on a nonexistent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0081 0.173s 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.127s pass

ListMultipartUploads lists a single in-progress upload with key and upload id

tier-1multipartsource:msst-s3
multipart-0083 1.009s 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.954s 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 1.299s pass

Three-part multipart upload of 5 MiB parts reports total ContentLength

tier-1multipartsource:msst-s3
multipart-0086 0.173s pass

UploadPart after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0087 0.160s 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 0.859s pass

Parts uploaded out of order (3, 1, 2) are listed in ascending part-number order

tier-1multipartsource:msst-s3
multipart-0089 0.008s pass

UploadPart to a non-existent bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0090 0.149s pass

UploadPart with a valid upload ID but a different key returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0091 0.096s pass

UploadPart with a non-existent upload ID returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0092 0.666s 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 0.446s pass

UploadPart responds with HTTP 200 and an ETag

tier-1multipartsource:msst-s3
multipart-0094 0.443s pass

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
multipart-0095 0.815s pass

UploadPartCopy with CopySourceRange copies exactly the requested bytes

bytes=100-200 is inclusive, so the resulting part is 101 bytes.

tier-1multipartcopysource:msst-s3
multipart-0096 0.605s pass

UploadPartCopy CopySourceIfMatch: matching ETag succeeds, wrong ETag returns PreconditionFailed

tier-1multipartcopyconditionalsource:msst-s3
multipart-0097 0.652s pass

UploadPartCopy CopySourceIfModifiedSince: a past date copies, and a future date is ignored and copies too

The source test used now-1day and now+1day and expected the future date to fail with NotModified or PreconditionFailed. AWS ignores a future If-Modified-Since and completes the copy, so both steps expect success (fixed far-past and far-future dates stand in for the relative ones). The 412 PreconditionFailed arises only for a date after the source object's last-modified time that is not in the future.

tier-1multipartcopyconditionalsource:msst-s3
multipart-0098 0.449s pass

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
multipart-0099 0.436s pass

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
multipart-0100 0.303s pass

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
multipart-0101 0.322s pass

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
multipart-0102 0.300s pass

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
multipart-0103 0.275s pass

UploadPartCopy with an unknown upload id returns NoSuchUpload

tier-1multipartcopyerrorssource:msst-s3
multipart-0104 0.000s skipped

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

skipped: Known deviation: hilt resolves a well-formed copy source while authorizing the request, ahead of the gateway's argument validation, so a source with an empty key answers NoSuchBucket where S3 gives InvalidArgument

multipart-0105 0.351s 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.007s pass

UploadPartCopy to a non-existent destination bucket returns NoSuchBucket

tier-1multipartcopyerrorssource:msst-s3
multipart-0107 0.133s pass

UploadPartCopy from a non-existent source bucket returns NoSuchBucket

tier-1multipartcopyerrorssource:msst-s3
multipart-0108 0.132s pass

UploadPartCopy from a non-existent source key returns NoSuchKey

tier-1multipartcopyerrorssource:msst-s3
multipart-0109 0.791s pass

UploadPartCopy copies a whole 5 MiB object into a part; ListParts shows its size and ETag

tier-1multipartcopysource:msst-s3
multipart-0110 0.503s pass

CompleteMultipartUpload after AbortMultipartUpload returns NoSuchUpload

tier-1multiparterrorssource:msst-s3
multipart-0111 0.404s 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 1.457s pass

CompleteMultipartUpload with parts out of ascending order returns InvalidPartOrder

tier-1multiparterrorssource:msst-s3
multipart-0113 0.375s pass

CompleteMultipartUpload with an invalid ETag returns InvalidPart

tier-1multiparterrorssource:msst-s3
multipart-0114 0.360s 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.607s pass

Single-part multipart upload completes and has the correct size

tier-1multipartsource:msst-s3
multipart-0116 0.567s pass

CompleteMultipartUpload with non-final parts under 5 MiB returns EntityTooSmall

tier-1multiparterrorssource:msst-s3
multipart-0117 0.472s pass

CompleteMultipartUpload succeeds when MpuObjectSize matches the actual object size

tier-1multipartsource:msst-s3
multipart-0118 1.287s pass

Multipart ETag has hash-partcount format and HeadObject returns the same ETag

tier-1multipartsource:msst-s3
multipart-0119 1.006s 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.923s 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.977s pass

Multipart upload initiated with SSE-S3 preserves AES256 encryption on the completed object

tier-1multipartssesource:msst-s3
multipart-0123 0.599s pass

WebsiteRedirectLocation set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0124 1.375s pass

Assembled multipart object content equals the concatenation of its parts

tier-1multipartsource:msst-s3
multipart-0125 2.568s pass

50 MiB multipart upload of ten 5 MiB parts completes with correct ContentLength

tier-1multipartsource:msst-s3
multipart-0126 1.575s pass

Parts uploaded in reverse order assemble in part-number order on complete

tier-1multipartsource:msst-s3
multipart-0127 0.782s pass

Metadata, tags and content type from CreateMultipartUpload are preserved on the completed object

tier-3multiparttaggingsource:msst-s3
multipart-0128 0.712s 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 0.833s pass

Last multipart part may be smaller than the 5 MiB minimum

tier-1multipartsource:msst-s3
multipart-0130 16.538s 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.372s pass

Multipart upload with the maximum part number 10000 succeeds

tier-1multipartsource:msst-s3
multipart-0132 0.764s 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.350s 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 1.762s 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.283s 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.112s 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 0.166s pass

CreateMultipartUpload accepts degenerate empty tagging strings

tier-1multiparttaggingsource:msst-s3
multipart-0138 0.117s 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.168s 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.012s pass

CreateMultipartUpload on a non-existing bucket returns NoSuchBucket

tier-1multiparterrorssource:msst-s3
multipart-0141 0.958s pass

CreateMultipartUpload accepts - _ . / in tag keys and values

tier-3multiparttaggingsource:msst-s3
multipart-0142 0.138s pass

CreateMultipartUpload returns a non-empty upload ID with bucket and key

tier-1multipartsource:msst-s3
multipart-0143 0.321s pass

CreateMultipartUpload metadata and content headers are preserved on the completed object

tier-1multipartmetadatasource:msst-s3
multipart-0144 0.419s 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.451s pass

CreateMultipartUpload with Tagging applies tags to the completed object

tier-3multiparttaggingsource:msst-s3
multipart-0146 0.110s pass

CreateMultipartUpload response contains Bucket, Key and UploadId

tier-1multipartsource:msst-s3
multipart-0147 0.149s 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.485s pass

ContentDisposition set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0149 0.484s pass

ContentEncoding set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0150 0.511s pass

ContentLanguage set at CreateMultipartUpload is preserved on the completed object

tier-1multipartsource:msst-s3
multipart-0151 0.175s pass

CreateMultipartUpload preserves keys with special ASCII characters

tier-1multipartencodingsource:msst-s3
multipart-0152 0.151s pass

CreateMultipartUpload accepts a 1024-byte key (maximum allowed)

tier-1multipartsource:msst-s3
multipart-0153 0.969s pass

Basic two-part multipart upload completes

tier-1multipartsource:msst-s3
multipart-0154 0.823s pass

Aborted multipart upload leaves no object and invalidates the UploadId

tier-1multiparterrorssource:msst-s3
multipart-0155 0.761s pass

Complete one multipart upload and abort another in the same bucket

tier-1multiparterrorssource:msst-s3
multipart-0156 0.405s pass

ListParts returns an uploaded part

tier-1multipartsource:msst-s3
multipart-0157 1.311s pass

Parts uploaded out of order are assembled in part-number order

tier-1multipartsource:msst-s3
multipart-0158 0.731s pass

Re-uploading the same part number overwrites with the later part

tier-1multipartsource:msst-s3
multipart-0159 0.175s fail

UploadPart rejects out-of-range part numbers with InvalidArgument

tier-1multiparterrorssource:msst-s3
step 3 (UploadPart) failed
Expected vs actual
status: expected 400, got 0 error: expected InvalidArgument, got (no error)
multipart-0160 2.666s pass

Complete a 5-part multipart upload and read back with matching checksum

tier-1multipartsource:msst-s3
multipart-0161 1.502s pass

UploadPart returns the part ETag

tier-1multipartsource:msst-s3
multipart-0162 1.196s 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 0.788s 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 1.056s 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 1.347s 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.135s 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 160/161 passed ▸
object-crud-0001 0.263s pass

Put and get a plain text object

tier-1object-crudsource:storage-test
object-crud-0002 0.336s pass

Put and get an empty object

tier-1object-crudsource:storage-test
object-crud-0003 0.386s pass

Put and get a key containing subdirectories and spaces

tier-1object-crudsource:storage-test
object-crud-0004 0.446s pass

Write, read, delete, then verify absence

tier-1object-crudsource:storage-test
object-crud-0005 0.268s 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.598s pass

GetObject with a non-matching If-Match returns PreconditionFailed

tier-1object-crudconditionalerrorssource:ceph-s3-tests
object-crud-0007 0.468s 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.430s 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.381s 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.397s pass

GetObject with a non-matching If-None-Match returns the object

tier-1object-crudconditionalsource:ceph-s3-tests
object-crud-0011 0.939s 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.889s 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.357s 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 0.685s pass

DeleteObjects removes multiple keys and repeating it reports the missing keys as deleted

tier-3object-crudsource:ceph-s3-tests
object-crud-0015 0.194s fail

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
step 1 (DeleteObjects) failed
Expected vs actual
error: expected success, got status 403, error AccessDenied: Access Denied.
object-crud-0016 0.886s 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.448s pass

Content-Encoding set on PutObject is returned by HeadObject

tier-1object-crudencodingsource:ceph-s3-tests
object-crud-0018 0.324s 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.238s pass

HeadObject on an empty object reports ContentLength 0

tier-1object-crudsource:ceph-s3-tests
object-crud-0021 0.437s 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.128s pass

GetObject on a missing key returns NoSuchKey

tier-1object-cruderrorssource:ceph-s3-testssource:storage-testsource:msst-s3
object-crud-0023 0.379s pass

Empty-string user metadata value round-trips

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0024 0.389s pass

User metadata set on PutObject is returned on GetObject

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0025 0.527s pass

Overwriting an object can replace its metadata value with the empty string

tier-1object-crudmetadatasource:ceph-s3-tests
object-crud-0026 0.387s pass

Cache-Control set on PutObject is returned by HeadObject

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0027 0.320s pass

PutObject response ETag is the quoted MD5 of the body

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0028 0.385s 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.370s pass

PutObject with a binary body reads back identically

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0030 0.566s pass

Object write, read, overwrite, re-read and delete round-trip

tier-1object-crudsource:ceph-s3-tests
object-crud-0031 0.008s 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.397s 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.413s pass

Authenticated PutObject succeeds with HTTP 200

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0034 0.345s 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 0.641s pass

Ranged GetObject over an 8 MiB object returns 206 with the correct middle slice

tier-1object-crudsource:ceph-s3-tests
object-crud-0036 0.216s pass

Ranged GetObject on an empty object returns 416 InvalidRange

tier-1object-cruderrorssource:ceph-s3-tests
object-crud-0037 0.351s pass

Ranged GetObject entirely beyond the object size returns 416 InvalidRange

tier-1object-cruderrorssource:ceph-s3-testssource:msst-s3
object-crud-0038 0.360s pass

Ranged GetObject returns 206 with the requested slice and Content-Range

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0039 0.348s pass

Ranged GetObject with a suffix range returns the trailing bytes

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0040 0.347s pass

Ranged GetObject with an open-ended range skips leading bytes

tier-1object-crudsource:ceph-s3-testssource:msst-s3
object-crud-0041 4.402s 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.348s pass

Put a simple object, read it back and find it in a listing

tier-1object-crudlistingsource:msst-s3
object-crud-0043 0.349s pass

Deleted object returns NoSuchKey on GET and disappears from listing

tier-1object-cruderrorssource:msst-s3
object-crud-0044 1.455s pass

Cache-Control header round-trips for several directive combinations

tier-1object-crudsource:msst-s3
object-crud-0045 0.401s pass

Content-Encoding gzip header round-trips on a gzip-compressed object

tier-1object-crudsource:msst-s3
object-crud-0046 1.674s pass

Content-Disposition header round-trips for inline, attachment and filename forms

tier-1object-crudsource:msst-s3
object-crud-0047 0.739s pass

Single-part PutObject ETag equals content MD5 and metadata is preserved

tier-1object-crudchecksumssource:msst-s3
object-crud-0048 0.356s pass

PutObject with 10 user metadata entries, all returned by HeadObject

tier-1object-crudmetadatasource:msst-s3
object-crud-0049 0.310s pass

Put/get round-trip preserves body bytes and the ETag

tier-1object-crudsource:msst-s3
object-crud-0050 0.743s pass

10 MiB object round-trips with size and MD5 intact

tier-1object-crudsource:msst-s3
object-crud-0051 1.487s 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.372s pass

Ranged GETs return exactly the requested bytes of a patterned object

tier-1object-crudsource:msst-s3
object-crud-0053 0.388s pass

All 256 byte values survive a put/get round-trip

tier-1object-crudsource:msst-s3
object-crud-0054 0.881s pass

PutObject ETag is a quoted hex string across object sizes 0 B to 5 MiB

tier-1object-crudsource:msst-s3
object-crud-0055 0.343s 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.178s pass

Deleting 'name' does not remove the distinct object 'name/'

tier-1object-crudsource:msst-s3
object-crud-0057 0.301s pass

Deleting directory marker 'dir/' leaves nested 'dir/file' intact

tier-1object-crudlistingsource:msst-s3
object-crud-0058 0.104s pass

DeleteObject on a missing key succeeds (idempotent)

tier-1object-crudsource:msst-s3
object-crud-0059 0.291s pass

DeleteObject returns HTTP 204

Original accepted 200 or 204; S3 responds 204 No Content.

tier-1object-crudsource:msst-s3
object-crud-0060 0.300s 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.292s pass

DeleteObject removes the object; subsequent HeadObject returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0062 0.357s pass

Deleting the same key twice succeeds both times

tier-1object-crudsource:msst-s3
object-crud-0063 1.012s pass

DeleteObject works with dashes, underscores, dots, spaces and parens in keys

tier-1object-crudencodingsource:msst-s3
object-crud-0064 0.684s pass

DeleteObjects with a single missing key reports it deleted and leaves others

tier-1object-crudlistingsource:msst-s3
object-crud-0065 17.603s pass

DeleteObjects deletes a 100-key batch in one request

tier-1object-crudlistingsource:msst-s3
object-crud-0066 0.743s 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.019s pass

DeleteObjects on a missing bucket returns NoSuchBucket

tier-1object-cruderrorssource:msst-s3
object-crud-0068 0.136s 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.811s 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.261s pass

DeleteObjects returns HTTP 200

tier-1object-crudsource:msst-s3
object-crud-0071 1.111s 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.605s 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 0.861s 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.240s pass

Zero-byte object: upload, HEAD, GET and copy all preserve zero length

tier-1object-crudsource:msst-s3
object-crud-0075 0.469s pass

Empty user-metadata map and empty metadata values are accepted, empty values preserved

tier-1object-crudsource:msst-s3
object-crud-0076 0.308s pass

Single-character object key is accepted

tier-1object-crudsource:msst-s3
object-crud-0077 0.326s pass

ETag is identical across PutObject, HeadObject, GetObject and ListObjectsV2

tier-1object-crudsource:msst-s3
object-crud-0078 0.220s pass

Zero-byte object PUT returns an ETag

tier-1object-crudsource:msst-s3
object-crud-0079 0.540s pass

Identical content uploaded to two keys yields identical ETags

tier-1object-crudsource:msst-s3
object-crud-0080 0.530s 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 0.863s pass

ETag is a quoted hex string of at least 32 characters across object sizes

tier-1object-crudsource:msst-s3
object-crud-0082 0.835s pass

Binary, control-character, Unicode and embedded-NUL bodies all yield quoted ETags

tier-1object-crudsource:msst-s3
object-crud-0083 0.335s pass

GetObject after DeleteObject returns 404 NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0084 0.334s pass

GetObject on an existing object returns HTTP 200

tier-1object-crudsource:msst-s3
object-crud-0085 0.346s 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.344s 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.192s pass

GetObject on an empty directory-marker key (trailing slash) returns zero-length body

tier-1object-crudsource:msst-s3
object-crud-0088 0.131s pass

GetObject on a key under a non-existing parent path returns NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0089 0.113s pass

GetObject on a missing directory-marker key (trailing slash) returns NoSuchKey

tier-1object-cruderrorssource:msst-s3
object-crud-0090 0.895s pass

GetObject with ResponseExpires sets an Expires header in the response

tier-1object-crudsource:msst-s3
object-crud-0091 0.884s pass

GetObjectAttributes with an empty attributes list returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0092 0.345s pass

GetObjectAttributes returns ETag, ObjectSize, StorageClass and LastModified for an existing object

tier-3object-crudsource:msst-s3
object-crud-0093 0.717s pass

GetObjectAttributes with an invalid attribute name alongside a valid one returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0094 0.715s pass

GetObjectAttributes on a key nested under an existing file object returns NoSuchKey

tier-3object-cruderrorssource:msst-s3
object-crud-0095 0.149s pass

GetObjectAttributes with a single invalid attribute name returns InvalidArgument

tier-3object-cruderrorssource:msst-s3
object-crud-0096 0.011s pass

GetObjectAttributes on a non-existing bucket returns NoSuchBucket

tier-3object-cruderrorssource:msst-s3
object-crud-0097 0.123s pass

GetObjectAttributes on a non-existing object returns NoSuchKey

tier-3object-cruderrorssource:msst-s3
object-crud-0098 0.465s pass

GetObject ContentLength matches the actual body size

tier-1object-crudsource:msst-s3
object-crud-0099 0.266s pass

GetObject without trailing slash does not match a directory-style key with slash

tier-1object-cruderrorssource:msst-s3
object-crud-0100 0.431s pass

GetObject returns a 1 MiB object intact

tier-1object-crudsource:msst-s3
object-crud-0101 0.286s pass

GetObject response includes a LastModified timestamp

tier-1object-crudsource:msst-s3
object-crud-0102 0.293s pass

GetObject returns the Cache-Control value set at upload

tier-1object-crudsource:msst-s3
object-crud-0103 0.315s pass

GetObject returns the ContentType set at upload

tier-1object-crudsource:msst-s3
object-crud-0104 0.296s pass

GetObject returns user metadata set at upload

tier-1object-crudsource:msst-s3
object-crud-0105 0.174s pass

GetObject on a zero-length object returns empty body and ContentLength 0

tier-1object-crudsource:msst-s3
object-crud-0106 0.287s pass

Ranged GetObject over a known byte pattern returns exact bytes for several ranges

tier-1object-crudsource:msst-s3
object-crud-0107 0.303s pass

Range extending past the object end is trimmed to object size

tier-1object-crudsource:msst-s3
object-crud-0108 0.272s pass

Single-byte ranges bytes=0-0 and bytes=99-99 return exactly one byte

tier-1object-crudsource:msst-s3
object-crud-0109 0.279s pass

HeadObject with Range on a directory-style key ('dir/') returns 206 partial content

tier-1object-crudsource:msst-s3
object-crud-0110 0.331s pass

HeadObject on 'key' returns 404 when only 'key/' exists

tier-1object-cruderrorssource:msst-s3
object-crud-0111 0.305s pass

HeadObject on a key nested under an existing file key returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0112 0.356s pass

HeadObject on 'key/' returns 404 when only 'key' exists

tier-1object-cruderrorssource:msst-s3
object-crud-0113 0.326s pass

HeadObject returns ContentType, ContentEncoding, ContentLanguage and ContentDisposition

tier-1object-crudsource:msst-s3
object-crud-0114 0.281s pass

HeadObject returns a LastModified timestamp

tier-1object-crudsource:msst-s3
object-crud-0115 0.130s pass

HeadObject on a missing key returns 404

tier-1object-cruderrorssource:msst-s3
object-crud-0116 0.272s pass

HeadObject returns length, content type, ETag, metadata and LastModified

tier-1object-crudsource:msst-s3
object-crud-0117 0.281s pass

HeadObject returns user-defined metadata

tier-1object-crudsource:msst-s3
object-crud-0118 0.331s pass

HeadObject Range extending beyond object size is trimmed to the object

tier-1object-crudsource:msst-s3
object-crud-0119 0.295s pass

HeadObject with malformed Range headers returns the full object

tier-1object-crudsource:msst-s3
object-crud-0120 0.311s pass

HeadObject with unsatisfiable Range returns 416

tier-1object-cruderrorssource:msst-s3
object-crud-0121 0.311s pass

HeadObject with valid Range headers returns correct Content-Range and Content-Length

tier-1object-crudsource:msst-s3
object-crud-0122 0.280s 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.573s pass

Mixed-case metadata keys are handled case-insensitively and returned lowercased

tier-1object-crudheadersmetadatasource:msst-s3
object-crud-0124 0.620s 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.352s pass

ETag is quoted hex and consistent between PutObject and HeadObject; LastModified is returned

tier-1object-crudheaderssource:msst-s3
object-crud-0126 0.306s pass

PutObject accepts user metadata just under the 2KB limit

tier-1object-crudmetadatasource:msst-s3
object-crud-0127 0.106s 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.547s pass

100 user metadata headers round-trip through PutObject and HeadObject

tier-1object-crudmetadatasource:msst-s3
object-crud-0129 0.522s 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.311s pass

User metadata named after system headers does not override system values

tier-1object-crudmetadatasource:msst-s3
object-crud-0131 0.306s 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.827s 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.600s 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.335s pass

PutObject directory-style key with non-empty body is readable

tier-1object-crudsource:msst-s3
object-crud-0135 0.667s 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.304s 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.303s 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.345s 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.351s 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.449s 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.454s 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 0.799s 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.174s pass

Zero-byte object: GET returns empty body and HEAD reports ContentLength 0

tier-1object-crudsource:msst-s3
object-crud-0144 2.941s pass

Small object sizes 1 B to 1 KiB report correct ContentLength

tier-1object-crudsource:msst-s3
object-crud-0145 2.780s 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.335s pass

PutObject preserves ContentLanguage, visible via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0147 0.681s pass

PutObject preserves WebsiteRedirectLocation, visible via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0148 1.140s 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.424s pass

PutObject replacing an object updates its Content-Type

tier-1object-crudsource:msst-s3
object-crud-0150 0.313s pass

PutObject stores a 1 KB metadata value

tier-1object-crudsource:msst-s3
object-crud-0151 0.297s pass

PutObject stores Content-Disposition retrievable via HeadObject

tier-1object-crudsource:msst-s3
object-crud-0152 0.858s pass

PutObject preserves explicit Content-Type across various media types

tier-1object-crudsource:msst-s3
object-crud-0153 0.278s 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.173s pass

Zero-length PutObject creates a retrievable empty object

tier-1object-crudsource:msst-s3
object-crud-0155 1.416s 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.268s pass

PutObject preserves Content-Type together with Content-Encoding

tier-1object-crudsource:msst-s3
object-crud-0157 0.824s 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.483s pass

GetObject returns exact bytes for checksum verification; overwrite replaces content

tier-1object-crudchecksumssource:msst-s3
object-crud-0159 0.441s pass

Object ETag reflects content and changes on overwrite

tier-1object-crudsource:msst-s3
object-crud-0160 0.010s pass

GetObject in a non-existent bucket returns 404 NoSuchBucket

tier-1object-cruderrorssource:msst-s3
object-crud-0161 0.127s pass

HeadObject with negative PartNumber returns 400

tier-1object-cruderrorssource:msst-s3
object-crud-0162 0.296s 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.226s 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-e979c495: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: GQVK3F44TNRZCS3S, HostID: IuIOVogq+x2H8nzW0cuGQNZeab4/xEWXBxEOXSuRHKAtmGJ1Dtp8TzgPe5rIR4TYmCQ0pKR818oiG02wPdmDfzA=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0001-b1-e979c495: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: QW96ZDV766YMXEIK, HostID: Z/caEUtNtTSHDTFbwX+KE7kUF8BJkg95ahdWtRGwWroisAR0o9cAsNzLMN4mMYgPNe5vewGXn4M/ICQHqku2Ghg=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0002 0.212s 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-2405420f: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: T2D468RLIKYUMF0K, HostID: 8JpwuxoqiRphh3vehDUxWQ6N/jpCgF4kuNEdgzbzg5Y1fNnenVB32cD0OoLpdhtb+kKyIcdSofTddNi08WLMkMw=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0002-b1-2405420f: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: I3H6BGSXUCDU77DP, HostID: TrUBd6fmFjhPypZE1udCU8EXkGRW6A2zZUjdLFfXK9RZ6pAmRIpBw8U8VCpBNPFmS2ZZZ3ibL6vNPWCcH+nZPtc=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0003 0.263s 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-09e74231: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 2UA62WPUIUKMS0LP, HostID: hRqgN6VsDq0lrNiuwy76fdydGaNzYA669bt79NS6lpxc42tbXFBfCbMj0AJe7u8PbOJnH5WXJt2EeyzseCP4Sv8=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0003-b1-09e74231: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: SQIB6HN4PW90E337, HostID: L3Ai12Etc6KeJE7DKID1gr1A3OanWhL5SeLnRQbijXAAVMooW4KIzf+BXpJufOPCbfi1u9zvW091yDd+nrvhFQw=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0004 0.376s pass

GetObjectLegalHold reflects legal hold status after setting ON then OFF

tier-3object-locksource:ceph-s3-testssource:msst-s3
object-lock-0005 0.160s pass

GetObjectLockConfiguration returns the stored default retention configuration

tier-3object-locksource:ceph-s3-testssource:msst-s3
object-lock-0006 0.118s pass

GetObjectLockConfiguration on a bucket without object lock returns ObjectLockConfigurationNotFoundError

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0007 0.329s pass

GetObjectRetention on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0008 0.208s 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-ae199a42: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 3I6WQJNB6SUVHDLQ, HostID: 8spnLGNqFawFds8rIChhv7OFvUh8mMmcNcvKZ2ae68YHKY0pubvObTJ0vUrSwrnG2SZaQ2+Hn49G51+d6fOBsoM=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0008-b1-ae199a42: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: U42JU2AV4FUHCPIM, HostID: ATxoPrQGDL+L6EKxNrXgjd+EQWZyLd+iwUEPGjEApMmKadShpw7y+dmUTCtd9czMauJqNSbyve0WHC1Q3xrj260=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0009 0.342s 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-75e40aa1: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: PSTXQAMNZIZP33MU, HostID: 1qKYERF7FVAwIb5tUBLxIOBdaWJTEeUwFAXerlWrWOezjfIBjPq1vv4+dK80zgH1WsJCRwzOIWP2xeyFRzpAmr4=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0009-b1-75e40aa1: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: HRFLXI9VU0JZS2H4, HostID: PwvefsRsy+cMlbxSZ+3K26bgvpK+a5LgoE//yREowuduGHi2HSQCAxV1zLTrx65c3nylfOGRJtgzz6s0LDbxhA8=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0010 0.412s pass

PutObjectLegalHold accepts Status ON and OFF

tier-3object-locksource:ceph-s3-tests
object-lock-0011 0.324s pass

PutObjectLegalHold on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0012 0.378s pass

PutObjectLegalHold with an invalid status returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0013 0.170s pass

PutObjectLockConfiguration accepts GOVERNANCE/Days and COMPLIANCE/Years defaults and implies versioning enabled

tier-3object-lockversioningsource:ceph-s3-tests
object-lock-0014 0.244s pass

PutObjectLockConfiguration fails on unversioned or suspended bucket but succeeds once versioning is enabled

tier-3object-lockversioningerrorssource:ceph-s3-tests
object-lock-0015 0.170s pass

PutObjectLockConfiguration on a bucket without object lock returns InvalidBucketState

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0016 0.154s 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.144s pass

PutObjectLockConfiguration with an invalid or lowercase retention mode returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0018 0.126s pass

PutObjectLockConfiguration with ObjectLockEnabled of Disabled returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0019 0.128s 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.146s pass

PutObjectLockConfiguration with both Days and Years returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0021 0.277s 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-7b852046: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7YTF67J6212RU9Y8, HostID: fIVyp8hH3s+n8PVsHhtEqM+TN5iwGDHMKPrwwBB51dtD+Yg5YiVwpZ3EnLx6R5oQRINUlLpR7c7ZJaKJm76rBFE=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0021-b1-7b852046: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: O365AI6THUCHX0Y4, HostID: rkMn6ckdO6XECUnbQLN0svjuTYenWhFrQPL5p5MJz1xsMOVZlrdqky49uIIGK8udslkG3TQSH8nkWCBa2boD17k=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0022 0.291s 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-a276f518: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: UPYYDJNTI3DGBNVP, HostID: 2fo9IYKOqqVFo4SFzDF9gK4F5Z/A/ryiAZvcrIvFGyqLKcLKOpVDcgc/igeYSCYQGVFTLj9Dq7aGkYs0qs5bBQ4=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0022-b1-a276f518: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 7GOLP3882FDIVBKY, HostID: EGSyupUucz8Uty8NdJeQZOzkjuZgbPY9dIOMAt/P5XaIhaifIExuSPnJk8EGGsbduuC4JbVk8tjbGw/vVIf2Y1Y=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0023 0.619s pass

PutObjectRetention on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0024 0.601s pass

PutObjectRetention with lowercase or invalid mode returns MalformedXML

tier-3object-lockerrorssource:ceph-s3-tests
object-lock-0025 0.508s 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-989aac65: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: S5FTXYJBT6APYG69, HostID: 9P02IWpJPbBN9xX2Re5+7qa3+nRTelGos5gLOey207ifxLDdLX8T0ZRv0dkVzprYhkpOONVhK8isGhnuj59AaFc=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0025-b1-989aac65: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: TAW3FRIFCWBCVQKP, HostID: iu0IFmqS6IIQTpqWQ0iOrNWDd0PsSjLvXFlVSKsPACTJG9//BjIzbi2tiU7tezFRgXsgJJhbx3xr/CV4sQGLOTg=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0026 0.209s 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-c5d1eddb: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: G5DD1ZS1M92KN1CF, HostID: LTt9gja9y++heWWQDuhnvbb0guMfUq4vbsdDphLagB0Hv38r+cpm52bdKocFtqKFGC5cKxZu01kXVYMf1tNoEa0=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0026-b1-c5d1eddb: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: FX1188Q7QTU4E349, HostID: PQ2lkH8dst1culRQcOPrmyb0nIjZCOaXhUp1bqHSCOseLt6BFcimZnF8VbN36wjxweMv39vRd+/CxO8dVhfv4Ok=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0027 0.309s 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-d5093acb: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: BDG1HDHZ8O4YA55K, HostID: 9X0TDeQ2IThj1P/yW9raQdCWlKcZmtcGX7RYGHjMOMQRPgd9lyFNWHXFr5oppVuMLjKMklNH8Fpx+52X01n26no=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0027-b1-d5093acb: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: C1THM6EF19QRNL81, HostID: QnmW/WiN+5w0Z3w2DPlmluAiA5bVCg12JWE2G9BR+dmoprFxuZJb/RIThg2x6cBzo0P9KONH9lhMKrZKisVeeT8=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0028 0.382s 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-35f4c3eb: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 2HDNL4XJK2DV42I2, HostID: a6u7XdRExTNuD1qH2yxSdK0Wq4Gpx2rLZJh+CT4XC2yQzCn30dwtReX4GVQwFLHtNEvjYZ2MgQN9gWo3wEQckhY=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0028-b1-35f4c3eb: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 5TQCK866WCT70FS5, HostID: +250w+oyaP5IzWR3LVdc4qjLtQ3XwP458mzVr4uM+VbFSkL+b2+6+NtqBEzoJc7efGdPfsX1AWilAy/gEhUlCZY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0029 0.179s 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.228s 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-7f823ded: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: VJZMX0118BQWDO0G, HostID: qpqGA/RNvuR2cbEftlTyZSpvFd1u2B78iIVQHe1rMgul5LtwLzEK6RFEsM2ODipnXchyEyGO6nGS7SxxRI5vJKM=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0030-b1-7f823ded: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: GM0DG87U0ZDXJJSF, HostID: d6hEU7SveMppXY4bE7sh7lL6uYj9gN87pKg5SAT/1X5F83kq6O8qeV+oaSZd9CYj+qiHbwWiQmSZ6o+u2R2Q/MY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0031 0.702s pass

DeleteObject on a multipart-uploaded version created with legal hold ON returns AccessDenied

tier-3object-lockmultipartversioningerrorssource:ceph-s3-tests
object-lock-0032 0.690s pass

DeleteObject on a version with legal hold OFF succeeds with 204

tier-3object-lockversioningsource:ceph-s3-tests
object-lock-0033 0.733s pass

DeleteObject on a version with legal hold ON returns AccessDenied

tier-3object-lockversioningerrorssource:ceph-s3-tests
object-lock-0034 0.406s pass

GetObjectLegalHold on a bucket without object lock returns InvalidRequest

tier-3object-lockerrorssource:ceph-s3-testssource:msst-s3
object-lock-0035 0.275s 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-5c601e7c: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: LJ7AW46VMQN7PWS8, HostID: OOmKWqUmy7v3T1xs5dOzEkV3naBiIqCNJLf5c1LMFBLvmird/mqxR4jZyEgp7OR5C8cTlLZr1x4H8RPrpCHM7Xc=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0035-b1-5c601e7c: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 2Q0SUZN31GW2FWBZ, HostID: lhX/Sp6QIdCubt9CeFiHXBh0XyUwiFgViqXFiZDGv4VjT461yfjV5v5crPB6YNBsMXteS5DU1TSGxPEUFlfsIrc=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0036 0.273s 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-20fa0ee3: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: R7LU9Q202LIM1KTT, HostID: 5mbMTPGuxIC4mvF6YzfhINtaqRLBPl8OoqRHiqja9J8eDTXyZM1A30dcpBPzIwXw6DQbBJALmB3Ek4D1BnrOnmQ=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0036-b1-20fa0ee3: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 0UTMIZ7B6KZYHHLQ, HostID: /aF3/bqXGt/kMZcQPC8KtiyEux8LIoCFb1VHwn5WMSVBhKKGMdtslsuaJLyLiv22LSedToSJBG2drh3c9TLfrPU=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0037 0.012s 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.171s pass

GetObjectLegalHold on a missing key in a lock-enabled bucket returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0039 0.425s 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.128s 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.009s pass

PutObjectLegalHold on a non-existent bucket returns NoSuchBucket

tier-3object-lockerrorssource:msst-s3
object-lock-0042 0.134s pass

PutObjectLegalHold on a missing key in a lock-enabled bucket returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0043 0.486s pass

Legal hold set to ON is readable via GetObjectLegalHold

tier-3object-locksource:msst-s3
object-lock-0044 0.014s 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.194s pass

Object lock configuration with COMPLIANCE default retention round-trips

tier-3object-locksource:msst-s3
object-lock-0046 0.181s 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.174s 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.221s 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.008s 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.194s pass

Minimal object lock configuration round-trips on a lock-enabled bucket

tier-3object-locksource:msst-s3
object-lock-0051 0.035s 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.141s pass

GetObjectRetention on missing key returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0053 0.243s pass

GetObjectRetention returns the mode and retain-until date that were set

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0053-b1-3d08c308: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: LNCDM5J7GOQV2X14, HostID: UXnF7w6cqQyX/PBlQqEhQMot9K9Rf5CGrvKSfjj+JKX9HOZpJ43QRtKkGM543iqFpG3dp7kdUk3NYrmBcF77i4g=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0053-b1-3d08c308: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 6V2HF7CDJL81S1BR, HostID: u50+Gf9995ndZiA0HWP57Ukb8HKWiJH0RQDePI3Stp5qDfuTZ3xDY6Z9RiN7fbIodns3R3ATzGEcnU0qnO5wJz0=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0054 0.371s 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.145s 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.008s pass

PutObjectRetention on missing bucket returns NoSuchBucket

tier-3object-lockerrorssource:msst-s3
object-lock-0057 0.139s pass

PutObjectRetention on missing key returns NoSuchKey

tier-3object-lockerrorssource:msst-s3
object-lock-0058 0.257s 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-fd4c8f4c: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: TWRI7KM0YNKN8B7M, HostID: Tpq7tZ9VC9sJKRenAW98lM+xFFu7J8PRzVDWkgE6Jlwu/AlYmLyFEzq2kpuxJtZnkbzNwbT8Y1DB0itQ3LyJ0lQ=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0058-b1-fd4c8f4c: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: L1G5FGV87SR2ZKSX, HostID: 1SXhocCbHj/46mPMr0AGaBo6uiBpSUSL//pZoffThsFIwSEJXBhVm9BMOviOXDIPU7QlaH+I+EkfJdkgCsrOQ9E=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0059 0.272s 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-4a308a5f: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: DP5D9AYVBYH4D3U3, HostID: CWJ3JqAp8c2Ghg+WzgshsDXs/0t4+NHWs1qy5aCBX3lGLsTZC8dYLJYbter8N3RsbBh6odp2m/w9uJkjSfrz8eY=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0059-b1-4a308a5f: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: K1PNAN9GFCZ4VPI0, HostID: 4zi3F6aBI8uCJzM7E0tXrdduPOdvXqZ/Dm9ZcdQY14Euyxk+T25iLy0eQo540V7OgVTww08lQPzfNOjZ3qMYZVE=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0060 0.218s pass

GOVERNANCE retention can be extended to a later date

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0060-b1-420f902d: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 1OVOPHCM7I04KUR9, HostID: /VGfFpk0lItQ2JRN1ac2YRF1RUYnpv4vE3rIGQLovdcF1yzx3zqxyWJp7xCNBEeyPcKaU5u2PoE226PmrPFqL+g=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0060-b1-420f902d: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 951QOAQOG1K8AKQX, HostID: hvwJZxES6g+HzKpjRfaNMIfQdkMkJZVy/+B7ZTXnL0L6q6YyaHOy5ndBXoxSUjN1OZJyiy2REgh8aMBk44uzZqk=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0061 0.208s 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-3480f897: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: LI6GGQIYHG563C4N, HostID: RFKufFJhIgpl3iqupQdsGvL+PQD34LQuWVqcWZGTFD/R1y8ehscMqsjC7WVb9558CITPWDiDgViwL61VeyZkbos=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0061-b1-3480f897: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: F4XDQFBFY0UIRDRG, HostID: EG/JWeHMBhlh4zGsBXAlv3RgFT2gDsoPgI9yk2/QrlBFxfQDZYzbZxfP4g3oYATE3EIZD2+/m5TdVOrS60dDFKk=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0062 0.234s 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-aed49160: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7RYXJRQTSEGEIJKS, HostID: N4pMb5aAaJdOIlKx7EtkYCmBc6xpc/IH6HMteO52XIyG3XJAOVWV3Q7Ij0CVQFADE4SMG2ExhDSINJPMsTBKRnY=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0062-b1-aed49160: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: FE2L0PT9VI6ZDX2T, HostID: uqb0iKMrrsoHPIjRXMHSfLOuU3JKlmvCtV1AzcHMAH3HNNOL+INctPbmaT/1lYeMGJ6CSpa472aK88zWtnNU4sY=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0063 0.342s 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.204s 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-4237a02a: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: TP986EGY14X50VB5, HostID: y3i0OZFeeXSMhxdIXKIPW0p1l2wEQpYiMtUOSJ+Q4nt8Gk8j3lT7/dKi/xD+4rnuIuDnUgEzO09Fny63YWyBZMw=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0064-b1-4237a02a: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: KW8RKGZ7TXNI8JSP, HostID: h4HTmsxXQiSf9+ioTByT/nhu4YgR0la7lTT0yKuBf2eBND8xL/+cdUZSkZk42+bIZCNMdmNRshG67px11qs/P/g=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0065 0.222s pass

CreateBucket with ObjectLockEnabledForBucket enables object lock

tier-3object-lockbucketsource:msst-s3
object-lock-0066 0.197s pass

PutObject with GOVERNANCE retention, read back via GetObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0066-b1-d97fd364: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 33PD6TB6PYSZNIZ8, HostID: WOTS0bJc5vfxTX6kVTkKL6pw0eTbbEVaAcSYFt5RTaeDZmxPO4KE04un+VDhohsYhnGEJYBqBMmXug2D6XfvhZM=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0066-b1-d97fd364: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 6WTF1J0HW2GYYL4V, HostID: vfIhULhKJVSb7A8xSyiorUw9SlBw5mQpP0PGQSdAo7+t49cFac+0RDOkKYXI4xQSSBURt259fA1XPxtkz1sgkw8=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0067 0.196s pass

PutObject with COMPLIANCE retention, read back via GetObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0067-b1-8640ccca: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7DCATPU36AGGKIET, HostID: E27St75MmhFbz0LinYgyUGyjDHqWK7fOzPBzFE+Z6hjA1xr3wlPrY0uHLJ+9YeuC/ZC852UuuK6w4GhATP671QU=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0067-b1-8640ccca: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 7KRKRW00L2J9ILB9, HostID: hWT2yJpVgoFyMEEZjyeLmWbdHqeeOBqF10vK+7jBtQ4UjKYm5qczainH6cteL47cpO5utsGFNkLJOgnH7VeGntU=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

object-lock-0068 0.293s pass

Extend a GOVERNANCE retention period with PutObjectRetention

tier-3object-locksource:msst-s3

warning: teardown s3tests-object-lock-0068-b1-c3a4d87b: DeleteObjects: operation error S3: DeleteObjects, https response error StatusCode: 403, RequestID: 7GVPJI447OPCN0QH, HostID: jl9gHNg6ocYkrwu9Jl4OKuBoJYK7U11BgtBi3KRZFIZhPNb0Y4OAxtRTwHkT/Sg8KUbGXGUkTLjwT3suNrhR4w0=, api error AccessDenied: Access Denied because object protected by object lock.

warning: teardown s3tests-object-lock-0068-b1-c3a4d87b: DeleteBucket: operation error S3: DeleteBucket, https response error StatusCode: 409, RequestID: 3C3V11P2EFDEBP4R, HostID: 4sriU3y/BcplhR5rYRULNw1OffQXtYo0t47VSjbDgbh112UMBI/5sqiZHdmgjU9Sdmgz7WmuCxL8/TswHhjrGOs=, api error BucketNotEmpty: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

policy 0/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.145s fail

GetBucketPolicy on a bucket without a policy returns NoSuchBucketPolicy

tier-3policyerrorssource:msst-s3
step 1 (GetBucketPolicy) failed
Expected vs actual
status: expected 404, got 403 error: expected NoSuchBucketPolicy, got AccessDenied
policy-0046 0.012s fail

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
step 1 (GetBucketPolicy) failed
Expected vs actual
status: expected 404, got 403 error: expected NoSuchBucket, got AccessDenied
policy-0047 0.182s fail

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
step 1 (PutBucketPolicy) failed
Expected vs actual
status: expected 400, got 403 error: expected MalformedPolicy, got AccessDenied
policy-0048 0.008s fail

PutBucketPolicy on a non-existent bucket returns NoSuchBucket

tier-3policyerrorssource:msst-s3
step 1 (PutBucketPolicy) failed
Expected vs actual
status: expected 404, got 403 error: expected NoSuchBucket, got AccessDenied
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.358s pass

Presigned GET URL returns the object body

tier-1presignedsource:msst-s3
presigned-0004 0.438s pass

Presigned PUT URL uploads the object

tier-1presignedsource:msst-s3
presigned-0005 0.367s pass

Presigned GET URL honors ResponseContentDisposition override

tier-1presignedsource:msst-s3
presigned-0006 0.119s pass

Presigned GET URL for a missing key returns 404

tier-1presignederrorssource:msst-s3
presigned-0007 0.432s pass

Presigned DELETE URL removes the object

tier-1presignedsource:msst-s3
sse 22/22 passed ▸
sse-0001 1.713s pass

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
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: SSE-C is not supported

sse-0003 1.965s pass

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
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: SSE-C 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: SSE-C is not supported

sse-0006 0.161s pass

DeleteBucketEncryption is idempotent and removes the SSE-S3 configuration

tier-3sseerrorssource:ceph-s3-tests
sse-0007 0.214s pass

GetBucketEncryption before and after configuring SSE-S3 default encryption

tier-3sseerrorssource:ceph-s3-tests
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: SSE-C is not supported

sse-0009 0.126s pass

PutBucketEncryption with SSE-S3 default encryption succeeds

tier-3ssesource:ceph-s3-tests
sse-0010 0.106s pass

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
sse-0011 0.148s pass

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
sse-0012 0.533s pass

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
sse-0013 0.186s pass

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
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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C 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: SSE-C is not supported

sse-0028 0.187s pass

PutObject with a KMS key id but without declaring aws:kms encryption returns 400

tier-1ssesse-kmserrorssource:ceph-s3-tests
sse-0029 0.495s pass

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
sse-0030 0.496s pass

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
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: Runner limitation: the raw HEAD step is read as a GET, so the 400 it expects (HEAD with an x-amz-server-side-encryption header) fails on the missing error body — as it would against AWS, which frames HEAD errors as chunked with no body. The rejection itself is pinned by the s3frontend unit tests

sse-0032 2.714s pass

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
sse-0033 0.420s pass

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
sse-0034 0.825s pass

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
sse-0035 0.373s pass

Bucket default encryption (AES256) is applied to objects uploaded without SSE parameters

tier-3ssesource:msst-s3
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: SSE-C is not supported

sse-0037 0.310s pass

PutObject with SSE-S3 (AES256) reports the encryption in PutObject and HeadObject responses

tier-1ssesource:msst-s3
sse-0038 0.143s pass

CreateMultipartUpload with SSE-S3 echoes ServerSideEncryption AES256

tier-1ssemultipartsource:msst-s3
sse-0039 0.000s skipped

SSE-C object is readable only with the customer key

tier-1sseerrorssource:msst-s3

skipped: SSE-C is not supported

sse-0040 0.344s pass

Bucket default encryption applies SSE-S3 to uploads that specify none

tier-3ssesource:msst-s3
sse-0041 0.000s skipped

Invalid SSE algorithm and undersized SSE-C key are rejected

tier-1sseerrorssource:msst-s3

skipped: SSE-C is not supported

sse-0042 0.152s pass

SSE-S3 bucket encryption configuration round-trips

tier-3ssesource:msst-s3
sse-0043 0.364s pass

CopyObject can add SSE-S3 encryption to an unencrypted object

tier-1ssecopysource:msst-s3
sse-0044 0.537s pass

Multipart upload initiated with SSE-S3 produces an encrypted object

tier-1ssemultipartsource:msst-s3
tagging 39/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.347s 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

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0006 0.342s pass

DeleteObjectTagging returns 204 and removes all tags

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingsource:ceph-s3-tests
tagging-0007 0.357s pass

PutObjectTagging with 129-char tag keys fails with InvalidTag and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0008 0.370s pass

PutObjectTagging with 11 tags fails with BadRequest and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0009 0.467s pass

PutObjectTagging with 257-char tag values fails with InvalidTag and stores no tags

tier-3taggingerrorssource:ceph-s3-tests
tagging-0010 0.434s 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.577s pass

PutObjectTagging accepts the maximum of 10 tags and returns them all

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingsource:ceph-s3-tests
tagging-0012 0.584s pass

A second PutObjectTagging replaces the previous tag set entirely

S3 does not specify an order for the tags in a TagSet: this vector's source test asserts list equality, but real S3 returns key2 before key. The tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingsource:ceph-s3-tests
tagging-0013 0.547s pass

PutObject with an x-amz-tagging header (including a valueless tag) stores tags readable via GetObjectTagging

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingsource:ceph-s3-tests
tagging-0014 0.000s skipped

Bucket policy allowing s3:PutObjectTagging to everyone lets another account write object tags

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingpolicysource:ceph-s3-tests

skipped: Bucket policies are not supported

tagging-0015 0.206s pass

Bucket tagging lifecycle: NoSuchTagSet before set, tag readable after put, NoSuchTagSet again after delete

tier-3taggingbucketerrorssource:ceph-s3-tests
tagging-0016 0.368s pass

Tagging supplied on CreateMultipartUpload is readable after complete and removable via DeleteObjectTagging

S3 does not specify an order for the tags in a TagSet, and real S3 returns neither insertion nor sorted order, so the tag set is asserted as an unordered set with $length + $containsAll rather than an ordered array.

tier-3taggingmultipartsource:ceph-s3-tests
tagging-0017 0.828s pass

Object tagging: set at upload, update, special characters, 10-tag maximum, and delete

tier-3taggingsource:msst-s3
tagging-0018 0.554s pass

Tags supplied at CreateMultipartUpload are present on the completed object

tier-3taggingmultipartsource:msst-s3
tagging-0019 0.200s pass

DeleteObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0020 0.329s 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.327s 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.616s pass

GetObjectTagging for a key nested under an existing file-like key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0023 0.119s pass

GetObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0024 0.653s pass

GetObjectTagging returns exactly the three tags that were set

tier-3taggingsource:msst-s3
tagging-0025 0.631s 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.337s 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.323s pass

Tag values may contain slashes, at-signs and spaces

tier-3taggingsource:msst-s3
tagging-0028 0.315s 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.316s 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.117s pass

PutObjectTagging on a missing key returns NoSuchKey

tier-3taggingerrorssource:msst-s3
tagging-0031 0.793s pass

PutObjectTagging replaces the entire existing tag set

tier-3taggingsource:msst-s3
tagging-0032 0.774s pass

PutObjectTagging sets tags retrievable via GetObjectTagging

tier-3taggingsource:msst-s3
tagging-0033 0.702s 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.158s pass

DeleteBucketTagging removes all bucket tags

tier-3taggingsource:msst-s3
tagging-0035 0.131s pass

GetBucketTagging on a bucket with no tags returns NoSuchTagSet

tier-3taggingerrorssource:msst-s3
tagging-0036 0.007s pass

GetBucketTagging on a non-existent bucket returns NoSuchBucket

tier-3taggingerrorssource:msst-s3
tagging-0037 0.115s pass

PutBucketTagging with duplicate tag keys returns InvalidTag

tier-3taggingerrorssource:msst-s3
tagging-0038 0.163s 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.011s pass

PutBucketTagging on a non-existent bucket returns NoSuchBucket

tier-3taggingerrorssource:msst-s3
tagging-0040 0.169s pass

PutBucketTagging with two valid tags succeeds and GetBucketTagging returns exactly those tags

tier-3taggingsource:msst-s3
tagging-0041 0.151s pass

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
tagging-0042 0.132s 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.162s pass

PutBucketTagging replaces the entire existing tag set

tier-3taggingsource:msst-s3
tagging-0044 0.290s 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 90/90 passed ▸
versioning-0001 0.298s pass

HEAD after delete in an unversioned bucket returns 404 with no delete-marker header

tier-1versioningerrorssource:ceph-s3-tests
versioning-0002 0.363s pass

Delete under suspended versioning still creates a delete marker

tier-3versioningerrorssource:ceph-s3-tests
versioning-0003 0.452s 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.725s pass

PutObject returns a VersionId only on a versioning-enabled bucket

tier-3versioningsource:ceph-s3-tests
versioning-0007 0.281s pass

Toggle bucket versioning between Suspended and Enabled and read back the status

tier-3versioningsource:ceph-s3-tests
versioning-0008 6.279s 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.579s pass

Copy specific object versions by VersionId within and across buckets

tier-1versioningcopysource:ceph-s3-tests
versioning-0010 0.539s pass

DeleteObjects removes specific versions by VersionId and is idempotent

tier-3versioningsource:ceph-s3-tests
versioning-0011 0.528s pass

DeleteObjects removes versions and a delete marker by VersionId, and is idempotent

tier-3versioningsource:ceph-s3-tests
versioning-0012 0.251s pass

DeleteObjects on a missing key creates a delete marker and reports its version id

tier-3versioningsource:ceph-s3-tests
versioning-0013 6.068s 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 0.964s 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 2.252s 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.173s 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.198s 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.993s 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.174s 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 2.151s 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 2.641s 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.594s pass

ListObjectVersions orders versions by key, newest first within each key

tier-3versioninglistingsource:ceph-s3-tests
versioning-0023 1.051s pass

Overwrite a pre-versioning object after enabling versioning, then delete each version by id

tier-3versioningerrorssource:ceph-s3-tests
versioning-0024 0.746s pass

Overwriting a pre-versioning object under suspended versioning replaces the null version

tier-3versioningerrorssource:ceph-s3-tests
versioning-0025 0.549s pass

Deleting the null version of a pre-versioning object removes it entirely

tier-3versioningerrorssource:ceph-s3-tests
versioning-0026 2.248s 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 1.081s pass

Copy a null-version object under suspended versioning within and across buckets

tier-3versioningcopysource:ceph-s3-tests
versioning-0028 0.373s pass

Repeated unversioned deletes on a versioned key stack delete markers

tier-3versioningsource:ceph-s3-tests
versioning-0029 0.312s 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.431s pass

Objects uploaded with checksum algorithms appear in the version listing

tier-3versioningchecksumslistingsource:msst-s3
versioning-0031 0.589s pass

Version created while versioning is suspended is listed with VersionId null

tier-3versioninglistingsource:msst-s3
versioning-0032 3.288s 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.910s pass

All versions of a single key are listed newest-first with IsLatest on the first

tier-3versioninglistingsource:msst-s3
versioning-0034 3.098s pass

MaxKeys truncates the version listing and markers resume it

tier-3versioninglistingsource:msst-s3
versioning-0035 0.148s 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.357s pass

Pre-versioning object is listed as the null version beneath its delete marker

tier-3versioninglistingsource:msst-s3
versioning-0037 1.901s pass

Delete marker appears in DeleteMarkers with IsLatest alongside older versions

tier-3versioninglistingsource:msst-s3
versioning-0038 0.828s 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.199s 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.007s pass

GetBucketVersioning on a non-existing bucket returns NoSuchBucket

tier-3versioningerrorssource:msst-s3
versioning-0041 0.149s pass

GetBucketVersioning on a versioning-enabled bucket returns Status Enabled

tier-3versioningsource:msst-s3
versioning-0042 0.133s 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.137s pass

Enabling bucket versioning succeeds and is reflected by GetBucketVersioning

tier-3versioningsource:msst-s3
versioning-0044 0.195s pass

Suspending versioning after enabling it succeeds and is reflected by GetBucketVersioning

tier-3versioningsource:msst-s3
versioning-0045 0.546s 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 1.032s 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.381s 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.399s 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.518s pass

GetObjectAttributes returns per-version attributes and defaults to the latest version

tier-3versioningsource:msst-s3
versioning-0050 0.631s 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.265s 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.396s 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.593s 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.420s pass

GetObject by VersionId and without it both return the stored version

tier-1versioningsource:msst-s3
versioning-0055 0.368s 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.401s pass

HeadObject with and without VersionId returns the version's metadata

tier-1versioningsource:msst-s3
versioning-0057 0.605s pass

HeadObject without VersionId returns the latest version

tier-1versioningsource:msst-s3
versioning-0058 0.642s 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.700s 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.375s pass

PutObject to a versioning-enabled bucket returns a non-empty VersionId

tier-1versioningsource:msst-s3
versioning-0061 0.513s pass

CopyObject with a versionId CopySource copies the specified (older) version

tier-1versioningcopysource:msst-s3
versioning-0062 0.815s pass

CopyObject onto an existing key in a versioned bucket creates a new version

tier-1versioningcopysource:msst-s3
versioning-0063 0.503s 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.364s pass

Deleting a delete marker restores visibility of the previous version

tier-1versioningsource:msst-s3
versioning-0065 0.403s pass

DeleteObject with versioning suspended returns 204 and existing versions remain readable

tier-3versioningsource:msst-s3
versioning-0066 0.440s pass

DeleteObjects with explicit version IDs permanently removes the delete marker and the object version

tier-1versioningerrorssource:msst-s3
versioning-0067 1.463s pass

DeleteObjects on a versioned bucket creates delete markers hiding all keys

tier-1versioningerrorssource:msst-s3
versioning-0068 1.108s pass

GetObject addressing a delete-marker version returns MethodNotAllowed

tier-1versioningerrorssource:msst-s3
versioning-0069 1.074s pass

GetObject without version ID on a key whose latest version is a delete marker returns NoSuchKey

tier-1versioningerrorssource:msst-s3
versioning-0070 0.384s pass

HeadObject on a delete-marker version returns 405; HeadObject without version returns 404

tier-1versioningerrorssource:msst-s3
versioning-0071 0.432s pass

Aborted multipart upload on a versioned bucket creates no version

tier-3versioningmultiparterrorssource:msst-s3
versioning-0072 0.955s pass

Multipart upload over existing versions creates a distinct third, latest version

tier-3versioningmultipartsource:msst-s3
versioning-0073 1.349s pass

CompleteMultipartUpload on a versioned bucket returns a VersionId

tier-1versioningmultipartsource:msst-s3
versioning-0074 0.631s pass

Multipart upload metadata and content type are preserved on the created version

tier-1versioningmultipartsource:msst-s3
versioning-0075 1.061s pass

UploadPartCopy from a specific source version copies that version's bytes

tier-1versioningmultipartcopysource:msst-s3
versioning-0076 0.341s 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.114s 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 0.781s 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 0.876s 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 0.687s pass

Three PUTs of one key on a versioned bucket yield three versions

tier-3versioningsource:msst-s3
versioning-0081 0.129s pass

New bucket reports no versioning status

tier-3versioningsource:msst-s3
versioning-0082 0.670s pass

Repeated puts create distinct retrievable versions, listed newest-first

tier-3versioningsource:msst-s3
versioning-0083 0.610s pass

Deleting a specific version leaves the other versions intact

tier-3versioningsource:msst-s3
versioning-0084 0.649s pass

Deleting current version creates a delete marker; removing it restores the object

tier-3versioningerrorssource:msst-s3
versioning-0085 0.320s pass

Suspending versioning makes a new put get the null version id

tier-3versioningsource:msst-s3
versioning-0086 0.613s pass

Each version retains its own user metadata

tier-1versioningsource:msst-s3
versioning-0087 0.527s pass

Copy the current object and copy a specific version by id

tier-1versioningcopysource:msst-s3
versioning-0088 1.807s pass

Two multipart uploads to one key create two independent versions

tier-1versioningmultipartsource:msst-s3
versioning-0089 0.358s pass

Delete marker hides object, version-id read bypasses it, removing the marker restores it

tier-1versioningerrorssource:msst-s3
versioning-0090 1.478s pass

Three put/delete cycles yield three versions and three delete markers

tier-3versioningsource:msst-s3
versioning-0091 1.466s pass

Deleting a non-current version preserves the remaining versions

tier-1versioningerrorssource:msst-s3
versioning-0092 0.358s 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.114s pass

CreateBucket with an empty Authorization header returns AccessDenied

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0002 0.114s pass

CreateBucket without an Authorization header returns AccessDenied

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0003 0.116s pass

CreateBucket with an empty Content-Length header returns 400

tier-2wire-headerserrorssource:ceph-s3-tests
wire-headers-0004 0.133s 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.153s pass

PutObject with an empty Authorization header returns 403

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0008 0.168s pass

PutObject without an Authorization header returns 403

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0009 0.137s pass

PutObject with an empty Content-Length header returns 400

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0010 0.124s pass

PutObject with a negative Content-Length header returns 400

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0011 0.298s pass

PutObject with an empty Content-Type succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0012 0.327s pass

PutObject with an ordinary Content-Type header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0013 0.311s pass

PutObject with an empty Expect header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0014 0.330s pass

PutObject without an Expect header succeeds

tier-1wire-headerssource:ceph-s3-tests
wire-headers-0015 0.140s pass

PutObject with a well-formed but non-matching Content-MD5 returns BadDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0016 0.111s pass

PutObject with an empty Content-MD5 header returns InvalidDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0017 0.114s pass

PutObject with a Content-MD5 that decodes to the wrong length returns InvalidDigest

tier-1wire-headerserrorssource:ceph-s3-tests
wire-headers-0018 0.003s 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.112s 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.205s 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-10-27 16:46:06 UTC
Total test time13m18s