Skip to content

Commit 973e068

Browse files
davidbentorben-hansen
authored andcommittedSep 7, 2022
Use GTest's built-in sharding feature
https://github.com/google/googletest/blob/main/docs/advanced.md#distributing-test-functions-to-multiple-machines Change-Id: I3998bb4735800a645286728852cb8494b28a6577 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/51225 Reviewed-by: Bob Beck <[email protected]> Commit-Queue: Bob Beck <[email protected]> (cherry picked from commit 5c1d5d8035bfad737bed79cd600c6600647e947f)
1 parent 5761d40 commit 973e068

File tree

1 file changed

+15
-70
lines changed

1 file changed

+15
-70
lines changed
 

‎util/all_tests.go

+15-70
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
package main
1616

1717
import (
18-
"bufio"
1918
"bytes"
2019
"errors"
2120
"flag"
2221
"fmt"
23-
"math/rand"
2422
"os"
2523
"os/exec"
2624
"path"
@@ -175,11 +173,17 @@ func runTestOnce(test test, mallocNumToFail int64) (passed bool, err error) {
175173
} else {
176174
cmd = exec.Command(prog, args...)
177175
}
178-
if test.Env != nil {
176+
if test.Env != nil || test.numShards != 0 {
179177
cmd.Env = make([]string, len(os.Environ()))
180178
copy(cmd.Env, os.Environ())
179+
}
180+
if test.Env != nil {
181181
cmd.Env = append(cmd.Env, test.Env...)
182182
}
183+
if test.numShards != 0 {
184+
cmd.Env = append(cmd.Env, fmt.Sprintf("GTEST_SHARD_INDEX=%d", test.shard))
185+
cmd.Env = append(cmd.Env, fmt.Sprintf("GTEST_TOTAL_SHARDS=%d", test.numShards))
186+
}
183187
var outBuf bytes.Buffer
184188
cmd.Stdout = &outBuf
185189
cmd.Stderr = &outBuf
@@ -270,7 +274,7 @@ func worker(tests <-chan test, results chan<- result, done *sync.WaitGroup) {
270274
}
271275

272276
func (t test) shortName() string {
273-
return t.Cmd[0] + t.shardMsg() + t.cpuMsg() + t.envMsg()
277+
return strings.Join(t.Cmd, " ") + t.shardMsg() + t.cpuMsg() + t.envMsg()
274278
}
275279

276280
func SpaceIf(returnSpace bool) string {
@@ -281,7 +285,7 @@ func SpaceIf(returnSpace bool) string {
281285
}
282286

283287
func (t test) longName() string {
284-
return strings.Join(t.Env, " ") + SpaceIf(len(t.Env) != 0) + strings.Join(t.Cmd, " ") + t.cpuMsg()
288+
return strings.Join(t.Env, " ") + SpaceIf(len(t.Env) != 0) + strings.Join(t.Cmd, " ") + t.shardMsg() + t.cpuMsg()
285289
}
286290

287291
func (t test) shardMsg() string {
@@ -318,70 +322,11 @@ func (t test) getGTestShards() ([]test, error) {
318322
return []test{t}, nil
319323
}
320324

321-
prog := path.Join(*buildDir, t.Cmd[0])
322-
cmd := exec.Command(prog, "--gtest_list_tests")
323-
var stdout bytes.Buffer
324-
cmd.Stdout = &stdout
325-
if err := cmd.Start(); err != nil {
326-
return nil, err
327-
}
328-
if err := cmd.Wait(); err != nil {
329-
return nil, err
330-
}
331-
332-
var group string
333-
var tests []string
334-
scanner := bufio.NewScanner(&stdout)
335-
for scanner.Scan() {
336-
line := scanner.Text()
337-
338-
// Remove the parameter comment and trailing space.
339-
if idx := strings.Index(line, "#"); idx >= 0 {
340-
line = line[:idx]
341-
}
342-
line = strings.TrimSpace(line)
343-
if len(line) == 0 {
344-
continue
345-
}
346-
347-
if line[len(line)-1] == '.' {
348-
group = line
349-
continue
350-
}
351-
352-
if len(group) == 0 {
353-
return nil, fmt.Errorf("found test case %q without group", line)
354-
}
355-
tests = append(tests, group+line)
356-
}
357-
358-
const testsPerShard = 20
359-
if len(tests) <= testsPerShard {
360-
return []test{t}, nil
361-
}
362-
363-
// Slow tests which process large test vector files tend to be grouped
364-
// together, so shuffle the order.
365-
shuffled := make([]string, len(tests))
366-
perm := rand.Perm(len(tests))
367-
for i, j := range perm {
368-
shuffled[i] = tests[j]
369-
}
370-
371-
var shards []test
372-
for i := 0; i < len(shuffled); i += testsPerShard {
373-
n := len(shuffled) - i
374-
if n > testsPerShard {
375-
n = testsPerShard
376-
}
377-
shard := t
378-
shard.Cmd = []string{shard.Cmd[0], "--gtest_filter=" + strings.Join(shuffled[i:i+n], ":")}
379-
shard.shard = len(shards)
380-
shards = append(shards, shard)
381-
}
382-
325+
shards := make([]test, *numWorkers)
383326
for i := range shards {
384-
shards[i].numShards = len(shards)
327+
shards[i] = t
328+
shards[i].shard = i
329+
shards[i].numShards = *numWorkers
385330
}
386331

387332
return shards, nil
@@ -490,14 +435,14 @@ func main() {
490435
if len(skipped) > 0 {
491436
fmt.Printf("\n%d of %d tests were skipped:\n", len(skipped), len(testCases))
492437
for _, test := range skipped {
493-
fmt.Printf("\t%s%s\n", strings.Join(test.Cmd, " "), test.cpuMsg())
438+
fmt.Printf("\t%s\n", test.shortName())
494439
}
495440
}
496441

497442
if len(failed) > 0 {
498443
fmt.Printf("\n%d of %d tests failed:\n", len(failed), len(testCases))
499444
for _, test := range failed {
500-
fmt.Printf("\t%s%s\n", strings.Join(test.Cmd, " "), test.cpuMsg())
445+
fmt.Printf("\t%s\n", test.shortName())
501446
}
502447
os.Exit(1)
503448
}

0 commit comments

Comments
 (0)
Please sign in to comment.