Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bug: V5 MetadataRequest nullable topics array #1353

Merged
merged 1 commit into from
Apr 12, 2019
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
2 changes: 1 addition & 1 deletion metadata_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ func (r *MetadataRequest) encode(pe packetEncoder) error {
if r.Version < 0 || r.Version > 5 {
return PacketEncodingError{"invalid or unsupported MetadataRequest version field"}
}
if r.Version == 0 || r.Version == 5 || len(r.Topics) > 0 {
if r.Version == 0 || len(r.Topics) > 0 {
err := pe.putArrayLength(len(r.Topics))
if err != nil {
return err
Expand Down
83 changes: 71 additions & 12 deletions metadata_request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,63 @@ package sarama
import "testing"

var (
// The v0 metadata request has a non-nullable array of topic names
// to request metadata for. An empty array fetches metadata for all topics

metadataRequestNoTopicsV0 = []byte{
0x00, 0x00, 0x00, 0x00}
0x00, 0x00, 0x00, 0x00,
}

metadataRequestOneTopicV0 = []byte{
0x00, 0x00, 0x00, 0x01,
0x00, 0x06, 't', 'o', 'p', 'i', 'c', '1'}
0x00, 0x06, 't', 'o', 'p', 'i', 'c', '1',
}

metadataRequestThreeTopicsV0 = []byte{
0x00, 0x00, 0x00, 0x03,
0x00, 0x03, 'f', 'o', 'o',
0x00, 0x03, 'b', 'a', 'r',
0x00, 0x03, 'b', 'a', 'z'}
0x00, 0x03, 'b', 'a', 'z',
}

// The v1 metadata request is the same as v0 except that the array is now
// nullable and should be explicitly null if all topics are required (an
// empty list requests no topics)

metadataRequestNoTopicsV1 = []byte{
0xff, 0xff, 0xff, 0xff}
0xff, 0xff, 0xff, 0xff,
}

metadataRequestOneTopicV1 = metadataRequestOneTopicV0
metadataRequestThreeTopicsV1 = metadataRequestThreeTopicsV0

// The v2 metadata request is the same as v1. An additional field for
// cluster id has been added to the v2 metadata response

metadataRequestNoTopicsV2 = metadataRequestNoTopicsV1
metadataRequestOneTopicV2 = metadataRequestOneTopicV1
metadataRequestThreeTopicsV2 = metadataRequestThreeTopicsV1

// The v3 metadata request is the same as v1 and v2. An additional field
// for throttle time has been added to the v3 metadata response

metadataRequestNoTopicsV3 = metadataRequestNoTopicsV2
metadataRequestOneTopicV3 = metadataRequestOneTopicV2
metadataRequestThreeTopicsV3 = metadataRequestThreeTopicsV2

// The v4 metadata request has an additional field for allowing auto topic
// creation. The response is the same as v3.

metadataRequestAutoCreateV4 = append(metadataRequestOneTopicV0, byte(1))
metadataRequestNoAutoCreateV4 = append(metadataRequestOneTopicV0, byte(0))
metadataRequestNoTopicsV4 = append(metadataRequestNoTopicsV1, byte(0))
metadataRequestAutoCreateV4 = append(metadataRequestOneTopicV3, byte(1))
metadataRequestNoAutoCreateV4 = append(metadataRequestOneTopicV3, byte(0))

// The v5 metadata request is the same as v4. An additional field for
// offline_replicas has been added to the v5 metadata response

metadataRequestNoTopicsV5 = append(metadataRequestNoTopicsV1, byte(0))
metadataRequestAutoCreateV5 = append(metadataRequestOneTopicV3, byte(1))
metadataRequestNoAutoCreateV5 = append(metadataRequestOneTopicV3, byte(0))
)

func TestMetadataRequestV0(t *testing.T) {
Expand All @@ -40,37 +79,57 @@ func TestMetadataRequestV1(t *testing.T) {
testRequest(t, "no topics", request, metadataRequestNoTopicsV1)

request.Topics = []string{"topic1"}
testRequest(t, "one topic", request, metadataRequestOneTopicV0)
testRequest(t, "one topic", request, metadataRequestOneTopicV1)

request.Topics = []string{"foo", "bar", "baz"}
testRequest(t, "three topics", request, metadataRequestThreeTopicsV0)
testRequest(t, "three topics", request, metadataRequestThreeTopicsV1)
}

func TestMetadataRequestV2(t *testing.T) {
request := new(MetadataRequest)
request.Version = 2
testRequest(t, "no topics", request, metadataRequestNoTopicsV1)
testRequest(t, "no topics", request, metadataRequestNoTopicsV2)

request.Topics = []string{"topic1"}
testRequest(t, "one topic", request, metadataRequestOneTopicV0)
testRequest(t, "one topic", request, metadataRequestOneTopicV2)

request.Topics = []string{"foo", "bar", "baz"}
testRequest(t, "three topics", request, metadataRequestThreeTopicsV2)
}

func TestMetadataRequestV3(t *testing.T) {
request := new(MetadataRequest)
request.Version = 3
testRequest(t, "no topics", request, metadataRequestNoTopicsV1)
testRequest(t, "no topics", request, metadataRequestNoTopicsV3)

request.Topics = []string{"topic1"}
testRequest(t, "one topic", request, metadataRequestOneTopicV0)
testRequest(t, "one topic", request, metadataRequestOneTopicV3)
}

func TestMetadataRequestV4(t *testing.T) {
request := new(MetadataRequest)
request.Version = 4
testRequest(t, "no topics", request, metadataRequestNoTopicsV4)

request.Topics = []string{"topic1"}

request.AllowAutoTopicCreation = true
testRequest(t, "one topic", request, metadataRequestAutoCreateV4)

request.AllowAutoTopicCreation = false
testRequest(t, "one topic", request, metadataRequestNoAutoCreateV4)
}

func TestMetadataRequestV5(t *testing.T) {
request := new(MetadataRequest)
request.Version = 5
testRequest(t, "no topics", request, metadataRequestNoTopicsV4)

request.Topics = []string{"topic1"}

request.AllowAutoTopicCreation = true
testRequest(t, "one topic", request, metadataRequestAutoCreateV5)

request.AllowAutoTopicCreation = false
testRequest(t, "one topic", request, metadataRequestNoAutoCreateV5)
}