Skip to content

Commit 991b2b0

Browse files
committed
chore(test): speedup some slow tests
- make consumer and produce retries zero backoff - use parallel on TLS test - reduce mockbroker noise - add mockresponses support for per-topic Err in MetadataResponse - use microseconds in test debug logger Signed-off-by: Dominic Evans <[email protected]>
1 parent fa7db9a commit 991b2b0

20 files changed

+170
-151
lines changed

async_producer_test.go

-9
Original file line numberDiff line numberDiff line change
@@ -2323,12 +2323,3 @@ ProducerLoop:
23232323

23242324
log.Printf("Successfully produced: %d; errors: %d\n", successes, producerErrors)
23252325
}
2326-
2327-
// NewTestConfig returns a config meant to be used by tests.
2328-
// Due to inconsistencies with the request versions the clients send using the default Kafka version
2329-
// and the response versions our mocks use, we default to the minimum Kafka version in most tests
2330-
func NewTestConfig() *Config {
2331-
config := NewConfig()
2332-
config.Version = MinVersion
2333-
return config
2334-
}

client_tls_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ func TestTLS(t *testing.T) {
175175
} {
176176
tc := tc
177177
t.Run(tc.name, func(t *testing.T) {
178+
t.Parallel()
178179
doListenerTLSTest(t, tc.Succeed, tc.Server, tc.Client)
179180
})
180181
}

config_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ import (
99
"github.com/rcrowley/go-metrics"
1010
)
1111

