From a925d7dedd17853eb6cf313df430b979219db216 Mon Sep 17 00:00:00 2001 From: ripark Date: Wed, 9 Mar 2022 14:29:01 -0800 Subject: [PATCH 1/2] Add testing for primitive data types. Moved a test thatw as a unit test into the appropriate receiver_unit_test.go file. --- sdk/messaging/azservicebus/receiver_test.go | 95 +++++++++++++++---- .../azservicebus/receiver_unit_test.go | 32 +++++++ 2 files changed, 106 insertions(+), 21 deletions(-) diff --git a/sdk/messaging/azservicebus/receiver_test.go b/sdk/messaging/azservicebus/receiver_test.go index 54c2e0ad13a7..752903b7fee7 100644 --- a/sdk/messaging/azservicebus/receiver_test.go +++ b/sdk/messaging/azservicebus/receiver_test.go @@ -14,7 +14,6 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/admin" "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/internal" "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/internal/test" - "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/internal/utils" "github.com/Azure/go-amqp" "github.com/stretchr/testify/require" ) @@ -545,35 +544,89 @@ func TestReceiver_RenewMessageLock(t *testing.T) { "error message from SB comes through") } -func TestReceiverOptions(t *testing.T) { - // defaults - receiver := &Receiver{} - e := &entity{Topic: "topic", Subscription: "subscription"} +// TestReceiverAMQPDataTypes checks that we can send and receive all the AMQP primitive types that are supported +// in ApplicationProperties. +// http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#type-application-properties +// +// > The keys of this map are restricted to be of type string (which excludes the possibility of a null key) and the values +// > are restricted to be of simple types only, that is, excluding map, list, and array types. +func TestReceiverAMQPDataTypes(t *testing.T) { + client, cleanup, queueName := setupLiveTest(t, nil) + defer cleanup() - require.NoError(t, applyReceiverOptions(receiver, e, nil)) + sender, err := client.NewSender(queueName, nil) + require.NoError(t, err) - require.EqualValues(t, ReceiveModePeekLock, receiver.receiveMode) - path, err := e.String() + receiver, err := client.NewReceiverForQueue(queueName, &ReceiverOptions{ + ReceiveMode: ReceiveModeReceiveAndDelete, + }) require.NoError(t, err) - require.EqualValues(t, "topic/Subscriptions/subscription", path) - // using options - receiver = &Receiver{} - e = &entity{Topic: "topic", Subscription: "subscription"} + expectedTime, err := time.Parse(time.RFC3339, "2000-01-01T01:02:03Z") + require.NoError(t, err) - require.NoError(t, applyReceiverOptions(receiver, e, &ReceiverOptions{ - ReceiveMode: ReceiveModeReceiveAndDelete, - SubQueue: SubQueueTransfer, - retryOptions: utils.RetryOptions{ - MaxRetries: 101, + require.NoError(t, sender.SendMessage(context.Background(), &Message{ + Body: []byte("hello, this is the body"), + ApplicationProperties: map[string]interface{}{ + // Some primitive types are missing - it's a bit unclear what the right representation of this would be in Go: + // - TypeCodeDecimal32 + // - TypeCodeDecimal64 + // - TypeCodeDecimal128 + // - TypeCodeChar (although note below that a 'char' does work, although it's not a TypecodeChar value) + // https://github.com/Azure/go-amqp/blob/e0c6c63fb01e6642686ee4f8e7412da042bf35dd/internal/encoding/decode.go#L568 + "timestamp": expectedTime, + + "byte": byte(128), + "uint8": int8(101), + "uint32": int32(400), + "uint64": int64(400), + + "int": 400, + "int8": int8(-101), + "int32": int32(-400), + "int64": int64(-400), + + "float": 400.1, + "float64": float64(400.1), + + "string": "hello world", + // these aren't "true" chars in the amqp sense - they end up being in32's. + "char": 'g', + "char2": '❤', + + "bool": true, + "uuid": amqp.UUID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), }, })) - require.EqualValues(t, ReceiveModeReceiveAndDelete, receiver.receiveMode) - path, err = e.String() + messages, err := receiver.ReceiveMessages(context.Background(), 1, nil) require.NoError(t, err) - require.EqualValues(t, "topic/Subscriptions/subscription/$Transfer/$DeadLetterQueue", path) - require.EqualValues(t, 101, receiver.retryOptions.MaxRetries) + + actualProps := messages[0].ApplicationProperties + + require.Equal(t, map[string]interface{}{ + "timestamp": expectedTime, + + "byte": byte(128), + "uint8": int8(101), + "uint32": int32(400), + "uint64": int64(400), + + "int": int64(400), + "int8": int8(-101), + "int32": int32(-400), + "int64": int64(-400), + + "float": float64(400.1), + "float64": float64(400.1), + + "string": "hello world", + "char": 'g', + "char2": '❤', + + "bool": true, + "uuid": amqp.UUID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), + }, actualProps) } type badRPCLink struct { diff --git a/sdk/messaging/azservicebus/receiver_unit_test.go b/sdk/messaging/azservicebus/receiver_unit_test.go index d6a2aaa34554..05d2e1c9d1a1 100644 --- a/sdk/messaging/azservicebus/receiver_unit_test.go +++ b/sdk/messaging/azservicebus/receiver_unit_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/internal" + "github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus/internal/utils" "github.com/Azure/go-amqp" "github.com/stretchr/testify/require" ) @@ -262,3 +263,34 @@ func TestReceiverCancellationUnitTests(t *testing.T) { require.Empty(t, msgs) require.True(t, internal.IsCancelError(err)) } + +func TestReceiverOptions(t *testing.T) { + // defaults + receiver := &Receiver{} + e := &entity{Topic: "topic", Subscription: "subscription"} + + require.NoError(t, applyReceiverOptions(receiver, e, nil)) + + require.EqualValues(t, ReceiveModePeekLock, receiver.receiveMode) + path, err := e.String() + require.NoError(t, err) + require.EqualValues(t, "topic/Subscriptions/subscription", path) + + // using options + receiver = &Receiver{} + e = &entity{Topic: "topic", Subscription: "subscription"} + + require.NoError(t, applyReceiverOptions(receiver, e, &ReceiverOptions{ + ReceiveMode: ReceiveModeReceiveAndDelete, + SubQueue: SubQueueTransfer, + retryOptions: utils.RetryOptions{ + MaxRetries: 101, + }, + })) + + require.EqualValues(t, ReceiveModeReceiveAndDelete, receiver.receiveMode) + path, err = e.String() + require.NoError(t, err) + require.EqualValues(t, "topic/Subscriptions/subscription/$Transfer/$DeadLetterQueue", path) + require.EqualValues(t, 101, receiver.retryOptions.MaxRetries) +} From 84df996bbb2f5fab0211f6ba99c6d2969a13b474 Mon Sep 17 00:00:00 2001 From: ripark Date: Wed, 9 Mar 2022 14:33:28 -0800 Subject: [PATCH 2/2] Updating comment --- sdk/messaging/azservicebus/receiver_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/messaging/azservicebus/receiver_test.go b/sdk/messaging/azservicebus/receiver_test.go index 752903b7fee7..e2fd987d5aa1 100644 --- a/sdk/messaging/azservicebus/receiver_test.go +++ b/sdk/messaging/azservicebus/receiver_test.go @@ -572,7 +572,7 @@ func TestReceiverAMQPDataTypes(t *testing.T) { // - TypeCodeDecimal32 // - TypeCodeDecimal64 // - TypeCodeDecimal128 - // - TypeCodeChar (although note below that a 'char' does work, although it's not a TypecodeChar value) + // - TypeCodeChar (although note below that a 'character' does work, although it's not a TypecodeChar value) // https://github.com/Azure/go-amqp/blob/e0c6c63fb01e6642686ee4f8e7412da042bf35dd/internal/encoding/decode.go#L568 "timestamp": expectedTime, @@ -590,7 +590,7 @@ func TestReceiverAMQPDataTypes(t *testing.T) { "float64": float64(400.1), "string": "hello world", - // these aren't "true" chars in the amqp sense - they end up being in32's. + // these aren't "true" chars in the amqp sense - they end up being int32's "char": 'g', "char2": '❤',