{ "$schema": "../schema/vector.schema.json", "vectors": [ { "id": "listing-0001", "group": "listing", "kind": "api", "title": "ListObjectsV2 KeyCount matches the number of keys in the bucket", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L197", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "0", "body": "" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "1", "body": "" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "2", "body": "" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "3", "body": "" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "4", "body": "" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 5 } } } } ] }, { "id": "listing-0002", "group": "listing", "kind": "api", "title": "ListObjects with letter delimiter groups keys into common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L366", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "a" }, "expect": { "response": { "Delimiter": "a", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "ba" }, { "Prefix": "ca" } ] } } } } ] }, { "id": "listing-0003", "group": "listing", "kind": "api", "title": "ListObjects with slash delimiter rolls keys up into common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L207", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/bar/xyzzy", "body": "foo/bar/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux/thud", "body": "quux/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf", "body": "asdf" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": [ { "Prefix": "foo/" }, { "Prefix": "quux/" } ] } } } } ] }, { "id": "listing-0004", "group": "listing", "kind": "api", "title": "ListObjects with dot delimiter groups keys into common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L505", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b.ar", "body": "b.ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b.az", "body": "b.az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c.ab", "body": "c.ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "." }, "expect": { "response": { "Delimiter": ".", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b." }, { "Prefix": "c." } ] } } } } ] }, { "id": "listing-0005", "group": "listing", "kind": "api", "title": "ListObjects with empty delimiter behaves as no delimiter and echoes none", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L563", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "" }, "expect": { "response": { "Delimiter": { "$absent": true }, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0006", "group": "listing", "kind": "api", "title": "ListObjects without a delimiter returns all keys and echoes no delimiter", "tags": [ "tier-3", "listing", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L592", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Delimiter": { "$absent": true }, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0007", "group": "listing", "kind": "api", "title": "ListObjects with percent delimiter groups keys into common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L443", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b%ar", "body": "b%ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b%az", "body": "b%az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c%ab", "body": "c%ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "%" }, "expect": { "response": { "Delimiter": "%", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b%" }, { "Prefix": "c%" } ] } } } } ] }, { "id": "listing-0008", "group": "listing", "kind": "api", "title": "ListObjects delimiter and prefix pagination with Marker and NextMarker", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L312", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "asdf", "body": "asdf" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "boo/bar", "body": "boo/bar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "boo/baz/xyzzy", "body": "boo/baz/xyzzy" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "cquux/thud", "body": "cquux/thud" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "cquux/bla", "body": "cquux/bla" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "Marker": "", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": true, "NextMarker": "asdf", "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": { "$absent": true } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "Marker": "asdf", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": true, "NextMarker": "boo/", "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "boo/" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "Marker": "boo/", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": false, "NextMarker": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "cquux/" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "Marker": "", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": true, "NextMarker": "boo/", "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": [ { "Prefix": "boo/" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "Marker": "boo/", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "NextMarker": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "cquux/" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "Marker": "", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": true, "NextMarker": "boo/bar", "Contents": [ { "Key": "boo/bar" } ], "CommonPrefixes": { "$absent": true } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "Marker": "boo/bar", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": false, "NextMarker": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "boo/baz/" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "Marker": "", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "NextMarker": { "$absent": true }, "Contents": [ { "Key": "boo/bar" } ], "CommonPrefixes": [ { "Prefix": "boo/baz/" } ] } } } } ] }, { "id": "listing-0009", "group": "listing", "kind": "api", "title": "ListObjects with prefix ending in the delimiter returns the exact-match key", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L362", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "asdf/", "body": "asdf/" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "asdf/", "Marker": "", "MaxKeys": 1000 }, "expect": { "response": { "IsTruncated": false, "NextMarker": { "$absent": true }, "Contents": [ { "Key": "asdf/" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0010", "group": "listing", "kind": "api", "title": "ListObjects with newline delimiter matches no keys and returns all objects", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L536", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "\n" }, "expect": { "response": { "Delimiter": "\n", "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0011", "group": "listing", "kind": "api", "title": "ListObjects with whitespace delimiter groups keys into common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L474", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b ar", "body": "b ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b az", "body": "b az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c ab", "body": "c ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": " " }, "expect": { "response": { "Delimiter": " ", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b " }, { "Prefix": "c " } ] } } } } ] }, { "id": "listing-0012", "group": "listing", "kind": "api", "title": "Objects in one bucket do not appear when listing a different bucket", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L119", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "asdf", "body": "str" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b2.name}" }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0013", "group": "listing", "kind": "api", "title": "ListObjects with url encoding-type URL-encodes keys and common prefixes", "tags": [ "tier-3", "listing", "encoding", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L250", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo+1/bar", "body": "foo+1/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/bar/xyzzy", "body": "foo/bar/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux ab/thud", "body": "quux ab/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf+b", "body": "asdf+b" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "EncodingType": "url" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "asdf%2Bb" } ], "CommonPrefixes": [ { "Prefix": "foo%2B1/" }, { "Prefix": "foo/" }, { "Prefix": "quux+ab/" } ] } } } } ] }, { "id": "listing-0014", "group": "listing", "kind": "api", "title": "ListObjects paginates with MaxKeys and Marker", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L162", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "baz", "body": "baz" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "bar" }, { "Key": "baz" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "baz", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "Contents": [ { "Key": "foo" } ] } } } } ] }, { "id": "listing-0015", "group": "listing", "kind": "api", "title": "ListObjectsV2 with letter delimiter groups keys into common prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L383", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "a" }, "expect": { "response": { "Delimiter": "a", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "ba" }, { "Prefix": "ca" } ] } } } } ] }, { "id": "listing-0016", "group": "listing", "kind": "api", "title": "ListObjectsV2 with slash delimiter rolls keys up into common prefixes and counts them in KeyCount", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L221", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/bar/xyzzy", "body": "foo/bar/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux/thud", "body": "quux/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf", "body": "asdf" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": [ { "Prefix": "foo/" }, { "Prefix": "quux/" } ], "KeyCount": 3 } } } } ] }, { "id": "listing-0017", "group": "listing", "kind": "api", "title": "ListObjectsV2 with dot delimiter groups keys into common prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L521", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b.ar", "body": "b.ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b.az", "body": "b.az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c.ab", "body": "c.ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "." }, "expect": { "response": { "Delimiter": ".", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b." }, { "Prefix": "c." } ] } } } } ] }, { "id": "listing-0018", "group": "listing", "kind": "api", "title": "ListObjectsV2 with empty delimiter behaves as no delimiter and echoes none", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L578", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "" }, "expect": { "response": { "Delimiter": { "$absent": true }, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0019", "group": "listing", "kind": "api", "title": "ListObjectsV2 without a delimiter returns all keys and echoes no delimiter", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L607", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Delimiter": { "$absent": true }, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0020", "group": "listing", "kind": "api", "title": "ListObjectsV2 with percent delimiter groups keys into common prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L459", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b%ar", "body": "b%ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b%az", "body": "b%az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c%ab", "body": "c%ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "%" }, "expect": { "response": { "Delimiter": "%", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b%" }, { "Prefix": "c%" } ] } } } } ] }, { "id": "listing-0021", "group": "listing", "kind": "api", "title": "ListObjectsV2 delimiter and prefix pagination with continuation tokens", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L335", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "asdf", "body": "asdf" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "boo/bar", "body": "boo/bar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "boo/baz/xyzzy", "body": "boo/baz/xyzzy" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "cquux/thud", "body": "cquux/thud" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "cquux/bla", "body": "cquux/bla" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "StartAfter": "", "MaxKeys": 1 }, "capture": { "tok1": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "ContinuationToken": "${cap.tok1}", "MaxKeys": 1 }, "capture": { "tok2": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "boo/" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "ContinuationToken": "${cap.tok2}", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "cquux/" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "StartAfter": "", "MaxKeys": 2 }, "capture": { "tok3": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "asdf" } ], "CommonPrefixes": [ { "Prefix": "boo/" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "", "ContinuationToken": "${cap.tok3}", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "cquux/" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "StartAfter": "", "MaxKeys": 1 }, "capture": { "tok4": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "boo/bar" } ], "CommonPrefixes": { "$absent": true } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "ContinuationToken": "${cap.tok4}", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": { "$absent": true }, "CommonPrefixes": [ { "Prefix": "boo/baz/" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "boo/", "StartAfter": "", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": [ { "Key": "boo/bar" } ], "CommonPrefixes": [ { "Prefix": "boo/baz/" } ] } } } } ] }, { "id": "listing-0022", "group": "listing", "kind": "api", "title": "ListObjectsV2 with prefix ending in the delimiter returns the exact-match key", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L358", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "asdf/", "body": "asdf/" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "asdf/", "StartAfter": "", "MaxKeys": 1000 }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": [ { "Key": "asdf/" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0023", "group": "listing", "kind": "api", "title": "ListObjectsV2 with newline delimiter matches no keys and returns all objects", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L550", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "\n" }, "expect": { "response": { "Delimiter": "\n", "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0024", "group": "listing", "kind": "api", "title": "ListObjectsV2 with whitespace delimiter groups keys into common prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L490", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b ar", "body": "b ar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b az", "body": "b az" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c ab", "body": "c ab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": " " }, "expect": { "response": { "Delimiter": " ", "Contents": [ { "Key": "foo" } ], "CommonPrefixes": [ { "Prefix": "b " }, { "Prefix": "c " } ] } } } } ] }, { "id": "listing-0025", "group": "listing", "kind": "api", "title": "ListObjectsV2 with url encoding-type URL-encodes keys and common prefixes", "tags": [ "tier-1", "listing", "encoding", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L237", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo+1/bar", "body": "foo+1/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/bar/xyzzy", "body": "foo/bar/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux ab/thud", "body": "quux ab/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf+b", "body": "asdf+b" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "EncodingType": "url" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "asdf%2Bb" } ], "CommonPrefixes": [ { "Prefix": "foo%2B1/" }, { "Prefix": "foo/" }, { "Prefix": "quux+ab/" } ] } } } } ] }, { "id": "listing-0026", "group": "listing", "kind": "api", "title": "ListObjectsV2 with FetchOwner=true includes Owner in listed objects", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L622", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "FetchOwner": true }, "expect": { "response": { "Contents": [ { "Owner": { "$exists": true } }, {}, {} ] } } } } ] }, { "id": "listing-0027", "group": "listing", "kind": "api", "title": "ListObjectsV2 paginates with MaxKeys and StartAfter", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L180", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "baz", "body": "baz" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "bar" }, { "Key": "baz" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "baz", "MaxKeys": 2 }, "expect": { "response": { "IsTruncated": false, "Contents": [ { "Key": "foo" } ] } } } } ] }, { "id": "listing-0028", "group": "listing", "kind": "api", "title": "ListObjects with a delimiter matching no keys returns all keys and no common prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L651", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0029", "group": "listing", "kind": "api", "title": "ListObjects with MaxKeys=1 truncates after the first key and Marker resumes the listing", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L994", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "bar" } ] } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "bar" }, "expect": { "response": { "IsTruncated": false, "Contents": [ { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0030", "group": "listing", "kind": "api", "title": "ListObjects with MaxKeys=0 returns no keys and is not truncated", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1030", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 0 }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0031", "group": "listing", "kind": "api", "title": "ListObjects prefix filtering works on non-slash prefixes", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L725", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "ba" }, "expect": { "response": { "Prefix": "ba", "Contents": [ { "Key": "bar" }, { "Key": "baz" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0032", "group": "listing", "kind": "api", "title": "ListObjects with a directory prefix returns only keys under that prefix", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L697", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "foo/" }, "expect": { "response": { "Prefix": "foo/", "Contents": [ { "Key": "foo/bar" }, { "Key": "foo/baz" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0033", "group": "listing", "kind": "api", "title": "ListObjects prefix and delimiter logic works with non-slash delimiter", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L889", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bazar", "body": "bazar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "a", "Prefix": "ba" }, "expect": { "response": { "Prefix": "ba", "Delimiter": "a", "Contents": [ { "Key": "bar" } ], "CommonPrefixes": [ { "Prefix": "baza" } ] } } } } ] }, { "id": "listing-0034", "group": "listing", "kind": "api", "title": "ListObjects with prefix and delimiter returns direct keys and rolls up deeper keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L860", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz/xyzzy", "body": "foo/baz/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux/thud", "body": "quux/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf", "body": "asdf" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "foo/" }, "expect": { "response": { "Prefix": "foo/", "Delimiter": "/", "Contents": [ { "Key": "foo/bar" } ], "CommonPrefixes": [ { "Prefix": "foo/baz/" } ] } } } } ] }, { "id": "listing-0035", "group": "listing", "kind": "api", "title": "ListObjects with a matching prefix but non-matching delimiter returns all prefixed keys uncollapsed", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L943", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b/a/c", "body": "b/a/c" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b/a/g", "body": "b/a/g" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "b/a/r", "body": "b/a/r" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "g", "body": "g" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "z", "Prefix": "b" }, "expect": { "response": { "Contents": [ { "Key": "b/a/c" }, { "Key": "b/a/g" }, { "Key": "b/a/r" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0036", "group": "listing", "kind": "api", "title": "ListObjects with non-matching prefix and non-matching delimiter returns an empty listing", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L968", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b/a/c", "body": "b/a/c" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b/a/g", "body": "b/a/g" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "b/a/r", "body": "b/a/r" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "g", "body": "g" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Delimiter": "z", "Prefix": "y" }, "expect": { "response": { "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0037", "group": "listing", "kind": "api", "title": "ListObjects with an empty prefix returns all keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L752", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "" }, "expect": { "response": { "Prefix": "", "Contents": [ { "Key": "foo/bar" }, { "Key": "foo/baz" }, { "Key": "quux" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0038", "group": "listing", "kind": "api", "title": "ListObjects with a prefix matching no keys returns an empty listing", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L806", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "d" }, "expect": { "response": { "Prefix": "d", "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0039", "group": "listing", "kind": "api", "title": "ListObjects with an unprintable (newline) prefix returns an empty listing and echoes the prefix", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L833", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "\n" }, "expect": { "response": { "Prefix": "\n", "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0040", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a delimiter matching no keys returns all keys and no common prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L666", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "Delimiter": "/", "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "cab" }, { "Key": "foo" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0041", "group": "listing", "kind": "api", "title": "ListObjectsV2 without FetchOwner omits Owner from listed objects", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L632", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Owner": { "$absent": true } }, {}, {} ] } } } } ] }, { "id": "listing-0042", "group": "listing", "kind": "api", "title": "ListObjectsV2 with FetchOwner=false omits Owner from listed objects", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L642", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "FetchOwner": false }, "expect": { "response": { "Contents": [ { "Owner": { "$absent": true } }, {}, {} ] } } } } ] }, { "id": "listing-0043", "group": "listing", "kind": "api", "title": "ListObjectsV2 with MaxKeys=1 truncates after the first key and StartAfter resumes the listing", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1013", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 1 }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "bar" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "bar" }, "expect": { "response": { "IsTruncated": false, "Contents": [ { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0044", "group": "listing", "kind": "api", "title": "ListObjectsV2 prefix filtering works on non-slash prefixes", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L739", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "ba" }, "expect": { "response": { "Prefix": "ba", "Contents": [ { "Key": "bar" }, { "Key": "baz" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0045", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a directory prefix returns only keys under that prefix", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L711", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "foo/" }, "expect": { "response": { "Prefix": "foo/", "Contents": [ { "Key": "foo/bar" }, { "Key": "foo/baz" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0046", "group": "listing", "kind": "api", "title": "ListObjectsV2 prefix and delimiter logic works with non-slash delimiter", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L904", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "bazar", "body": "bazar" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "cab", "body": "cab" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "a", "Prefix": "ba" }, "expect": { "response": { "Prefix": "ba", "Delimiter": "a", "Contents": [ { "Key": "bar" } ], "CommonPrefixes": [ { "Prefix": "baza" } ] } } } } ] }, { "id": "listing-0047", "group": "listing", "kind": "api", "title": "ListObjectsV2 with prefix and delimiter returns direct keys and rolls up deeper keys", "tags": [ "tier-1", "listing", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L875", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz/xyzzy", "body": "foo/baz/xyzzy" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux/thud", "body": "quux/thud" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "asdf", "body": "asdf" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "Prefix": "foo/" }, "expect": { "response": { "Prefix": "foo/", "Delimiter": "/", "Contents": [ { "Key": "foo/bar" } ], "CommonPrefixes": [ { "Prefix": "foo/baz/" } ] } } } } ] }, { "id": "listing-0048", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a matching prefix but non-matching delimiter returns all prefixed keys uncollapsed", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L956", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b/a/c", "body": "b/a/c" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b/a/g", "body": "b/a/g" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "b/a/r", "body": "b/a/r" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "g", "body": "g" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "z", "Prefix": "b" }, "expect": { "response": { "Contents": [ { "Key": "b/a/c" }, { "Key": "b/a/g" }, { "Key": "b/a/r" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0049", "group": "listing", "kind": "api", "title": "ListObjectsV2 with non-matching prefix and non-matching delimiter returns an empty listing", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L981", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "b/a/c", "body": "b/a/c" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b/a/g", "body": "b/a/g" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "b/a/r", "body": "b/a/r" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "g", "body": "g" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "z", "Prefix": "y" }, "expect": { "response": { "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0050", "group": "listing", "kind": "api", "title": "ListObjectsV2 with an empty prefix returns all keys", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L766", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "" }, "expect": { "response": { "Prefix": "", "Contents": [ { "Key": "foo/bar" }, { "Key": "foo/baz" }, { "Key": "quux" } ], "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0051", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a prefix matching no keys returns an empty listing", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L820", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "d" }, "expect": { "response": { "Prefix": "d", "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0052", "group": "listing", "kind": "api", "title": "ListObjectsV2 with an unprintable (newline) prefix returns an empty listing and echoes the prefix", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L847", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar", "body": "foo/bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "foo/baz", "body": "foo/baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "quux", "body": "quux" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "\n" }, "expect": { "response": { "Prefix": "\n", "Contents": { "$absent": true }, "CommonPrefixes": { "$absent": true } } } } } ] }, { "id": "listing-0053", "group": "listing", "kind": "api", "title": "ListObjects marker past the last key returns no keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1367", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "zzz" }, "expect": { "response": { "Marker": "zzz", "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0054", "group": "listing", "kind": "api", "title": "ListObjects with an empty marker returns all keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1266", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "" }, "expect": { "response": { "Marker": "", "IsTruncated": false, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0055", "group": "listing", "kind": "api", "title": "ListObjects without a marker echoes an empty Marker", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1257", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Marker": "" } } } } ] }, { "id": "listing-0056", "group": "listing", "kind": "api", "title": "ListObjects marker between keys starts listing after its sort position", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1346", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "blah" }, "expect": { "response": { "Marker": "blah", "Contents": [ { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0057", "group": "listing", "kind": "api", "title": "ListObjects with an unprintable marker echoes it and returns all keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1323", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "\n" }, "expect": { "response": { "Marker": "\n", "IsTruncated": false, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0058", "group": "listing", "kind": "api", "title": "ListObjects with non-numeric max-keys returns InvalidArgument", "tags": [ "tier-3", "listing", "errors", "wire-headers", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1239", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$http": { "method": "GET", "path": "/${res.b1.name}", "query": { "max-keys": "blah" }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "listing-0059", "group": "listing", "kind": "api", "title": "ListObjects default MaxKeys is 1000 and returns all keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1053", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "IsTruncated": false, "MaxKeys": 1000, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0060", "group": "listing", "kind": "api", "title": "Anonymous ListObjects succeeds on a public-read bucket", "tags": [ "tier-3", "listing", "acl", "anon-access", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1468", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutBucketAcl", "params": { "Bucket": "${res.b1.name}", "ACL": "public-read" } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "identity": "anonymous" } } ] }, { "id": "listing-0061", "group": "listing", "kind": "api", "title": "Anonymous ListObjects on a private bucket returns AccessDenied", "tags": [ "tier-3", "listing", "errors", "anon-access", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1485", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "identity": "anonymous", "expect": { "status": 403, "error": "AccessDenied" } } } ] }, { "id": "listing-0062", "group": "listing", "kind": "api", "title": "ListObjects entries carry the per-object ETag, Size and Owner", "description": "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.", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1400", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "capture": { "ownerId1": "Owner.ID", "ownerName1": "Owner.DisplayName" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "baz" }, "capture": { "ownerId2": "Owner.ID", "ownerName2": "Owner.DisplayName" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "ownerId3": "Owner.ID", "ownerName3": "Owner.DisplayName" } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": [ { "Key": "bar", "ETag": "${cap.etag1}", "Size": 3, "Owner": { "ID": "${cap.ownerId1}", "DisplayName": "${cap.ownerName1}" } }, { "Key": "baz", "ETag": "${cap.etag2}", "Size": 3, "Owner": { "ID": "${cap.ownerId2}", "DisplayName": "${cap.ownerName2}" } }, { "Key": "foo", "ETag": "${cap.etag3}", "Size": 3, "Owner": { "ID": "${cap.ownerId3}", "DisplayName": "${cap.ownerName3}" } } ] } } } } ] }, { "id": "listing-0063", "group": "listing", "kind": "api", "title": "ListObjectVersions entries carry the per-object ETag, Size, Owner and VersionId", "description": "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.", "tags": [ "tier-3", "listing", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1432", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "capture": { "etag1": "ETag", "versionId1": "VersionId" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "capture": { "ownerId1": "Owner.ID", "ownerName1": "Owner.DisplayName" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz" }, "capture": { "etag2": "ETag", "versionId2": "VersionId" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "baz" }, "capture": { "ownerId2": "Owner.ID", "ownerName2": "Owner.DisplayName" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "etag3": "ETag", "versionId3": "VersionId" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "ownerId3": "Owner.ID", "ownerName3": "Owner.DisplayName" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "bar", "ETag": "${cap.etag1}", "Size": 3, "VersionId": "${cap.versionId1}", "Owner": { "ID": "${cap.ownerId1}", "DisplayName": "${cap.ownerName1}" } }, { "Key": "baz", "ETag": "${cap.etag2}", "Size": 3, "VersionId": "${cap.versionId2}", "Owner": { "ID": "${cap.ownerId2}", "DisplayName": "${cap.ownerName2}" } }, { "Key": "foo", "ETag": "${cap.etag3}", "Size": 3, "VersionId": "${cap.versionId3}", "Owner": { "ID": "${cap.ownerId3}", "DisplayName": "${cap.ownerName3}" } } ] } } } } ] }, { "id": "listing-0064", "group": "listing", "kind": "api", "title": "ListObjects with an underscore-prefixed key prefix returns the matching keys", "tags": [ "tier-3", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L5501", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "_bla/1", "body": "_bla/1" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "_bla/2", "body": "_bla/2" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "_bla/3", "body": "_bla/3" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "_bla/4", "body": "_bla/4" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "abcd", "body": "abcd" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Contents": { "$length": 5 } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "_bla/" }, "expect": { "response": { "Contents": { "$length": 4 } } } } } ] }, { "id": "listing-0065", "group": "listing", "kind": "api", "title": "ListObjectsV2 with both ContinuationToken and StartAfter resumes from the token", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1307", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "bar", "MaxKeys": 1 }, "capture": { "token": "NextContinuationToken" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "bar", "ContinuationToken": "${cap.token}" }, "expect": { "response": { "ContinuationToken": "${cap.token}", "IsTruncated": false, "Contents": [ { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0066", "group": "listing", "kind": "api", "title": "ListObjectsV2 resumes listing from NextContinuationToken", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1290", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 1 }, "capture": { "token": "NextContinuationToken" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "ContinuationToken": "${cap.token}" }, "expect": { "response": { "ContinuationToken": "${cap.token}", "IsTruncated": false, "Contents": [ { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0067", "group": "listing", "kind": "api", "title": "ListObjectsV2 with an empty ContinuationToken returns InvalidArgument", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1278", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "ContinuationToken": "" }, "expect": { "status": 400, "error": "InvalidArgument" } } } ], "description": "AWS rejects an empty continuation token with 400 InvalidArgument (verified against AWS S3); an empty token is not treated as \"no token\"." }, { "id": "listing-0068", "group": "listing", "kind": "api", "title": "ListObjectsV2 default MaxKeys is 1000 and returns all keys", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1065", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "IsTruncated": false, "MaxKeys": 1000, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0069", "group": "listing", "kind": "api", "title": "ListObjectsV2 with MaxKeys=0 returns no keys and is not truncated", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1042", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 0 }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0070", "group": "listing", "kind": "api", "title": "Anonymous ListObjectsV2 succeeds on a public-read bucket", "tags": [ "tier-3", "listing", "acl", "anon-access", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1477", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutBucketAcl", "params": { "Bucket": "${res.b1.name}", "ACL": "public-read" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "identity": "anonymous" } } ] }, { "id": "listing-0071", "group": "listing", "kind": "api", "title": "Anonymous ListObjectsV2 on a private bucket returns AccessDenied", "tags": [ "tier-1", "listing", "errors", "anon-access", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1496", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "identity": "anonymous", "expect": { "status": 403, "error": "AccessDenied" } } } ] }, { "id": "listing-0072", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter past the last key returns no keys", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1379", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "zzz" }, "expect": { "response": { "StartAfter": "zzz", "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0073", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter between keys starts listing after its sort position", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1357", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "blah" }, "expect": { "response": { "StartAfter": "blah", "Contents": [ { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0074", "group": "listing", "kind": "api", "title": "ListObjectsV2 with an unprintable StartAfter echoes it and returns all keys", "tags": [ "tier-1", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L1335", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bar", "body": "bar" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "baz", "body": "baz" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "foo", "body": "foo" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "quxx", "body": "quxx" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "\n" }, "expect": { "response": { "StartAfter": "\n", "IsTruncated": false, "Contents": [ { "Key": "bar" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "quxx" } ] } } } } ] }, { "id": "listing-0075", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a prefix returns all 10 seeded objects", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/66.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "batch/object-0000.txt", "body": "Batch content" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "batch/object-0001.txt", "body": "Batch content" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "batch/object-0002.txt", "body": "Batch content" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "batch/object-0003.txt", "body": "Batch content" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "batch/object-0004.txt", "body": "Batch content" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "batch/object-0005.txt", "body": "Batch content" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "batch/object-0006.txt", "body": "Batch content" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "batch/object-0007.txt", "body": "Batch content" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "batch/object-0008.txt", "body": "Batch content" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "batch/object-0009.txt", "body": "Batch content" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "batch/", "MaxKeys": 1000 }, "expect": { "response": { "Contents": { "$length": 10 } } } } } ] }, { "id": "listing-0076", "group": "listing", "kind": "api", "title": "ListObjectsV2 accepts an empty Prefix and an empty Delimiter", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_empty_operations.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "" } } } ] }, { "id": "listing-0077", "group": "listing", "kind": "api", "title": "ListObjects (v1) on an empty bucket returns no contents and is not truncated", "description": "The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.", "tags": [ "tier-3", "listing", "source:msst-s3", "source:ceph-s3-tests" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L382", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0078", "group": "listing", "kind": "api", "title": "ListObjects (v1) with negative MaxKeys is rejected", "description": "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.", "tags": [ "tier-3", "listing", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L178", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": -1 }, "expect": { "status": 400 } } } ] }, { "id": "listing-0079", "group": "listing", "kind": "api", "title": "ListObjects (v1) Marker need not be an existing key", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L276", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-a", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj-c", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj-e", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Marker": "obj-b" }, "expect": { "response": { "Contents": [ { "Key": "obj-c" }, { "Key": "obj-e" } ] } } } } ] }, { "id": "listing-0080", "group": "listing", "kind": "api", "title": "ListObjects (v1) with MaxKeys=0 returns no objects and is not truncated", "description": "The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L203", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-0", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj-1", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj-2", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 0 }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0081", "group": "listing", "kind": "api", "title": "ListObjects (v1) Prefix on a nested hierarchy returns only keys under the prefix", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L344", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "a/b/c/file1.txt", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "a/b/file2.txt", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "a/file3.txt", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "file4.txt", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "a/b/" }, "expect": { "response": { "Contents": [ { "Key": "a/b/c/file1.txt" }, { "Key": "a/b/file2.txt" } ] } } } } ] }, { "id": "listing-0082", "group": "listing", "kind": "api", "title": "ListObjects (v1) on a non-existing bucket returns NoSuchBucket", "tags": [ "tier-3", "listing", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L33", "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "non-existing-bucket-12345" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "listing-0083", "group": "listing", "kind": "api", "title": "ListObjects (v1) sets IsTruncated when MaxKeys is smaller than the object count", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L141", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "object-0", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "object-1", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "object-2", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "object-3", "body": "data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "object-4", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3 }, "expect": { "response": { "IsTruncated": true, "Contents": { "$length": 3 } } } } }, { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "IsTruncated": false, "Contents": { "$length": 5 } } } } } ] }, { "id": "listing-0084", "group": "listing", "kind": "api", "title": "ListObjects (v1) with Prefix returns only matching keys and echoes the prefix", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v1.py#L55", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj/bar", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj/baz/bla", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj/foo", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "azy/csf", "body": "data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "hell", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "Prefix": "obj" }, "expect": { "response": { "Prefix": "obj", "Contents": [ { "Key": "obj/bar" }, { "Key": "obj/baz/bla" }, { "Key": "obj/foo" } ] } } } } ] }, { "id": "listing-0085", "group": "listing", "kind": "api", "title": "ListObjectsV2 returns empty results for an empty bucket and a non-matching prefix", "description": "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.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L457", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "test", "Body": "data" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "nonexistent-prefix/" }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0086", "group": "listing", "kind": "api", "title": "ListObjectsV2 with negative MaxKeys is rejected", "description": "The original test accepts error code InvalidArgument or InvalidRequest; code alternation is not expressible, so only the 400 status is asserted.", "tags": [ "tier-1", "listing", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L519", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": -1 }, "expect": { "status": 400 } } } ] }, { "id": "listing-0087", "group": "listing", "kind": "api", "title": "ListObjectsV2 accepts MaxKeys above the 1000 cap", "description": "MaxKeys=2000 must succeed; with 10 objects in the bucket all 10 are returned (the original test asserted at most 1000).", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L304", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-0", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj-1", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj-2", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "obj-3", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "obj-4", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "obj-5", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "obj-6", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "obj-7", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "obj-8", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "obj-9", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 2000 }, "expect": { "response": { "Contents": { "$length": 10 } } } } } ] }, { "id": "listing-0088", "group": "listing", "kind": "api", "title": "ListObjectsV2 with MaxKeys=0 returns no objects", "description": "The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L335", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-0", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj-1", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj-2", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "obj-3", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "obj-4", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 0 }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0089", "group": "listing", "kind": "api", "title": "ListObjectsV2 with Delimiter navigates a nested hierarchy level by level", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L401", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "a/b/c/file1.txt", "body": "nested content" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "a/b/c/file2.txt", "body": "nested content" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "a/b/file3.txt", "body": "nested content" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "a/file4.txt", "body": "nested content" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "file5.txt", "body": "nested content" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "Contents": { "$contains": { "Key": "file5.txt" } }, "CommonPrefixes": { "$contains": { "Prefix": "a/" } } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "a/", "Delimiter": "/" }, "expect": { "response": { "Contents": { "$contains": { "Key": "a/file4.txt" } }, "CommonPrefixes": { "$contains": { "Prefix": "a/b/" } } } } } } ] }, { "id": "listing-0090", "group": "listing", "kind": "api", "title": "ListObjectsV2 paginates 25 objects in three pages via NextContinuationToken", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L105", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "object-000", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "object-001", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "object-002", "body": "data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "object-003", "body": "data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "object-004", "body": "data" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "object-005", "body": "data" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "object-006", "body": "data" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "object-007", "body": "data" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "object-008", "body": "data" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "object-009", "body": "data" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "object-010", "body": "data" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "object-011", "body": "data" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "object-012", "body": "data" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "object-013", "body": "data" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "object-014", "body": "data" } }, { "$object": { "handle": "o16", "bucket": "b1", "key": "object-015", "body": "data" } }, { "$object": { "handle": "o17", "bucket": "b1", "key": "object-016", "body": "data" } }, { "$object": { "handle": "o18", "bucket": "b1", "key": "object-017", "body": "data" } }, { "$object": { "handle": "o19", "bucket": "b1", "key": "object-018", "body": "data" } }, { "$object": { "handle": "o20", "bucket": "b1", "key": "object-019", "body": "data" } }, { "$object": { "handle": "o21", "bucket": "b1", "key": "object-020", "body": "data" } }, { "$object": { "handle": "o22", "bucket": "b1", "key": "object-021", "body": "data" } }, { "$object": { "handle": "o23", "bucket": "b1", "key": "object-022", "body": "data" } }, { "$object": { "handle": "o24", "bucket": "b1", "key": "object-023", "body": "data" } }, { "$object": { "handle": "o25", "bucket": "b1", "key": "object-024", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 10 }, "capture": { "token1": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "NextContinuationToken": { "$exists": true }, "Contents": [ { "Key": "object-000" }, { "Key": "object-001" }, { "Key": "object-002" }, { "Key": "object-003" }, { "Key": "object-004" }, { "Key": "object-005" }, { "Key": "object-006" }, { "Key": "object-007" }, { "Key": "object-008" }, { "Key": "object-009" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 10, "ContinuationToken": "${cap.token1}" }, "capture": { "token2": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "object-010" }, { "Key": "object-011" }, { "Key": "object-012" }, { "Key": "object-013" }, { "Key": "object-014" }, { "Key": "object-015" }, { "Key": "object-016" }, { "Key": "object-017" }, { "Key": "object-018" }, { "Key": "object-019" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 10, "ContinuationToken": "${cap.token2}" }, "expect": { "response": { "IsTruncated": false, "NextContinuationToken": { "$absent": true }, "Contents": [ { "Key": "object-020" }, { "Key": "object-021" }, { "Key": "object-022" }, { "Key": "object-023" }, { "Key": "object-024" } ] } } } } ] }, { "id": "listing-0091", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter beyond all keys returns an empty result", "description": "The original test accepts an absent or empty Contents list; absence (AWS behavior) is asserted here.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L490", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "a", "body": "data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "b", "body": "data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "c", "body": "data" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "z" }, "expect": { "response": { "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0092", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter need not be an existing key", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L69", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "a-file", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "c-file", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "e-file", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "b-file" }, "expect": { "response": { "Contents": [ { "Key": "c-file" }, { "Key": "e-file" } ] } } } } ] }, { "id": "listing-0093", "group": "listing", "kind": "api", "title": "ListObjectsV2 truncates when common prefixes exceed MaxKeys", "description": "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).", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L268", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "folder-00/file.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "folder-01/file.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "folder-02/file.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "folder-03/file.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "folder-04/file.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "folder-05/file.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "folder-06/file.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "folder-07/file.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "folder-08/file.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "folder-09/file.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "folder-10/file.txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "folder-11/file.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "folder-12/file.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "folder-13/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "folder-14/file.txt", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/", "MaxKeys": 10 }, "expect": { "response": { "IsTruncated": true, "CommonPrefixes": { "$length": 10 } } } } } ] }, { "id": "listing-0094", "group": "listing", "kind": "api", "title": "ListObjectsV2 with FetchOwner returns the single object listing", "description": "The original test only checks Owner sub-fields conditionally when Owner is present, so only the Contents count is asserted.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L366", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test-obj", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "FetchOwner": true }, "expect": { "response": { "Contents": { "$length": 1 } } } } } ] }, { "id": "listing-0095", "group": "listing", "kind": "api", "title": "ListObjectsV2 Prefix filter returns only keys under each prefix", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L169", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "logs/2024-01-01.log", "body": "content" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "logs/2024-01-02.log", "body": "content" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "data/file1.csv", "body": "content" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "data/file2.csv", "body": "content" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "images/photo.jpg", "body": "content" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "logs/" }, "expect": { "response": { "Contents": [ { "Key": "logs/2024-01-01.log" }, { "Key": "logs/2024-01-02.log" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "data/" }, "expect": { "response": { "Contents": [ { "Key": "data/file1.csv" }, { "Key": "data/file2.csv" } ] } } } } ] }, { "id": "listing-0096", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter returns only keys strictly after the given key", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_objects_v2.py#L31", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj-000", "body": "test data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj-001", "body": "test data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj-002", "body": "test data" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "obj-003", "body": "test data" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "obj-004", "body": "test data" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "obj-005", "body": "test data" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "obj-006", "body": "test data" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "obj-007", "body": "test data" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "obj-008", "body": "test data" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "obj-009", "body": "test data" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "obj-004" }, "expect": { "response": { "Contents": [ { "Key": "obj-005" }, { "Key": "obj-006" }, { "Key": "obj-007" }, { "Key": "obj-008" }, { "Key": "obj-009" } ] } } } } ] }, { "id": "listing-0097", "group": "listing", "kind": "api", "title": "ListObjectsV2 MaxKeys limits the page and sets IsTruncated", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 5 }, "expect": { "response": { "KeyCount": 5, "IsTruncated": true } } } } ] }, { "id": "listing-0098", "group": "listing", "kind": "api", "title": "ListObjectsV2 continuation tokens page through all 15 objects in 5 pages", "description": "Original test looped with ContinuationToken until IsTruncated was false and checked all 15 keys were returned; unrolled here as 5 pages of 3.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3 }, "capture": { "t1": "NextContinuationToken" }, "expect": { "response": { "KeyCount": 3, "IsTruncated": true } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3, "ContinuationToken": "${cap.t1}" }, "capture": { "t2": "NextContinuationToken" }, "expect": { "response": { "KeyCount": 3, "IsTruncated": true } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3, "ContinuationToken": "${cap.t2}" }, "capture": { "t3": "NextContinuationToken" }, "expect": { "response": { "KeyCount": 3, "IsTruncated": true } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3, "ContinuationToken": "${cap.t3}" }, "capture": { "t4": "NextContinuationToken" }, "expect": { "response": { "KeyCount": 3, "IsTruncated": true } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 3, "ContinuationToken": "${cap.t4}" }, "expect": { "response": { "KeyCount": 3, "IsTruncated": false } } } } ] }, { "id": "listing-0099", "group": "listing", "kind": "api", "title": "ListObjectsV2 with delimiter rolls directories into CommonPrefixes", "description": "Original test asserted at least the 3 expected directory prefixes; AWS returns exactly dir1/, dir2/ and special/ sorted.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "response": { "CommonPrefixes": [ { "Prefix": "dir1/" }, { "Prefix": "dir2/" }, { "Prefix": "special/" } ] } } } } ] }, { "id": "listing-0100", "group": "listing", "kind": "api", "title": "ListObjectsV2 with Prefix returns only matching keys", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "dir1/" }, "expect": { "response": { "Contents": { "$length": 5 } } } } } ] }, { "id": "listing-0101", "group": "listing", "kind": "api", "title": "ListObjectsV2 with Prefix and Delimiter returns subdirectory CommonPrefixes", "description": "Original test asserted dir1/subdir1/ and dir1/subdir2/ both appear in CommonPrefixes.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "dir1/", "Delimiter": "/" }, "expect": { "response": { "CommonPrefixes": [ { "Prefix": "dir1/subdir1/" }, { "Prefix": "dir1/subdir2/" } ] } } } } ] }, { "id": "listing-0102", "group": "listing", "kind": "api", "title": "ListObjectsV2 StartAfter skips keys up to and including the marker", "description": "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.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "StartAfter": "dir1/file1.txt" }, "expect": { "response": { "KeyCount": 13, "Contents": { "$contains": { "Key": "dir1/file2.txt" } } } } } } ] }, { "id": "listing-0103", "group": "listing", "kind": "api", "title": "ListObjectsV2 on an empty bucket returns KeyCount 0 and no Contents", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 0, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0104", "group": "listing", "kind": "api", "title": "ListObjectsV2 with a prefix lists keys containing special characters", "tags": [ "tier-1", "listing", "encoding", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "special/" }, "expect": { "response": { "Contents": { "$contains": { "Key": "special/!@#$%^&().txt" } } } } } } ] }, { "id": "listing-0105", "group": "listing", "kind": "api", "title": "ListObjects (v1) and ListObjectsV2 return the same count for MaxKeys 5", "tags": [ "tier-3", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjects", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 5 }, "expect": { "response": { "Contents": { "$length": 5 } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 5 }, "expect": { "response": { "KeyCount": 5 } } } } ] }, { "id": "listing-0106", "group": "listing", "kind": "api", "title": "ListObjectsV2 with FetchOwner includes Owner in Contents entries", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_listing_edge_cases.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "file1.txt", "body": "test" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "file2.txt", "body": "test" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "dir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "dir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "dir1/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "dir1/subdir1/file2.txt", "body": "test" } }, { "$object": { "handle": "o7", "bucket": "b1", "key": "dir1/subdir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o8", "bucket": "b1", "key": "dir2/file1.txt", "body": "test" } }, { "$object": { "handle": "o9", "bucket": "b1", "key": "dir2/file2.txt", "body": "test" } }, { "$object": { "handle": "o10", "bucket": "b1", "key": "dir2/subdir1/file1.txt", "body": "test" } }, { "$object": { "handle": "o11", "bucket": "b1", "key": "special/!@#$%^&().txt", "body": "test" } }, { "$object": { "handle": "o12", "bucket": "b1", "key": "special/unicode-🚀.txt", "body": "test" } }, { "$object": { "handle": "o13", "bucket": "b1", "key": "special/..hidden.txt", "body": "test" } }, { "$object": { "handle": "o14", "bucket": "b1", "key": "special/.hidden/file.txt", "body": "test" } }, { "$object": { "handle": "o15", "bucket": "b1", "key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "body": "test" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "FetchOwner": true, "MaxKeys": 1 }, "expect": { "response": { "Contents": [ { "Owner": { "$exists": true } } ] } } } } ] }, { "id": "listing-0107", "group": "listing", "kind": "api", "title": "100 small objects in one bucket are all reported by ListObjectsV2", "description": "Source asserted KeyCount >= 100; the bucket contains exactly 100 objects so KeyCount 100 is the equivalent assertion.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_size_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-000", "Body": "Object number 0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-001", "Body": "Object number 1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-002", "Body": "Object number 2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-003", "Body": "Object number 3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-004", "Body": "Object number 4" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-005", "Body": "Object number 5" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-006", "Body": "Object number 6" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-007", "Body": "Object number 7" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-008", "Body": "Object number 8" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-009", "Body": "Object number 9" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-010", "Body": "Object number 10" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-011", "Body": "Object number 11" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-012", "Body": "Object number 12" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-013", "Body": "Object number 13" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-014", "Body": "Object number 14" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-015", "Body": "Object number 15" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-016", "Body": "Object number 16" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-017", "Body": "Object number 17" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-018", "Body": "Object number 18" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-019", "Body": "Object number 19" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-020", "Body": "Object number 20" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-021", "Body": "Object number 21" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-022", "Body": "Object number 22" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-023", "Body": "Object number 23" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-024", "Body": "Object number 24" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-025", "Body": "Object number 25" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-026", "Body": "Object number 26" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-027", "Body": "Object number 27" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-028", "Body": "Object number 28" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-029", "Body": "Object number 29" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-030", "Body": "Object number 30" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-031", "Body": "Object number 31" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-032", "Body": "Object number 32" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-033", "Body": "Object number 33" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-034", "Body": "Object number 34" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-035", "Body": "Object number 35" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-036", "Body": "Object number 36" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-037", "Body": "Object number 37" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-038", "Body": "Object number 38" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-039", "Body": "Object number 39" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-040", "Body": "Object number 40" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-041", "Body": "Object number 41" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-042", "Body": "Object number 42" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-043", "Body": "Object number 43" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-044", "Body": "Object number 44" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-045", "Body": "Object number 45" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-046", "Body": "Object number 46" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-047", "Body": "Object number 47" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-048", "Body": "Object number 48" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-049", "Body": "Object number 49" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-050", "Body": "Object number 50" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-051", "Body": "Object number 51" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-052", "Body": "Object number 52" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-053", "Body": "Object number 53" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-054", "Body": "Object number 54" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-055", "Body": "Object number 55" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-056", "Body": "Object number 56" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-057", "Body": "Object number 57" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-058", "Body": "Object number 58" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-059", "Body": "Object number 59" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-060", "Body": "Object number 60" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-061", "Body": "Object number 61" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-062", "Body": "Object number 62" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-063", "Body": "Object number 63" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-064", "Body": "Object number 64" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-065", "Body": "Object number 65" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-066", "Body": "Object number 66" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-067", "Body": "Object number 67" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-068", "Body": "Object number 68" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-069", "Body": "Object number 69" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-070", "Body": "Object number 70" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-071", "Body": "Object number 71" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-072", "Body": "Object number 72" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-073", "Body": "Object number 73" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-074", "Body": "Object number 74" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-075", "Body": "Object number 75" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-076", "Body": "Object number 76" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-077", "Body": "Object number 77" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-078", "Body": "Object number 78" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-079", "Body": "Object number 79" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-080", "Body": "Object number 80" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-081", "Body": "Object number 81" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-082", "Body": "Object number 82" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-083", "Body": "Object number 83" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-084", "Body": "Object number 84" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-085", "Body": "Object number 85" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-086", "Body": "Object number 86" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-087", "Body": "Object number 87" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-088", "Body": "Object number 88" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-089", "Body": "Object number 89" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-090", "Body": "Object number 90" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-091", "Body": "Object number 91" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-092", "Body": "Object number 92" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-093", "Body": "Object number 93" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-094", "Body": "Object number 94" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-095", "Body": "Object number 95" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-096", "Body": "Object number 96" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-097", "Body": "Object number 97" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-098", "Body": "Object number 98" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-objects-099", "Body": "Object number 99" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "KeyCount": 100 } } } } ] }, { "id": "listing-0108", "group": "listing", "kind": "api", "title": "ListObjectsV2 pagination returns every key exactly once in order", "description": "Listing with a small MaxKeys and following ContinuationToken returns all keys across pages with no duplicates or omissions, in lexical order.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3004.py#L200", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "paginated/object-00000.dat", "body": "data-0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "paginated/object-00001.dat", "body": "data-1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "paginated/object-00002.dat", "body": "data-2" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "paginated/object-00003.dat", "body": "data-3" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "paginated/object-00004.dat", "body": "data-4" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "paginated/", "MaxKeys": 2 }, "capture": { "t1": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "paginated/object-00000.dat" }, { "Key": "paginated/object-00001.dat" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "paginated/", "MaxKeys": 2, "ContinuationToken": "${cap.t1}" }, "capture": { "t2": "NextContinuationToken" }, "expect": { "response": { "IsTruncated": true, "Contents": [ { "Key": "paginated/object-00002.dat" }, { "Key": "paginated/object-00003.dat" } ] } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "paginated/", "MaxKeys": 2, "ContinuationToken": "${cap.t2}" }, "expect": { "response": { "IsTruncated": false, "Contents": [ { "Key": "paginated/object-00004.dat" } ] } } } } ] }, { "id": "listing-0109", "group": "listing", "kind": "api", "title": "Deleted objects do not appear in ListObjectsV2 (no phantoms)", "description": "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.", "tags": [ "tier-1", "listing", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3015.py#L280", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "temp/temp-0000.dat", "body": "temp-0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "temp/temp-0001.dat", "body": "temp-1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "temp/temp-0002.dat", "body": "temp-2" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "temp/temp-0003.dat", "body": "temp-3" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "temp/temp-0004.dat", "body": "temp-4" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "temp/" }, "expect": { "status": 200, "response": { "KeyCount": 5 } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "temp/temp-0000.dat" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "temp/temp-0001.dat" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "temp/temp-0002.dat" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "temp/temp-0003.dat" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "temp/temp-0004.dat" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "temp/" }, "expect": { "status": 200, "response": { "KeyCount": 0, "IsTruncated": false, "Contents": { "$absent": true } } } } } ] }, { "id": "listing-0110", "group": "listing", "kind": "api", "title": "Objects are immediately visible in ListObjectsV2 after PUT", "description": "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.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3015.py#L188", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.dat", "Body": "data-0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.dat", "Body": "data-1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0002.dat", "Body": "data-2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0003.dat", "Body": "data-3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0004.dat", "Body": "data-4" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "data/" }, "expect": { "status": 200, "response": { "KeyCount": 5, "IsTruncated": false, "Contents": [ { "Key": "data/object-0000.dat" }, { "Key": "data/object-0001.dat" }, { "Key": "data/object-0002.dat" }, { "Key": "data/object-0003.dat" }, { "Key": "data/object-0004.dat" } ] } } } } ] }, { "id": "listing-0111", "group": "listing", "kind": "api", "title": "ListObjectsV2 with delimiter groups top-level prefixes; full list returns every object", "description": "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.", "tags": [ "tier-1", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3017.py#L371", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "level1-0/level2-0/level3-0.txt", "body": "data-0" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "level1-1/level2-1/level3-1.txt", "body": "data-1" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "level1-2/level2-2/level3-2.txt", "body": "data-2" } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "level1-3/level2-3/level3-3.txt", "body": "data-3" } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "level1-4/level2-4/level3-4.txt", "body": "data-4" } }, { "$object": { "handle": "o6", "bucket": "b1", "key": "level1-5/level2-5/level3-5.txt", "body": "data-5" } } ], "steps": [ { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" }, "expect": { "status": 200, "response": { "CommonPrefixes": { "$length": 6 } } } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}" }, "expect": { "status": 200, "response": { "KeyCount": 6, "IsTruncated": false } } } } ] } ] }