Skip to content

Commit cd17f4e

Browse files
craig[bot]pav-kv
andcommitted
Merge #156336
156336: testutils: introduce datadriven test helpers r=stevendanna a=pav-kv This PR introduces 3 trivial helpers for parsing arguments in `datadriven` tests. These cover the vast majority of use-cases and cut the parsing boilerplate in half. See individual commits, separated by package (only sub-packages of `kvserver` at this point). Examples: ```golang var ( rangeID = dd.ScanArg[roachpb.RangeID](t, d, "id") // required flag = dd.ScanArgOr(t, d, "flag", false) // optional flag param = dd.ScanArgOr[uint32](t, d, "param", 10) // optional, with a default ids = dd.ScanArgOr[[]roachpb.NodeID](t, d, "nodes", nil) // slice ) // Optional argument with explicit presence handling. if str, ok := dd.ScanArgOpt[string](t, d, "key"); ok { // do something with str, e.g. parse further } ``` This PR also simplifies a few places in tests where manual parsing was unnecessary because `datadriven` supports the corresponding types natively (e.g. `time.Duration` and slices). In many cases, it also removes redundant type conversions, since the right type can be used as the generic parameter from the beginning. Epic: none Release note: none Co-authored-by: Pavel Kalinnikov <pavel@cockroachlabs.com>
2 parents c6539d4 + 9ce15ed commit cd17f4e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+523
-901
lines changed

