From 5b6d2c24167cb4a0b5edf1136f01690eb37dc0f5 Mon Sep 17 00:00:00 2001 From: "Dai.Otsuka" Date: Mon, 25 Nov 2024 18:48:24 +0900 Subject: [PATCH 1/3] fixed --- app/models/requests.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/models/requests.go b/app/models/requests.go index 88df66ac..ec163942 100644 --- a/app/models/requests.go +++ b/app/models/requests.go @@ -13,8 +13,6 @@ import ( log "github.com/sirupsen/logrus" ) -var caser = cases.Title(language.AmericanEnglish) - type CreateQueueRequest struct { QueueName string `json:"QueueName" schema:"QueueName"` Attributes QueueAttributes `json:"Attributes" schema:"Attribute"` @@ -766,7 +764,7 @@ func (r *PublishRequest) SetAttributesFromForm(values url.Values) { r.MessageAttributes = make(map[string]MessageAttribute) } attributes[name] = MessageAttribute{ - DataType: caser.String(dataType), // capitalize + DataType: cases.Title(language.AmericanEnglish).String(dataType), // capitalize StringValue: stringValue, BinaryValue: []byte(binaryValue), } From f174a5bfa19c90d0338bb2f9d38fa11055ccf149 Mon Sep 17 00:00:00 2001 From: "Dai.Otsuka" Date: Thu, 12 Dec 2024 16:58:16 +0900 Subject: [PATCH 2/3] added test --- app/models/requests_test.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/models/requests_test.go b/app/models/requests_test.go index 26815baf..bbc03a46 100644 --- a/app/models/requests_test.go +++ b/app/models/requests_test.go @@ -3,8 +3,11 @@ package models import ( "encoding/json" "fmt" + "math/rand" "net/url" + "sync" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -621,3 +624,35 @@ func Test_DeleteMessageBatchRequest_SetAttributesFromForm_stops_at_invalid_keys( assert.Equal(t, "message-id-1", dmbr.Entries[0].Id) assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle) } + +func TestPublishRequest_SetAttributesFromForm_success_concurrent(t *testing.T) { + form := url.Values{} + form.Add("MessageAttributes.entry.1.Name", "test1") + form.Add("MessageAttributes.entry.1.Value.DataType", "String") + form.Add("MessageAttributes.entry.1.Value.StringValue", "sample-string") + form.Add("MessageAttributes.entry.2.Name", "test2") + form.Add("MessageAttributes.entry.2.Value.DataType", "Binary") + form.Add("MessageAttributes.entry.2.Value.BinaryValue", "YmluYXJ5LXZhbHVl") + + cqr := &PublishRequest{ + MessageAttributes: make(map[string]MessageAttribute), + } + for r := 0; r < 10; r++ { + var wg sync.WaitGroup + goroutineCount := 40 + for g := 0; g < goroutineCount; g++ { + wg.Add(1) + go func() { + defer wg.Done() + // Introduce a random delay to encourage goroutine interleaving + time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond) + cqr.SetAttributesFromForm(form) + // validate the expected DataType values + assert.Equal(t, "String", cqr.MessageAttributes["test1"].DataType) + assert.Equal(t, "Binary", cqr.MessageAttributes["test2"].DataType) + + }() + } + wg.Wait() + } +} From ab4f956a81a64d168ceebd1189948fd26635046b Mon Sep 17 00:00:00 2001 From: "Dai.Otsuka" Date: Fri, 13 Dec 2024 11:03:14 +0900 Subject: [PATCH 3/3] fixed data race --- app/models/requests_test.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/models/requests_test.go b/app/models/requests_test.go index bbc03a46..92f03de3 100644 --- a/app/models/requests_test.go +++ b/app/models/requests_test.go @@ -634,23 +634,26 @@ func TestPublishRequest_SetAttributesFromForm_success_concurrent(t *testing.T) { form.Add("MessageAttributes.entry.2.Value.DataType", "Binary") form.Add("MessageAttributes.entry.2.Value.BinaryValue", "YmluYXJ5LXZhbHVl") - cqr := &PublishRequest{ - MessageAttributes: make(map[string]MessageAttribute), - } + // if the code is not thread-safe, repeated runs increase the chance of detecting a race. for r := 0; r < 10; r++ { var wg sync.WaitGroup goroutineCount := 40 + // launch goroutines in parallel to simulate concurrent access. for g := 0; g < goroutineCount; g++ { wg.Add(1) go func() { defer wg.Done() - // Introduce a random delay to encourage goroutine interleaving + // introduce a random delay to encourage goroutine interleaving time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond) + cqr := &PublishRequest{ + MessageAttributes: make(map[string]MessageAttribute), + } + cqr.SetAttributesFromForm(form) + // validate the expected DataType values assert.Equal(t, "String", cqr.MessageAttributes["test1"].DataType) assert.Equal(t, "Binary", cqr.MessageAttributes["test2"].DataType) - }() } wg.Wait()