12+
// NewTestConfig returns a config meant to be used by tests.
13+
// Due to inconsistencies with the request versions the clients send using the default Kafka version
14+
// and the response versions our mocks use, we default to the minimum Kafka version in most tests
15+
func NewTestConfig() *Config {
16+
config := NewConfig()
17+
config.Consumer.Retry.Backoff = 0
18+
config.Producer.Retry.Backoff = 0
19+
config.Version = MinVersion
20+
return config
21+
}
22+
1223
func TestDefaultConfigValidates(t *testing.T) {
1324
config := NewTestConfig()
1425
if err := config.Validate(); err != nil {

consumer_group_test.go

+31-56
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func TestConsumerGroupNewSessionDuringOffsetLoad(t *testing.T) {
3737
config.Version = V2_0_0_0
3838
config.Consumer.Return.Errors = true
3939
config.Consumer.Group.Rebalance.Retry.Max = 2
40+
config.Consumer.Group.Rebalance.Retry.Backoff = 0
4041
config.Consumer.Offsets.AutoCommit.Enable = false
4142

4243
broker0 := NewMockBroker(t, 0)
@@ -100,72 +101,46 @@ func TestConsumerGroupNewSessionDuringOffsetLoad(t *testing.T) {
100101
}
101102

102103
func TestConsume_RaceTest(t *testing.T) {
103-
const groupID = "test-group"
104-
const topic = "test-topic"
105-
const offsetStart = int64(1234)
104+
const (
105+
groupID = "test-group"
106+
topic = "test-topic"
107+
offsetStart = int64(1234)
108+
)
106109

107-
cfg := NewConfig()
110+
cfg := NewTestConfig()
108111
cfg.Version = V2_8_1_0
109112
cfg.Consumer.Return.Errors = true
113+
cfg.Metadata.Full = true
110114

111115
seedBroker := NewMockBroker(t, 1)
112-
113-
joinGroupResponse := &JoinGroupResponse{}
114-
115-
syncGroupResponse := &SyncGroupResponse{
116-
Version: 3, // sarama > 2.3.0.0 uses version 3
117-
}
118-
// Leverage mock response to get the MemberAssignment bytes
119-
mockSyncGroupResponse := NewMockSyncGroupResponse(t).SetMemberAssignment(&ConsumerGroupMemberAssignment{
120-
Version: 1,
121-
Topics: map[string][]int32{topic: {0}}, // map "test-topic" to partition 0
122-
UserData: []byte{0x01},
123-
})
124-
syncGroupResponse.MemberAssignment = mockSyncGroupResponse.MemberAssignment
125-
126-
heartbeatResponse := &HeartbeatResponse{
127-
Err: ErrNoError,
128-
}
129-
offsetFetchResponse := &OffsetFetchResponse{
130-
Version: 1,
131-
ThrottleTimeMs: 0,
132-
Err: ErrNoError,
133-
}
134-
offsetFetchResponse.AddBlock(topic, 0, &OffsetFetchResponseBlock{
135-
Offset: offsetStart,
136-
LeaderEpoch: 0,
137-
Metadata: "",
138-
Err: ErrNoError,
139-
})
140-
141-
offsetResponse := &OffsetResponse{
142-
Version: 1,
143-
}
144-
offsetResponse.AddTopicPartition(topic, 0, offsetStart)
145-
146-
metadataResponse := new(MetadataResponse)
147-
metadataResponse.Version = 10
148-
metadataResponse.AddBroker(seedBroker.Addr(), seedBroker.BrokerID())
149-
metadataResponse.AddTopic("mismatched-topic", ErrUnknownTopicOrPartition)
116+
defer seedBroker.Close()
150117

151118
handlerMap := map[string]MockResponse{
152119
"ApiVersionsRequest": NewMockApiVersionsResponse(t),
153-
"MetadataRequest": NewMockSequence(metadataResponse),
154-
"OffsetRequest": NewMockSequence(offsetResponse),
155-
"OffsetFetchRequest": NewMockSequence(offsetFetchResponse),
156-
"FindCoordinatorRequest": NewMockSequence(NewMockFindCoordinatorResponse(t).
157-
SetCoordinator(CoordinatorGroup, groupID, seedBroker)),
158-
"JoinGroupRequest": NewMockSequence(joinGroupResponse),
159-
"SyncGroupRequest": NewMockSequence(syncGroupResponse),
160-
"HeartbeatRequest": NewMockSequence(heartbeatResponse),
120+
"MetadataRequest": NewMockMetadataResponse(t).
121+
SetBroker(seedBroker.Addr(), seedBroker.BrokerID()).
122+
SetError("mismatched-topic", ErrUnknownTopicOrPartition),
123+
"OffsetRequest": NewMockOffsetResponse(t).
124+
SetOffset(topic, 0, -1, offsetStart),
125+
"OffsetFetchRequest": NewMockOffsetFetchResponse(t).
126+
SetOffset(groupID, topic, 0, offsetStart, "", ErrNoError),
127+
"FindCoordinatorRequest": NewMockFindCoordinatorResponse(t).
128+
SetCoordinator(CoordinatorGroup, groupID, seedBroker),
129+
"JoinGroupRequest": NewMockJoinGroupResponse(t),
130+
"SyncGroupRequest": NewMockSyncGroupResponse(t).SetMemberAssignment(
131+
&ConsumerGroupMemberAssignment{
132+
Version: 1,
133+
Topics: map[string][]int32{topic: {0}}, // map "test-topic" to partition 0
134+
UserData: []byte{0x01},
135+
},
136+
),
137+
"HeartbeatRequest": NewMockHeartbeatResponse(t),
161138
}
162139
seedBroker.SetHandlerByMap(handlerMap)
163140

164-
cancelCtx, cancel := context.WithDeadline(context.Background(), time.Now().Add(4*time.Second))
165-
166-
defer seedBroker.Close()
141+
cancelCtx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
167142

168-
retryWait := 20 * time.Millisecond
143+
retryWait := 10 * time.Millisecond
169144
var err error
170145
clientRetries := 0
171146
outerFor:
@@ -195,8 +170,8 @@ outerFor:
195170
t.Fatalf("should not proceed to Consume")
196171
}
197172

198-
if clientRetries <= 0 {
199-
t.Errorf("clientRetries = %v; want > 0", clientRetries)
173+
if clientRetries <= 1 {
174+
t.Errorf("clientRetries = %v; want > 1", clientRetries)
200175
}
201176

202177
if err != nil && !errors.Is(err, context.DeadlineExceeded) {

consumer_test.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ func TestConsumeMessagesFromReadReplica(t *testing.T) {
860860
block4 := fetchResponse4.GetBlock("my_topic", 0)
861861
block4.PreferredReadReplica = -1
862862

863-
cfg := NewConfig()
863+
cfg := NewTestConfig()
864864
cfg.Version = V2_3_0_0
865865
cfg.RackID = "consumer_rack"
866866

@@ -925,7 +925,7 @@ func TestConsumeMessagesFromReadReplicaLeaderFallback(t *testing.T) {
925925
block2 := fetchResponse2.GetBlock("my_topic", 0)
926926
block2.PreferredReadReplica = -1
927927

928-
cfg := NewConfig()
928+
cfg := NewTestConfig()
929929
cfg.Version = V2_3_0_0
930930
cfg.RackID = "consumer_rack"
931931

@@ -981,7 +981,7 @@ func TestConsumeMessagesFromReadReplicaErrorReplicaNotAvailable(t *testing.T) {
981981
fetchResponse4.AddMessage("my_topic", 0, nil, testMsg, 3)
982982
fetchResponse4.AddMessage("my_topic", 0, nil, testMsg, 4)
983983

984-
cfg := NewConfig()
984+
cfg := NewTestConfig()
985985
cfg.Version = V2_3_0_0
986986
cfg.RackID = "consumer_rack"
987987

@@ -1051,7 +1051,7 @@ func TestConsumeMessagesFromReadReplicaErrorUnknown(t *testing.T) {
10511051
fetchResponse4.AddMessage("my_topic", 0, nil, testMsg, 3)
10521052
fetchResponse4.AddMessage("my_topic", 0, nil, testMsg, 4)
10531053

1054-
cfg := NewConfig()
1054+
cfg := NewTestConfig()
10551055
cfg.Version = V2_3_0_0
10561056
cfg.RackID = "consumer_rack"
10571057

@@ -1109,9 +1109,10 @@ func TestConsumeMessagesFromReadReplicaErrorUnknown(t *testing.T) {
11091109
//
11101110
// See https://github.com/IBM/sarama/issues/1927
11111111
func TestConsumeMessagesTrackLeader(t *testing.T) {
1112-
cfg := NewConfig()
1112+
cfg := NewTestConfig()
11131113
cfg.ClientID = t.Name()
11141114
cfg.Metadata.RefreshFrequency = time.Millisecond * 50
1115+
cfg.Consumer.Retry.Backoff = 0
11151116
cfg.Net.MaxOpenRequests = 1
11161117
cfg.Version = V2_1_0_0
11171118

@@ -1996,7 +1997,7 @@ func Test_partitionConsumer_parseResponseEmptyBatch(t *testing.T) {
19961997
broker: &brokerConsumer{
19971998
broker: &Broker{},
19981999
},
1999-
conf: NewConfig(),
2000+
conf: NewTestConfig(),
20002001
topic: "my_topic",
20012002
partition: 0,
20022003
}

functional_admin_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestFuncAdminQuotas(t *testing.T) {
1717
t.Fatal(err)
1818
}
1919

20-
config := NewTestConfig()
20+
config := NewFunctionalTestConfig()
2121
config.Version = kafkaVersion
2222
adminClient, err := NewClusterAdmin(FunctionalTestEnv.KafkaBrokerAddrs, config)
2323
if err != nil {
@@ -137,21 +137,21 @@ func TestFuncAdminDescribeGroups(t *testing.T) {
137137
t.Fatal(err)
138138
}
139139

140-
config := NewTestConfig()
140+
config := NewFunctionalTestConfig()
141141
config.Version = kafkaVersion
142142
adminClient, err := NewClusterAdmin(FunctionalTestEnv.KafkaBrokerAddrs, config)
143143
if err != nil {
144144
t.Fatal(err)
145145
}
146146

147-
config1 := NewTestConfig()
147+
config1 := NewFunctionalTestConfig()
148148
config1.ClientID = "M1"
149149
config1.Version = V2_3_0_0
150150
config1.Consumer.Offsets.Initial = OffsetNewest
151151
m1 := runTestFuncConsumerGroupMemberWithConfig(t, config1, group1, 100, nil, "test.4")
152152
defer m1.Close()
153153

154-
config2 := NewTestConfig()
154+
config2 := NewFunctionalTestConfig()
155155
config2.ClientID = "M2"
156156
config2.Version = V2_3_0_0
157157
config2.Consumer.Offsets.Initial = OffsetNewest

functional_client_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestFuncConnectionFailure(t *testing.T) {
1717
FunctionalTestEnv.Proxies["kafka1"].Enabled = false
1818
SaveProxy(t, "kafka1")
1919

20-
config := NewTestConfig()
20+
config := NewFunctionalTestConfig()
2121
config.Metadata.Retry.Max = 1
2222

2323
_, err := NewClient([]string{FunctionalTestEnv.KafkaBrokerAddrs[0]}, config)
@@ -30,7 +30,7 @@ func TestFuncClientMetadata(t *testing.T) {
3030
setupFunctionalTest(t)
3131
defer teardownFunctionalTest(t)
3232

33-
config := NewTestConfig()
33+
config := NewFunctionalTestConfig()
3434
config.Metadata.Retry.Max = 1
3535
config.Metadata.Retry.Backoff = 10 * time.Millisecond
3636
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, config)
@@ -74,7 +74,7 @@ func TestFuncClientCoordinator(t *testing.T) {
7474
setupFunctionalTest(t)
7575
defer teardownFunctionalTest(t)
7676

77-
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, NewTestConfig())
77+
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, NewFunctionalTestConfig())
7878
if err != nil {
7979
t.Fatal(err)
8080
}

functional_consumer_follower_fetch_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestConsumerFetchFollowerFailover(t *testing.T) {
1919
)
2020

2121
newConfig := func() *Config {
22-
config := NewConfig()
22+
config := NewFunctionalTestConfig()
2323
config.ClientID = t.Name()
2424
config.Version = V2_8_0_0
2525
config.Producer.Return.Successes = true
@@ -81,7 +81,8 @@ func TestConsumerFetchFollowerFailover(t *testing.T) {
8181
go func() {
8282
for i := 0; i < numMsg; i++ {
8383
msg := &ProducerMessage{
84-
Topic: topic, Key: nil, Value: StringEncoder(fmt.Sprintf("%s %-3d", t.Name(), i))}
84+
Topic: topic, Key: nil, Value: StringEncoder(fmt.Sprintf("%s %-3d", t.Name(), i)),
85+
}
8586
if _, offset, err := producer.SendMessage(msg); err != nil {
8687
t.Error(i, err)
8788
} else if offset%50 == 0 {

functional_consumer_group_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func TestFuncConsumerGroupRebalanceAfterAddingPartitions(t *testing.T) {
140140
setupFunctionalTest(t)
141141
defer teardownFunctionalTest(t)
142142

143-
config := NewTestConfig()
143+
config := NewFunctionalTestConfig()
144144
config.Version = V2_3_0_0
145145
admin, err := NewClusterAdmin(FunctionalTestEnv.KafkaBrokerAddrs, config)
146146
if err != nil {
@@ -245,7 +245,7 @@ func TestFuncConsumerGroupOffsetDeletion(t *testing.T) {
245245
defer teardownFunctionalTest(t)
246246
// create a client with 2.4.0 version as it is the minimal version
247247
// that supports DeleteOffsets request
248-
config := NewTestConfig()
248+
config := NewFunctionalTestConfig()
249249
config.Version = V2_4_0_0
250250
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, config)
251251
defer safeClose(t, client)
@@ -315,7 +315,7 @@ func markOffset(t *testing.T, offsetMgr OffsetManager, topic string, partition i
315315
}
316316

317317
func testFuncConsumerGroupFuzzySeed(topic string) error {
318-
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, NewTestConfig())
318+
client, err := NewClient(FunctionalTestEnv.KafkaBrokerAddrs, NewFunctionalTestConfig())
319319
if err != nil {
320320
return err
321321
}
@@ -399,7 +399,7 @@ type testFuncConsumerGroupMember struct {
399399
}
400400

401401
func defaultConfig(clientID string) *Config {
402-
config := NewConfig()
402+
config := NewFunctionalTestConfig()
403403
config.ClientID = clientID
404404
config.Version = V0_10_2_0
405405
config.Consumer.Return.Errors = true

0 commit comments

Comments
 (0)