Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 74 additions & 21 deletions sdk/messaging/azservicebus/receiver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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 '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,

"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 int32'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 {
Expand Down
32 changes: 32 additions & 0 deletions sdk/messaging/azservicebus/receiver_unit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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)
}