From 312397739e6970311e87b58dd6147f991820b2a5 Mon Sep 17 00:00:00 2001 From: Feng Ruohang Date: Wed, 2 Sep 2026 00:40:04 +0800 Subject: [PATCH] test: reproduce ForceCreate bucket metadata clobber Create policy and CORS state, force-create the existing bucket, and require the original Created time and both metadata fields to survive. Signed-off-by: Feng Ruohang --- cmd/bucket-metadata-lock_test.go | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/cmd/bucket-metadata-lock_test.go b/cmd/bucket-metadata-lock_test.go index 40fc5ce46..b5528e930 100644 --- a/cmd/bucket-metadata-lock_test.go +++ b/cmd/bucket-metadata-lock_test.go @@ -120,6 +120,42 @@ func TestBucketMetadataLockPreservesTaggingAndSSE(t *testing.T) { }) } +func TestMakeBucketForceCreatePreservesMetadata(t *testing.T) { + defer DetectTestLeak(t)() + ExecObjectLayerAPITest(ExecObjectLayerAPITestArgs{ + t: t, + objAPITest: testMakeBucketForceCreatePreservesMetadata, + }) +} + +func testMakeBucketForceCreatePreservesMetadata(obj ObjectLayer, instanceType, bucket string, + _ http.Handler, _ auth.Credentials, t *testing.T, +) { + ctx := t.Context() + policyJSON := fmt.Appendf(nil, `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"s3:GetObject","Resource":"arn:aws:s3:::%s/*"}]}`, bucket) + corsXML := []byte(testSiteReplicationCORSDoc) + if _, err := globalBucketMetadataSys.Update(ctx, bucket, bucketPolicyConfig, policyJSON); err != nil { + t.Fatal(err) + } + if _, err := updateLocalBucketCORSMetadata(ctx, obj, bucket, corsXML); err != nil { + t.Fatal(err) + } + before, err := readBucketMetadata(ctx, obj, bucket) + if err != nil { + t.Fatal(err) + } + if err = obj.MakeBucket(ctx, bucket, MakeBucketOptions{ForceCreate: true}); err != nil { + t.Fatalf("%s: ForceCreate existing bucket: %v", instanceType, err) + } + after, err := readBucketMetadata(ctx, obj, bucket) + if err != nil { + t.Fatal(err) + } + if !after.Created.Equal(before.Created) || !bytes.Equal(after.PolicyConfigJSON, policyJSON) || !bytes.Equal(after.CorsConfigXML, corsXML) { + t.Fatalf("%s: ForceCreate replaced metadata: before=%+v after=%+v", instanceType, before, after) + } +} + func testBucketMetadataLockPreservesTaggingAndSSE(obj ObjectLayer, instanceType, bucket string, _ http.Handler, _ auth.Credentials, t *testing.T, ) {