pkg/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2472,6 +2472,7 @@ GO_TARGETS = [
24722472
"//pkg/testutils/bazelcodecover:bazelcodecover",
24732473
"//pkg/testutils/colcontainerutils:colcontainerutils",
24742474
"//pkg/testutils/datapathutils:datapathutils",
2475+
"//pkg/testutils/dd:dd",
24752476
"//pkg/testutils/diagutils:diagutils",
24762477
"//pkg/testutils/distsqlutils:distsqlutils",
24772478
"//pkg/testutils/docker/docker-fsnotify:docker-fsnotify",

pkg/kv/kvserver/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ go_test(
517517
"//pkg/storage/storageconfig",
518518
"//pkg/testutils",
519519
"//pkg/testutils/datapathutils",
520+
"//pkg/testutils/dd",
520521
"//pkg/testutils/echotest",
521522
"//pkg/testutils/gossiputil",
522523
"//pkg/testutils/jobutils",

pkg/kv/kvserver/allocator/mmaprototype/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ go_test(
4747
"//pkg/roachpb",
4848
"//pkg/spanconfig/spanconfigtestutils",
4949
"//pkg/testutils/datapathutils",
50+
"//pkg/testutils/dd",
5051
"//pkg/util/randutil",
5152
"//pkg/util/timeutil",
5253
"@com_github_cockroachdb_datadriven//:datadriven",

pkg/kv/kvserver/allocator/mmaprototype/allocator_state_test.go

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ package mmaprototype
88
import (
99
"fmt"
1010
"slices"
11-
"strconv"
1211
"strings"
1312
"testing"
1413

14+
"github.com/cockroachdb/cockroach/pkg/testutils/dd"
1515
"github.com/cockroachdb/datadriven"
1616
"github.com/stretchr/testify/require"
1717
)
@@ -26,16 +26,8 @@ func TestDiversityScoringMemo(t *testing.T) {
2626
datadriven.RunTest(t, "testdata/diversity_scoring_memo",
2727
func(t *testing.T, d *datadriven.TestData) string {
2828
scanStores := func() []localityTiers {
29-
var storesStr string
30-
d.ScanArgs(t, "store-ids", &storesStr)
31-
storesStrSlice := strings.Split(storesStr, ",")
32-
var storeIDs []int
33-
for _, s := range storesStrSlice {
34-
storeID, err := strconv.Atoi(s)
35-
require.NoError(t, err)
36-
storeIDs = append(storeIDs, storeID)
37-
}
38-
var res []localityTiers
29+
storeIDs := dd.ScanArg[[]int](t, d, "store-ids")
30+
res := make([]localityTiers, 0, len(storeIDs))
3931
for _, storeID := range storeIDs {
4032
l, ok := storeLocalities[storeID]
4133
require.True(t, ok)
@@ -59,18 +51,15 @@ func TestDiversityScoringMemo(t *testing.T) {
5951
}
6052
}
6153
getStoreLocality := func(key string) localityTiers {
62-
var storeID int
63-
d.ScanArgs(t, key, &storeID)
54+
storeID := dd.ScanArg[int](t, d, key)
6455
l, ok := storeLocalities[storeID]
6556
require.True(t, ok)
6657
return l
6758
}
6859
switch d.Cmd {
6960
case "store":
70-
var storeID int
71-
d.ScanArgs(t, "store-id", &storeID)
72-
var lts string
73-
d.ScanArgs(t, "locality-tiers", &lts)
61+
storeID := dd.ScanArg[int](t, d, "store-id")
62+
lts := dd.ScanArg[string](t, d, "locality-tiers")
7463
locality := parseLocalityTiers(t, lts)
7564
lt := ltInterner.intern(locality)
7665
storeLocalities[storeID] = lt

pkg/kv/kvserver/allocator/mmaprototype/cluster_state_test.go

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/cockroachdb/cockroach/pkg/roachpb"
1818
"github.com/cockroachdb/cockroach/pkg/spanconfig/spanconfigtestutils"
1919
"github.com/cockroachdb/cockroach/pkg/testutils/datapathutils"
20+
"github.com/cockroachdb/cockroach/pkg/testutils/dd"
2021
"github.com/cockroachdb/cockroach/pkg/util/timeutil"
2122
"github.com/cockroachdb/datadriven"
2223
"github.com/stretchr/testify/require"
@@ -365,20 +366,17 @@ func TestClusterState(t *testing.T) {
365366
return printNodeListMeta()
366367

367368
case "set-store-membership":
368-
var storeID int
369-
d.ScanArgs(t, "store-id", &storeID)
370-
var storeMembershipString string
371-
d.ScanArgs(t, "membership", &storeMembershipString)
369+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
372370
var storeMembershipVal storeMembership
373-
switch storeMembershipString {
371+
switch str := dd.ScanArg[string](t, d, "membership"); str {
374372
case "member":
375373
storeMembershipVal = storeMembershipMember
376374
case "removing":
377375
storeMembershipVal = storeMembershipRemoving
378376
case "removed":
379377
storeMembershipVal = storeMembershipRemoved
380378
}
381-
cs.setStoreMembership(roachpb.StoreID(storeID), storeMembershipVal)
379+
cs.setStoreMembership(storeID, storeMembershipVal)
382380

383381
var buf strings.Builder
384382
nonRemovedStores, removedStores := testingGetStoreList(t, cs)
@@ -389,18 +387,16 @@ func TestClusterState(t *testing.T) {
389387
return buf.String()
390388

391389
case "update-failure-detection":
392-
var nodeID int
393-
var failureDetectionString string
394-
d.ScanArgs(t, "node-id", &nodeID)
395-
d.ScanArgs(t, "summary", &failureDetectionString)
390+
nodeID := dd.ScanArg[roachpb.NodeID](t, d, "node-id")
391+
failureDetectionString := dd.ScanArg[string](t, d, "summary")
396392
var fd failureDetectionSummary
397393
for i := fdOK; i < fdDead+1; i++ {
398394
if i.String() == failureDetectionString {
399395
fd = i
400396
break
401397
}
402398
}
403-
cs.updateFailureDetectionSummary(roachpb.NodeID(nodeID), fd)
399+
cs.updateFailureDetectionSummary(nodeID, fd)
404400
return printNodeListMeta()
405401

406402
case "store-load-msg":
@@ -414,10 +410,8 @@ func TestClusterState(t *testing.T) {
414410
return ""
415411

416412
case "make-pending-changes":
417-
var rid int
413+
rangeID := dd.ScanArg[roachpb.RangeID](t, d, "range-id")
418414
var changes []ReplicaChange
419-
d.ScanArgs(t, "range-id", &rid)
420-
rangeID := roachpb.RangeID(rid)
421415
rState := cs.ranges[rangeID]
422416

423417
lines := strings.Split(d.Input, "\n")
@@ -467,19 +461,17 @@ func TestClusterState(t *testing.T) {
467461
return printPendingChangesTest(testingGetPendingChanges(t, cs))
468462

469463
case "reject-pending-changes":
470-
var changeIDsInt []int
471-
d.ScanArgs(t, "change-ids", &changeIDsInt)
464+
changeIDsInt := dd.ScanArg[[]ChangeID](t, d, "change-ids")
472465
for _, id := range changeIDsInt {
473-
cs.undoPendingChange(ChangeID(id), true)
466+
cs.undoPendingChange(id, true)
474467
}
475468
return printPendingChangesTest(testingGetPendingChanges(t, cs))
476469

477470
case "get-pending-changes":
478471
return printPendingChangesTest(testingGetPendingChanges(t, cs))
479472

480473
case "tick":
481-
var seconds int
482-
d.ScanArgs(t, "seconds", &seconds)
474+
seconds := dd.ScanArg[int](t, d, "seconds")
483475
ts.Advance(time.Second * time.Duration(seconds))
484476
return fmt.Sprintf("t=%v", ts.Now().Sub(testingBaseTime))
485477

pkg/kv/kvserver/allocator/mmaprototype/constraint_matcher_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"testing"
1313

1414
"github.com/cockroachdb/cockroach/pkg/roachpb"
15+
"github.com/cockroachdb/cockroach/pkg/testutils/dd"
1516
"github.com/cockroachdb/cockroach/pkg/util/randutil"
1617
"github.com/cockroachdb/datadriven"
1718
"github.com/stretchr/testify/require"
@@ -99,23 +100,21 @@ func TestConstraintMatcher(t *testing.T) {
99100
return b.String()
100101

101102
case "remove-store":
102-
var storeID int
103-
d.ScanArgs(t, "store-id", &storeID)
104-
cm.removeStore(roachpb.StoreID(storeID))
103+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
104+
cm.removeStore(storeID)
105105
var b strings.Builder
106106
printMatcher(&b)
107107
return b.String()
108108

109109
case "store-matches":
110-
var storeID int
111-
d.ScanArgs(t, "store-id", &storeID)
110+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
112111
lines := strings.Split(d.Input, "\n")
113112
require.Greater(t, 2, len(lines))
114113
var cc []roachpb.Constraint
115114
if len(lines) == 1 {
116115
cc = parseConstraints(t, strings.Fields(strings.TrimSpace(lines[0])))
117116
}
118-
matches := cm.storeMatches(roachpb.StoreID(storeID), interner.internConstraintsConj(cc))
117+
matches := cm.storeMatches(storeID, interner.internConstraintsConj(cc))
119118
return fmt.Sprintf("%t", matches)
120119

121120
case "match-stores":

pkg/kv/kvserver/allocator/mmaprototype/constraint_test.go

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"testing"
1515

1616
"github.com/cockroachdb/cockroach/pkg/roachpb"
17+
"github.com/cockroachdb/cockroach/pkg/testutils/dd"
1718
"github.com/cockroachdb/datadriven"
1819
"github.com/cockroachdb/errors"
1920
"github.com/stretchr/testify/require"
@@ -66,12 +67,10 @@ func parseConstraintsConj(t *testing.T, fields []string) roachpb.ConstraintsConj
6667
}
6768

6869
func parseSpanConfig(t *testing.T, d *datadriven.TestData) roachpb.SpanConfig {
69-
var numReplicas, numVoters int
70-
var conf roachpb.SpanConfig
71-
d.ScanArgs(t, "num-replicas", &numReplicas)
72-
conf.NumReplicas = int32(numReplicas)
73-
d.ScanArgs(t, "num-voters", &numVoters)
74-
conf.NumVoters = int32(numVoters)
70+
conf := roachpb.SpanConfig{
71+
NumReplicas: dd.ScanArg[int32](t, d, "num-replicas"),
72+
NumVoters: dd.ScanArg[int32](t, d, "num-voters"),
73+
}
7574
for _, line := range strings.Split(d.Input, "\n") {
7675
parts := strings.Fields(line)
7776
if len(parts) == 0 {
@@ -169,8 +168,7 @@ func TestStoreIDPostingList(t *testing.T) {
169168
func(t *testing.T, d *datadriven.TestData) string {
170169
switch d.Cmd {
171170
case "pl":
172-
var name string
173-
d.ScanArgs(t, "name", &name)
171+
name := dd.ScanArg[string](t, d, "name")
174172
var storeIDs []roachpb.StoreID
175173
for _, line := range strings.Split(d.Input, "\n") {
176174
parts := strings.Fields(line)
@@ -190,9 +188,8 @@ func TestStoreIDPostingList(t *testing.T) {
190188
return b.String()
191189

192190
case "intersect", "union", "is-equal":
193-
var x, y string
194-
d.ScanArgs(t, "x", &x)
195-
d.ScanArgs(t, "y", &y)
191+
x := dd.ScanArg[string](t, d, "x")
192+
y := dd.ScanArg[string](t, d, "y")
196193
plX := pls[x]
197194
if d.Cmd == "is-equal" {
198195
return fmt.Sprintf("%t", plX.isEqual(pls[y]))
@@ -212,19 +209,17 @@ func TestStoreIDPostingList(t *testing.T) {
212209
}
213210

214211
case "insert", "contains", "remove":
215-
var name string
216-
d.ScanArgs(t, "name", &name)
212+
name := dd.ScanArg[string](t, d, "name")
217213
pl := pls[name]
218-
var storeID int
219-
d.ScanArgs(t, "store-id", &storeID)
214+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
220215
if d.Cmd == "contains" {
221-
return fmt.Sprintf("%t", pl.contains(roachpb.StoreID(storeID)))
216+
return fmt.Sprintf("%t", pl.contains(storeID))
222217
} else {
223218
var rv bool
224219
if d.Cmd == "insert" {
225-
rv = pl.insert(roachpb.StoreID(storeID))
220+
rv = pl.insert(storeID)
226221
} else {
227-
rv = pl.remove(roachpb.StoreID(storeID))
222+
rv = pl.remove(storeID)
228223
}
229224
if forceAllocation {
230225
pl = pl[:len(pl):len(pl)]
@@ -237,9 +232,7 @@ func TestStoreIDPostingList(t *testing.T) {
237232
}
238233

239234
case "hash":
240-
var name string
241-
d.ScanArgs(t, "name", &name)
242-
pl := pls[name]
235+
pl := pls[dd.ScanArg[string](t, d, "name")]
243236
return fmt.Sprintf("%d", pl.hash())
244237

245238
default:
@@ -375,8 +368,7 @@ func TestRangeAnalyzedConstraints(t *testing.T) {
375368
return ""
376369

377370
case "span-config":
378-
var name string
379-
d.ScanArgs(t, "name", &name)
371+
name := dd.ScanArg[string](t, d, "name")
380372
conf := parseSpanConfig(t, d)
381373
var b strings.Builder
382374
nConf, err := makeNormalizedSpanConfig(&conf, interner)
@@ -388,10 +380,8 @@ func TestRangeAnalyzedConstraints(t *testing.T) {
388380
return b.String()
389381

390382
case "analyze-constraints":
391-
var configName string
392-
d.ScanArgs(t, "config-name", &configName)
393-
var leaseholder int
394-
d.ScanArgs(t, "leaseholder", &leaseholder)
383+
configName := dd.ScanArg[string](t, d, "config-name")
384+
leaseholder := dd.ScanArg[roachpb.StoreID](t, d, "leaseholder")
395385
nConf := configs[configName]
396386
rac := rangeAnalyzedConstraintsPool.Get().(*rangeAnalyzedConstraints)
397387
buf := rac.stateForInit()
@@ -419,7 +409,7 @@ func TestRangeAnalyzedConstraints(t *testing.T) {
419409
buf.tryAddingStore(roachpb.StoreID(storeID), typ,
420410
ltInterner.intern(stores[roachpb.StoreID(storeID)].locality()))
421411
}
422-
rac.finishInit(nConf, cm, roachpb.StoreID(leaseholder))
412+
rac.finishInit(nConf, cm, leaseholder)
423413
var b strings.Builder
424414
printRangeAnalyzedConstraints(&b, rac, ltInterner)
425415
// If there is a previous rangeAnalyzedConstraints, release it before

pkg/kv/kvserver/allocator/mmaprototype/load_test.go

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"testing"
1313

1414
"github.com/cockroachdb/cockroach/pkg/roachpb"
15+
"github.com/cockroachdb/cockroach/pkg/testutils/dd"
1516
"github.com/cockroachdb/datadriven"
1617
"github.com/stretchr/testify/require"
1718
)
@@ -75,44 +76,37 @@ func TestMeansMemo(t *testing.T) {
7576
return ""
7677

7778
case "store-load":
78-
var storeID int
79-
d.ScanArgs(t, "store-id", &storeID)
80-
sal, ok := storeMap[roachpb.StoreID(storeID)]
79+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
80+
sal, ok := storeMap[storeID]
8181
require.True(t, ok)
8282
var cpuLoad, wbLoad, bsLoad int64
8383
d.ScanArgs(t, "load", &cpuLoad, &wbLoad, &bsLoad)
8484
var cpuCapacity, wbCapacity, bsCapacity int64
8585
d.ScanArgs(t, "capacity", &cpuCapacity, &wbCapacity, &bsCapacity)
86-
var leaseCountLoad int64
87-
d.ScanArgs(t, "secondary-load", &leaseCountLoad)
86+
leaseCountLoad := dd.ScanArg[LoadValue](t, d, "secondary-load")
8887
sLoad := &storeLoad{
8988
reportedLoad: LoadVector{LoadValue(cpuLoad), LoadValue(wbLoad), LoadValue(bsLoad)},
9089
capacity: LoadVector{
9190
LoadValue(cpuCapacity), LoadValue(wbCapacity), LoadValue(bsCapacity)},
92-
reportedSecondaryLoad: SecondaryLoadVector{LoadValue(leaseCountLoad)},
91+
reportedSecondaryLoad: SecondaryLoadVector{leaseCountLoad},
9392
}
9493
for i := range sLoad.capacity {
9594
if sLoad.capacity[i] < 0 {
9695
sLoad.capacity[i] = UnknownCapacity
9796
}
9897
}
99-
loadProvider.sloads[roachpb.StoreID(storeID)] = storeLoadAndNodeID{
98+
loadProvider.sloads[storeID] = storeLoadAndNodeID{
10099
nodeID: sal.NodeID,
101100
storeLoad: sLoad,
102101
}
103102

104103
return ""
105104

106105
case "node-load":
107-
var nodeID int
108-
d.ScanArgs(t, "node-id", &nodeID)
109-
var cpuLoad, cpuCapacity int64
110-
d.ScanArgs(t, "cpu-load", &cpuLoad)
111-
d.ScanArgs(t, "cpu-capacity", &cpuCapacity)
112106
nLoad := &NodeLoad{
113-
NodeID: roachpb.NodeID(nodeID),
114-
ReportedCPU: LoadValue(cpuLoad),
115-
CapacityCPU: LoadValue(cpuCapacity),
107+
NodeID: dd.ScanArg[roachpb.NodeID](t, d, "node-id"),
108+
ReportedCPU: dd.ScanArg[LoadValue](t, d, "cpu-load"),
109+
CapacityCPU: dd.ScanArg[LoadValue](t, d, "cpu-capacity"),
116110
}
117111
loadProvider.nloads[nLoad.NodeID] = nLoad
118112
return ""
@@ -157,12 +151,10 @@ func TestMeansMemo(t *testing.T) {
157151
return b.String()
158152

159153
case "get-store-summary":
160-
var storeID int
161-
d.ScanArgs(t, "store-id", &storeID)
162-
var loadSeqNum uint64
163-
d.ScanArgs(t, "load-seq-num", &loadSeqNum)
154+
storeID := dd.ScanArg[roachpb.StoreID](t, d, "store-id")
155+
loadSeqNum := dd.ScanArg[uint64](t, d, "load-seq-num")
164156
loadProvider.returnedLoadSeqNum = loadSeqNum
165-
_ = mm.getStoreLoadSummary(context.Background(), mss, roachpb.StoreID(storeID), loadSeqNum)
157+
_ = mm.getStoreLoadSummary(context.Background(), mss, storeID, loadSeqNum)
166158
rv := loadProvider.b.String()
167159
loadProvider.b.Reset()
168160
return rv

0 commit comments

Comments
 (0)