From 1904e86f2f8fe7880128aca1513a5f967b8babf5 Mon Sep 17 00:00:00 2001 From: Devin Humphreys Date: Tue, 17 Dec 2024 16:17:09 -0500 Subject: [PATCH] Fix PeriodicTasks tests --- app/cmd/goaws.go | 2 +- app/conf/mock-data/mock-config.yaml | 4 +- app/gosqs/change_message_visibility_test.go | 29 +- app/gosqs/get_queue_attributes_test.go | 2 +- app/gosqs/gosqs.go | 22 +- app/gosqs/gosqs_test.go | 530 +++++++------------- app/gosqs/list_queues_test.go | 6 +- app/gosqs/receive_message_test.go | 9 +- 8 files changed, 222 insertions(+), 382 deletions(-) diff --git a/app/cmd/goaws.go b/app/cmd/goaws.go index c5dc94f6..5d765d35 100644 --- a/app/cmd/goaws.go +++ b/app/cmd/goaws.go @@ -58,7 +58,7 @@ func main() { r := router.New() - quit := make(chan struct{}, 0) + quit := make(chan bool, 0) go gosqs.PeriodicTasks(1*time.Second, quit) if len(portNumbers) == 1 { diff --git a/app/conf/mock-data/mock-config.yaml b/app/conf/mock-data/mock-config.yaml index b8bf9ceb..d3215cfb 100644 --- a/app/conf/mock-data/mock-config.yaml +++ b/app/conf/mock-data/mock-config.yaml @@ -57,8 +57,8 @@ BaseUnitTests: Queues: - Name: unit-queue1 - Name: unit-queue2 - RedrivePolicy: '{"maxReceiveCount": 100, "deadLetterTargetArn":"arn:aws:sqs:us-east-1:100010001000:other-queue1"}' - - Name: other-queue1 + RedrivePolicy: '{"maxReceiveCount": 1, "deadLetterTargetArn":"arn:aws:sqs:us-east-1:100010001000:dead-letter-queue1"}' + - Name: dead-letter-queue1 - Name: subscribed-queue1 - Name: subscribed-queue3 Topics: diff --git a/app/gosqs/change_message_visibility_test.go b/app/gosqs/change_message_visibility_test.go index 1ddab4e9..de3f6fc3 100644 --- a/app/gosqs/change_message_visibility_test.go +++ b/app/gosqs/change_message_visibility_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestChangeMessageVisibility_POST_SUCCESS(t *testing.T) { +func TestChangeMessageVisibility_success(t *testing.T) { // create a queue models.CurrentEnvironment = fixtures.LOCAL_ENVIRONMENT defer func() { @@ -45,4 +45,31 @@ func TestChangeMessageVisibility_POST_SUCCESS(t *testing.T) { // the time being set, we can't reliably assert an exact value. So assert // that the time.Time value is no longer the default zero value. assert.NotZero(t, q.Messages[0].VisibilityTimeout) + assert.NotZero(t, q.Messages[0].ReceiptTime) + assert.Equal(t, "", q.Messages[0].ReceiptHandle) + assert.Equal(t, 1, q.Messages[0].Retry) +} + +func TestChangeMessageVisibility_success_adds_to_existing_visibility_timeout(t *testing.T) { + // TODO +} + +func TestChangeMessageVisibility_success_transfers_to_dead_letter_queue(t *testing.T) { + // TODO +} + +func TestChangeMessageVisibility_request_transformer_error(t *testing.T) { + // TODO +} + +func TestChangeMessageVisibility_visibility_timeout_too_large(t *testing.T) { + // TODO +} + +func TestChangeMessageVisibility_missing_queue(t *testing.T) { + // TODO +} + +func TestChangeMessageVisibility_missing_message(t *testing.T) { + // TODO - mismatch receipt handle } diff --git a/app/gosqs/get_queue_attributes_test.go b/app/gosqs/get_queue_attributes_test.go index 6e6da598..10ae2332 100644 --- a/app/gosqs/get_queue_attributes_test.go +++ b/app/gosqs/get_queue_attributes_test.go @@ -85,7 +85,7 @@ func TestGetQueueAttributesV1_success_all_with_redrive_queue(t *testing.T) { expectedResponse.Result.Attrs = append(expectedResponse.Result.Attrs, models.Attribute{ Name: "RedrivePolicy", - Value: fmt.Sprintf(`{"maxReceiveCount":"100", "deadLetterTargetArn":"%s:%s"}`, fixtures.BASE_SQS_ARN, "other-queue1"), + Value: fmt.Sprintf(`{"maxReceiveCount":"1", "deadLetterTargetArn":"%s:%s"}`, fixtures.BASE_SQS_ARN, "dead-letter-queue1"), }, ) diff --git a/app/gosqs/gosqs.go b/app/gosqs/gosqs.go index bb80a8ab..9614f3c2 100644 --- a/app/gosqs/gosqs.go +++ b/app/gosqs/gosqs.go @@ -13,27 +13,27 @@ func init() { models.SyncQueues.Queues = make(map[string]*models.Queue) } -func PeriodicTasks(d time.Duration, quit <-chan struct{}) { +func PeriodicTasks(d time.Duration, quit chan bool) { ticker := time.NewTicker(d) for { select { case <-ticker.C: models.SyncQueues.Lock() - for j := range models.SyncQueues.Queues { - queue := models.SyncQueues.Queues[j] + for qName := range models.SyncQueues.Queues { + queue := models.SyncQueues.Queues[qName] + + // Reset deduplication period + for dedupId, startTime := range queue.Duplicates { + if time.Now().After(startTime.Add(models.DeduplicationPeriod)) { + log.Debugf("deduplication period for message with deduplicationId [%s] expired", dedupId) + delete(queue.Duplicates, dedupId) + } + } log.Debugf("Queue [%s] length [%d]", queue.Name, len(queue.Messages)) for i := 0; i < len(queue.Messages); i++ { msg := &queue.Messages[i] - // Reset deduplication period - for dedupId, startTime := range queue.Duplicates { - if time.Now().After(startTime.Add(models.DeduplicationPeriod)) { - log.Debugf("deduplication period for message with deduplicationId [%s] expired", dedupId) - delete(queue.Duplicates, dedupId) - } - } - if msg.ReceiptHandle != "" { if msg.VisibilityTimeout.Before(time.Now()) { log.Debugf("Making message visible again %s", msg.ReceiptHandle) diff --git a/app/gosqs/gosqs_test.go b/app/gosqs/gosqs_test.go index 5b8582d4..0775eac7 100644 --- a/app/gosqs/gosqs_test.go +++ b/app/gosqs/gosqs_test.go @@ -1,411 +1,216 @@ package gosqs import ( + "fmt" "net/http" - "net/http/httptest" "net/url" "sync" "testing" "time" + "github.com/Admiral-Piett/goaws/app/conf" + + "github.com/Admiral-Piett/goaws/app/fixtures" + "github.com/Admiral-Piett/goaws/app/models" "github.com/Admiral-Piett/goaws/app/utils" "github.com/stretchr/testify/assert" ) -func TestRequeueing_VisibilityTimeoutExpires(t *testing.T) { - done := make(chan struct{}, 0) - go PeriodicTasks(1*time.Second, done) - - // create a queue - req, err := http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - //form := url.Values{} - //form.Add("Action", "CreateQueue") - //form.Add("QueueName", "requeue") - //form.Add("Attribute.1.Name", "VisibilityTimeout") - //form.Add("Attribute.1.Value", "1") - //form.Add("Version", "2012-11-05") - req.PostForm = url.Values{ - "Action": []string{"CreateQueue"}, - "QueueName": []string{"requeue"}, - "Attribute.1.Name": []string{"VisibilityTimeout"}, - "Attribute.1.Value": []string{"1"}, - "Version": []string{"2012-11-05"}, - } - - rr := httptest.NewRecorder() - status, _ := CreateQueueV1(req) - - assert.Equal(t, http.StatusOK, status) - - // send a message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form := url.Values{} - form.Add("Action", "SendMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue") - form.Add("MessageBody", "1") - form.Add("Version", "2012-11-05") - req.PostForm = form - - rr = httptest.NewRecorder() - status, _ = SendMessageV1(req) - - if status := rr.Code; status != http.StatusOK { - t.Errorf("handler returned wrong status code: got \n%v want %v", - status, http.StatusOK) - } - - // receive message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue") - form.Add("Version", "2012-11-05") - req.PostForm = form - - rr = httptest.NewRecorder() - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - - // try to receive another message. - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue") - form.Add("Version", "2012-11-05") - req.PostForm = form - - rr = httptest.NewRecorder() - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - time.Sleep(2 * time.Second) - - // message needs to be requeued - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue") - form.Add("Version", "2012-11-05") - req.PostForm = form - - rr = httptest.NewRecorder() - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - done <- struct{}{} -} - -func TestRequeueing_ResetVisibilityTimeout(t *testing.T) { - done := make(chan struct{}, 0) - go PeriodicTasks(1*time.Second, done) - - // create a queue - req, err := http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form := url.Values{} - form.Add("Action", "CreateQueue") - form.Add("QueueName", "requeue-reset") - form.Add("Attribute.1.Name", "VisibilityTimeout") - form.Add("Attribute.1.Value", "10") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ := CreateQueueV1(req) - assert.Equal(t, status, http.StatusOK) - - // send a message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "SendMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue-reset") - form.Add("MessageBody", "1") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = SendMessageV1(req) - if status != http.StatusOK { - t.Errorf("handler returned wrong status code: got \n%v want %v", - status, http.StatusOK) - } - - // receive message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue-reset") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, resp := ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - - receiptHandle := resp.GetResult().(models.ReceiveMessageResult).Messages[0].ReceiptHandle - - // try to receive another message. - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue-reset") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) +// TODO - Admiral-Piett these are better but still screwy. It's easy to have race conditions in here, so +// we have to name all the queues uniquely and leave them around so we're not resetting ourselves. +// Stupid. Handle the global memory issues and this can be easily resolved. +func Test_PeriodicTasks_deletes_deduplication_period_upon_expiration(t *testing.T) { + models.DeduplicationPeriod = 20 * time.Millisecond + quit := make(chan bool) + defer func() { + models.ResetApp() + quit <- true + models.DeduplicationPeriod = 5 * time.Minute + }() - // reset message visibility timeout to requeue it - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) + qName := "gosqs-dedupe-queue1" + mainQueue := &models.Queue{ + Name: qName, + URL: fmt.Sprintf("%s/%s", fixtures.BASE_URL, qName), + Arn: fmt.Sprintf("%s:%s", fixtures.BASE_SQS_ARN, qName), + Duplicates: map[string]time.Time{ + "12345": time.Now(), + }, } + models.SyncQueues.Lock() + models.SyncQueues.Queues[qName] = mainQueue + models.SyncQueues.Unlock() - form = url.Values{} - form.Add("Action", "ChangeMessageVisibility") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue-reset") - form.Add("VisibilityTimeout", "0") - form.Add("ReceiptHandle", receiptHandle) - form.Add("Version", "2012-11-05") - req.PostForm = form + go PeriodicTasks(10*time.Millisecond, quit) - status, _ = ChangeMessageVisibilityV1(req) - assert.Equal(t, status, http.StatusOK) + assertions := func() bool { + models.SyncQueues.Lock() + defer models.SyncQueues.Unlock() - // message needs to be requeued - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) + ok := 0 == len(mainQueue.Duplicates) + if !ok { + return false + } + return true } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/requeue-reset") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - done <- struct{}{} + assert.Eventually(t, assertions, 10*time.Second, 10*time.Millisecond) } -func TestDeadLetterQueue(t *testing.T) { - done := make(chan struct{}, 0) - go PeriodicTasks(1*time.Second, done) +func Test_PeriodicTasks_VisibilityTimeout_expires(t *testing.T) { + quit := make(chan bool) + defer func() { + models.ResetApp() + quit <- true + }() + qName := "gosqs-visibility-queue1" + mainQueue := &models.Queue{ + Name: qName, + URL: fmt.Sprintf("%s/%s", fixtures.BASE_URL, qName), + Arn: fmt.Sprintf("%s:%s", fixtures.BASE_SQS_ARN, qName), + } + mainQueue.Messages = append(mainQueue.Messages, models.SqsMessage{ + MessageBody: "1", + ReceiptHandle: "12345", + VisibilityTimeout: time.Now().Add(30 * time.Millisecond), + }) - // create a queue - req, err := http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - deadLetterQueue := &models.Queue{ - Name: "failed-messages", - Messages: []models.SqsMessage{}, - } models.SyncQueues.Lock() - models.SyncQueues.Queues["failed-messages"] = deadLetterQueue + models.SyncQueues.Queues[qName] = mainQueue models.SyncQueues.Unlock() - form := url.Values{} - form.Add("Action", "CreateQueue") - form.Add("QueueName", "testing-deadletter") - form.Add("Attribute.1.Name", "VisibilityTimeout") - form.Add("Attribute.1.Value", "1") - form.Add("Attribute.2.Name", "RedrivePolicy") - form.Add("Attribute.2.Value", `{"maxReceiveCount": 2, "deadLetterTargetArn":"arn:aws:sqs::000000000000:failed-messages"}`) - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ := CreateQueueV1(req) - assert.Equal(t, status, http.StatusOK) - // send a message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "SendMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/testing-deadletter") - form.Add("MessageBody", "1") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = SendMessageV1(req) - if status != http.StatusOK { - t.Errorf("handler returned wrong status code: got \n%v want %v", - status, http.StatusOK) - } - if len(models.SyncQueues.Queues["testing-deadletter"].Messages) != 1 { - t.Fatal("expected a message in testing-deadletter") - } + go PeriodicTasks(10*time.Millisecond, quit) - // receive message - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/testing-deadletter") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - - time.Sleep(2 * time.Second) - - if len(models.SyncQueues.Queues["testing-deadletter"].Messages) != 1 { - t.Fatal("expected message in testing-deadletter after 1 receive attempt") - } - if len(deadLetterQueue.Messages) > 0 { - t.Fatal("expected no message in DLQ") - } + assertions := func() bool { + models.SyncQueues.Lock() + defer models.SyncQueues.Unlock() - // receive the message one more time - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) + ok := !mainQueue.Messages[0].ReceiptTime.IsZero() + if !ok { + return false + } + ok = "1" == mainQueue.Messages[0].MessageBody + if !ok { + return false + } + ok = "" == mainQueue.Messages[0].ReceiptHandle + if !ok { + return false + } + ok = 1 == mainQueue.Messages[0].Retry + if !ok { + return false + } + return true } + assert.Eventually(t, assertions, 10*time.Second, 10*time.Millisecond) +} - req.PostForm = form - - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) - - // wait for messages to be moved to DLQ and stop the periodic tasks to prevent data races. - time.Sleep(2 * time.Second) - done <- struct{}{} +func Test_PeriodicTasks_moves_single_message_to_dead_letter_queue_upon_passing_receive_count(t *testing.T) { + quit := make(chan bool) + defer func() { + models.ResetApp() + quit <- true + }() - if len(models.SyncQueues.Queues["testing-deadletter"].Messages) != 0 { - t.Fatal("expected no message in testing-deadletter") + qName := "gosqs-main-queue1" + dlqName := "gosqs-dead-letter-queue1" + dlqQueue := &models.Queue{ + Arn: fmt.Sprintf("%s/%s", fixtures.BASE_SQS_ARN, dlqName), + Name: dlqName, + URL: fmt.Sprintf("%s/%s", fixtures.BASE_URL, dlqName), } - if len(deadLetterQueue.Messages) == 0 { - t.Fatal("expected a message in DLQ") + mainQueue := &models.Queue{ + Arn: fmt.Sprintf("%s/%s", fixtures.BASE_SQS_ARN, qName), + DeadLetterQueue: dlqQueue, + MaxReceiveCount: 1, + Name: qName, + URL: fmt.Sprintf("%s/%s", fixtures.BASE_URL, qName), } -} -func TestDeadLetterQueueMultiple(t *testing.T) { - done := make(chan struct{}, 0) - go PeriodicTasks(1*time.Second, done) + go PeriodicTasks(10*time.Millisecond, quit) - // create a queue - req, err := http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } - deadLetterQueue := &models.Queue{ - Name: "failed-messages-multiple", - Messages: []models.SqsMessage{}, - } models.SyncQueues.Lock() - models.SyncQueues.Queues["failed-messages-multiple"] = deadLetterQueue + mainQueue.Messages = append(mainQueue.Messages, models.SqsMessage{ + MessageBody: "1", + Retry: 100, + ReceiptHandle: "12345", + VisibilityTimeout: time.Now().Add(10 * time.Millisecond), + }) + models.SyncQueues.Queues[qName] = mainQueue + models.SyncQueues.Queues[dlqName] = dlqQueue models.SyncQueues.Unlock() - form := url.Values{} - form.Add("Action", "CreateQueue") - form.Add("QueueName", "testing-deadletter-multiple") - form.Add("Attribute.1.Name", "VisibilityTimeout") - form.Add("Attribute.1.Value", "1") - form.Add("Attribute.2.Name", "RedrivePolicy") - form.Add("Attribute.2.Value", `{"maxReceiveCount": 1, "deadLetterTargetArn":"arn:aws:sqs::000000000000:failed-messages-multiple"}`) - form.Add("Version", "2012-11-05") - req.PostForm = form - status, _ := CreateQueueV1(req) - assert.Equal(t, status, http.StatusOK) + assertions := func() bool { + models.SyncQueues.Lock() + defer models.SyncQueues.Unlock() - // send 2 messages - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) + ok := len(dlqQueue.Messages) == 1 + if !ok { + return false + } + ok = "1" == dlqQueue.Messages[0].MessageBody + if !ok { + return false + } + return true } + assert.Eventually(t, assertions, 10*time.Second, 10*time.Millisecond) +} - form = url.Values{} - form.Add("Action", "SendMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/testing-deadletter-multiple") - form.Add("MessageBody", "1") - form.Add("Version", "2012-11-05") - req.PostForm = form - - status, _ = SendMessageV1(req) - if status != http.StatusOK { - t.Errorf("handler returned wrong status code: got \n%v want %v", - status, http.StatusOK) - } - status, _ = SendMessageV1(req) - if status != http.StatusOK { - t.Errorf("handler returned wrong status code: got \n%v want %v", - status, http.StatusOK) - } +func Test_PeriodicTasks_moves_multiple_messages_to_dead_letter_queue_upon_passing_receive_count(t *testing.T) { + quit := make(chan bool) + conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests") + defer func() { + models.ResetApp() + quit <- true + }() - if len(models.SyncQueues.Queues["testing-deadletter-multiple"].Messages) != 2 { - t.Fatal("expected 2 messages in testing-deadletter-multiple") - } + mainQueue := models.SyncQueues.Queues["unit-queue2"] + dlqQueue := models.SyncQueues.Queues["dead-letter-queue1"] - // receive messages - req, err = http.NewRequest("POST", "/", nil) - if err != nil { - t.Fatal(err) - } + assert.Len(t, dlqQueue.Messages, 0) - form = url.Values{} - form.Add("Action", "ReceiveMessage") - form.Add("QueueUrl", "http://localhost:4100/queue/testing-deadletter-multiple") - form.Add("MaxNumberOfMessages", "2") - form.Add("Version", "2012-11-05") - req.PostForm = form + go PeriodicTasks(10*time.Millisecond, quit) - status, _ = ReceiveMessageV1(req) - assert.Equal(t, status, http.StatusOK) + models.SyncQueues.Lock() + mainQueue.Messages = append(mainQueue.Messages, models.SqsMessage{ + MessageBody: "1", + Retry: 100, + ReceiptHandle: "12345", + }) + mainQueue.Messages = append(mainQueue.Messages, models.SqsMessage{ + MessageBody: "2", + Retry: 100, + ReceiptHandle: "23456", + }) + models.SyncQueues.Unlock() - // wait for messages to be moved to DLQ and stop the periodic tasks to prevent data races. - time.Sleep(3 * time.Second) - done <- struct{}{} + assertions := func() bool { + models.SyncQueues.Lock() + defer models.SyncQueues.Unlock() - numMessages := len(models.SyncQueues.Queues["testing-deadletter-multiple"].Messages) - if numMessages != 0 { - t.Fatalf("expected no messages in testing-deadletter-multiple, found: %d", numMessages) - } - if len(deadLetterQueue.Messages) != 2 { - t.Fatal("expected 2 messages in DLQ") + ok := len(dlqQueue.Messages) == 2 + if !ok { + return false + } + ok = "1" == dlqQueue.Messages[0].MessageBody + if !ok { + return false + } + ok = "2" == dlqQueue.Messages[1].MessageBody + if !ok { + return false + } + return true } + assert.Eventually(t, assertions, 10*time.Second, 10*time.Millisecond) } +// TODO - I think all these below belong in handler tests, not in here. Double check the relevant +// handlers for coverage and delete. func TestSendingAndReceivingFromFIFOQueueReturnsSameMessageOnError(t *testing.T) { - done := make(chan struct{}, 0) + done := make(chan bool) go PeriodicTasks(1*time.Second, done) // create a queue @@ -556,11 +361,11 @@ func TestSendingAndReceivingFromFIFOQueueReturnsSameMessageOnError(t *testing.T) break } - done <- struct{}{} + done <- true } func TestSendMessage_POST_DuplicatationNotAppliedToStandardQueue(t *testing.T) { - done := make(chan struct{}, 0) + done := make(chan bool) go PeriodicTasks(1*time.Second, done) // create a queue @@ -621,10 +426,11 @@ func TestSendMessage_POST_DuplicatationNotAppliedToStandardQueue(t *testing.T) { if len(models.SyncQueues.Queues["stantdard-testing"].Messages) == 1 { t.Fatal("there should be 2 messages in queue") } + done <- true } func TestSendMessage_POST_DuplicatationDisabledOnFifoQueue(t *testing.T) { - done := make(chan struct{}, 0) + done := make(chan bool) go PeriodicTasks(1*time.Second, done) // create a queue @@ -685,10 +491,11 @@ func TestSendMessage_POST_DuplicatationDisabledOnFifoQueue(t *testing.T) { if len(models.SyncQueues.Queues["no-dup-testing.fifo"].Messages) != 2 { t.Fatal("there should be 2 message in queue") } + done <- true } func TestSendMessage_POST_DuplicatationEnabledOnFifoQueue(t *testing.T) { - done := make(chan struct{}, 0) + done := make(chan bool) go PeriodicTasks(1*time.Second, done) // create a queue @@ -754,6 +561,7 @@ func TestSendMessage_POST_DuplicatationEnabledOnFifoQueue(t *testing.T) { if body := models.SyncQueues.Queues["dup-testing.fifo"].Messages[0].MessageBody; string(body) == "Test2" { t.Fatal("duplicate message should not be added to queue") } + done <- true } func TestSendMessage_POST_DelaySeconds(t *testing.T) { diff --git a/app/gosqs/list_queues_test.go b/app/gosqs/list_queues_test.go index 387ea22f..ea1d3527 100644 --- a/app/gosqs/list_queues_test.go +++ b/app/gosqs/list_queues_test.go @@ -35,7 +35,7 @@ func TestListQueuesV1_success(t *testing.T) { assert.Equal(t, http.StatusOK, code) assert.Contains(t, r1.Result.QueueUrls, fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1")) assert.Contains(t, r1.Result.QueueUrls, fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue2")) - assert.Contains(t, r1.Result.QueueUrls, fmt.Sprintf("%s/%s", fixtures.BASE_URL, "other-queue1")) + assert.Contains(t, r1.Result.QueueUrls, fmt.Sprintf("%s/%s", fixtures.BASE_URL, "dead-letter-queue1")) } func TestListQueuesV1_success_no_queues(t *testing.T) { @@ -67,7 +67,7 @@ func TestListQueuesV1_success_with_queue_name_prefix(t *testing.T) { utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) { v := resultingStruct.(*models.ListQueueRequest) - *v = models.ListQueueRequest{QueueNamePrefix: "other"} + *v = models.ListQueueRequest{QueueNamePrefix: "dead-letter"} return true } @@ -76,7 +76,7 @@ func TestListQueuesV1_success_with_queue_name_prefix(t *testing.T) { r1 := response.(models.ListQueuesResponse) assert.Equal(t, http.StatusOK, code) - assert.Equal(t, []string{fmt.Sprintf("%s/%s", fixtures.BASE_URL, "other-queue1")}, r1.Result.QueueUrls) + assert.Equal(t, []string{fmt.Sprintf("%s/%s", fixtures.BASE_URL, "dead-letter-queue1")}, r1.Result.QueueUrls) } func TestListQueuesV1_success_with_queue_name_prefix_no_matching_queues(t *testing.T) { diff --git a/app/gosqs/receive_message_test.go b/app/gosqs/receive_message_test.go index 2ea7ad4b..25ab3330 100644 --- a/app/gosqs/receive_message_test.go +++ b/app/gosqs/receive_message_test.go @@ -14,8 +14,7 @@ import ( "github.com/stretchr/testify/assert" ) -// TODO - figure out a better way to handle the wait time in these tests. Maybe in the smoke tests alone -// if there's nothing else? +// TODO Admiral-Piett - fix all these tests, we don't want to be waiting for 5 seconds plus like this. func TestReceiveMessageV1_with_WaitTimeEnforced(t *testing.T) { models.CurrentEnvironment = fixtures.LOCAL_ENVIRONMENT defer func() { @@ -216,3 +215,9 @@ func TestReceiveMessageV1_with_MessageAttributes(t *testing.T) { assert.Equal(t, "String", result.Messages[0].MessageAttributes["TestMessageAttrName"].DataType) assert.Equal(t, "TestMessageAttrValue", result.Messages[0].MessageAttributes["TestMessageAttrName"].StringValue) } + +func TestReceiveMessageV1_request_transformer_error(t *testing.T) { + // TODO +} + +// TODO - other tests