@@ -8,16 +8,13 @@ import (
88
99// Single-object groups of the S3 conformance partition.
1010//
11- // TEARDOWN-BLOCKED rows: since the hilt (tenant-management) integration, a
12- // bucket that ever held a non-empty object body cannot be deleted — object
13- // bodies register blobs in the bucket's space at PUT, DeleteObject's blob
14- // release is a no-op until sprue/piri implement /blob/remove (see the TODO
15- // in uploader/blob.go), and hilt's /s3/bucket/delete refuses non-empty
16- // spaces (409 BucketNotEmpty). Upstream cases delete their bucket in
17- // teardown, so every case below marked "teardown-blocked" passes its S3
18- // assertions and then fails teardown. They sit in the XFail tables so the
19- // unexpected-pass ratchet flags them for promotion the moment /blob/remove
20- // lands.
11+ // Historical note: before DeleteObject released network blobs (FIL-588),
12+ // a bucket that ever held a non-empty object body could not be deleted —
13+ // hilt's /s3/bucket/delete refuses non-empty spaces (409 BucketNotEmpty) —
14+ // so every such case failed its bucket-delete teardown and sat in the
15+ // XFail tables as "teardown-blocked". The unexpected-pass ratchet flagged
16+ // them all when the release path landed on this branch; they now live in
17+ // the pass tables.
2118
2219var putObjectPass = []forgeCase {
2320 {name : "checksum_algorithm_and_header_mismatch" , fn : integration .PutObject_checksum_algorithm_and_header_mismatch },
@@ -39,17 +36,18 @@ var putObjectPass = []forgeCase{
3936 {name : "past_retain_until_date" , fn : integration .PutObject_past_retain_until_date },
4037 {name : "racey_success" , fn : integration .PutObject_racey_success },
4138 {name : "special_chars" , fn : integration .PutObject_special_chars },
42- }
43-
44- var putObjectXFail = []forgeCase {
45- // Teardown-blocked (see the header comment): S3 assertions pass, the
46- // bucket delete 409s.
47- {name : "checksums_success" , fn : integration .PutObject_checksums_success },
4839 {name : "conditional_writes" , fn : integration .PutObject_conditional_writes },
4940 {name : "default_checksum" , fn : integration .PutObject_default_checksum },
5041 {name : "default_content_type" , fn : integration .PutObject_default_content_type },
5142 {name : "success" , fn : integration .PutObject_success },
5243 {name : "with_metadata" , fn : integration .PutObject_with_metadata },
44+ }
45+
46+ var putObjectXFail = []forgeCase {
47+ // Still teardown-blocked even with DeleteObject's blob release: the
48+ // case's checksummed bodies survive deletion and the bucket delete
49+ // 409s (BucketNotEmpty).
50+ {name : "checksums_success" , fn : integration .PutObject_checksums_success },
5351 // The incorrect_md5 subcheck expects 400 InvalidDigest; ingot 500s.
5452 {name : "md5" , fn : integration .PutObject_md5 },
5553 // A metadata-combining re-PUT is denied (403) under the hilt authorize
@@ -69,11 +67,6 @@ var getObjectPass = []forgeCase{
6967 {name : "invalid_part_number" , fn : integration .GetObject_invalid_part_number },
7068 {name : "non_existing_key" , fn : integration .GetObject_non_existing_key },
7169 {name : "zero_len_with_range" , fn : integration .GetObject_zero_len_with_range },
72- }
73-
74- var getObjectXFail = []forgeCase {
75- // Teardown-blocked (see the header comment): S3 assertions pass, the
76- // bucket delete 409s.
7770 {name : "by_range_resp_status" , fn : integration .GetObject_by_range_resp_status },
7871 {name : "checksums" , fn : integration .GetObject_checksums },
7972 {name : "conditional_reads" , fn : integration .GetObject_conditional_reads },
@@ -91,8 +84,15 @@ var getObjectXFail = []forgeCase{
9184 {name : "range_and_part_number" , fn : integration .GetObject_range_and_part_number },
9285 {name : "ranged_with_checksum_mode" , fn : integration .GetObject_ranged_with_checksum_mode },
9386 {name : "with_range" , fn : integration .GetObject_with_range },
87+ }
88+
89+ var getObjectXFail = []forgeCase {
90+ // Directory objects are served with binary/octet-stream instead of
91+ // application/x-directory.
9492 {name : "directory_success" , fn : integration .GetObject_directory_success },
93+ // Requires PutBucketPolicy, which ingot 501s (NotImplemented).
9594 {name : "overrides_fail_public" , fn : integration .GetObject_overrides_fail_public },
95+ // Asserts object tagging (TagCount), which is unimplemented.
9696 {name : "success" , fn : integration .GetObject_success },
9797}
9898
@@ -105,11 +105,6 @@ var headObjectPass = []forgeCase{
105105 {name : "overrides_success" , fn : integration .HeadObject_overrides_success },
106106 {name : "dir_with_range" , fn : integration .HeadObject_dir_with_range },
107107 {name : "zero_len_with_range" , fn : integration .HeadObject_zero_len_with_range },
108- }
109-
110- var headObjectXFail = []forgeCase {
111- // Teardown-blocked (see the header comment): S3 assertions pass, the
112- // bucket delete 409s.
113108 {name : "checksums" , fn : integration .HeadObject_checksums },
114109 {name : "conditional_reads" , fn : integration .HeadObject_conditional_reads },
115110 {name : "incidental_dir_object" , fn : integration .HeadObject_incidental_dir_object },
@@ -124,7 +119,12 @@ var headObjectXFail = []forgeCase{
124119 {name : "by_range_resp_status" , fn : integration .HeadObject_by_range_resp_status },
125120 {name : "ranged_with_checksum_mode" , fn : integration .HeadObject_ranged_with_checksum_mode },
126121 {name : "with_range" , fn : integration .HeadObject_with_range },
122+ }
123+
124+ var headObjectXFail = []forgeCase {
125+ // Requires PutBucketPolicy, which ingot 501s (NotImplemented).
127126 {name : "overrides_fail_public" , fn : integration .HeadObject_overrides_fail_public },
127+ // Asserts object tagging (TagCount), which is unimplemented.
128128 {name : "success" , fn : integration .HeadObject_success },
129129}
130130
@@ -137,12 +137,10 @@ var deleteObjectPass = []forgeCase{
137137 {name : "non_existing_object" , fn : integration .DeleteObject_non_existing_object },
138138 {name : "success" , fn : integration .DeleteObject_success },
139139 {name : "success_status_code" , fn : integration .DeleteObject_success_status_code },
140+ {name : "conditional_writes" , fn : integration .DeleteObject_conditional_writes },
140141}
141142
142143var deleteObjectXFail = []forgeCase {
143- // Teardown-blocked (see the header comment): S3 assertions pass, the
144- // bucket delete 409s.
145- {name : "conditional_writes" , fn : integration .DeleteObject_conditional_writes },
146144 // The ExpectedBucketOwner-matching delete is denied (403) under the
147145 // hilt authorize flow (ownership is the tenant's did:plc, not the
148146 // account the case expects).
@@ -162,13 +160,6 @@ var copyObjectPass = []forgeCase{
162160 {name : "to_itself_with_new_metadata" , fn : integration .CopyObject_to_itself_with_new_metadata },
163161 {name : "invalid_tagging_directive" , fn : integration .CopyObject_invalid_tagging_directive },
164162 {name : "invalid_checksum_algorithm" , fn : integration .CopyObject_invalid_checksum_algorithm },
165- }
166-
167- // Observed failing against the forge stack: multi-account semantics, tagging,
168- // object-lock, and checksum-on-copy are unimplemented surface.
169- var copyObjectXFail = []forgeCase {
170- // Teardown-blocked (see the header comment): S3 assertions pass, the
171- // bucket delete 409s.
172163 {name : "success" , fn : integration .CopyObject_success },
173164 {name : "copy_source_starting_with_slash" , fn : integration .CopyObject_copy_source_starting_with_slash },
174165 {name : "default_content_type_with_replace_metadata" , fn : integration .CopyObject_default_content_type_with_replace_metadata },
@@ -182,6 +173,11 @@ var copyObjectXFail = []forgeCase{
182173 {name : "invalid_legal_hold" , fn : integration .CopyObject_invalid_legal_hold },
183174 {name : "invalid_object_lock_mode" , fn : integration .CopyObject_invalid_object_lock_mode },
184175 {name : "invalid_website_redirect_location" , fn : integration .CopyObject_invalid_website_redirect_location },
176+ }
177+
178+ // Observed failing against the forge stack: multi-account semantics, tagging,
179+ // object-lock, and checksum-on-copy are unimplemented surface.
180+ var copyObjectXFail = []forgeCase {
185181 {name : "not_owned_source_bucket" , fn : integration .CopyObject_not_owned_source_bucket },
186182 {name : "should_replace_tagging" , fn : integration .CopyObject_should_replace_tagging },
187183 {name : "should_copy_tagging" , fn : integration .CopyObject_should_copy_tagging },
0 commit comments